Maya测量尺寸python脚本Mesh Resizer

简介: 能够准确测量Maya软件中模型的尺寸大小。通过打开脚本编辑器,加入python脚本代码,点击模型运行即可。import maya.cmds as cmdsfrom collections import Counterfrom functools import partialJobSelected=cmds.scriptJob(event=["SelectionChanged", "AutoUpdateInfo()"])def KillJob(): cmds.scrip..

 能够准确测量Maya软件中模型的尺寸大小。通过打开脚本编辑器,加入python脚本代码,点击模型运行即可。

 

image.gif编辑

image.gif编辑

import maya.cmds as cmds
from collections import Counter
from functools import partial
JobSelected=cmds.scriptJob(event=["SelectionChanged", "AutoUpdateInfo()"])
def KillJob():
   cmds.scriptJob( kill=JobSelected, force=True)
def AutoUpdateInfo():
    ObjectSelect=cmds.ls(sl=True,fl=True)
    transforms = cmds.listRelatives(ObjectSelect,typ="mesh")
    yep=cmds.listRelatives(transforms, p=True,pa=True)
    try:
        for i in yep:
            queryNameObject=cmds.text("TitleText",e=True,l=str(i)+" Size")
            List =cmds.listRelatives(i,f=True)
            transforms1 = cmds.listRelatives(i,typ="mesh")
            for j in List:
                if j.find('MesuresGRP_') != -1 or j.find('_BoundingBox') != -1:
                    sizeX=cmds.getAttr("Distance_X_"+str(transforms1[0])+".distance")
                    sizeY=cmds.getAttr("Distance_Y_"+str(transforms1[0])+".distance")
                    sizeZ=cmds.getAttr("Distance_Z_"+str(transforms1[0])+".distance")
                    round(sizeX,3),round(sizeY,3),round(sizeZ,3)  
                    sizeX,sizeY,sizeZ=round(sizeX,3),round(sizeY,3),round(sizeZ,3)
                    cmds.textField("sizeXTextField",e=True,tx=sizeX)
                    cmds.textField("sizeYTextField",e=True,tx=sizeY)
                    cmds.textField("sizeZTextField",e=True,tx=sizeZ)
                    cmds.textField("NewSizeX",e=True,tx=sizeX)
                    cmds.textField("NewSizeY",e=True,tx=sizeY)
                    cmds.textField("NewSizeZ",e=True,tx=sizeZ)                    
                else:
                    cmds.textField("sizeXTextField",e=True,tx=0)
                    cmds.textField("sizeYTextField",e=True,tx=0)
                    cmds.textField("sizeZTextField",e=True,tx=0)
                    cmds.textField("NewSizeX",e=True,tx=0)
                    cmds.textField("NewSizeY",e=True,tx=0)
                    cmds.textField("NewSizeZ",e=True,tx=0)  
    except:
        pass      
def QueryUnit():
    axes=("X","Y","Z")
    Unit=cmds.currentUnit( query=True, linear=True )
    for i in axes:
        cmds.text("Unit"+str(i),e=True,l=Unit)
        cmds.text("Unit"+str(i)+"2",e=True,l=Unit)
    return Unit
def QueryUpAxis():
    UpAxis=cmds.upAxis( q=True, axis=True )
    return UpAxis
def GetBoudingBoxInfo(selected):
    bbox = cmds.exactWorldBoundingBox(selected ,ce=True,ii=True)
    return bbox
def SizeObject(selected):
    infos=GetBoudingBoxInfo(selected)
    sizeX=infos[3]-infos[0]
    sizeY=infos[4]-infos[1]
    sizeZ=infos[5]-infos[2]
    return round(sizeX,3),round(sizeY,3),round(sizeZ,3)
def homothetieCheck(info,*args):
    listTextField=["NewSizeX","NewSizeY","NewSizeZ"]
    QueryHomothetie=cmds.checkBox("Homothetie",q=True,v=True)
    listTextField.remove(info)
