def testCleanExistingLayers(self): exampleData = """<?xml version="1.0" encoding="UTF-8"?> <ngstLayerData version="1.0"> <layer enabled="yes" mask="" name="imported layer 1" opacity="1"> <influence index="0" name="joint1" weights="1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0"/> </layer> </ngstLayerData> """ self.writeFile(self.exportName, exampleData) openMayaFile('normalization.ma') cmds.select('testMesh') self.mll.setCurrentMesh('testMesh') self.mll.initLayers() self.mll.createLayer("one") self.mll.createLayer("two") self.assertEquals(len(list(self.mll.listLayers())),2) options = ImportOptions() options.keepExistingLayers = False a = ImportAction(ownerUI=None, ioFormat=Formats.getXmlFormat()) a.selectFile = lambda *args,**kwargs: self.exportName a.getImportOptions = lambda: options a.execute() newLayers = list(self.mll.listLayers()) self.assertEquals(len(newLayers),1) layerId = newLayers[0][0] influences = list(self.mll.listLayerInfluences(layerId)) self.assertEqual(len(influences), 1)
def testAddManualInfluence(self): openMayaFile('simplemirror.ma') cmds.select("testMeshY") mll = MllInterface() mll.initLayers() mll.setCurrentLayer(mll.createLayer("test layer")) window = MainWindow.open() mirrorTab = window.findTab(TabMirror) initWindow = mirrorTab.execInitMirror() def selectPairAndClickOk(dialog): log.info("running inside modal dialog "+str(dialog)) dialog.sourceDropdown.setValue(2) dialog.destinationDropdown.setValue(3) dialog.chkSelfReference.setValue(False) #dialog.closeDialogWithResult(BaseDialog.BUTTON_OK) closeNextDialogWithResult(BaseDialog.BUTTON_OK) log.info("modal dialog setup") runInNextModalDialog(selectPairAndClickOk) log.info("modal dialog setup ended") initWindow.content.addPairAction.execute() self.assertEquals(str(initWindow.content.items[0]),"[M] L_joint2 <-> L_joint3", "manual pair addition failed")
def testAccess(self): # test the same for specified mesh, or None for current selection for mesh in ('testMesh', None): testUtils.openMayaFile("normalization.ma") self.mll.setCurrentMesh(mesh) if mesh is None: cmds.select('testMesh') self.mll.initLayers() layerId = self.mll.createLayer("initial weights") self.assertNotEqual(None, layerId) self.assertEqual("initial weights", self.mll.getLayerName(layerId)) self.assertEqual(16, self.mll.getVertCount(), "Invalid vertex count detected") self.assertEqual(1, self.mll.getLayerOpacity(layerId)) self.assertEqual(True, self.mll.isLayerEnabled(layerId)) self.assertEqual([], self.mll.getLayerMask(layerId)) self.assertFloatArraysEqual( self.mll.getInfluenceWeights(layerId, 1), [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ])
def setUp(self): self.targetMesh = 'testMesh' self.numVerts = 169 # number of verts in our mesh self.mll = MllInterface() unittest.TestCase.setUp(self) openMayaFile('simplemirror.ma') cmds.hide("|y_axis") cmds.showHidden("|x_axis") self.mll.setCurrentMesh(self.targetMesh) self.mll.initLayers() self.mll.createLayer("original weights") self.model = ie.LayerData() self.layer = ie.Layer() self.layer.opacity = 1.0 self.layer.enabled = True self.layer.mask = [0.0] * self.numVerts self.layer.mask[1] = 0.9 self.layer.mask[5] = 0.5566 self.layer.name = "imported layer" self.model.addLayer(self.layer) self.infl = ie.Influence() self.layer.addInfluence(self.infl) self.infl.influenceName = "x_axis|root|R_joint1" self.infl.logicalIndex = 666 # use nonsense value self.infl.weights = [0.1] * self.numVerts self.infl.weights[3] = 0.688 self.infl.weights[4] = 0.345
def setUp(self): self.targetMesh = 'testMesh' self.numVerts = 169 # number of verts in our mesh self.mll = MllInterface() unittest.TestCase.setUp(self) openMayaFile('simplemirror.ma') cmds.hide("|y_axis") cmds.showHidden("|x_axis") self.mll.setCurrentMesh(self.targetMesh) self.mll.initLayers() self.mll.createLayer("original weights") self.model = ie.LayerData() self.layer = ie.Layer() self.layer.opacity = 1.0 self.layer.enabled = True self.layer.mask = [0.0]*self.numVerts self.layer.mask[1] = 0.9 self.layer.mask[5] = 0.5566 self.layer.name = "imported layer" self.model.addLayer(self.layer) self.infl = ie.Influence() self.layer.addInfluence(self.infl) self.infl.influenceName = "x_axis|root|R_joint1" self.infl.logicalIndex = 666 # use nonsense value self.infl.weights = [0.1]*self.numVerts self.infl.weights[3] = 0.688 self.infl.weights[4] = 0.345
def testCleanExistingLayers(self): exampleData = """<?xml version="1.0" encoding="UTF-8"?> <ngstLayerData version="1.0"> <layer enabled="yes" mask="" name="imported layer 1" opacity="1"> <influence index="0" name="joint1" weights="1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0"/> </layer> </ngstLayerData> """ self.writeFile(self.exportName, exampleData) openMayaFile('normalization.ma') cmds.select('testMesh') self.mll.setCurrentMesh('testMesh') self.mll.initLayers() self.mll.createLayer("one") self.mll.createLayer("two") self.assertEquals(len(list(self.mll.listLayers())), 2) options = ImportOptions() options.keepExistingLayers = False a = ImportAction(ownerUI=None, ioFormat=Formats.getXmlFormat()) a.selectFile = lambda *args, **kwargs: self.exportName a.getImportOptions = lambda: options a.execute() newLayers = list(self.mll.listLayers()) self.assertEquals(len(newLayers), 1) layerId = newLayers[0][0] influences = list(self.mll.listLayerInfluences(layerId)) self.assertEqual(len(influences), 1)
def testImportAvailableWithNoLayers(self): exampleData = """<?xml version="1.0" encoding="UTF-8"?> <ngstLayerData version="1.0"> <layer enabled="yes" mask="" name="imported layer 1" opacity="1"> <influence index="0" name="joint1" weights="1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0"/> </layer> </ngstLayerData> """ self.writeFile(self.exportName, exampleData) openMayaFile('normalization.ma') a = ImportAction(ownerUI=None, ioFormat=Formats.getXmlFormat()) a.selectFile = lambda *args, **kwargs: self.exportName a.getImportOptions = lambda: ImportOptions() cmds.select('persp') self.assertFalse( a.isEnabled(), "import action should be disabled if target mesh is not suitable for skinning" ) cmds.select('testMesh') self.assertTrue( a.isEnabled(), "import action should be available if suitable mesh is selected") # should allow execution here a.execute()
def testInvalidInfluenceIndex(self): testUtils.openMayaFile("normalization.ma") self.mll.setCurrentMesh('testMesh') self.mll.initLayers() layerId = self.mll.createLayer("initial weights") weights = [0.0]*self.mll.getVertCount() with self.assertRaises(errorMessage="skin cluster does not have logical influence 666"): self.mll.setInfluenceWeights(layerId, 666, weights)
def testInvalidInfluenceIndex(self): testUtils.openMayaFile("normalization.ma") self.mll.setCurrentMesh('testMesh') self.mll.initLayers() layerId = self.mll.createLayer("initial weights") weights = [0.0] * self.mll.getVertCount() with self.assertRaises( errorMessage="skin cluster does not have logical influence 666" ): self.mll.setInfluenceWeights(layerId, 666, weights)
def testLoad2(self): openMayaFile('simplemirror.ma') mll = MllInterface() mll.setCurrentMesh('testMesh') mll.initLayers() mll.createLayer("Initial Weights") model = LayerData() model.loadFrom('testMesh') self.assertEqual(model.layers[0].name, "Initial Weights") self.assertEquals(model.layers[0].influences[0].influenceName, "|x_axis|root")
def setUp(self): unittest.TestCase.setUp(self) self.mll = MllInterface() self.setup = DuplicateLayers() self.setup.setMllInterface(self.mll) testUtils.openMayaFile("influence transfer.mb") self.mll.setCurrentMesh('sourceMesh') self.mll.initLayers()
def setUp(self): testUtils.openMayaFile("normalization.ma") self.mll = MllInterface() cmds.select("testMesh") self.mll.initLayers() self.mll.createLayer("initial weights") self.layer = self.mll.createLayer("second layer") self.mll.setCurrentLayer(self.layer) self.clipboard = WeightsClipboard(self.mll) self.newWeights = [0.5]*self.mll.getVertCount()
def setUp(self): unittest.TestCase.setUp(self) testUtils.openMayaFile("normalization.ma") self.mll = mll = MllInterface() mll.setCurrentMesh("testMesh") mll.initLayers() mll.createLayer("initial weights") mll.createLayer("second layer") HeadlessDataHost.HANDLE.addReference(self) self.exportName = os.path.join(tempfile.gettempdir(), 'layersTestData_%d.xml' %random.randint(0,1024*1024)) self.assertTrue(not os.path.exists(self.exportName), 'target file already exists')
def testAddManualMirrorInfluences(self): testUtils.openMayaFile("genericSkinnedMesh.mb") self.mll.setCurrentMesh("mesh|pPlane1") self.mll.initLayers() layerId = self.mll.createLayer("initial weights") result = self.mll.listManualMirrorInfluenceAssociations() self.assertArraysEqual(result, []) self.mll.addManualMirrorInfluenceAssociation("L_joint1", "R_joint1") self.mll.addManualMirrorInfluenceAssociation("R_joint1", "L_joint1") result = self.mll.listManualMirrorInfluenceAssociations() self.assertDictionariesEqual(result, {"L_joint1":"R_joint1","R_joint1":"L_joint1"})
def testSetMaxInfluencePerVertex(self): testUtils.openMayaFile("genericSkinnedMesh.mb") self.mll.setCurrentMesh("mesh|pPlane1") self.mll.initLayers() layerId = self.mll.createLayer("initial weights") self.assertEqual(self.mll.getInfluenceLimitPerVertex(),0,"initial limit per vertex should be zero") self.mll.setInfluenceLimitPerVertex(10) self.assertEqual(self.mll.getInfluenceLimitPerVertex(),10,"was not able to set limit to the desired value") self.mll.setInfluenceLimitPerVertex(2) self.assertEqual(self.mll.getInfluenceLimitPerVertex(),2,"was not able to set limit to the desired value")
def setUp(self): unittest.TestCase.setUp(self) testUtils.openMayaFile("normalization.ma") self.mll = mll = MllInterface() mll.setCurrentMesh("testMesh") mll.initLayers() mll.createLayer("initial weights") mll.createLayer("second layer") HeadlessDataHost.HANDLE.addReference(self) self.exportName = os.path.join( tempfile.gettempdir(), 'layersTestData_%d.xml' % random.randint(0, 1024 * 1024)) self.assertTrue(not os.path.exists(self.exportName), 'target file already exists')
def testSetMaxInfluencePerVertex(self): testUtils.openMayaFile("genericSkinnedMesh.mb") self.mll.setCurrentMesh("mesh|pPlane1") self.mll.initLayers() layerId = self.mll.createLayer("initial weights") self.assertEqual(self.mll.getInfluenceLimitPerVertex(), 0, "initial limit per vertex should be zero") self.mll.setInfluenceLimitPerVertex(10) self.assertEqual(self.mll.getInfluenceLimitPerVertex(), 10, "was not able to set limit to the desired value") self.mll.setInfluenceLimitPerVertex(2) self.assertEqual(self.mll.getInfluenceLimitPerVertex(), 2, "was not able to set limit to the desired value")
def testAddManualMirrorInfluences(self): testUtils.openMayaFile("genericSkinnedMesh.mb") self.mll.setCurrentMesh("mesh|pPlane1") self.mll.initLayers() layerId = self.mll.createLayer("initial weights") result = self.mll.listManualMirrorInfluenceAssociations() self.assertArraysEqual(result, []) self.mll.addManualMirrorInfluenceAssociation("L_joint1", "R_joint1") self.mll.addManualMirrorInfluenceAssociation("R_joint1", "L_joint1") result = self.mll.listManualMirrorInfluenceAssociations() self.assertDictionariesEqual(result, { "L_joint1": "R_joint1", "R_joint1": "L_joint1" })
def testDefectXmlImportIssue(self): openMayaFile("defect-xml-import-fails/mirror_association_issues.ma") importer = XmlImporter() data = importer.process(getTestFileContents("defect-xml-import-fails/mirror_weighting_manual_layers.xml")) mll = MllInterface() mll.setCurrentMesh("pSphere1") overrides = mll.listManualMirrorInfluenceAssociations() self.assertEqual(len(overrides), 0) data.saveTo("pSphere1") overrides = mll.listManualMirrorInfluenceAssociations() self.assertEqual(len(overrides), 1)
def testOverwriteWeightsCrashesMaya(self): testUtils.openMayaFile("genericSkinnedMesh.mb") self.mll.setCurrentMesh("mesh|pPlane1") self.mll.initLayers() layerId = self.mll.createLayer("initial weights",forceEmpty=True) weights = [1.0]*self.mll.getVertCount() weights[0] = 0.7 weights[1] = 0.5 weights[2] = 0.3 self.mll.setInfluenceWeights(layerId, 0, weights) self.assertFloatArraysEqual(self.mll.getInfluenceWeights(layerId, 0)[0:3], [0.7,0.5,0.3]) self.mll.setInfluenceWeights(layerId, 1, weights) self.assertFloatArraysEqual(weights,self.mll.getInfluenceWeights(layerId, 1)) # previous influence should have some of it's value substracted self.assertFloatArraysEqual(self.mll.getInfluenceWeights(layerId, 0)[0:3], [0.3,0.5,0.3])
def testAccess(self): # test the same for specified mesh, or None for current selection for mesh in ('testMesh',None): testUtils.openMayaFile("normalization.ma") self.mll.setCurrentMesh(mesh) if mesh is None: cmds.select('testMesh') self.mll.initLayers() layerId = self.mll.createLayer("initial weights") self.assertNotEqual(None, layerId) self.assertEqual("initial weights",self.mll.getLayerName(layerId)) self.assertEqual(16, self.mll.getVertCount(), "Invalid vertex count detected") self.assertEqual(1, self.mll.getLayerOpacity(layerId)) self.assertEqual(True, self.mll.isLayerEnabled(layerId)) self.assertEqual([], self.mll.getLayerMask(layerId)) self.assertFloatArraysEqual(self.mll.getInfluenceWeights(layerId,1),[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0])
def testOverwriteWeightsCrashesMaya(self): testUtils.openMayaFile("genericSkinnedMesh.mb") self.mll.setCurrentMesh("mesh|pPlane1") self.mll.initLayers() layerId = self.mll.createLayer("initial weights", forceEmpty=True) weights = [1.0] * self.mll.getVertCount() weights[0] = 0.7 weights[1] = 0.5 weights[2] = 0.3 self.mll.setInfluenceWeights(layerId, 0, weights) self.assertFloatArraysEqual( self.mll.getInfluenceWeights(layerId, 0)[0:3], [0.7, 0.5, 0.3]) self.mll.setInfluenceWeights(layerId, 1, weights) self.assertFloatArraysEqual(weights, self.mll.getInfluenceWeights(layerId, 1)) # previous influence should have some of it's value substracted self.assertFloatArraysEqual( self.mll.getInfluenceWeights(layerId, 0)[0:3], [0.3, 0.5, 0.3])
def testImportAvailableWithNoLayers(self): exampleData = """<?xml version="1.0" encoding="UTF-8"?> <ngstLayerData version="1.0"> <layer enabled="yes" mask="" name="imported layer 1" opacity="1"> <influence index="0" name="joint1" weights="1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0"/> </layer> </ngstLayerData> """ self.writeFile(self.exportName, exampleData) openMayaFile('normalization.ma') a = ImportAction(ownerUI=None, ioFormat=Formats.getXmlFormat()) a.selectFile = lambda *args,**kwargs: self.exportName a.getImportOptions = lambda : ImportOptions() cmds.select('persp') self.assertFalse(a.isEnabled(), "import action should be disabled if target mesh is not suitable for skinning") cmds.select('testMesh') self.assertTrue(a.isEnabled(), "import action should be available if suitable mesh is selected") # should allow execution here a.execute()
def setUp(self): unittest.TestCase.setUp(self) self.importer = ImportInfluences() testUtils.openMayaFile("influence transfer.mb")
def testAccessForNoSelection(self): testUtils.openMayaFile("normalization.ma") cmds.select(cl=True) self.mll.setCurrentMesh(None) self.assertEquals(None, self.mll.getTargetInfo())
def testAccessForNoSelection(self): testUtils.openMayaFile("normalization.ma") cmds.select(cl=True) self.mll.setCurrentMesh(None) self.assertEquals(None,self.mll.getTargetInfo())