Anonymous (not verified) Thu, 04/06/2000 - 09:49 Forums: Other usage issuesA face (TopoDS_Face) is composed from wire (topoDS_Wire). How to distinguish inner wire (hole) from the outer wire ? Igor Feoktistov (not verified) Fri, 04/07/2000 - 08:02 Hello, Xavier you can use method BRepTools::OuterWire(face) to get outer wire of face, then select wires which are not equal outer wire. Second way is to use 2d classifier: TopoDS_Wire anInnerWire; TopExp_Explorer expw (aFace, TopAbs_WIRE); Standard_Real aFaceTolerance=BRep_Tool::Tolerance(aFace); TopLoc_Location Loc; Handle(Geom_Surface) Surf = BRep_Tool::Surface(TopoDS::Face(aFace), Loc); for ( ;expw.More();expw.Next()) { const TopoDS_Wire& aWire=TopoDS::Wire(expw.Current()); TopoDS_Face newFace; BRep_Builder BB; BB.MakeFace(newFace, Surf, Loc, aFaceTolerance); BB.Add(newFace, aWire); BRepTopAdaptor_FClass2d aClass2d(newFace, aFaceTolerance); TopAbs_State aState=aClass2d.PerformInfinitePoint(); if (aState==TopAbs_IN) { anInnerWire=aWire; .... } ..... For inner wire infinite point is inside wire. Best regards, Igor Log in to post comments
Fri, 04/07/2000 - 08:02
Hello, Xavier
you can use method BRepTools::OuterWire(face) to get outer wire of face, then select wires which are not equal outer wire.
Second way is to use 2d classifier:
TopoDS_Wire anInnerWire;
TopExp_Explorer expw (aFace, TopAbs_WIRE);
Standard_Real aFaceTolerance=BRep_Tool::Tolerance(aFace); TopLoc_Location Loc; Handle(Geom_Surface) Surf = BRep_Tool::Surface(TopoDS::Face(aFace), Loc); for ( ;expw.More();expw.Next()) { const TopoDS_Wire& aWire=TopoDS::Wire(expw.Current()); TopoDS_Face newFace; BRep_Builder BB; BB.MakeFace(newFace, Surf, Loc, aFaceTolerance); BB.Add(newFace, aWire); BRepTopAdaptor_FClass2d aClass2d(newFace, aFaceTolerance); TopAbs_State aState=aClass2d.PerformInfinitePoint(); if (aState==TopAbs_IN) {
anInnerWire=aWire;
.... } .....
For inner wire infinite point is inside wire.
Best regards, Igor