def RoutineResizeObject(NewSize,*args):
    HomthetySize=0
    NewSizeX=cmds.textField("NewSizeX",q=True,tx=True)
    NewSizeY=cmds.textField("NewSizeY",q=True,tx=True)
    NewSizeZ=cmds.textField("NewSizeZ",q=True,tx=True)
    if NewSize=="NewSizeX":
        HomthetySize=NewSizeX
    if NewSize=="NewSizeY":
        HomthetySize=NewSizeY
    if NewSize=="NewSizeZ":
        HomthetySize=NewSizeZ
    selected=cmds.ls(sl=True,fl=True)
    try:
        for Sel in selected:
            List =cmds.listRelatives(Sel,f=True)
            transforms = cmds.listRelatives(Sel,typ="mesh")
            print transforms
            sizeX=cmds.getAttr("Distance_X_"+str(transforms[0])+".distance")
            sizeY=cmds.getAttr("Distance_Y_"+str(transforms[0])+".distance")
            sizeZ=cmds.getAttr("Distance_Z_"+str(transforms[0])+".distance")
            for j in List:
                if j.find('MesuresGRP_') != -1:
                    cmds.delete(j)
            resizeObject(Sel,sizeX,sizeY,sizeZ,NewSizeX,NewSizeY,NewSizeZ,NewSize,HomthetySize)    
    except:
        pass  
    cmds.select(selected)
    RoutineGetObjectSize()
def resizeObject(object,sizeX,sizeY,sizeZ,NewSizeX,NewSizeY,NewSizeZ,NewSize,HomthetySize):
    ListResults=[]
    QueryHomothetie=cmds.checkBox("Homothetie",q=True,v=True)
    Valide=False
    print sizeX,sizeY,sizeZ
    if NewSize=="NewSizeX":
        NewSizeX=HomthetySize
    else:
        NewSizeX=sizeX
    if NewSize=="NewSizeY":
        NewSizeY=HomthetySize
    else:
        NewSizeY=sizeY
    if NewSize=="NewSizeZ":
        NewSizeZ=HomthetySize
    else:
        NewSizeZ=sizeZ
    if NewSizeX =="1.0":
        resultX=1.0
        ListResults.append(resultX)
    else:
        resultX=(float(NewSizeX) / float(sizeX))
        ListResults.append(resultX)  
    if NewSizeY =="1.0":
        resultY=1.0
        ListResults.append(resultY)
    else:
        resultY=(float(NewSizeY) / float(sizeY))
        ListResults.append(resultY)
    if NewSizeZ =="1.0":
        resultZ=1.0
        ListResults.append(resultZ)
    else:
        resultZ=(float(NewSizeZ) / float(sizeZ))
        ListResults.append(resultZ)  
    CounterList=Counter(ListResults)
    if QueryHomothetie==True:  
        MultiplyResult=resultX*resultY*resultZ
        cmds.scale(MultiplyResult,MultiplyResult,MultiplyResult,object,r=True)
    else:    
        cmds.scale(resultX,resultY,resultZ,object,r=True)
def SetInfoBoungingBox(selected):
    sizeX,sizeY,sizeZ=SizeObject(selected)
    cmds.textField("sizeXTextField",e=True,tx=sizeX)
    cmds.textField("sizeYTextField",e=True,tx=sizeY)
    cmds.textField("sizeZTextField",e=True,tx=sizeZ)
def SetInfoBoungingBoxNewSize(selected):
    sizeX,sizeY,sizeZ=SizeObject(selected)
    cmds.textField("NewSizeX",e=True,tx=sizeX)
    cmds.textField("NewSizeY",e=True,tx=sizeY)
    cmds.textField("NewSizeZ",e=True,tx=sizeZ)
def DistanceDimension(ObjectSelect):
    ObjectSelected=ObjectSelect
    Bbox=cmds.geomToBBox(name=ObjectSelect, nameSuffix='_BoundingBox', shaderColor=[0,1,0.043],ko=True)
    cmds.setAttr(str(Bbox[0])+".template",1)
    infos=GetBoudingBoxInfo(ObjectSelect)
    print infos
    DistanceX=cmds.distanceDimension(startPoint=[infos[0], infos[1], infos[2]],endPoint=[infos[3], infos[1], infos[2]])
    Loc =cmds.listConnections(DistanceX)
    DistanceOrigine=cmds.rename(Loc[0],"Loc_Origine_"+str(ObjectSelect))
    cmds.setAttr(DistanceOrigine+".visibility",0)
    DistanceX=cmds.rename(Loc[1],"Loc_X_"+str(ObjectSelect))
    cmds.setAttr(DistanceX+".visibility",0)
    sel=cmds.ls(sl=True)
    LocX=cmds.rename(sel[1],"Distance_X_"+str(ObjectSelect))
    X_GRP=cmds.group(DistanceX,LocX,n="X_"+str(ObjectSelect))  
    DistanceY=cmds.distanceDimension(startPoint=[infos[0], infos[1], infos[2]],endPoint=[infos[0], infos[4], infos[2]])
    Loc =cmds.listConnections(DistanceY)
    DistanceOrigine=cmds.rename(Loc[0],"Loc_Origine_"+str(ObjectSelect))
    DistanceY=cmds.rename(Loc[1],"Loc_Y_"+str(ObjectSelect))
    cmds.setAttr(DistanceY+".visibility",0)    
    sel=cmds.ls(sl=True)
    LocY=cmds.rename(sel[1],"Distance_Y_"+str(ObjectSelect))
    Y_GRP=cmds.group(DistanceY,LocY,n="Y_"+str(ObjectSelect))
    DistanceZ=cmds.distanceDimension(startPoint=[infos[0], infos[1], infos[2]],endPoint=[infos[0], infos[1], infos[5]])
    Loc = cmds.listConnections(DistanceZ)
    DistanceOrigine=cmds.rename(Loc[0],"Loc_Origine_"+str(ObjectSelect))
    DistanceZ=cmds.rename(Loc[1],"Loc_Z_"+str(ObjectSelect))
    cmds.setAttr(DistanceZ+".visibility",0)      
    sel=cmds.ls(sl=True)
    LocZ=cmds.rename(sel[1],"Distance_Z_"+str(ObjectSelect))  
    Z_GRP=cmds.group(DistanceZ,LocZ,n="Z_"+str(ObjectSelect))
    cmds.parent((DistanceOrigine,X_GRP,Y_GRP,Z_GRP,Bbox[0]),ObjectSelect)
    Mesures_GRP=cmds.group(DistanceOrigine,X_GRP,Y_GRP,Z_GRP,n="MesuresGRP_"+str(ObjectSelect))
def RoutineGetObjectSize():
    ObjectSelect=cmds.ls(sl=True,fl=True)
    print ObjectSelect
    transforms = cmds.listRelatives(ObjectSelect,typ="mesh")
    yep=cmds.listRelatives(transforms, p=True,pa=True)
    try:
        for i in yep:
            queryNameObject=cmds.text("TitleText",e=True,l=str(i)+" Size")
            List =cmds.listRelatives(i,f=True)
            for j in List:
                if j.find('MesuresGRP_') != -1 or j.find('_BoundingBox') != -1:
                    cmds.delete(j)
                else:
                    pass
            cmds.select(i)      
            SetInfoBoungingBox(i)
            SetInfoBoungingBoxNewSize(i)
            DistanceDimension(i)  
        cmds.select(ObjectSelect)
    except:
        pass
def ShowHideMesure():
    ObjectSelect=cmds.ls(sl=True,fl=True)
    try:
        for i in ObjectSelect:
            visibility=cmds.getAttr("MesuresGRP_"+str(i)+".visibility")
            if visibility==True:
                cmds.setAttr("MesuresGRP_"+str(i)+".visibility",0)
            if visibility==False:
                cmds.setAttr("MesuresGRP_"+str(i)+".visibility",1)  
    except:
        pass      
