AtomSplitter has been updated to v1.5, available through cmivfx.com
Updates:
- Added the ability to convert point cloud data, exported from Nuke as a .obj, to be included in the fbx/action export.
AtomSplitter (chanToFbx) has been updated to v1.2, available through cmivfx.com
Updates:
- Camera rotation order set to ZXY, which is the Nuke camera default
- Fixed a bug where the FocalLength value was not being keyframed properly
- Added a scene scale field, for adjusting the translation values globally.
If you haven’t visited cmiVFX.com before, PLEASE check them out. Chris Maynard does an amazing job rounding up top talent in the industry to create these outstanding visual fx tutorials. The information is always cutting edge.
“App’ing up” PyQt… ugh.
One of biggest problems with PyQt is distributing it in a stand-alone package. Even worse… wanting to make your Qt plugins still function (Phonon, jpeg, etc). At work I constantly had this battle, along with my co-worker Tory. She actually has a long-standing issue with this, and had to resort to workarounds or half fixes. Here is Tory’s original post regarding the issue .
I would see an error similar to this when trying to package up and run an app using the Phonon module.
WARNING: bool Phonon::FactoryPrivate::createBackend() phonon backend plugin could not be loaded
Running macdeployqt myAppName.app does add things like the jpeg plugin, but never seemed to fix the Phonon issue. I finally decided to randomly look online for a solution, again, last week. What I found was a partial solution, followed by me trying one more thing and bam…it worked! Video playback from my .app standalone package.
Here is what I did …
(btw you might have to modify the location of the plugin, since I happen to be using OSX)
- In your setup.py file, which is used for py2app, py2exe, or similar… add this to the DATA_FILES list, so that it looks as such:
DATA_FILES = [('phonon_backend',
['/Developer/Applications/Qt/plugins/phonon_backend/libphonon_qt7.dylib'] )]
This will put the phonon backend plugin into the RESOURCES folder in the app. - Package up your application via py2app / py2exe / etc.
- If you are on OSX, use macdeployqt on the app:
>>> macdeployqt myApp.app - Go into the app that was created (show package contents if you are on a mac), and move the phonon_backend directory FROM the Resources directory TO the PlugIns directory (which should be at the same level as Resources).
That should be it!

I get to do a lot of interesting applications at SouthPark. This one in particular was the most challenging use of PyQt that I have experienced to date.
The backstory….
The art department wanted a tool to help them track assigned tasks, the progress, and to share media and notes associated with the tasks. Furthermore, they wanted to be able to skin the interface with custom graphics to make it their own.
Progress…
During the winter break (about a month) I was able to come up with version 1.0 of TaskMonster. It was written in python, using PyQt for the UI, sqlalchemy to talk to the database, and twisted for the client/server communication. Each client app sends messages to a small server daemon which in turn tells the rest of the clients about the updates.
Version 2.0 Alpha…
Tony Postma, from the art department, put together a design in Corel which I could hopefully implement in the UI. It called for the users to be represented as little pods in a circle around the supervisor, Adrien Beard. And each user pod could be clicked and rotated into place, in order to view that persons tasks.
After a bunch of testing I was able to design a rotating widget that could dynamically lay out N widgets around it in a circle, track their position, and jump to any other widget. I was also able to break down the corel->illustrator file, into a combination of SVG and PNG images, and skin the UI via CSS stylesheets.
Its currently an alpha release. I guess I need to really learn how to control the widget painting, to make it faster. Never had to do this much before.
What I came up with… Click here to watch the demo video

