def addCam(self, text, rx=-45, ry=45, ortho=False, json=True, t_r_list=None): """addCam 添加摄像机 Arguments: text {str} -- 摄像机名称 Keyword Arguments: rx {int} -- x轴旋转角度 (default: {-45}) ry {int} -- y轴旋转角度 (default: {45}) ortho {bool} -- 正交属性 (default: {False}) json {bool} -- 是否存储当前设置的属性 (default: {True}) t_r_list {tuple} -- 位移和旋转的组合元组 (default: {None}) Returns: [camera] -- Maya 的 Camera 对象 """ fit = self.manager.setting.Fit_SP.value() cam, cam_shape = pm.camera(n=text) text = cam.name() pm.parent(cam, self.grp) # Note 隐藏摄像机 cam.visibility.set(0) # Note 如果传入这个变量说明是读取数据 安装数据设置摄像机 pm.select(self.sel_list) if t_r_list: t, r = t_r_list cam.t.set(t) cam.r.set(r) else: cam.rx.set(rx) cam.ry.set(ry) pm.lookThru(cam) pm.viewFit(f=fit, all=0) if ortho: cam_shape.orthographic.set(ortho) pm.lookThru(cam) pm.viewFit(f=fit / 2, all=0) # NOTE 是否将数组输出到到字典上 if json: self.camera_setting[text] = {} self.camera_setting[text]["translate"] = cam.t.get().tolist() self.camera_setting[text]["rotate"] = cam.r.get().tolist() self.camera_setting[text]["orthographic"] = ortho return cam
def prepareRig(self): print 'Prepare core rig' pm.select('model_GRP') pm.viewFit() cmds.dgdirty(allPlugs=True) cmds.refresh() getattr(self.charModule, self.character + 'PrepareRig')()
def create_icon(self, model=Model()): pmc.viewFit() # set img format as jpg pmc.setAttr('defaultRenderGlobals.imageFormat', 8) pmc.playblast(completeFilename=model.icon, forceOverwrite=True, format='image', width=200, height=200, showOrnaments=False, startTime=1, endTime=1, viewer=False)
def createIcons(self): print "CREATE ICONS" formatOrig = pm.getAttr("defaultRenderGlobals.imageFormat") for style in SimpleCurves.STYLES: iPath = os.path.join(self.iconPath, "%s.png"%(style)) pm.setAttr("defaultRenderGlobals.imageFormat", 32) newCurve = self.simpleCurve(style) pm.viewFit(all=True) pm.playblast(frame=1, format = "image", cf = iPath, wh = (100,100), p=100) newCurve.delete() pm.setAttr("defaultRenderGlobals.imageFormat", formatOrig) ControlUI(self.iconPath)
def screenshotControlShapes(): ''' Takes screen shots of all the available controls shapes as `./ui/shapes/<shape_name>_large.png`. ''' global SHAPES cam = PyNode('persp') cam.rx.set(-30) cam.ry.set(45) shapes = listShapes() args = ['temp_shape', 1, 'blue 0.5'] for shape in shapes: destfile = os.path.dirname( ui.__file__) + '/shapes/' + shape + '_large.png' regfile = os.path.dirname(ui.__file__) + '/shapes/' + shape + '.png' if os.path.exists(destfile) or os.path.exists(regfile): continue print('Grabbing', shape) obj = SHAPES[shape](*args) select(obj) viewFit(f=.95) # .95 is default #need to frame 'deal' and zoom by some amount, or just crop in post? # -viewer 0 to skip fcheck result = mel.eval( 'playblast -startTime 1 -endTime 1 -format image -sequenceTime 0 -clearCache 1 -viewer 0 -showOrnaments 0 -fp 0 -percent 100 -compression "png" -quality 70 -widthHeight 512 512;' ) time.sleep(2.5) #Need to wait for render filename = result.replace('####', '1') os.rename(filename, destfile) delete(obj) print('Done')
def save_icon(object, filename, imageFormat): """ Take picture of object, render using playblast for later use as a QT Button icon. """ path = os.path.join(save_folder, "{}.png".format(filename)) # Store all hidden items items = pm.hide(allObjects=True, returnHidden=True) # Show only object we want to focus on and fit view pm.showHidden(object) pm.viewFit() # PNG is 32 in the imageFormat enum. pm.setAttr("defaultRenderGlobals.imageFormat", imageFormat) pm.playblast(completeFilename=path, forceOverwrite=True, format='image', width=200, height=200, showOrnaments=False, startTime=1, endTime=1, viewer=False) # Show all the items we hid a while back. pm.showHidden(items) # Return camera to previous view. pm.viewSet(previousView=True)
def lookThruAndFrame(obj): """ Looks through the given obj and moves the obj so that it frames the viewport objects. :param obj: The camera or light object. :return: None """ cmds.lookThru(obj) # Position the active camera to view the active objects pm.viewFit() # Position cameraShape-1 to view all objects pm.viewFit(obj, all=True) # Fill 50 percent of the active view with active objects pm.viewFit(f=0.5) pm.viewFit(all=True)
def importFile(sFilePath, **kwargs): if not isinstance(sFilePath, basestring): raise TypeError, 'Wrong type passed to file path argument: {0}'.format(type(sFilePath)) if ("%" in sFilePath) or ("$" in sFilePath): sResolvedPath = pathResolve(sFilePath) else: sResolvedPath = sFilePath if not osp.isfile(sResolvedPath): raise ValueError, 'Import failed. No such file found : "{0}"'.format(sResolvedPath) kwargs.pop("defaultNamespace", kwargs.pop("dns", None)) bReference = kwargs.pop("reference", kwargs.pop("r", False)) bViewFit = kwargs.pop('viewFit', False) bOutNewNodes = kwargs.pop('returnNewNodes', kwargs.pop('rnn', True)) bPreserveRefs = kwargs.pop('preserveReferences', kwargs.pop('pr', True)) bNewScene = kwargs.pop('newScene', kwargs.pop('nsc', False)) if bReference: bUseNamespaces = True bNewScene = False else: bUseNamespaces = kwargs.pop('useNamespaces', kwargs.pop('uns', False)) # sNamespace = "" if bUseNamespaces: sNamespace = kwargs.pop("namespace", kwargs.pop("ns" , "")) if not sNamespace: sNamespace = osp.basename(sResolvedPath).rsplit(".", 1)[0] ##Three states kwarg: ##if newScene == True , importing NewScene is forced ##if newScene == False, importing in the CurrentScene ##if newScene == "NoEntry", so choose between NewScene and CurrentScene if bNewScene == "NoEntry": sConfirm = pm.confirmDialog(title="Import File", message='Import file into ... ?', button=["New Scene", "Current Scene", "Cancel"], defaultButton="New Scene", cancelButton="Cancel", dismissString="Cancel", ) if sConfirm == "Cancel": logMsg("Cancelled !" , warning=True) return bNewScene = True if sConfirm == "New Scene" else False if bNewScene: if newScene(**kwargs): return if bReference: oNewNodeList = pm.createReference(sFilePath, namespace=sNamespace, returnNewNodes=bOutNewNodes, **kwargs) else: if bUseNamespaces: kwargs["namespace"] = sNamespace oNewNodeList = pm.importFile(sResolvedPath, returnNewNodes=bOutNewNodes, preserveReferences=bPreserveRefs, **kwargs) oNewNodeList = listForNone(oNewNodeList) if oNewNodeList and bViewFit: pm.viewFit(all=True) return oNewNodeList
def previewSaver(self, name, assetDirectory): """ Saves the preview files under the Asset Directory Args: name: (Unicode) Name of the Asset assetDirectory: (Unicode) Directory of Asset Returns: (Tuple) Thumbnail path, Screenshot path, Wireframe path """ logger.info("Saving Preview Images") selection = pm.ls(sl=True) validShapes = pm.listRelatives(selection, ad=True, type=["mesh", "nurbsSurface"]) thumbPath = os.path.join(assetDirectory, '%s_thumb.jpg' % name) SSpath = os.path.join(assetDirectory, '%s_s.jpg' % name) WFpath = os.path.join(assetDirectory, '%s_w.jpg' % name) # make sure the viewport display is suitable panel = pm.getPanel(wf=True) if pm.getPanel(to=panel) != "modelPanel": logger.warning( "The focus is not on a model panel, using the perspective view" ) panel = pm.getPanel(wl="Persp View") # Somehot wl dont return a regular string, convert it to a regular string t = "" for z in panel: t += z panel = t pm.modelEditor(panel, e=1, allObjects=1) pm.modelEditor(panel, e=1, da="smoothShaded") pm.modelEditor(panel, e=1, displayTextures=1) pm.modelEditor(panel, e=1, wireframeOnShaded=0) pm.viewFit() pm.isolateSelect(panel, state=1) pm.isolateSelect(panel, addSelected=True) # temporarily deselect pm.select(d=True) pm.setAttr("defaultRenderGlobals.imageFormat", 8) # This is the value for jpeg frame = pm.currentTime(query=True) # thumb pm.playblast(completeFilename=thumbPath, forceOverwrite=True, format='image', width=200, height=200, showOrnaments=False, frame=[frame], viewer=False) # screenshot pm.playblast(completeFilename=SSpath, forceOverwrite=True, format='image', width=1600, height=1600, showOrnaments=False, frame=[frame], viewer=False) # Wireframe pm.modelEditor(panel, e=1, displayTextures=0) pm.modelEditor(panel, e=1, wireframeOnShaded=1) pm.playblast(completeFilename=WFpath, forceOverwrite=True, format='image', width=1600, height=1600, showOrnaments=False, frame=[frame], viewer=False) pm.select(selection) # UV Snapshot -- It needs logger.info("Saving UV Snapshots") for i in range(0, len(validShapes)): print "validShape", validShapes[i] # transformNode = validShapes[i].getParent() objName = validShapes[i].name() UVpath = os.path.join(assetDirectory, '%s_uv.jpg' % objName) pm.select(validShapes[i]) try: pm.uvSnapshot(o=True, ff="jpg", n=UVpath, xr=1600, yr=1600) except: logger.warning("UV snapshot is missed for %s" % validShapes[i]) pm.isolateSelect(panel, state=0) pm.isolateSelect(panel, removeSelected=True) # TODO // store the scene defaults (camera position, imageFormat, etc. return thumbPath, SSpath, WFpath
def fit_view(): logger.debug("Fit View") pmc.select(clear=True) pmc.viewFit(all=True) return True
def importFile(sFilePath, **kwargs): if not isinstance(sFilePath, basestring): raise TypeError, 'Wrong type passed to file path argument: {0}'.format( type(sFilePath)) if ("%" in sFilePath) or ("$" in sFilePath): sResolvedPath = pathResolve(sFilePath) else: sResolvedPath = sFilePath if not osp.isfile(sResolvedPath): raise ValueError, 'Import failed. No such file found : "{0}"'.format( sResolvedPath) kwargs.pop("defaultNamespace", kwargs.pop("dns", None)) bReference = kwargs.pop("reference", kwargs.pop("r", False)) bViewFit = kwargs.pop('viewFit', False) bOutNewNodes = kwargs.pop('returnNewNodes', kwargs.pop('rnn', True)) bPreserveRefs = kwargs.pop('preserveReferences', kwargs.pop('pr', True)) bNewScene = kwargs.pop('newScene', kwargs.pop('nsc', False)) if bReference: bUseNamespaces = True bNewScene = False else: bUseNamespaces = kwargs.pop('useNamespaces', kwargs.pop('uns', False)) # sNamespace = "" if bUseNamespaces: sNamespace = kwargs.pop("namespace", kwargs.pop("ns", "")) if not sNamespace: sNamespace = osp.basename(sResolvedPath).rsplit(".", 1)[0] ##Three states kwarg: ##if newScene == True , importing NewScene is forced ##if newScene == False, importing in the CurrentScene ##if newScene == "NoEntry", so choose between NewScene and CurrentScene if bNewScene == "NoEntry": sConfirm = pm.confirmDialog( title="Import File", message='Import file into ... ?', button=["New Scene", "Current Scene", "Cancel"], defaultButton="New Scene", cancelButton="Cancel", dismissString="Cancel", ) if sConfirm == "Cancel": logMsg("Cancelled !", warning=True) return bNewScene = True if sConfirm == "New Scene" else False if bNewScene: if newScene(**kwargs): return if bReference: oNewNodeList = pm.createReference(sFilePath, namespace=sNamespace, returnNewNodes=bOutNewNodes, **kwargs) else: if bUseNamespaces: kwargs["namespace"] = sNamespace oNewNodeList = pm.importFile(sResolvedPath, returnNewNodes=bOutNewNodes, preserveReferences=bPreserveRefs, **kwargs) oNewNodeList = listForNone(oNewNodeList) if oNewNodeList and bViewFit: pm.viewFit(all=True) return oNewNodeList
def icon_batchRender(): # 초기 세팅 if not 'icon_batchRender_ing' in pm.ls(): # 작업중인 데이터가 있으면, 사용자에게 컨펌 받음. _result = pm.confirmDialog( title=u'아이콘 렌더링 화면을 준비합니다', message=u'주의 : 작업중인 데이터가 쑝 날아갑니다. 그래도, 계속 할거에요?', button=['Yes','No'], defaultButton='Yes', cancelButton='No', dismissString='No' ) # 아니면 중단. if _result != "Yes": return False # 새 파일을 만들고 pm.newFile(f=True) pm.setAttr('defaultRenderGlobals.currentRenderer', 'mayaHardware2', type='string') pm.setAttr('defaultRenderGlobals.imageFormat', 32) # png pm.setAttr('defaultRenderGlobals.enableDefaultLight', 0) pm.setAttr('defaultResolution.width', iconsize) pm.setAttr('defaultResolution.height', iconsize) pm.setAttr('defaultResolution.deviceAspectRatio', 1) pm.setAttr('hardwareRenderingGlobals.multiSampleEnable', 1) pm.setAttr('hardwareRenderingGlobals.multiSampleCount', 1 ) #pm.setAttr('hardwareRenderingGlobals.multiSampleCount', 16 ) hw = pm.PyNode('hardwareRenderingGlobals') #hw.objectTypeFilterNameArray.get() #hw.objectTypeFilterValueArray.get() hw.objectTypeFilterValueArray.set([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) persp = pm.PyNode('persp') persp.translateX.set(1.381) persp.translateY.set(7.395) persp.translateZ.set(5.797) persp.rotateX.set(-45) persp.rotateX.set(-60) persp.rotateY.set(45) persp.rotateZ.set(0) crv = curveShape.create( 'cube' ) pm.viewFit('perspShape', all=True, f=.8 ) pm.delete(crv) #perspShape pm.setAttr('perspShape.filmFit', 1) # 0:fill, 1:Horizontal, 2:Vertical 3:Overscan pm.setAttr('perspShape.displayResolution', 1) pm.setAttr('perspShape.displayGateMask', 1) pm.setAttr('perspShape.overscan', 1.6) pm.setAttr('perspShape.focalLength', 200) pm.setAttr('perspShape.horizontalFilmAperture', 1) pm.setAttr('perspShape.verticalFilmAperture', 1) viewFitVal = 0.8 result = pm.promptDialog(m='viewFit factor : ', text=viewFitVal) if result: text = pm.promptDialog(q=True, text=True) viewFitVal = float(text) for name in curveShape.CURVESHAPE.keys(): crv = curveShape.create( name ) pm.select(crv) colIndex = 16 # white colIndex = 18 # skyBlue colIndex = 3 # lightGray #curveShape.setColor(col=18) #curveShape.setColor(col='gray') crv.overrideColor.set( colIndex ) crv.overrideEnabled.set( True ) # pm.viewFit(all=True ) #pm.viewFit('perspShape', all=True,) pm.viewFit('perspShape', f=viewFitVal ) pm.select(cl=True) if pm.objExists('grid'): pm.select('grid') pm.setAttr('grid.v', 1) pm.viewFit(f=.7) pm.select(cl=True) pm.setAttr('grid.v', 0) # 필요 변수 설정 renderIconFile = iconPath + 'ui_thumbnail__%s'%name # 아이콘 렌더링 경로 # 렌더글로벌 조정 : 파일 이름 pm.setAttr('defaultRenderGlobals.imageFilePrefix',renderIconFile, type='string') # 아이콘 렌더 : 렌더~ #pm.Mayatomr( preview=True, camera='perspShape', xResolution=self._iconRenderRes, yResolution=self._iconRenderRes ) # 멘탈레이 pm.ogsRender( w=iconsize, h=iconsize, enableMultisample=True, camera='persp' ) pm.sysFile( renderIconFile+'_tmp.png', rename = renderIconFile+'.png') pm.refresh() pm.delete(crv) # UI 갱신 ui() if pm.objExists('grid'): pm.setAttr('grid.v', 1) # 샘플 오브젝트 생성 if not pm.objExists('icon_batchRender_ing'): pm.group(n='icon_batchRender_ing',em=True)
def viewFit(self, item): pm.select(cl=True) pm.select(item) pm.viewFit()
def export(self, **kwargs): # the category is just a folder below the library path assetCategory = kwargs.setdefault('assetCategory', 'default') # if no name is specified it uses the scene name assetName = kwargs.setdefault('assetName', pm.sceneName().basename()[:-3]) # an asset can have a .txt file associated with it. This should # help to clarify the contents of an asset assetDescription = kwargs.setdefault('assetDescription') # by default the exportAll command is called exportType = kwargs.setdefault('type', 'all') # if true automatically sets the camera to frame the exported objs autoFrame = kwargs.setdefault('autoFrame', True) breakRef = kwargs.setdefault('breakRef', False) # if the scene was not saved it has no name if assetName == '': raise Exception('Asset Name not specified') if exportType == 'selected' and not pm.selected(): # if nothing is selected, stop the execution here raise Exception('Nothing Selected') # create the folders if they don't exist self.checkPath(os.path.join(self.libraryPath, assetCategory)) assetPath = os.path.join(self.libraryPath, assetCategory, assetName) self.checkPath(assetPath) # save the selection now because enableIsolateSelect clears it selection = pm.selected() mpanel = pm.paneLayout('viewPanes', q=True, pane1=True) # disable selection highlighting and wireframe on shaded wireframeOnShadedState = pm.windows.modelEditor(mpanel, q=True, wireframeOnShaded=True) pm.windows.modelEditor(mpanel, e=True, sel=False, wireframeOnShaded=False) # set background color originalBackgroundColor = pm.general.displayRGBColor('background', q=True) pm.general.displayRGBColor('background', 0.3, 0.3, 0.3) # set the camera cam = pm.ls(pm.modelPanel(mpanel, q=True, cam=True), type='transform')[0] if autoFrame: wTrans = cam.getTranslation(ws=True) wRot = cam.getRotation(ws=True) try: cam.rx.set(-10) cam.ry.set(30) pm.viewFit() except: pass pm.general.refresh() if exportType == 'selected': # hide everything that is not selected for the playblast pm.mel.eval('enableIsolateSelect %s %d' % (mpanel, 1)) # RENDER ICON # this is a simple playblast of the current frame # image is saved as .jpg with an _icon suffix pm.animation.playblast(cf=assetPath + '/' + assetName + '_icon.jpg', format='image', compression='jpg', widthHeight=[128, 128], frame=[pm.animation.currentTime()], orn=False, os=True, v=False, percent=100) if autoFrame: try: # reset camera cam.setTranslation(wTrans, ws=True) cam.setRotation(wRot, ws=True) except: pass if exportType == 'selected': # show the scene again. the user shouldn't notice pm.mel.eval('enableIsolateSelect %s %d' % (mpanel, 0)) # reenable selection highlighting and reset wireframe on shaded to what it was before pm.windows.modelEditor(mpanel, e=True, sel=True, wireframeOnShaded=wireframeOnShadedState) #reset the background color to what it was before pm.general.displayRGBColor('background', originalBackgroundColor[0], originalBackgroundColor[1], originalBackgroundColor[2]) # EXPORT FILE # reselect the selection, isolate select clears it. pm.select(selection) if exportType == 'all': self.fixNamespaces( self.removeStudentLic( pm.system.exportAll(assetPath + '/' + assetName + '.ma', preserveReferences=not breakRef, force=True))) if exportType == 'selected': self.fixNamespaces( self.removeStudentLic( pm.system.exportSelected(assetPath + '/' + assetName + '.ma', preserveReferences=not breakRef, force=True))) # SAVE DESCRIPTION # newlines are saved if assetDescription: text_file = open(assetPath + '/' + assetName + '.txt', 'wt') text_file.write(assetDescription.encode('utf8')) text_file.close()