def ShowHideBbox():
    ObjectSelect=cmds.ls(sl=True,fl=True)
    try:
        for i in ObjectSelect:
            visibility=cmds.getAttr(str(i)+"_BoundingBox.visibility")
            if visibility==True:
                cmds.setAttr(str(i)+"_BoundingBox.visibility",0)
            if visibility==False:
                cmds.setAttr(str(i)+"_BoundingBox.visibility",1)        
    except:
        pass
def clearMesh():
    ObjectSelect=cmds.ls(sl=True,fl=True)
    print ObjectSelect
    try:
        for i in ObjectSelect:
            List =cmds.listRelatives(i,f=True)
            for j in List:
                if j.find('MesuresGRP_') != -1 or j.find('_BoundingBox') != -1:
                    cmds.delete(j)
                else:
                    pass        
    except:
        pass
def MovePivot(Vector,*args):
    ObjectSelect=cmds.ls(sl=True,fl=True)
    for Object in ObjectSelect:        
        clearMesh()
        infos=GetBoudingBoxInfo(Object)
        Xmin=infos[0]
        Xmidd=infos[3]-((infos[3]-infos[0])/2)
        Xmax=infos[3]
        Ymin=infos[1]
        Ymidd=infos[4]-((infos[4]-infos[1])/2)
        Ymax=infos[4]
        Zmin=infos[2]
        Zmidd=infos[5]-((infos[5]-infos[2])/2)
        Zmax=infos[5]
        if Vector == "Xmin":  
            cmds.move(Xmin,str(Object)+".scalePivot", str(Object)+".rotatePivot", a=True, x=True)
        if Vector == "Xmidd":
            cmds.move(Xmidd,str(Object)+".scalePivot", str(Object)+".rotatePivot", a=True, x=True)
        if Vector == "Xmax":
            cmds.move(Xmax,str(Object)+".scalePivot", str(Object)+".rotatePivot", a=True, x=True)
        if Vector == "Ymin":
            cmds.move(Ymin,str(Object)+".scalePivot", str(Object)+".rotatePivot", a=True, y=True)  
        if Vector == "Ymidd":
            cmds.move(Ymidd,str(Object)+".scalePivot", str(Object)+".rotatePivot", a=True, y=True)      
        if Vector == "Ymax":
            cmds.move(Ymax,str(Object)+".scalePivot", str(Object)+".rotatePivot", a=True, y=True)
        if Vector == "Zmin":    
            cmds.move(Zmin,str(Object)+".scalePivot", str(Object)+".rotatePivot", a=True, z=True)
        if Vector == "Zmidd":    
            cmds.move(Zmidd,str(Object)+".scalePivot", str(Object)+".rotatePivot", a=True, z=True)
        if Vector == "Zmax":    
            cmds.move(Zmax,str(Object)+".scalePivot", str(Object)+".rotatePivot", a=True, z=True)
    cmds.select(ObjectSelect)                    
    RoutineGetObjectSize()
def CloseWindow():
    cmds.deleteUI('ResizeObject',window=True )  
def UI():
    if (cmds.window('ResizeObject', exists=True)):
        print "window already open!!"
        cmds.deleteUI('ResizeObject')
    win= cmds.window("ResizeObject",title="Mesh Resizer",cc="KillJob()",s=False, mnb=True,mxb=False, rtf = True, w=500)
    cmds.columnLayout(adj=True)
    cmds.text("TitleText",l="Mesh Resizer",h=25, fn = "boldLabelFont")
    cmds.rowColumnLayout(numberOfColumns=3,columnWidth=[(1, 133), (2, 133), (3, 133)])
    cmds.text(l="Size X",h=25, fn = "boldLabelFont")
    cmds.text(l="Size Y",h=25, fn = "boldLabelFont")
    cmds.text(l="Size Z",h=25, fn = "boldLabelFont")
    cmds.setParent('..')
    cmds.rowColumnLayout(numberOfColumns=6,columnWidth=[(1, 100), (2, 33), (3, 100),(4, 33), (5, 100), (6, 33)])
    cmds.textField("sizeXTextField",ed=False,bgc=(0.2,0.2,0.2))
    cmds.text("UnitX2")
    cmds.textField("sizeYTextField",ed=False,bgc=(0.2,0.2,0.2))
    cmds.text("UnitY2")
    cmds.textField("sizeZTextField",ed=False,bgc=(0.2,0.2,0.2))
    cmds.text("UnitZ2")
    cmds.setParent('..')
    cmds.separator(style='in' )
    cmds.button(l="Get Object Size" ,c="RoutineGetObjectSize()",h=40)
    cmds.separator(style='in' )
    cmds.rowColumnLayout(numberOfColumns=2,columnWidth=[(1,200), (2,200)])
    cmds.button(l="show/Hide Mesures" ,c="ShowHideMesure()",h=40)
    cmds.button(l="show/Hide Bounding Box" ,c="ShowHideBbox()",h=40)
    cmds.setParent('..')
    cmds.separator(style='in' )
    cmds.button(l="Clear Mesh" ,c="clearMesh()")
    cmds.separator(style='in' )
