1 // Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // File : GEOMAlgo_AlgoTools.cxx
24 // Author : Peter KURNEV
26 #include <GEOMAlgo_AlgoTools.hxx>
29 #include <gp_Pnt2d.hxx>
30 #include <gp_Dir2d.hxx>
31 #include <Bnd_Box.hxx>
33 #include <Geom2d_Curve.hxx>
34 #include <Geom2d_TrimmedCurve.hxx>
35 #include <Geom2d_Line.hxx>
36 #include <Geom2d_TrimmedCurve.hxx>
38 #include <Geom2dHatch_Intersector.hxx>
39 #include <Geom2dHatch_Hatcher.hxx>
41 #include <Geom2dAdaptor_Curve.hxx>
42 #include <HatchGen_Domain.hxx>
44 #include <Geom_Curve.hxx>
45 #include <Geom_Surface.hxx>
47 #include <GeomAdaptor_Surface.hxx>
49 #include <GeomAPI_ProjectPointOnSurf.hxx>
50 #include <GeomAPI_ProjectPointOnCurve.hxx>
52 #include <Poly_Triangulation.hxx>
54 #include <TopAbs_Orientation.hxx>
56 #include <TopLoc_Location.hxx>
59 #include <TopoDS_Iterator.hxx>
60 #include <TopoDS_Face.hxx>
61 #include <TopoDS_Edge.hxx>
63 #include <TopExp_Explorer.hxx>
65 #include <BRep_Tool.hxx>
66 #include <BRep_Builder.hxx>
68 #include <BRepTools.hxx>
69 #include <BRepBndLib.hxx>
70 #include <BRepMesh_IncrementalMesh.hxx>
72 #include <IntTools_Tools.hxx>
74 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
75 #include <TopTools_ListOfShape.hxx>
77 #include <TopTools_ListIteratorOfListOfShape.hxx>
78 #include <TopTools_IndexedMapOfShape.hxx>
79 #include <TopAbs_ShapeEnum.hxx>
81 #include <IntTools_Tools.hxx>
83 #include <BOPTools_AlgoTools3D.hxx>
84 #include <BOPTools_AlgoTools2D.hxx>
86 #include <GEOMAlgo_PassKeyShape.hxx>
90 void GetCount(const TopoDS_Shape& aS,
91 Standard_Integer& iCnt);
93 void CopySource(const TopoDS_Shape& aS,
94 TopTools_IndexedDataMapOfShapeShape& aMapSS,
97 //=======================================================================
98 //function : CopyShape
100 //=======================================================================
101 void GEOMAlgo_AlgoTools::CopyShape(const TopoDS_Shape& aS,
104 TopTools_IndexedDataMapOfShapeShape aMapSS;
106 CopySource(aS, aMapSS, aSC);
108 //=======================================================================
109 //function : CopyShape
111 //=======================================================================
112 void GEOMAlgo_AlgoTools::CopyShape(const TopoDS_Shape& aS,
114 TopTools_IndexedDataMapOfShapeShape& aMapSS)
116 CopySource(aS, aMapSS, aSC);
118 //=======================================================================
119 //function : CopySource
121 //=======================================================================
122 void CopySource(const TopoDS_Shape& aS,
123 TopTools_IndexedDataMapOfShapeShape& aMapSS,
126 Standard_Boolean bFree;
134 if (aMapSS.Contains(aS)) {
135 aSC=aMapSS.ChangeFromKey(aS);
136 aSC.Orientation(aS.Orientation());
140 aSC=aS.EmptyCopied();
145 aSC.Free(Standard_True);
147 if (aT==TopAbs_EDGE){
148 TopAbs_Orientation aOr;
150 aOr=aS.Orientation();
151 if(aOr==TopAbs_INTERNAL) {
152 aSF.Orientation(TopAbs_FORWARD);
156 for (; aIt.More(); aIt.Next()) {
159 const TopoDS_Shape& aSx=aIt.Value();
161 CopySource (aSx, aMapSS, aSCx);
163 aSCx.Orientation(aSx.Orientation());
168 //=======================================================================
169 //function : FaceNormal
171 //=======================================================================
172 void GEOMAlgo_AlgoTools::FaceNormal (const TopoDS_Face& aF,
173 const Standard_Real U,
174 const Standard_Real V,
179 Handle(Geom_Surface) aSurface;
181 aSurface=BRep_Tool::Surface(aF);
182 aSurface->D1 (U, V, aPnt, aD1U, aD1V);
183 aN=aD1U.Crossed(aD1V);
185 if (aF.Orientation() == TopAbs_REVERSED){
190 //=======================================================================
191 //function : BuildPCurveForEdgeOnFace
193 //=======================================================================
194 Standard_Integer GEOMAlgo_AlgoTools::BuildPCurveForEdgeOnFace
195 (const TopoDS_Edge& aEold,
196 const TopoDS_Edge& aEnew,
197 const TopoDS_Face& aF,
198 const Handle(BOPInt_Context)& aCtx)
200 Standard_Boolean bIsClosed, bUClosed, bHasOld;
201 Standard_Integer iRet, aNbPoints;
202 Standard_Real aTS, aTS1, aTS2, aT, aT1, aT2, aScPr, aTol;
203 Standard_Real aU, aV, aUS1, aVS1, aUS2, aVS2;
205 gp_Pnt2d aP2DS1, aP2DS2, aP2D;
206 gp_Vec2d aV2DS1, aV2DS2;
207 Handle(Geom2d_Curve) aC2D, aC2DS1, aC2DS2;
208 Handle(Geom_Surface) aS;
213 bHasOld=BOPTools_AlgoTools2D::HasCurveOnSurface(aEnew, aF, aC2D, aT1, aT2, aTol);
218 BOPTools_AlgoTools2D::BuildPCurveForEdgeOnFace(aEnew, aF);
219 aC2D=BRep_Tool::CurveOnSurface(aEnew, aF, aT1, aT2);
225 bIsClosed=BRep_Tool::IsClosed(aEold, aF);
232 // 1. bUClosed - direction of closeness
235 aES.Orientation(TopAbs_FORWARD);
236 aC2DS1=BRep_Tool::CurveOnSurface(aES, aF, aTS1, aTS2);
238 aES.Orientation(TopAbs_REVERSED);
239 aC2DS2=BRep_Tool::CurveOnSurface(aES, aF, aTS1, aTS2);
241 aTS=IntTools_Tools::IntermediatePoint(aTS1, aTS2);
243 aC2DS1->D1(aTS, aP2DS1, aV2DS1);
244 aC2DS2->D1(aTS, aP2DS2, aV2DS2);
246 gp_Vec2d aV2DS12(aP2DS1, aP2DS2);
247 gp_Dir2d aD2DS12(aV2DS12);
248 const gp_Dir2d& aD2DX=gp::DX2d();
251 bUClosed=Standard_True;
252 if (fabs(aScPr) < aTol) {
256 // 2. aP2D - point on curve aC2D, that corresponds to aP2DS1
257 aP2DS1.Coord(aUS1, aVS1);
258 aP2DS2.Coord(aUS2, aVS2);
260 aS=BRep_Tool::Surface(aF);
261 aS->D0(aUS1, aVS1, aP);
263 GeomAPI_ProjectPointOnCurve& aProjPC=aCtx->ProjPC(aEnew);
266 aNbPoints=aProjPC.NbPoints();
272 aT=aProjPC.LowerDistanceParameter();
275 // 3. Build the second 2D curve
276 Standard_Boolean bRevOrder;
277 gp_Vec2d aV2DT, aV2D;
278 Handle(Geom2d_Curve) aC2Dnew;
279 Handle(Geom2d_TrimmedCurve) aC2DTnew;
282 aC2D->D1(aT, aP2D, aV2D);
285 aC2Dnew=Handle(Geom2d_Curve)::DownCast(aC2D->Copy());
286 aC2DTnew = new Geom2d_TrimmedCurve(aC2Dnew, aT1, aT2);
289 if (!bUClosed) { // V Closed
290 if (fabs(aV-aVS2)<aTol) {
295 if (fabs(aU-aUS2)<aTol) {
300 aC2DTnew->Translate(aV2DT);
302 // 4 Order the 2D curves
303 bRevOrder=Standard_False;
306 bRevOrder=!bRevOrder;
309 // 5. Update the edge
310 aTol=BRep_Tool::Tolerance(aEnew);
312 aBB.UpdateEdge(aEnew, aC2D, aC2DTnew, aF, aTol);
315 aBB.UpdateEdge(aEnew, aC2DTnew, aC2D , aF, aTol);
320 //////////////////////////////////////////////////////////////////////////
321 //=======================================================================
322 // function: MakeContainer
324 //=======================================================================
325 void GEOMAlgo_AlgoTools::MakeContainer(const TopAbs_ShapeEnum theType,
331 case TopAbs_COMPOUND:{
333 aBB.MakeCompound(aC);
338 case TopAbs_COMPSOLID:{
339 TopoDS_CompSolid aCS;
340 aBB.MakeCompSolid(aCS);
347 aBB.MakeSolid(aSolid);
355 aBB.MakeShell(aShell);
371 //=======================================================================
372 //function : IsUPeriodic
374 //=======================================================================
375 Standard_Boolean GEOMAlgo_AlgoTools::IsUPeriodic(const Handle(Geom_Surface) &aS)
377 Standard_Boolean bRet;
378 GeomAbs_SurfaceType aType;
379 GeomAdaptor_Surface aGAS;
382 aType=aGAS.GetType();
383 bRet=(aType==GeomAbs_Cylinder||
384 aType==GeomAbs_Cone ||
385 aType==GeomAbs_Sphere);
390 //=======================================================================
391 //function : RefinePCurveForEdgeOnFace
393 //=======================================================================
394 void GEOMAlgo_AlgoTools::RefinePCurveForEdgeOnFace(const TopoDS_Edge& aE,
395 const TopoDS_Face& aF,
396 const Standard_Real aUMin,
397 const Standard_Real aUMax)
399 Standard_Real aT1, aT2, aTx, aUx, aTol;
401 Handle(Geom_Surface) aS;
402 Handle(Geom2d_Curve) aC2D;
405 aC2D=BRep_Tool::CurveOnSurface(aE, aF, aT1, aT2);
406 if (!aC2D.IsNull()) {
407 if (BRep_Tool::IsClosed(aE, aF)) {
410 aTx=IntTools_Tools::IntermediatePoint(aT1, aT2);
413 if (aUx < aUMin || aUx > aUMax) {
415 Handle(Geom2d_Curve) aC2Dx;
417 aTol=BRep_Tool::Tolerance(aE);
418 aBB.UpdateEdge(aE, aC2Dx, aF, aTol);
422 //=======================================================================
423 //function :IsSplitToReverse
425 //=======================================================================
426 Standard_Boolean GEOMAlgo_AlgoTools::IsSplitToReverse
427 (const TopoDS_Edge& aEF1,
428 const TopoDS_Edge& aEF2,
429 const Handle(BOPInt_Context)& aContext)
431 Standard_Boolean aFlag;
432 Standard_Real aT1, aT2, aScPr, a, b;
437 Handle(Geom_Curve)aC1=BRep_Tool::Curve(aEF1, a, b);
438 aT1=IntTools_Tools::IntermediatePoint(a, b);
440 aFlag=BOPTools_AlgoTools2D::EdgeTangent(aEF1, aT1, aV1);
443 return Standard_False;
448 aFlag=aContext->ProjectPointOnEdge(aP, aEF2, aT2);
450 return Standard_False;
453 aFlag=BOPTools_AlgoTools2D::EdgeTangent(aEF2, aT2, aV2);
455 return Standard_False;
466 //=======================================================================
467 //function : ProjectPointOnShape
469 //=======================================================================
470 Standard_Boolean GEOMAlgo_AlgoTools::ProjectPointOnShape
472 const TopoDS_Shape& aS,
474 const Handle(BOPInt_Context)& aCtx)
476 Standard_Boolean bIsDone = Standard_False;
478 TopAbs_ShapeEnum aType;
480 aType = aS.ShapeType();
485 const TopoDS_Edge& aE2 = TopoDS::Edge(aS);
487 if (BRep_Tool::Degenerated(aE2)) { // jfa
488 return Standard_True;
492 Handle(Geom_Curve) aC3D = BRep_Tool::Curve (aE2, f, l);
494 return Standard_True;
496 bIsDone = aCtx->ProjectPointOnEdge(aP1, aE2, aT2);
502 GEOMAlgo_AlgoTools::PointOnEdge(aE2, aT2, aP2);
508 const TopoDS_Face& aF2 = TopoDS::Face(aS);
509 GeomAPI_ProjectPointOnSurf& aProj = aCtx->ProjPS(aF2);
512 bIsDone = aProj.IsDone();
517 aP2 = aProj.NearestPoint();
527 //=======================================================================
528 //function : PointOnEdge
530 //=======================================================================
531 void GEOMAlgo_AlgoTools::PointOnEdge(const TopoDS_Edge& aE,
534 Standard_Real aTx, aT1, aT2;
536 BRep_Tool::Curve(aE, aT1, aT2);
537 aTx=IntTools_Tools::IntermediatePoint(aT1, aT2);
538 GEOMAlgo_AlgoTools::PointOnEdge(aE, aTx, aP3D);
540 //=======================================================================
541 //function : PointOnEdge
543 //=======================================================================
544 void GEOMAlgo_AlgoTools::PointOnEdge(const TopoDS_Edge& aE,
545 const Standard_Real aT,
548 Standard_Real aT1, aT2;
549 Handle(Geom_Curve) aC3D;
551 aC3D=BRep_Tool::Curve(aE, aT1, aT2);
554 //=======================================================================
555 //function : PointOnFace
557 //=======================================================================
558 void GEOMAlgo_AlgoTools::PointOnFace(const TopoDS_Face& aF,
559 const Standard_Real aU,
560 const Standard_Real aV,
563 Handle(Geom_Surface) aS;
565 aS=BRep_Tool::Surface(aF);
566 aS->D0(aU, aV, aP3D);
568 //=======================================================================
569 //function : PointOnFace
571 //=======================================================================
572 void GEOMAlgo_AlgoTools::PointOnFace(const TopoDS_Face& aF,
575 Standard_Real aU, aV, aUMin, aUMax, aVMin, aVMax;
577 BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax);
579 aU=IntTools_Tools::IntermediatePoint(aUMin, aUMax);
580 aV=IntTools_Tools::IntermediatePoint(aVMin, aVMax);
582 GEOMAlgo_AlgoTools::PointOnFace(aF, aU, aV, aP3D);
584 //=======================================================================
585 //function : PointOnShape
587 //=======================================================================
588 void GEOMAlgo_AlgoTools::PointOnShape(const TopoDS_Shape& aS,
591 TopAbs_ShapeEnum aType;
593 aP3D.SetCoord(99.,99.,99.);
594 aType=aS.ShapeType();
597 const TopoDS_Edge& aE=TopoDS::Edge(aS);
598 GEOMAlgo_AlgoTools::PointOnEdge(aE, aP3D);
603 const TopoDS_Face& aF=TopoDS::Face(aS);
604 GEOMAlgo_AlgoTools::PointOnFace(aF, aP3D);
612 //=======================================================================
613 //function : FindSDShapes
615 //=======================================================================
616 Standard_Integer GEOMAlgo_AlgoTools::FindSDShapes
617 (const TopoDS_Shape& aE1,
618 const TopTools_ListOfShape& aLE,
619 const Standard_Real aTol,
620 TopTools_ListOfShape& aLESD,
621 const Handle(BOPInt_Context)& aCtx)
623 Standard_Boolean bIsDone;
624 Standard_Real aTol2, aD2;
626 TopTools_ListIteratorOfListOfShape aIt;
629 GEOMAlgo_AlgoTools::PointOnShape(aE1, aP1);
632 for (; aIt.More(); aIt.Next()) {
633 const TopoDS_Shape& aE2=aIt.Value();
634 if (aE2.IsSame(aE1)) {
638 bIsDone=GEOMAlgo_AlgoTools::ProjectPointOnShape(aP1, aE2, aP2, aCtx);
641 continue; // jfa BUG 20361
643 aD2=aP1.SquareDistance(aP2);
652 //=======================================================================
653 //function : FindSDShapes
655 //=======================================================================
656 Standard_Integer GEOMAlgo_AlgoTools::FindSDShapes
657 (const TopTools_ListOfShape& aLE,
658 const Standard_Real aTol,
659 TopTools_IndexedDataMapOfShapeListOfShape& aMEE,
660 const Handle(BOPInt_Context)& aCtx)
662 Standard_Integer aNbE, aNbEProcessed, aNbESD, iErr;
663 TopTools_ListOfShape aLESD;
664 TopTools_ListIteratorOfListOfShape aIt, aIt1;
665 TopTools_IndexedMapOfShape aMProcessed;
666 TopAbs_ShapeEnum aType;
673 return 0; // Nothing to do
677 aNbEProcessed=aMProcessed.Extent();
678 if (aNbEProcessed==aNbE) {
683 for (; aIt.More(); aIt.Next()) {
684 const TopoDS_Shape& aS=aIt.Value();
686 if (aMProcessed.Contains(aS)) {
690 aType=aS.ShapeType();
691 if (aType==TopAbs_EDGE) {
692 const TopoDS_Edge& aE=TopoDS::Edge(aS);
693 if (BRep_Tool::Degenerated(aE)) {
700 iErr=GEOMAlgo_AlgoTools::FindSDShapes(aS, aLE, aTol, aLESD, aCtx);
705 aNbESD=aLESD.Extent();
712 aIt1.Initialize(aLESD);
713 for (; aIt1.More(); aIt1.Next()) {
714 const TopoDS_Shape& aE1=aIt1.Value();
715 aMProcessed.Add(aE1);
721 //=======================================================================
722 //function : RefineSDShapes
724 //=======================================================================
725 Standard_Integer GEOMAlgo_AlgoTools::RefineSDShapes
726 (GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape& aMPKLE,
727 const Standard_Real aTol,
728 const Handle(BOPInt_Context)& aCtx)
730 Standard_Integer i, aNbE, iErr, j, aNbEE, aNbToAdd;
731 TopTools_IndexedDataMapOfShapeListOfShape aMEE, aMSDE, aMEToAdd;
735 aNbE=aMPKLE.Extent();
736 for (i=1; i<=aNbE; ++i) {
737 TopTools_ListOfShape& aLSDE=aMPKLE.ChangeFromIndex(i);
740 iErr=GEOMAlgo_AlgoTools::FindSDShapes(aLSDE, aTol, aMEE, aCtx);
747 continue; // nothing to do
750 for (j=1; j<=aNbEE; ++j) {
751 TopTools_ListOfShape& aLEE=aMEE.ChangeFromIndex(j);
758 const TopoDS_Shape& aE1=aLEE.First();
759 aMEToAdd.Add(aE1, aLEE);
764 aNbToAdd=aMEToAdd.Extent();
769 for (i=1; i<=aNbToAdd; ++i) {
770 GEOMAlgo_PassKeyShape aPKE1;
772 const TopoDS_Shape& aE1=aMEToAdd.FindKey(i);
773 const TopTools_ListOfShape& aLE=aMEToAdd(i);
775 aPKE1.SetShapes(aE1);
776 aMPKLE.Add(aPKE1, aLE);
781 //=======================================================================
782 //function : BuildTriangulation
784 //=======================================================================
786 GEOMAlgo_AlgoTools::BuildTriangulation (const TopoDS_Shape& theShape)
788 // calculate deflection
789 Standard_Real aDeviationCoefficient = 0.001;
792 BRepBndLib::Add(theShape, B);
793 Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
794 B.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
796 Standard_Real dx = aXmax - aXmin, dy = aYmax - aYmin, dz = aZmax - aZmin;
797 Standard_Real aDeflection = Max(Max(dx, dy), dz) * aDeviationCoefficient * 4;
798 Standard_Real aHLRAngle = 0.349066;
800 // build triangulation
801 BRepMesh_IncrementalMesh Inc (theShape, aDeflection, Standard_False, aHLRAngle);
803 // check triangulation
804 bool isTriangulation = true;
806 TopExp_Explorer exp (theShape, TopAbs_FACE);
809 TopLoc_Location aTopLoc;
810 Handle(Poly_Triangulation) aTRF;
811 aTRF = BRep_Tool::Triangulation(TopoDS::Face(exp.Current()), aTopLoc);
813 isTriangulation = false;
816 else // no faces, try edges
818 TopExp_Explorer expe (theShape, TopAbs_EDGE);
820 isTriangulation = false;
823 TopLoc_Location aLoc;
824 Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(TopoDS::Edge(expe.Current()), aLoc);
826 isTriangulation = false;
830 return isTriangulation;
833 //=======================================================================
834 //function : IsCompositeShape
836 //=======================================================================
837 Standard_Boolean GEOMAlgo_AlgoTools::IsCompositeShape(const TopoDS_Shape& aS)
839 Standard_Boolean bRet;
840 Standard_Integer iCnt;
849 //=======================================================================
850 //function : GetCount
852 //=======================================================================
853 void GetCount(const TopoDS_Shape& aS,
854 Standard_Integer& iCnt)
857 TopAbs_ShapeEnum aTS;
861 if (aTS==TopAbs_SHAPE) {
864 if (aTS!=TopAbs_COMPOUND) {
870 for (; aIt.More(); aIt.Next()) {
871 const TopoDS_Shape& aSx=aIt.Value();
875 //=======================================================================
876 //function : PntInFace
878 //=======================================================================
879 Standard_Integer GEOMAlgo_AlgoTools::PntInFace(const TopoDS_Face& aF,
883 Standard_Boolean bIsDone, bHasFirstPoint, bHasSecondPoint;
884 Standard_Integer iErr, aIx, aNbDomains, i;
885 Standard_Real aUMin, aUMax, aVMin, aVMax;
886 Standard_Real aVx, aUx, aV1, aV2, aU1, aU2, aEpsT;
887 Standard_Real aTotArcIntr, aTolTangfIntr, aTolHatch2D, aTolHatch3D;
888 gp_Dir2d aD2D (0., 1.);
891 Handle(Geom2d_Curve) aC2D;
892 Handle(Geom2d_TrimmedCurve) aCT2D;
893 Handle(Geom2d_Line) aL2D;
894 Handle(Geom_Surface) aS;
895 TopAbs_Orientation aOrE;
897 TopExp_Explorer aExp;
902 aTolTangfIntr=1.e-10;
904 Geom2dHatch_Intersector aIntr(aTotArcIntr, aTolTangfIntr);
905 Geom2dHatch_Hatcher aHatcher(aIntr,
906 aTolHatch2D, aTolHatch3D,
907 Standard_True, Standard_False);
913 aFF.Orientation (TopAbs_FORWARD);
915 aS=BRep_Tool::Surface(aFF);
916 BRepTools::UVBounds(aFF, aUMin, aUMax, aVMin, aVMax);
919 aExp.Init (aFF, TopAbs_EDGE);
920 for (; aExp.More() ; aExp.Next()) {
921 const TopoDS_Edge& aE=*((TopoDS_Edge*)&aExp.Current());
922 aOrE=aE.Orientation();
924 aC2D=BRep_Tool::CurveOnSurface (aE, aFF, aU1, aU2);
925 if (aC2D.IsNull() ) {
929 if (fabs(aU1-aU2) < aEpsT) {
934 aCT2D=new Geom2d_TrimmedCurve(aC2D, aU1, aU2);
935 aHatcher.AddElement(aCT2D, aOrE);
936 }// for (; aExp.More() ; aExp.Next()) {
939 aUx=IntTools_Tools::IntermediatePoint(aUMin, aUMax);
940 aP2D.SetCoord(aUx, 0.);
941 aL2D=new Geom2d_Line (aP2D, aD2D);
942 Geom2dAdaptor_Curve aHCur(aL2D);
944 aIx=aHatcher.AddHatching(aHCur) ;
948 bIsDone=aHatcher.TrimDone(aIx);
954 aHatcher.ComputeDomains(aIx);
955 bIsDone=aHatcher.IsDone(aIx);
962 aNbDomains=aHatcher.NbDomains(aIx);
963 for (i=1; i<=aNbDomains; ++i) {
964 const HatchGen_Domain& aDomain=aHatcher.Domain (aIx, i) ;
965 bHasFirstPoint=aDomain.HasFirstPoint();
966 if (!bHasFirstPoint) {
971 aV1=aDomain.FirstPoint().Parameter();
973 bHasSecondPoint=aDomain.HasSecondPoint();
974 if (!bHasSecondPoint) {
979 aV2=aDomain.SecondPoint().Parameter();
981 aVx=IntTools_Tools::IntermediatePoint(aV1, aV2);
986 aS->D0(aUx, aVx, aPx);
988 theP2D.SetCoord(aUx, aVx);