Back to index

salome-geom  6.5.0
GEOMAlgo_ShapeInfoFiller.cxx
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // This library is free software; you can redistribute it and/or
00004 // modify it under the terms of the GNU Lesser General Public
00005 // License as published by the Free Software Foundation; either
00006 // version 2.1 of the License.
00007 //
00008 // This library is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011 // Lesser General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU Lesser General Public
00014 // License along with this library; if not, write to the Free Software
00015 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00016 //
00017 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00018 //
00019 
00020 #include <GEOMAlgo_ShapeInfoFiller.hxx>
00021 
00022 #include <Precision.hxx>
00023 
00024 #include <gp_Lin.hxx>
00025 #include <gp_Pnt.hxx>
00026 #include <gp_Dir.hxx>
00027 
00028 #include <Geom_Curve.hxx>
00029 #include <GeomAdaptor_Curve.hxx>
00030 
00031 #include <TopoDS_Vertex.hxx>
00032 #include <TopoDS.hxx>
00033 #include <TopoDS_Edge.hxx>
00034 
00035 #include <BRep_Tool.hxx>
00036 #include <TopExp.hxx>
00037 
00038 #include <TopTools_IndexedMapOfShape.hxx>
00039 #include <gp_Circ.hxx>
00040 #include <gp_Ax2.hxx>
00041 #include <gp_Elips.hxx>
00042 #include <TopoDS_Iterator.hxx>
00043 #include <TopoDS_Wire.hxx>
00044 #include <TopExp.hxx>
00045 #include <Geom_Surface.hxx>
00046 #include <TopoDS_Face.hxx>
00047 #include <GeomAdaptor_Surface.hxx>
00048 #include <gp_Pln.hxx>
00049 #include <gp_Sphere.hxx>
00050 #include <gp_Ax3.hxx>
00051 #include <BRepTools.hxx>
00052 #include <gp_Cylinder.hxx>
00053 #include <gp_Cone.hxx>
00054 #include <gp_Torus.hxx>
00055 #include <TopoDS_Solid.hxx>
00056 
00057 
00058 
00059 
00060 static
00061   Standard_Boolean IsAllowedType(const GeomAbs_CurveType aCT);
00062 static
00063   Standard_Boolean IsAllowedType(const GeomAbs_SurfaceType aST);
00064 static
00065   Standard_Integer NbWires(const TopoDS_Face& aF);
00066 static
00067   Standard_Integer NbShells(const TopoDS_Solid& aS);
00068 
00069 //=======================================================================
00070 //function :
00071 //purpose  :
00072 //=======================================================================
00073   GEOMAlgo_ShapeInfoFiller::GEOMAlgo_ShapeInfoFiller()
00074 :
00075   GEOMAlgo_Algo()
00076 {
00077   myTolerance=0.0001;
00078 }
00079 //=======================================================================
00080 //function : ~
00081 //purpose  :
00082 //=======================================================================
00083   GEOMAlgo_ShapeInfoFiller::~GEOMAlgo_ShapeInfoFiller()
00084 {
00085 }
00086 //=======================================================================
00087 //function : SetTolerance
00088 //purpose  :
00089 //=======================================================================
00090   void GEOMAlgo_ShapeInfoFiller::SetTolerance(const Standard_Real aT)
00091 {
00092   myTolerance=aT;
00093 }
00094 //=======================================================================
00095 //function : Tolerance
00096 //purpose  :
00097 //=======================================================================
00098   Standard_Real GEOMAlgo_ShapeInfoFiller::Tolerance()const
00099 {
00100   return myTolerance;
00101 }
00102 //=======================================================================
00103 //function : SetShape
00104 //purpose  :
00105 //=======================================================================
00106   void GEOMAlgo_ShapeInfoFiller::SetShape(const TopoDS_Shape& aS)
00107 {
00108   myShape=aS;
00109 }
00110 //=======================================================================
00111 //function : Shape
00112 //purpose  :
00113 //=======================================================================
00114   const TopoDS_Shape& GEOMAlgo_ShapeInfoFiller::Shape() const
00115 {
00116   return myShape;
00117 }
00118 //=======================================================================
00119 //function : Info
00120 //purpose  :
00121 //=======================================================================
00122   const GEOMAlgo_ShapeInfo& GEOMAlgo_ShapeInfoFiller::Info() const
00123 {
00124   return Info(myShape);
00125 }
00126 //=======================================================================
00127 //function : Info
00128 //purpose  :
00129 //=======================================================================
00130   const GEOMAlgo_ShapeInfo& GEOMAlgo_ShapeInfoFiller::Info(const TopoDS_Shape& aS) const
00131 {
00132   if (!aS.IsNull()) {
00133     if (myMapInfo.Contains(aS)) {
00134       const GEOMAlgo_ShapeInfo& aInfo=myMapInfo.FindFromKey(aS);
00135       return aInfo;
00136     }
00137   }
00138   return myEmptyInfo;
00139 }
00140 
00141 //=======================================================================
00142 //function : CheckData
00143 //purpose  :
00144 //=======================================================================
00145   void GEOMAlgo_ShapeInfoFiller::CheckData()
00146 {
00147   myErrorStatus=0;
00148   //
00149   if (myShape.IsNull()) {
00150     myErrorStatus=10;
00151     return;
00152   }
00153 }
00154 //=======================================================================
00155 //function : Perform
00156 //purpose  :
00157 //=======================================================================
00158   void GEOMAlgo_ShapeInfoFiller::Perform()
00159 {
00160   myErrorStatus=0;
00161   //
00162   myMapInfo.Clear();
00163   //
00164   CheckData();
00165   if (myErrorStatus) {
00166     return;
00167   }
00168   //
00169   FillShape(myShape);
00170 }
00171 //=======================================================================
00172 //function :FillShape
00173 //purpose  :
00174 //=======================================================================
00175   void GEOMAlgo_ShapeInfoFiller::FillShape(const TopoDS_Shape& aS)
00176 {
00177   TopAbs_ShapeEnum aType;
00178   //
00179   aType=aS.ShapeType();
00180   switch(aType) {
00181     //
00182     case TopAbs_VERTEX:
00183       FillVertex(aS);
00184       break;
00185     //
00186     case TopAbs_EDGE:
00187       FillEdge(aS);
00188       break;
00189     //
00190     case TopAbs_FACE:
00191       FillFace(aS);
00192       break;
00193     //
00194     case TopAbs_SOLID:
00195       FillSolid(aS);
00196       break;
00197     //
00198     case TopAbs_WIRE:
00199     case TopAbs_SHELL:
00200     case TopAbs_COMPSOLID:
00201     case TopAbs_COMPOUND:
00202       FillContainer(aS);
00203       break;
00204     //
00205     default:
00206       break;
00207   }
00208 }
00209 //=======================================================================
00210 //function :FillSubShapes
00211 //purpose  :
00212 //=======================================================================
00213   void GEOMAlgo_ShapeInfoFiller::FillSubShapes(const TopoDS_Shape& aS)
00214 {
00215   TopoDS_Iterator aIt;
00216   //
00217   aIt.Initialize(aS);
00218   for (; aIt.More(); aIt.Next()){
00219     const TopoDS_Shape& aSx=aIt.Value();
00220     FillShape(aSx);
00221   }
00222 }
00223 //=======================================================================
00224 //function : FillContainer
00225 //purpose  :
00226 //=======================================================================
00227   void GEOMAlgo_ShapeInfoFiller::FillContainer(const TopoDS_Shape& aS)
00228 {
00229   myErrorStatus=0;
00230   //
00231   Standard_Boolean bIsClosed;
00232   TopAbs_ShapeEnum aType;
00233   GEOMAlgo_KindOfClosed aKC;
00234   //
00235   aType=aS.ShapeType();
00236   //----------------------------------------------------
00237   if (myMapInfo.Contains(aS)) {
00238     return;
00239   }
00240   else {
00241     GEOMAlgo_ShapeInfo aInfoX;
00242     myMapInfo.Add(aS, aInfoX);
00243   }
00244   GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aS);
00245   //----------------------------------------------------
00246   aInfo.SetType(aType);
00247   FillNbSubShapes(aS, aInfo);
00248   //
00249   if (aType==TopAbs_SHELL) {
00250     bIsClosed=BRep_Tool::IsClosed(aS);
00251     aKC=(bIsClosed) ? GEOMAlgo_KC_CLOSED :GEOMAlgo_KC_NOTCLOSED;
00252     aInfo.SetKindOfClosed(aKC);
00253   }
00254   else if (aType==TopAbs_WIRE) {
00255     TopoDS_Wire aW;
00256     TopoDS_Vertex aV1, aV2;
00257     //
00258     aW=TopoDS::Wire(aS);
00259     TopExp::Vertices(aW, aV1, aV2);
00260     //
00261     bIsClosed=aV1.IsSame(aV2);
00262     aKC=(bIsClosed) ? GEOMAlgo_KC_CLOSED :GEOMAlgo_KC_NOTCLOSED;
00263     aInfo.SetKindOfClosed(aKC);
00264   }
00265   //
00266   FillSubShapes(aS);
00267 }
00268 //=======================================================================
00269 //function : FillSolid
00270 //purpose  :
00271 //=======================================================================
00272   void GEOMAlgo_ShapeInfoFiller::FillSolid(const TopoDS_Shape& aS)
00273 {
00274   Standard_Integer aNbShells;
00275   TopoDS_Solid aSd;
00276   //
00277   myErrorStatus=0;
00278   //----------------------------------------------------
00279   if (myMapInfo.Contains(aS)) {
00280     return;
00281   }
00282   else {
00283     GEOMAlgo_ShapeInfo aInfoX;
00284     myMapInfo.Add(aS, aInfoX);
00285   }
00286   GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aS);
00287   //----------------------------------------------------
00288   aInfo.SetType(TopAbs_SOLID);
00289   FillNbSubShapes(aS, aInfo);
00290   FillSubShapes(aS);
00291   //
00292   aSd=TopoDS::Solid(aS);
00293   //
00294   aNbShells=NbShells(aSd);
00295   if (aNbShells>1) {
00296     return;
00297   }
00298   //
00299   FillDetails(aSd);
00300 }
00301 //=======================================================================
00302 //function :FillFace
00303 //purpose  :
00304 //=======================================================================
00305   void GEOMAlgo_ShapeInfoFiller::FillFace(const TopoDS_Shape& aS)
00306 {
00307   myErrorStatus=0;
00308   //
00309   Standard_Boolean bIsAllowedType;
00310   Standard_Integer aNbWires;//, iRet
00311   Standard_Boolean bInf, bInfU1, bInfU2, bInfV1, bInfV2;
00312   Standard_Real aUMin, aUMax, aVMin, aVMax, aR1, aR2;
00313   gp_Pnt aP0;
00314   gp_Dir aDN;
00315   gp_Ax3 aAx3;
00316   GeomAbs_SurfaceType aST;
00317   Handle(Geom_Surface) aSurf;
00318   TopoDS_Face aF;
00319   //GEOMAlgo_KindOfName aKindOfName;
00320   //----------------------------------------------------
00321   if (myMapInfo.Contains(aS)) {
00322     return;
00323   }
00324   else {
00325     GEOMAlgo_ShapeInfo aInfoX;
00326     myMapInfo.Add(aS, aInfoX);
00327   }
00328   GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aS);
00329   //----------------------------------------------------
00330   aInfo.SetType(TopAbs_FACE);
00331   //
00332   FillNbSubShapes(aS, aInfo);
00333   //
00334   FillSubShapes(aS);
00335   //
00336   aF=TopoDS::Face(aS);
00337   //
00338   aNbWires=NbWires(aF);
00339   //
00340   aSurf=BRep_Tool::Surface(aF);
00341   GeomAdaptor_Surface aGAS(aSurf);
00342   aST=aGAS.GetType();
00343   bIsAllowedType=IsAllowedType(aST);
00344   if (!bIsAllowedType) {
00345     return;
00346   }
00347   //
00348   // 1. Plane
00349   if (aST==GeomAbs_Plane) {
00350     gp_Pln aPln;
00351     //
00352     aPln=aGAS.Plane();
00353     aP0=aPln.Location();
00354     aAx3=aPln.Position();
00355     //
00356     aInfo.SetKindOfShape(GEOMAlgo_KS_PLANE);
00357     aInfo.SetKindOfClosed(GEOMAlgo_KC_NOTCLOSED);
00358     aInfo.SetLocation(aP0);
00359     aInfo.SetPosition(aAx3);
00360     //
00361     if (aNbWires>1) return;
00362     //
00363     //aSurf->Bounds(aUMin, aUMax, aVMin, aVMax);
00364     BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax);
00365     bInfU1=Precision::IsNegativeInfinite(aUMin);
00366     bInfU2=Precision::IsPositiveInfinite(aUMax);
00367     bInfV1=Precision::IsNegativeInfinite(aVMin);
00368     bInfV2=Precision::IsPositiveInfinite(aVMax);
00369     //
00370     bInf=(bInfU1 || bInfU2 || bInfV1 || bInfV2);
00371     if (bInf) {
00372       aInfo.SetKindOfBounds(GEOMAlgo_KB_INFINITE);
00373     }
00374     else {
00375       aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED);
00376     }
00377     //
00378     FillDetails(aF, aPln);
00379   }// if (aCT==GeomAbs_Line) {
00380   //
00381   // 2. Sphere
00382   else if (aST==GeomAbs_Sphere) {
00383     gp_Sphere aSphere;
00384     //
00385     aSphere=aGAS.Sphere();
00386     aP0=aSphere.Location();
00387     aAx3=aSphere.Position();
00388     aR1=aSphere.Radius();
00389     //
00390     aInfo.SetKindOfShape(GEOMAlgo_KS_SPHERE);
00391     aInfo.SetLocation(aP0);
00392     aInfo.SetPosition(aAx3);
00393     aInfo.SetRadius1(aR1);
00394     //
00395     if (aNbWires>1) return;
00396     //
00397     aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED);
00398     aInfo.SetKindOfClosed(GEOMAlgo_KC_CLOSED);
00399     //
00400     FillDetails(aF, aSphere);
00401   }// else if (aST==GeomAbs_Sphere) {
00402   //
00403   // 3. Cylinder
00404   else if (aST==GeomAbs_Cylinder) {
00405     gp_Cylinder aCyl;
00406     //
00407     aCyl=aGAS.Cylinder();
00408     aP0=aCyl.Location();
00409     aAx3=aCyl.Position();
00410     aR1=aCyl.Radius();
00411     //
00412     aInfo.SetKindOfShape(GEOMAlgo_KS_CYLINDER);
00413     aInfo.SetLocation(aP0);
00414     aInfo.SetPosition(aAx3);
00415     aInfo.SetRadius1(aR1);
00416     //
00417     if (aNbWires>1) return;
00418     //
00419     BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax);
00420     bInfU1=Precision::IsNegativeInfinite(aUMin);
00421     bInfU2=Precision::IsPositiveInfinite(aUMax);
00422     bInfV1=Precision::IsNegativeInfinite(aVMin);
00423     bInfV2=Precision::IsPositiveInfinite(aVMax);
00424     //
00425     bInf=(bInfU1 || bInfU2 || bInfV1 || bInfV2);
00426     if (bInf) {
00427       aInfo.SetKindOfBounds(GEOMAlgo_KB_INFINITE);
00428     }
00429     else {
00430       aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED);
00431     }
00432     FillDetails(aF, aCyl);
00433   }
00434   //
00435   // 4. Cone
00436   else if (aST==GeomAbs_Cone) {
00437     gp_Cone aCone;
00438     //
00439     aCone=aGAS.Cone();
00440     aP0=aCone.Location();
00441     aAx3=aCone.Position();
00442     //aR1=aCyl.Radius();
00443     //
00444     aInfo.SetKindOfShape(GEOMAlgo_KS_CONE);
00445     aInfo.SetLocation(aP0);
00446     aInfo.SetPosition(aAx3);
00447     //aInfo.SetRadius1(aR1);
00448     //
00449     if (aNbWires>1) return;
00450     //
00451     BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax);
00452     bInfU1=Precision::IsNegativeInfinite(aUMin);
00453     bInfU2=Precision::IsPositiveInfinite(aUMax);
00454     bInfV1=Precision::IsNegativeInfinite(aVMin);
00455     bInfV2=Precision::IsPositiveInfinite(aVMax);
00456     //
00457     bInf=(bInfU1 || bInfU2 || bInfV1 || bInfV2);
00458     if (bInf) {
00459       aInfo.SetKindOfBounds(GEOMAlgo_KB_INFINITE);
00460     }
00461     else {
00462       aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED);
00463     }
00464     FillDetails(aF, aCone);
00465   }
00466   //
00467   // 5. Torus
00468   else if (aST==GeomAbs_Torus) {
00469     gp_Torus aTorus;
00470     //
00471     aTorus=aGAS.Torus();
00472     aP0=aTorus.Location();
00473     aAx3=aTorus.Position();
00474     aR1=aTorus.MajorRadius();
00475     aR2=aTorus.MinorRadius();
00476     //
00477     aInfo.SetKindOfShape(GEOMAlgo_KS_TORUS);
00478     aInfo.SetLocation(aP0);
00479     aInfo.SetPosition(aAx3);
00480     aInfo.SetRadius1(aR1);
00481     aInfo.SetRadius2(aR2);
00482     //
00483     if (aNbWires>1) return;
00484     //
00485     aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED);
00486     //
00487     FillDetails(aF, aTorus);
00488   }
00489 }
00490 //=======================================================================
00491 //function :FillEdge
00492 //purpose  :
00493 //=======================================================================
00494   void GEOMAlgo_ShapeInfoFiller::FillEdge(const TopoDS_Shape& aS)
00495 {
00496   myErrorStatus=0;
00497   //
00498   Standard_Boolean bDegenerated, bIsAllowedType;
00499   Standard_Integer aNbV;
00500   Standard_Real aR1, aR2;
00501   gp_Pnt aP, aP1, aP2, aPc;
00502   gp_Dir aD;
00503   gp_Ax2 aAx2;
00504   Standard_Real aT1, aT2;
00505   GeomAbs_CurveType aCT;
00506   Handle(Geom_Curve) aC3D;
00507   TopoDS_Edge aE;
00508   //----------------------------------------------------
00509   if (myMapInfo.Contains(aS)) {
00510     return;
00511   }
00512   else {
00513     GEOMAlgo_ShapeInfo aInfoX;
00514     myMapInfo.Add(aS, aInfoX);
00515   }
00516   GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aS);
00517   //----------------------------------------------------
00518   aInfo.SetType(TopAbs_EDGE);
00519   //
00520   FillNbSubShapes(aS, aInfo);
00521   //
00522   aE=TopoDS::Edge(aS);
00523   //
00524   bDegenerated=BRep_Tool::Degenerated(aE);
00525   if (bDegenerated) {
00526     aInfo.SetKindOfShape(GEOMAlgo_KS_DEGENERATED);
00527     FillSubShapes(aS);
00528     return;
00529   }
00530   //
00531   aC3D=BRep_Tool::Curve(aE, aT1, aT2);
00532   GeomAdaptor_Curve aGAC(aC3D);
00533   aCT=aGAC.GetType();
00534   bIsAllowedType=IsAllowedType(aCT);
00535   if (!bIsAllowedType) {
00536     FillSubShapes(aS);
00537     return;
00538   }
00539   // Line
00540   if (aCT==GeomAbs_Line) {
00541     Standard_Boolean bInf1, bInf2;
00542     Standard_Real aLength;
00543     gp_Lin aLin;
00544     gp_XYZ aXYZ1, aXYZ2, aXYZc;
00545     //
00546     aLin=aGAC.Line();
00547     aP=aLin.Location();
00548     aD=aLin.Direction();
00549     //
00550     aInfo.SetKindOfShape(GEOMAlgo_KS_LINE);
00551     aInfo.SetKindOfClosed(GEOMAlgo_KC_NOTCLOSED);
00552     aInfo.SetLocation(aP);
00553     aInfo.SetDirection(aD);
00554     //
00555     bInf1=Precision::IsNegativeInfinite(aT1);
00556     bInf2=Precision::IsPositiveInfinite(aT2);
00557     if (bInf1||bInf2) {
00558       aInfo.SetKindOfBounds(GEOMAlgo_KB_INFINITE);
00559       aInfo.SetKindOfName(GEOMAlgo_KN_LINE);
00560     }
00561     else {
00562       aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED);
00563       aInfo.SetKindOfName(GEOMAlgo_KN_SEGMENT);
00564       aGAC.D0(aT1, aP1);
00565       aGAC.D0(aT2, aP2);
00566       aInfo.SetPnt1(aP1);
00567       aInfo.SetPnt2(aP2);
00568       //
00569       aLength=aP1.Distance(aP2);
00570       aXYZ1=aP1.XYZ();
00571       aXYZ2=aP2.XYZ();
00572       aXYZc=aXYZ1+aXYZ2;
00573       aXYZc.Multiply(0.5);
00574       //
00575       aPc.SetXYZ(aXYZc);
00576       gp_Vec aVec(aPc, aP2);
00577       gp_Dir aDir(aVec);
00578       //
00579       aInfo.SetLocation(aPc);
00580       aInfo.SetDirection(aDir);
00581       aInfo.SetLength(aLength);
00582     }
00583   }// if (aCT==GeomAbs_Line) {
00584   //
00585   // Circle
00586   else if (aCT==GeomAbs_Circle) {
00587     gp_Circ aCirc;
00588     //
00589     aCirc=aGAC.Circle();
00590     aP=aCirc.Location();
00591     aAx2=aCirc.Position();
00592     aR1=aCirc.Radius();
00593     //
00594     aInfo.SetKindOfShape(GEOMAlgo_KS_CIRCLE);
00595     aInfo.SetLocation(aP);
00596     aInfo.SetPosition(aAx2);
00597     aInfo.SetRadius1(aR1);
00598     //
00599     aNbV=aInfo.NbSubShapes(TopAbs_VERTEX);
00600     if (!aNbV) {
00601       myErrorStatus=11; // circle edge without vertices
00602       return;
00603     }
00604     aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED);
00605     aGAC.D0(aT1, aP1);
00606     aGAC.D0(aT2, aP2);
00607     aInfo.SetPnt1(aP1);
00608     aInfo.SetPnt2(aP2);
00609     //
00610     if (aNbV==1) {
00611       aInfo.SetKindOfClosed(GEOMAlgo_KC_CLOSED);
00612       aInfo.SetKindOfName(GEOMAlgo_KN_CIRCLE);
00613     }
00614     else {
00615       aInfo.SetKindOfClosed(GEOMAlgo_KC_NOTCLOSED);
00616       aInfo.SetKindOfName(GEOMAlgo_KN_ARCCIRCLE);
00617       //
00618       gp_Vec aVecX(aP, aP1);
00619       gp_Dir aDirX(aVecX);
00620       gp_Ax2 aAx2new(aP, aAx2.Direction(), aDirX);
00621       aInfo.SetPosition(aAx2new);
00622     }
00623   }// else if (aCT==GeomAbs_Circle) {
00624   //
00625   // Ellipse
00626   else if (aCT==GeomAbs_Ellipse) {
00627     gp_Elips aElips;
00628     //
00629     aElips=aGAC.Ellipse();
00630     aP=aElips.Location();
00631     aAx2=aElips.Position();
00632     aR1=aElips.MajorRadius();
00633     aR2=aElips.MinorRadius();
00634     //
00635     aInfo.SetKindOfShape(GEOMAlgo_KS_ELLIPSE);
00636     aInfo.SetLocation(aP);
00637     aInfo.SetPosition(aAx2);
00638     aInfo.SetRadius1(aR1);
00639     aInfo.SetRadius2(aR2);
00640     //
00641     aNbV=aInfo.NbSubShapes(TopAbs_VERTEX);
00642     if (!aNbV) {
00643       myErrorStatus=11; // ellipse edge without vertices
00644       return;
00645     }
00646     aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED);
00647     aGAC.D0(aT1, aP1);
00648     aGAC.D0(aT2, aP2);
00649     aInfo.SetPnt1(aP1);
00650     aInfo.SetPnt2(aP2);
00651     //
00652     if (aNbV==1) {
00653       aInfo.SetKindOfClosed(GEOMAlgo_KC_CLOSED);
00654       aInfo.SetKindOfName(GEOMAlgo_KN_ELLIPSE);
00655     }
00656     else {
00657       aInfo.SetKindOfClosed(GEOMAlgo_KC_NOTCLOSED);
00658       aInfo.SetKindOfName(GEOMAlgo_KN_ARCELLIPSE);
00659       //
00660       gp_Vec aVecX(aP, aP1);
00661       gp_Dir aDirX(aVecX);
00662       gp_Ax2 aAx2new(aP, aAx2.Direction(), aDirX);
00663       aInfo.SetPosition(aAx2new);
00664     }
00665   }// else if (aCT==GeomAbs_Ellipse) {
00666   //
00667   FillSubShapes(aS);
00668 }
00669 //=======================================================================
00670 //function :FillVertex
00671 //purpose  :
00672 //=======================================================================
00673   void GEOMAlgo_ShapeInfoFiller::FillVertex(const TopoDS_Shape& aS)
00674 {
00675   myErrorStatus=0;
00676   //
00677   gp_Pnt aP;
00678   TopoDS_Vertex aV;
00679   //
00680   if (myMapInfo.Contains(aS)) {
00681     return;
00682   }
00683   else {
00684     GEOMAlgo_ShapeInfo aInfoX;
00685     myMapInfo.Add(aS, aInfoX);
00686   }
00687   GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aS);
00688   //
00689   aV=TopoDS::Vertex(aS);
00690   aP=BRep_Tool::Pnt(aV);
00691   //
00692   aInfo.SetType(TopAbs_VERTEX);
00693   aInfo.SetLocation(aP);
00694   myMapInfo.Add(aS, aInfo);
00695 }
00696 //=======================================================================
00697 //function : FillNbSubshapes
00698 //purpose  :
00699 //=======================================================================
00700   void GEOMAlgo_ShapeInfoFiller::FillNbSubShapes(const TopoDS_Shape& aS,
00701                                                  GEOMAlgo_ShapeInfo& aInfo)
00702 {
00703   myErrorStatus=0;
00704   //
00705   Standard_Integer i, aNb, aNbS;
00706   TopTools_IndexedMapOfShape aM;
00707   TopAbs_ShapeEnum aST;
00708   TopAbs_ShapeEnum aTypes[]= {
00709     //TopAbs_FACE, TopAbs_EDGE, TopAbs_VERTEX
00710     TopAbs_COMPOUND,
00711     TopAbs_COMPSOLID,
00712     TopAbs_SOLID,
00713     TopAbs_SHELL,
00714     TopAbs_FACE,
00715     TopAbs_WIRE,
00716     TopAbs_EDGE,
00717     TopAbs_VERTEX
00718   };
00719 
00720   //
00721   aST=aS.ShapeType();
00722   aNb=sizeof(aTypes)/sizeof(aTypes[0]);
00723   for (i=0; i<aNb; ++i) {
00724     if (aTypes[i]==aST) {
00725       continue;
00726     }
00727     aM.Clear();
00728     TopExp::MapShapes(aS, aTypes[i], aM);
00729     aNbS=aM.Extent();
00730     aInfo.SetNbSubShapes(aTypes[i], aNbS);
00731   }
00732 }
00733 //=======================================================================
00734 //function :NbShells
00735 //purpose  :
00736 //=======================================================================
00737 Standard_Integer NbShells(const TopoDS_Solid& aSd)
00738 {
00739   Standard_Integer iCnt;
00740   TopoDS_Iterator aIt;
00741   //
00742   iCnt=0;
00743   //
00744   aIt.Initialize(aSd);
00745   for (; aIt.More(); aIt.Next()){
00746     //const TopoDS_Shape& aSh=aIt.Value();
00747     ++iCnt;
00748   }
00749   return iCnt;
00750 }
00751 //=======================================================================
00752 //function : NbWires
00753 //purpose  :
00754 //=======================================================================
00755 Standard_Integer NbWires(const TopoDS_Face& aF)
00756 {
00757   Standard_Integer iCnt;
00758   TopoDS_Iterator aIt;
00759   //
00760   iCnt=0;
00761   //
00762   aIt.Initialize(aF);
00763   for (; aIt.More(); aIt.Next()){
00764     //const TopoDS_Shape& aW=aIt.Value();
00765     ++iCnt;
00766   }
00767   return iCnt;
00768 }
00769 //=======================================================================
00770 //function : IsAllowedType
00771 //purpose  :
00772 //=======================================================================
00773 Standard_Boolean IsAllowedType(const GeomAbs_CurveType aCT)
00774 {
00775   Standard_Boolean bRet;
00776   Standard_Integer i, aNb;
00777   GeomAbs_CurveType aTypes[]={
00778     GeomAbs_Line, GeomAbs_Circle, GeomAbs_Ellipse
00779   };
00780   //
00781   bRet=Standard_False;
00782   aNb=sizeof(aTypes)/sizeof(aTypes[0]);
00783   for (i=0; i<aNb && !bRet; ++i) {
00784     bRet=(aCT==aTypes[i]);
00785   }
00786   //
00787   return bRet;
00788 }
00789 //=======================================================================
00790 //function : IsAllowedType
00791 //purpose  :
00792 //=======================================================================
00793 Standard_Boolean IsAllowedType(const GeomAbs_SurfaceType aST)
00794 {
00795   Standard_Boolean bRet;
00796   Standard_Integer i, aNb;
00797   GeomAbs_SurfaceType aTypes[]={
00798     GeomAbs_Plane, GeomAbs_Cylinder,
00799     GeomAbs_Cone,  GeomAbs_Sphere,
00800     GeomAbs_Torus
00801   };
00802   //
00803   bRet=Standard_False;
00804   aNb=sizeof(aTypes)/sizeof(aTypes[0]);
00805   for (i=0; i<aNb && !bRet; ++i) {
00806     bRet=(aST==aTypes[i]);
00807   }
00808   //
00809   return bRet;
00810 }
00811 //
00812 // myErrorStatus
00813 //
00814 // 0  - Ok
00815 // 1  - The object is just initialized
00816 //
00817 // 10 - Null shape
00818 // 11 - circle/ellipse edge without vertices