def importDescription(self, palName, descName, version, binding=False): """ XGen description will imported without validator. When importing baked description, @binding set to False should be fine. """ xdscFileName = descName + '.xdsc' xdscFile = '/'.join( [self.paletteVerDir(palName, version), descName, xdscFileName]) if not os.path.isfile(xdscFile): pm.error('[XGen Hub] : .xdsc file is not exists. -> ' + xdscFile) return None self.clearPreview() # check if descriptions exists in current scene if descName in xg.descriptions(palName): # delete current description folder descDir = xg.expandFilepath('${DESC}', descName) if os.path.isdir(descDir): try: dir_util.remove_tree(descDir) except: pm.warning('[XGen Hub] : Dir may not remove. -> ' + descDir) # delete current description xg.deleteDescription(palName, descName) # IMPORT DESCRIPTION desc = base.importDescription(palName, xdscFile) # create imported descriptions folder dataPath = xg.getAttr('xgDataPath', palName) paletteRoot = xg.expandFilepath(dataPath, '') msxgApi.setupDescriptionFolder(paletteRoot, palName, desc) # wrap into maya nodes pm.mel.xgmWrapXGen(pal=palName, d=desc, gi=binding) # bind to selected geometry if binding: igdesc = xg.getAttr('groom', palName, desc) xg.modifyFaceBinding(palName, desc, 'Append', '', False, len(igdesc)) if igdesc: # set groom density and sampling method pm.setAttr(igdesc + '.density', 1) pm.setAttr(igdesc + '.interpStyle', 1) # import grooming as well self.importGrooming(palName, descName, version) # import guides as well self.importGuides(palName, descName, version) self.notifyMsg('Description Import Complete !', 0) return desc
def bind(description, meshes): """Bind description to meshes Args: description (str): XGen Legacy description name meshes (list): A list of meshes (transform node names) to bind with """ palette = get_palette_by_description(description) with capsule.maintained_selection(): cmds.select(meshes, replace=True) xg.modifyFaceBinding(palette, description, mode="Append", placeGuidesWithUVBasedMethod=True, rotateGuide=False)
def createDescription(self, description, primitive='Spline', generator='Random', renderer='Renderman', method='Guides'): """ Create xgen description Parameters: description: Description name primitive: Primitive type generator: Generate type renderer: Renderer that render xgen primitives method: Method to control xgen primitives Returns: None """ # Check user select a scalp mesh that right named sels = pm.selected() if not sels: pm.error('You must select a scalp mesh') scalp = sels[0].node() assert isinstance(scalp.getShape(), pm.nodetypes.Mesh), 'Need to select a mesh' assert scalp.startswith( self.assetName), 'Scalp name must start with "{0}_"'.format( self.assetName) prefixedDescription = self.assetName + '_' + description + '_desc' xg.createDescription(self.collection, prefixedDescription, primitive, generator, renderer, method) xg.modifyFaceBinding(self.collection, prefixedDescription) # Cleanup outliner pm.parent(scalp, self.scalpGrp) pm.parent(self.collection, self.hairFurGrp)