17/01/2017

Non-3D Python exercise: Instaload

Well, this is not related to 3D or CG, but it’s Python!

Was bored one day, and had to download a couple of images from instagram. dinsta.com is great, but it only allows you download images, and only one by one. So, I spent a few hours writing a little web-app to download multiple images and even videos from instagram. So, here it is:

http://ift.tt/2j2DSDz

Using it is simple. Just open required instagram photos or images on your pc, copy and paste links into the app, each link on a separate line, and click download button. You should then see download progress, and in the end you’ll get a download link for your zip archive with downloaded files. It will be there for an hour. Heroku has a limit of 300MB of disk space, so this app is not ready for heavy production use because of that limitation, if it somehow becomes popular, I’ll have to move it somewhere else, or change the logic to, for example, use some file sharing service to upload files instead…

Just deployed it on heroku, and I’ll be honest – deployment was the hardest part! I already had a lot of experience with Python, Flask and socketio programming, while writing my own personal home assistant. But my little AI friend is running on my local network, and I had no need to even try to run it on production server, flask’s built in test server works perfectly fine for this.

But with heroku I had to switch to gunicorn, and here comes the fun part – you have to use gunicorn 18.0, not 19.x, as, in fact, stated in the docs: http://ift.tt/2jZ7iXq but it’s easy to miss.

 



Copied from my site's blog: http://ift.tt/2j2BGvE

02/12/2016

BroTools Snippets #03 – PySide context menu for QLineEdit and other elements…

Well, some time ago I decided to go with PySide code for all my UIs instead of native maya.cmds functions for menu-building. I was attracted to the freedom in creating and styling of those menus, and the fact that Jeremy Ernst did a lot of menus with PySide. And another fact that knowing PySide I can not only write UIs for maya, but also for different standalone python tools. Which is cool. But if you just need a menu – go with cmds. Don’t bother with PySide.

Anyway, with that said, I still prefer to use PySide. And recently I was banging my head against the wall, trying to add a simple context menu to QLineEdit. To allow pasting some preset text into QLineEdit, for BroSelector tool.

And Finally, it worked!

Here is the full code related to it. I skip imports and window creation. Just the relevant stuff.

 

#Creating the actual QLineEdit. I use from QtGui import *, so I don't need to write QtGui.QLineEdit, just QLineEdit, mind that.
self.type = QLineEdit("transform")
# Adding context menu to line edit
# Creating action. Make as many as you like
self.actionHello = QAction(self)
self.actionHello.setText("Hello")
self.actionHello.triggered.connect(yourFunctionHere)

# Creating Menu
self.menu = QMenu(self)
# Adding action to menu. Add as many as you like
self.menu.addAction(self.actionHello)

# First we need to change our element's Context Menu Policy to Custom.
self.type.setContextMenuPolicy(Qt.CustomContextMenu)

# Now we catch basically the right-click event, the customContextMenuRequested event, and assing our own handler (function) for it.
self.type.customContextMenuRequested.connect(self.contextMenuRequested)

#And here goes the handler function.
def contextMenuRequested(self, point):
    # the point variable (which you can call whatever you like actually) is passed to this function as first arg, so we can use it in the next line.
    self.menu.exec_(self.type.mapToGlobal(point))

And thats it. YAY! Saving it here, so I won’t lose it, and in case it is useful to someone.



Copied from my site's blog: http://nixes.ru/?p=657

01/12/2016

BroTools Snippets #02

Saving another couple of clicks in routine work, simple script to select joints influencing skinned mesh. Could not find a 1-click solution for this in Maya. Maybe I just missed something? Anyway, maybe this will be useful for someone. Will just leave it here.

It will select joints influencing all shapes of all selected objects.

In a form that can be used in a shelf:

import maya.cmds as cmds
def selectInfluenceJoints (meshes=None):
    if meshes == None:
        meshes = cmds.ls(sl=1)
    if not isinstance(meshes, list):
        meshes = [meshes]
    cmds.select (cl=True)

    for mesh in meshes:
        shapes = cmds.listRelatives(mesh, c=True, s=True)
        for shape in shapes:
            sk = cmds.listConnections(shape, et=True, t='skinCluster')
            if sk != None:
                for s in sk:
                    influences = cmds.skinCluster (s, q=True, inf=True)
                    cmds.select (influences, add=True)