#-----------------------------------------------------------------------------------------------------------------------
    cmds.frameLayout(l="Move Pivot",cll=False,bgc=(0.15,0.15,0.15),li=160)
    cmds.rowColumnLayout(numberOfColumns=3,columnWidth=[(1, 133), (2,133 ), (3, 133)])
    ButtonH=40
    cmds.button(l="X min" ,bgc=(0.5,0.0,0.0),c=partial(MovePivot,'Xmin'),h=ButtonH)
    cmds.button(l="X midd" ,bgc=(0.5,0.0,0.0),c=partial(MovePivot,'Xmidd'),h=ButtonH)
    cmds.button(l="X max" ,bgc=(0.5,0.0,0.0),c=partial(MovePivot,'Xmax'),h=ButtonH)
    cmds.button(l="Y min" ,bgc=(0.0,0.5,0.0),c=partial(MovePivot,'Ymin'),h=ButtonH)
    cmds.button(l="Y midd" ,bgc=(0.0,0.5,0.0),c=partial(MovePivot,'Ymidd'),h=ButtonH)
    cmds.button(l="Y max" ,bgc=(0.0,0.5,0.0),c=partial(MovePivot,'Ymax'),h=ButtonH)
    cmds.button(l="Z min" ,bgc=(0.0,0.0,0.5),c=partial(MovePivot,'Zmin'),h=ButtonH)
    cmds.button(l="Z midd" ,bgc=(0.0,0.0,0.5),c=partial(MovePivot,'Zmidd'),h=ButtonH)
    cmds.button(l="Z max" ,bgc=(0.0,0.0,0.5),c=partial(MovePivot,'Zmax'),h=ButtonH)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.separator(style='in' )
#-----------------------------------------------------------------------------------------------------------------------
    cmds.frameLayout(l="Resize Objects",cll=False,bgc=(0.15,0.15,0.15),li=160)
    cmds.rowColumnLayout(numberOfColumns=3,columnWidth=[(1, 133), (2, 133), (3, 133)])
    cmds.text(l="New Size X",h=25, fn = "boldLabelFont")
    cmds.text(l="New Size Y",h=25, fn = "boldLabelFont")
    cmds.text(l="New Size Z",h=25, fn = "boldLabelFont")
    cmds.setParent('..')
    cmds.rowColumnLayout(numberOfColumns=6,columnWidth=[(1, 100), (2, 33), (3, 100),(4, 33), (5, 100), (6, 33)])
    cmds.textField("NewSizeX",cc=partial(RoutineResizeObject,'NewSizeX'))
    cmds.text("UnitX")
    cmds.textField("NewSizeY",cc=partial(RoutineResizeObject,'NewSizeY'))
    cmds.text("UnitY")
    cmds.textField("NewSizeZ",cc=partial(RoutineResizeObject,'NewSizeZ'))
    cmds.text("UnitZ")
    cmds.setParent('..')
    cmds.checkBox("Homothetie",l="homothety",onc="CheckBoxHomothetie()")
    cmds.setParent('..')
