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
Exemplo n.º 2
0
    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')()
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
 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)
Exemplo n.º 5
0
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')
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
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)
Exemplo n.º 9
0
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
Exemplo n.º 10
0
    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
Exemplo n.º 11
0
def fit_view():
    logger.debug("Fit View")
    pmc.select(clear=True)
    pmc.viewFit(all=True)
    return True
Exemplo n.º 12
0
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
Exemplo n.º 13
0
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)
Exemplo n.º 14
0
 def viewFit(self, item):
     pm.select(cl=True)
     pm.select(item)
     pm.viewFit()
Exemplo n.º 15
0
    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()