You know when you have all these widgets laid out in your class, and you are hooking up all the connections, and you say “Aw dammit I have to subclass QLabel now just so make it ignore blahEvent”? You end up with all these little widget subclasses, where all they are doing is ignoring an event.
I noticed I was doing this a few times, in more than one of my classes, and finally got annoyed for the last time. I figured there had to be a simple way of just overloading the method on the normal object when I create an instance. Fortunately python considers everything objects and pretty much anything can be changed. So I did this:
myLabel = QLabel() myLabel.mousePressEvent = lambda event: event.ignore()
Magic.
I have also had to make clickable widgets, such as QLabel:
myLabel = QLabel()
myLabel.mousePressEvent = lambda event: myLabel.emit(SIGNAL("clicked"))
Or if you had to do more than just a single statement:
myLabel = QLabel()
def clickedEvent(event):
myLabel.emit(SIGNAL("clicked"))
# do other stuff
# do stuff
event.accept()
myLabel.mousePressEvent = clickedEvent
I like this better than piling up subclasses that don’t do much.
I had a project where I was designing a statistics reporting site, to track production stats. I wanted to have really nice graphs that pulled from the database and were somewhat live and interactive. XML/SWF Charts is this awesome flash-based app that lets you embed graphs in your pages which receive their data from XML. There are tons of graph types and ways to customize the look.
http://www.maani.us/xml_charts/index.php
So, the thing is… I wanted to use Django for the site. I decided to write a python module that wraps around the API for SWF charts, so that the XML could easily be generated for me after just setting all my parameters. Thought I might post this here for any python fans wanting nice looking graphs in their site.
Really, this doesn’t just apply to django. You could just call out from anything to python code that will generate your XML for you.
Example:
chart = SwfChart()
# the data
chart.addRow( 'Person A', 1, 10, 5.5 )
chart.addRow( 'Person B', 6, 4.45, 8 )
chart.addColumnLabel( 'Day1', 'Day2', 'Day3' )
# Extra graph settings
chart.addFilter('shadow', 'low', distance=2, angle=45, alpha=35, blurX=5, blurY=5)
chart.addFilter('shadow', 'high', distance=3, angle=45, alpha=35, blurX=10, blurY=10)
chart.addFilter('bevel', 'bevel1', strength=10, quality=3, distance=2)
chart.setChartBorder(top=1, bottom=2, left=0, right=0, color='000000')
chart.setChartLabel(color='000000', alpha=80, size=8, position='outside', hide_zero=True)
chart.setChartTransition(type='scale', delay=.5, duration=.5, order='series')
chart.setChartRect(shadow='high')
chart.setLegend(size=12, alpha=90, fill_alpha=30)
chart.setAxisTicks(category_ticks=True, value_ticks=True, minor_count=3)
chart.setContextMenu(about=False)
# if you have the licensed version
chart.setLicense('license string')
Now at this point, the object can be treated like a string to get the xml, or just call getXML() :
print chart print chart.getXML() # same thing xml = str(chart) # or assign the XML string somewhere
You can download the swfcharts.py module and use it freely. If you find it helpful, post a comment or shoot me an email.
Download swfcharts.py
Pydoc located here for convenience: swfcharts python documentation
I never thought I had known such a real sense of failure until today, when a system diagnostic became intent on showing me just how hard of a failure we will be experiencing together.
This is probably the hardest system failure I have ever felt.
The system failed so hard, I was actually sent home from work for the day, and the system called my mom on the phone to inform her just how much of a failure this was. They scheduled a Parent-System conference for next week.
I had received a mailing list email from cmiVFX, where Chris Maynard was challenging the community to write a tool that could convert a nuke camera .chan file to a functional FBX format. This was apparently meant to compliment the new 3d camera tracker in NukeX. So I decided to take on the challenge.
The tool started out as a command-line python script that would translate the chan files simple column-style output to fbx. But in testing specifically with Flame, Chris found that the fbx simply would not import all the channels properly. Thus, I was asked to integrate a solution by Georges Nakhle for converting the chan to an .action format, which is native to Flame. So with George’s .action code, Chris’s testing with the scaling in Flame, and the rest of my code, we seemed to have all the bases covered in getting the .chan file into a universal format.
Chris asked if I would wrap the tool into a GUI, to allow easier access to the few options the script provides. Using the cmiVFX.com website as a reference, I threw together a nice looking GUI in PyQt. It was fun because I got to really play around with CSS and skinning in PyQt, which is something I never really had to do before. I learned how much of a pain in the ass Palettes are, and how freaking simple the CSS route makes it to control the look or widgets.
Chris released it today: http://www.fxmogul.com/
Currently there is a version for both OSX and Windows. I have been having some issues packaging the code under Linux, but I just need to really sit down and figure it out. The build is kinda larger than I hoped, but thats what I get for distributing PyQt

