Getting ordered edges by traversing BRep Loop edges

<?xml encoding=”UTF-8″>By Balaji Ramamoorthy

When traversing the edges of a face loop using BRep API, the edges may not be in order such that the end point of the previous edge coincides with the start point of the next edge. This is because, the edges are shared between faces, and the same edge is returned when the face’s edge loop is traversed. As the start and end points of the edge remains unchanged, it will only match the orientation for one of the faces.

Here is a sample code to retrieve the edge information and orient them as per the loop being iterated.

 ads_name eName; 
 ads_point pt; 
 
 <span>if</span><span> ( RTNORM != </span>
 	acedEntSel( L<span>"\nSelect a Solid: "</span><span> , </span>
 				eName, pt)) 
 <span>return</span><span> ; </span>
 
 AcDbObjectId id; 
 acdbGetObjectId( id, eName); 
 
 AcDb3dSolid* pSolid; 
 acdbOpenObject(pSolid, id, AcDb::kForRead); 
 
 <span>if</span><span> (pSolid == NULL ) <span>return</span><span> ; </span></span>
 
 AcBrBrep pBrep; 
 pBrep.setSubentPath( 
 	AcDbFullSubentPath( id, kNullSubentId )); 
 
 AcBr::ErrorStatus returnValue = AcBr::eOk; 
 
 AcBrBrepFaceTraverser brepFaceTrav; 
 <span>if</span><span>  (brepFaceTrav.setBrep(pBrep) != AcBr::eOk) </span>
 <span>{</span> 
 	acutPrintf(ACRX_T(
 		<span>"\n Error in AcBrBrepFaceTraverser::setBrep:"</span><span> ));</span>
 	<span>return</span><span> ; </span>
 <span>}</span> 
 
 <span>int</span><span>  faceCount = 0; </span>
 <span>while</span><span>  (!brepFaceTrav.done() && (returnValue == AcBr::eOk))</span>
 <span>{</span> 
 	faceCount++; 
 
 	AcBrFace face; 
 	<span>if</span><span>  ( brepFaceTrav.getFace(face) </span>
 		!= AcBr::ErrorStatus::eOk) 
 	<span>{</span>
 		<span>continue</span><span> ;</span>
 	<span>}</span>
 
 	AcGeSurface *pGeSurface = NULL;
 	face.getSurface(pGeSurface);
 
 	AcGeInterval intervalU, intervalV;
 	pGeSurface->getEnvelope(intervalU, intervalV);
 						
 	AcBrFaceLoopTraverser faLoTrav; 
 	<span>for</span><span> ( faLoTrav.setFace(face); </span>
 		!faLoTrav.done(); faLoTrav.next() ) 
 	<span>{</span> 
 		AcBrLoop lp; 
 		faLoTrav.getLoop(lp); 
 		AcBr::LoopType type; 
 
 		acutPrintf(ACRX_T(<span>"\nFACE : %d"</span><span> ), faceCount);</span>
 
 		AcBrLoopEdgeTraverser loEdTrav; 
 		<span>if</span><span> ( loEdTrav.setLoop(faLoTrav) == AcBr::eOk) </span>
 		<span>{</span> 
 			<span>int</span><span>  edgeCount = 0;</span>
 			AcGePoint2dArray verts; 
 			AcGeVoidPointerArray edgeArray; 
 			<span>for</span><span> (;! loEdTrav.done(); loEdTrav.next()) </span>
 			<span>{</span> 
 				edgeCount++;
 
 				AcBrEdge edge; 
 				loEdTrav.getEdge(edge); 
 
 				AcBrVertex start;      
 				edge.getVertex1( start );   
 				AcGePoint3d stPt3d;            
 				start.getPoint( stPt3d );  
 
 				AcBrVertex end; 
 				edge.getVertex2( end );   
 				AcGePoint3d endPt3d;            
 				end.getPoint( endPt3d ); 
 
 				Adesk::Boolean orient 
 					= Adesk::kFalse;
 				loEdTrav.getEdgeOrientToLoop(orient);
 				<span>if</span><span> (orient)</span>
 				<span>{</span>
 				acutPrintf(ACRX_T(<span>"\nEdge %d: </span><span> </span>
 					(%3.1f %3.1f %3.1f) 
 					- (%3.1f %3.1f %3.1f)<span>"), </span><span> </span>
 					edgeCount, stPt3d.x, 
 					stPt3d.y, stPt3d.z, 
 					endPt3d.x, endPt3d.y, 
 					endPt3d.z);
 				<span>}</span>
 				<span>else</span><span> </span>
 				<span>{</span>
 				acutPrintf(ACRX_T(<span>"\nEdge %d: </span><span> </span>
 					(%3.1f %3.1f %3.1f) 
 					- (%3.1f %3.1f %3.1f)<span>"),</span><span> </span>
 					edgeCount, endPt3d.x, 
 					endPt3d.y, endPt3d.z, 
 					stPt3d.x, stPt3d.y, 
 					stPt3d.z);
 				<span>}</span>
 			<span>}</span> 
 		<span>}</span> 
 	<span>}</span> 
 	returnValue = brepFaceTrav.next(); 
 <span>}</span> 
 

As an example, here is an output of a face loop :

 <span>// Considering edge orientation to loop</span><span> </span>
 FACE : 3
 Edge 1: (0.0 0.0 30.0) - (0.0 0.0 0.0)
 Edge 2: (0.0 0.0 0.0) - (10.0 0.0 0.0)
 Edge 3: (10.0 0.0 0.0) - (10.0 0.0 30.0)
 Edge 4: (10.0 0.0 30.0) - (0.0 0.0 30.0)
 
 <span>// Without considering edge orientation to loop</span><span> </span>
 FACE : 3
 Edge 1: (0.0 0.0 30.0) - (0.0 0.0 0.0)
 Edge 2: (10.0 0.0 0.0) - (0.0 0.0 0.0)
 Edge 3: (10.0 0.0 30.0) - (10.0 0.0 0.0)
 Edge 4: (0.0 0.0 30.0) - (10.0 0.0 30.0)
 


Comments

One response to “Getting ordered edges by traversing BRep Loop edges”

  1. How do you do that in .NET? There is no BRepFaceLoopTraverser.

Leave a Reply to MaxenceCancel reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading