algorithmic modeling for Rhino
Hello,
I am trying to automate a simulation and optimization workflow to generate and test artificial coral reef structures. I am trying to adapt a Rhino Python script that I found here:
http://golancourses.net/2013/projects/study-for-biomimetic-heat-sin...
https://github.com/jlopezbi/DLA_heatSink/
This script uses diffusion-limited aggregation to simulate coral growth from a seed mesh. The parameters, such as the size, speed and number of particles, are hard coded into the original script, but I will be modifying them in grasshopper, writing them into a text file, and parsing that file in my modified DLA script each time I run the simulation. I will then reference each generated coral mesh back into Grasshopper, analyze it's structural performance (among other metrics) using Karamba, and optimize using Galapagos.
I am relatively new to Python scripting though, and I am having a bit of trouble modifying the method for referencing the seed mesh. In the original script, the author does this with the following line:
rc, objRef = Rhino.Input.RhinoGet.GetOneObject("select seedMesh",False,filter)
This prompts me to select a mesh in Rhino, and it returns an ObjRef object. In order to automate the process, I will need to select the mesh another way. At the moment I am trying to use scriptcontext.docs.Objects.FindByLayer to select the mesh, and that seems to be working. However, in order to get the rest of the script to work I believe I still need an object reference. I am trying to use Rhino.DocObjects.ObjRef(RhinoObject), but when I pass in the mesh I get a message that says "'ObjRef' object is not iterable". Can anybody help me understand what is going on, or point me to a better way to do what I need? I have attached the original script, my edited version, and the Rhino file below.
Best regards,
Bill Bodell
Tags:
Bill,
I don't think you need the objRef as you're now using the 'FindByLayer' method.
You will need to filter everything separately though as the 'FindByLayer' method doesn't have a filter variable and will simply collect everything based on the layer name you give it. Further, the method collects 'Rhino.DocObjects.MeshObjects' as opposed to a 'Rhino.DocObjects.ObjectType.Mesh'. To get the mesh from a mesh object you can use 'MeshObject.Geometry'.
I've used a list comprehension below to filter out the meshes from your layer but it should work.
import Rhino
import scriptcontext as sc
layername = """Insert layer name here."""
layerobjs = sc.doc.Objects.FindByLayer(layername)
meshes = [mesh.Geometry for mesh in layerobjs if type(mesh) == Rhino.DocObjects.MeshObject]
For clarity the list comprehension is the same as the following, just more 'pythonic':
meshes = []
for obj in layerobjs:
if type(obj) == Rhino.DocObjects.MeshObject:
meshes.append(obj.Geometry)
Good luck.
Welcome to
Grasshopper
Added by Parametric House 0 Comments 0 Likes
Added by Parametric House 0 Comments 0 Likes
Added by Parametric House 0 Comments 0 Likes
Added by Parametric House 0 Comments 0 Likes
© 2024 Created by Scott Davidson. Powered by