Rhinocommon Python with StrongBox Example

Continuing the discussion from How can I use Plane.FitPlaneToPoints from Python correctly?:

I was also confused when I initially tried to use a function that modified an input variable in-place, using rhinocommon and Python. I got this error when I tried passing in a python boolean to Mesh.TopologyEdges.GetEdgesForFace(Int32,Boolean[]):

TypeError: expected StrongBox[Array[bool]], got bool

So, to avoid similar confusion, here is an example using the Mesh.TopologyEdges.GetEdgesForFace(Int32,Boolean[])
method. The method “gets the indices of the edges that surround the given face.”

import clr
import System
import Rhino.Geometry as geom
import rhinoscriptsyntax as rs
import scriptcontext

def get_edges_orientations_for_face(mesh,face):
    '''
    returns a list of tuples: [(edgeIndex,alignedWithFace),...]
    where edgeIndex is the index of the TopologyEdge in the mesh
    and alignedWithFace is a boolean which is True if the edge direction is consistent with the face
    '''
    orientations = clr.StrongBox[System.Array[bool]]()
    edges =  mesh.TopologyEdges.GetEdgesForFace(face,orientations)
    edges = list(edges)
    orientations = list(orientations.Value)
    edges_with_orientations = zip(edges,orientations)
    return edges_with_orientations

def make_mesh():
    '''
    creates an upright square mesh with two triangular faces
    '''
    vertices = []
    vertices.append((0.0,0.0,0.0))
    vertices.append((5.0,0.0,0.0))
    vertices.append((5.0,0.0,5.0))
    vertices.append((0.0,0.0,5.0))
    face_vertices = []
    face_vertices.append((0,1,3,3))
    face_vertices.append((1,2,3,3))
    rhino_mesh = create_mesh(vertices,face_vertices)
    return rhino_mesh

def create_mesh(vertices,face_vertices):
    '''add a mesh to doc and get the Rhino.Geometry.Mesh object''' 
    mesh_GUID = rs.AddMesh( vertices, face_vertices )
    obj = scriptcontext.doc.Objects.Find(mesh_GUID)
    return obj.Geometry

if __name__ == "__main__":
    mesh = make_mesh()
    face = 0
    edges_with_orientations = get_edges_orientations_for_face(mesh,face)
    print "for face {}, got oriented edge tuples: {}".format(face,edges_with_orientations)

I found it very helpful to look at IronPython documentation. The section on Typed Arrays helped significantly.

4 Likes