Get closed boundary curves of ON_Brep

(Alexander Schiftner) #1

I tried to find out how to get the closest boundary curves (if any) of an ON_Brep object, unsuccessfully. I’m looking for a function like Rhino.DuplicateSurfaceBorder in RhinoScript. Is there a C++ SDK function doing this?
This explanation of ON_Brep is nice, but unfortunately it doesn’t show the case of polysurfaces. I guess I need to traverse the boundary edges in order to achieve what I’m looking for.

(Menno Deij - van Rijswijk) #2

This seems to work for an open BREP. As you suggest, you need to traverse the boundary edges.
NOTE I was using the Rhino SDK, not OpenNURBS. But I don’t think I was using any proprietary stuff.

const ON_Brep* b; // obtained from document or elsewhere
ON_SimpleArray<const ON_Curve*> curves;
for(int i = 0; i < b->m_L.Count(); ++i)
    const ON_BrepLoop& bl = b->m_L[i];
    // get outer loops
    if (bl.m_type == ON_BrepLoop::TYPE::outer)
        for(int i = 0; i < bl.m_ti.Count(); ++i)
            const ON_BrepTrim& t = b->m_T[bl.m_ti[i]];
            if (t.m_ei < 0)
            // only look at boundary type trims
            if (t.m_type != ON_BrepTrim::TYPE::boundary)

            // get the brep edge for the trim
            const ON_BrepEdge& e = b->m_E[t.m_ei];
for(int i = 0; i < curves.Count(); ++i)
    const ON_Curve* pCrv = curves[i];

(Dale Fugier) #3

Here is my version:

  Duplicate the border curves of a Brep.
  InBreps   [in]  - The input Brep.
  OutCurves [out] - The border curves. Note carefully: memory for the curves 
                    is allocated and becomes the responsibility of the caller.
  The number of curves added to the OutCurves array..
  In order to to duplicate the border curves of surfaces and polysurfaces, 
  you need to search the object for naked edges. A naked edges is one that
  is not connect to other edges. Also, the OutCurves array will contain
  individual, unjoined curves. If you need them joined, use ON_JoinCurves.
int RhinoBrepDuplicateBorder(const ON_Brep* InBrep, ON_SimpleArray<ON_Curve*>& OutCurves)
  if (0 == InBrep)
    return 0;

  const int OutCurves_Count = OutCurves.Count();

  for (int i = 0; i < InBrep->m_E.Count(); i++)
    const ON_BrepEdge& edge = InBrep->m_E[i];
    // Find only the naked edges 
    if (edge.m_ti.Count() == 1 && edge.m_c3i >= 0)
      ON_Curve* curve = edge.DuplicateCurve();
      // Make the curve direction go in the natural
      // boundary loop direction so that the curve
      // directions come out consistantly
      if (InBrep->m_T[edge.m_ti[0]].m_bRev3d)
      if (InBrep->m_T[edge.m_ti[0]].Face()->m_bRev)

  return OutCurves.Count() - OutCurves_Count;

(Alexander Schiftner) #4

Many thanks for your help!