def test_alembic_export(): """Exporting Alembic works""" cube, generator = cmds.polyCube(name="myCube_GEO") transform = cmds.ls(selection=True) visibility_keys = [(10, True), (20, False), (30, True)] for time, value in visibility_keys: cmds.setKeyframe(transform, time=time, attribute="visibility", value=value) maya.create(name="animationDefault", asset=ASSET_NAME, family="mindbender.animation", options={"useSelection": True}) cmds.file(save=True) publish() # Import and test result cmds.file(new=True, force=True) asset = io.find_one({"type": "asset", "name": ASSET_NAME}) subset = io.find_one({ "parent": asset["_id"], "type": "subset", "name": "animationDefault" }) version = io.find_one({ "parent": subset["_id"], "type": "version", "name": 1 }) assert version representation = io.find_one({ "parent": version["_id"], "type": "representation", "name": "abc" }) assert representation is not None container = maya.load(representation) nodes = cmds.sets(container, query=True) print("Nodes: %s" % nodes) cube = cmds.ls(nodes, type="mesh") transform = cmds.listRelatives(cube, parent=True)[0] for time, value in visibility_keys: cmds.currentTime(time, edit=True) assert cmds.getAttr(transform + ".visibility") == value, ( "Cached visibility did not match original visibility")
def test_update(): """Updating works""" transform, generator = cmds.polyCube(name="body_PLY") group = cmds.group(transform, name="ROOT") cmds.select(group, replace=True) maya.create(name="modelDefault", asset=ASSET_NAME, family="mindbender.model", options={"useSelection": True}) # Comply with save validator cmds.file(save=True) publish() publish() publish() # Version 3 cmds.file(new=True, force=True) asset = io.find_one({"type": "asset", "name": ASSET_NAME}) subset = io.find_one({ "parent": asset["_id"], "type": "subset", "name": "modelDefault" }) version = io.find_one({ "parent": subset["_id"], "type": "version", "name": 2 }) assert version representation = io.find_one({ "parent": version["_id"], "type": "representation", "name": "ma" }) maya.load(representation["_id"]) container = next(maya.ls()) maya.update(container, 3)
def test_modeling_to_rigging(): transform, generator = cmds.polyCube(name="body_PLY") group = cmds.group(transform, name="ROOT") cmds.select(group, replace=True) maya.create(name="modelDefault", asset=ASSET_NAME, family="mindbender.model", options={"useSelection": True}) # Comply with save validator cmds.file(save=True) publish() cmds.file(new=True, force=True) representation = io.locate( [PROJECT_NAME, ASSET_NAME, "modelDefault", 1, "ma"]) container = maya.load(representation) nodes = cmds.sets(container, query=True) assembly = cmds.ls(nodes, assemblies=True)[0] assert_equals(assembly, "Bruce_01_:modelDefault") # Rig it mesh = cmds.ls(nodes, type="mesh") transform = cmds.listRelatives(mesh, parent=True)[0] ctrl = cmds.circle(name="main_CTL") cmds.parentConstraint(ctrl, transform) cmds.select([assembly] + ctrl, replace=True) group = cmds.group(name="ROOT") cmds.select(mesh, replace=True) out_set = cmds.sets(name="out_SET") cmds.select(ctrl) controls_set = cmds.sets(name="controls_SET") cmds.select([group, out_set, controls_set], noExpand=True) maya.create( name="rigDefault", asset=os.environ["AVALON_ASSET"], family="mindbender.rig", options={"useSelection": True}, ) cmds.file(rename="temp.ma") cmds.file(save=True) publish() cmds.file(new=True, force=True) representation = io.locate( [PROJECT_NAME, ASSET_NAME, "rigDefault", 1, "ma"]) container = maya.load(representation) nodes = cmds.sets(container, query=True) assembly = cmds.ls(nodes, assemblies=True)[0] assert_equals(assembly, "Bruce_01_:rigDefault")
def process(self, name, namespace, context, data): from maya import cmds from avalon import maya, api cmds.loadPlugin("atomImportExport.mll", quiet=True) # Load the rig using the RigLoader loader = { Loader.__name__: Loader for Loader in api.discover(avalon.maya.Loader) }.get("RigLoader", None) if loader is None: raise RuntimeError("Unable to find RigLoader") rig = context["representation"]["dependencies"][0] container = maya.load( loader, rig, name=name, namespace=namespace, # Skip creation of Animation instance data={"post_process": False}) try: control_set = next(node for node in cmds.sets(container, query=True) if node.endswith("controls_SET")) except StopIteration: raise TypeError("%s is missing controls_SET") cmds.select(control_set) options = ";".join([ "", "", "targetTime=3", "option=insert", "match=hierarchy", "selected=selectedOnly", "search=", "replace=", "prefix=", "suffix=", "mapFile=", ]) cmds.select( control_set, replace=True, # Support controllers being embedded in # additional selection sets. noExpand=False) nodes = cmds.file( self.fname, i=True, type="atomImport", renameAll=True, namespace=namespace, options=options, returnNewNodes=True, ) self[:] = nodes + cmds.sets(container, query=True) + [container] # Trigger post process only if it's not been set to disabled if data.get("post_process", True): self._post_process(name, namespace, context, data)