cwisbg

bTree

Feb 13th, 2017
463
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.77 KB | None | 0 0
  1. # bSearch v1
  2. # some kind of ocTree thing for maya. Almost working, currently just subdivides space
  3. # 2-12-2017
  4.  
  5. from pymel.core import *
  6. import random as r
  7. import maya.api.OpenMaya as om
  8. import maya.cmds as mc
  9. import time
  10. start = time.clock()
  11. class defAttr:
  12.     subDepth = 2
  13.     subMaxCount = 20
  14.     dCheck = 20
  15.     showGrow = 1
  16.  
  17.     saveAll = []
  18.     toParent = []
  19.     showObjs = []
  20.     currentSet = []
  21.     lastSet = []
  22.     setSave = []  
  23.     searchList = []
  24. class searchObj():
  25.     def __init__(self,obj):
  26.         self.sPos = obj.getTranslation()
  27.         self.isFound = 0
  28.         self.sObj = []
  29. def getDist(p1,p2):
  30.     dist = math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2)
  31.     return dis      
  32. def grpr(name):
  33.     g = ls(name)
  34.     if g:
  35.         delete(g)
  36.     g = group(n=name,em=1)
  37.     return g
  38. class subBB:
  39.     def __init__(self,bbb):
  40.         self.bb = bbb
  41.         self.bbChildren = []
  42.         self.bbCenter = (bbb[0]+bbb[3])/2, (bbb[1]+bbb[4])/2, (bbb[2]+bbb[5])/2  
  43.         self.bbObj = []
  44.         self.bbActive = 0
  45.         self.bbIsInObjs = []
  46.         self.bbSearchObjs = []
  47.         self.pap = []
  48.     def doSubBB(self):#xmin0 ymin1 zmin2 xmax3 ymax4 zmax5
  49.         bb = self.bb
  50.         newBb1 = subBB([bb[0], bb[1], bb[2], (bb[3]+bb[0])/2, (bb[4]+bb[1])/2, (bb[5]+bb[2])/2])
  51.         newBb2 = subBB([(bb[0]+bb[3])/2, bb[1], bb[2], bb[3], (bb[4]+bb[1])/2, (bb[5]+bb[2])/2])  
  52.         newBb3 = subBB([(bb[0]+bb[3])/2, bb[1], (bb[2]+bb[5])/2, bb[3], (bb[4]+bb[1])/2, bb[5]])
  53.         newBb4 = subBB([bb[0], bb[1], (bb[2]+bb[5])/2, (bb[3]+bb[0])/2, (bb[4]+bb[1])/2, bb[5]])
  54.         newBbUp1 = subBB([bb[0], (bb[1]+bb[4])/2, bb[2], (bb[3]+bb[0])/2, bb[4], (bb[5]+bb[2])/2])
  55.         newBbUp2 = subBB([(bb[0]+bb[3])/2, (bb[1]+bb[4])/2, bb[2], bb[3], bb[4], (bb[5]+bb[2])/2])
  56.         newBbUp3 = subBB([(bb[0]+bb[3])/2, (bb[1]+bb[4])/2, (bb[2]+bb[5])/2, bb[3], bb[4], bb[5]])
  57.         newBbUp4 = subBB([bb[0], (bb[1]+bb[4])/2, (bb[2]+bb[5])/2, (bb[3]+bb[0])/2, bb[4], bb[5]])
  58.         newBBList = [newBb1,newBb2,newBb3,newBb4,newBbUp1,newBbUp2,newBbUp3,newBbUp4]
  59.         addList = []
  60.         for new in newBBList:
  61.             new.bbSearchObjs = self.bbSearchObjs
  62.             new.isIn()
  63.             if new.bbActive:
  64.                 addList.append(new)
  65.                 defAttr.saveAll.append(new)
  66.         self.bbChildren = addList
  67.        
  68.     def doGrow(self):
  69.         newBB = self.bb
  70.         i = 0
  71.         c = polyCube(w=0,h=0,d=0, n = "showCube_"+str(i))
  72.         mc.move(newBB[0]+.5,0,0, str(c[0])+".f[5]", r=1,wd=1,ws=1)
  73.         mc.move(0,newBB[1]+.5,0, str(c[0])+".f[3]", r=1,wd=1,ws=1)
  74.         mc.move(0,0,newBB[2]+.5, str(c[0])+".f[2]", r=1,wd=1,ws=1)
  75.         mc.move(newBB[3]-.5,0,0, str(c[0])+".f[4]",  r=1,wd=1,ws=1)
  76.         mc.move(0,newBB[4]-.5,0, str(c[0])+".f[1]",  r=1,wd=1,ws=1)
  77.         mc.move(0,0,newBB[5]-.5, str(c[0])+".f[0]",  r=1,wd=1,ws=1)
  78.         defAttr.showObjs.append(c[0])
  79.         self.bbObj = [c]
  80.         i += 1            
  81.     def isIn(self):#(bb,obj):#xmin ymin zmin xmax ymax zmax.
  82.         isInList = []
  83.         bb = self.bb
  84.         for o in self.bbSearchObjs:
  85.             if not o.isFound:
  86.                 add = 0
  87.                 objPos = o.sPos
  88.                 if objPos[0] <= bb[0] or objPos[0] >= bb[3]:
  89.                     add = 0
  90.                 elif objPos[1] <= bb[1] or objPos[1] >= bb[4]:
  91.                     add = 0    
  92.                 elif objPos[2] <= bb[2] or objPos[2] >= bb[5]:
  93.                     add = 0        
  94.                 else:
  95.                     add=1
  96.                 if add:
  97.                     self.bbIsInObjs.append(o)
  98.                     if len(self.bbSearchObjs) <= defAttr.subMaxCount:
  99.                         self.bbActive = 0
  100.                     else:
  101.                         self.bbActive = 1
  102.                     isInList.append(o)
  103.         self.bbSearchObjs = isInList
  104.  
  105. def isInSimple(finder,pp):#(bb,obj):#xmin ymin zmin xmax ymax zmax.
  106.     add = 0
  107.     bb = finder.bb
  108.     objPos = pp
  109.    
  110.     isIn = []
  111.     if objPos[0] <= bb[0] or objPos[0] >= bb[3]:
  112.         add = 0
  113.     elif objPos[1] <= bb[1] or objPos[1] >= bb[4]:
  114.         add = 0  
  115.     elif objPos[2] <= bb[2] or objPos[2] >= bb[5]:
  116.         add = 0      
  117.     else:
  118.         add=1
  119.        
  120.     if add:
  121.         isIn.append(finder)
  122.         finder.bbActive = 1
  123.     else:
  124.         finder.bbActive = 0
  125.  
  126. def getClose(closeToObj):
  127.    
  128.     finder = defAttr.saveAll[0]
  129.     p2 = om.MVector(closeToObj.getTranslation())
  130.     p2R = closeToObj.getScale()[0]
  131.     select(cl=1)
  132.     toSl = []
  133.     checkList = finder.bbChildren
  134.     for c in checkList:
  135.         isInSimple(c, p2)
  136.         if not c.bbActive:
  137.             newDir = (om.MVector(p2) + om.MVector(c.bbCenter)*.5) - om.MVector(c.bbCenter)
  138.             pX = om.MVector(p2) - om.MVector.normalize(newDir)*p2R
  139.             isInSimple(c, pX)
  140.             if c.bbActive:
  141.                 toSl.append(c.bbObj[0])
  142.         else:
  143.             toSl.append(c.bbObj[0])
  144.     return toSl
  145.  
  146. subGrpr = grpr("subGrpr")        
  147. #sl = selected()    
  148. leafGrp = ls("ThingGrp")[0]
  149. leafGrpC = leafGrp.listRelatives(c=1)
  150. newLeafGrpC = []
  151. for leaf in leafGrpC:
  152.     newL = searchObj(leaf)
  153.     newL.sObj = leaf
  154.     newLeafGrpC.append(newL)
  155.  
  156. bbb = xform(leafGrp, bbi=1, q=1)
  157. scSet = subBB(bbb)
  158. scSet.bbSearchObjs = newLeafGrpC
  159. defAttr.currentSet = [scSet]
  160. defAttr.saveAll = [scSet]
  161. progWin = progressWindow(isInterruptable=1, t= "Simulating...", min = 0, max = defAttr.subDepth+1)  
  162. ii = 0
  163. for i in range(0,defAttr.subDepth+1):
  164.     progressWindow(progWin, edit=True, pr = i)
  165.     toSelect = []
  166.     defAttr.lastSet = []
  167.     for cSet in defAttr.currentSet:# list of bounding boxs
  168.         if progressWindow(progWin, query=1, isCancelled=1 ):
  169.             print "killed at", i+1
  170.             break
  171.         cSet.doSubBB()
  172.         defAttr.setSave.append(cSet.bbChildren)
  173.         defAttr.lastSet.append(cSet)
  174.         if defAttr.showGrow:
  175.             cSet.doGrow()
  176.             toSelect.append(cSet.bbObj[0])
  177.             select(cl=1)
  178.             refresh(cw=1)
  179.     listSaveFormat = []
  180.     for ss in defAttr.setSave:
  181.         for sss in ss:
  182.             listSaveFormat.append(sss)
  183.     for cc in defAttr.searchList:
  184.         cc.isFound = 0
  185.     defAttr.currentSet = listSaveFormat
  186.     defAttr.setSave = []
  187.     tempLast = defAttr.lastSet
  188.     ii += 1
  189. parent(defAttr.showObjs, subGrpr)
  190. progressWindow(progWin, endProgress=1)
  191. select(cl=1)
  192.  
  193.  
  194. closeToObj = ls("close_obj")[0]
  195. closeList = getClose(closeToObj)
  196. #toS = []
  197. #print defAttr.saveAll[0].bbChildren[0].bbCenter
  198. print closeList
  199. select(closeList)
  200.  
  201.  
  202. """
  203. for o in defAttr.saveAll:
  204.    if o.bbChildren:
  205.        toS.append(o.bbChildren)
  206. select(toS)
  207. """
  208.  
  209. elapsed = (time.clock() - start)
  210. elapsed = elapsed
  211. print "\n","Run time total:", elapsed
Advertisement
Add Comment
Please, Sign In to add comment