import maya.cmds as cmds
import meshEdit
reload(meshEdit)
import AlembicTool
def getCmeraLimtObjects(camera,objects = None,distance = 10000,offset = 0):
if not objects:
objects = [i for i in cmds.ls(transforms = True,l = True) if not i in [ '|front', '|persp','|side', '|top']]
if not cmds.ls(camera,type = ['camera','stereoRigCamera']):
camera = cmds.listRelatives(camera,shapes = True)
if camera:
if cmds.ls(camera[0],type = ['camera','stereoRigCamera']):
camera = camera[0]
else:
raise Exception('%s is not a camera' % camera)
out = cmds.listRelatives(camera,parent = True,fullPath = True)
for i in out:
if i in objects:
objects.pop(objects.index(i))
cameraLimt = meshEdit.getCameraLimit(camera,distance,offset)
cmds.sets(cameraLimt,forceElement = 'initialShadingGroup')
cmds.polyNormal(cameraLimt,normalMode = 2,userNormalMode = 0,ch = False)
is_in_limt_objects = list()
for i in objects:
bbx_mesh = meshEdit.getBoundingBoxMesh(i)
cmds.sets(bbx_mesh,forceElement = 'initialShadingGroup')
cmds.polyNormal(bbx_mesh,normalMode = 2,userNormalMode = 0,ch = False)
cameraLimt_copy = cmds.duplicate(cameraLimt,rr = True)[0]
intersection = cmds.polyCBoolOp(bbx_mesh,cameraLimt_copy,op=3,ch = False)[0]
bbx = cmds.xform(intersection,q = True,ws = True,boundingBox = True)
if all([b==0 for b in bbx]):
pass
else:
is_in_limt_objects.append(i)
cmds.delete(intersection)
cmds.delete(cameraLimt)
return is_in_limt_objects
def getFloorReferences(isLoad = True):
reference_nodes = list()
for i in cmds.ls(type = 'reference'):
try:
if not cmds.referenceQuery(i,referenceNode = True,child = True):
if isLoad == None:
reference_nodes.append(i)
elif cmds.referenceQuery(i,isLoaded = isLoad):
reference_nodes.append(i)
except:
pass
return reference_nodes
def _getReferenceRoots(reference_nodes):
refernece_dict = dict()
for i in reference_nodes:
nodes = cmds.referenceQuery(i,nodes =True,dagPath = True)
if nodes:
refernece_dict[i] = AlembicTool.clearRoots(cmds.ls(nodes,transforms = True,l = True))
return refernece_dict
def getInCameraReferences(camera,frameRange = None,distance = 10000,offset = 0,unload = True):
if not frameRange:
frameRange = [cmds.currentTime(q=True),cmds.currentTime(q=True)+1]
references = _getReferenceRoots(getFloorReferences(isLoad = True))
in_nodes = list()
un_in_nodes = list()
for i in references:
un_in_nodes += references[i]
amount = int(frameRange[0])
cmds.progressWindow(title='edit',
progress=amount,
minValue = int(frameRange[0]),
maxValue = int(frameRange[1])+1,
isInterruptable=True )
for frame in xrange(int(frameRange[0]),int(frameRange[1]+1)):
if un_in_nodes:
if cmds.progressWindow( query=True, isCancelled=True ):
cmds.progressWindow(endProgress=1)
raise Exception('cycle stop')
return
cmds.currentTime(frame)
nodes = getCmeraLimtObjects(camera,objects = un_in_nodes,distance = distance,offset = offset)
un_in_nodes = [i for i in un_in_nodes if not i in nodes]
in_nodes += nodes
amount += 1
cmds.progressWindow(edit=True, progress=amount)
cmds.progressWindow(endProgress=1)
in_reference = list()
for i in references:
for node in references[i]:
if node in in_nodes:
in_reference.append(i)
break
if unload:
out_reference = [i for i in references.keys() if not i in in_reference]
for i in out_reference:
cmds.file(unloadReference = i)
return in_reference
cameraEdit_getCameraLimt
最新推荐文章于 2021-11-12 17:36:19 发布