ICE Modeling – Extruding a random polygon


All you have to do is plug a Random Value node into the Polygon Index port, and then set the Mean Value and Variance. If you then play around with the ID (of the Random Value), you’ll get a different polygon extrusion.

Most of this tree is for setting the Mean and Variance. If I have an odd number of polygons, say 81, then a mean of 40 and a variance of 40 will cover the range of polygon indices (0-80). But if I have an even number of polygons, say 80, then a mean of 40 and variance of 40 might give me an index of 80, which is out of range.

To randomly extrude more than one polygon, just feed a bunch of IDs into the Random Value node, like this:

I increased the number of polygons to avoid getting the same random number multiple times.

Python print statement in Softimage 2013


If you’re using an external install of Python, you’ll probably notice that the print statement doesn’t work in Softimage 2013. That’s because Softimage 2013 was compiled with Visual C++ 2010, and Python wasn’t.

We recompiled the built-in Python that ships with Softimage 2012, so if you use that Python, the print statement works.

Workaround courtesy of Jo benayoun:

import sys
class STDOutHook(object):
	def __init__(self):
		pass
	def write(self, data):
		# py engine adds a newline at the end of the data except if
		# the statement was ended by a comma.
		data = "" if data == "\n" else data

		if data != "":
			Application.LogMessage(data)
		return None

sys.stdout = STDOutHook()

print "Hello"
print "\n"       # wont work due to the workaround
print "World",

I found this same workaround by googling “python print redirect stdout”. For example, here.

Softimage 2013 Python shortcuts gotcha


Softimage 2013 includes some changes to the Python shortcuts:

from siutils import si
si = si()					# win32com.client.Dispatch('XSI.Application')
from siutils import log		# LogMessage
from siutils import disp	# win32com.client.Dispatch
from siutils import C		# win32com.client.constants

The big difference is that si shortcut is now a function that returns the Application object. We had to make this change to fix some weird memory leak (the si object was out of scope in the module where it was created, and the Python parser could not properly delete it upon exit).

Here’s a suggested workaround from the Dev team to maintain backward-compatibility:

# ---python code begin ---
from siutils import si

if Application.Version().split('.')[0]>= "11":
	si = si()					# win32com.client.Dispatch('XSI.Application')

from siutils import log		# LogMessage
from siutils import disp	# win32com.client.Dispatch
from siutils import C		# win32com.client.constants
# --- python code end ---

The if block executes only if the current Softimage version is later than 11, which corresponds to 2013 or later.

hat tip: SS

Friday Flashback #67


Pull-quote from a 2002 datasheet for Softimage|3D 4.0:

“Nothing was comparable to SOFTIMAGE|3D, so we stuck with it again—and I’m glad we did. Softimage offers everything we need, and the animators here know the tools so well that we can play with different combinations, so it’s rare to get into a jam.

In fact, we’ve gotten crazy clever with it!”
Dan Taylor
Animation Director, ILM on Jurassic Park III

Here’s the actual datasheet. It’s kinda text-heavy, but as I remember it, the image quality of screenshots in PDFs was not so great back then.

The datasheet has one mention of XSI: SOFTIMAGE|3D also offers an easy upgrade path to the next-generation SOFTIMAGE|XSI™ nonlinear animation (NLA) system.

ObjectIDs and objects that don’t exist


As noted by iamVFX on si-community, the new Python method Application.GetObjectFromID2 doesn’t deal well with IDs that don’t match an object that exists in the scene (in fact, it crashes Softimage). The JScript version, Application.GetObjectFromID simply returns null in that situation.

So, it is probably best to use DataRepository.HasData to check if the ID represents a real object.

Note that Dictionary.GetObject can also be used to get objects by ID.

from siutils import si
si = si()					# win32com.client.Dispatch('XSI.Application')
from siutils import log		# LogMessage
from siutils import disp	# win32com.client.Dispatch
from siutils import C		# win32com.client.constants


MAX_IDS = 2000

for i in range(0,MAX_IDS):
	if XSIUtils.DataRepository.HasData( i ):
		try:
			o =  si.GetObjectFromID2( i )
			log( "%s : %s" % (str(i), o.FullName) )
		except:
			o = Application.Dictionary.GetObject( "object<%s>" % str(i) )
			s = "%s : GetObjectFromID2 failed. Dictionary.GetObject found %s (%s)" % (str(i), o.Name, si.ClassName(o))
			log( s )
	else:
		log( "%s : No object with this ID exists" % str(i) )

A new, blank Softimage 2013 scene has 757 objects. For your reading pleasure, the full list is below the fold.
Continue reading

The case of the missing crowd


Our first CrowdFX-related case in Product Support!

A customer reported that CrowdFX wasn’t working. When he opened a sample CrowdFX scene, he got all these “plug-in is not installed” errors [Hey, that’s the same error I blogged about yesteday, but this time it’s something different–Steve]

// ERROR : 2356 - This plug-in is not installed: CrowdFX_RigProxy
// ERROR : 2356 - This plug-in is not installed: CrowdFX_SkeletonsCloud
// ERROR : 2356 - This plug-in is not installed: CrowdFX_ActorProxy
// ERROR : 2356 - This plug-in is not installed: CrowdFX_ActorsProxies
// ERROR : 2356 - This plug-in is not installed: CrowdFX
OpenScene("C:\\Program Files\\Autodesk\\Softimage 2013\\Data\\XSI_SAMPLES\\Scenes\\ICE\\CrowdFX_Walk_Along_Paths.scn", null, null);

The real clue was an error logged at startup:

// ERROR : Traceback (most recent call last):
// File "<Script Block 2>", line 55, in XSILoadPlugin
// in_reg.RegisterMenu(C.siMenuTbICECrowdFXActorsID,"Actors_Menu",False,True)
// File "C:\Python26\lib\site-packages\win32com\client\__init__.py", line 168, in __getattr__
// raise AttributeError, a
// AttributeError: siMenuTbICECrowdFXActorsID
// - [line 54 in C:\Program Files\Autodesk\Softimage 2013\Addons\CrowdFX\Application\Plugins\CrowdFX_Plugin.py]

First, this shows the customer is using the version of Python 2.6 installed on the system (not the version shipped with Softimage). More importantly, it shows that the CrowdFX constants, like siMenuTbICECrowdFXActorsID, are missing.

For Python, all the Softimage constants like siMenuTbICECrowdFXActorsID are cached in the Python install folder. For example, the Softimage constants are cached in the folder C:\Python26\Lib\site-packages\win32com\gen_py\269C4D8C-E32D-11D3-811D-00A0C9AC19A9x0x1x0\__init__.py

The solution in this case was to zap (delete) the gen_py folder, forcing Softimage to regenerate the generated type info cache.