]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Merge from V6_4_BR 05/12/2011
authorvsr <vsr@opencascade.com>
Mon, 5 Dec 2011 10:29:45 +0000 (10:29 +0000)
committervsr <vsr@opencascade.com>
Mon, 5 Dec 2011 10:29:45 +0000 (10:29 +0000)
38 files changed:
configure.ac
doc/docutils/conf.py.in
doc/salome/gui/GEOM/input/creating_face.doc
doc/salome/gui/GEOM/input/tui_test_all.doc
doc/salome/gui/GEOM/input/viewing_geom_obj.doc
src/BuildGUI/BuildGUI_FaceDlg.cxx
src/EntityGUI/EntityGUI_SketcherDlg.cxx
src/EntityGUI/EntityGUI_SubShapeDlg.cxx
src/GEOMAlgo/GEOMAlgo_Tools3D.cdl
src/GEOMAlgo/GEOMAlgo_Tools3D.cxx
src/GEOMAlgo/GEOMAlgo_Tools3D.hxx
src/GEOMAlgo/GEOMAlgo_Tools3D.jxx
src/GEOMGUI/GEOM_msg_en.ts
src/GEOMGUI/GEOM_msg_fr.ts
src/GEOMGUI/GeometryGUI.cxx
src/GEOMImpl/BRepBuilderAPI_GTransform_21423.cxx [new file with mode: 0755]
src/GEOMImpl/BRepBuilderAPI_GTransform_21423.hxx [new file with mode: 0644]
src/GEOMImpl/BRepBuilderAPI_ModifyShape_21423.cxx [new file with mode: 0755]
src/GEOMImpl/BRepBuilderAPI_ModifyShape_21423.hxx [new file with mode: 0644]
src/GEOMImpl/BRepBuilderAPI_NurbsConvert_21423.cxx [new file with mode: 0755]
src/GEOMImpl/BRepBuilderAPI_NurbsConvert_21423.hxx [new file with mode: 0644]
src/GEOMImpl/BRepTools_Modifier_21423.cxx [new file with mode: 0644]
src/GEOMImpl/BRepTools_Modifier_21423.hxx [new file with mode: 0644]
src/GEOMImpl/BRepTools_NurbsConvertModification_21423.cxx [new file with mode: 0644]
src/GEOMImpl/BRepTools_NurbsConvertModification_21423.hxx [new file with mode: 0644]
src/GEOMImpl/GEOMImpl_Block6Explorer.cxx
src/GEOMImpl/GEOMImpl_Block6Explorer.hxx
src/GEOMImpl/GEOMImpl_IShapesOperations.cxx
src/GEOMImpl/GEOMImpl_ScaleDriver.cxx
src/GEOMImpl/GEOMImpl_ShapeDriver.cxx
src/GEOMImpl/Handle_BRepTools_NurbsConvertModification_21423.hxx [new file with mode: 0644]
src/GEOMImpl/Makefile.am
src/GEOM_I/GEOM_IShapesOperations_i.cc
src/GEOM_PY/structelem/parts.py
src/GEOM_SWIG/geompyDC.py
src/GroupGUI/GroupGUI_GroupDlg.cxx
src/OperationGUI/OperationGUI_PartitionDlg.cxx
src/ShHealOper/Makefile.am

index c24cf9e4899226b56f3c3ce2d4e7a0d41ae4567b..729d02fa134d2925a595f2c0270b1f95c211c6dc 100644 (file)
@@ -24,7 +24,7 @@
 # Modified by : Alexander BORODIN (OCN) - autotools usage
 # Created from configure.in.base
 #
-AC_INIT([Salome2 Project GEOM module], [6.3.1], [webmaster.salome@opencascade.com], [SalomeGEOM])
+AC_INIT([Salome2 Project GEOM module], [6.4.0], [webmaster.salome@opencascade.com], [SalomeGEOM])
 AC_CONFIG_AUX_DIR(adm_local/unix/config_files)
 AC_CANONICAL_HOST
 AC_CANONICAL_TARGET
index da8e3e23c5b6d16097672ddc3e94713bed4e814f..ab0f94d0765c2d39969b3f2ee731e4bceedff981 100644 (file)
@@ -184,7 +184,7 @@ latex_documents = [
 
 # The name of an image file (relative to this directory) to place at the top of
 # the title page.
-latex_logo = '../salome/tui/images/head.png'
+latex_logo = '@srcdir@/../salome/tui/images/head.png'
 
 # For "manual" documents, if this is true, then toplevel headings are parts,
 # not chapters.
index 11cd764984b99d6ab5cb2e52bc84139745cff3de..1bfd520ddd55a5bc5e070346c794bb06de3e5cdd 100644 (file)
@@ -17,6 +17,8 @@ placement of the wires. If some resulting wires remain open, they will
 be added in the resulting compound "as is".
 \n Check <b>Try to create a planar face</b> to create a planar
 face or nothing if it is impossible.
+\note Please note, that the resulting face can have a huge tolerance, if the initial wire has a big deviation from the plane. If the final tolerance exceeds 1e-06, a warning will be shown, but the face will be created and published in the study in a normal way. Using such faces can lead to failures or unpredictable results in most operations.
+
 \n The \b Result will be a \b GEOM_Object (FACE).
 
 \n <b>TUI Command:</b> <em>geompy.MakeFaceWires([list of Shapes], isPlanarWanted)</em>
@@ -33,6 +35,6 @@ face or nothing if it is impossible.
 \image html facesn3.png "Examples of faces"
 
 Our <b>TUI Scripts</b> provide you with useful examples of creation of 
-\ref tui_creation_squareface "Primitives".
+\ref tui_creation_face "Advanced Geometric Objects".
 
 */
index 9f7c305527b017fc4ab7d90c4eaa1de2128ce6bd..de0b4625015314a599c93368376f1f7761682cdf 100644 (file)
 \anchor swig_MakeMarker
 \until cs3
 
-\until MakePlaneThreePnt
+\until MakePlaneLCS
 
 \anchor swig_MakeArc
-\until MakeArcCenter
+\until MakeArcOfEllipse
 
 \anchor swig_MakeCircle
 \until Circle2
 
-\until MakeVertexOnCurve
-
-\until MakeVertexOnCurveByCoord
-
-\until MakeVertexOnSurface
-
-\until MakeVertexOnSurfaceByCoord
+\until MakeVertexOnCurveByLength
 
 \anchor swig_MakeVertexOnLinesIntersection
 \until p_on_l1l2
index ba06d2397d146f62bd2eb5530966201ccbb17e3a..4a43a25dfc5795282958b034c984d3be4dbf4515 100644 (file)
@@ -72,7 +72,7 @@ under certain conditions:
 \image html ob_popup_menu.png <br>
 
 <ul>
-<li>\subpage work_with_groups_page "Create Group" - allows creating groups of geometrical objects.</li>
+<li>\ref work_with_groups_page "Create Group" - allows creating groups of geometrical objects.</li>
 <li><b>Hide Children</b> / <b>Show Children</b> - hides / shows child
 sub-objects in the Object Browser, if the selected geometric object has
 child objects. When some child objects are hidden, the name of the
index 15daf9f860ddb853559e11031d553fa6d175f4f9..c1561405b7d2ba0bb0777cf4a1eadebfe576958a 100644 (file)
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 // GEOM GEOMGUI : GUI for Geometry component
 // File   : BuildGUI_FaceDlg.cxx
 // Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
-//
+
 #include "BuildGUI_FaceDlg.h"
 
 #include <GEOMImpl_Types.hxx>
 #include <GeometryGUI.h>
 #include <GEOMBase.h>
 
-#include <SUIT_ResourceMgr.h>
-#include <SUIT_Session.h>
 #include <SalomeApp_Application.h>
 #include <LightApp_SelectionMgr.h>
 
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_Session.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_OverrideCursor.h>
+
 //=================================================================================
 // class    : BuildGUI_FaceDlg()
 // purpose  : Constructs a BuildGUI_FaceDlg which is a child of 'parent', with the 
@@ -247,9 +249,17 @@ bool BuildGUI_FaceDlg::execute( ObjectList& objects )
 
   GEOM::GEOM_Object_var anObj = anOper->MakeFaceWires( objlist.in(), GroupWire->CheckButton1->isChecked() );
 
-  if ( !anObj->_is_nil() )
-    objects.push_back( anObj._retn() );
+  if (!anObj->_is_nil()) {
+    objects.push_back(anObj._retn());
+
+    if (!anOper->IsDone() && QString(anOper->GetErrorCode()) == "MAKE_FACE_TOLERANCE_TOO_BIG") {
+      SUIT_OverrideCursor wc;
+      wc.suspend();
+      QString msgw = QObject::tr(anOper->GetErrorCode());
+      SUIT_MessageBox::warning(this, tr("WRN_WARNING"), msgw, tr("BUT_OK"));
+      anOper->SetErrorCode("PAL_NO_ERROR");
+    }
+  }
 
   return true;
 }
-
index 27604981e15383083916dec23ca9ecec26e23307..e3ec23f224823ad4dc1eac56f1284259edb9cdc7 100644 (file)
@@ -157,7 +157,7 @@ EntityGUI_SketcherDlg::EntityGUI_SketcherDlg( GeometryGUI* GUI, QWidget* parent,
 
   GroupD2 = new EntityGUI_Dir2( MainWidget->DestCnt );
 
-  GroupD2->GroupDir2->setTitle( tr( "GEOM_SKETCHER_DIR" ) );
+  GroupD2->GroupDir2->setTitle( tr( "GEOM_SKETCHER_DIST" ) );
   GroupD2->RB_Dir21->setText( tr( "GEOM_SKETCHER_LENGTH" ) );
   GroupD2->RB_Dir22->setText( tr( "GEOM_SKETCHER_X" ) );
   GroupD2->RB_Dir23->setText( tr( "GEOM_SKETCHER_Y" ) );
index 19d30cbf4f0e961cba3c2997ce942ca291aaa2a3..e65655656ae3511fe4dde3a60ca7bc68a6d722e4 100644 (file)
@@ -544,7 +544,7 @@ int EntityGUI_SubShapeDlg::shapeType() const
   // Solving PAL5590
   type += myShape.ShapeType() + 1;
   if (myShape.ShapeType() == TopAbs_COMPOUND &&
-       NumberOfSubShapes(myShape, TopAbs_COMPOUND) > 0) {
+      NumberOfSubShapes(myShape, TopAbs_COMPOUND) > 0) {
     type--;
   }
 
@@ -573,11 +573,25 @@ void EntityGUI_SubShapeDlg::showOnlySelected()
   GEOM_Displayer* aDisplayer = getDisplayer();
 
   if (send == GroupPoints->PushButton3) {
-    aDisplayer->Erase(aSelList, false, true);
+    aDisplayer->Erase(aSelList, /*forced=*/false, /*updateViewer=*/true);
   }
   else {
-    aDisplayer->EraseAll();
+    // Mantis issue 0021421: do not hide main shape, if explode on VERTEX
+    SALOME_View* view = GEOM_Displayer::GetActiveView();
+    if (view) {
+      CORBA::String_var aMainEntry = myObject->GetStudyEntry();
+      Handle(SALOME_InteractiveObject) io =
+        new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO");
+      if (view->isVisible(io)) myIsHiddenMain = true;
+    }
+
+    aDisplayer->EraseAll(/*forced = false, updateViewer = true*/);
     aDisplayer->Display(aSelList, true);
+
+    // Mantis issue 0021421: do not hide main shape, if explode on VERTEX
+    if ((TopAbs_ShapeEnum)shapeType() == TopAbs_VERTEX && myIsHiddenMain) {
+      aDisplayer->Display(myObject);
+    }
   }
 }
 
@@ -658,13 +672,22 @@ void EntityGUI_SubShapeDlg::activateSelection()
   if (!myObject->_is_nil() && !isAllSubShapes())
   {
     GEOM_Displayer* aDisplayer = getDisplayer();
-    SALOME_View* view = GEOM_Displayer::GetActiveView();
-    if (view) {
-      CORBA::String_var aMainEntry = myObject->GetStudyEntry();
-      Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO");
-      if (view->isVisible(io)) {
-        aDisplayer->Erase(myObject, false, false);
-        myIsHiddenMain = true;
+
+    // Mantis issue 0021421: do not hide main shape, if explode on VERTEX
+    if ((TopAbs_ShapeEnum)shapeType() == TopAbs_VERTEX) {
+      if (myIsHiddenMain)
+        aDisplayer->Display(myObject);
+    }
+    else {
+      SALOME_View* view = GEOM_Displayer::GetActiveView();
+      if (view) {
+        CORBA::String_var aMainEntry = myObject->GetStudyEntry();
+        Handle(SALOME_InteractiveObject) io =
+          new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO");
+        if (view->isVisible(io)) {
+          aDisplayer->Erase(myObject, false, false);
+          myIsHiddenMain = true;
+        }
       }
     }
 
index dfd92ff010c56d3f30300095ce069d24ce8f95b0..a3f0033f759008d9ccf7b93a2111631f8cc3717c 100755 (executable)
@@ -32,6 +32,7 @@ uses
     State     from TopAbs,
     ShapeEnum from TopAbs, 
     Pnt from gp, 
+    Pnt2d from gp, 
     Shape  from TopoDS, 
     Vertex from TopoDS,
     Edge   from TopoDS, 
@@ -235,6 +236,18 @@ is
         --          If the method  returns True theEdgeOff is the 
         --          edge founded        
        returns Boolean from Standard; 
+       
+--modified by NIZNHY-PKV Tue Nov 22 12:18:30 2011f
+    PntInFace(myclass;  
+               theF  :  Face from TopoDS; 
+               theP  :out  Pnt from gp; 
+               theP2D:out  Pnt2d from gp) 
+       ---Purpose: Computes a point <theP> inside the face <theF>. 
+        --          <theP2D> -  2D  representation of <theP>   
+        --          on the surface of <theF>    
+       --          Returns 0 in case of success.  
+       returns Integer from Standard;  
+--modified by NIZNHY-PKV Tue Nov 22 12:18:36 2011t 
 
 --fields
 end Tools3D; 
index 8f08a2f7517c7b0b3789a762fbd7f84e20caddcd..a46a011dff4fa94c673905294e3b6bdbbea67f3e 100755 (executable)
 #include <gp_Pnt2d.hxx>
 #include <gp_Pln.hxx>
 #include <gp_XYZ.hxx>
+#include <gp_Dir2d.hxx>
 
 #include <Geom_Curve.hxx>
 #include <Geom_Surface.hxx>
+
 #include <Geom2d_Curve.hxx>
+#include <Geom2d_TrimmedCurve.hxx>
+#include <Geom2d_Line.hxx>
+
+#include <Geom2dHatch_Intersector.hxx>
+#include <Geom2dHatch_Hatcher.hxx>
+#include <HatchGen_Domain.hxx>
+
 #include <GeomAPI_ProjectPointOnSurf.hxx>
 
 #include <TopAbs_ShapeEnum.hxx>
@@ -69,6 +78,7 @@
 #include <TopTools_MapOfShape.hxx>
 
 #include <BRepClass3d_SolidClassifier.hxx>
+#include <BRepTools.hxx>
 
 #include <IntTools_Context.hxx>
 #include <IntTools_Tools.hxx>
@@ -113,11 +123,11 @@ static
 //function : IsInternalFace
 //purpose  :
 //=======================================================================
-  Standard_Boolean GEOMAlgo_Tools3D::IsInternalFace(const TopoDS_Face& theFace,
-                                                   const TopoDS_Solid& theSolid,
-                                                   const TopTools_IndexedDataMapOfShapeListOfShape& theMEF,
-                                                   const Standard_Real theTol,
-                                                   IntTools_Context& theContext)
+Standard_Boolean GEOMAlgo_Tools3D::IsInternalFace(const TopoDS_Face& theFace,
+                                                  const TopoDS_Solid& theSolid,
+                                                  const TopTools_IndexedDataMapOfShapeListOfShape& theMEF,
+                                                  const Standard_Real theTol,
+                                                  IntTools_Context& theContext)
 {
   Standard_Boolean bRet;
   Standard_Integer aNbF;
@@ -267,9 +277,6 @@ static
   //
   GetApproxNormalToFaceOnEdge (aE1, theFace1, aT, aPF1, aDNF1, theContext);
   GetApproxNormalToFaceOnEdge (aE2, theFace2, aT, aPF2, aDNF2, theContext);
-
-  //BOPTools_Tools3D::GetApproxNormalToFaceOnEdge (aE1, theFace1, aT, aPF1, aDNF1);
-  //BOPTools_Tools3D::GetApproxNormalToFaceOnEdge (aE2, theFace2, aT, aPF2, aDNF2);
   //
   aTwoPI=2.*PI;
   gp_Vec aVBF (aPx, aPF );
@@ -635,13 +642,39 @@ Standard_Boolean GEOMAlgo_Tools3D::GetEdgeOff (const TopoDS_Edge& theE1,
       }
     }
   }
+  //
+  //modified by NIZNHY-PKV Tue Nov 22 10:50:30 2011f
   if (!bFound) {
-    return bRet;
+    Standard_Boolean bFlag;
+    Standard_Integer iErr;
+    gp_Pnt2d aP2DFSp;
+    //
+    iErr=GEOMAlgo_Tools3D::PntInFace(theFSp, aPFSp, aP2DFSp);
+    if (iErr) {
+      return bRet;
+    }
+    //
+    aP2DFSp.Coord(aU, aV);
+    bFlag=BOPTools_Tools3D::GetNormalToSurface(aSp, aU, aV, aDNFSp);
+    if (!bFlag) {
+      return bRet;
+    }
+  }
+  else {
+    BRep_Tool::Range(aESp, aT1, aT2);
+    aT=BOPTools_Tools2D::IntermediatePoint(aT1, aT2);
+    BOPTools_Tools3D::GetApproxNormalToFaceOnEdge(aESp, theFSp, aT, aPFSp, aDNFSp);
   }
   //
+  /*
+  if (!bFound) {
+    return bRet;
+  }
   BRep_Tool::Range(aESp, aT1, aT2);
   aT=BOPTools_Tools2D::IntermediatePoint(aT1, aT2);
   BOPTools_Tools3D::GetApproxNormalToFaceOnEdge(aESp, theFSp, aT, aPFSp, aDNFSp);
+  */
+  //modified by NIZNHY-PKV Tue Nov 22 10:50:37 2011t
   //
   // Parts of theContext.ComputeVS(..)
   GeomAPI_ProjectPointOnSurf& aProjector=theContext.ProjPS(theFSr);
@@ -1111,7 +1144,6 @@ void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aEx,
         dT=dR;
       }
     }
