cwisbg

bTree_util2

Nov 6th, 2018
655
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.02 KB | None | 0 0
  1. # bSearch v2.2 util
  2. # 2-16-2017
  3. from pymel.core import *
  4. import random as r
  5. import maya.api.OpenMaya as om
  6. import maya.cmds as mc
  7. import math
  8. class defAttr:
  9. dCheck = 0
  10. subMaxCount = 0
  11. saveAll = []
  12. toParent = []
  13. showObjs = []
  14. currentSet = []
  15. lastSet = []
  16. setSave = []
  17. searchList = []
  18. srt = math.sqrt
  19. """
  20. class searchObj():
  21. def __init__(self,obj):
  22. self.sPos = obj.getTranslation()
  23. self.isFound = 0
  24. self.sObj = []
  25. """
  26. def getDist(p1,p2):
  27. dist = defAttr.srt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2)
  28. return dist
  29. def grprO(name):
  30. g = ls(name)
  31. if g:
  32. delete(g)
  33. g = group(n=name,em=1)
  34. return g
  35. class subBB:
  36. def __init__(self,bbb):
  37. self.bb = bbb
  38. self.bbChildren = []
  39. self.bbCenter = (bbb[0]+bbb[3])/2, (bbb[1]+bbb[4])/2, (bbb[2]+bbb[5])/2
  40. self.bbObj = []
  41. self.bbActive = 0
  42. self.bbIsInObjs = []
  43. self.bbSearchObjs = []
  44. self.pap = []
  45. def doSubBB(self):#xmin0 ymin1 zmin2 xmax3 ymax4 zmax5
  46. bb = self.bb
  47. newBb1 = subBB([bb[0], bb[1], bb[2], (bb[3]+bb[0])/2, (bb[4]+bb[1])/2, (bb[5]+bb[2])/2])
  48. newBb2 = subBB([(bb[0]+bb[3])/2, bb[1], bb[2], bb[3], (bb[4]+bb[1])/2, (bb[5]+bb[2])/2])
  49. newBb3 = subBB([(bb[0]+bb[3])/2, bb[1], (bb[2]+bb[5])/2, bb[3], (bb[4]+bb[1])/2, bb[5]])
  50. newBb4 = subBB([bb[0], bb[1], (bb[2]+bb[5])/2, (bb[3]+bb[0])/2, (bb[4]+bb[1])/2, bb[5]])
  51. newBbUp1 = subBB([bb[0], (bb[1]+bb[4])/2, bb[2], (bb[3]+bb[0])/2, bb[4], (bb[5]+bb[2])/2])
  52. newBbUp2 = subBB([(bb[0]+bb[3])/2, (bb[1]+bb[4])/2, bb[2], bb[3], bb[4], (bb[5]+bb[2])/2])
  53. newBbUp3 = subBB([(bb[0]+bb[3])/2, (bb[1]+bb[4])/2, (bb[2]+bb[5])/2, bb[3], bb[4], bb[5]])
  54. newBbUp4 = subBB([bb[0], (bb[1]+bb[4])/2, (bb[2]+bb[5])/2, (bb[3]+bb[0])/2, bb[4], bb[5]])
  55. newBBList = [newBb1,newBb2,newBb3,newBb4,newBbUp1,newBbUp2,newBbUp3,newBbUp4]
  56. addList = []
  57. for new in newBBList:
  58. new.bbSearchObjs = self.bbSearchObjs
  59. new.isIn()
  60. if new.bbActive:
  61. addList.append(new)
  62. defAttr.saveAll.append(new)
  63. self.bbChildren = addList
  64. def doGrow(self):
  65. newBB = self.bb
  66. i = 0
  67. c = polyCube(w=0,h=0,d=0, n = "showCube_"+str(i))
  68. mc.move(newBB[0]+.5,0,0, str(c[0])+".f[5]", r=1,wd=1,ws=1)
  69. mc.move(0,newBB[1]+.5,0, str(c[0])+".f[3]", r=1,wd=1,ws=1)
  70. mc.move(0,0,newBB[2]+.5, str(c[0])+".f[2]", r=1,wd=1,ws=1)
  71. mc.move(newBB[3]-.5,0,0, str(c[0])+".f[4]", r=1,wd=1,ws=1)
  72. mc.move(0,newBB[4]-.5,0, str(c[0])+".f[1]", r=1,wd=1,ws=1)
  73. mc.move(0,0,newBB[5]-.5, str(c[0])+".f[0]", r=1,wd=1,ws=1)
  74. defAttr.showObjs.append(c[0])
  75. self.bbObj = [c]
  76. i += 1
  77. def isIn(self):#(bb,obj):#xmin ymin zmin xmax ymax zmax.
  78. isInList = []
  79. bb = self.bb
  80. for o in self.bbSearchObjs:
  81. if not o.isFound:
  82. add = 0
  83. objPos = o.sPos
  84. 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]:
  85.  
  86. add = 0
  87. else:
  88. add=1
  89. if add:
  90. self.bbIsInObjs.append(o)
  91. if len(self.bbSearchObjs) <= defAttr.subMaxCount:
  92. self.bbActive = 0
  93. else:
  94. self.bbActive = 1
  95. isInList.append(o)
  96. self.bbSearchObjs = isInList
  97. def constructTree(BoundingBox, thingList, subDepth, subMaxCount ,showGrowO, doRefresh):
  98. defAttr.showObjs = []
  99. defAttr.subMaxCount = subMaxCount
  100. #defAttr.dCheck = dCheck
  101. subGrpr = grprO("subGrprO")
  102. bbb = BoundingBox
  103. scSet = subBB(bbb)
  104. scSet.bbSearchObjs = thingList
  105. defAttr.currentSet = [scSet]
  106. defAttr.saveAll = [scSet]
  107. #progWin = progressWindow(isInterruptable=1, t= "Building ocTree...", min = 0, max = subDepth+1)
  108. ii = 0
  109. for i in range(0,subDepth+1):
  110. #print "Subdepth level: ", i
  111. """
  112. progressWindow(progWin, edit=True, pr = i)
  113. """
  114. toSelect = []
  115. defAttr.lastSet = []
  116. if not defAttr.currentSet:
  117. #print "Max subcount reached"
  118. break
  119. for cSet in defAttr.currentSet:# list of bounding boxs
  120. """
  121. if progressWindow(progWin, query=1, isCancelled=1 ):
  122. print "killed at", i+1
  123. break
  124. """
  125. cSet.doSubBB()
  126. defAttr.setSave.append(cSet.bbChildren)
  127. defAttr.lastSet.append(cSet)
  128. if showGrowO:
  129. cSet.doGrow()
  130. toSelect.append(cSet.bbObj[0])
  131. select(cl=1)
  132. if doRefresh:
  133. refresh(cw=1)
  134. listSaveFormat = []
  135. for ss in defAttr.setSave:
  136. for sss in ss:
  137. listSaveFormat.append(sss)
  138. for cc in defAttr.searchList:
  139. cc.isFound = 0
  140. defAttr.currentSet = listSaveFormat
  141. defAttr.setSave = []
  142. tempLast = defAttr.lastSet
  143. ii += 1
  144. #if defAttr.showObjs:
  145. #print defAttr.showObjs
  146. parent(defAttr.showObjs, subGrpr)
  147. #progressWindow(progWin, endProgress=1)
  148. select(cl=1)
  149. def isInSimple(finder,pp):#(bb,obj):#xmin ymin zmin xmax ymax zmax.
  150. add = 0
  151. bb = finder.bb
  152. objPos = pp
  153. isIn = []
  154. if objPos[0] <= bb[0] or objPos[0] >= bb[3]:
  155. add = 0
  156. elif objPos[1] <= bb[1] or objPos[1] >= bb[4]:
  157. add = 0
  158. elif objPos[2] <= bb[2] or objPos[2] >= bb[5]:
  159. add = 0
  160. else:
  161. add=1
  162.  
  163. if add:
  164. isIn.append(finder)
  165. finder.bbActive = 1
  166. else:
  167. finder.bbActive = 0
  168.  
  169. def isInSimpleY(finder,pp):#(bb,obj):#xmin ymin zmin xmax ymax zmax.
  170. add = 0
  171. bb = finder.bb
  172. objPos = pp
  173. isIn = []
  174. if objPos[0] <= bb[0] or objPos[0] >= bb[3]:
  175. add = 0
  176. elif objPos[2] <= bb[2] or objPos[2] >= bb[5]:
  177. add = 0
  178. else:
  179. add=1
  180.  
  181. if add:
  182. isIn.append(finder)
  183. finder.bbActive = 1
  184. else:
  185. finder.bbActive = 0
  186. def getClose(closeToPos, distCheck, accuracy):
  187. finder = defAttr.saveAll[0]
  188. p2 = closeToPos#.sPos
  189. p2R = distCheck
  190. #select(cl=1)
  191. toSl = []
  192. checkList = finder.bbChildren
  193. found = 0
  194. catcher = 0
  195. foundSet = []
  196. while checkList:
  197. if catcher > 10:
  198. print "Brocken"
  199. break
  200. currentSet = []
  201. for c in checkList:
  202. newDir = (om.MVector(p2) - om.MVector(c.bbCenter)*.5) - om.MVector(c.bbCenter)*.5
  203. pX = om.MVector(p2) - om.MVector.normalize(newDir)*p2R
  204. isInSimple(c, pX)
  205.  
  206. if c.bbActive:#
  207. if c.bbChildren:
  208. for c in c.bbChildren:
  209. currentSet.append(c)
  210. else:
  211. foundSet.append(c)
  212. else:
  213. dist = getDist(p2, c.bbCenter)
  214. if dist <= distCheck:
  215. if c.bbChildren:
  216. for c in c.bbChildren:
  217. currentSet.append(c)
  218. else:
  219. foundSet.append(c)
  220.  
  221. checkList = currentSet
  222. catcher += 1
  223. toSObjs = []
  224. for c in foundSet:
  225. for c in c.bbIsInObjs:
  226. if accuracy:
  227. dist = getDist(closeToPos, c.sPos)
  228. if dist <= distCheck:
  229. toSObjs.append(c)
  230. else:
  231. toSObjs.append(c)
  232.  
  233. return toSObjs
  234.  
  235.  
  236. """
  237. import maya.api.OpenMaya as om
  238. import bTree_util2
  239. reload(bTree_util2)
  240. import time
  241. start = time.clock()
  242.  
  243. class thing():
  244. def __init__(self, obj):
  245. self.sPos = obj.getTranslation()
  246. self.isFound = 0
  247. self.sObj = obj
  248.  
  249.  
  250. leafGrp = ls("popGrp")[0]
  251. slList = leafGrp.listRelatives(c=1)
  252. thingList = []
  253. for s in slList:
  254. sepObj = thing(s)
  255. thingList.append(sepObj)
  256.  
  257. #### ocTree
  258. boundingBox = xform(leafGrp, bbi=1, q=1)
  259. leaves = thingList
  260. subDepth = 20
  261. subMaxCount = 200
  262. oShowGrow = 1
  263. doRefresh = 1
  264.  
  265. bTree_util2.constructTree(boundingBox, leaves, subDepth, subMaxCount, oShowGrow, doRefresh)
  266. print "Construct Tree ", time.clock() - start
  267.  
  268.  
  269. startC = time.clock()
  270.  
  271. closeToObj = ls("pCube1")[0].getTranslation()
  272. distCheck = 5
  273. accuracy = 1 # if true will return only objects within distCheck, else will return objects in Octree box
  274.  
  275. closeList = bTree_util2.getClose(closeToObj, distCheck, accuracy)
  276.  
  277. toSl = []
  278. doAppend = toSl.append
  279. for c in closeList:
  280. doAppend(c.sObj)
  281. select(toSl)
  282. elapsed2 = (time.clock() - startC)
  283. print "\n","Run time total:", elapsed2
  284.  
  285.  
  286.  
  287.  
  288. """
Advertisement
Add Comment
Please, Sign In to add comment