.chan To FBX GUI (osx)
This is something that started back in 2006, when I received an email from one Miriam Israel. This Miriam claimed to be my grandmother, and proceeded to ask about details in my life that were not my details, and not my life. I thought a simple case of mistaken identity was made and informed her briefly that she had the wrong person. And I asked her to please remove me from her address book. Unfortunately, she didn’t seem to understand, and a few more correspondence took place during that year. I had forgotten about it until today, when it resurfaced. When I looked back across all the based mails, I realized it was kinda funny. So here it is.
I actually do not have the first original mail and my reply. But you will get the idea. She asked me a bunch of stuff, and I replied with something like “Sorry. I’m not your grandson. Wrong person. Please remove me from your address book.”. Also, there were a few times when I just didn’t respond, and instead I bounced the mail so it looked like a wrong address. The following are the rest of the emails, after the first one.
from
Miriam Israel
to
justinisrael <justinisrael@gmail.com>
date
Fri, Sep 29, 2006 at 2:58 AM
Dear Justin
Received your email. Why? What is wrong? Why areyu s angry?
I WILL NOT ever remove you from my address book – your name is engraved on my heart. AND you will always be related to me and all the family here in South Africa and also to te family in Tampa.
Wish you good health, strength and courage and success. May the coming year be wonderful, better than the previous one. Love also from Charlene and all of us here.
Love you as always, hug and kisses for Alex. Grandma
from
Justin Israel <justinisrael@gmail.com>
to
Miriam Israel
date
Sun, Oct 1, 2006 at 10:07 AM
Miriam,
These are not words of anger towards you… the clear fact is, we have no relation. You have me mixed up with someone else, possibly another Justin Israel?
I do not have any relations in Africa… and for that matter, any living relatives outside of the U.S..
I appreciate your inquiry as to how ‘Alex’ is doing, but there is no known Alex in my family.We are NOT related, so please remove me from your emails. If you were actually close to the correct Justin Israel, or this ‘Alex’, you might know the person’s telephone number and how to actually reach your loved ones.
from
Miriam Israel
to
justinisrael <justinisrael@gmail.com>
date
Fri, Nov 10, 2006 at 5:04 AM
Dear Justin, Jill and Alex
I want toknow if Alex has still got jerseys which I made for him. Do any still fit him? What size clothes do you buy for him? 2/3 or 3/4 years? I made him several more but the maid we had stole them plus other things as well. I bought more wool today to make him something, so that he will have it,from me with love, before the cold hits you. How is he doing? Photographs please!
My arthritis is very bad. My neck, back, hands and legs are affected, but I still keep on doing things. It is very hot now with quite a lot of rain. Errol and Hadassa ae going to Connecticut for 10 days for rabbi’s conference for Aish Hatorah. She will post the jersey to you P.G. Ari finished his last end of the year exams. He is exhausted – he has worked very hard. Lisa is still writing final matric exams and should be finished in a week.
It is almost shabbos so will end with good wishes and love to all. It would be nice to have an email from you – with answers to my questions. Please ask Marty to be in touch with me. Is Mommy well?
As always, with warm love,
Grandma.How are you Justin, and what is happening?.
from
Miriam Israel
to
justinisrael <justinisrael@gmail.com>
date
Tue, Dec 5, 2006 at 9:43 AM
DearJustin,
Just got your email, only one. I did not receive theone with Alex’s size and measurement. Has the package arrived yet? When it does, please let meknow how the jersey fits Alex. How are you all? Let me know what Alex does, says, does at school. Do you ever take him to shul? If not then shame on you.
Did I tellyou four months ago that Leanne had twins, boy and girl at 26 weeks. They wereminute. Had to be in ICU for three months. They have beenhome now for one month. Still verysmall but puttingon weight and crying crying crying. Leanne does not get any sleep as she is busy with them all day. She does not have a maid. Suzanne and Elise help her when they can. They are both working. Suzanne is leaving her teaching post this month. She will teach privately at home, needs the money. They are called Binjamin (in Hebrew) and Batya after Leanne’s father.
Hadassa and Errol leave N.York tomorrow and will be home P.G. on Thursday. Pity you could not see each other!
Please keep in touch. Hope you enjoyed your birthday. Wish you many more happy, healthy and successful years to come.
With much love and hugs for Alex and you both. Grandma.
from
Justin Israel <justinisrael@gmail.com>
to
Miriam Israel
date
Wed, Dec 6, 2006 at 9:12 AM
Oh dearest Grandma,
It pain us so much to say, that poor little Alex has lost both of his legs.
His size is now only 3 feet tall, and he must be pulled in a small radio flyer wagon that we had found at a garage sale.
We are looking for the money to buy him robotic legs, similar to the movie Robocop, but this procedure is expensive, and it does not come with the gun holster, like in the movie.
Please mourn this tragedy with us.
Not your relative,
Justin
from
Miriam Israel
to
justinisrael <justinisrael@gmail.com>
date
Mon, Dec 25, 2006 at 7:12 AM
Did you send this?
from
Justin Israel <justinisrael@gmail.com>
to
Miriam Israel
date
Mon, Dec 25, 2006 at 5:25 PM
Ah yes.
Yes I did send this. Did you finally receive it?
Are you slightly confused? Well maybe if you would listen to people instead of rambling on and living in a fantasy, you might have realized much earlier that I am not related to you, and that you have an incorrect email address. I decided, once you persisted to email me, that I would get your attention once and for all, and make you understand that you are not my relative.
Glad you finally figured this out.
* Update: My co-worker, could not let this situation go in her mind, and has hunted down the real Justin Israel: http://www.facebook.com/justinisrael2
I totally beat him to getting the first facebook perma-link for our name.





