Ok, cheers. I made a script which puts the object into place and deletes the proxy/shape.
But, I stumbled upon a new issue. When I loop through all VRayMesh nodes in the scene and restore its mesh, I’m noticing a memory leak (at least that’s what I believe it is).
I have a car, where basically all individual pieces were made into a proxy (jeez…) and now I have to undo that (oh my god!) for annoying reasons. But for each restored mesh, the memory is not released and I’ve maxed out a 72 GB RAM machine here after having restored some ~30 proxies (of 2800) into mesh. Hm… could it be possible I’m dealing with a memory leak here or is something funky going on with mel.eval() … ?
Here’s my long and somewhat convoluted code:
import maya.cmds as cmds
import maya.mel as mel
def set_selected_geotype(n):
""" Source this function in Maya, then run one of the following:
set_selected_geotype(n=0) # Placeholder
set_selected_geotype(n=1) # Bounding box
set_selected_geotype(n=2) # Preview
set_selected_geotype(n=3) # Maya mesh
set_selected_geotype(n=4) # GPU Cache
"""
for proxy in cmds.ls(sl=True, long=True):
relatives = cmds.listRelatives(proxy, fullPath=True)
if not isinstance(relatives, type(None)):
for relative in relatives:
connections = cmds.listConnections(relative, type='VRayMesh')
if not isinstance(connections, type(None)):
for obj in connections:
cmds.setAttr(obj+'.geomType', n)
def get_shapes(obj):
cmds.select(obj) # for show only
shapes = cmds.listConnections(obj, type='shape')
if not isinstance(shapes, type(None)):
shapes = list(set(shapes))
else:
shapes = []
return shapes
def get_parent_transforms(shape):
parent_transforms = cmds.listRelatives(shape, parent=True, fullPath=True)
if not isinstance(parent_transforms, type(None)):
parent_transforms = list(set(parent_transforms))
else:
parent_transforms = []
return parent_transforms
# --- Make all vrmeshes into placeholders first (save memory) ---
for vrmesh in cmds.ls(type='VRayMesh', long=True):
cmds.select(vrmesh)
set_selected_geotype(n=0)
cmds.refresh()
# --- START RESTORE ---
total = len(cmds.ls(type='VRayMesh'))
count = 1
new_shapes = []
constraints = []
for vrmesh in cmds.ls(type='VRayMesh', long=True):
print 'Analyzing', vrmesh, count, '/', total
shapes = get_shapes(vrmesh)
for shape in shapes:
parent_transforms = get_parent_transforms(shape)
for parent_transform in parent_transforms:
cmds.refresh()
cmds.setAttr(vrmesh + '.reassignShaders', 1)
print 'Converting', vrmesh
# Make vrmesh into Maya mesh (for accurate constraining, I guess?)
cmds.select(vrmesh)
set_selected_geotype(n=3) # Maya mesh
new = mel.eval('vray restoreMesh ' + vrmesh + ';') # RESTORE MESH!
new_shape_name = cmds.ls(sl=True, long=True) # Restored object is selected automatically after conversion
# Parent in under vrmesh tranform
new_parent_transforms = get_parent_transforms(new_shape_name)
for new_parent_transform in new_parent_transforms:
print 'Parenting...'
cmds.parent(new_parent_transform, parent_transform)
new_shape_name = cmds.ls(sl=True, long=True)
new_shapes.append(new_shape_name)
# Parent constrain
print 'Parent constrainting...'
constraint = cmds.parentConstraint(shape,
new_shape_name,
maintainOffset=False)
constraints.append(constraints)
# Make vrmesh into locator (save memory)
cmds.select(vrmesh)
set_selected_geotype(n=0)
cmds.refresh()
count += 1
# Clean up
# to do: delete constraints
# to do: delete vrmesh nodes