WARNING : 3000 – Objects were not saved normally

Occasionally I’ll see reports of this kind of error. Sometimes I see it when I’m investigating some other problem in a scene.

// WARNING : 3000 - Save: [1] objects were not saved normally
// WARNING : 3000 - -- [Framebuffer<1004>] was saved, but is disconnected from the scene. (Floating object)

You can use Dictionary.GetObject to get the floating object and interrogate it:

var x = Dictionary.GetObject( "Framebuffer<1004>" );
LogMessage( ClassName(x) );
LogMessage( x.Parent );
// INFO : C:\Program Files\Autodesk\Softimage 2012.SAP\Application\bin\XSI.exe
LogMessage( x.Parent3DObject == null );
// INFO : True
LogMessage( x.Owners.Count );
// INFO : 0
LogMessage( x.RenderChannel );
// INFO : Normal
//LogMessage( x.GetResolvedPath(0) );
// ERROR : 21000 - Unspecified failure - [line 15]

And you could even delete the floating object before you save the scene:

DeleteObj( Dictionary.GetObject( "Framebuffer<1004>" ) );

However, there is a scene debugging preference that allows you to “skip the loading of floating objects”. This preference was added back in 2004 or so to deal with “ghost models” (which are basically floating or disconnected objects).

You could also try printver -cleanfloating to remove floating objects. I don’t know if that still works, I haven’t used it three or four years.

Another thing you can try is to merge your scene into a new scene. The warning could be a “false positive”. If the warning is gone after the merge, then it was indeed a false positive (which means that something, such as the schematic view, was still holding on to a reference to a deleted object).

The case of the While loop that didn’t evaluate

In this case, an ICE While loop wasn’t working as expected.
The customer was using Max Repeat to do something like this, but in ICE:

x = 2
cond = x > 0

i = 0
while cond:
	print i
	i = i + 1
	if i > 10: break

Unfortunately, in ICE, the While loop was never executed.

It’s not a problem with the While loop, it’s a problem with the ICE tree evaluation (it’s a bit too lazy). I’ve seen things like this before, and I usually create a separate ICE tree to workaround it:

On the mailing list, Guillaume suggested a couple of other workarounds. First, use Delay Set Data.
The word “Delay” in the node name throws me off…I wouldn’t think to use it, but after reading up on it, I can see why you would think to use that node (it does evaluation).

If you set the condition boolean in the While loop, that works too:

Top 10 things to learn for the ICE newbie

Last week there was a Top 5 things to learn about ICE? thread on the mailing list:

If you ICE experts out there had to recommend the top 5 (first) things to learn about ICE what would they be? I’m looking for cornerstone/pedestal type foundation items. I’m going to put some time into really learning ICE and I’d like to know what the most valuable concepts are.

There were several good responses, so I’ve combined them all and added a few more to make it a “top 10” (rather than a top 7). Also, I added some links to relevant videos (mostly my own). I’d also recommend you watch Paul Smith’s tutorials, starting with 1. What does ICE do?.

Also, see these video tutorials:

Placing instances on polygons

Over on Vimeo, commenter LBX (check out his multiple texture map vids) suggested an alternative approach to placing objects on the polygons of a sphere. (See my ICE modeling posts here and here.)

Here’s the ICE tree (which is on a point cloud of course 😉 The use of PolygonNormals and the sphere radius is neat.

To deal with more general geometry, I think you’d need to do something like this:

Friday Flashback #48

Three years ago, 15 Dec 2008 was my first day in the Autodesk offices. Officially, I’d been an Autodesk employee since sometime in November, but 15 Dec was the first day I reported to work at Autodesk.

I’m cool working at Autodesk and I still enjoy what I do, but I kinda miss our old offices, in the old Reitmans factory building on St Laurent boulevard. After the acquisition, the Max/Maya support guys came up to visit and do lunch, and their jaws literally dropped when they saw the offices where me, Manny, and the other support guys sat.

On the other hand, the Autodesk offices are perfectly located for a cyclist like me. To get to Softimage I had to actually bike into the city, whereas the Autodesk is down at the Old Port, practically right at the end of the bike path along the Lachine canal.

Here’s some pics of the old Softimage headquarters:

This slideshow requires JavaScript.

I’ve pulled out the panorama of Erik’s office so you can get a better look at it. Erik was a “cool dude” on the Softimage support team, and his office was the most fun. He had one Hot Wheels toy car pinned to wall for each month he worked at Softimage.

Tip: Getting links to specific help pages

The online help docs use framesets, which can make it tricky to get the right URL when you want to save or send a link to a certain page. Often you end up with a link to index.html, which is just the page that holds the HTML frameset.

Here’s a few different ways to get a link to a page:

In Firefox:

  • Click the Show in Contents icon (top-right) then right-click entry in TOC and click Copy Link Location .
  • Click the Up icon (top-right). This usually takes you to a page with a list of links to the topics in this section. Right-click the link and click Copy Link Location.
  • Click the Previous page icon (<), then right-click Next (>) and click Copy Link Location.
  • Right-click the page, click This Frame > Page Info, and copy the Address URL

The SDK docs don’t have the navigation buttons, so in general you have to get the link from This Frame > Page Info.

For something like an Object Model method or property, you can get the link from the object reference page (because it has a table of links to all methods and properties).

Filtering object selection by volume

Here’s an addon that uses the ICE Volume attribute to filter object selections. The Volume attribute is always defined (so you don’t need to Show Values or anything for this filter to work).

Note that you have to freeze scaling to get the right volume for an object.

For simplicity, I’m using a custom property (on the scene root) to hold the preferences for the filter.

The filter itself is simple. It just gets the Volume attribute value and compares it to the range of values specified in the PPG.

# Match callback for the psCustomFilters custom filter.
def ObjbyVolume_Match( in_ctxt ):
	Application.LogMessage("ObjbyVolume_Match called",constants.siVerbose)

	in_object = in_ctxt.GetAttribute( "Input" );

	obj = Get3DObject( in_object );
	if ( Application.ClassName(obj) != "X3DObject" ):
		return false;
	v = obj.ActivePrimitive.ICEAttributes("Volume").DataArray[0]

	filterProp = GetFilterProp( )
	if filterProp.Filter_by_range.Value == True:
		bMatch = filterProp.Volume_Min.Value <= v <= filterProp.Volume_Max.Value
	else: # Filter by value with an epsilon
		min = filterProp.Value.Value - filterProp.Epsilon.Value
		max = filterProp.Value.Value + filterProp.Epsilon.Value
		bMatch = min <= v <= max
	return bMatch