selectInfluenceJoints()


Copied from my site's blog: http://nixes.ru/?p=639

30/11/2016

BroTools Snippets #01

Time to start sharing what little tools and scripts I use in everyday life.

Here’s a multi-exporter I wrote for current project to speed up and stream-line animation exporting process, nothing fancy. It is used to export multiple animated game characters and objects. Responsive object selection list is probably the most fun thing, which inspired me to write another tool, which I will show in the next post.

brotools_multiexporter


Copied from my site's blog: http://nixes.ru/?p=628

11/10/2016

Random animation #01

 

 

Starting some new ‘sections’ of my blog. Under Random animation I will just post some little practice or personal or non-NDA animations I’m working on.



Copied from my site's blog: http://nixes.ru/?p=594

01/09/2016

Maya 2017 switching to PySide2

In order to support Qt 5 Maya 2017 now uses the PySide2 module and shiboken2. While this is supposed to bring a lot of improvements into Maya’s UI, including speed and new functions, it also breaks a lot of old scripts. Including my BroDynamics and other tools. I though about using Qt.py, but that would require me to include it with all my scripts, and really it was too complex for a lot of my tools, especially those shipped as one file.

At first I was a bit terrified, thinking that I’ll have to re-write a lot of code. But in fact I was able to adapt all of my scripts in few minutes.

So, the biggest changes in PySide2 are:
– Some widgets moved from QtGui to QtWidgets
– shiboken is also changed to shiboken2

Before the change I was using PySide like this:

from PySide import QtCore, QtGui
    someWidget = QtGui.QWidget()

The biggest change is to switch to another method of importing PySide:

from PySide.QtCore import *
from PySide.QtGui import *

This way you import all modules directly, and instead of writing QtGui.QWidget you can just use QWidget. Obvious but very handy in this case.

Without any further speculation, here is my final PySide import code.

try:
    from PySide2.QtGui import *
    from PySide2.QtCore import *
    from PySide2.QtWidgets import *
    from shiboken2 import wrapInstance
    print "Using PySide2"
except:
    from PySide.QtGui import *
    from PySide.QtCore import *
    from shiboken import wrapInstance
    print "Using PySide"

And then using simple Replace, available in any text editor, change all “QtGui.” and “QtCore.” to “”. Just remove them.

I will test BroDynamics and other scripts for some time, before making new versions available to the public. Stay tuned :)

Here are a few links you may find useful as well:

Maya Help – PyQt and PySide Widget Best Practices
http://ift.tt/2bLiajj
http://ift.tt/2bGkNFN
http://ift.tt/2bLiajx



Copied from my site's blog: http://nixes.ru/?p=587

20/06/2016

BroDynamics 1.4.0 Released!

Phew, it took me a while to get it all together. It was huge update. Last few days was I was fighting with bugs mostly, which started to appear seemingly out of nowhere.

There are three main updates in this release.
– Added 2 more simulation modes: Points and RBD
– UI Improved

Since there are these huge updates, there may be new bugs in this release, which I did not have a chance to catch yet. Feel free to report any problems you enouncter, and I will try to fix it ASAP.

Along with this release I made new promo video, and started making a series of How To videos.

New Promo

 

 

How To series

 

 

 

 

 

 

I think later I will sit back and write a nice post about some behind-the-scenes… Or not… We’ll see 😀

Changes:
1.4.0
– A lot of bug fixes and improvements overall.
– Compatibility fix! Now works with Maya 2014 too. Probably with 2013 as well.
– UI reworked, now windows delete properly when you close the main BroDynamics window, docked or undocked. Memory leak here and performance impact after closing and openning it often should be fixed now.
– Icons everywhere! 😀
– NEW! Added single object simulation based on nParticles.
– NEW! Rigid Body and Ragdoll simulation module.
– Added SnapRuntime plugin for object matching for RBD mostly. Thank you, Red9.
– Fixed Get button in Batch Window
– Batch window’s list will now properly update when you hit Undo. Now no need to worry about making mistakes there at all.



Copied from my site's blog: http://nixes.ru/?p=568