Back to index

salome-geom  6.5.0
GEOMAlgo_FinderShapeOn1.cxx
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 // File:        GEOMAlgo_FinderShapeOn1.cxx
00024 // Created:     Fri Mar  4 10:31:06 2005
00025 // Author:      Peter KURNEV
00026 
00027 #include <GEOMAlgo_FinderShapeOn1.hxx>
00028 
00029 #include <math.h>
00030 
00031 #include <Precision.hxx>
00032 #include <TColStd_Array1OfInteger.hxx>
00033 #include <TColStd_MapOfInteger.hxx>
00034 
00035 #include <gp_Trsf.hxx>
00036 #include <gp_Cylinder.hxx>
00037 #include <gp_Pnt.hxx>
00038 
00039 #include <TColgp_Array1OfPnt.hxx>
00040 
00041 #include <Poly_Array1OfTriangle.hxx>
00042 #include <Poly_Triangle.hxx>
00043 #include <Poly_PolygonOnTriangulation.hxx>
00044 #include <Poly_Triangulation.hxx>
00045 #include <Poly_Polygon3D.hxx>
00046 
00047 #include <Geom_Curve.hxx>
00048 #include <Geom_Surface.hxx>
00049 #include <GeomAdaptor_Surface.hxx>
00050 #include <GeomAbs_SurfaceType.hxx>
00051 #include <GeomAdaptor_Curve.hxx>
00052 #include <GeomAbs_CurveType.hxx>
00053 
00054 #include <TopAbs_State.hxx>
00055 
00056 #include <TopLoc_Location.hxx>
00057 #include <TopoDS.hxx>
00058 #include <TopoDS_Shape.hxx>
00059 #include <TopoDS_Vertex.hxx>
00060 #include <TopoDS_Face.hxx>
00061 #include <TopoDS_Edge.hxx>
00062 
00063 #include <TopExp.hxx>
00064 #include <TopExp_Explorer.hxx>
00065 
00066 #include <TopTools_IndexedMapOfShape.hxx>
00067 
00068 #include <BRep_Tool.hxx>
00069 #include <BRepLib_MakeEdge.hxx>
00070 
00071 #include <GEOMAlgo_ListIteratorOfListOfPnt.hxx>
00072 
00073 #include <GEOMAlgo_SurfaceTools.hxx>
00074 #include <GEOMAlgo_StateCollector.hxx>
00075 #include <GEOMAlgo_FinderShapeOn.hxx>
00076 
00077 #include <GEOMAlgo_PassKey.hxx>
00078 #include <GEOMAlgo_DataMapOfPassKeyInteger.hxx>
00079 #include <GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyInteger.hxx>
00080 
00081 //=======================================================================
00082 //function : GEOMAlgo_FinderShapeOn1
00083 //purpose  :
00084 //=======================================================================
00085 GEOMAlgo_FinderShapeOn1::GEOMAlgo_FinderShapeOn1()
00086 :
00087   GEOMAlgo_ShapeAlgo()
00088 {
00089   myTolerance=0.0001;
00090   myShapeType=TopAbs_VERTEX;
00091   myState=GEOMAlgo_ST_UNKNOWN;
00092   myNbPntsMin=3;
00093   myNbPntsMax=0;
00094 }
00095 //=======================================================================
00096 //function : ~
00097 //purpose  :
00098 //=======================================================================
00099 GEOMAlgo_FinderShapeOn1::~GEOMAlgo_FinderShapeOn1()
00100 {
00101 }
00102 //=======================================================================
00103 //function : SetSurface
00104 //purpose  :
00105 //=======================================================================
00106 void GEOMAlgo_FinderShapeOn1::SetSurface(const Handle(Geom_Surface)& aS)
00107 {
00108   mySurface=aS;
00109 }
00110 //=======================================================================
00111 //function : Surface
00112 //purpose  :
00113 //=======================================================================
00114 const Handle(Geom_Surface)& GEOMAlgo_FinderShapeOn1::Surface() const
00115 {
00116   return mySurface;
00117 }
00118 //=======================================================================
00119 //function : SetShapeType
00120 //purpose  :
00121 //=======================================================================
00122 void GEOMAlgo_FinderShapeOn1::SetShapeType(const TopAbs_ShapeEnum aType)
00123 {
00124   myShapeType=aType;
00125 }
00126 //=======================================================================
00127 //function : ShapeType
00128 //purpose  :
00129 //=======================================================================
00130 TopAbs_ShapeEnum GEOMAlgo_FinderShapeOn1::ShapeType()const
00131 {
00132   return myShapeType;
00133 }
00134 //=======================================================================
00135 //function : SetState
00136 //purpose  :
00137 //=======================================================================
00138 void GEOMAlgo_FinderShapeOn1::SetState(const GEOMAlgo_State aState)
00139 {
00140   myState=aState;
00141 }
00142 //=======================================================================
00143 //function : State
00144 //purpose  :
00145 //=======================================================================
00146 GEOMAlgo_State GEOMAlgo_FinderShapeOn1::State() const
00147 {
00148   return myState;
00149 }
00150 //=======================================================================
00151 //function : SetNbPntsMin
00152 //purpose  :
00153 //=======================================================================
00154 void GEOMAlgo_FinderShapeOn1::SetNbPntsMin(const Standard_Integer aNb)
00155 {
00156   myNbPntsMin=aNb;
00157 }
00158 //=======================================================================
00159 //function : NbPntsMin
00160 //purpose  :
00161 //=======================================================================
00162 Standard_Integer GEOMAlgo_FinderShapeOn1::NbPntsMin()const
00163 {
00164   return myNbPntsMin;
00165 }
00166 //=======================================================================
00167 //function : SetNbPntsMax
00168 //purpose  :
00169 //=======================================================================
00170 void GEOMAlgo_FinderShapeOn1::SetNbPntsMax(const Standard_Integer aNb)
00171 {
00172   myNbPntsMax=aNb;
00173 }
00174 //=======================================================================
00175 //function : NbPntsMax
00176 //purpose  :
00177 //=======================================================================
00178 Standard_Integer GEOMAlgo_FinderShapeOn1::NbPntsMax()const
00179 {
00180   return myNbPntsMax;
00181 }
00182 //=======================================================================
00183 // function: MSS
00184 // purpose:
00185 //=======================================================================
00186 const GEOMAlgo_IndexedDataMapOfShapeState& GEOMAlgo_FinderShapeOn1::MSS() const
00187 {
00188   return myMSS;
00189 }
00190 //=======================================================================
00191 // function: Shapes
00192 // purpose:
00193 //=======================================================================
00194 const TopTools_ListOfShape& GEOMAlgo_FinderShapeOn1::Shapes() const
00195 {
00196   Standard_Integer i, aNb;
00197   TopTools_ListOfShape* pL;
00198   //
00199   pL=(TopTools_ListOfShape*) &myLS;
00200   pL->Clear();
00201   //
00202   aNb=myMSS.Extent();
00203   for (i=1; i<=aNb; ++i) {
00204     const TopoDS_Shape& aS=myMSS.FindKey(i);
00205     if (aS.ShapeType()==myShapeType) {
00206       pL->Append(aS);
00207     }
00208   }
00209   return myLS;
00210 }
00211 //=======================================================================
00212 //function : Perform
00213 //purpose  :
00214 //=======================================================================
00215 void GEOMAlgo_FinderShapeOn1::Perform()
00216 {
00217   myErrorStatus=0;
00218   myWarningStatus=0;
00219   myLS.Clear();
00220   myMSS.Clear();
00221   //
00222   CheckData();
00223   if(myErrorStatus) {
00224     return;
00225   }
00226   //
00227   // Initialize the context
00228   GEOMAlgo_ShapeAlgo::Perform();
00229   //
00230   // 1
00231   ProcessVertices();
00232   if(myErrorStatus) {
00233     return;
00234   }
00235   if (myShapeType==TopAbs_VERTEX) {
00236     return;
00237   }
00238   //
00239   // 2
00240   ProcessEdges();
00241   if(myErrorStatus) {
00242     return;
00243   }
00244   if (myShapeType==TopAbs_EDGE) {
00245     return;
00246   }
00247   //
00248   // 3
00249   ProcessFaces();
00250   if(myErrorStatus) {
00251     return;
00252   }
00253   if (myShapeType==TopAbs_FACE) {
00254     return;
00255   }
00256   //
00257   // 4
00258   ProcessSolids();
00259   //
00260 }
00261 //=======================================================================
00262 //function : ProcessVertices
00263 //purpose  :
00264 //=======================================================================
00265 void GEOMAlgo_FinderShapeOn1::ProcessVertices()
00266 {
00267   myErrorStatus=0;
00268   //
00269   Standard_Boolean bIsConformState;
00270   Standard_Integer i, aNb;
00271   gp_Pnt aP;
00272   TopTools_IndexedMapOfShape aM;
00273   TopAbs_State aSt;
00274   //
00275   TopExp::MapShapes(myShape, TopAbs_VERTEX, aM);
00276   aNb=aM.Extent();
00277   for (i=1; i<=aNb; ++i) {
00278     const TopoDS_Vertex& aV=TopoDS::Vertex(aM(i));
00279     aP=BRep_Tool::Pnt(aV);
00280     //
00281     aSt = GetPointState( aP );
00282     bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState);
00283     //
00284     if (myShapeType==TopAbs_VERTEX){
00285       if (bIsConformState) {
00286         myMSS.Add(aV, aSt);
00287       }
00288     }
00289     else if (bIsConformState || aSt==TopAbs_ON) {
00290       myMSS.Add(aV, aSt);
00291     }
00292   }
00293 }
00294 //=======================================================================
00295 //function : ProcessEdges
00296 //purpose  :
00297 //=======================================================================
00298 void GEOMAlgo_FinderShapeOn1::ProcessEdges()
00299 {
00300   myErrorStatus=0;
00301   //
00302   Standard_Boolean bIsConformState, bIsToBreak;
00303   Standard_Integer i, aNb, iCnt;
00304   TopAbs_State aSt;
00305   TopTools_IndexedMapOfShape aM;
00306   TopExp_Explorer aExp;
00307   GEOMAlgo_ListIteratorOfListOfPnt aIt;
00308   GeomAbs_SurfaceType aType1;
00309   //
00310   aType1=myGAS.GetType();
00311   //
00312   TopExp::MapShapes(myShape, TopAbs_EDGE, aM);
00313   aNb=aM.Extent();
00314   for (i=1; i<=aNb; ++i) {
00315     GEOMAlgo_ListOfPnt aLP;
00316     GEOMAlgo_StateCollector aSC;
00317     //
00318     const TopoDS_Edge& aE=TopoDS::Edge(aM(i));
00319     //
00320     aExp.Init(aE, TopAbs_VERTEX);
00321     for (; aExp.More(); aExp.Next()) {
00322       const TopoDS_Shape& aV=aExp.Current();
00323       //
00324       bIsConformState=myMSS.Contains(aV);
00325       if (!bIsConformState) {
00326         break;// vertex has non-conformed state
00327       }
00328       else {
00329         aSt=myMSS.FindFromKey(aV);
00330         aSC.AppendState(aSt);
00331       }
00332     }
00333     //
00334     if (!bIsConformState) {
00335       continue; // vertex has non-conformed state,skip edge
00336     }
00337     //
00338     if (BRep_Tool::Degenerated(aE)) {
00339       myMSS.Add(aE, aSt);
00340       continue;
00341     }
00342     //
00343     if (myState==GEOMAlgo_ST_ON && aType1==GeomAbs_Sphere) {
00344       Standard_Real aT1, aT2;
00345       Handle(Geom_Curve) aC;
00346       GeomAdaptor_Curve aGAC;
00347       GeomAbs_CurveType aType2;
00348       //
00349       aC=BRep_Tool::Curve(aE, aT1, aT2);
00350       aGAC.Load(aC);
00351       //
00352       aType2=aGAC.GetType();
00353       if (aType2==GeomAbs_Line) {
00354         continue;
00355       }
00356     }
00357     //
00358     InnerPoints(aE, aLP);
00359     if (myErrorStatus) {
00360       return;
00361     }
00362     //
00363     bIsConformState=Standard_True;
00364     aIt.Initialize(aLP);
00365     for (iCnt=0; aIt.More(); aIt.Next(), ++iCnt) {
00366       if (myNbPntsMax) {
00367         if (iCnt > myNbPntsMax) {
00368           break;
00369         }
00370       }
00371       //
00372       const gp_Pnt& aP=aIt.Value();
00373       aSt = GetPointState( aP );
00374       bIsToBreak=aSC.AppendState(aSt);
00375       if (bIsToBreak) {
00376         break;
00377       }
00378     }
00379     //
00380     aSt=aSC.State();
00381     //
00382     bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState);
00383     if (myShapeType==TopAbs_EDGE) {
00384       if (bIsConformState) {
00385         myMSS.Add(aE, aSt);
00386       }
00387     }
00388     else if (bIsConformState || aSt==TopAbs_ON) {
00389       myMSS.Add(aE, aSt);
00390     }
00391   } //  for (i=1; i<=aNb; ++i) next edge
00392 }
00393 //=======================================================================
00394 //function : ProcessFaces
00395 //purpose  :
00396 //=======================================================================
00397 void GEOMAlgo_FinderShapeOn1::ProcessFaces()
00398 {
00399   myErrorStatus=0;
00400   //
00401   Standard_Boolean bIsConformState, bIsToBreak;
00402   Standard_Integer i, aNbF, iCnt;
00403   TopAbs_State aSt;
00404   TopTools_IndexedMapOfShape aM;
00405   TopExp_Explorer aExp;
00406   GEOMAlgo_ListIteratorOfListOfPnt aIt;
00407   GeomAbs_SurfaceType aType1, aType2;
00408   //
00409   aType1=myGAS.GetType();
00410   //
00411   TopExp::MapShapes(myShape, TopAbs_FACE, aM);
00412   aNbF=aM.Extent();
00413   for (i=1; i<=aNbF; ++i) {
00414     GEOMAlgo_StateCollector aSC;
00415     GEOMAlgo_ListOfPnt aLP;
00416     //
00417     const TopoDS_Face& aF=TopoDS::Face(aM(i));
00418     //
00419     if (myState==GEOMAlgo_ST_ON) {
00420       Handle(Geom_Surface) aS;
00421       GeomAdaptor_Surface aGAS;
00422       //
00423       aS=BRep_Tool::Surface(aF);
00424       aGAS.Load(aS);
00425       aType2=aGAS.GetType();
00426       if (aType2!=aType1) {
00427         continue;
00428       }
00429     }
00430     //
00431     aExp.Init(aF, TopAbs_EDGE);
00432     for (; aExp.More(); aExp.Next()) {
00433       const TopoDS_Shape& aE=aExp.Current();
00434       bIsConformState=myMSS.Contains(aE);
00435       if (!bIsConformState) {
00436         break;// edge has non-conformed state
00437       }
00438       else {
00439         aSt=myMSS.FindFromKey(aE);
00440         aSC.AppendState(aSt);
00441       }
00442     }
00443     //
00444     if (!bIsConformState) {
00445       continue; // edge has non-conformed state,skip face
00446     }
00447     //
00448     InnerPoints(aF, aLP);
00449     if (myErrorStatus) {
00450       return;
00451     }
00452     //
00453     bIsConformState=Standard_True;
00454     aIt.Initialize(aLP);
00455     for (iCnt=0; aIt.More(); aIt.Next(), ++iCnt) {
00456       if (myNbPntsMax) {
00457         if (iCnt > myNbPntsMax) {
00458           break;
00459         }
00460       }
00461       //
00462       const gp_Pnt& aP=aIt.Value();
00463       aSt = GetPointState( aP );
00464       bIsToBreak=aSC.AppendState(aSt);
00465       if (bIsToBreak) {
00466         break;
00467       }
00468     }
00469     //
00470     aSt=aSC.State();
00471     //
00472     bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState);
00473     if (myShapeType==TopAbs_FACE) {
00474       if (bIsConformState) {
00475         myMSS.Add(aF, aSt);
00476       }
00477     }
00478     else if (bIsConformState || aSt==TopAbs_ON) {
00479       myMSS.Add(aF, aSt);
00480     }
00481   }//  for (i=1; i<=aNb; ++i) next face
00482 }
00483 //=======================================================================
00484 //function : ProcessSolids
00485 //purpose  :
00486 //=======================================================================
00487 void GEOMAlgo_FinderShapeOn1::ProcessSolids()
00488 {
00489   myErrorStatus=0;
00490   //
00491   Standard_Boolean bIsConformState;
00492   Standard_Integer i, aNbS, j, aNbF;
00493   TopTools_IndexedMapOfShape aM, aMF;
00494   TopAbs_State aSt;
00495   //
00496   TopExp::MapShapes(myShape, TopAbs_SOLID, aM);
00497   aNbS=aM.Extent();
00498   for (i=1; i<=aNbS; ++i) {
00499     GEOMAlgo_StateCollector aSC;
00500     //
00501     const TopoDS_Shape& aSd=aM(i);
00502     aMF.Clear();
00503     TopExp::MapShapes(aSd, TopAbs_FACE, aMF);
00504     aNbF=aMF.Extent();
00505     for (j=1; j<=aNbF; ++j) {
00506       const TopoDS_Shape& aF=aMF(j);
00507       bIsConformState=myMSS.Contains(aF);
00508       if (!bIsConformState) {
00509         break;// face has non-conformed state
00510       }
00511       else {
00512         aSt=myMSS.FindFromKey(aF);
00513         aSC.AppendState(aSt);
00514       }
00515     }
00516     //
00517     if (!bIsConformState) {
00518       continue; // face has non-conformed state,skip solid
00519     }
00520     //
00521     aSt=aSC.State();
00522     //
00523     bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState);
00524     if (bIsConformState) {
00525       myMSS.Add(aSd, aSt);
00526     }
00527   }
00528 }
00529 //
00530 //=======================================================================
00531 //function : InnerPoints
00532 //purpose  :
00533 //=======================================================================
00534 void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Face& aF,
00535                                           GEOMAlgo_ListOfPnt& aLP)
00536 {
00537   myErrorStatus=0;
00538   //
00539   Standard_Integer j, j1, j2, k, n[4], aNbLinks, aNx, aNb, iCnt;//, aNbMax, *pIds;
00540   TopLoc_Location aLoc;
00541   Handle(Poly_Triangulation) aTRF;
00542   TColStd_MapOfInteger aMBN;
00543   GEOMAlgo_DataMapOfPassKeyInteger aMPKI;
00544   GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyInteger aIt;
00545   gp_Pnt aP, aP1, aP2;
00546   //
00547   aLP.Clear();
00548   //
00549   aTRF=BRep_Tool::Triangulation(aF, aLoc);
00550   if (aTRF.IsNull()) {
00551     if (!GEOMAlgo_FinderShapeOn::BuildTriangulation(aF)) {
00552       myWarningStatus=20; // no triangulation found
00553       return;
00554     }
00555     aTRF=BRep_Tool::Triangulation(aF, aLoc);
00556   }
00557   //
00558   const gp_Trsf& aTrsf=aLoc.Transformation();
00559   const Poly_Array1OfTriangle& aTrs=aTRF->Triangles();
00560   const TColgp_Array1OfPnt& aNodes=aTRF->Nodes();
00561   //
00562   // map link/nbtriangles
00563   j1=aTrs.Lower();
00564   j2=aTrs.Upper();
00565   for (j=j1; j<=j2; ++j) {
00566     const Poly_Triangle& aTr=aTrs(j);
00567     aTr.Get(n[0], n[1], n[2]);
00568     n[3]=n[0];
00569     for (k=0; k<3; ++k) {
00570       GEOMAlgo_PassKey aPK;
00571       //
00572       aPK.SetIds(n[k], n[k+1]);
00573       if (aMPKI.IsBound(aPK)) {
00574         Standard_Integer& iCntX=aMPKI.ChangeFind(aPK);
00575         ++iCntX;
00576       }
00577       else {
00578         aMPKI.Bind(aPK, 1);
00579       }
00580     }
00581   }
00582   //
00583   // boundary nodes aMBN
00584   aNbLinks=aMPKI.Extent();
00585   aIt.Initialize(aMPKI);
00586   for (; aIt.More(); aIt.Next()) {
00587     iCnt=aIt.Value();
00588     if (iCnt==1) {
00589       const GEOMAlgo_PassKey& aPK=aIt.Key();
00590       //
00591       aNx=(Standard_Integer)aPK.Id(1);
00592       aMBN.Add(aNx);
00593       aNx=(Standard_Integer)aPK.Id(2);
00594       aMBN.Add(aNx);
00595     }
00596   }
00597   //
00598   // inner nodes=all_nodes - boundary_nodes
00599   j1=aNodes.Lower();
00600   j2=aNodes.Upper();
00601   for (j=j1; j<=j2; ++j) {
00602     if (!aMBN.Contains(j)) {
00603       aP=aNodes(j).Transformed(aTrsf);
00604       aLP.Append(aP);
00605     }
00606   }
00607   //
00608   aNb=aLP.Extent();
00609   //
00610   if (!aNb && myNbPntsMin) {
00611     // try to fill it yourself
00612     Standard_Boolean bIsDone;
00613     Standard_Integer aN1, aN2;
00614     Handle(Geom_Surface) aS;
00615     GeomAdaptor_Surface aGAS;
00616     GeomAbs_SurfaceType aType;
00617     //
00618     aS=BRep_Tool::Surface(aF);
00619     aGAS.Load(aS);
00620     aType=aGAS.GetType();
00621     if (aType==GeomAbs_Plane || aType==GeomAbs_Cylinder) {
00622       // inner links
00623       aNbLinks=aMPKI.Extent();
00624       aIt.Initialize(aMPKI);
00625       for (; aIt.More(); aIt.Next()) {
00626         iCnt=aIt.Value();
00627         if (iCnt>1) {
00628           // take the first having occured inner link
00629           // and discretize it
00630           const GEOMAlgo_PassKey& aPK=aIt.Key();
00631           //
00632           aN1=(Standard_Integer)aPK.Id(1);
00633           aN2=(Standard_Integer)aPK.Id(2);
00634           //
00635           aP1=aNodes(aN1).Transformed(aTrsf);
00636           aP2=aNodes(aN2).Transformed(aTrsf);
00637           //
00638           if (aType==GeomAbs_Cylinder) {
00639             Standard_Real aTolSM;
00640             gp_Cylinder aCyl;
00641             //
00642             aTolSM=1.523e-6;//~1.-cos(0.1 deg)
00643             aCyl=aGAS.Cylinder();
00644             if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, aTolSM)) {
00645               continue;
00646             }
00647           }
00648           //
00649           BRepLib_MakeEdge aBME(aP1, aP2);
00650           bIsDone=aBME.IsDone();
00651           if (!bIsDone) {
00652             myErrorStatus=30; //can not obtain the line fron the link
00653             return;
00654           }
00655           //
00656           const TopoDS_Shape& aSx=aBME.Shape();
00657           const TopoDS_Edge& aE=TopoDS::Edge(aSx);
00658           //
00659           InnerPoints(aE, myNbPntsMin, aLP);
00660           break;
00661         }// if (iCnt>1)
00662       }// for (; aIt.More(); aIt.Next())
00663     }// if (aType==GeomAbs_Plane || aType==GeomAbs_Cylinder)
00664   }// if (!aNb && myNbPntsMin) {
00665 }
00666 //modified by NIZNHY-PKV Thu Jan 26 09:56:20 2012f
00667 //=======================================================================
00668 //function : InnerPoints
00669 //purpose  :
00670 //=======================================================================
00671 void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE,
00672                                           GEOMAlgo_ListOfPnt& aLP)
00673 {
00674   Standard_Integer aNbPntsMin;
00675   //
00676   myErrorStatus=0;
00677   aNbPntsMin=21;
00678   //
00679   aLP.Clear();
00680   InnerPoints(aE, aNbPntsMin, aLP);
00681 }
00682 //modified by NIZNHY-PKV Thu Jan 26 09:56:32 2012t
00683 //=======================================================================
00684 //function : InnerPoints
00685 //purpose  :
00686 //=======================================================================
00687 void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE,
00688                                           const Standard_Integer aNbPntsMin,
00689                                           GEOMAlgo_ListOfPnt& aLP)
00690 {
00691   Standard_Boolean bInf1, bInf2;
00692   Standard_Integer j, aNbT;
00693   Standard_Real dT, aT, aT1, aT2;
00694   gp_Pnt aP;
00695   Handle(Geom_Curve) aC3D;
00696   //
00697   aC3D=BRep_Tool::Curve(aE, aT1, aT2);
00698   if (aC3D.IsNull()) {
00699     return;
00700   }
00701   //
00702   bInf1=Precision::IsNegativeInfinite(aT1);
00703   bInf2=Precision::IsPositiveInfinite(aT2);
00704   if (bInf1 || bInf2) {
00705     return;
00706   }
00707   //
00708   //modified by NIZNHY-PKV Thu Jan 26 09:51:20 2012f
00709   /*
00710   aNbT=myNbPntsMin+1;
00711   dT=(aT2-aT1)/aNbT;
00712   for (j=1; j<=aNbPntsMin; ++j) {
00713     aT=aT1+j*dT;
00714     aC3D->D0(aT, aP);
00715     aLP.Append(aP);
00716   }
00717   */
00718   aNbT=aNbPntsMin+1;
00719   dT=(aT2-aT1)/aNbT;
00720   for (j=1; j<aNbT; ++j) {
00721     aT=aT1+j*dT;
00722     aC3D->D0(aT, aP);
00723     aLP.Append(aP);
00724   }
00725   //modified by NIZNHY-PKV Thu Jan 26 09:51:24 2012t
00726 }
00727 
00728 //=======================================================================
00729 //function : CheckData
00730 //purpose  :
00731 //=======================================================================
00732 void GEOMAlgo_FinderShapeOn1::CheckData()
00733 {
00734   myErrorStatus=0;
00735   //
00736   if(mySurface.IsNull()) {
00737     myErrorStatus=10; // mySurface=NULL
00738     return;
00739   }
00740   //
00741   if (myShape.IsNull()) {
00742     myErrorStatus=11; // myShape=NULL
00743     return;
00744   }
00745   //
00746   if (!(myShapeType==TopAbs_VERTEX ||
00747         myShapeType==TopAbs_EDGE ||
00748         myShapeType==TopAbs_FACE ||
00749         myShapeType==TopAbs_SOLID)) {
00750     myErrorStatus=12; // unallowed subshape type
00751     return;
00752   }
00753   //
00754   if (myState==GEOMAlgo_ST_UNKNOWN ||
00755       myState==GEOMAlgo_ST_INOUT) {
00756     myErrorStatus=13; // unallowed state type
00757     return;
00758   }
00759   //
00760   GeomAbs_SurfaceType aType;
00761   //
00762   myGAS.Load(mySurface);
00763   aType=myGAS.GetType();
00764   if (!(aType==GeomAbs_Plane ||
00765         aType==GeomAbs_Cylinder ||
00766         aType==GeomAbs_Sphere)) {
00767     myErrorStatus=14; // unallowed surface type
00768   }
00769 }
00770 
00771 //=======================================================================
00772 //function : GetPointState
00773 //purpose  :
00774 //=======================================================================
00775 
00776 TopAbs_State GEOMAlgo_FinderShapeOn1::GetPointState(const gp_Pnt& aP)
00777 {
00778   TopAbs_State aSt;
00779   GEOMAlgo_SurfaceTools::GetState(aP, myGAS, myTolerance, aSt);
00780   return aSt;
00781 }
00782 
00783 
00784 //
00785 // myErrorStatus :
00786 //
00787 // 10 -mySurface=NULL
00788 // 11 -myShape=NULL
00789 // 12 -unallowed type of subshapes
00790 // 13 -unallowed state
00791 // 14 -unallowed surface type
00792 // 15 -unallowed surface type
00793 // 20- no triangulation found
00794 // 30- can not obtain the line from the link
00795 
00796 //modified by NIZNHY-PKV Thu Jan 26 10:01:14 2012f
00797 /*
00798 //=======================================================================
00799 //function : InnerPoints
00800 //purpose  :
00801 //=======================================================================
00802 void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE,
00803                                           GEOMAlgo_ListOfPnt& aLP)
00804 {
00805   myErrorStatus=0;
00806   //
00807   Standard_Integer j, aNbNodes, aIndex, aNb;
00808   Handle(Poly_PolygonOnTriangulation) aPTE;
00809   Handle(Poly_Triangulation) aTRE;
00810   TopLoc_Location aLoc;
00811   gp_Pnt aP;
00812   //
00813   aLP.Clear();
00814   BRep_Tool::PolygonOnTriangulation(aE, aPTE, aTRE, aLoc);
00815   if (aTRE.IsNull() || aPTE.IsNull()) {
00816     Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(aE, aLoc);
00817     if (aPE.IsNull()) {
00818       if (!GEOMAlgo_FinderShapeOn::BuildTriangulation(aE)) {
00819         myErrorStatus=20; // no triangulation found
00820         return;
00821       }
00822       aPE = BRep_Tool::Polygon3D(aE, aLoc);
00823     }
00824     const gp_Trsf& aTrsf=aLoc.Transformation();
00825     const TColgp_Array1OfPnt& aNodes=aPE->Nodes();
00826     //
00827     aNbNodes=aPE->NbNodes();
00828     Standard_Integer low = aNodes.Lower(), up = aNodes.Upper();
00829     for (j=low+1; j<up; ++j) {
00830       aP=aNodes(j).Transformed(aTrsf);
00831       aLP.Append(aP);
00832     }
00833   }
00834   else {
00835     const gp_Trsf& aTrsf=aLoc.Transformation();
00836     const TColgp_Array1OfPnt& aNodes=aTRE->Nodes();
00837     //
00838     aNbNodes=aPTE->NbNodes();
00839     const TColStd_Array1OfInteger& aInds=aPTE->Nodes();
00840     for (j=2; j<aNbNodes; ++j) {
00841       aIndex=aInds(j);
00842       aP=aNodes(aIndex).Transformed(aTrsf);
00843       aLP.Append(aP);
00844     }
00845   }
00846   //
00847   aNb=aLP.Extent();
00848   if (!aNb && myNbPntsMin) {
00849     // try to fill it yourself
00850     InnerPoints(aE, myNbPntsMin, aLP);
00851     aNb=aLP.Extent();
00852   }
00853 }
00854 */
00855 //modified by NIZNHY-PKV Thu Jan 26 10:01:17 2012t