cwisbg

SCA_v3

Jun 7th, 2018
439
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 41.21 KB | None | 0 0
  1. #gui
  2. # Maya Python SCA v2_02 10/26/2017
  3. # Maya Python SCA v2_03 4/6/2018 - Update: Added ability to use particles to generate structure
  4. print " SCA "
  5. class leafToCrv:
  6. leafToCrv = []
  7.  
  8.  
  9. from pymel.core import *
  10. import copy as c
  11. import pymel.core.datatypes as dt
  12. import maya.api.OpenMaya as om
  13. import maya.cmds as cmds
  14. import math
  15. import random as r
  16. import time
  17. import bTree_util2
  18. reload(bTree_util2)
  19.  
  20.  
  21. width = 0
  22. height = 0
  23. treeCenter = 0
  24. bLength = 0
  25. start = time.clock()
  26. def grpr(name):
  27. g = ls(name)
  28. if g:
  29. delete(g)
  30. g = group(n=name,em=1)
  31. return g
  32. def getDist(p1,p2):
  33. dist = defAttr.srt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2)
  34. return dist
  35. def getCenter(p1,p2, offset):
  36. return (p1 + -p1*offset) + p2*offset
  37.  
  38. def adder(testPF, t):
  39. return (testPF[0]+t[0] , testPF[1]+t[1] ,testPF[2]+t[2])
  40. def subber(testPF, t):
  41. return (testPF[0]-t[0] , testPF[1]-t[1] ,testPF[2]-t[2])
  42. def setMag(testP, amnt):
  43. return (testP[0]*amnt , testP[1]*amnt ,testP[2]*amnt) # scaler
  44. def getMag(testP):
  45. return math.sqrt(testP[0]**2 + testP[1]**2 + testP[2]**2) #magnitude
  46. def getMag2(testP):
  47. return defAttr.srt(testP[0]**2 + testP[1]**2 + testP[2]**2) #magnitude
  48. def makeNormal(vector, mag):
  49. return (vector[0]/mag ,vector[1]/mag,vector[2]/mag) #normalize
  50. def scaler(testP, amnt):
  51. return (testP[0]*amnt , testP[1]*amnt ,testP[2]*amnt) # scaler
  52. def scalerD(testP, amnt):
  53. return (testP[0]/amnt , testP[1]/amnt ,testP[2]/amnt) # scaler
  54.  
  55. class defAttr:
  56. gotRoots = []
  57. toParticles = []
  58. srt = math.sqrt
  59. doParticles = 0
  60. toCrvs = []
  61. showGrowingCheckValue = 0
  62. doProgress = 0
  63. branchCountTotal = 0
  64. leafCountTotal = 0
  65. combineCrvs = 0
  66. class Leaf:
  67. def __init__(self):
  68. self.leafObj = []
  69. self.reached = False
  70. self.shown = 0
  71. self.pos = om.MVector(r.uniform(-width+treeCenter[0],+width+treeCenter[0]),r.uniform(-height+treeCenter[1],+height+treeCenter[1]),r.uniform(-width+treeCenter[2],+width+treeCenter[2]))
  72. self.reachedBranch = []
  73. self.leafParticleID = 0
  74. self.foundBranches = []
  75. self.sPos = self.pos
  76. self.isFound = 0
  77. self.sObj = self.leafObj
  78. self.oFound = 0
  79. self.Found = 0
  80.  
  81.  
  82.  
  83.  
  84. def show(self):
  85. if showGrow == 1:
  86. ll = polyCube(d=.1,w=.1,h=.1)[0]
  87. self.leafObj = ll
  88. move(ll,self.pos)
  89. parent(ll, leavesGrp)
  90. refresh(cw=1)
  91. if showGrow == 2:
  92. ll = cmds.spaceLocator(p=self.pos)[0]
  93. setAttr(ll+".overrideEnabled", 1)
  94. setAttr(ll+".overrideColor", 14)# 13 = red, 14 = green
  95. self.leafObj = ll
  96.  
  97. class Branch:
  98. def __init__(self, papa, pos, dirV):
  99. self.pos = pos
  100. self.papa = papa
  101. self.dirV = dirV
  102. self.origDir = dirV
  103. self.count = 0
  104. self.shown = 0
  105. self.branchObj = []
  106. self.bLen = bLength
  107. self.bCurrent = []
  108. self.bFound = 0
  109. self.bRoot = 0
  110. self.parents = []
  111. self.doRemove = 0
  112. self.isAlive = 1
  113.  
  114. self.sPos = self.pos
  115. self.isFound = 0
  116. self.sObj = self.branchObj
  117. self.oList = []
  118.  
  119. self.p1 = (0,0,0)#p1#pointPosition(s.cv[0], w=1)
  120. self.p2 = (0,0,0)#p2#pointPosition(s.cv[1], w=1)
  121. self.toCurve = []
  122. self.found = 0
  123. self.found2 = 0
  124.  
  125.  
  126. def reset(self):
  127. self.dirV = self.origDir
  128. self.count = 0
  129. def next(self):
  130. nextDir = om.MVector(self.dirV * self.bLen)
  131. #nextDir = scaler(self.dirV, self.bLen)
  132. if self.bRoot:
  133. #nextDir = scaler(self.dirV, 2)
  134. #normalMag = getMag(nextDir)
  135. #nextDir = makeNormal(nextDir, normalMag)
  136. nextDir = om.MVector(self.dirV * 2)
  137. om.MVector.normalize(nextDir)
  138. nextPos = om.MVector(self.pos + nextDir)
  139. #nextPos = adder(self.pos, nextDir)
  140. nextBranch = Branch(self.pos, nextPos, nextDir)
  141. return nextBranch
  142. def show(self, i):
  143. if self.papa:
  144.  
  145. if defAttr.showGrowingCheckValue:
  146. crv = cmds.curve(p = [self.papa, self.pos], d = 1, n = "crv_"+str(i-1))
  147. bToParent.append(crv)
  148.  
  149.  
  150. self.p1 = [self.papa[0], self.papa[1], self.papa[2]]
  151. self.p2 = [self.pos[0], self.pos[1], self.pos[2]]
  152. defAttr.toCrvs.append(self)
  153. """
  154. if self.p2 == self.p1: # if curve parent is found mark
  155. self.toCurve.append(self.p1)
  156. self.found = 1
  157. """
  158.  
  159.  
  160. if defAttr.doParticles:
  161. branchParticlesR.append(.1)
  162. branchParticles.append(self.pos)
  163.  
  164. defAttr.toParticles.append(self.pos)
  165. extraP = getCenter(self.pos,self.papa, .25)
  166. defAttr.toParticles.append(extraP)
  167. extraP = getCenter(self.pos,self.papa, .5)
  168. defAttr.toParticles.append(extraP)
  169. extraP = getCenter(self.pos,self.papa, .75)
  170. defAttr.toParticles.append(extraP)
  171.  
  172. self.parents.append(self.pos)
  173. cmds.select(cl=1)
  174. else:
  175. lastPapa = 0,0,0
  176.  
  177.  
  178. def makeLeaves():
  179. allTime = time.clock()
  180. defAttr.doParticles = makeParticlesCheck.getValue()
  181.  
  182. defAttr.combineCrvs = combineCrvCheck.getValue()
  183.  
  184. defAttr.showGrowingCheckValue = showGrowingCheck.getValue()
  185. defAttr.toCrvs = []
  186. defAttr.doProgress = showProgressCheck.getValue()
  187. global leavesObjGrp, lastPapa, oneCurve, newLeafArray, makeParticles,leafEnd, rootEnd, leavesGrp, testElapsed, bToParent, branchParticles, branchParticlesR,width, height, treeCenter, bLength, bLength,showGrow, maxDist, minDist, maxItterations, width, height, subItters, treeCenter, directionNoise
  188. progress = 0
  189. bToParent = []
  190. branchParticles = []
  191. branchParticlesR = []
  192. leaves = []
  193. branches = []
  194. branchPosArray = []
  195. newLeafArray = []
  196.  
  197. ########################################################################################################################
  198. ########################################################################################################################
  199. ########################################################################################################################
  200. ## Main variables ##
  201. ####################
  202. maxItterations = 10000 # used for catchers in while loops
  203. ####################
  204. if showLeavesCheck.getValue():
  205. showGrow = 2
  206. else:
  207. showGrow = 0 # 0 = dont update and only draw curves, 1 = draw leaves and trunk dynamicly update, 2 = particles/cuves
  208. scatterType = 0 # 0 volume, 1 surface, 2 both
  209.  
  210. leavesGrp = grpr("leaves_grp")
  211. leavesObjGrp = grpr("leaves_obj_grp")
  212. newGrp = grpr("combinedCrvs_grp")
  213. leafPosArray = []
  214. # Make all the leaves
  215. #scat = ls("scatter1")
  216. #scatCombined = ls("combined_leaves_arrayx")
  217. leaves = []
  218. rootList = []
  219.  
  220. width = float(treeWidth.getText())
  221. depth = float(treeDepth.getText())
  222. height = float(treeHeight.getText())
  223. treeCenter = [float(baseX.getText()),float(baseY.getText()),float(baseZ.getText())]
  224. """
  225. width = 200
  226. depth = 200
  227. height = 200
  228. treeCenter = [0, 0, 0]
  229. """
  230. checkUseScatter = useSoupCheck.getValue()
  231. if checkUseScatter:
  232. scat = ls(soupObj.getText())
  233. if not soupObj:
  234. print "Get soup Object"
  235. else:
  236. try:
  237. leafAmnt = getAttr(scat[0].maxNumberOfPoints)
  238. boundingBox = listConnections(scat[0]+".inGeometry")
  239. boundingBox = xform(boundingBox, bbi=1, q=1)
  240. except:
  241. leafAmnt = getAttr(scat[0]+".count")
  242. boundingBox = xform(scat[0], bbi=1, q=1)
  243.  
  244. else:
  245. scat = soup().create('scatter')
  246. leafBall = polyCube(n = "leaf_ball",w = width, d = depth, h = height, ch=0)[0]
  247. move(leafBall, treeCenter)
  248. polySmooth(leafBall, ch=0)
  249. parent(leafBall,leavesGrp)
  250. rename(scat[0], "leaves_scatter")
  251.  
  252. boundingBox = xform(leafBall, bbi=1, q=1)
  253.  
  254. scat = ls("leaves_scatter")
  255. parent(scat,leavesGrp)
  256. leafBall.getShape().worldMesh[0] >> scat[0].inGeometry
  257. leafBall.worldMatrix[0] >> scat[0].inWorldMatrix
  258. setAttr(leafBall.visibility, 0)
  259. leafAmnt = int(leafAmntA.getText())
  260. setAttr(scat[0].maxNumberOfPoints, leafAmnt)
  261. setAttr(scat[0].visibility, 0)
  262. try:
  263. setAttr(scat[0].pointDensity, leafAmnt*10)
  264. scatPosArray = cmds.getAttr(cmds.listRelatives(str(scat[0]),s=1)[0]+".outPositionPP")
  265. except:
  266. scatPosArray = cmds.getAttr(cmds.listRelatives(str(scat[0]),s=1)[0]+".position")
  267. #scatPosArray = getAttr(scat[0].getShape().outPositionPP)
  268. leafPosArray = []
  269. for i in range(0,len(scatPosArray)):
  270. leafPosArray.append(om.MVector(scatPosArray[i]))
  271.  
  272.  
  273. if defAttr.doProgress:
  274. progress = 1 ################################################# PROGRESS #######################
  275.  
  276. globalScale = float(GlobalScaleTxtAmnt.getText())
  277.  
  278. maxDist = float(searchMaxAmnt.getText()) * globalScale#28
  279. minDist = float(searchMinAmnt.getText()) * globalScale#14
  280. bLength = float(searchLenAmnt.getText()) * globalScale#1
  281. directionNoise = float(searchNoiseAmnt.getText()) * globalScale#.01
  282.  
  283.  
  284. if makeMeshCheck.getValue():
  285. makeParticles = True
  286. else:
  287. makeParticles = False
  288. useScatter = True
  289. ####################
  290.  
  291. ####################
  292. ####################
  293. ########################################################################################################################
  294. ########################################################################################################################
  295. ########################################################################################################################
  296. if progress:
  297. progWin2 = progressWindow(isInterruptable=1, t= "Growing...", min = 0, max = len(leafPosArray))
  298.  
  299. directionArray = []
  300. pi = 1
  301. for i in leafPosArray:
  302. if progress:
  303. progressWindow(progWin2, edit=True, pr = pi)
  304. l = Leaf()
  305.  
  306. if scat:
  307. l.pos = i
  308. l.sPos = i
  309. directionArray.append(i)
  310. else:
  311. directionArray.append(l.pos)
  312. leaves.append(l)
  313. pi += 1
  314. toParent = []
  315.  
  316. for l in leaves:
  317. l.show()
  318. l.shown = 1
  319. if showGrow == 2:
  320. toParent.append(l.leafObj)
  321.  
  322. parent(leavesObjGrp, leavesGrp)
  323. parent(toParent, leavesObjGrp)
  324. select(cl=1)
  325.  
  326. if defAttr.gotRoots:
  327. sl = defAttr.gotRoots
  328. else:
  329. sl = selected()
  330.  
  331. rootTime = time.clock()
  332. iA = 0
  333. if len(sl) >= 1:
  334. print "Creating roots from selected"
  335. for s in sl:
  336. rootPos = om.MVector(s.getTranslation())
  337. leafAverage = om.MVector(reduce(lambda x, y: x + y, directionArray) / len(directionArray))
  338. dirV = om.MVector(rootPos - leafAverage)
  339. root = Branch(None, rootPos, -dirV)
  340. branches.append(root)
  341. current = root
  342. found = False
  343. catcher = maxItterations*.1
  344. while not found:
  345. if catcher == 0:
  346. print "Breaking"
  347. break
  348. cLMax = 1000
  349. for l in leaves:
  350. dist = getDist(current.pos, l.pos)
  351. if dist < cLMax:
  352. newDirV = om.MVector(current.pos - l.pos)
  353. root.dirV = -newDirV
  354. cLMax = dist
  355. if dist < maxDist:
  356. found = True
  357. if not found:
  358. current.bRoot = 1
  359. randAdd = om.MVector(r.uniform(-directionNoise*.1,directionNoise*.1),r.uniform(-directionNoise*.1,directionNoise*.1),r.uniform(-directionNoise*.1,directionNoise*.1))###
  360. current.dirV = om.MVector(current.dirV + randAdd)
  361. root = current.next()
  362. current = root
  363. branches.append(current)
  364. catcher -= 1
  365. iA += 1
  366. else:
  367. print "Creating root"
  368. rootPos = om.MVector(0,0,0)
  369. dirV = om.MVector(reduce(lambda x, y: x + y, directionArray) / len(directionArray))
  370. root = Branch(None, rootPos, dirV)
  371. branches = [root]
  372. current = root
  373. found = False
  374. catcher = maxItterations*.1
  375. while not found:
  376. if catcher == 0:
  377. print "Breaking"
  378. break
  379. for l in leaves:
  380. dist = getDist(current.pos,l.pos)
  381. if dist < maxDist:
  382. found = True
  383. if not found:
  384. current.bRoot = 1
  385. randAdd = om.MVector(r.uniform(-directionNoise*.1,directionNoise*.1),r.uniform(-directionNoise*.1,directionNoise*.1),r.uniform(-directionNoise*.1,directionNoise*.1))###
  386. current.dirV = om.MVector(current.dirV + randAdd)
  387. root = current.next()
  388. current = root
  389. branches.append(current)
  390. catcher -= 1
  391. iA += 1
  392. rootTimeElapsed = (time.clock() - rootTime)
  393. #print "Step one time:", rootTimeElapsed, iA
  394. i = 1
  395. defAttr.toParticles = []
  396. for b in branches:
  397. b.show(i)
  398. i += 1
  399. #print "Starting grow"
  400. noBMax = 0
  401. #leaves = self.leaves
  402. #branches = self.branches
  403. branchesSave = []
  404. #leafPosArray = self.leafPosArray
  405. newB = 0
  406. endItter = 0
  407. iA = 0
  408. refreshTracker = 0
  409.  
  410. lT = 0
  411.  
  412.  
  413.  
  414. useOcTree = useOcTreeCheck.getValue()
  415.  
  416.  
  417. if useOcTree:
  418. oTreeTime = time.clock()
  419. #### ocTree
  420. subDepth = int(subMaxAmnt.getText())
  421. subMaxCount = float(subMaxCountAmnt.getText())
  422. distBuffAmntMultiplier = float(distBuffAmnt.getText())
  423. oShowGrow = int(showOcTreeCheck.getValue())
  424. doRefresh = int(showOcTreeGrowCheck.getValue())
  425. bTree_util2.constructTree(boundingBox, leaves, subDepth, subMaxCount ,oShowGrow, doRefresh)
  426. ####
  427. ocTimeElapsed = (time.clock() - oTreeTime)
  428. print "OcTree Creation:", ocTimeElapsed
  429. doRefresh = 5
  430.  
  431.  
  432.  
  433.  
  434.  
  435. #bFresh = 0
  436. for i in range(0,maxItterations):
  437. #bFresh += 1
  438. #print "Itteration ", i
  439. if progress:
  440. progressWindow(progWin2, edit=True, pr = lT+1)
  441. if progressWindow(progWin2, query=1, isCancelled=1 ):
  442. print "killed at", i+1
  443. break
  444. itterTime = time.clock()
  445. bl = len(branches)
  446. lb = len(leaves)
  447. if not newB:
  448. if endItter >= 1:
  449. break
  450. endItter += 1
  451. newB = 0
  452. refreshTime = time.clock()
  453. if refreshTracker == 2:
  454. cmds.refresh(cw=1)
  455. refreshTracker = 0
  456. leafLoopItterTime = time.clock()
  457.  
  458. if useOcTree:
  459.  
  460. #print "branch length ", len(branches)
  461. #if doRefresh == 10 or bFresh < 5:
  462. #doRefresh = 0
  463. leafList = []
  464. bList = []
  465. for b in branches:
  466. if not b.doRemove:
  467. #spaceLocator(p=b.pos)
  468. closeList = []
  469. closeList = bTree_util2.getClose(b.pos, maxDist * distBuffAmntMultiplier, 0)
  470. if len(closeList) > 0:
  471. bList.append(b)
  472. for l in closeList:
  473. #spaceLocator(p=l.sPos)
  474. if not l.reached:
  475. if not l.oFound:
  476. leafList.append(l)
  477. #l.foundBranches.append(b)
  478. l.oFound = 1
  479.  
  480. #doRefresh += 1
  481. #bFresh += 1
  482. lt = 0
  483. for l in leafList:
  484.  
  485. lt += 1
  486. closestBranch = False
  487. record = 10000
  488. for b in bList:
  489. #if not b.doRemove:
  490. dist = getDist(b.pos,l.sPos)
  491. if dist < minDist:
  492. l.reached = True
  493. lT += 1
  494. closestBranch = False
  495. break
  496. if dist > maxDist:
  497. pass
  498. elif closestBranch == False or dist < record:
  499. #spaceLocator(p = l.pos)
  500. closestBranch = [b]
  501. record = dist
  502.  
  503. if closestBranch != False:
  504. defAttr.leafCountTotal += 1
  505. """
  506. testPF = setMag(testPF, 10)
  507. mPF = getMag(testPF)
  508. testPF = makeNormal(testPF, mPF)
  509. minusV = (1,2,3)
  510. testPF = subber(testPF, minusV)
  511. """
  512. #newDir = subber(l.sPos, closestBranch[0].pos)
  513. newDir = om.MVector(l.sPos - closestBranch[0].pos)
  514. om.MVector.normalize(newDir)
  515. #normalMag = getMag(newDir)
  516. #newDir = makeNormal(newDir, normalMag)
  517. #closestBranch[0].dirV = adder(closestBranch[0].dirV ,newDir)
  518. closestBranch[0].dirV = om.MVector(closestBranch[0].dirV + newDir )
  519. closestBranch[0].count = closestBranch[0].count + float(1)
  520. iA += 1
  521. leafLoopElapsed = (time.clock() - leafLoopItterTime)
  522. leafLoopAfterItterTime = time.clock()
  523. # Delet reached leaves
  524. #if doRefresh == 10 or bFresh < 5:
  525. for l in leafList[::-1]:
  526. l.oFound = 0
  527. if l.reached:
  528. l.Found = 1
  529. if l.leafObj:
  530. cmds.setAttr(l.leafObj+".visibility",0)
  531.  
  532.  
  533. #print lt, len(leafList)
  534. """
  535. for l in leafList:
  536. closestBranch = False
  537. record = 10000
  538. for b in l.foundBranches:
  539. dist = getDist(b.pos,l.pos)
  540. if dist < minDist:
  541. l.reached = True
  542. lT += 1
  543. closestBranch = False
  544. break
  545. if dist > maxDist:
  546. pass
  547. elif closestBranch == False or dist < record:
  548. #spaceLocator(p = l.pos)
  549. closestBranch = [b]
  550. record = dist
  551.  
  552. if closestBranch != False:
  553. newDir = om.MVector(l.pos - closestBranch[0].pos)
  554. om.MVector.normalize(newDir)
  555. closestBranch[0].dirV = om.MVector(closestBranch[0].dirV + newDir )
  556. closestBranch[0].count = closestBranch[0].count + float(1)
  557. iA += 1
  558. leafLoopElapsed = (time.clock() - leafLoopItterTime)
  559. leafLoopAfterItterTime = time.clock()
  560. for l in leaves[::-1]:
  561. if l.reached:
  562. l.Found = 1
  563. if l.leafObj:
  564. cmds.setAttr(l.leafObj+".visibility",0)
  565. else:
  566. l.oFound = 0
  567. """
  568.  
  569.  
  570.  
  571. else:
  572. lt = 0
  573. for l in leaves:
  574. if not l.Found:
  575. lt += 1
  576. closestBranch = False
  577. record = 10000
  578. for b in branches:
  579. if not b.doRemove:
  580. dist = getDist(b.pos,l.pos)
  581. if dist < minDist:
  582. l.reached = True
  583. lT += 1
  584. closestBranch = False
  585. break
  586. if dist > maxDist:
  587. pass
  588. elif closestBranch == False or dist < record:
  589. #spaceLocator(p = l.pos)
  590. closestBranch = [b]
  591. record = dist
  592.  
  593. if closestBranch != False:
  594. newDir = om.MVector(l.pos - closestBranch[0].pos)
  595. om.MVector.normalize(newDir)
  596. closestBranch[0].dirV = om.MVector(closestBranch[0].dirV + newDir )
  597. closestBranch[0].count = closestBranch[0].count + float(1)
  598. iA += 1
  599. leafLoopElapsed = (time.clock() - leafLoopItterTime)
  600. leafLoopAfterItterTime = time.clock()
  601. # Delet reached leaves
  602. for l in leaves[::-1]:
  603. if l.reached:
  604. l.Found = 1
  605. if l.leafObj:
  606. cmds.setAttr(l.leafObj+".visibility",0)
  607.  
  608.  
  609. #print lt
  610. ii = 1
  611. rBranches = []
  612. bTrack = 0
  613. for b in branches[::-1]:
  614. if not b.doRemove:
  615. if b.count > 0:
  616. bl += 1
  617. bTrack += 1
  618. defAttr.branchCountTotal += 1
  619.  
  620. #print "here", b.dirV, b.count
  621. #newDirV = scalerD(b.dirV, b.count)
  622. #print newDirV
  623. #normalMag = getMag2(newDirV)
  624. #newDirV = makeNormal(newDirV, normalMag)
  625. #randAdd = (r.uniform(-directionNoise,directionNoise),r.uniform(-directionNoise,directionNoise),r.uniform(-directionNoise,directionNoise))
  626. #print b.dirV
  627. #b.dirV = adder(newDirV, randAdd)
  628.  
  629. bVector = om.MVector(b.dirV)
  630. newDirV = om.MVector(bVector / b.count)
  631. om.MVector.normalize(newDirV)
  632. randAdd = om.MVector(r.uniform(-directionNoise,directionNoise),r.uniform(-directionNoise,directionNoise),r.uniform(-directionNoise,directionNoise))###
  633. b.dirV = om.MVector(newDirV + randAdd)###
  634.  
  635. newBranch = b.next()
  636. branches.append(newBranch)
  637. branchesSave.append(newBranch)
  638. branchPosArray.append(b.pos)
  639.  
  640. b.isAlive = 1
  641.  
  642. if not b.shown:
  643. b.show(ii)
  644. newB = 1
  645. b.shown = 1
  646. else:
  647. #rBranches.append(b)
  648. b.doRemove = 1
  649. #b.isAlive = 0
  650. ii += 1
  651. b.reset()
  652. """
  653. for b in rBranches:
  654. if b.doRemove == 1:
  655. #b.isAlive = 0
  656. branches.remove(b)
  657. """
  658. refreshTracker += 1
  659. #refreshTimeElapsed = (time.clock() - refreshTime)
  660. #itterElapsed = (time.clock() - itterTime)
  661. #leafLoopAfterItterTimeElapsed = (time.clock() - leafLoopAfterItterTime)
  662.  
  663. #print "Itteration time:", itterElapsed
  664. #print " Leaf loop time:", leafLoopElapsed
  665. #print " After Leaf loop time:", leafLoopAfterItterTimeElapsed
  666. #print " Refresh time:", refreshTimeElapsed
  667. if progress:
  668. progressWindow(progWin2, endProgress=1)
  669. print "Total itterations", iA
  670. parent(bToParent, leavesGrp)
  671.  
  672.  
  673.  
  674. if makeParticlesCheck.getValue():
  675. ll = cmds.nParticle(p=defAttr.toParticles)[0]
  676. #parent(ll, defAttr.popGrp)
  677. setAttr(ll+".radiusScaleInput", 5)
  678. setAttr(ll+".radius", 1)
  679. setAttr(ll+".radiusScaleInputMax", 100)
  680. setAttr(ll+".colorInput", 5)
  681. setAttr(ll+".colorInputMax", 100)
  682. setAttr(ll+".collide", 0)
  683. setAttr(ll+".selfCollide", 0)
  684. setAttr(ll+".forcesInWorld", 0)
  685. setAttr(ll+".ignoreSolverWind", 1)
  686. setAttr(ll+".ignoreSolverGravity", 1)
  687.  
  688. if makeParticles:
  689. ppp = ls(ll)[0]
  690. reMesh = createNode("mesh", n=ppp+"_reMeshed")
  691. rename(reMesh,ppp+"_reMeshed")
  692. #parent(reMesh[0],defAttr.popGrp)
  693. # connections
  694. ppp.outMesh >> reMesh.inMesh
  695. setAttr(ll+".threshold", 0.01)
  696. setAttr(ll+".meshMethod", 3)
  697. setAttr(ll+".meshSmoothingIterations", 5)
  698. setAttr(ll+".maxTriangleResolution", 200)
  699. setAttr(ll+".meshTriangleSize", 0.2)
  700. setAttr(ll+".velocityPerVertex", 0)
  701. setAttr(ll+".colorPerVertex", 1)
  702.  
  703. #return leaves, branches, branchPosArray,leavesObjGrp,branchesSave
  704. if defAttr.combineCrvs:
  705. leavesGrpDeletCheck = ls("leaves_obj_grp")
  706. if leavesGrpDeletCheck:
  707. delete(leavesObjGrp)
  708. if defAttr.showGrowingCheckValue:
  709. delete(leavesGrp)
  710. crvMakeTime = time.clock()
  711. def getC(c):
  712. maxSearch = 0
  713. papa = c
  714. toCrvList = []
  715. while papa:
  716. toCrvList.append(papa.p1)
  717. if papa.toCurve:
  718. papa = papa.toCurve[0]
  719. papa.found2 = 1
  720. else:
  721. toCrvList.append(papa.p2)
  722. break
  723. if maxSearch > 1000:
  724. break
  725. maxSearch += 1
  726. return toCrvList
  727. checkList = []
  728. i = 0
  729. if len(defAttr.toCrvs) > 0:
  730. maxSearch = 0
  731. toCrvList = []
  732. restCurves = defAttr.toCrvs
  733. papa = restCurves[0]
  734. i = 0
  735. search = 1
  736. toParent = []
  737. for crv in restCurves:# loop through curves
  738. if not crv.found:
  739. for crvcrv in restCurves: # loop throuch all cruves for all curves
  740. if not crvcrv.found:
  741. if crv.p2 == crvcrv.p1: # if curve parent is found mark
  742. crv.toCurve.append(crvcrv)
  743. crv.found = 1
  744. i += 1
  745. for c in restCurves:
  746. if not c.found2:
  747. toC = getC(c)
  748. crv = cmds.curve(p = toC, d = 1)
  749. toParent.append(crv)
  750. crvPiv = pointPosition(crv+".cv[0]", w=1)
  751. move(crv+".scalePivot", crvPiv)
  752. move(crv+".rotatePivot", crvPiv)
  753. move(crv, 0,0,0,rpr=1)
  754. makeIdentity(crv,apply=1,t=1,r=1 ,s=1 ,n=0 ,pn=1)
  755. move(crv, crvPiv)
  756. i += 1
  757.  
  758. parent(toParent,newGrp)
  759. select(cl=1)
  760. crvMakeTimeElapsed = (time.clock() - crvMakeTime)
  761.  
  762. ###
  763. makeLocatorsGo = makeLocatorsCheck.getValue()
  764. print makeLocatorsGo, "HERE"
  765. if makeLocatorsGo:
  766. makeLocators()
  767. ###
  768.  
  769. allTimeElapsed = (time.clock() - allTime)
  770. #print "Curve creating time: ", crvMakeTimeElapsed
  771. print "Branch calculation total: ", defAttr.branchCountTotal
  772. print "Leaf calculation total: ",defAttr.leafCountTotal
  773. print "Total time: ", allTimeElapsed
  774.  
  775. def useSoupChecker():# enable and disable using soup
  776. soupCheck = useSoupCheck.getValue()
  777. attrList = [leafAmntA]#, searchMaxAmnt, searchMinAmnt, searchLenAmnt, searchNoiseAmnt
  778. if soupCheck:
  779. for attr in attrList:
  780. textField(attr, en=0, e=1)
  781. #treeShapeLayout = frameLayout(l = "Tree Shape", cll=1, cl=0)
  782. frameLayout(treeShapeLayout, e=1, vis=0, cl=1)
  783. textField(soupObj, en=1, e=1)
  784. button(soupObjGet,en=1, e=1)
  785. else:
  786. for attr in attrList:
  787. textField(attr, en=1, e=1)
  788.  
  789. frameLayout(treeShapeLayout, e=1, vis=1, cl=1)
  790. textField(soupObj, en=0, e=1)
  791. button(soupObjGet,en=0, e=1)
  792.  
  793. def runMain():
  794. print "running"
  795. """
  796. branchPosArray=[]
  797. # main "Program"
  798. grow()
  799. parent(bToParent, leavesGrp)
  800. select(cl=1)
  801. leavesGrpDeletCheck = ls("leaves_obj_grp")
  802. if leavesGrpDeletCheck:
  803. delete(leavesObjGrp)
  804. select(cl=1)
  805. elapsed = (time.clock() - start)
  806. elapsed = elapsed
  807. print "\n","Run time total:", elapsed
  808. """
  809. def getScat():
  810. sl = selected()
  811. soupObj.setText(str(sl[0]))
  812.  
  813. def getRoots():
  814. sl = selected()
  815. if len(sl) > 0:
  816. defAttr.gotRoots = sl
  817. else:
  818. defAttr.gotRoots = []
  819.  
  820. def removeRoots():
  821. defAttr.gotRoots = []
  822.  
  823.  
  824. def resetPiv():
  825. sl = selected()
  826. for s in sl:
  827. if nodeType(s.getShape()) == "nurbsCurve":
  828. p = pointPosition(s.cv[0], w=1)
  829. move(s+".scalePivot", p)
  830. move(s+".rotatePivot", p)
  831. move(s, 0,0,0,rpr=1)
  832. makeIdentity(s,apply=1,t=1,r=1 ,s=1 ,n=0 ,pn=1)
  833. move(s, p)
  834.  
  835. from pymel.core import *
  836. def crvToParticles():
  837. import maya.OpenMaya as om
  838. sl = om.MSelectionList() # create list for selection
  839. om.MGlobal.getActiveSelectionList(sl) # load list
  840. selectionIter = om.MItSelectionList(sl)# create ittorator for list
  841. cvPos = []
  842. while not selectionIter.isDone():
  843. crvObj = om.MObject()# Crv object
  844. cvPosArray = om.MPointArray()# create array to store cv points
  845. crvPath = om.MDagPath() # create dag path
  846. selectionIter.getDagPath(crvPath, crvObj)# fill dag path, with crvObj
  847. crvFn = om.MFnNurbsCurve(crvPath)# functions for curves
  848. crvFn.getCVs(cvPosArray, om.MSpace.kWorld) # get cvs from cvFn, and add to cvPosArray
  849. selectionIter.next()# move on to next item in selection
  850. for i in range(cvPosArray.length()):# loop through length of curve Position array
  851. x = cvPosArray[i][0]
  852. y = cvPosArray[i][1]
  853. z = cvPosArray[i][2]
  854. pos = [x,y,z]
  855. cvPos.append(pos)
  856. ll = mc.nParticle(p=cvPos)[0]
  857. mc.setAttr(ll+".radiusScaleInput", 5)
  858. mc.setAttr(ll+".radius", 2.5)
  859. mc.setAttr(ll+".radiusScaleInputMax", 35)
  860. mc.setAttr(ll+".colorInput", 5)
  861. mc.setAttr(ll+".colorInputMax", 35)
  862. mc.setAttr(ll+".collide", 0)
  863. mc.setAttr(ll+".selfCollide", 0)
  864. mc.setAttr(ll+".forcesInWorld", 0)
  865. mc.setAttr(ll+".ignoreSolverWind", 1)
  866. mc.setAttr(ll+".ignoreSolverGravity", 1)
  867.  
  868.  
  869. def slCrvLen():
  870. sl = selected()
  871. len = float(crvLenAmnt.getText())
  872. select(cl=1)
  873. for s in sl:
  874. if nodeType(s.getShape()) == "nurbsCurve":
  875. cl = arclen(s)
  876. if cl < len:
  877. select(s, add=1)
  878.  
  879. def randoSl():
  880. sl = selected()
  881. select(cl=1)
  882. for s in sl:
  883. rt = r.randint(0,2)
  884. if rt == 2:
  885. select(s,add=1)
  886.  
  887. def getCrvTips():
  888. from pymel.core import *
  889. import maya.OpenMaya as om
  890. sl = om.MSelectionList() # create list for selection
  891. om.MGlobal.getActiveSelectionList(sl) # load list
  892. selectionIter = om.MItSelectionList(sl)# create ittorator for list
  893. cvPos = []
  894. while not selectionIter.isDone():
  895. crvObj = om.MObject()# Crv object
  896. cvPosArray = om.MPointArray()# create array to store cv points
  897. crvPath = om.MDagPath() # create dag path
  898. selectionIter.getDagPath(crvPath, crvObj)# fill dag path, with crvObj
  899. crvFn = om.MFnNurbsCurve(crvPath)# functions for curves
  900. crvFn.getCVs(cvPosArray, om.MSpace.kWorld) # get cvs from cvFn, and add to cvPosArray
  901. selectionIter.next()# move on to next item in selection
  902. crvP = cvPosArray[cvPosArray.length()-1]
  903. x = crvP[0]
  904. y = crvP[1]
  905. z = crvP[2]
  906. pos = [x,y,z]
  907. cvPos.append(pos)
  908. slList = []
  909. for p in cvPos:
  910. l = spaceLocator()
  911. move(l, p)
  912. slList.append(l)
  913. select(slList,add=1)
  914.  
  915.  
  916. def crvToMesh():
  917. #from pymel.core import *
  918. #import maya.OpenMaya as om
  919. #import maya.cmds as mc
  920. #import time
  921. start = time.clock()
  922. sl = selected()
  923. def grprO(name):
  924. g = ls(name)
  925. if g:
  926. delete(g)
  927. g = group(n=name,em=1)
  928. return g
  929. crvToMeshGrp = grprO("crvsToMeshGrp")
  930. crvToMeshStrokesGrp = grprO("crvsToMeshStrokeGrp")
  931. parent(crvToMeshStrokesGrp, crvToMeshGrp)
  932.  
  933. defaultMatSG = ls("initialShadingGroup")
  934.  
  935. i = 0
  936. toParent = []
  937. toParentS = []
  938. for s in sl:
  939. sampleAmnt = int(arclen(s))
  940. srk = stroke(n = s+"_Stoke_"+str(i))
  941. toParentS.append(srk)
  942. bsh = createNode("brush", n = s+"_Brush_"+str(i))
  943.  
  944. s.worldSpace[0] >> srk.pathCurve[0].curve
  945. bsh.outBrush >> srk.brush
  946. connectAttr("time1.outTime", bsh+".time")
  947. srkSp = srk.getShape()
  948. setAttr(srkSp.displayPercent, 100)
  949. setAttr(srkSp.pathCurve[0].samples, 24)
  950. setAttr(srkSp.useNormal, 0)
  951. setAttr(srkSp.minimalTwist, 1)
  952. # Paint effects settings
  953. sh = srkSp
  954. scl = arclen(s)
  955. sB = bsh
  956. end = (scl*.2)
  957. sW = scl*.02
  958. sG = scl*.025
  959. if end >= .1:
  960. end = .1
  961. if sG <= .5:
  962. sG = .5
  963. if sW >= .1:
  964. sW = .1
  965. if sW <= 1:
  966. sW = 1
  967. setAttr(sB.brushWidth, sW)
  968. setAttr(sB.globalScale, sG)
  969. setAttr(sh.sampleDensity, .5)
  970. extrudeList = [["1",.1, 1],["2",1, end]]
  971. x = 2
  972. ii = 0
  973. for ex in extrudeList:
  974. setAttr(sh+".pressureScale[{0}].pressureScale_FloatValue".format(ii), ex[1])
  975. setAttr(sh+".pressureScale[{0}].pressureScale_Position".format(ii), ex[2])
  976. setAttr(sh+".pressureScale[{0}].pressureScale_Interp".format(ii), 2)
  977. x += 1
  978. ii += 1
  979. setAttr(str(sh)+".pressureMap1", 2)
  980. setAttr(sh+".pressureMin1",.1)
  981. setAttr(sh+".pressureMax1",1)
  982. setAttr(sh+".meshVertexColorMode",1)
  983. setAttr(sh+".meshQuadOutput",1)
  984. #setAttr "strokeShape2.meshVertexColorMode" 1;
  985. #setAttr "strokeShape2.meshQuadOutput" 1;
  986. #ii += 1
  987.  
  988.  
  989. # Make Mesh
  990. newMeshT = mc.createNode("transform", n = s+"_Mesh"+str(i))
  991. newMesh = mc.createNode("mesh", n = s+"_MeshShape"+str(i), p = s+"_Mesh"+str(i))
  992. toParent.append(newMeshT)
  993. connectAttr(str(srk)+".worldMainMesh", str(newMesh)+".inMesh")
  994. sets(defaultMatSG[0], e=1, forceElement = newMesh)
  995.  
  996.  
  997. parent(toParent, crvToMeshGrp)
  998. parent(toParentS, crvToMeshStrokesGrp)
  999. setAttr(crvToMeshStrokesGrp.visibility, 0)
  1000. print time.clock()- start
  1001.  
  1002.  
  1003. def lookAt(base, target, up=[0,1,0]):
  1004. x = omm.MVector(target[0]-base[0], target[1]-base[1], target[2]-base[2])
  1005. x.normalize()
  1006. z = x ^ omm.MVector(-up[0], -up[1], -up[2])
  1007. z.normalize()
  1008. y = x ^ z
  1009. y.normalize()
  1010. m = omm.MMatrix()
  1011. l = [x.x, x.y, x.z, 0, y.x, y.y, y.z, 0, z.x, z.y, z.z, 0, 0, 0, 0, 1]
  1012. omm.MScriptUtil.createMatrixFromList(l, m)
  1013. r = omm.MTransformationMatrix(m).eulerRotation() * 57.2958
  1014. return r[0], r[1], r[2]
  1015.  
  1016. def makeLocators():
  1017. lctrGrp = grpr("lctr_grp")
  1018. toParentL = []
  1019. for p in defAttr.toCrvs:
  1020. l = spaceLocator()
  1021. move(l, p.pos)
  1022. newV = p.pos - p.dirV
  1023. aimToRotate = lookAt(p.pos, newV)
  1024. mc.rotate(aimToRotate[0],aimToRotate[1],aimToRotate[2],str(l))
  1025. toParentL.append(l)
  1026. parent(toParentL, lctrGrp)
  1027.  
  1028.  
  1029.  
  1030. win = window(title= "Vein Generator", s=1, w=200, ip=1, tlb=1)
  1031. mainLayout = rowColumnLayout(nc=1)
  1032. #guiLable = text("Vein creator")
  1033.  
  1034.  
  1035.  
  1036. attributeLayout = rowColumnLayout(nc=1, p = mainLayout )
  1037.  
  1038. combineCrvCheck = checkBox(l = "Combine Crvs", v=1)
  1039. showLeavesCheck = checkBox(l = "Show Leaves")
  1040. useSoupCheck = checkBox(l = "Use Scatter", cc = Callback(useSoupChecker), v=0)
  1041. makeParticlesCheck = checkBox(l = "Make Particles")
  1042. makeMeshCheck = checkBox(l = "Make Mesh")
  1043. showGrowingCheck = checkBox(l = "Show Growing", v=1)
  1044. showProgressCheck = checkBox(l = "Show Proggress Bar", v=0)
  1045. makeLocatorsCheck = checkBox(l = "Make Locators", v=0)
  1046.  
  1047. soupLayout = rowColumnLayout(nc=2, p = attributeLayout)
  1048. soupObj = textField(tx = "scatter1", p = soupLayout,en=0)
  1049. soupObjGet = button(l = "Get", p=soupLayout,en=0, command=Callback(getScat))
  1050.  
  1051. text(" ",p=attributeLayout)
  1052.  
  1053. #useSoupObj = textFieldButtonGrp(tx="scatter1")##,w=10, cw=[2,1]
  1054.  
  1055.  
  1056. #runAllBtn = button(l="Create Leaves",p = attributeLayout, command=Callback(makeLeaves))
  1057. """
  1058. width = 200
  1059. depth = 200
  1060. height = 200
  1061. treeCenter = [0, 0, 0]
  1062. """
  1063.  
  1064. treeShapeLayout = frameLayout(l = "Tree Shape", cll=1, cl=1)
  1065. leafAmntTxt = text("leaf amount", p = treeShapeLayout)
  1066. leafAmntA = textField(tx = "1000", p = treeShapeLayout)
  1067.  
  1068. treeShapeSubLayout = rowColumnLayout(nc=2, p = treeShapeLayout, w=10)
  1069.  
  1070. treeWidthTxt = text(l= "Width", p = treeShapeSubLayout)
  1071. treeWidth = textField(tx = "50", p = treeShapeSubLayout)
  1072. treeHeightTxt = text(l= "Height", p = treeShapeSubLayout)
  1073. treeHeight = textField(tx = "100", p = treeShapeSubLayout)
  1074. treeDepthTxt = text(l= "Depth", p = treeShapeSubLayout)
  1075. treeDepth = textField(tx = "50", p = treeShapeSubLayout)
  1076.  
  1077. treeBaseTxt = text(l= "Base Position", p = treeShapeSubLayout)
  1078. treeBaseInfoTxt = text(l= "X Y Z", p = treeShapeLayout)
  1079. baseLocation = rowColumnLayout(nc=3, p = treeShapeLayout)
  1080. baseX = textField(tx = "0", p = baseLocation, w=40)
  1081. baseY = textField(tx = "75", p = baseLocation, w=40)
  1082. baseZ = textField(tx = "0", p = baseLocation, w=40)
  1083. ##
  1084. GlobalScaleTxt = text("Global Scale", p = attributeLayout)
  1085. GlobalScaleTxtAmnt = textField(tx = "1", p = attributeLayout)
  1086.  
  1087. searchAmntTxt = text("Search Distance", p = attributeLayout)
  1088. searchAmntMaxTxt = text("Max", p = attributeLayout)
  1089. searchMaxAmnt = textField(tx = "25", p = attributeLayout)
  1090.  
  1091. searchAmntMinTxt = text("Min", p = attributeLayout)
  1092. searchMinAmnt = textField(tx = "5", p = attributeLayout)
  1093.  
  1094. searchAmntLenTxt = text("Branch Length", p = attributeLayout)
  1095. searchLenAmnt = textField(tx = "2", p = attributeLayout)
  1096.  
  1097. searchAmntNoiseTxt = text("Noise", p = attributeLayout)
  1098. searchNoiseAmnt = textField(tx = ".1", p = attributeLayout)
  1099. text(" ",p=mainLayout)
  1100. getRootObjs = button(l = "Get Roots",p=mainLayout, command=Callback(getRoots))
  1101. removeRootObjs = button(l = "Remove Roots",p=mainLayout, command=Callback(removeRoots))
  1102.  
  1103. runAllBtn = button(l=" Grow ",p=mainLayout,bgc = [0,1,0], command=Callback(makeLeaves))
  1104.  
  1105.  
  1106. ###
  1107. optionsLayout = frameLayout(l = "Options", cll=1, cl=1, p = mainLayout)
  1108.  
  1109. crvOptionsLayout = frameLayout(l = "Crv Utils", cll=1, cl=1, p = optionsLayout)
  1110.  
  1111. slCrvLength = button(l=" Select Crv Length ",p=crvOptionsLayout,bgc = [.5,.5,.5], command=Callback(slCrvLen))
  1112. crvLenAmnt = textField(tx = "10", p = crvOptionsLayout)
  1113.  
  1114. runRandoSl = button(l=" Reduce Selection ",p=crvOptionsLayout,bgc = [.5,.5,.5], command=Callback(randoSl))
  1115.  
  1116. resetCrvPivot = button(l=" ResetPivot ",p=crvOptionsLayout,bgc = [.5,.5,.5], command=Callback(resetPiv))
  1117. crvToParticels = button(l=" Crv to Particles ",p=crvOptionsLayout,bgc = [.5,.5,.5], command=Callback(crvToParticles))
  1118. crvTipsToLctrs = button(l=" Crv tips to Locators ",p=crvOptionsLayout,bgc = [.5,.5,.5], command=Callback(getCrvTips))
  1119.  
  1120. crvtoLocatorBtn = button(l=" Crv Mesh ",p=crvOptionsLayout,bgc = [.5,.5,.5], command=Callback(crvToMesh))
  1121.  
  1122.  
  1123.  
  1124. ocTreeOptionsLayout = frameLayout(l = "Octree", cll=1, cl=1, p = optionsLayout)
  1125. useOcTreeCheck = checkBox(l = "Use OcTree", v=1, p=ocTreeOptionsLayout)
  1126. subMaxAmntTxt = text("subMax", p = ocTreeOptionsLayout)
  1127. subMaxAmnt = textField(tx = "20", p = ocTreeOptionsLayout)
  1128. subMaxCountAmntTxt = text("subMaxCoun", p = ocTreeOptionsLayout)
  1129. subMaxCountAmnt = textField(tx = "200", p = ocTreeOptionsLayout)
  1130. subMaxCountAmntTxt = text("Distance Buffer Multiplier", p = ocTreeOptionsLayout)
  1131. distBuffAmnt = textField(tx = "1", p = ocTreeOptionsLayout)
  1132. showOcTreeCheck = checkBox(l = "Show OcTree", v=0, p=ocTreeOptionsLayout)
  1133. showOcTreeGrowCheck = checkBox(l = "Show Grow", v=0, p=ocTreeOptionsLayout)
  1134. win.show()
Advertisement
Add Comment
Please, Sign In to add comment