-    //modified by NIZNHY-PKV Thu Dec 02 10:39:09 2010f
     else if (GeomAbs_Torus ||
              aTS==GeomAbs_Cylinder){
       Standard_Real aTolEx, aTolFx, aTol;
@@ -1123,7 +1155,6 @@ void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aEx,
         dT=aTol;
       }
     }
-    //modified by NIZNHY-PKV Thu Dec 02 10:39:13 2010t
   }
   //----------------------------------------------
   //
@@ -1147,3 +1178,124 @@ void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aEx,
     }
   }
 }
+
+//modified by NIZNHY-PKV Tue Nov 22 10:36:59 2011f
+//=======================================================================
+//function : PntInFace
+//purpose  : 
+//=======================================================================
+Standard_Integer GEOMAlgo_Tools3D::PntInFace(const TopoDS_Face& aF, 
+                                            gp_Pnt& theP,
+                                            gp_Pnt2d& theP2D)
+{
+  Standard_Boolean bIsDone, bHasFirstPoint, bHasSecondPoint;
+  Standard_Integer iErr, aIx, aNbDomains, i;
+  Standard_Real aUMin, aUMax, aVMin, aVMax;
+  Standard_Real aVx, aUx, aV1, aV2, aU1, aU2, aEpsT;
+  Standard_Real aTotArcIntr, aTolTangfIntr, aTolHatch2D, aTolHatch3D;
+  gp_Dir2d aD2D (0., 1.);
+  gp_Pnt2d aP2D;
+  gp_Pnt aPx;
+  Handle(Geom2d_Curve) aC2D;
+  Handle(Geom2d_TrimmedCurve) aCT2D;
+  Handle(Geom2d_Line) aL2D;
+  Handle(Geom_Surface) aS;
+  TopAbs_Orientation aOrE;
+  TopoDS_Face aFF;
+  TopExp_Explorer aExp;
+  //
+  aTolHatch2D=1.e-8;
+  aTolHatch3D=1.e-8;
+  aTotArcIntr=1.e-10;
+  aTolTangfIntr=1.e-10;
+  //
+  Geom2dHatch_Intersector aIntr(aTotArcIntr, aTolTangfIntr);
+  Geom2dHatch_Hatcher aHatcher(aIntr, 
+                              aTolHatch2D, aTolHatch3D, 
+                              Standard_True, Standard_False);
+  //
+  iErr=0;
+  aEpsT=1.e-12;
+  //
+  aFF=aF;
+  aFF.Orientation (TopAbs_FORWARD);
+  // 
+  aS=BRep_Tool::Surface(aFF);
+  BRepTools::UVBounds(aFF, aUMin, aUMax, aVMin, aVMax);
+  //
+  // 1
+  aExp.Init (aFF, TopAbs_EDGE);
+  for (; aExp.More() ; aExp.Next()) {
+    const TopoDS_Edge& aE=*((TopoDS_Edge*)&aExp.Current());
+    aOrE=aE.Orientation();
+    //
+    aC2D=BRep_Tool::CurveOnSurface (aE, aFF, aU1, aU2);
+    if (aC2D.IsNull() ) {
+      iErr=1;
+      return iErr;
+    }
+    if (fabs(aU1-aU2) < aEpsT) {
+      iErr=2;
+      return iErr;
+    }
+    //
+    aCT2D=new Geom2d_TrimmedCurve(aC2D, aU1, aU2);
+    aHatcher.AddElement(aCT2D, aOrE);
+  }// for (; aExp.More() ; aExp.Next()) {
+  //
+  // 2
+  aUx=IntTools_Tools::IntermediatePoint(aUMin, aUMax);
+  aP2D.SetCoord(aUx, 0.);
+  aL2D=new Geom2d_Line (aP2D, aD2D);
+  Geom2dAdaptor_Curve aHCur(aL2D);
+  //
+  aIx=aHatcher.AddHatching(aHCur) ;
+  //
+  // 3.
+  aHatcher.Trim();
+  bIsDone=aHatcher.TrimDone(aIx);
+  if (!bIsDone) {
+    iErr=3;
+    return iErr;
+  }
+  //
+  aHatcher.ComputeDomains(aIx);
+  bIsDone=aHatcher.IsDone(aIx);
+  if (!bIsDone) {
+    iErr=4;
+    return iErr;
+  }
+  //
+  // 4.
+  aNbDomains=aHatcher.NbDomains(aIx);
+  for (i=1; i<=aNbDomains; ++i) {
+    const HatchGen_Domain& aDomain=aHatcher.Domain (aIx, i) ;
+    bHasFirstPoint=aDomain.HasFirstPoint();
+    if (!bHasFirstPoint) {
+      iErr=5;
+      return iErr;
+    }
+    //
+    aV1=aDomain.FirstPoint().Parameter();
+    //
+    bHasSecondPoint=aDomain.HasSecondPoint();
+    if (!bHasSecondPoint) {
+      iErr=6;
+      return iErr;
+    }
+    //
+    aV2=aDomain.SecondPoint().Parameter();
+    //
+    aVx=IntTools_Tools::IntermediatePoint(aV1, aV2);
+    //
+    break;
+  }
+  //
+  aS->D0(aUx, aVx, aPx);
+  //
+  theP2D.SetCoord(aUx, aVx);
+  theP=aPx;
+  //
+  return iErr;
+}
+//modified by NIZNHY-PKV Tue Nov 22 10:37:01 2011t
index 2d9b9032bb95b7bc8ea6a7938ee991dc4ab49b39..43df2edc4bea7808713029e1531064100918351d 100644 (file)
@@ -46,6 +46,7 @@ class TopTools_ListOfShape;
 class TopTools_IndexedMapOfShape;
 class TopoDS_Solid;
 class gp_Pnt;
+class gp_Pnt2d;
 class TopoDS_Vertex;
 class TopTools_IndexedDataMapOfShapeListOfShape;
 class NMTTools_ListOfCoupleOfShape;
