Back to index

salome-geom  6.5.0
GEOMAlgo_WESScaler.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 // File:      GEOMAlgo_WESScaler.cxx
00020 // Created:
00021 // Author:
00022 //            <pkv@VORTEX>
00023 
00024 
00025 #include <GEOMAlgo_WESScaler.hxx>
00026 
00027 #include <gp_Pnt.hxx>
00028 #include <gp_Trsf.hxx>
00029 
00030 #include <TopoDS_Face.hxx>
00031 #include <TopoDS_Iterator.hxx>
00032 #include <TopoDS_Wire.hxx>
00033 #include <BRep_Builder.hxx>
00034 
00035 #include <TopTools_ListOfShape.hxx>
00036 #include <TopTools_ListIteratorOfListOfShape.hxx>
00037 
00038 #include <BRepBuilderAPI_Transform.hxx>
00039 
00040 
00041 //=======================================================================
00042 //function :
00043 //purpose  :
00044 //=======================================================================
00045   GEOMAlgo_WESScaler::GEOMAlgo_WESScaler()
00046 :
00047   GEOMAlgo_Algo()
00048 {
00049   myScale=1.;
00050 }
00051 //=======================================================================
00052 //function : ~
00053 //purpose  :
00054 //=======================================================================
00055   GEOMAlgo_WESScaler::~GEOMAlgo_WESScaler()
00056 {
00057 }
00058 //=======================================================================
00059 // function: SetScale
00060 // purpose:
00061 //=======================================================================
00062   void GEOMAlgo_WESScaler::SetScale (const Standard_Real aScale)
00063 {
00064   myScale=aScale;
00065 }
00066 //=======================================================================
00067 // function: Scale
00068 // purpose:
00069 //=======================================================================
00070   Standard_Real GEOMAlgo_WESScaler::Scale()const
00071 {
00072   return myScale;
00073 }
00074 //=======================================================================
00075 // function: SetFace
00076 // purpose:
00077 //=======================================================================
00078   void GEOMAlgo_WESScaler::SetFace(const TopoDS_Face& aF)
00079 {
00080   myFace=aF;
00081 }
00082 //=======================================================================
00083 // function: Face
00084 // purpose:
00085 //=======================================================================
00086   const TopoDS_Face& GEOMAlgo_WESScaler::Face()const
00087 {
00088   return myFace;
00089 }
00090 //=======================================================================
00091 // function: SetEdges
00092 // purpose:
00093 //=======================================================================
00094   void GEOMAlgo_WESScaler::SetEdges(const TopTools_ListOfShape& aLE)
00095 {
00096   myEdges=aLE;
00097 }
00098 //=======================================================================
00099 // function: Edges
00100 // purpose:
00101 //=======================================================================
00102   const TopTools_ListOfShape& GEOMAlgo_WESScaler::Edges()const
00103 {
00104   return myEdges;
00105 }
00106 //=======================================================================
00107 // function: FaceScaled
00108 // purpose:
00109 //=======================================================================
00110   const TopoDS_Face& GEOMAlgo_WESScaler::FaceScaled()const
00111 {
00112   return myFaceScaled;
00113 }
00114 //=======================================================================
00115 // function: EdgesScaled
00116 // purpose:
00117 //=======================================================================
00118   const TopTools_ListOfShape& GEOMAlgo_WESScaler::EdgesScaled()const
00119 {
00120   return myEdgesScaled;
00121 }
00122 //=======================================================================
00123 // function: Image
00124 // purpose:
00125 //=======================================================================
00126   const TopoDS_Shape& GEOMAlgo_WESScaler::Image (const TopoDS_Shape& aS) const
00127 {
00128   if (myImages.IsBound(aS)) {
00129     return myImages.Find(aS);
00130   }
00131   return myShapeTmp;
00132 }
00133 //=======================================================================
00134 // function: Origin
00135 // purpose:
00136 //=======================================================================
00137   const TopoDS_Shape& GEOMAlgo_WESScaler::Origin (const TopoDS_Shape& aS) const
00138 {
00139   if (myOrigins.IsBound(aS)) {
00140     return myOrigins.Find(aS);
00141   }
00142   return myShapeTmp;
00143 }
00144 //=======================================================================
00145 // function: Images
00146 // purpose:
00147 //=======================================================================
00148   const GEOMAlgo_DataMapOfOrientedShapeShape& GEOMAlgo_WESScaler::Images () const
00149 {
00150   return myImages;
00151 }
00152 //=======================================================================
00153 // function: Origins
00154 // purpose:
00155 //=======================================================================
00156   const GEOMAlgo_DataMapOfOrientedShapeShape& GEOMAlgo_WESScaler::Origins () const
00157 {
00158   return myOrigins;
00159 }
00160 //=======================================================================
00161 // function: CheckData
00162 // purpose:
00163 //=======================================================================
00164   void GEOMAlgo_WESScaler::CheckData()
00165 {
00166   myErrorStatus=0;
00167   //
00168   if(myFace.IsNull()) {
00169     myErrorStatus=2;
00170     return;
00171   }
00172   if(!myEdges.Extent()) {
00173     myErrorStatus=3;
00174     return;
00175   }
00176   if (myScale<=0.){
00177     myErrorStatus=4;
00178   }
00179 }
00180 //=======================================================================
00181 // function: Perform
00182 // purpose:
00183 //=======================================================================
00184   void GEOMAlgo_WESScaler::Perform()
00185 {
00186   Standard_Boolean bIsDone;
00187   Standard_Integer i;
00188   gp_Pnt aP;
00189   gp_Trsf aTrsf;
00190   TopAbs_Orientation aOr;
00191   TopoDS_Shape aFC, aFR, aER;
00192   TopoDS_Wire aWE;
00193   TopoDS_Iterator aItS;
00194   BRep_Builder aBB;
00195   TopTools_ListIteratorOfListOfShape aIt;
00196   //
00197   // 0. CheckData
00198   CheckData();
00199   if(myErrorStatus) {
00200     return;
00201   }
00202   //
00203   myImages.Clear();
00204   myOrigins.Clear();
00205   myEdgesScaled.Clear();
00206   //
00207   // 1. aFC
00208   aFC=myFace.EmptyCopied();
00209   //
00210   aBB.MakeWire(aWE);
00211   aIt.Initialize(myEdges);
00212   for (; aIt.More(); aIt.Next()) {
00213     const TopoDS_Shape& aE=aIt.Value();
00214     aBB.Add(aWE, aE);
00215   }
00216   aBB.Add(aFC, aWE);
00217   //
00218   aItS.Initialize(myFace);
00219   for (; aItS.More(); aItS.Next()) {
00220     const TopoDS_Shape& aW=aItS.Value();
00221     aBB.Add(aFC, aW);
00222   }
00223   //
00224   // 2. Scale aFC
00225   aP.SetCoord(0.,0.,0.);
00226   aTrsf.SetScale(aP, myScale);
00227   //
00228   BRepBuilderAPI_Transform aBT(aTrsf);
00229   aBT.Perform(aFC);
00230   bIsDone=aBT.IsDone();
00231   if (!bIsDone) {
00232     myErrorStatus=10;
00233     return;
00234   }
00235   //
00236   const TopoDS_Shape& aSR=aBT.Shape();
00237   //
00238   // Refined image face FR
00239   aFR=aSR.EmptyCopied();
00240   aItS.Initialize(aSR);
00241   for (i=0; aItS.More(); aItS.Next(),++i) {
00242     const TopoDS_Shape& aWR=aItS.Value();
00243     if (i) {
00244       aBB.Add(aFR, aWR);
00245     }
00246   }
00247   myFaceScaled=*((TopoDS_Face*)&aFR);
00248   //
00249   // 3. Fill Images, Origins, EdgesScaled
00250   aIt.Initialize(myEdges);
00251   for (; aIt.More(); aIt.Next()) {
00252     const TopoDS_Shape& aE=aIt.Value();
00253     aOr=aE.Orientation();
00254     //
00255     aER=aBT.ModifiedShape(aE);
00256     if(aER.IsNull()) {
00257       myErrorStatus=11;
00258       return;
00259     }
00260     //
00261     aER.Orientation(aOr);
00262     myImages.Bind(aE, aER);
00263     myOrigins.Bind(aER, aE);
00264     //
00265     myEdgesScaled.Append(aER);
00266   }
00267 }