77from compas .tolerance import TOL
88
99from compas .geometry import Point
10+ from compas .geometry import NurbsSurface
1011from compas .datastructures import Mesh
1112from compas .utilities import memoize
1213
@@ -155,21 +156,27 @@ def surface_to_compas(surface):
155156 :class:`compas.geometry.Surface`
156157
157158 """
158- brep = Rhino .Geometry .Brep .TryConvertBrep (surface )
159+ if isinstance (surface , Rhino .DocObjects .RhinoObject ):
160+ surface = surface .Geometry
161+
162+ if not isinstance (surface , Rhino .Geometry .Brep ):
163+ brep = Rhino .Geometry .Brep .TryConvertBrep (surface )
164+ else :
165+ brep = surface
159166
160167 if brep .Surfaces .Count > 1 : # type: ignore
161- raise ConversionError ("Conversion of a BRep with multiple underlying surface is currently not supported." )
168+ raise ConversionError ("Conversion of a Brep with multiple underlying surface is currently not supported." )
162169
163- return Rhino . Geometry . NurbsSurface .from_rhino (brep .Surfaces [0 ])
170+ return NurbsSurface .from_native (brep .Surfaces [0 ])
164171
165172
166- def surface_to_compas_mesh (surface , cls = None , facefilter = None , cleanup = False ):
173+ def surface_to_compas_mesh (surface , facefilter = None , cleanup = False , cls = None ):
167174 """Convert the surface b-rep loops to a COMPAS mesh.
168175
169176 Parameters
170177 ----------
171- cls : :class:`compas.datastructures.Mesh`, optional
172- The type of COMPAS mesh .
178+ surface : :class:`Rhino.Geometry.Surface`
179+ A Rhino surface .
173180 facefilter : callable, optional
174181 A filter for selection which Brep faces to include.
175182 If provided, the filter should return True or False per face.
@@ -179,6 +186,8 @@ def surface_to_compas_mesh(surface, cls=None, facefilter=None, cleanup=False):
179186 Flag indicating to clean up the result.
180187 Cleaning up means to remove isolated faces and unused vertices.
181188 Default is False.
189+ cls : :class:`compas.datastructures.Mesh`, optional
190+ The type of COMPAS mesh.
182191
183192 Returns
184193 -------
@@ -208,10 +217,16 @@ def surface_to_compas_mesh(surface, cls=None, facefilter=None, cleanup=False):
208217 >>> scene.draw()
209218
210219 """
220+ if isinstance (surface , Rhino .DocObjects .RhinoObject ):
221+ surface = surface .Geometry
222+
211223 if not surface .HasBrepForm :
212224 return
213225
214- brep = Rhino .Geometry .Brep .TryConvertBrep (surface )
226+ if not isinstance (surface , Rhino .Geometry .Brep ):
227+ brep = Rhino .Geometry .Brep .TryConvertBrep (surface )
228+ else :
229+ brep = surface
215230
216231 if facefilter and callable (facefilter ):
217232 brepfaces = [face for face in brep .Faces if facefilter (face )]
@@ -224,16 +239,16 @@ def surface_to_compas_mesh(surface, cls=None, facefilter=None, cleanup=False):
224239 for face in brepfaces :
225240 loop = face .OuterLoop
226241 curve = loop .To3dCurve ()
227- segments = curve .Explode ()
228- a = segments [0 ].PointAtStart
229- b = segments [0 ].PointAtEnd
242+ segments = list ( curve .Explode () )
243+ a = point_to_compas ( segments [0 ].PointAtStart )
244+ b = point_to_compas ( segments [0 ].PointAtEnd )
230245 a_gkey = TOL .geometric_key (a )
231246 b_gkey = TOL .geometric_key (b )
232247 gkey_xyz [a_gkey ] = a
233248 gkey_xyz [b_gkey ] = b
234249 face = [a_gkey , b_gkey ]
235250 for segment in segments [1 :- 1 ]:
236- b = segment .PointAtEnd
251+ b = point_to_compas ( segment .PointAtEnd )
237252 b_gkey = TOL .geometric_key (b )
238253 face .append (b_gkey )
239254 gkey_xyz [b_gkey ] = b
@@ -274,6 +289,8 @@ def surface_to_compas_quadmesh(surface, nu, nv=None, weld=False, facefilter=None
274289
275290 Parameters
276291 ----------
292+ surface: :class:`Rhino.Geometry.Surface`
293+ A Rhino surface.
277294 nu: int
278295 The number of faces in the u direction.
279296 nv: int, optional
@@ -298,10 +315,16 @@ def surface_to_compas_quadmesh(surface, nu, nv=None, weld=False, facefilter=None
298315 nv = nv or nu
299316 cls = cls or Mesh
300317
318+ if isinstance (surface , Rhino .DocObjects .RhinoObject ):
319+ surface = surface .Geometry
320+
301321 if not surface .HasBrepForm :
302322 return
303323
304- brep = Rhino .Geometry .Brep .TryConvertBrep (surface )
324+ if not isinstance (surface , Rhino .Geometry .Brep ):
325+ brep = Rhino .Geometry .Brep .TryConvertBrep (surface )
326+ else :
327+ brep = surface
305328
306329 if facefilter and callable (facefilter ):
307330 faces = [face for face in brep .Faces if facefilter (face )]
0 commit comments