@@ -188,6 +189,11 @@ Standard_EXPORT static  Standard_Boolean GetEdgeOnFace(const TopoDS_Edge& theEdg
 //!          edge founded <br>
 Standard_EXPORT static  Standard_Boolean GetEdgeOff(const TopoDS_Edge& theEdge,const TopoDS_Face& theFace,TopoDS_Edge& theEdgeOff) ;
 
+//! Computes a point <theP> inside the face <theF>. <br>
+//!          <theP2D> -  2D  representation of <theP> <br>
+//!          on the surface of <theF> <br>
+//!          Returns 0 in case of success. <br>
+Standard_EXPORT   static  Standard_Integer PntInFace(const TopoDS_Face& theF,gp_Pnt& theP,gp_Pnt2d& theP2D) ;
 
 
 
index a8700f9a3be8bfcd7e40bb686e165a7c627795b2..d03adb8717715be4734d6cafd0ab010acea67b39 100644 (file)
@@ -53,6 +53,9 @@
 #ifndef _NMTTools_ListOfCoupleOfShape_HeaderFile
 #include <NMTTools_ListOfCoupleOfShape.hxx>
 #endif
+#ifndef _gp_Pnt2d_HeaderFile
+#include <gp_Pnt2d.hxx>
+#endif
 #ifndef _GEOMAlgo_Tools3D_HeaderFile
 #include <GEOMAlgo_Tools3D.hxx>
 #endif
index c6cf7a86119402200887fc61daae91610b24e17c..b55baeb187d4a19f50f5c10a9383384b8931efea 100644 (file)
@@ -605,6 +605,10 @@ Please, select face, shell or solid and try again</translation>
         <source>GEOM_FACE_OPT</source>
         <translation>Try to create a planar face</translation>
     </message>
+    <message>
+        <source>MAKE_FACE_TOLERANCE_TOO_BIG</source>
+        <translation>Tolerance of resulting face is too big</translation>
+    </message>
     <message>
         <source>GEOM_FACE_OR_LCS</source>
         <translation>Face or LCS</translation>
@@ -1589,6 +1593,10 @@ Please, select face, shell or solid and try again</translation>
         <source>GEOM_SKETCHER_DIR</source>
         <translation>Direction</translation>
     </message>
+    <message>
+        <source>GEOM_SKETCHER_DIST</source>
+        <translation>Distance</translation>
+    </message>
     <message>
         <source>GEOM_SKETCHER_DX2</source>
         <translation>DX :</translation>
@@ -1703,7 +1711,7 @@ Please, select face, shell or solid and try again</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_X3</source>
-        <translation>Abs. X :</translation>
+        <translation>DX :</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_Y</source>
@@ -1715,7 +1723,7 @@ Please, select face, shell or solid and try again</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_Y3</source>
-        <translation>Abs. Y :</translation>
+        <translation>DY :</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_Z2</source>
index efe2dd7e59e0ceec0e803ddabdf6b38ae208b715..129f3598972258b8c83dca13e4f996fb7265a48f 100644 (file)
@@ -489,6 +489,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
         <source>GEOM_DIMENSIONS</source>
         <translation>Dimensions</translation>
     </message>
+    <message>
+        <source>GEOM_SKETCHER_DIST</source>
+        <translation>Distance</translation>
+    </message>
     <message>
         <source>GEOM_DISTANCE</source>
         <translation>Distance</translation>
@@ -605,6 +609,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
         <source>GEOM_FACE_OPT</source>
         <translation>Privilégier la création d&apos;une face plane</translation>
     </message>
+    <message>
+        <source>MAKE_FACE_TOLERANCE_TOO_BIG</source>
+        <translation>La face créée a une tolérance élevée</translation>
+    </message>
     <message>
         <source>GEOM_FACE_OR_LCS</source>
         <translation>Face ou SCL</translation>
@@ -1703,7 +1711,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_X3</source>
-        <translation>Abs. X :</translation>
+        <translation>DX :</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_Y</source>
@@ -1715,7 +1723,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_Y3</source>
-        <translation>Abs. Y :</translation>
+        <translation>DY :</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_Z2</source>
index 2d352d9193a94a9a449c6d500bfd97a548a1bcba..59670b4cc8cddb0fdd5de59b1411ae02fc11f954 100644 (file)
@@ -23,6 +23,9 @@
 //  Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
 
 #include <Standard_math.hxx>  // E.A. must be included before Python.h to fix compilation on windows
+#ifdef HAVE_FINITE
+#undef HAVE_FINITE            // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
+#endif
 #include "Python.h"
 #include "GeometryGUI.h"
 #include "GeometryGUI_Operations.h"
diff --git a/src/GEOMImpl/BRepBuilderAPI_GTransform_21423.cxx b/src/GEOMImpl/BRepBuilderAPI_GTransform_21423.cxx
new file mode 100755 (executable)
index 0000000..43b5797
--- /dev/null
@@ -0,0 +1,111 @@
+// File:       BRepBuilderAPI_GTransform_21423.cxx
+// Created:    Mon Dec 30 17:12:14 1996
+// Author:     Stagiaire Mary FABIEN
+//             <fbi@zozox.paris1.matra-dtv.fr>
+
+#include <BRepBuilderAPI_GTransform_21423.hxx>
+
+#include <Standard_NoSuchObject.hxx>
+#include <gp_GTrsf.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopTools_ListOfShape.hxx>
+
+#include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <BRepTools_GTrsfModification.hxx>
+#include <BRepTools_NurbsConvertModification_21423.hxx>
+#include <BRepBuilderAPI_NurbsConvert_21423.hxx>
+#include <gp.hxx>
+
+#include <BRep_Builder.hxx>
+#include <TopoDS.hxx>
+
+//=======================================================================
+//function : BRepBuilderAPI_GTransform_21423
+//purpose  : 
+//=======================================================================
+
+BRepBuilderAPI_GTransform_21423::BRepBuilderAPI_GTransform_21423 (const gp_GTrsf& T) :
+  myGTrsf(T)
+{
+  myModification = new BRepTools_GTrsfModification(T);
+}
+
+
+//=======================================================================
+//function : BRepBuilderAPI_GTransform_21423
+//purpose  : 
+//=======================================================================
+
+BRepBuilderAPI_GTransform_21423::BRepBuilderAPI_GTransform_21423 (const TopoDS_Shape& S,
+                                       const gp_GTrsf& T,
+                                       const Standard_Boolean Copy) :
+  myGTrsf(T)
+{
+  myModification = new BRepTools_GTrsfModification(T);
+  Perform(S,Copy);
+}
+
+
+
+//=======================================================================
+//function : Perform
+//purpose  : 
+//=======================================================================
+
+void BRepBuilderAPI_GTransform_21423::Perform(const TopoDS_Shape& S,
+                                const Standard_Boolean Copy)
+{
+  BRepBuilderAPI_NurbsConvert_21423 nc;
+  nc.Perform(S, Copy);
+  myHist.Add(S,nc);
+  TopoDS_Shape Slocal = nc.Shape();
+  Handle(BRepTools_GTrsfModification) theModif =
+    Handle(BRepTools_GTrsfModification)::DownCast(myModification);
+  theModif->GTrsf() = myGTrsf;
+  DoModif(Slocal,myModification);
+//  myHist.Filter (Shape());
+}
+
+
+//=======================================================================
+//function : Modified
+//purpose  : 
+//=======================================================================
+
+const TopTools_ListOfShape& BRepBuilderAPI_GTransform_21423::Modified
+  (const TopoDS_Shape& F)
+{
+  myGenerated.Clear();
+  const TopTools_DataMapOfShapeListOfShape& M = myHist.Modification();
+  if (M.IsBound(F)) { 
+    TopTools_ListOfShape Li;
+    TopTools_ListIteratorOfListOfShape itL(M(F));
+    for (;itL.More();itL.Next())
+      Li.Assign(BRepBuilderAPI_ModifyShape_21423::Modified(itL.Value()));
+  }
+  return myGenerated;
+}
+
+
+//=======================================================================
+//function : ModifiedShape
+//purpose  : 
+//=======================================================================
+
+const TopoDS_Shape& BRepBuilderAPI_GTransform_21423::ModifiedShape
+  (const TopoDS_Shape& S) const
+{
+  const TopTools_DataMapOfShapeListOfShape &aMapModif = myHist.Modification();
+  TopoDS_Shape                              aShape    = S;
+
+  if (aMapModif.IsBound(S)) {
+    const TopTools_ListOfShape &aListModShape = aMapModif(S);
+    Standard_Integer            aNbShapes     = aListModShape.Extent();
+
+    if (aNbShapes > 0)
+      aShape = aListModShape.First();
+  }
+
+  return BRepBuilderAPI_ModifyShape_21423::ModifiedShape(aShape);
+}
+
diff --git a/src/GEOMImpl/BRepBuilderAPI_GTransform_21423.hxx b/src/GEOMImpl/BRepBuilderAPI_GTransform_21423.hxx
new file mode 100644 (file)
index 0000000..06194aa
--- /dev/null
@@ -0,0 +1,137 @@
+// This file is generated by WOK (CPPExt).
+// Please do not edit this file; modify original file instead.
+// The copyright and license terms as defined for the original file apply to 
+// this header file considered to be the "object code" form of the original source.
+
+#ifndef _BRepBuilderAPI_GTransform_21423_HeaderFile
+#define _BRepBuilderAPI_GTransform_21423_HeaderFile
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+
+#ifndef _gp_GTrsf_HeaderFile
+#include <gp_GTrsf.hxx>
+#endif
+#ifndef _Standard_Boolean_HeaderFile
+#include <Standard_Boolean.hxx>
+#endif
+#ifndef _BRepBuilderAPI_Collect_HeaderFile
+#include <BRepBuilderAPI_Collect.hxx>
+#endif
+#ifndef _BRepBuilderAPI_ModifyShape_21423_HeaderFile
+#include <BRepBuilderAPI_ModifyShape_21423.hxx>
+#endif
+class Standard_NoSuchObject;
+class gp_GTrsf;
+class TopoDS_Shape;
+class TopTools_ListOfShape;
+
+
+//! Geometric transformation on a shape. <br>
+//! The transformation to be applied is defined as a gp_GTrsf <br>
+//! transformation. It may be: <br>
+//! -      a transformation equivalent to a gp_Trsf transformation, the <br>
+//!    most common case: you should , however, use a BRepAPI_Transform <br>
+//!    object to perform this kind of transformation; or <br>
+//! -      an affinity, or <br>
+//! -      more generally, any type of point transformation which may <br>
+//!  be defined by a three row, four column matrix of transformation. <br>
+//! In the last two cases, the underlying geometry of the <br>
+//! following shapes may change: <br>
+//! -      a curve which supports an edge of the shape, or <br>
+//! -      a surface which supports a face of the shape; <br>
+//! For example, a circle may be transformed into an ellipse when <br>
+//! applying an affinity transformation. <br>
+//! The transformation is applied to: <br>
+//! -      all the curves which support edges of the shape, and <br>
+//! -      all the surfaces which support faces of the shape. <br>
+//! A GTransform object provides a framework for: <br>
+//! -      defining the geometric transformation to be applied, <br>
+//! -      implementing the transformation algorithm, and <br>
+//! -      consulting the result. <br>
+class BRepBuilderAPI_GTransform_21423  : public BRepBuilderAPI_ModifyShape_21423 {
+public:
+
+  void* operator new(size_t,void* anAddress) 
+  {
+    return anAddress;
+  }
+  void* operator new(size_t size) 
+  {
+    return Standard::Allocate(size); 
+  }
+  void  operator delete(void *anAddress) 
+  {
+    if (anAddress) Standard::Free((Standard_Address&)anAddress); 
+  }
+
+  //! Constructs a framework for applying the geometric <br>
+//! transformation T to a shape. Use the function <br>
+//! Perform to define the shape to transform. <br>
+  Standard_EXPORT   BRepBuilderAPI_GTransform_21423(const gp_GTrsf& T);
+  //! Constructs a framework for applying the geometric <br>
+//! transformation T to a shape, and applies it to the shape S. <br>
+//! -   If the transformation T is direct and isometric (i.e. if <br>
+//!   the determinant of the vectorial part of T is equal to <br>
+//!   1.), and if Copy equals false (default value), the <br>
+//!   resulting shape is the same as the original but with <br>
+//!   a new location assigned to it. <br>
+//! -   In all other cases, the transformation is applied to <br>
+//!   a duplicate of S. <br>
+//! Use the function Shape to access the result. <br>
+//! Note: the constructed framework can be reused to <br>
+//! apply the same geometric transformation to other <br>
+//! shapes: just specify them with the function Perform. <br>
+  Standard_EXPORT   BRepBuilderAPI_GTransform_21423(const TopoDS_Shape& S,const gp_GTrsf& T,const Standard_Boolean Copy = Standard_False);
+  //! Applies the geometric transformation defined at the <br>
+//! time of construction of this framework to the shape S. <br>
+//! -   If the transformation T is direct and isometric (i.e. if <br>
+//!   the determinant of the vectorial part of T is equal to <br>
+//!   1.), and if Copy equals false (default value), the <br>
+//!   resulting shape is the same as the original but with <br>
+//!   a new location assigned to it. <br>
+//! -   In all other cases, the transformation is applied to a duplicate of S. <br>
+//!   Use the function Shape to access the result. <br>
+//! Note: this framework can be reused to apply the same <br>
+//! geometric transformation to other shapes: just specify <br>
+//! them by calling the function Perform again. <br>
+  Standard_EXPORT     void Perform(const TopoDS_Shape& S,const Standard_Boolean Copy = Standard_False) ;
+  //! Returns the list  of shapes modified from the shape <br>
+//!          <S>. <br>
+  Standard_EXPORT   virtual const TopTools_ListOfShape& Modified(const TopoDS_Shape& S) ;
+  //! Returns the modified shape corresponding to <S>. <br>
+  Standard_EXPORT   virtual const TopoDS_Shape& ModifiedShape(const TopoDS_Shape& S) const;
+
+
+
+
+
+protected:
+
+
+
+
+
+private:
+
+
+
+gp_GTrsf myGTrsf;
+Standard_Boolean myUseModif;
+BRepBuilderAPI_Collect myHist;
+
+
+};
+
+
+
+
+
+// other Inline functions and methods (like "C++: function call" methods)
+
+
+#endif
diff --git a/src/GEOMImpl/BRepBuilderAPI_ModifyShape_21423.cxx b/src/GEOMImpl/BRepBuilderAPI_ModifyShape_21423.cxx
new file mode 100755 (executable)
index 0000000..bdd9397
--- /dev/null
@@ -0,0 +1,144 @@
+// File:       BRepBuilderAPI_ModifyShape_21423.cxx
+// Created:    Fri Dec  2 10:37:08 1994
+// Author:     Jacques GOUSSARD
+//             <jag@topsn2>
+
+#include <BRepBuilderAPI_ModifyShape_21423.hxx>
+
+#include <BRepTools_Modification.hxx>
+
+#include <TopoDS_Shape.hxx>
+#include <TopTools_ListOfShape.hxx>
+
+#include <Standard_NullObject.hxx>
+#include <Standard_NoSuchObject.hxx>
+
+//=======================================================================
+//function : BRepBuilderAPI_ModifyShape_21423
+//purpose  : 
+//=======================================================================
+
+BRepBuilderAPI_ModifyShape_21423::BRepBuilderAPI_ModifyShape_21423 () {}
+
+//=======================================================================
+//function : BRepBuilderAPI_ModifyShape_21423
+//purpose  : 
+//=======================================================================
+
+BRepBuilderAPI_ModifyShape_21423::BRepBuilderAPI_ModifyShape_21423 (const TopoDS_Shape& S):
+   myModifier(S), myInitialShape(S)
+{}
+
+
+//=======================================================================
+//function : BRepBuilderAPI_ModifyShape_21423
+//purpose  : 
+//=======================================================================
+
+BRepBuilderAPI_ModifyShape_21423::BRepBuilderAPI_ModifyShape_21423 
+    (const Handle(BRepTools_Modification)& M)
+{
+  myModification = M;
+}
+
+
+//=======================================================================
+//function : BRepBuilderAPI_ModifyShape_21423
+//purpose  : 
+//=======================================================================
+
+BRepBuilderAPI_ModifyShape_21423::BRepBuilderAPI_ModifyShape_21423 
+  (const TopoDS_Shape& S,
+   const Handle(BRepTools_Modification)& M): myModifier(S),myInitialShape(S)
+{
+  myModification = M;
+  DoModif();
+}
+
+
+//=======================================================================
+//function : DoModif
+//purpose  : 
+//=======================================================================
+
+void BRepBuilderAPI_ModifyShape_21423::DoModif ()
+{
+  if (myInitialShape.IsNull() || myModification.IsNull()) {
+    Standard_NullObject::Raise();
+  }
+  myModifier.Perform(myModification);
+  if (myModifier.IsDone()) {
+    Done();
+    myShape = myModifier.ModifiedShape(myInitialShape);
+  }
+  else {
+    NotDone();
+  }
+}
+
+
+//=======================================================================
+//function : DoModif
+//purpose  : 
+//=======================================================================
+
+void BRepBuilderAPI_ModifyShape_21423::DoModif (const TopoDS_Shape& S)
+{
+  if (!S.IsEqual(myInitialShape) || !IsDone()) {
+    myInitialShape = S;
+    myModifier.Init(S);
+    DoModif();
+  }
+}
+
+
+//=======================================================================
+//function : DoModif
+//purpose  : 
+//=======================================================================
+
+void BRepBuilderAPI_ModifyShape_21423::DoModif (const Handle(BRepTools_Modification)& M)
+{
+  myModification = M;
+  DoModif();
+}
+
+
+//=======================================================================
+//function : DoModif
+//purpose  : 
+//=======================================================================
+
+void BRepBuilderAPI_ModifyShape_21423::DoModif (const TopoDS_Shape& S,
+                                  const Handle(BRepTools_Modification)& M)
+{
+  myInitialShape = S;
+  myModifier.Init(S);
+  myModification = M;
+  DoModif();
+}
+
+
+//=======================================================================
+//function : ModifiedShape
+//purpose  : 
+//=======================================================================
+
+const TopoDS_Shape& BRepBuilderAPI_ModifyShape_21423::ModifiedShape
+  (const TopoDS_Shape& S) const
+{
+  return myModifier.ModifiedShape(S);
+}
+
+//=======================================================================
+//function : Modified
+//purpose  : 
+//=======================================================================
+
+const TopTools_ListOfShape& BRepBuilderAPI_ModifyShape_21423::Modified
+  (const TopoDS_Shape& F)
+{
+  myGenerated.Clear();
+  myGenerated.Append(myModifier.ModifiedShape(F));
+  return myGenerated;
+}
diff --git a/src/GEOMImpl/BRepBuilderAPI_ModifyShape_21423.hxx b/src/GEOMImpl/BRepBuilderAPI_ModifyShape_21423.hxx
new file mode 100644 (file)
index 0000000..b631347
--- /dev/null
@@ -0,0 +1,129 @@
+// This file is generated by WOK (CPPExt).
+// Please do not edit this file; modify original file instead.
+// The copyright and license terms as defined for the original file apply to 
+// this header file considered to be the "object code" form of the original source.
+
+#ifndef _BRepBuilderAPI_ModifyShape_21423_HeaderFile
+#define _BRepBuilderAPI_ModifyShape_21423_HeaderFile
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+
+#ifndef _BRepTools_Modifier_21423_HeaderFile
+#include <BRepTools_Modifier_21423.hxx>
+#endif
+#ifndef _TopoDS_Shape_HeaderFile
+#include <TopoDS_Shape.hxx>
+#endif
+#ifndef _Handle_BRepTools_Modification_HeaderFile
+#include <Handle_BRepTools_Modification.hxx>
+#endif
+#ifndef _BRepBuilderAPI_MakeShape_HeaderFile
+#include <BRepBuilderAPI_MakeShape.hxx>
+#endif
+class BRepTools_Modification;
+class Standard_NullObject;
+class Standard_NoSuchObject;
+class TopoDS_Shape;
+class TopTools_ListOfShape;
+
+
+//! Implements   the  methods   of MakeShape for   the <br>
+//!          constant  topology modifications.  The methods are <br>
+//!          implemented  when the modification uses a Modifier <br>
+//!          from BRepTools. Some of  them have to be redefined <br>
+//!          if  the  modification is  implemented with another <br>
+//!          tool (see Transform from BRepBuilderAPI for example). <br>
+//! The BRepBuilderAPI package provides the following <br>
+//! frameworks to perform modifications of this sort: <br>
+//! -   BRepBuilderAPI_Copy to produce the copy of a shape, <br>
+//! -   BRepBuilderAPI_Transform and <br>
+//!   BRepBuilderAPI_GTransform to apply a geometric <br>
+//!   transformation to a shape, <br>
+//! -   BRepBuilderAPI_NurbsConvert_21423 to convert the <br>
+//!   whole geometry of a shape into NURBS geometry, <br>
+//! -   BRepOffsetAPI_DraftAngle to build a tapered shape. <br>
+class BRepBuilderAPI_ModifyShape_21423  : public BRepBuilderAPI_MakeShape {
+public:
+
+  void* operator new(size_t,void* anAddress) 
+  {
+    return anAddress;
+  }
+  void* operator new(size_t size) 
+  {
+    return Standard::Allocate(size); 
+  }
+  void  operator delete(void *anAddress) 
+  {
+    if (anAddress) Standard::Free((Standard_Address&)anAddress); 
+  }
+
+  //! Returns the list  of shapes modified from the shape <br>
+//!          <S>. <br>
+  Standard_EXPORT   virtual const TopTools_ListOfShape& Modified(const TopoDS_Shape& S) ;
+  //! Returns the modified shape corresponding to <S>. <br>
+//! S can correspond to the entire initial shape or to its subshape. <br>
+//! Exceptions <br>
+//! Standard_NoSuchObject if S is not the initial shape or <br>
+//! a subshape of the initial shape to which the <br>
+//! transformation has been applied. Raises NoSuchObject from Standard <br>
+//! if S is not the initial shape or a sub-shape <br>
+//! of the initial shape. <br>
+  Standard_EXPORT   virtual const TopoDS_Shape& ModifiedShape(const TopoDS_Shape& S) const;
+
+
+
+
+
+protected:
+
+  //! Empty constructor. <br>
+  Standard_EXPORT   BRepBuilderAPI_ModifyShape_21423();
+  //! Initializes the modifier with  the Shape  <S>, and <br>
+//!          set the field <myInitialShape> to <S>. <br>
+  Standard_EXPORT   BRepBuilderAPI_ModifyShape_21423(const TopoDS_Shape& S);
+  //! Set the field <myModification> with <M>. <br>
+  Standard_EXPORT   BRepBuilderAPI_ModifyShape_21423(const Handle(BRepTools_Modification)& M);
+  //! Initializes the modifier with  the Shape  <S>, and <br>
+//!          set the field <myInitialShape> to <S>, and set the <br>
+//!          field <myModification> with  <M>, the performs the <br>
+//!          modification. <br>
+  Standard_EXPORT   BRepBuilderAPI_ModifyShape_21423(const TopoDS_Shape& S,const Handle(BRepTools_Modification)& M);
+  //! Performs the previously  given modification on the <br>
+//!          shape <S>. <br>
+  Standard_EXPORT     void DoModif(const TopoDS_Shape& S) ;
+  //! Performs the  modification   <M> on a   previously <br>
+//!          given shape. <br>
+  Standard_EXPORT     void DoModif(const Handle(BRepTools_Modification)& M) ;
+  //! Performs the  modification <M> on the shape <S>. <br>
+  Standard_EXPORT     void DoModif(const TopoDS_Shape& S,const Handle(BRepTools_Modification)& M) ;
+
+
+BRepTools_Modifier_21423 myModifier;
+TopoDS_Shape myInitialShape;
+Handle_BRepTools_Modification myModification;
+
+
+private:
+
+  
+  Standard_EXPORT     void DoModif() ;
+
+
+
+
+};
+
+
+
+
+
+// other Inline functions and methods (like "C++: function call" methods)
+
+
+#endif
diff --git a/src/GEOMImpl/BRepBuilderAPI_NurbsConvert_21423.cxx b/src/GEOMImpl/BRepBuilderAPI_NurbsConvert_21423.cxx
new file mode 100755 (executable)
index 0000000..a1e6f93
--- /dev/null
@@ -0,0 +1,58 @@
+// File:       BRepBuilderAPI_NurbsConvert_21423.cxx
+// Created:    Fri Dec  9 09:14:55 1994
+// Author:     Jacques GOUSSARD
+//             <jag@topsn2>
+
+#include <BRepBuilderAPI_NurbsConvert_21423.hxx>
+
+#include <TopoDS_Shape.hxx>
+
+#include <BRepLib.hxx>
+#include <TopAbs.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopTools_MapOfShape.hxx>
+#include <TopExp_Explorer.hxx>
+#include <BRep_Builder.hxx>
+
+#include <BRepTools_NurbsConvertModification_21423.hxx>
+
+//=======================================================================
+//function : BRepBuilderAPI_NurbsConvert_21423
+//purpose  : 
+//=======================================================================
+
+BRepBuilderAPI_NurbsConvert_21423::BRepBuilderAPI_NurbsConvert_21423 () 
+     
+{
+  myModification = new BRepTools_NurbsConvertModification_21423();
+}
+
+//=======================================================================
+//function : BRepBuilderAPI_NurbsConvert_21423
+//purpose  : 
+//=======================================================================
+
+BRepBuilderAPI_NurbsConvert_21423::BRepBuilderAPI_NurbsConvert_21423 (const TopoDS_Shape& S,
+                                           const Standard_Boolean Copy) 
+     
+{
+  myModification = new BRepTools_NurbsConvertModification_21423();
+  Perform(S,Copy);
+}
+
+//=======================================================================
+//function : Perform
+//purpose  : 
+//=======================================================================
+
+void BRepBuilderAPI_NurbsConvert_21423::Perform(const TopoDS_Shape& S,
+                                  const Standard_Boolean Copy)
+{
+  Handle(BRepTools_NurbsConvertModification_21423) theModif = 
+    Handle(BRepTools_NurbsConvertModification_21423)::DownCast(myModification);
+  DoModif(S,myModification);
+}
+
+
+
diff --git a/src/GEOMImpl/BRepBuilderAPI_NurbsConvert_21423.hxx b/src/GEOMImpl/BRepBuilderAPI_NurbsConvert_21423.hxx
new file mode 100644 (file)
index 0000000..ae19c94
--- /dev/null
@@ -0,0 +1,95 @@
+// This file is generated by WOK (CPPExt).
+// Please do not edit this file; modify original file instead.
+// The copyright and license terms as defined for the original file apply to 
+// this header file considered to be the "object code" form of the original source.
+
+#ifndef _BRepBuilderAPI_NurbsConvert_21423_HeaderFile
+#define _BRepBuilderAPI_NurbsConvert_21423_HeaderFile
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+
+#ifndef _BRepBuilderAPI_ModifyShape_21423_HeaderFile
+#include <BRepBuilderAPI_ModifyShape_21423.hxx>
+#endif
+#ifndef _Standard_Boolean_HeaderFile
+#include <Standard_Boolean.hxx>
+#endif
+class TopoDS_Shape;
+
+
+//! Conversion of the complete geometry of a shape into <br>
+//! NURBS geometry. For example, all curves supporting <br>
+//! edges of the basis shape are converted into BSpline <br>
+//! curves, and all surfaces supporting its faces are <br>
+//! converted into BSpline surfaces. <br>
+class BRepBuilderAPI_NurbsConvert_21423  : public BRepBuilderAPI_ModifyShape_21423 {
+public:
+
+  void* operator new(size_t,void* anAddress) 
+  {
+    return anAddress;
+  }
+  void* operator new(size_t size) 
+  {
+    return Standard::Allocate(size); 
+  }
+  void  operator delete(void *anAddress) 
+  {
+    if (anAddress) Standard::Free((Standard_Address&)anAddress); 
+  }
+
+  //! Constructs a framework for converting the geometry of a <br>
+//! shape into NURBS geometry. Use the function Perform <br>
+//! to define the shape to convert. <br>
+  Standard_EXPORT   BRepBuilderAPI_NurbsConvert_21423();
+  //!  Builds a new shape by converting the geometry of the <br>
+//! shape S into NURBS geometry. Specifically, all curves <br>
+//! supporting edges of S are converted into BSpline <br>
+//! curves, and all surfaces supporting its faces are <br>
+//! converted into BSpline surfaces. <br>
+//! Use the function Shape to access the new shape. <br>
+//! Note: the constructed framework can be reused to <br>
+//! convert other shapes. You specify these with the <br>
+//! function Perform. <br>
+  Standard_EXPORT   BRepBuilderAPI_NurbsConvert_21423(const TopoDS_Shape& S,const Standard_Boolean Copy = Standard_False);
+  //! Builds a new shape by converting the geometry of the <br>
+//! shape S into NURBS geometry. <br>
+//! Specifically, all curves supporting edges of S are <br>
+//! converted into BSpline curves, and all surfaces <br>
+//! supporting its faces are converted into BSpline surfaces. <br>
+//! Use the function Shape to access the new shape. <br>
+//! Note: this framework can be reused to convert other <br>
+//! shapes: you specify them by calling the function Perform again. <br>
+  Standard_EXPORT     void Perform(const TopoDS_Shape& S,const Standard_Boolean Copy = Standard_False) ;
+
+
+
+
+
+protected:
+
+
+
+
+
+private:
+
+
+
+
+
+};
+
+
+
+
+
+// other Inline functions and methods (like "C++: function call" methods)
+
+
+#endif
diff --git a/src/GEOMImpl/BRepTools_Modifier_21423.cxx b/src/GEOMImpl/BRepTools_Modifier_21423.cxx
new file mode 100644 (file)
index 0000000..011fd8a
--- /dev/null
@@ -0,0 +1,539 @@
+// File:       BRepTools_Modifier_21423.cxx
+// Created:    Thu Aug 25 10:48:00 1994
+// Author:     Jacques GOUSSARD
+//             <jag@ecolox>
+
+// IFV 04.06.99 - PRO18974 - processing of INTERNAL shapes.
+
+#include <BRepTools_Modifier_21423.hxx>
+
+//#include <Standard_NoSuchObject.hxx>
+#include <BRepTools_Modification.hxx>
+
+#include <TopoDS_Iterator.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS_Face.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
+#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <TColStd_ListOfTransient.hxx>
+#include <TColStd_ListIteratorOfListOfTransient.hxx>
+
+#if 0
+#include <Poly_Triangulation.hxx>
+#include <Poly_Polygon3D.hxx>
+#include <BRepMesh_IncrementalMesh.hxx>
+#endif
+
+#include <Geom2d_Line.hxx>
+#include <BRep_Builder.hxx>
+#include <BRep_Tool.hxx>
+#include <TopoDS.hxx>
+#include <BRepTools.hxx>
+#include <TopAbs.hxx>
+#include <TopExp.hxx>
+#include <gp_Pnt.hxx>
+
+#include <gp.hxx>
+
+#include <Standard_NullObject.hxx>
+#include <gp_Trsf.hxx>
+#include <BRepTools_TrsfModification.hxx>
+
+
+
+//=======================================================================
+//function : BRepTools_Modifier_21423
+//purpose  : 
+//=======================================================================
+
+BRepTools_Modifier_21423::BRepTools_Modifier_21423 ():myDone(Standard_False)
+{}
+
+//=======================================================================
+//function : BRepTools_Modifier_21423
+//purpose  : 
+//=======================================================================
+
+BRepTools_Modifier_21423::BRepTools_Modifier_21423 (const TopoDS_Shape& S) :
+  myShape(S),myDone(Standard_False)
+{
+  myMap.Clear();
+  Put(S);
+}
+
+//=======================================================================
+//function : BRepTools_Modifier_21423
+//purpose  : 
+//=======================================================================
+
+BRepTools_Modifier_21423::BRepTools_Modifier_21423
+  (const TopoDS_Shape& S,
+   const Handle(BRepTools_Modification)& M) : myShape(S),myDone(Standard_False)
+{
+  myMap.Clear();
+  Put(S);
+  Perform(M);
+}
+
+
+//=======================================================================
+//function : Init
+//purpose  : 
+//=======================================================================
+
+void BRepTools_Modifier_21423::Init(const TopoDS_Shape& S)
+{
+  myShape = S;
+  myDone = Standard_False;
+  myMap.Clear();
+  Put(S);
+}
+
+
+//=======================================================================
+//function : Perform
+//purpose  : 
+//=======================================================================
+
+void BRepTools_Modifier_21423::Perform(const Handle(BRepTools_Modification)& M)
+{
+  if (myShape.IsNull()) {
+    Standard_NullObject::Raise();
+  }
+  TopTools_DataMapIteratorOfDataMapOfShapeShape theIter(myMap);
+
+  // Set to Null the value of shapes, in case when another modification is applied to the start shape.
+
+  if (!theIter.Value().IsNull()) {
+    while (theIter.More()) {
+      myMap(theIter.Value()).Nullify();
+      theIter.Next();
+    }
+    theIter.Reset();
+  }
+
+  /*
+  while (theIter.More()) {
+    Rebuild(theIter.Key(),M);
+    theIter.Next();
+  }
+  */
+
+  Rebuild(myShape, M, 0.);
+
+  if (myShape.ShapeType() == TopAbs_FACE) {
+    if (myShape.Orientation() == TopAbs_REVERSED) {
+      myMap(myShape).Reverse();
+    }
+    else{
+      myMap(myShape).Orientation(myShape.Orientation());
+    } 
+  }
+  else {
+    myMap(myShape).Orientation(myShape.Orientation());
+  }
+
+  // Update the continuities
+
+  TopTools_IndexedDataMapOfShapeListOfShape theEFMap;
+  TopExp::MapShapesAndAncestors(myShape,TopAbs_EDGE,TopAbs_FACE,theEFMap);
+  BRep_Builder B;
+
+/*
+  Standard_Boolean RecomputeTriangles = Standard_False;
+  Standard_Real MaxDeflection = RealFirst();
+  Handle(Poly_Triangulation) Tr;
+  Handle(Poly_Polygon3D) Po;
+  TopLoc_Location Loc;
+*/
+
+  while (theIter.More()) {
+    const TopoDS_Shape& S = theIter.Key();
+/*
+    if (S.ShapeType() == TopAbs_FACE && !S.IsSame(theIter.Value())) {
+      Tr = BRep_Tool::Triangulation(TopoDS::Face(S),Loc);
+      if (!Tr.IsNull()) {
+       RecomputeTriangles = Standard_True;
+       MaxDeflection = Max(MaxDeflection,Tr->Deflection());
+      }
+    }
+    else */ if (S.ShapeType() == TopAbs_EDGE && !S.IsSame(theIter.Value())) {
+      const TopoDS_Edge& edg = TopoDS::Edge(S);
+/*
+      Po = BRep_Tool::Polygon3D(edg,Loc);
+      if (!Po.IsNull()) {
+       RecomputeTriangles = Standard_True;
+       MaxDeflection = Max(MaxDeflection,Po->Deflection());
+      }
+*/
+      TopTools_ListIteratorOfListOfShape it;
+      it.Initialize(theEFMap.FindFromKey(edg));
+      TopoDS_Face F1,F2;
+      while (it.More() && F2.IsNull()) {
+       if (F1.IsNull()) {
+         F1 = TopoDS::Face(it.Value());
+       }
+       else {
+         F2 = TopoDS::Face(it.Value());
+       }
+       it.Next();
+      }
+      if (!F2.IsNull()) {
+       const TopoDS_Edge& newedg = TopoDS::Edge(myMap(edg));
+       const TopoDS_Face& newf1  = TopoDS::Face(myMap(F1));
+       const TopoDS_Face& newf2  = TopoDS::Face(myMap(F2));
+       GeomAbs_Shape Newcont = M->Continuity(edg,F1,F2,newedg,newf1,newf2);
+       if (Newcont > GeomAbs_C0) {
+         B.Continuity(newedg,newf1,newf2,Newcont);
+       }
+      }
+    }
+    theIter.Next();
+  }
+/*
+  if (RecomputeTriangles) {
+    BRepMesh_IncrementalMesh(myMap(myShape),MaxDeflection);
+  }
+*/
+
+  myDone = Standard_True;
+
+}
+
+//=======================================================================
+//function : Put
+//purpose  : 
+//=======================================================================
+
+void BRepTools_Modifier_21423::Put(const TopoDS_Shape& S)
+{
+  if (!myMap.IsBound(S)) {
+    myMap.Bind(S,TopoDS_Shape());
+    for(TopoDS_Iterator theIterator(S,Standard_False);theIterator.More();theIterator.Next()) {
+
+      Put(theIterator.Value());
+    }
+  }
+}
+
+//=======================================================================
+//function : Rebuild
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean BRepTools_Modifier_21423::Rebuild
+  (const TopoDS_Shape& S,
+   const Handle(BRepTools_Modification)& M,
+   const Standard_Real Tol) 
+{
+  TopoDS_Shape& result = myMap(S);
+//  if (!result.IsNull()) return ! S.IsEqual(result);
+  if (!result.IsNull()) return ! S.IsSame(result);
+  Standard_Boolean rebuild = Standard_False, RevWires = Standard_False;
+  TopAbs_Orientation ResOr = TopAbs_FORWARD;
+  BRep_Builder B;
+  Standard_Real tol = Tol;
+  Standard_Boolean No3DCurve = Standard_False; // en fait, si on n`a pas de 
+  //modif geometry 3d , it is necessary to test the existence of a curve 3d.
+
+  // new geometry ?
+
+  TopAbs_ShapeEnum ts = S.ShapeType();
+  switch (ts) {
+  case TopAbs_FACE:
+    {
+      Standard_Boolean RevFace;
+      Handle(Geom_Surface) surface;
+      TopLoc_Location location;
+      rebuild = M->NewSurface(TopoDS::Face(S),surface,location,tol,
+                             RevWires,RevFace);
+      tol = Max(Tol,tol);  //OCC217
+      if (rebuild) {
+       B.MakeFace(TopoDS::Face(result),surface,
+                  location.Predivided(S.Location()),tol);
+       result.Location(S.Location());
+//     result.Orientation(S.Orientation());
+       if (RevFace) {
+         ResOr = TopAbs_REVERSED;
+       }
+       // set specifics flags of a Face
+       B.NaturalRestriction(TopoDS::Face(result),
+                            BRep_Tool::NaturalRestriction(TopoDS::Face(S)));
+      }
+    }
+    break;
+
+  case TopAbs_EDGE:
+    {
+      Handle(Geom_Curve) curve;
+      TopLoc_Location location;
+      rebuild = M->NewCurve(TopoDS::Edge(S),curve,location,tol);
+      tol = Max(Tol,tol);  //OCC217
+      if (rebuild) {
+       if (curve.IsNull()) {
+         B.MakeEdge(TopoDS::Edge(result));
+         B.Degenerated(TopoDS::Edge(result),
+                       BRep_Tool::Degenerated(TopoDS::Edge(S)));
+         B.UpdateEdge(TopoDS::Edge(result),tol);  //OCC217
+         No3DCurve = Standard_True;
+       }
+       else {
+         B.MakeEdge(TopoDS::Edge(result),curve,
+                    location.Predivided(S.Location()),tol);
+         No3DCurve = Standard_False;
+       }
+       result.Location(S.Location());
+//     result.Orientation(S.Orientation());
+
+       // set specifics flags of an Edge
+       B.SameParameter(TopoDS::Edge(result),
+                       BRep_Tool::SameParameter(TopoDS::Edge(S)));
+       B.SameRange(TopoDS::Edge(result),
+                   BRep_Tool::SameRange(TopoDS::Edge(S)));
+      }
+    }
+    break;
+
+  case TopAbs_VERTEX:
+    {
+      gp_Pnt vtx;
+      rebuild = M->NewPoint(TopoDS::Vertex(S),vtx,tol);
+      tol = Max(Tol, tol);  //OCC217
+      if (rebuild) {
+       B.MakeVertex(TopoDS::Vertex(result),vtx,tol);
+      }
+    }
+    break;
+
+  default:
+    {
+    }
+  }
+
+  // rebuild sub-shapes and test new sub-shape ?
+
+  Standard_Boolean newgeom = rebuild;
+
+  TopoDS_Iterator it;
+
+  for (it.Initialize(S, Standard_False); it.More(); it.Next()) {
+    // always call Rebuild
+    Standard_Boolean subrebuilt = Rebuild(it.Value(), M, tol);
+    rebuild =  subrebuilt || rebuild ;
+  }
+
+  // make an empty copy
+  if (rebuild && !newgeom) {
+    result = S.EmptyCopied();
+    result.Orientation(TopAbs_FORWARD);
+  }
+
+  // copy the sub-elements 
+  
+  if (rebuild) {
+    TopAbs_Orientation orient;
+    for (it.Initialize(S,Standard_False); it.More(); it.Next()) {
+      orient = it.Value().Orientation();
+      if (RevWires || myMap(it.Value()).Orientation() == TopAbs_REVERSED) {
+       orient = TopAbs::Reverse(orient);
+      }
+      B.Add(result,myMap(it.Value()).Oriented(orient));
+    }
+
+
+    if (ts == TopAbs_FACE) {
+      // pcurves
+      Handle(Geom2d_Curve) curve2d; //,curve2d1;
+      TopoDS_Face face = TopoDS::Face(S);
+      TopAbs_Orientation fcor = face.Orientation();
+      if(fcor != TopAbs_REVERSED) fcor = TopAbs_FORWARD;
+
+      TopExp_Explorer ex(face.Oriented(fcor),TopAbs_EDGE);
+      for (;ex.More(); ex.Next()) 
+      {
+       const TopoDS_Edge& edge = TopoDS::Edge(ex.Current());
+
+       if (M->NewCurve2d(edge, face,TopoDS::Edge(myMap(ex.Current())),
+                         TopoDS::Face(result),curve2d, tol)) 
+        {
+         tol = Max(Tol,tol);  //OCC217
+         // rem dub 16/09/97 : Make constant topology or not make at all.
+         // Do not make if CopySurface = 1
+         // Atention, TRUE sewing edges (RealyClosed)  
+         // stay even if  CopySurface is true.
+    
+          // check that edge contains two pcurves on this surface:
+          // either it is true seam on the current face, or belongs to two faces
+          // built on that same surface (see OCC21772)
+          // Note: this check could be made separate method in BRepTools
+          Standard_Boolean isClosed = Standard_False;
+          if(BRep_Tool::IsClosed(edge,face))
+          {
+            isClosed = ( ! newgeom || BRepTools::IsReallyClosed(edge,face) );
+            if ( ! isClosed )
+            {
+              TopLoc_Location aLoc;
+              TopoDS_Shape resface = (myMap.IsBound(face) ? myMap(face) : face);
+              if(resface.IsNull())
+                resface = face;
+              Handle(Geom_Surface) aSurf = BRep_Tool::Surface(TopoDS::Face(resface), aLoc);
+              // check other faces sharing the same surface
+              TopExp_Explorer aExpF(myShape,TopAbs_FACE);
+              for( ; aExpF.More() && !isClosed; aExpF.Next())
+              {
+                TopoDS_Face anOther = TopoDS::Face(aExpF.Current());
+                if(anOther.IsSame(face))
+                  continue;
+                TopoDS_Shape resface2 = (myMap.IsBound(anOther) ? myMap(anOther) : anOther);
+                if(resface2.IsNull())
+                  resface2 = anOther;
+                TopLoc_Location anOtherLoc;
+                Handle(Geom_Surface) anOtherSurf = 
+                  BRep_Tool::Surface(TopoDS::Face(resface2), anOtherLoc);
+                if ( aSurf == anOtherSurf && aLoc.IsEqual (anOtherLoc) )
+                {
+                  TopExp_Explorer aExpE(anOther,TopAbs_EDGE);
+                  for( ; aExpE.More() && !isClosed ; aExpE.Next())
+                    isClosed = edge.IsSame(aExpE.Current());
+                }
+              }
+            }
+          }
+         if (isClosed) 
+         {
+           TopoDS_Edge CurE = TopoDS::Edge(myMap(edge));
+           TopoDS_Shape aLocalResult = result;
+           aLocalResult.Orientation(TopAbs_FORWARD);
+           TopoDS_Face CurF = TopoDS::Face(aLocalResult);
+           Handle(Geom2d_Curve) curve2d1, currcurv;
+           Standard_Real f,l;
+           if ((!RevWires && fcor != edge.Orientation()) ||
+               ( RevWires && fcor == edge.Orientation())) {
+             CurE.Orientation(TopAbs_FORWARD);
+             curve2d1 = BRep_Tool::CurveOnSurface(CurE,CurF,f,l);
+             if (curve2d1.IsNull()) curve2d1 = new Geom2d_Line(gp::OX2d());
+             B.UpdateEdge (CurE, curve2d1, curve2d, CurF, tol);
+           }
+           else {
+             CurE.Orientation(TopAbs_REVERSED);
+             curve2d1 = BRep_Tool::CurveOnSurface(CurE,CurF,f,l);
+             if (curve2d1.IsNull()) curve2d1 = new Geom2d_Line(gp::OX2d());
+             B.UpdateEdge (CurE, curve2d, curve2d1, CurF, tol);
+           }
+           currcurv = BRep_Tool::CurveOnSurface(edge,face,f,l);
+           B.Range(edge,f,l);
+         }
+         else {
+           B.UpdateEdge(TopoDS::Edge(myMap(ex.Current())),
+                        curve2d,
+                        TopoDS::Face(result), tol);
+         }
+
+         TopLoc_Location theLoc;
+         Standard_Real theF,theL;
+         Handle(Geom_Curve) C3D =
+           BRep_Tool::Curve(TopoDS::Edge(myMap(ex.Current())),
+                            theLoc,theF,theL);
+         if (C3D.IsNull()) { // Update vertices
+           Standard_Real param;
+           TopExp_Explorer ex2(edge,TopAbs_VERTEX);
+           while (ex2.More()) {
+             const TopoDS_Vertex& vertex = TopoDS::Vertex(ex2.Current());
+             if (!M->NewParameter(vertex, edge, param, tol)) {
+               //tol = BRep_Tool::Tolerance(vertex);
+               tol = Max(Tol, BRep_Tool::Tolerance(vertex));  //OCC217
+               param = BRep_Tool::Parameter(vertex,edge);
+             }
+
+             TopAbs_Orientation vtxrelat = vertex.Orientation();
+             if (edge.Orientation() == TopAbs_REVERSED) {
+               // Update considere l'edge FORWARD, et le vertex en relatif
+               vtxrelat= TopAbs::Reverse(vtxrelat);
+             }
+//           if (myMap(edge).Orientation() == TopAbs_REVERSED) {
+//             vtxrelat= TopAbs::Reverse(vtxrelat);
+//           }
+             TopoDS_Vertex aLocalVertex = TopoDS::Vertex(myMap(vertex));
+             aLocalVertex.Orientation(vtxrelat);
+//           B.UpdateVertex(TopoDS::Vertex
+//                          (myMap(vertex).Oriented(vtxrelat)),
+             B.UpdateVertex(aLocalVertex,
+                            param,
+                            TopoDS::Edge(myMap(edge)),
+                            tol);
+             ex2.Next();
+           }
+         }
+
+       }
+      }
+
+    }
+
+//    else if (ts == TopAbs_EDGE) {
+    else if (ts == TopAbs_EDGE && !No3DCurve) {
+      // Vertices
+      Standard_Real param;
+      const TopoDS_Edge& edge = TopoDS::Edge(S);
+      TopAbs_Orientation edor = edge.Orientation();
+      if(edor != TopAbs_REVERSED) edor = TopAbs_FORWARD;
+      TopExp_Explorer ex(edge.Oriented(edor), TopAbs_VERTEX);
+      while (ex.More()) {
+       const TopoDS_Vertex& vertex = TopoDS::Vertex(ex.Current());
+
+       if (!M->NewParameter(vertex, edge, param, tol)) {
+         //tol = BRep_Tool::Tolerance(vertex);
+          tol = Max(Tol, BRep_Tool::Tolerance(vertex));  //OCC217
+         param = BRep_Tool::Parameter(vertex,edge);
+       }
+
+
+       TopAbs_Orientation vtxrelat = vertex.Orientation();
+       if (edor == TopAbs_REVERSED) {
+         // Update considere l'edge FORWARD, et le vertex en relatif
+         vtxrelat= TopAbs::Reverse(vtxrelat);
+       }
+//     if (result.Orientation() == TopAbs_REVERSED) {
+//       vtxrelat= TopAbs::Reverse(vtxrelat);
+//     }
+       TopoDS_Vertex aLocalVertex = TopoDS::Vertex(myMap(vertex));
+       aLocalVertex.Orientation(vtxrelat);
+//     B.UpdateVertex(TopoDS::Vertex
+//                    (myMap(vertex).Oriented(vtxrelat)),
+       B.UpdateVertex(aLocalVertex,
+                      param,
+                      TopoDS::Edge(result),
+                      tol);
+
+       ex.Next();
+      }
+
+    }
+
+    // update flags
+
+    result.Orientable(S.Orientable());
+    result.Closed(S.Closed());
+    result.Infinite(S.Infinite());
+  }
+  else
+    result = S;
+
+  // Set flag of the shape.
+  result.Orientation(ResOr);
+
+  result.Free      (S.Free());
+  result.Modified  (S.Modified());
+  result.Checked   (S.Checked());
+  result.Orientable(S.Orientable());
+  result.Closed    (S.Closed());
+  result.Infinite  (S.Infinite());
+  result.Convex    (S.Convex());
+
+  return rebuild;
+}
diff --git a/src/GEOMImpl/BRepTools_Modifier_21423.hxx b/src/GEOMImpl/BRepTools_Modifier_21423.hxx
new file mode 100644 (file)
index 0000000..b0c81ce
--- /dev/null
@@ -0,0 +1,118 @@
+// This file is generated by WOK (CPPExt).
+// Please do not edit this file; modify original file instead.
+// The copyright and license terms as defined for the original file apply to 
+// this header file considered to be the "object code" form of the original source.
+
+#ifndef _BRepTools_Modifier_21423_HeaderFile
+#define _BRepTools_Modifier_21423_HeaderFile
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+
+#ifndef _TopTools_DataMapOfShapeShape_HeaderFile
+#include <TopTools_DataMapOfShapeShape.hxx>
+#endif
+#ifndef _TopoDS_Shape_HeaderFile
+#include <TopoDS_Shape.hxx>
+#endif
+#ifndef _Standard_Boolean_HeaderFile
+#include <Standard_Boolean.hxx>
+#endif
+#ifndef _Handle_BRepTools_Modification_HeaderFile
+#include <Handle_BRepTools_Modification.hxx>
+#endif
+
+#include <Standard_NoSuchObject.hxx>
+
+class Standard_NullObject;
+class TopoDS_Shape;
+class BRepTools_Modification;
+
+class BRepTools_Modifier_21423  {
+public:
+
+  void* operator new(size_t,void* anAddress) 
+  {
+    return anAddress;
+  }
+  void* operator new(size_t size) 
+  {
+    return Standard::Allocate(size); 
+  }
+  void  operator delete(void *anAddress) 
+  {
+    if (anAddress) Standard::Free((Standard_Address&)anAddress); 
+  }
+
+  //! Creates an empty Modifier. <br>
+  Standard_EXPORT   BRepTools_Modifier_21423();
+  //! Creates a modifier on the shape <S>. <br>
+  Standard_EXPORT   BRepTools_Modifier_21423(const TopoDS_Shape& S);
+  //! Creates a modifier on  the shape <S>, and performs <br>
+//!          the modifications described by <M>. <br>
+  Standard_EXPORT   BRepTools_Modifier_21423(const TopoDS_Shape& S,const Handle(BRepTools_Modification)& M);
+  //! Initializes the modifier with the shape <S>. <br>
+  Standard_EXPORT     void Init(const TopoDS_Shape& S) ;
+  //! Performs the modifications described by <M>. <br>
+  Standard_EXPORT     void Perform(const Handle(BRepTools_Modification)& M) ;
+  //! Returns Standard_True if the modification has <br>
+//!          been computed successfully. <br>
+//! <br>
+        Standard_Boolean IsDone() const;
+  //! Returns the modified shape corresponding to <S>. <br>
+       const TopoDS_Shape& ModifiedShape(const TopoDS_Shape& S) const;
+
+
+
+
+
+protected:
+
+
+
+
+
+private:
+
+  
+  Standard_EXPORT     void Put(const TopoDS_Shape& S) ;
+  
+  Standard_EXPORT     Standard_Boolean Rebuild (const TopoDS_Shape& S,
+                                                const Handle(BRepTools_Modification)& M,
+                                                const Standard_Real Tolerance);
+
+
+TopTools_DataMapOfShapeShape myMap;
+TopoDS_Shape myShape;
+Standard_Boolean myDone;
+
+
+};
+
+//=======================================================================
+//function : ModifiedShape
+//purpose  : 
+//=======================================================================
+inline const TopoDS_Shape& BRepTools_Modifier_21423::ModifiedShape
+  (const TopoDS_Shape& S) const
+{
+  if (!myMap.IsBound(S)) { Standard_NoSuchObject::Raise();}
+  return myMap(S);
+}
+
+//=======================================================================
+//function : IsDone
+//purpose  : 
+//=======================================================================
+inline Standard_Boolean BRepTools_Modifier_21423::IsDone () const
+{
+  return myDone;
+}
+
+// other Inline functions and methods (like "C++: function call" methods)
+
+#endif
diff --git a/src/GEOMImpl/BRepTools_NurbsConvertModification_21423.cxx b/src/GEOMImpl/BRepTools_NurbsConvertModification_21423.cxx
new file mode 100644 (file)
index 0000000..8f0839f
--- /dev/null
@@ -0,0 +1,662 @@
+// File:       BRepTools_NurbsConvertModification_21423.cxx
+// Created:    Fri Jul 12 10:16:32 1996
+// Author:     Stagiaire Mary FABIEN
+//             <fbi@animax.paris1.matra-dtv.fr>
+
+#include <BRepTools_NurbsConvertModification_21423.hxx>
+
+#include <TopoDS_Edge.hxx>
+#include <TopoDS_Face.hxx>
+#include <TopoDS_Vertex.hxx>
+
+#include <TopLoc_Location.hxx>
+
+#include <Geom_Curve.hxx>
+#include <Geom_Surface.hxx>
+
+#include <Geom2d_Curve.hxx>
+
+#include <gp_Pnt.hxx>
+
+#ifndef _Standard_Type_HeaderFile
+#include <Standard_Type.hxx>
+#endif
+
+IMPLEMENT_STANDARD_TYPE(BRepTools_NurbsConvertModification_21423)
+IMPLEMENT_STANDARD_SUPERTYPE_ARRAY()
+  STANDARD_TYPE(BRepTools_Modification),
+  STANDARD_TYPE(MMgt_TShared),
+  STANDARD_TYPE(Standard_Transient),
+
+IMPLEMENT_STANDARD_SUPERTYPE_ARRAY_END()
+IMPLEMENT_STANDARD_TYPE_END(BRepTools_NurbsConvertModification_21423)
+
+IMPLEMENT_DOWNCAST(BRepTools_NurbsConvertModification_21423,Standard_Transient)
+IMPLEMENT_STANDARD_RTTI(BRepTools_NurbsConvertModification_21423)
+
+#include <BRepTools.hxx>
+
+#include <Standard_NoSuchObject.hxx>
+
+#include <Geom_TrimmedCurve.hxx>
+#include <Geom2d_TrimmedCurve.hxx>
+#include <Geom_RectangularTrimmedSurface.hxx>
+#include <Geom_BSplineSurface.hxx>
+#include <Geom_BSplineCurve.hxx>
+#include <Geom_BezierSurface.hxx>
+#include <Geom_BezierCurve.hxx>
+#include <Geom2d_BSplineCurve.hxx>
+#include <GeomConvert.hxx>
+#include <Geom2dConvert.hxx>
+#include <Geom_Plane.hxx>
+#include <Geom_Line.hxx>
+
+#include <Geom2dAdaptor_Curve.hxx>
+#include <GeomAdaptor_Curve.hxx>
+#include <GeomAdaptor_Surface.hxx>
+#include <Geom2dAdaptor_HCurve.hxx>
+#include <Geom2dAdaptor_HCurve.hxx>
+#include <GeomAdaptor_HCurve.hxx>
+#include <GeomAdaptor_HSurface.hxx>
+
+#include <BSplCLib.hxx>
+#include <Approx_SameParameter.hxx>
+#include <BRep_Tool.hxx>
+#include <Extrema_LocateExtPC.hxx>
+#include <OSD_Chronometer.hxx>
+#include <gp_GTrsf2d.hxx>
+#include <gp_TrsfForm.hxx>
+#include <TopAbs.hxx>
+#include <TopoDS.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <TColStd_ListIteratorOfListOfTransient.hxx>
+#include <ProjLib_ComputeApprox.hxx>
+#include <ProjLib_ComputeApproxOnPolarSurface.hxx>
+#include <ElSLib.hxx>
+#include <BSplCLib.hxx>
+#include <Geom_Circle.hxx>
+#include <Geom_Ellipse.hxx>
+#include <Geom_CylindricalSurface.hxx>
+
+#include <TColStd_Array1OfReal.hxx>
+#include <BRep_TEdge.hxx>
+#include <BRep_GCurve.hxx>
+#include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
+#include <BRepAdaptor_Surface.hxx>
+
+static void GeomLib_ChangeUBounds(Handle(Geom_BSplineSurface)& aSurface,
+                                 const Standard_Real newU1,
+                                 const Standard_Real newU2)
+{
+  TColStd_Array1OfReal  knots(1,aSurface->NbUKnots()) ;
+  aSurface->UKnots(knots) ;
+  BSplCLib::Reparametrize(newU1,
+                         newU2,
+                         knots) ;
+  aSurface->SetUKnots(knots) ;
+}
+static void GeomLib_ChangeVBounds(Handle(Geom_BSplineSurface)& aSurface,
+                                 const Standard_Real newV1,
+                                 const Standard_Real newV2)
+{
+  TColStd_Array1OfReal  knots(1,aSurface->NbVKnots()) ;
+  aSurface->VKnots(knots) ;
+  BSplCLib::Reparametrize(newV1,
+                         newV2,
+                         knots) ;
+  aSurface->SetVKnots(knots) ;
+}
+
+//=======================================================================
+//function : BRepTools_NurbsConvertModification_21423
+//purpose  : 
+//=======================================================================
+
+BRepTools_NurbsConvertModification_21423::BRepTools_NurbsConvertModification_21423()
+{
+}
+
+
+
+//=======================================================================
+//function : NewSurface
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean BRepTools_NurbsConvertModification_21423::NewSurface
+      (const TopoDS_Face& F,
+       Handle(Geom_Surface)& S,
+       TopLoc_Location& L,
+       Standard_Real& Tol,
+       Standard_Boolean& RevWires,
+       Standard_Boolean& RevFace)
+{
+  Standard_Real U1, U2, curvU1, curvU2, surfU1, surfU2, UTol;
+  Standard_Real V1, V2, curvV1, curvV2, surfV1, surfV2, VTol;
+  RevWires = Standard_False;
+  RevFace = Standard_False;
+  Handle(Geom_Surface) SS = BRep_Tool::Surface(F,L);
+  Handle(Standard_Type) TheTypeSS = SS->DynamicType();
+  if ((TheTypeSS == STANDARD_TYPE(Geom_BSplineSurface)) ||
+      (TheTypeSS == STANDARD_TYPE(Geom_BezierSurface))) {
+    return Standard_False;
+  }
+  S = SS;
+  BRepTools::UVBounds(F,curvU1,curvU2,curvV1,curvV2);
+  Tol = BRep_Tool::Tolerance(F);
+  Standard_Real TolPar = 0.1*Tol;
+  Standard_Boolean IsUp = S->IsUPeriodic(), IsVp = S->IsVPeriodic();
+  //OCC466(apo)->
+  U1 = curvU1;  U2 = curvU2;  
+  V1 = curvV1;  V2 = curvV2;
+  SS->Bounds(surfU1,surfU2,surfV1,surfV2); 
+  if(!IsUp){
+    U1 = Max(surfU1,curvU1);
+    U2 = Min(surfU2,curvU2);
+  }
+  if(!IsVp){
+    V1 = Max(surfV1,curvV1);
+    V2 = Min(surfV2,curvV2);
+  }
+  //<-OCC466(apo)  
+  if(IsUp && IsVp) {
+    Standard_Real dU = Abs(U2 - U1), dV = Abs(V2 - V1);
+    Standard_Real Up = S->UPeriod(), Vp = S->VPeriod();
+    if(Abs(dU - Up) <= TolPar && U2 <= Up) {
+      if(Abs(dV - Vp) <= TolPar && V2 <= Vp) { }
+      else {
+       SS = new Geom_RectangularTrimmedSurface(S, V1+1e-9, V2-1e-9, Standard_False);
+      }
+    }
+    else {
+      if(Abs(dV - Vp) <= TolPar && V2 <= Vp) 
+       SS = new Geom_RectangularTrimmedSurface(S, U1+1e-9, U2-1e-9, Standard_True);
+      else
+       SS = new Geom_RectangularTrimmedSurface(S, U1+1e-9, U2-1e-9, V1+1e-9, V2-1e-9);
+    }
+  }
+
+  if(IsUp && !IsVp) {
+    Standard_Real dU = Abs(U2 - U1);
+    Standard_Real Up = S->UPeriod();
+    if(Abs(dU - Up) <= TolPar && U2 <= Up) 
+      SS = new Geom_RectangularTrimmedSurface(S, V1+1e-9, V2-1e-9, Standard_False);
+    else 
+      SS = new Geom_RectangularTrimmedSurface(S, U1+1e-9, U2-1e-9, V1+1e-9, V2-1e-9);
+  }
+       
+  if(!IsUp && IsVp) {
+    Standard_Real dV = Abs(V2 - V1);
+    Standard_Real Vp = S->VPeriod();
+    if(Abs(dV - Vp) <= TolPar && V2 <= Vp) 
+      SS = new Geom_RectangularTrimmedSurface(S, U1+1e-9, U2-1e-9, Standard_True);
+    else
+      SS = new Geom_RectangularTrimmedSurface(S, U1+1e-9, U2-1e-9, V1+1e-9, V2-1e-9);
+  }
+
+  if(!IsUp && !IsVp) {
+    SS = new Geom_RectangularTrimmedSurface(S, U1+1e-9, U2-1e-9, V1+1e-9, V2-1e-9);
+  }
+
+  SS->Bounds(surfU1,surfU2,surfV1,surfV2) ; 
+
+  S = GeomConvert::SurfaceToBSplineSurface(SS);
+  Handle(Geom_BSplineSurface) BS = Handle(Geom_BSplineSurface)::DownCast(S) ;
+  BS->Resolution(Tol, UTol, VTol) ;
+  
+  // 
+  // on recadre les bornes de S  sinon les anciennes PCurves sont aux fraises
+  //
+
+  if (Abs(curvU1-surfU1) > UTol && !BS->IsUPeriodic()) {
+    GeomLib_ChangeUBounds(BS, U1,U2) ;
+  }
+  if (Abs(curvV1-surfV1) > VTol && !BS->IsVPeriodic()) {
+    GeomLib_ChangeVBounds(BS, V1, V2) ;
+  }
+
+  ////modified by jgv, 17.11.11 for SALOME only, bug 21423////
+  BRepAdaptor_Surface BAsurf(F);
+  if (BAsurf.GetType() == GeomAbs_Sphere)
+  { //from OCC217
+    Standard_Real dTol = 1e-9/Sqrt(UTol*UTol+VTol*VTol)*2.0; 
+    Tol *= Max(dTol,1.0);
+  }
+  ////////////////////////////////////////////////////////////
+  
+  return Standard_True;
+}
+
+static Standard_Boolean IsConvert(const TopoDS_Edge& E)
+{
+  Standard_Boolean isConvert = Standard_False;
+  Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*)&E.TShape());
+  // iterate on pcurves
+  BRep_ListIteratorOfListOfCurveRepresentation itcr(TE->Curves());
+  for ( ; itcr.More() && !isConvert; itcr.Next() ) {
+    Handle(BRep_GCurve) GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
+    if ( GC.IsNull() || ! GC->IsCurveOnSurface() ) continue;
+    Handle(Geom_Surface) aSurface = GC->Surface();
+    Handle(Geom2d_Curve) aCurve2d = GC->PCurve();
+    isConvert =((!aSurface->IsKind(STANDARD_TYPE(Geom_BSplineSurface)) && 
+                !aSurface->IsKind(STANDARD_TYPE(Geom_BezierSurface))) ||
+               (!aCurve2d->IsKind(STANDARD_TYPE(Geom2d_BSplineCurve)) &&
+               !aCurve2d->IsKind(STANDARD_TYPE(Geom2d_BezierCurve))));
+     
+  }
+  return isConvert;
+  
+}
+
+//=======================================================================
+//function : NewCurve
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean BRepTools_NurbsConvertModification_21423::NewCurve
+(const TopoDS_Edge& E, 
+ Handle(Geom_Curve)& C,
+ TopLoc_Location& L,
+ Standard_Real& Tol)
+{
+
+  Tol = BRep_Tool::Tolerance(E);
+  if(BRep_Tool::Degenerated(E)) {
+    C.Nullify();
+    L.Identity();
+    return Standard_True;
+  }
+  Standard_Real f, l;
+
+  Handle(Geom_Curve) Caux = BRep_Tool::Curve(E, L, f, l);
+
+  if ( Caux.IsNull()) {
+    L.Identity();    
+    return Standard_False;
+  }
+  Handle(Standard_Type) TheType = Caux->DynamicType();
+  if ((TheType == STANDARD_TYPE(Geom_BSplineCurve)) ||
+      (TheType == STANDARD_TYPE(Geom_BezierCurve))) {
+    if(IsConvert(E)) {
+      C = Handle(Geom_Curve)::DownCast(Caux->Copy());
+      return Standard_True;
+    }
+    return Standard_False;
+  } 
+
+  C = Caux; 
+
+  Standard_Real TolPar = Tol *.1;
+
+  if(C->IsPeriodic()) {
+    Standard_Real p = C->Period();
+    Standard_Real d = Abs(l - f);
+    if(Abs(d - p) <= TolPar && l <= p) {}
+    else
+      C = new Geom_TrimmedCurve(C, f, l);
+  } 
+  else 
+    C = new Geom_TrimmedCurve(C, f, l);
+
+//modif WOK++ portage hp (fbi du 14/03/97)
+//  gp_Trsf trsf(L);
+//  gp_Trsf trsf = L.Transformation();
+
+//  C = GeomConvert::CurveToBSplineCurve(C,Convert_QuasiAngular);
+
+  C = GeomConvert::CurveToBSplineCurve(C);
+
+  Standard_Real fnew = C->FirstParameter(), lnew = C->LastParameter(), UTol;
+
+  Handle(Geom_BSplineCurve) BC = Handle(Geom_BSplineCurve)::DownCast(C) ;
+
+  if(!BC->IsPeriodic()) {
+    BC->Resolution(Tol, UTol) ;
+    if(Abs(f - fnew) > UTol || Abs(l - lnew) > UTol) {
+      TColStd_Array1OfReal  knots(1,BC->NbKnots()) ;
+      BC->Knots(knots) ;
+      BSplCLib::Reparametrize(f, l, knots) ;
+      BC->SetKnots(knots) ;
+    }
+  }
+
+  if(!myMap.Contains(Caux)) {
+    myMap.Add(Caux,C);
+  }
+  return Standard_True ;
+}
+
+//=======================================================================
+//function : NewPoint
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean BRepTools_NurbsConvertModification_21423::NewPoint
+//(const TopoDS_Vertex& V, 
+(const TopoDS_Vertex& , 
+// gp_Pnt& P, 
+ gp_Pnt& , 
+// Standard_Real& Tol)
+ Standard_Real& )
+{  
+  return Standard_False;
+}
+
+
+//=======================================================================
+//function : NewCurve2d
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean BRepTools_NurbsConvertModification_21423::NewCurve2d
+(const TopoDS_Edge& E, 
+ const TopoDS_Face& F, 
+ const TopoDS_Edge& newE, 
+ const TopoDS_Face& newF, 
+ Handle(Geom2d_Curve)& Curve2d,
+ Standard_Real& Tol)
+{
+  ////modified by jgv, 17.11.11 for SALOME only, bug 21423////
+  Tol = BRep_Tool::Tolerance(E);
+  BRepAdaptor_Surface BAsurf(F);
+  if (BAsurf.GetType() == GeomAbs_Sphere)
+    Tol = Max(Max(BRep_Tool::Tolerance(E),BRep_Tool::Tolerance(F)),
+              Max(BRep_Tool::Tolerance(newE),BRep_Tool::Tolerance(newF))
+              ); //from OCC217
+  ////////////////////////////////////////////////////////////
+  
+  Standard_Real f2d,l2d;
+  Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E,F,f2d,l2d);
+  Standard_Real f3d,l3d;
+  TopLoc_Location Loc;
+  Handle(Geom_Curve) C3d = BRep_Tool::Curve(E, Loc, f3d,l3d);
+  Standard_Boolean isConvert2d = ((!C3d.IsNull() && !C3d->IsKind(STANDARD_TYPE(Geom_BSplineCurve)) &&
+    !C3d->IsKind(STANDARD_TYPE(Geom_BezierCurve))) ||
+    IsConvert(E));
+  
+  if(BRep_Tool::Degenerated(E)) {
+    //Curve2d = C2d;
+    if(!C2d->IsKind(STANDARD_TYPE(Geom2d_TrimmedCurve)))
+    {
+      Handle(Geom2d_TrimmedCurve) aTrimC = new Geom2d_TrimmedCurve(C2d,f2d,l2d);
+      C2d = aTrimC;
+    }
+    Curve2d = Geom2dConvert::CurveToBSplineCurve(C2d);
+    return Standard_True;
+  }
+  if(!BRepTools::IsReallyClosed(E,F)) {
+    Handle(Standard_Type) TheTypeC2d = C2d->DynamicType();
+
+    if(TheTypeC2d == STANDARD_TYPE(Geom2d_TrimmedCurve)) {
+      Handle(Geom2d_TrimmedCurve) TC = Handle(Geom2d_TrimmedCurve)::DownCast(C2d);
+      C2d = TC->BasisCurve();
+    }
+
+    Standard_Real fc = C2d->FirstParameter(), lc = C2d->LastParameter();
+
+    if(!C2d->IsPeriodic()) {
+      if(fc - f2d > Precision::PConfusion()) f2d = fc;
+      if(l2d - lc > Precision::PConfusion()) l2d = lc;
+    }
+
+    C2d = new Geom2d_TrimmedCurve(C2d, f2d, l2d);
+
+    Geom2dAdaptor_Curve   G2dAC(C2d, f2d, l2d);
+    Handle(Geom2dAdaptor_HCurve) G2dAHC = new Geom2dAdaptor_HCurve(G2dAC);
+    
+    TopLoc_Location Loc;
+    Handle(Geom_Curve) C3d = BRep_Tool::Curve(E, Loc, f3d,l3d);
+    if(!newE.IsNull()) {
+      C3d = BRep_Tool::Curve(newE, f3d, l3d);
+    }
+    else {
+      C3d = BRep_Tool::Curve(E,f3d,l3d);
+    }
+    GeomAdaptor_Curve   G3dAC(C3d, f3d, l3d);
+    Handle(GeomAdaptor_HCurve) G3dAHC = new GeomAdaptor_HCurve(G3dAC);
+    
+    Standard_Real Uinf, Usup, Vinf, Vsup, u = 0, v = 0;
+    Handle(Geom_Surface) S = BRep_Tool::Surface(F);
+    Handle(Standard_Type) myT = S->DynamicType();
+    if(myT != STANDARD_TYPE(Geom_Plane)) {
+      if(newF.IsNull()) {
+       Handle(Standard_Type) st = C2d->DynamicType();
+       if ((st == STANDARD_TYPE(Geom2d_BSplineCurve)) ||
+           (st == STANDARD_TYPE(Geom2d_BezierCurve))) {
+         if(isConvert2d) {
+           Curve2d = Handle(Geom2d_Curve)::DownCast(C2d->Copy());
+           return Standard_True;
+         }
+         return Standard_False;
+        }
+      }
+      else {
+       S = BRep_Tool::Surface(newF);
+       
+      }
+      S->Bounds(Uinf, Usup, Vinf, Vsup);
+      Uinf -= 1e-9; Usup += 1e-9; Vinf -= 1e-9; Vsup += 1e-9;
+      u = (Usup - Uinf)*0.1;
+      v = (Vsup - Vinf)*0.1;
+      if(S->IsUPeriodic()) {
+       Standard_Real uperiod = S->UPeriod();
+       if(uperiod < (Usup+2*u-Uinf)) {
+         if(uperiod <= (Usup-Uinf))  {
+           u = 0;
+         } 
+         else {
+           u = (uperiod-(Usup-Uinf))*0.5;
+         }
+       }
+      }
+      if(S->IsVPeriodic()) {
+       Standard_Real vperiod = S->VPeriod();
+       if(vperiod < (Vsup+2*v-Vinf)) {
+         if(vperiod <= (Vsup-Vinf)) {
+           v = 0;
+         }
+         else {
+           v = (vperiod-(Vsup-Vinf))*0.5;
+         }
+       }
+      }
+    }
+    else {
+      S = BRep_Tool::Surface(F);// Si S est un plan, pas de changement de parametrisation
+      GeomAdaptor_Surface GAS(S);
+      Handle(GeomAdaptor_HSurface) GAHS = new GeomAdaptor_HSurface(GAS);
+      ProjLib_ComputeApprox ProjOnCurve(G3dAHC,GAHS,Tol);
+      if(ProjOnCurve.BSpline().IsNull()) {
+       Curve2d = Geom2dConvert::CurveToBSplineCurve(ProjOnCurve.Bezier());
+       return Standard_True;
+      }
+      Curve2d = ProjOnCurve.BSpline();
+      return Standard_True;
+    }
+    GeomAdaptor_Surface GAS(S,Uinf-u,Usup+u,Vinf-v,Vsup+v);
+
+    Handle(GeomAdaptor_HSurface) GAHS = new GeomAdaptor_HSurface(GAS);
+
+    ProjLib_ComputeApproxOnPolarSurface ProjOnCurve(G2dAHC,G3dAHC,GAHS,Tol);
+
+    if(ProjOnCurve.IsDone()) {
+      Curve2d = ProjOnCurve.BSpline();
+      
+      return Standard_True;
+    }
+    else {
+      Curve2d = Geom2dConvert::CurveToBSplineCurve(C2d);
+      return Standard_True;
+    }
+  }
+  else  {
+    TopTools_ListIteratorOfListOfShape itled;
+    TColStd_ListIteratorOfListOfTransient itlcu;
+    
+    for (itled.Initialize(myled), itlcu.Initialize(mylcu);
+        itled.More(); // itlcu.More()
+        itled.Next(),itlcu.Next()) {
+      if (itled.Value().IsSame(E)) {
+       // deja traitee
+       break;
+      }
+    }
+    if (!itled.More()) { // on stocke l`edge et la curve2d
+      Handle(Geom2d_Curve) C2dBis;
+      Standard_Real f3d,l3d,f2dBis,l2dBis;
+      C2d = new Geom2d_TrimmedCurve(C2d, f2d, l2d);
+      Geom2dAdaptor_Curve G2dAC(C2d, f2d, l2d);
+      Handle(Geom2dAdaptor_HCurve) G2dAHC = new Geom2dAdaptor_HCurve(G2dAC);
+      TopoDS_Edge ERevers = E;
+      ERevers.Reverse();
+//      TopoDS_Edge ERevers = TopoDS::Edge(E.Reversed());
+      C2dBis = BRep_Tool::CurveOnSurface(ERevers,F,f2dBis,l2dBis);      
+      Handle(Standard_Type) TheTypeC2dBis = C2dBis->DynamicType();
+      C2dBis = new Geom2d_TrimmedCurve(C2dBis,f2dBis, l2dBis);
+      Geom2dAdaptor_Curve   G2dACBis(C2dBis, f2dBis, l2dBis); 
+      Handle(Geom2dAdaptor_HCurve) G2dAHCBis = new Geom2dAdaptor_HCurve(G2dACBis);
+      
+      TopLoc_Location Loc;
+      Handle(Geom_Curve) C3d = BRep_Tool::Curve(E, f3d,l3d);
+      if(C3d.IsNull()) {
+         if(isConvert2d) {
+           Curve2d = Handle(Geom2d_Curve)::DownCast(C2d->Copy());
+           return Standard_True;
+         }
+        
+       return Standard_False;
+      }
+      if(!newE.IsNull()) {
+       C3d = BRep_Tool::Curve(newE, f3d,l3d);
+      }
+      GeomAdaptor_Curve G3dAC(C3d, f3d, l3d);
+      Handle(GeomAdaptor_HCurve) G3dAHC = new GeomAdaptor_HCurve(G3dAC);
+      
+      Handle(Geom_Surface) S = BRep_Tool::Surface(F);
+      Handle(Standard_Type) myT = S->DynamicType();
+      if(newF.IsNull()) {
+       mylcu.Append(C2dBis);
+       Handle(Standard_Type) st = C2d->DynamicType();
+       if ((st == STANDARD_TYPE(Geom2d_BSplineCurve)) ||
+           (st == STANDARD_TYPE(Geom2d_BezierCurve))) {
+         if(isConvert2d) {
+           Curve2d = Handle(Geom2d_Curve)::DownCast(C2d->Copy());
+           return Standard_True;
+         }
+         return Standard_False;
+       }
+      }
+      else {
+       S = BRep_Tool::Surface(newF);// S est une BSplineSurface : pas besoin de la trimmed
+      }
+      Standard_Real Uinf, Usup, Vinf, Vsup, u = 0, v = 0;
+      S->Bounds(Uinf, Usup, Vinf, Vsup);
+      Uinf -= 1e-9; Usup += 1e-9; Vinf -= 1e-9; Vsup += 1e-9;
+      u = (Usup - Uinf)*0.1;
+      v = (Vsup - Vinf)*0.1;
+      if(S->IsUPeriodic()) {
+       Standard_Real uperiod = S->UPeriod();
+       if(uperiod < (Usup+2*u-Uinf))
+         if(uperiod <= (Usup-Uinf))
+           u = 0;
+         else
+           u = (uperiod-(Usup-Uinf))*0.5;
+      }
+      if(S->IsVPeriodic()) {
+       Standard_Real vperiod = S->VPeriod();
+       if(vperiod < (Vsup+2*v-Vinf))
+         if(vperiod <= (Vsup-Vinf))
+           v = 0;
+         else
+           v = (vperiod-(Vsup-Vinf))*0.5;
+      }
+      GeomAdaptor_Surface GAS(S, Uinf-u,Usup+u,Vinf-v,Vsup+v);
+      Handle(GeomAdaptor_HSurface) GAHS = new GeomAdaptor_HSurface(GAS);
+      myled.Append(E);
+
+      ProjLib_ComputeApproxOnPolarSurface 
+       ProjOnCurve(G2dAHC,G2dAHCBis,G3dAHC,GAHS,Tol);
+
+      if(ProjOnCurve.IsDone()) {
+       Curve2d = ProjOnCurve.BSpline();
+       mylcu.Append(ProjOnCurve.Curve2d());
+       return Standard_True;
+      }
+      else {
+       Curve2d = Geom2dConvert::CurveToBSplineCurve(C2d);
+       mylcu.Append(C2dBis);
+       return Standard_True;
+      }
+    }
+    else { // on est au 2ieme tour 
+      C2d = Handle(Geom2d_Curve)::DownCast(itlcu.Value());
+      Handle(Standard_Type) st = C2d->DynamicType();
+      if (!(st == STANDARD_TYPE(Geom2d_BSplineCurve)) &&
+         !(st == STANDARD_TYPE(Geom2d_BezierCurve))) {
+       return Standard_False;
+      }
+      Curve2d = Geom2dConvert::CurveToBSplineCurve(C2d);
+      return Standard_True;
+    }
+  }
+  Curve2d = C2d;
+  return Standard_True;
+}
+
+//=======================================================================
+//function : NewParameter
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean BRepTools_NurbsConvertModification_21423::NewParameter
+   (const TopoDS_Vertex& V, 
+    const TopoDS_Edge& E, 
+    Standard_Real& P, 
+    Standard_Real& Tol)
+{
+  if(BRep_Tool::Degenerated(E))
+    return Standard_False;
+  Standard_Real f, l, param = BRep_Tool::Parameter(V,E);
+  TopLoc_Location L;
+
+  Handle(Geom_Curve) gc = BRep_Tool::Curve(E, L, f, l);
+  if(!myMap.Contains(gc))
+    return Standard_False;
+
+  Handle(Geom_BSplineCurve) gcc = 
+    Handle(Geom_BSplineCurve)::DownCast(myMap.FindFromKey(gc));
+
+  gcc = Handle(Geom_BSplineCurve)::DownCast(gcc->Transformed(L.Transformation()));
+
+  GeomAdaptor_Curve ac(gcc);
+  gp_Pnt pnt = BRep_Tool::Pnt(V);
+
+  Extrema_LocateExtPC proj(pnt, ac, param, f, l, Tol);
+  if(proj.IsDone()) {
+    Standard_Real Dist2Min = proj.SquareDistance();
+    if (Dist2Min < Tol*Tol) {
+//     Standard_Real U_final_point,V_final_point;
+      P = proj.Point().Parameter();
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : Continuity
+//purpose  : 
+//=======================================================================
+
+GeomAbs_Shape BRepTools_NurbsConvertModification_21423::Continuity
+  (const TopoDS_Edge& E,
+   const TopoDS_Face& F1,
+   const TopoDS_Face& F2,
+   const TopoDS_Edge&,
+   const TopoDS_Face&,
+   const TopoDS_Face&)
+{
+  return BRep_Tool::Continuity(E,F1,F2);
+}
+
+
diff --git a/src/GEOMImpl/BRepTools_NurbsConvertModification_21423.hxx b/src/GEOMImpl/BRepTools_NurbsConvertModification_21423.hxx
new file mode 100644 (file)
index 0000000..602f27d
--- /dev/null
@@ -0,0 +1,141 @@
+// This file is generated by WOK (CPPExt).
+// Please do not edit this file; modify original file instead.
+// The copyright and license terms as defined for the original file apply to 
+// this header file considered to be the "object code" form of the original source.
+
+#ifndef _BRepTools_NurbsConvertModification_21423_HeaderFile
+#define _BRepTools_NurbsConvertModification_21423_HeaderFile
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_DefineHandle_HeaderFile
+#include <Standard_DefineHandle.hxx>
+#endif
+#ifndef _Handle_BRepTools_NurbsConvertModification_21423_HeaderFile
+#include <Handle_BRepTools_NurbsConvertModification_21423.hxx>
+#endif
+
+#ifndef _TopTools_ListOfShape_HeaderFile
+#include <TopTools_ListOfShape.hxx>
+#endif
+#ifndef _TColStd_ListOfTransient_HeaderFile
+#include <TColStd_ListOfTransient.hxx>
+#endif
+#ifndef _TColStd_IndexedDataMapOfTransientTransient_HeaderFile
+#include <TColStd_IndexedDataMapOfTransientTransient.hxx>
+#endif
+#ifndef _BRepTools_Modification_HeaderFile
+#include <BRepTools_Modification.hxx>
+#endif
+#ifndef _Standard_Boolean_HeaderFile
+#include <Standard_Boolean.hxx>
+#endif
+#ifndef _Handle_Geom_Surface_HeaderFile
+#include <Handle_Geom_Surface.hxx>
+#endif
+#ifndef _Standard_Real_HeaderFile
+#include <Standard_Real.hxx>
+#endif
+#ifndef _Handle_Geom_Curve_HeaderFile
+#include <Handle_Geom_Curve.hxx>
+#endif
+#ifndef _Handle_Geom2d_Curve_HeaderFile
+#include <Handle_Geom2d_Curve.hxx>
+#endif
+#ifndef _GeomAbs_Shape_HeaderFile
+#include <GeomAbs_Shape.hxx>
+#endif
+class TopoDS_Face;
+class Geom_Surface;
+class TopLoc_Location;
+class TopoDS_Edge;
+class Geom_Curve;
+class TopoDS_Vertex;
+class gp_Pnt;
+class Geom2d_Curve;
+
+
+//! Defines a modification of the  geometry by a  Trsf <br>
+//!          from gp. All methods return True and transform the <br>
+//!          geometry. <br>
+class BRepTools_NurbsConvertModification_21423 : public BRepTools_Modification {
+
+public:
+
+  
+  Standard_EXPORT   BRepTools_NurbsConvertModification_21423();
+  //! Returns Standard_True  if  the face  <F> has  been <br>
+//!          modified.  In this  case, <S> is the new geometric <br>
+//!          support of  the  face, <L> the  new location,<Tol> <br>
+//!          the new  tolerance.<RevWires> has  to  be set   to <br>
+//!          Standard_True   when the modification reverses the <br>
+//!          normal of  the   surface.(the wires   have  to  be <br>
+//!          reversed).   <RevFace>   has   to   be   set    to <br>
+//!          Standard_True if  the orientation  of the modified <br>
+//!          face changes in the  shells which contain  it.  -- <br>
+//!          Here, <RevFace>  will  return Standard_True if the <br>
+//!          -- gp_Trsf is negative. <br>
+  Standard_EXPORT     Standard_Boolean NewSurface(const TopoDS_Face& F,Handle(Geom_Surface)& S,TopLoc_Location& L,Standard_Real& Tol,Standard_Boolean& RevWires,Standard_Boolean& RevFace) ;
+  //! Returns Standard_True  if  the edge  <E> has  been <br>
+//!          modified.  In this case,  <C> is the new geometric <br>
+//!          support of the  edge, <L> the  new location, <Tol> <br>
+//!          the         new    tolerance.   Otherwise, returns <br>
+//!          Standard_False,    and  <C>,  <L>,   <Tol> are not <br>
+//!          significant. <br>
+  Standard_EXPORT     Standard_Boolean NewCurve(const TopoDS_Edge& E,Handle(Geom_Curve)& C,TopLoc_Location& L,Standard_Real& Tol) ;
+  //! Returns  Standard_True if the  vertex <V> has been <br>
+//!          modified.  In this  case, <P> is the new geometric <br>
+//!          support of the vertex,   <Tol> the new  tolerance. <br>
+//!          Otherwise, returns Standard_False, and <P>,  <Tol> <br>
+//!          are not significant. <br>
+  Standard_EXPORT     Standard_Boolean NewPoint(const TopoDS_Vertex& V,gp_Pnt& P,Standard_Real& Tol) ;
+  //! Returns Standard_True if  the edge  <E> has a  new <br>
+//!          curve on surface on the face <F>.In this case, <C> <br>
+//!          is the new geometric support of  the edge, <L> the <br>
+//!          new location, <Tol> the new tolerance. <br>
+//!          Otherwise, returns  Standard_False, and <C>,  <L>, <br>
+//!          <Tol> are not significant. <br>
+  Standard_EXPORT     Standard_Boolean NewCurve2d(const TopoDS_Edge& E,const TopoDS_Face& F,const TopoDS_Edge& NewE,const TopoDS_Face& NewF,Handle(Geom2d_Curve)& C,Standard_Real& Tol) ;
+  //! Returns Standard_True if the Vertex  <V> has a new <br>
+//!          parameter on the  edge <E>. In  this case,  <P> is <br>
+//!          the parameter,    <Tol>  the     new    tolerance. <br>
+//!          Otherwise, returns Standard_False, and <P>,  <Tol> <br>
+//!          are not significant. <br>
+  Standard_EXPORT     Standard_Boolean NewParameter(const TopoDS_Vertex& V,const TopoDS_Edge& E,Standard_Real& P,Standard_Real& Tol) ;
+  //! Returns the  continuity of  <NewE> between <NewF1> <br>
+//!          and <NewF2>. <br>
+//! <br>
+//!          <NewE> is the new  edge created from <E>.  <NewF1> <br>
+//!          (resp. <NewF2>) is the new  face created from <F1> <br>
+//!          (resp. <F2>). <br>
+  Standard_EXPORT     GeomAbs_Shape Continuity(const TopoDS_Edge& E,const TopoDS_Face& F1,const TopoDS_Face& F2,const TopoDS_Edge& NewE,const TopoDS_Face& NewF1,const TopoDS_Face& NewF2) ;
+
+
+
+
+  DEFINE_STANDARD_RTTI(BRepTools_NurbsConvertModification_21423)
+
+protected:
+
+
+
+
+private: 
+
+
+TopTools_ListOfShape myled;
+TColStd_ListOfTransient mylcu;
+TColStd_IndexedDataMapOfTransientTransient myMap;
+
+
+};
+
+
+
+
+
+// other Inline functions and methods (like "C++: function call" methods)
+
+
+#endif
index 5086d53c05eeddd85753778263af4020ac2561fc..48f179cf8e71c41dd49f0c959f1895ef57c65fc8 100644 (file)
@@ -18,7 +18,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 #include <Standard_Stream.hxx>
 
@@ -79,6 +78,8 @@
 #define NBEDGES 12
 #define NBVERTS 8
 
+#define PLANAR_FACE_MAX_TOLERANCE 1e-06
+
 static Standard_Integer mod4 (Standard_Integer nb)
 {
   if (nb <= 0) return nb + 4;
@@ -1197,10 +1198,12 @@ Standard_Integer GEOMImpl_Block6Explorer::FindFace
 //function : MakeFace
 //purpose  :
 //=======================================================================
-void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire&     theWire,
-                                        const Standard_Boolean isPlanarWanted,
-                                        TopoDS_Shape&          theResult)
+TCollection_AsciiString GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire&     theWire,
+                                                           const Standard_Boolean isPlanarWanted,
+                                                           TopoDS_Shape&          theResult)
 {
+  TCollection_AsciiString aWarning;
+
   // Workaround for Mantis issue 0020956
   if (isPlanarWanted) {
     // Count the number of points in the wire.
@@ -1247,14 +1250,14 @@ void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire&     theWire,
       BRepBuilderAPI_MakeFace MK (plane, theWire, isPlanarWanted);
       if (MK.IsDone()) {
         theResult = MK.Shape();
-        return;
+        return aWarning;
       }
     }
     else {
       BRepBuilderAPI_MakeFace MK (theWire, isPlanarWanted);
       if (MK.IsDone()) {
         theResult = MK.Shape();
-        return;
+        return aWarning;
       }
     }
   }
@@ -1263,7 +1266,7 @@ void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire&     theWire,
     BRepBuilderAPI_MakeFace MK (theWire, isPlanarWanted);
     if (MK.IsDone()) {
       theResult = MK.Shape();
-      return;
+      return aWarning;
     }
   }
 
@@ -1346,7 +1349,7 @@ void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire&     theWire,
 
     if (!aFS.Found()) {
       aFS.Init(theWire, aToleranceReached, isPlanarWanted);
-      if (!aFS.Found()) return;
+      if (!aFS.Found()) return aWarning;
       aToleranceReached = aFS.ToleranceReached();
       aTol = aFS.Tolerance();
     }
@@ -1354,7 +1357,7 @@ void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire&     theWire,
 
     // Copy the wire, bacause it can be updated with very-very big tolerance here
     BRepBuilderAPI_Copy aMC (theWire);
-    if (!aMC.IsDone()) return;
+    if (!aMC.IsDone()) return aWarning;
     TopoDS_Wire aWire = TopoDS::Wire(aMC.Shape());
     // Update tolerances to <aTol>
     BRep_Builder B;
@@ -1371,7 +1374,9 @@ void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire&     theWire,
     BRepBuilderAPI_MakeFace MK1 (aWire, isPlanarWanted);
     if (MK1.IsDone()) {
       theResult = MK1.Shape();
-      return;
+      if (aTol > PLANAR_FACE_MAX_TOLERANCE)
+        aWarning = "MAKE_FACE_TOLERANCE_TOO_BIG";
+      return aWarning;
     }
 
 #else // After migration on OCCT version, containing PKV's fix. See bug 8293
@@ -1379,8 +1384,10 @@ void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire&     theWire,
     aBMF.Init(theWire, isPlanarWanted, Standard_True);
     if (aBMF.Error() == BRepLib_FaceDone) {
       theResult = aBMF.Shape();
-      return;
+      return aWarning;
     }
 #endif
   }