#-----------------------------------------------------------------------------------------------------------------------
    cmds.separator(style='in' )
    cmds.button(l="close",c="CloseWindow()",h=40)
    cmds.setParent('..')
    cmds.showWindow(win)
    cmds.window("ResizeObject",edit = True, wh = (400,485))
UI()
QueryUnit()

image.gif

代码来源:

卢伟国的个人网站 | Mesh Resizer

相关文章
|
JSON 算法 API
深度分析小红书城API接口,用Python脚本实现
小红书作为以UGC内容为核心的生活方式平台,其非官方API主要通过移动端抓包解析获得,涵盖内容推荐、搜索、笔记详情、用户信息和互动操作等功能。本文分析了其接口体系、认证机制及请求规范,并提供基于Python的调用框架,涉及签名生成、登录态管理与数据解析。需注意非官方接口存在稳定性与合规风险,使用时应遵守平台协议及法律法规。
|
JSON API 数据安全/隐私保护
【干货满满】分享微店API接口到手价,用python脚本实现
微店作为知名社交电商平台,其开放平台提供商品查询、订单管理等API接口。本文介绍如何通过微店API获取商品到手价(含优惠、券等),涵盖认证机制、Python实现及关键说明。
|
JSON API 数据安全/隐私保护
【干货满满】分享淘宝API接口到手价,用python脚本实现
淘宝开放平台通过API可获取商品到手价,结合商品详情与联盟接口实现优惠计算。需使用AppKey、AppSecret及会话密钥认证,调用taobao.tbk.item.info.get接口获取最终价格。代码示例展示签名生成与数据解析流程。
|
JSON API 数据格式
深度分析大麦网API接口,用Python脚本实现
大麦网为国内领先演出票务平台,提供演唱会、话剧、体育赛事等票务服务。本文基于抓包分析其非官方接口,并提供Python调用方案,涵盖演出列表查询、详情获取及城市列表获取。需注意非官方接口存在稳定性风险,使用时应遵守平台规则,控制请求频率,防范封禁与法律风险。适用于个人学习、演出信息监控等场景。
|
JSON API 开发者
深度分析阿里妈妈API接口,用Python脚本实现
阿里妈妈是阿里巴巴旗下营销平台,提供淘宝联盟、直通车等服务,支持推广位管理、商品查询等API功能。本文详解其API调用方法,重点实现商品推广信息(佣金、优惠券)获取,并提供Python实现方案。
|
JSON API 数据安全/隐私保护
深度分析虾皮城API接口,用Python脚本实现
虾皮开放平台提供丰富的API接口,支持商品管理、订单处理及促销信息查询等功能。本文详解API认证机制与调用方法,基于Python实现商品价格及到手价获取方案,适用于电商数据分析与运营。
|
JSON API 数据安全/隐私保护
【干货满满】分享拼多多API接口到手价,用python脚本实现
拼多多开放平台提供商品价格查询API,通过“pdd.ddk.goods.detail”接口可获取商品基础价、优惠券、拼团价等信息。结合client_id、client_secret及签名机制实现身份认证,支持推广位ID获取专属优惠。本文提供完整Python实现,涵盖签名生成、接口调用与价格解析逻辑,适用于比价工具、导购平台等场景。
|
API 数据安全/隐私保护 开发者
深度分析苏宁API接口,用Python脚本实现
深度分析苏宁API接口,用Python脚本实现
|
前端开发 Shell API
深度分析58同城API接口,用Python脚本实现
58同城为国内知名分类信息平台,涵盖房产、招聘、二手车等多领域。本文基于网页抓包与解析,分享其非官方接口的Python实现方案,分析核心接口特性与反爬应对策略,适用于数据学习与信息聚合。注意:非官方接口存在风险,使用需遵守平台规则。
|
JSON API 数据安全/隐私保护
【干货满满】分享京东API接口到手价,用python脚本实现
淘宝开放平台提供丰富API,通过商品详情接口与淘宝联盟接口,可获取含优惠券、满减后的商品到手价。本文介绍基于Python的实现方案,涵盖签名生成、接口调用、价格解析及错误处理,适用于比价工具、导购平台等场景。

推荐镜像

更多