Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # bSearch v2.2 util
- # 2-16-2017
- from pymel.core import *
- import random as r
- import maya.api.OpenMaya as om
- import maya.cmds as mc
- import math
- class defAttr:
- dCheck = 0
- subMaxCount = 0
- saveAll = []
- toParent = []
- showObjs = []
- currentSet = []
- lastSet = []
- setSave = []
- searchList = []
- srt = math.sqrt
- """
- class searchObj():
- def __init__(self,obj):
- self.sPos = obj.getTranslation()
- self.isFound = 0
- self.sObj = []
- """
- def getDist(p1,p2):
- dist = defAttr.srt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2)
- return dist
- def grprO(name):
- g = ls(name)
- if g:
- delete(g)
- g = group(n=name,em=1)
- return g
- class subBB:
- def __init__(self,bbb):
- self.bb = bbb
- self.bbChildren = []
- self.bbCenter = (bbb[0]+bbb[3])/2, (bbb[1]+bbb[4])/2, (bbb[2]+bbb[5])/2
- self.bbObj = []
- self.bbActive = 0
- self.bbIsInObjs = []
- self.bbSearchObjs = []
- self.pap = []
- def doSubBB(self):#xmin0 ymin1 zmin2 xmax3 ymax4 zmax5
- bb = self.bb
- newBb1 = subBB([bb[0], bb[1], bb[2], (bb[3]+bb[0])/2, (bb[4]+bb[1])/2, (bb[5]+bb[2])/2])
- newBb2 = subBB([(bb[0]+bb[3])/2, bb[1], bb[2], bb[3], (bb[4]+bb[1])/2, (bb[5]+bb[2])/2])
- newBb3 = subBB([(bb[0]+bb[3])/2, bb[1], (bb[2]+bb[5])/2, bb[3], (bb[4]+bb[1])/2, bb[5]])
- newBb4 = subBB([bb[0], bb[1], (bb[2]+bb[5])/2, (bb[3]+bb[0])/2, (bb[4]+bb[1])/2, bb[5]])
- newBbUp1 = subBB([bb[0], (bb[1]+bb[4])/2, bb[2], (bb[3]+bb[0])/2, bb[4], (bb[5]+bb[2])/2])
- newBbUp2 = subBB([(bb[0]+bb[3])/2, (bb[1]+bb[4])/2, bb[2], bb[3], bb[4], (bb[5]+bb[2])/2])
- newBbUp3 = subBB([(bb[0]+bb[3])/2, (bb[1]+bb[4])/2, (bb[2]+bb[5])/2, bb[3], bb[4], bb[5]])
- newBbUp4 = subBB([bb[0], (bb[1]+bb[4])/2, (bb[2]+bb[5])/2, (bb[3]+bb[0])/2, bb[4], bb[5]])
- newBBList = [newBb1,newBb2,newBb3,newBb4,newBbUp1,newBbUp2,newBbUp3,newBbUp4]
- addList = []
- for new in newBBList:
- new.bbSearchObjs = self.bbSearchObjs
- new.isIn()
- if new.bbActive:
- addList.append(new)
- defAttr.saveAll.append(new)
- self.bbChildren = addList
- def doGrow(self):
- newBB = self.bb
- i = 0
- c = polyCube(w=0,h=0,d=0, n = "showCube_"+str(i))
- mc.move(newBB[0]+.5,0,0, str(c[0])+".f[5]", r=1,wd=1,ws=1)
- mc.move(0,newBB[1]+.5,0, str(c[0])+".f[3]", r=1,wd=1,ws=1)
- mc.move(0,0,newBB[2]+.5, str(c[0])+".f[2]", r=1,wd=1,ws=1)
- mc.move(newBB[3]-.5,0,0, str(c[0])+".f[4]", r=1,wd=1,ws=1)
- mc.move(0,newBB[4]-.5,0, str(c[0])+".f[1]", r=1,wd=1,ws=1)
- mc.move(0,0,newBB[5]-.5, str(c[0])+".f[0]", r=1,wd=1,ws=1)
- defAttr.showObjs.append(c[0])
- self.bbObj = [c]
- i += 1
- def isIn(self):#(bb,obj):#xmin ymin zmin xmax ymax zmax.
- isInList = []
- bb = self.bb
- for o in self.bbSearchObjs:
- if not o.isFound:
- add = 0
- objPos = o.sPos
- if objPos[0] <= bb[0] or objPos[0] >= bb[3] or objPos[1] <= bb[1] or objPos[1] >= bb[4] or objPos[2] <= bb[2] or objPos[2] >= bb[5]:
- add = 0
- else:
- add=1
- if add:
- self.bbIsInObjs.append(o)
- if len(self.bbSearchObjs) <= defAttr.subMaxCount:
- self.bbActive = 0
- else:
- self.bbActive = 1
- isInList.append(o)
- self.bbSearchObjs = isInList
- def constructTree(BoundingBox, thingList, subDepth, subMaxCount ,showGrowO, doRefresh):
- defAttr.showObjs = []
- defAttr.subMaxCount = subMaxCount
- #defAttr.dCheck = dCheck
- subGrpr = grprO("subGrprO")
- bbb = BoundingBox
- scSet = subBB(bbb)
- scSet.bbSearchObjs = thingList
- defAttr.currentSet = [scSet]
- defAttr.saveAll = [scSet]
- #progWin = progressWindow(isInterruptable=1, t= "Building ocTree...", min = 0, max = subDepth+1)
- ii = 0
- for i in range(0,subDepth+1):
- #print "Subdepth level: ", i
- """
- progressWindow(progWin, edit=True, pr = i)
- """
- toSelect = []
- defAttr.lastSet = []
- if not defAttr.currentSet:
- #print "Max subcount reached"
- break
- for cSet in defAttr.currentSet:# list of bounding boxs
- """
- if progressWindow(progWin, query=1, isCancelled=1 ):
- print "killed at", i+1
- break
- """
- cSet.doSubBB()
- defAttr.setSave.append(cSet.bbChildren)
- defAttr.lastSet.append(cSet)
- if showGrowO:
- cSet.doGrow()
- toSelect.append(cSet.bbObj[0])
- select(cl=1)
- if doRefresh:
- refresh(cw=1)
- listSaveFormat = []
- for ss in defAttr.setSave:
- for sss in ss:
- listSaveFormat.append(sss)
- for cc in defAttr.searchList:
- cc.isFound = 0
- defAttr.currentSet = listSaveFormat
- defAttr.setSave = []
- tempLast = defAttr.lastSet
- ii += 1
- #if defAttr.showObjs:
- #print defAttr.showObjs
- parent(defAttr.showObjs, subGrpr)
- #progressWindow(progWin, endProgress=1)
- select(cl=1)
- def isInSimple(finder,pp):#(bb,obj):#xmin ymin zmin xmax ymax zmax.
- add = 0
- bb = finder.bb
- objPos = pp
- isIn = []
- if objPos[0] <= bb[0] or objPos[0] >= bb[3]:
- add = 0
- elif objPos[1] <= bb[1] or objPos[1] >= bb[4]:
- add = 0
- elif objPos[2] <= bb[2] or objPos[2] >= bb[5]:
- add = 0
- else:
- add=1
- if add:
- isIn.append(finder)
- finder.bbActive = 1
- else:
- finder.bbActive = 0
- def isInSimpleY(finder,pp):#(bb,obj):#xmin ymin zmin xmax ymax zmax.
- add = 0
- bb = finder.bb
- objPos = pp
- isIn = []
- if objPos[0] <= bb[0] or objPos[0] >= bb[3]:
- add = 0
- elif objPos[2] <= bb[2] or objPos[2] >= bb[5]:
- add = 0
- else:
- add=1
- if add:
- isIn.append(finder)
- finder.bbActive = 1
- else:
- finder.bbActive = 0
- def getClose(closeToPos, distCheck, accuracy):
- finder = defAttr.saveAll[0]
- p2 = closeToPos#.sPos
- p2R = distCheck
- #select(cl=1)
- toSl = []
- checkList = finder.bbChildren
- found = 0
- catcher = 0
- foundSet = []
- while checkList:
- if catcher > 10:
- print "Brocken"
- break
- currentSet = []
- for c in checkList:
- newDir = (om.MVector(p2) - om.MVector(c.bbCenter)*.5) - om.MVector(c.bbCenter)*.5
- pX = om.MVector(p2) - om.MVector.normalize(newDir)*p2R
- isInSimple(c, pX)
- if c.bbActive:#
- if c.bbChildren:
- for c in c.bbChildren:
- currentSet.append(c)
- else:
- foundSet.append(c)
- else:
- dist = getDist(p2, c.bbCenter)
- if dist <= distCheck:
- if c.bbChildren:
- for c in c.bbChildren:
- currentSet.append(c)
- else:
- foundSet.append(c)
- checkList = currentSet
- catcher += 1
- toSObjs = []
- for c in foundSet:
- for c in c.bbIsInObjs:
- if accuracy:
- dist = getDist(closeToPos, c.sPos)
- if dist <= distCheck:
- toSObjs.append(c)
- else:
- toSObjs.append(c)
- return toSObjs
- """
- import maya.api.OpenMaya as om
- import bTree_util2
- reload(bTree_util2)
- import time
- start = time.clock()
- class thing():
- def __init__(self, obj):
- self.sPos = obj.getTranslation()
- self.isFound = 0
- self.sObj = obj
- leafGrp = ls("popGrp")[0]
- slList = leafGrp.listRelatives(c=1)
- thingList = []
- for s in slList:
- sepObj = thing(s)
- thingList.append(sepObj)
- #### ocTree
- boundingBox = xform(leafGrp, bbi=1, q=1)
- leaves = thingList
- subDepth = 20
- subMaxCount = 200
- oShowGrow = 1
- doRefresh = 1
- bTree_util2.constructTree(boundingBox, leaves, subDepth, subMaxCount, oShowGrow, doRefresh)
- print "Construct Tree ", time.clock() - start
- startC = time.clock()
- closeToObj = ls("pCube1")[0].getTranslation()
- distCheck = 5
- accuracy = 1 # if true will return only objects within distCheck, else will return objects in Octree box
- closeList = bTree_util2.getClose(closeToObj, distCheck, accuracy)
- toSl = []
- doAppend = toSl.append
- for c in closeList:
- doAppend(c.sObj)
- select(toSl)
- elapsed2 = (time.clock() - startC)
- print "\n","Run time total:", elapsed2
- """
Advertisement
Add Comment
Please, Sign In to add comment