+
+  return aWarning;
 }
index 9734ae744988f90892520821ceeba25a933adea9..ea47dfe37a18bdf1fda5112aa9e7e79b5dd6f2ca 100644 (file)
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 //  File   : GEOMImpl_Block6Explorer.hxx
 //  Module : GEOMImpl
-//
+
 #ifndef GEOMImpl_Block6Explorer_HeaderFile
 #define GEOMImpl_Block6Explorer_HeaderFile
 
@@ -30,6 +29,7 @@
 #include <TopoDS_Wire.hxx>
 #include <TopTools_Array1OfShape.hxx>
 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
+#include <TCollection_AsciiString.hxx>
 #include <gp_Trsf.hxx>
 
   //  Class GEOMImpl_Block6Explorer gives easy and fast access to a certain sub-elements of hexahedral solid
@@ -214,9 +214,9 @@ class GEOMImpl_Block6Explorer
                                     const Standard_Boolean findAll = Standard_False);
   // returns number of found faces
 
-  static void MakeFace (const TopoDS_Wire&     theWire,
-                        const Standard_Boolean isPlanarWanted,
-                        TopoDS_Shape&          theResult);
+  static TCollection_AsciiString MakeFace (const TopoDS_Wire&     theWire,
+                                           const Standard_Boolean isPlanarWanted,
+                                           TopoDS_Shape&          theResult);
 
  private:
   // ---------- PRIVATE FIELDS ----------
index f74e646e41f71cc4a540eb8cec4143bdc861f986..1f958e17004c4e3eda6f94fc8879cf4e34599c3d 100644 (file)
@@ -83,7 +83,6 @@
 #include <BRepAdaptor_Curve.hxx>
 #include <BRepAdaptor_Surface.hxx>
 #include <BRepBndLib.hxx>
-#include <BRepBuilderAPI_MakeFace.hxx>
 #include <BRepMesh_IncrementalMesh.hxx>
 
 #include <TopAbs.hxx>
@@ -458,6 +457,7 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeFace (Handle(GEOM_Object) th
   aCI.SetIsPlanar(isPlanarWanted);
 
   //Compute the Face value
+  Standard_Boolean isWarning = Standard_False;
   try {
 #if OCC_VERSION_LARGE > 0x06010000
     OCC_CATCH_SIGNALS;
@@ -470,14 +470,20 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeFace (Handle(GEOM_Object) th
   catch (Standard_Failure) {
     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
     SetErrorCode(aFail->GetMessageString());
-    return NULL;
+    // to provide warning
+    if (!aFunction->GetValue().IsNull()) {
+      isWarning = Standard_True;
+    } else {
+      return NULL;
+    }
   }
 
   //Make a Python command
   GEOM::TPythonDump(aFunction) << aFace << " = geompy.MakeFace("
     << theWire << ", " << (int)isPlanarWanted << ")";
 
-  SetErrorCode(OK);
+  // to provide warning
+  if (!isWarning) SetErrorCode(OK);
   return aFace;
 }
 
@@ -522,6 +528,7 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeFaceWires
   aCI.SetIsPlanar(isPlanarWanted);
 
   //Compute the shape
+  Standard_Boolean isWarning = Standard_False;
   try {
 #if OCC_VERSION_LARGE > 0x06010000
     OCC_CATCH_SIGNALS;
@@ -534,7 +541,12 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeFaceWires
   catch (Standard_Failure) {
     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
     SetErrorCode(aFail->GetMessageString());
-    return NULL;
+    // to provide warning
+    if (!aFunction->GetValue().IsNull()) {
+      isWarning = Standard_True;
+    } else {
+      return NULL;
+    }
   }
 
   //Make a Python command
@@ -551,7 +563,8 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeFaceWires
   }
   pd << "], " << (int)isPlanarWanted << ")";
 
-  SetErrorCode(OK);
+  // to provide warning
+  if (!isWarning) SetErrorCode(OK);
   return aShape;
 }
 
index 4fb9b1c6756bfa87b8ba940a98da6455691253d3..10250b771d61963f8287ce0456c3697c304e8172 100644 (file)
@@ -18,7 +18,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 #include <Standard_Stream.hxx>
 
@@ -31,7 +30,7 @@
 #include <ShapeFix_ShapeTolerance.hxx>
 
 #include <BRepBuilderAPI_Transform.hxx>
-#include <BRepBuilderAPI_GTransform.hxx>
+#include <BRepBuilderAPI_GTransform_21423.hxx>
 #include <BRep_Tool.hxx>
 #include <BRepAlgo.hxx>
 #include <BRepCheck_Analyzer.hxx>
@@ -165,7 +164,7 @@ Standard_Integer GEOMImpl_ScaleDriver::Execute(TFunction_Logbook& log) const
       }
     }
 
-    BRepBuilderAPI_GTransform aBRepGTrsf (aShapeBase, aGTrsf, Standard_False);
+    BRepBuilderAPI_GTransform_21423 aBRepGTrsf (aShapeBase, aGTrsf, Standard_False);
     if (!aBRepGTrsf.IsDone())
       Standard_ConstructionError::Raise("Scaling not done");
     aShape = aBRepGTrsf.Shape();
@@ -236,5 +235,5 @@ const Handle(GEOMImpl_ScaleDriver) Handle(GEOMImpl_ScaleDriver)::DownCast(const
      }
   }
 
-  return _anOtherObject ;
+  return _anOtherObject;
 }
index 332d117690809fd8c11ff49dca06dc27bf01abe7..f086e4a781e35300ad72bf8d65b1c86845a93f1a 100644 (file)
@@ -121,6 +121,8 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
   Standard_Integer aType = aFunction->GetType();
 
   TopoDS_Shape aShape;
+  TCollection_AsciiString aWarning;
+
   BRep_Builder B;
 
   if (aType == WIRE_EDGES) {
@@ -214,7 +216,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
       Standard_NullObject::Raise
         ("Shape for face construction is neither a wire nor a closed edge");
     }
-    GEOMImpl_Block6Explorer::MakeFace(W, aCI.GetIsPlanar(), aShape);
+    aWarning = GEOMImpl_Block6Explorer::MakeFace(W, aCI.GetIsPlanar(), aShape);
     if (aShape.IsNull()) {
       Standard_ConstructionError::Raise("Face construction failed");
     }
@@ -270,7 +272,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
     // 4.a. Basic face
     TopoDS_Shape aFFace;
     TopoDS_Wire aW1 = TopoDS::Wire(aSeqClosedWires->Value(1));
-    GEOMImpl_Block6Explorer::MakeFace(aW1, aCI.GetIsPlanar(), aFFace);
+    aWarning = GEOMImpl_Block6Explorer::MakeFace(aW1, aCI.GetIsPlanar(), aFFace);
     if (aFFace.IsNull()) {
       Standard_ConstructionError::Raise("Face construction failed");
     }
@@ -495,6 +497,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
     TColStd_SequenceOfReal TolSeq;
     GeomAbs_CurveType CurType;
     TopoDS_Vertex FirstVertex, LastVertex;
+    Standard_Boolean FinalReverse = Standard_False;
 
     BRepTools_WireExplorer wexp(theWire) ;
     for (; wexp.More(); wexp.Next())
@@ -526,6 +529,8 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
         LparSeq.Append(lpar);
         CurType = aType;
         FirstVertex = wexp.CurrentVertex();
+        if (anEdge.Orientation() == TopAbs_REVERSED)
+          FinalReverse = Standard_True;
       }
       else
       {
@@ -728,6 +733,11 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
     LastVertex = wexp.CurrentVertex();
     TolSeq.Append(BRep_Tool::Tolerance(LastVertex));
 
+    TopoDS_Vertex FirstVtx_final = (FinalReverse)? LastVertex : FirstVertex;
+    FirstVtx_final.Orientation(TopAbs_FORWARD);
+    TopoDS_Vertex LastVtx_final = (FinalReverse)? FirstVertex : LastVertex;
+    LastVtx_final.Orientation(TopAbs_REVERSED);
+
     if (!CurveSeq.IsEmpty())
     {
       Standard_Integer nb_curve = CurveSeq.Length();   //number of curves
@@ -795,20 +805,25 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
           Standard_ConstructionError::Raise("Construction aborted : The given Wire has sharp bends between some Edges, no valid Edge can be built");
         }
         ResEdge = BRepLib_MakeEdge(concatcurve->Value(concatcurve->Lower()),
-                                   FirstVertex, LastVertex);
+                                   FirstVtx_final, LastVtx_final,
+                                   concatcurve->Value(concatcurve->Lower())->FirstParameter(),
+                                   concatcurve->Value(concatcurve->Lower())->LastParameter());
       }
       else
       {
         if (CurveSeq(1)->IsInstance(STANDARD_TYPE(Geom_TrimmedCurve)))
-          CurveSeq(1) = (*((Handle(Geom_TrimmedCurve)*)&(CurveSeq(i))))->BasisCurve();
+          CurveSeq(1) = (*((Handle(Geom_TrimmedCurve)*)&(CurveSeq(1))))->BasisCurve();
 
         CurveSeq(1)->Transform(LocSeq(1).Location().Transformation());
         ResEdge = BRepLib_MakeEdge(CurveSeq(1),
-                                   FirstVertex, LastVertex,
+                                   FirstVtx_final, LastVtx_final,
                                    FparSeq(1), LparSeq(1));
       }
     }
 
+    if (FinalReverse)
+      ResEdge.Reverse();
+
     aShape = ResEdge;
   }
   else if (aType == EDGE_CURVE_LENGTH) {
@@ -873,7 +888,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
 
     // Get the point by length
     GeomAdaptor_Curve AdapCurve = GeomAdaptor_Curve(ReOrientedCurve);
-    GCPnts_AbscissaPoint anAbsPnt (AdapCurve, aLength, UFirst); 
+    GCPnts_AbscissaPoint anAbsPnt (AdapCurve, aLength, UFirst);
     Standard_Real aParam = anAbsPnt.Parameter();
 
     if (AdapCurve.IsClosed() && aLength < 0.0) {
@@ -901,6 +916,9 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
 
   log.SetTouched(Label());
 
+  if (!aWarning.IsEmpty())
+    Standard_Failure::Raise(aWarning.ToCString());
+
   return 1;
 }
 
diff --git a/src/GEOMImpl/Handle_BRepTools_NurbsConvertModification_21423.hxx b/src/GEOMImpl/Handle_BRepTools_NurbsConvertModification_21423.hxx
new file mode 100644 (file)
index 0000000..7ae0fed
--- /dev/null
@@ -0,0 +1,27 @@
+// This file is generated by WOK (CPPExt).
+// Please do not edit this file; modify original file instead.
+// The copyright and license terms as defined for the original file apply to 
+// this header file considered to be the "object code" form of the original source.
+
+#ifndef _Handle_BRepTools_NurbsConvertModification_21423_HeaderFile
+#define _Handle_BRepTools_NurbsConvertModification_21423_HeaderFile
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_DefineHandle_HeaderFile
+#include <Standard_DefineHandle.hxx>
+#endif
+
+#ifndef _Handle_BRepTools_Modification_HeaderFile
+#include <Handle_BRepTools_Modification.hxx>
+#endif
+
+class Standard_Transient;
+class Handle(Standard_Type);
+class Handle(BRepTools_Modification);
+class BRepTools_NurbsConvertModification_21423;
+
+DEFINE_STANDARD_HANDLE(BRepTools_NurbsConvertModification_21423,BRepTools_Modification)
+
+#endif
index c4bc7cec7d7f0ae3b3fb3b093214770909b19997..cfe3b0f1c815559543f1058ea4bf861010bbe637 100644 (file)
@@ -104,6 +104,12 @@ salomeinclude_HEADERS =                            \
        GEOMImpl_MirrorDriver.hxx               \
        GEOMImpl_ProjectionDriver.hxx           \
        GEOMImpl_OffsetDriver.hxx               \
+       BRepBuilderAPI_GTransform_21423.hxx             \
+       BRepBuilderAPI_ModifyShape_21423.hxx            \
+       BRepBuilderAPI_NurbsConvert_21423.hxx           \
+       BRepTools_Modifier_21423.hxx                    \
+       BRepTools_NurbsConvertModification_21423.hxx    \
+       Handle_BRepTools_NurbsConvertModification_21423.hxx     \
        GEOMImpl_ScaleDriver.hxx                \
        GEOMImpl_PositionDriver.hxx             \
        GEOMImpl_BoxDriver.hxx                  \
@@ -174,6 +180,11 @@ dist_libGEOMimpl_la_SOURCES =                      \
        GEOMImpl_MirrorDriver.cxx               \
        GEOMImpl_ProjectionDriver.cxx           \
        GEOMImpl_OffsetDriver.cxx               \
+       BRepBuilderAPI_GTransform_21423.cxx             \
+       BRepBuilderAPI_ModifyShape_21423.cxx            \
+       BRepBuilderAPI_NurbsConvert_21423.cxx           \
+       BRepTools_Modifier_21423.cxx                    \
+       BRepTools_NurbsConvertModification_21423.cxx    \
        GEOMImpl_ScaleDriver.cxx                \
        GEOMImpl_PositionDriver.cxx             \
        GEOMImpl_BoxDriver.cxx                  \
index e29a6e763ea86b4d85537f5a3cac1d739a3cc2df..b3a363628074e2d68d827c2f05b48a721c97d310 100644 (file)
@@ -202,7 +202,9 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeFace
 
   //Create the Face
   Handle(GEOM_Object) anObject = GetOperations()->MakeFace(aWire, isPlanarWanted);
-  if (!GetOperations()->IsDone() || anObject.IsNull())
+  //if (!GetOperations()->IsDone() || anObject.IsNull())
+  // enable warning status
+  if (anObject.IsNull())
     return aGEOMObject._retn();
 
   return GetObject(anObject);
@@ -236,7 +238,9 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeFaceWires
   // Make Face
   Handle(GEOM_Object) anObject =
     GetOperations()->MakeFaceWires(aShapes, isPlanarWanted);
-  if (!GetOperations()->IsDone() || anObject.IsNull())
+  //if (!GetOperations()->IsDone() || anObject.IsNull())
+  // enable warning status
+  if (anObject.IsNull())
     return aGEOMObject._retn();
 
   return GetObject(anObject);
index 30420fc7d0ef12844d538b6b11ecc6d5469b6370..a533125fea52783fbcb6751ea62b0cd9d9741c89 100644 (file)
@@ -254,10 +254,11 @@ class Beam(StructuralElementPart):
         orientation is different than the orientation of the underlying OCC
         object.
         """
+        length = self.geom.BasicProperties(path)[0]
         p1 = self.geom.MakeVertexOnCurve(path, 0.0)
         p2 = self.geom.GetFirstVertex(path)
         dist = self.geom.MinDistance(p1, p2)
-        return dist != 0.0
+        return dist > length / 2
 
     def _getVertexAndTangentOnOrientedWire(self, path, param):
         """
index 9837739056a8346dbd7e0528427a5675988c4c3c..1e0903119d0a3f72d993afc3162ab1134365f76d 100644 (file)
@@ -1731,7 +1731,10 @@ class geompyDC(GEOM._objref_GEOM_Gen):
         def MakeFace(self,theWire, isPlanarWanted):
             # Example: see GEOM_TestAll.py
             anObj = self.ShapesOp.MakeFace(theWire, isPlanarWanted)
-            RaiseIfFailed("MakeFace", self.ShapesOp)
+            if anObj is not None and self.ShapesOp.GetErrorCode() == "MAKE_FACE_TOLERANCE_TOO_BIG":
+                print "WARNING: Tolerance of resulting face is too big."
+            else:
+                RaiseIfFailed("MakeFace", self.ShapesOp)
             return anObj
 
         ## Create a face on the given wires set.
@@ -1744,7 +1747,10 @@ class geompyDC(GEOM._objref_GEOM_Gen):
         def MakeFaceWires(self,theWires, isPlanarWanted):
             # Example: see GEOM_TestAll.py
             anObj = self.ShapesOp.MakeFaceWires(theWires, isPlanarWanted)
-            RaiseIfFailed("MakeFaceWires", self.ShapesOp)
+            if anObj is not None and self.ShapesOp.GetErrorCode() == "MAKE_FACE_TOLERANCE_TOO_BIG":
+                print "WARNING: Tolerance of resulting face is too big."
+            else:
+                RaiseIfFailed("MakeFaceWires", self.ShapesOp)
             return anObj
 
         ## Shortcut to MakeFaceWires()
index 4cc1e2cb56413d17893bd1ecad393fa6c2449448..356b9e1a1095b6f896d29f6cb4ff4f530dc770df 100644 (file)
@@ -620,9 +620,23 @@ void GroupGUI_GroupDlg::showOnlySelected()
     aDisplayer->Erase(aSelList, /*forced=*/false, /*updateViewer=*/true);
   }
   else {
+    // Mantis issue 0021421: do not hide main shape, if explode on VERTEX
+    SALOME_View* view = GEOM_Displayer::GetActiveView();
+    if (view) {
+      CORBA::String_var aMainEntry = myMainObj->GetStudyEntry();
+      Handle(SALOME_InteractiveObject) io =
+        new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO");
+      if (view->isVisible(io)) myIsHiddenMain = true;
+    }
+
     aDisplayer->EraseAll(/*forced = false, updateViewer = true*/);
     aDisplayer->Display(aSelList, true);
 
+    // Mantis issue 0021421: do not hide main shape, if explode on VERTEX
+    if (getShapeType() == TopAbs_VERTEX && myIsHiddenMain) {
+      aDisplayer->Display(myMainObj);
+    }
+
     // for the case when selected ids were not displayed in the viewer: Mantis issue 0021367
     highlightSubShapes();
   }
@@ -807,13 +821,22 @@ void GroupGUI_GroupDlg::activateSelection()
       myIsShapeType) // check if shape type is already choosen by user
   {
     GEOM_Displayer* aDisplayer = getDisplayer();
-    SALOME_View* view = GEOM_Displayer::GetActiveView();
-    if (view) {
-      CORBA::String_var aMainEntry = myMainObj->GetStudyEntry();
-      Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO");
-      if (view->isVisible(io)) {
-        aDisplayer->Erase(myMainObj, false, false);
-        myIsHiddenMain = true;
+
+    // Mantis issue 0021421: do not hide main shape, if explode on VERTEX
+    if (getShapeType() == TopAbs_VERTEX) {
+      if (myIsHiddenMain)
+        aDisplayer->Display(myMainObj);
+    }
+    else {
+      SALOME_View* view = GEOM_Displayer::GetActiveView();
+      if (view) {
+        CORBA::String_var aMainEntry = myMainObj->GetStudyEntry();
+        Handle(SALOME_InteractiveObject) io =
+          new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO");
+        if (view->isVisible(io)) {
+          aDisplayer->Erase(myMainObj, false, false);
+          myIsHiddenMain = true;
+        }
       }
     }
 
index 45871a7db05a1762baa7f50ac7f5f911ad111731..005b9adc4b4488387c3301dd9af0f2463aac1b88 100644 (file)
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 // GEOM GEOMGUI : GUI for Geometry component
 // File   : OperationGUI_PartitionDlg.cxx
 // Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
-//
+
 #include "OperationGUI_PartitionDlg.h"
 
 #include <DlgRef.h>
@@ -44,7 +43,7 @@
 
 //=================================================================================
 // class    : OperationGUI_PartitionDlg()
-// purpose  : Constructs a OperationGUI_PartitionDlg which is a child of 'parent', with the 
+// purpose  : Constructs a OperationGUI_PartitionDlg which is a child of 'parent', with the
 //            name 'name' and widget flags set to 'f'.
 //            The dialog will by default be modeless, unless you set 'modal' to
 //            TRUE to construct a modal dialog.
@@ -88,7 +87,7 @@ OperationGUI_PartitionDlg::OperationGUI_PartitionDlg( GeometryGUI* theGeometryGU
   /***************************************************************/
 
   setHelpFileName( "partition_page.html" );
+
   Init();
 }
 
@@ -104,12 +103,12 @@ OperationGUI_PartitionDlg::~OperationGUI_PartitionDlg()
 
 void OperationGUI_PartitionDlg::SetListMaterials( GEOM::ListOfLong ListMaterials )
 {
-  myListMaterials = ListMaterials; 
+  myListMaterials = ListMaterials;
 }
-  
+
 GEOM::ListOfLong OperationGUI_PartitionDlg::GetListMaterials()
-{ 
-  return myListMaterials; 
+{
+  return myListMaterials;
 }
 
 //=================================================================================
@@ -132,7 +131,7 @@ void OperationGUI_PartitionDlg::Init()
   GroupPoints->ComboBox1->addItem( tr( "GEOM_RECONSTRUCTION_LIMIT_VERTEX" ) );
   GroupPoints->ComboBox1->setItemData(GroupPoints->ComboBox1->count()-1, GEOM::VERTEX);
   GroupPoints->CheckButton1->setChecked( false );
-  
+
   mainFrame()->GroupBoxPublish->show();
 
   /* signals and slots connections */
@@ -140,13 +139,13 @@ void OperationGUI_PartitionDlg::Init()
   connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
 
   connect( this, SIGNAL( constructorsClicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) );
-  
+
   connect( GroupPoints->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
   connect( GroupPoints->PushButton2, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
-  
+
   connect( GroupPoints->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
   connect( GroupPoints->LineEdit2, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
-  
+
   connect( GroupPoints->ComboBox1, SIGNAL( activated( int ) ), this, SLOT( ComboTextChanged() ) );
 
   connect( myGeomGUI->getApp()->selectionMgr(),
@@ -154,7 +153,7 @@ void OperationGUI_PartitionDlg::Init()
 
   connect( GroupPoints->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(processPreview()) );
   connect( GroupPoints->CheckButton2, SIGNAL(toggled(bool)), this, SLOT(processPreview()) );
-  
+
   initName( tr( "GEOM_PARTITION" ) );
 
   ConstructorsClicked( 0 );
@@ -170,13 +169,13 @@ void OperationGUI_PartitionDlg::ConstructorsClicked( int constructorId )
 {
   disconnect( myGeomGUI->getApp()->selectionMgr(), 0, this, 0 );
   globalSelection();
-  
+
   //myListShapes.length( 0 );
-  //myListTools.length( 0 );  
+  //myListTools.length( 0 );
   //myListKeepInside.length( 0 );   // obsolete
   //myListRemoveInside.length( 0 ); // obsolete
   //myListMaterials.length( 0 );    // obsolete
-  
+
   switch ( constructorId ) {
   case 0: /*Full partition */
     GroupPoints->GroupBox1->setTitle( tr( "GEOM_PARTITION" ) );
@@ -203,7 +202,7 @@ void OperationGUI_PartitionDlg::ConstructorsClicked( int constructorId )
     GroupPoints->PushButton1->setDown( true );
     GroupPoints->LineEdit1->setEnabled(true);
     break;
-  } 
+  }
 
   myEditCurrentArgument = GroupPoints->LineEdit1;
   GroupPoints->LineEdit1->clear();
@@ -214,7 +213,7 @@ void OperationGUI_PartitionDlg::ConstructorsClicked( int constructorId )
   resize( minimumSizeHint() );
 
   myEditCurrentArgument->setFocus();
-  connect( myGeomGUI->getApp()->selectionMgr(), 
+  connect( myGeomGUI->getApp()->selectionMgr(),
            SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
   SelectionIntoArgument();
 }
@@ -240,10 +239,9 @@ bool OperationGUI_PartitionDlg::ClickOnApply()
 {
   if ( !onAccept() )
     return false;
-  
 
   initName();
-  //  0020854: EDF 1398 GEOM: Ergonomy of Partition GUI window 
+  //  0020854: EDF 1398 GEOM: Ergonomy of Partition GUI window
   //  ConstructorsClicked( getConstructorId() );
   return true;
 }
@@ -257,13 +255,13 @@ void OperationGUI_PartitionDlg::SelectionIntoArgument()
 {
   myEditCurrentArgument->setText( "" );
   QString aString = "";
-  
+
   LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
   SALOME_ListIO aSelList;
   aSelMgr->selectedObjects(aSelList);
 
   int nbSel = GEOMBase::GetNameOfSelectedIObjects(aSelList, aString, true);
-    
+
   if ( getConstructorId() == 1 ) {
     // for half-selection, only one shape can be selected as an object
     // and only one plane as a tool
@@ -292,11 +290,11 @@ void OperationGUI_PartitionDlg::SelectionIntoArgument()
       }
     }
   }
-  
+
   if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) {
     GEOMBase::ConvertListOfIOInListOfGO(aSelList, myListShapes, true);
     //myListMaterials.length( 0 ); // obsolete
-    
+
     GEOM::shape_type type = GEOM::SHAPE;
     for (int i = 0; i < myListShapes.length(); i++)
       type = qMin( type, myListShapes[i]->GetMaxShapeType() );
@@ -322,7 +320,7 @@ void OperationGUI_PartitionDlg::SelectionIntoArgument()
       }
     }
   }
-  
+
   myEditCurrentArgument->setText( aString );
   processPreview();
 }
@@ -335,7 +333,7 @@ void OperationGUI_PartitionDlg::SelectionIntoArgument()
 void OperationGUI_PartitionDlg::SetEditCurrentArgument()
 {
   QPushButton* send = (QPushButton*)sender();
-  
+
   if ( send == GroupPoints->PushButton1 ) {
     myEditCurrentArgument = GroupPoints->LineEdit1;
     GroupPoints->PushButton2->setDown(false);
@@ -351,9 +349,9 @@ void OperationGUI_PartitionDlg::SetEditCurrentArgument()
     if ( getConstructorId() == 1 )
       globalSelection( GEOM_PLANE  );
   }
+
   globalSelection( GEOM_ALLSHAPES );
-      
+
   myEditCurrentArgument->setFocus();
   SelectionIntoArgument();
   send->setDown(true);
@@ -369,7 +367,7 @@ void OperationGUI_PartitionDlg::LineEditReturnPressed()
 {
   QLineEdit* send = (QLineEdit*)sender();
 
-  if ( send == GroupPoints->LineEdit1 || 
+  if ( send == GroupPoints->LineEdit1 ||
        send == GroupPoints->LineEdit2 ) {
       myEditCurrentArgument = send;
       GEOMBase_Skeleton::LineEditReturnPressed();
@@ -384,10 +382,10 @@ void OperationGUI_PartitionDlg::LineEditReturnPressed()
 void OperationGUI_PartitionDlg::ActivateThisDialog()
 {
   GEOMBase_Skeleton::ActivateThisDialog();
-  connect( myGeomGUI->getApp()->selectionMgr(), 
+  connect( myGeomGUI->getApp()->selectionMgr(),
            SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
 
-  ConstructorsClicked( getConstructorId() ); 
+  ConstructorsClicked( getConstructorId() );
   processPreview();
 }
 
@@ -417,9 +415,11 @@ GEOM::GEOM_IOperations_ptr OperationGUI_PartitionDlg::createOperation()
 // function : isValid
 // purpose  :
 //=================================================================================
-bool OperationGUI_PartitionDlg::isValidQString& )
+bool OperationGUI_PartitionDlg::isValid (QString& )
 {
-  return ( myListShapes.length() || myListTools.length() ); // || myListKeepInside.length() || myListRemoveInside.length()  // obsolete
+  return (getConstructorId() == 0 ?
+          myListShapes.length() :
+          myListShapes.length() && myListTools.length());
 }
 
 
@@ -427,31 +427,35 @@ bool OperationGUI_PartitionDlg::isValid( QString& )
 // function : execute
 // purpose  :
 //=================================================================================
-bool OperationGUI_PartitionDlg::execute( ObjectList& objects )
+bool OperationGUI_PartitionDlg::execute (ObjectList& objects)
 {
   bool res = false;
   GEOM::GEOM_Object_var anObj;
 
-  int aLimit               = GetLimit();
-  int aKeepNonlimitShapes  = GroupPoints->CheckButton1->isChecked();
-  bool aNoSelfIntersection = GroupPoints->CheckButton2->isChecked();
-
-  GEOM::GEOM_IBooleanOperations_var anOper = GEOM::GEOM_IBooleanOperations::_narrow( getOperation() );
+  GEOM::GEOM_IBooleanOperations_var anOper = GEOM::GEOM_IBooleanOperations::_narrow(getOperation());
 
   switch ( getConstructorId() ) {
   case 0:
-    anObj = aNoSelfIntersection ?
-      anOper->MakePartitionNonSelfIntersectedShape( myListShapes, myListTools,
-                                                    myListKeepInside, myListRemoveInside,
-                                                    aLimit, false, myListMaterials, aKeepNonlimitShapes ) :
-      anOper->MakePartition( myListShapes, myListTools,
-                             myListKeepInside, myListRemoveInside,
-                             aLimit, false, myListMaterials, aKeepNonlimitShapes );
-    res = true;
+    {
+      int aLimit               = GetLimit();
+      int aKeepNonlimitShapes  = GroupPoints->CheckButton1->isChecked();
+      bool aNoSelfIntersection = GroupPoints->CheckButton2->isChecked();
+
+      anObj = aNoSelfIntersection ?
+        anOper->MakePartitionNonSelfIntersectedShape(myListShapes, myListTools,
+                                                     myListKeepInside, myListRemoveInside,
+                                                     aLimit, false, myListMaterials, aKeepNonlimitShapes) :
+        anOper->MakePartition(myListShapes, myListTools,
+                              myListKeepInside, myListRemoveInside,
+                              aLimit, false, myListMaterials, aKeepNonlimitShapes);
+      res = true;
+    }
     break;
   case 1:
-    anObj = anOper->MakeHalfPartition( myListShapes[0].in(), myListTools[0].in() );
-    res = true;
+    {
+      anObj = anOper->MakeHalfPartition( myListShapes[0].in(), myListTools[0].in() );
+      res = true;
+    }
     break;
   }
 
@@ -460,7 +464,7 @@ bool OperationGUI_PartitionDlg::execute( ObjectList& objects )
     GEOMBase::GetShape( anObj, aShape, TopAbs_SHAPE );
     TopoDS_Iterator It( aShape, Standard_True, Standard_True );
     int nbSubshapes = 0;
-    for ( ; It.More(); It.Next() )
+    for (; It.More(); It.Next())
       nbSubshapes++;
 
     if ( nbSubshapes )
@@ -470,7 +474,7 @@ bool OperationGUI_PartitionDlg::execute( ObjectList& objects )
                                 QObject::tr( "GEOM_ERROR" ),
                                 QObject::tr( "GEOM_WRN_PARTITION_RESULT_EMPTY" ) );
   }
-  
+
   return res;
 }
 
@@ -492,7 +496,7 @@ void OperationGUI_PartitionDlg::restoreSubShapes( SALOMEDS::Study_ptr   theStudy
 
 //=======================================================================
 //function : ComboTextChanged
-//purpose  : 
+//purpose  :
 //=======================================================================
 void OperationGUI_PartitionDlg::ComboTextChanged()
 {
@@ -508,7 +512,7 @@ void OperationGUI_PartitionDlg::ComboTextChanged()
 
 //=================================================================================
 // function : GetLimit()
-// purpose  : 
+// purpose  :
 //=================================================================================
 int OperationGUI_PartitionDlg::GetLimit() const
 {
index 71e7b76841567b730c73e92d462d9e0365c72948..4f35d0e875fd442ca4120155aa0c42fa4d3acf87 100644 (file)
@@ -68,4 +68,4 @@ libShHealOper_la_LDFLAGS  =   \
        $(CAS_KERNEL)           \
        $(CAS_MATH)             \
        $(CAS_TKTopAlgo)        \
-       $(CAS_LDPATH) -lTKBool -lTKShHealing -lTKLCAF
+       $(CAS_LDPATH) -lTKBool -lTKShHealing -lTKCAF -lTKLCAF