Advertisement
RobbyRobby

Fern with Blender and From_pydata

Jul 19th, 2021
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.26 KB | None | 0 0
  1. ####################################################################
  2. #         Felce frattale (Barnsley fern)
  3. #         Tratto da Wikipedia
  4. #
  5. #         Adattato per Blender da Roberto Viaggi
  6. #
  7. #         Dai ALEK!!!
  8. #         Attendiamo il prossimo corso!!
  9. #          
  10. #         Edit History
  11. #         07/7/2021
  12. #####################################################################
  13.  
  14.  
  15.  
  16. import bpy
  17. import random
  18. import time
  19.  
  20.  
  21. #C=bpy.context
  22. #D=bpy.data
  23. #O=bpy.ops
  24.  
  25. #########################################################
  26. #                   Funzioni utili
  27. #########################################################
  28. ### cancello tutto (epurazione) ###
  29. def purge():
  30.     for o in bpy.data.objects:
  31.         bpy.data.objects.remove(o,do_unlink=True)
  32.     for m in bpy.data.meshes:
  33.         bpy.data.meshes.remove(m,do_unlink=True)
  34.     for c in bpy.data.collections:
  35.         bpy.data.collections.remove(c,do_unlink=True)
  36.  
  37. ### cancello un oggetto specifico tramite nome ###
  38. def delete_objName(name):
  39.     for ob in bpy.data.objects:
  40.         if ob.name==name:
  41.                 bpy.data.objects.remove(ob,do_unlink=True)
  42.  
  43. ### seleziono un oggetto specifico tramite nome ###
  44. def select_obName(name):
  45.     for ob  in bpy.data.objects:
  46.         if ob.name==name:
  47.             bpy.data.objects[ob.name].select_set(True)
  48.                    
  49. #########################################################
  50. #                   Fine Funzioni utili
  51. #########################################################    
  52.  
  53. #########################################################
  54. #                   INIZIO  PROGRAMMA
  55. #########################################################
  56. """
  57. # asssegno al contesto corrente la vista 3D
  58. bpy.context.area.ui_type = 'VIEW_3D'
  59.  
  60. # setto la vista TOP nel contesto corrente. Per tornare nel TEXT EDITOR   shift F11
  61. bpy.ops.view3d.view_axis(type='TOP', align_active=False, relative=False)
  62. """
  63.  
  64. # cancello tutto
  65. purge()
  66. #delete_objName("Fern") # in alternativa a purge()
  67.  
  68.  
  69. # array per    from_pydata
  70. verts = []
  71. faces = []
  72. edges = []
  73.  
  74. # numero iterazioni! Cambia qui per veder cosa succede.
  75. iter=int(2.5*(10**6))
  76.  
  77.  
  78. # azzeramenti iniziali  (z sarΓ  sempre 0)
  79. x = 0
  80. y = 0
  81. z = 0
  82.  
  83.  
  84. print()
  85. print (" <<<< Inizio calcolo per " + str(iter)+ " punti >>>>")
  86. # tempo di inizio
  87. tic = time.perf_counter()
  88.  
  89. # ora calcolo i punti
  90. for i in range(0, iter):
  91.     # genero numeri floating tra 0 ed 1 escluso
  92.     r = random.random()
  93.     # moltiplico x 100 per ottenere i valori per IF
  94.     r= r * 100
  95.     # salvo i valori correnti di x, y
  96.     xprec = x
  97.     yprec = y
  98.     if r < 1:
  99.         x = 0
  100.         y = 0.16 * yprec
  101.     elif r < 86:
  102.         x = 0.85 * xprec + 0.04 * yprec
  103.         y = -0.04 * xprec + 0.85 * yprec + 1.6
  104.     elif r < 93:
  105.         x = 0.20 * xprec - 0.26 * yprec
  106.         y = 0.23 * xprec + 0.22 * yprec + 1.6
  107.     else:
  108.         x = -0.15 * xprec + 0.28 * yprec
  109.         y = 0.26 * xprec + 0.24 * yprec + 0.44
  110.     # aggiorno i vertici
  111.     vert = (x,y,z)
  112.     verts.append(vert)
  113.  
  114. # fisso il tempo di esecuzione
  115. toc = time.perf_counter()
  116. print(f"Tempo esecuzione calcolo punti {toc - tic:0.4f} secondi")
  117. print ()
  118.  
  119. #creo mesh ed oggetto vuoti
  120. mymesh = bpy.data.meshes.new("Fern")
  121. myobject = bpy.data.objects.new("Fern",mymesh)
  122.  
  123.  
  124. tic = time.perf_counter()
  125. print()
  126. print ("Inizio costruzione mesh con from_pydata")
  127. # creo mesh con i vertici senza spigoli e facce
  128. mymesh.from_pydata(verts,edges,faces)
  129. mymesh.update(calc_edges=True)
  130.  
  131. toc = time.perf_counter()
  132. print(f"Tempo esecuzione from_pydata {toc - tic:0.4f} secondi")
  133. print ()
  134.  
  135.  
  136. #posiziono la mesh
  137. myobject.location = bpy.context.scene.cursor.location=[0,0,0]
  138. bpy.context.collection.objects.link(myobject)
  139.  
  140. #setto edit mode
  141. bpy.context.view_layer.objects.active = myobject
  142. bpy.ops.object.mode_set(mode='EDIT')
  143.  
  144.  
  145. tic = time.perf_counter()
  146. print()
  147. print ("Inizio rimozione punti duplicati")
  148. # cancello i vertici duplicati  (remove duplicate vertices)
  149. bpy.ops.mesh.remove_doubles()
  150. toc = time.perf_counter()
  151. print(f"Tempo esecuzione rimozione punti duplicati {toc - tic:0.4f} secondi")
  152. print ()
  153.  
  154.  
  155. # guarda nella console per vedere quanti ne ha cancellati
  156.  
  157. #setto object mode
  158. bpy.ops.object.mode_set(mode='OBJECT')
  159.  
  160. # seleziono il risultato
  161. select_obName("Fern")
  162.  
  163.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement