]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
New functions from PAL development
authorvsv <vsv@opencascade.com>
Thu, 25 May 2006 09:01:57 +0000 (09:01 +0000)
committervsv <vsv@opencascade.com>
Thu, 25 May 2006 09:01:57 +0000 (09:01 +0000)
24 files changed:
src/GEOMGUI/GeometryGUI_Swig.cxx
src/GEOMGUI/GeometryGUI_Swig.hxx
src/GEOMGUI/GeometryGUI_Swig.i
src/GEOMImpl/GEOMImpl_Gen.cxx
src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx
src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx
src/GEOMImpl/GEOMImpl_IBasicOperations.cxx
src/GEOMImpl/GEOMImpl_IBasicOperations.hxx
src/GEOMImpl/GEOMImpl_IPipe.hxx
src/GEOMImpl/GEOMImpl_IPlane.hxx
src/GEOMImpl/GEOMImpl_IVector.hxx
src/GEOMImpl/GEOMImpl_PipeDriver.cxx
src/GEOMImpl/GEOMImpl_PlaneDriver.cxx
src/GEOMImpl/GEOMImpl_Types.hxx
src/GEOMImpl/GEOMImpl_VectorDriver.cxx
src/GEOMImpl/GUID.txt
src/GEOMImpl/Makefile.in
src/GEOM_I/GEOM_I3DPrimOperations_i.cc
src/GEOM_I/GEOM_I3DPrimOperations_i.hh
src/GEOM_I/GEOM_IBasicOperations_i.cc
src/GEOM_I/GEOM_IBasicOperations_i.hh
src/GEOM_I_Superv/GEOM_Superv_i.cc
src/GEOM_I_Superv/GEOM_Superv_i.hh
src/GEOM_SWIG/geompy.py

index 4cf10fc97064bcd9b6ce5ea63ed02cead2114ecd..e9e6827355cfde01f4d63b1fa9de75c5d639fc66 100644 (file)
@@ -52,6 +52,7 @@
 #include "GEOM_AISShape.hxx"
 #include "GEOM_AssemblyBuilder.h"
 #include "GEOM_InteractiveObject.hxx"
+#include "GEOM_Displayer.h"
 
 #include "SALOME_Event.hxx"
 
 #include <TopoDS_Shape.hxx>
 #include <AIS_ListOfInteractive.hxx>
 #include <AIS_ListIteratorOfListOfInteractive.hxx>
+#include <AIS_Drawer.hxx>
 
 // IDL Headers
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(GEOM_Gen)
 
+#include <vtkRenderer.h>
+
 using namespace std;
 
 
@@ -174,7 +178,8 @@ void GEOM_Swig::createAndDisplayGO (const char* Entry)
                                         "GEOM",
                                         const_cast<char*>( obj->GetID().c_str()));
 
-         if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app)) {
+         GEOM_Displayer(ActiveStudy).Display(anIO, true);
+         /*if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app)) {
            SVTK_View* aView = aViewWindow->getView();
            int aMode = aView->GetDisplayMode();
 
@@ -196,7 +201,7 @@ void GEOM_Swig::createAndDisplayGO (const char* Entry)
            aSh->setIO(anIO);
            ic->Display(aSh);
            ic->AddOrRemoveCurrentObject(aSh,true);
-         }
+           }*/
          // update object browser
          SalomeApp_Application* app = NULL; //dynamic_cast<SalomeApp_Application*>(app);
          if (app) {
@@ -464,3 +469,136 @@ bool GEOM_Swig::initGeomGen()
 {
   return ProcessEvent(new TInitGeomGenEvent());
 }
+
+
+
+void GEOM_Swig::eraseGO (const char* Entry, bool allWindows)
+{
+  class TEvent: public SALOME_Event
+  {
+    std::string myEntry;
+    bool myFromAllWindows;
+  public:
+    TEvent(const char* theEntry, bool fromAllWindows):
+      myEntry(theEntry), myFromAllWindows(fromAllWindows)
+    {}
+    virtual void Execute()
+    {
+      SUIT_Application* app = SUIT_Session::session()->activeApplication();
+      if (!app) return;
+      SalomeApp_Study* ActiveStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
+      if (!ActiveStudy) return;
+
+      Handle (SALOME_InteractiveObject) aIO = new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", "");
+
+      GEOM_Displayer(ActiveStudy).Erase(aIO, true);
+      /*      if (myFromAllWindows) {
+       QPtrList<SUIT_ViewWindow> aWindows = app->desktop()->windows();
+       SUIT_ViewWindow* aWin = 0;
+       for (aWin = aWindows.first(); aWin; aWin = aWindows.next()) {
+         EraseObject(aWin, aIO);
+       }
+      } else {
+       SUIT_ViewWindow* aWin = app->desktop()->activeWindow();
+       if (aWin)
+         EraseObject(aWin, aIO);
+         }*/
+    }
+
+    /*  private:
+    void EraseObject(SUIT_ViewWindow* theWin, Handle (SALOME_InteractiveObject) theIO)
+    {
+      if (theWin->getViewManager()->getType() == OCCViewer_Viewer::Type()){
+       OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( theWin );
+       if ( vw ) {
+         OCCViewer_ViewManager* vm = dynamic_cast<OCCViewer_ViewManager*>( vw->getViewManager() );
+         if ( vm ) {
+           SOCC_Viewer* aViewer = dynamic_cast<SOCC_Viewer*>(vm->getOCCViewer());
+           if (aViewer) {
+             SALOME_Prs* aPrs = aViewer->CreatePrs(myEntry.c_str());
+             if (aPrs) {
+               SALOME_OCCPrs* aOccPrs =  dynamic_cast<SALOME_OCCPrs*>(aPrs);
+               if (aOccPrs) {
+                 aViewer->Erase(aOccPrs);
+                 aViewer->Repaint();
+               }
+             }
+           }
+         }
+       }
+      } else if (theWin->getViewManager()->getType() == SVTK_Viewer::Type()){
+       SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>( theWin );
+       if (aViewWindow) {
+         aViewWindow->Erase(theIO);
+       }
+      }
+      }*/
+
+  };
+  ProcessVoidEvent(new TEvent(Entry, allWindows));
+}
+
+
+
+void GEOM_Swig::setDeflection(const char* theEntry, float theDeflect)
+{
+  class TEvent: public SALOME_Event {
+    std::string myEntry;
+    float myParam;
+  public:
+    TEvent(const char* theEntryArg, float theParam):
+      myEntry(theEntryArg), myParam(theParam)
+    {}
+    virtual void Execute() {
+      SUIT_Application* anApp = SUIT_Session::session()->activeApplication();
+      if (!anApp) return;
+
+      Handle(SALOME_InteractiveObject) anIO =
+        new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", "");
+
+      if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) {
+       vtkActorCollection* aActors = aViewWindow->getRenderer()->GetActors();
+       aActors->InitTraversal();
+       while (vtkActor* aAct = aActors->GetNextActor()) {
+         if (GEOM_Actor* aGeomActor = dynamic_cast<GEOM_Actor*>(aAct)) {
+           if (aGeomActor->hasIO()) {
+             Handle(SALOME_InteractiveObject) aNextIO = aGeomActor->getIO();
+             if (aNextIO->isSame(anIO)) {
+               aGeomActor->setDeflection(myParam);
+               aViewWindow->Repaint();
+               return;
+             }
+           }
+         }
+       }
+       //      aView->SetTransparency(anIO, myParam);
+       //aView->Repaint();
+      } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) {
+       Handle(AIS_InteractiveContext) aContext = occViewer->getAISContext();
+       AIS_ListOfInteractive aAISList;
+       aContext->DisplayedObjects(aAISList);
+       AIS_ListIteratorOfListOfInteractive it(aAISList);
+       for (; it.More(); it.Next()) {
+         Handle(SALOME_InteractiveObject) aObj = 
+           Handle(SALOME_InteractiveObject)::DownCast(it.Value()->GetOwner());
+         if ((!aObj.IsNull()) && aObj->hasEntry() && aObj->isSame(anIO)) {
+           Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(it.Value());
+           if (!aShape.IsNull()) {
+             Handle(AIS_Drawer) aDrawer = aShape->Attributes();
+             if (aDrawer.IsNull())
+               aDrawer = new AIS_Drawer();
+             aDrawer->SetDeviationCoefficient(myParam);
+             aShape->SetAttributes(aDrawer);
+             aContext->Redisplay(aShape, true, true);
+             aContext->UpdateCurrentViewer();
+             return;
+           }
+         }
+       }
+      }
+    }
+  };
+
+  ProcessVoidEvent(new TEvent (theEntry, theDeflect));
+}
+
index e519ecad0da3fd8a92fef8699cf3657d46ed8d7e..fa835c93c1390d5e11fea51d1e0bb065629f3213 100644 (file)
@@ -50,10 +50,12 @@ public:
   ~GEOM_Swig();
 
   void createAndDisplayGO(const char* Entry);
+  void eraseGO(const char* Entry, bool allWindows);
   void createAndDisplayFitAllGO(const char* Entry);
   void setDisplayMode(const char* Entry, int mode);
   void setColor(const char* Entry, int red, int green, int blue);
   void setTransparency(const char* Entry, float transp);
+  void setDeflection(const char* Entry, float deflect);
 
   int  getIndexTopology(const char *SubEntry, const char *Entry);
   const char* getShapeTypeString(const char *Entry);
index 460e666c44bb765df072edf372e782c9768f968b..69f28e72521337791e9117938dc7eeb0316a1682 100644 (file)
@@ -37,6 +37,7 @@ class GEOM_Swig
   ~GEOM_Swig();
 
   void createAndDisplayGO(const char* Entry);
+  void eraseGO(const char* Entry, bool allWindows);
   void createAndDisplayFitAllGO(const char* Entry);
   int  getIndexTopology(const char *SubEntry, const char *Entry);
   const char* getShapeTypeString(const char *Entry);
@@ -44,6 +45,7 @@ class GEOM_Swig
   void setDisplayMode(const char* Entry, int mode);
   void setColor(const char* Entry, int red, int green, int blue);
   void setTransparency(const char* Entry, float transp);
+  void setDeflection(const char* Entry, float deflect);
   const char* getShapeTypeIcon(const char *Ior);
   
   bool initGeomGen();
index 74ebd75c38358df73768394138af0a556a42ec86..28d385de55d28a4ece56d8b07174025ebf238d11 100644 (file)
@@ -48,6 +48,7 @@
 #include <GEOMImpl_CylinderDriver.hxx>
 #include <GEOMImpl_PrismDriver.hxx>
 #include <GEOMImpl_PipeDriver.hxx>
+#include <GEOMImpl_ThruSectionsDriver.hxx>
 #include <GEOMImpl_RevolutionDriver.hxx>
 #include <GEOMImpl_ShapeDriver.hxx>
 #include <GEOMImpl_BlockDriver.hxx>
@@ -104,6 +105,7 @@ GEOMImpl_Gen::GEOMImpl_Gen()
    TFunction_DriverTable::Get()->AddDriver(GEOMImpl_CylinderDriver::GetID(), new GEOMImpl_CylinderDriver());
    TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PrismDriver::GetID(), new GEOMImpl_PrismDriver());
    TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PipeDriver::GetID(), new GEOMImpl_PipeDriver());
+   TFunction_DriverTable::Get()->AddDriver(GEOMImpl_ThruSectionsDriver::GetID(), new GEOMImpl_ThruSectionsDriver());
    TFunction_DriverTable::Get()->AddDriver(GEOMImpl_RevolutionDriver::GetID(), new GEOMImpl_RevolutionDriver());
    TFunction_DriverTable::Get()->AddDriver(GEOMImpl_SphereDriver::GetID(), new GEOMImpl_SphereDriver());
    TFunction_DriverTable::Get()->AddDriver(GEOMImpl_TorusDriver::GetID(), new GEOMImpl_TorusDriver());
index 266e4de2659348a5619c1e76ac6c28868669ba1c..d61feca832f6470a262763245391a506b408a745 100644 (file)
@@ -45,6 +45,7 @@
 #include <GEOMImpl_RevolutionDriver.hxx>
 #include <GEOMImpl_ShapeDriver.hxx>
 #include <GEOMImpl_FillingDriver.hxx>
+#include <GEOMImpl_ThruSectionsDriver.hxx>
 
 #include <GEOMImpl_IBox.hxx>
 #include <GEOMImpl_ICylinder.hxx>
@@ -56,6 +57,8 @@
 #include <GEOMImpl_IRevolution.hxx>
 #include <GEOMImpl_IShapes.hxx>
 #include <GEOMImpl_IFilling.hxx>
+#include <GEOMImpl_IThruSections.hxx>
+#include <GEOMImpl_IPipeDiffSect.hxx>
 
 #include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
 
@@ -933,3 +936,242 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFilling
   SetErrorCode(OK);
   return aFilling;
 }
+
+//=============================================================================
+/*!
+ *  MakeThruSections
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThruSections(
+                                               const Handle(TColStd_HSequenceOfTransient)& theSeqSections,
+                                               bool theModeSolid,
+                                               double thePreci,
+                                               bool theRuled)
+{
+  Handle(GEOM_Object) anObj;
+  SetErrorCode(KO);
+  if(theSeqSections.IsNull())
+    return anObj;
+
+  Standard_Integer nbObj = theSeqSections->Length();
+  if (!nbObj) 
+    return anObj;
+
+  //Add a new ThruSections object
+  Handle(GEOM_Object) aThruSect = GetEngine()->AddObject(GetDocID(), GEOM_THRUSECTIONS);
+
+  //Add a new ThruSections function
+
+  int aTypeFunc = (theRuled ? THRUSECTIONS_RULED : THRUSECTIONS_SMOOTHED);
+  Handle(GEOM_Function) aFunction =
+    aThruSect->AddFunction(GEOMImpl_ThruSectionsDriver::GetID(), aTypeFunc);
+  if (aFunction.IsNull()) return anObj;
+
+  //Check if the function is set correctly
+  if (aFunction->GetDriverGUID() != GEOMImpl_ThruSectionsDriver::GetID()) return NULL;
+
+  GEOMImpl_IThruSections aCI (aFunction);
+
+  Handle(TColStd_HSequenceOfTransient) aSeqSections = new TColStd_HSequenceOfTransient;
+
+  Standard_Integer i =1;
+  for( ; i <= nbObj; i++) {
+
+    Handle(Standard_Transient) anItem = theSeqSections->Value(i);
+    if(anItem.IsNull())
+      continue;
+    
+    Handle(GEOM_Object) aSectObj = Handle(GEOM_Object)::DownCast(anItem);
+    if(!aSectObj.IsNull())
+    {
+      Handle(GEOM_Function) aRefSect = aSectObj->GetLastFunction();
+      if(!aRefSect.IsNull())
+        aSeqSections->Append(aRefSect);
+    }
+  }
+
+  if(!aSeqSections->Length())
+    return anObj;
+
+  aCI.SetSections(aSeqSections);
+  aCI.SetSolidMode(theModeSolid);
+  aCI.SetPrecision(thePreci);
+
+  //Compute the ThruSections value
+  try {
+    if (!GetSolver()->ComputeFunction(aFunction)) {
+      SetErrorCode("ThruSections driver failed");
+      return anObj;
+    }
+  }
+  catch (Standard_Failure) {
+    Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+    SetErrorCode(aFail->GetMessageString());
+    return anObj;
+  }
+
+  //Make a Python command
+  GEOM::TPythonDump pyDump(aFunction);
+  pyDump << aThruSect << " = geompy.MakeThruSections([";
+
+  for(i =1 ; i <= nbObj; i++) {
+
+    Handle(Standard_Transient) anItem = theSeqSections->Value(i);
+    if(anItem.IsNull())
+      continue;
+    
+    Handle(GEOM_Object) aSectObj = Handle(GEOM_Object)::DownCast(anItem);
+    if(!aSectObj.IsNull()) {
+      pyDump<< aSectObj;
+      if(i < nbObj)
+       pyDump<<", ";
+    }
+  }
+  
+  pyDump<< "],"<<theModeSolid << "," << thePreci <<","<< theRuled <<")";
+
+  SetErrorCode(OK);
+  return aThruSect;
+  
+   
+}
+
+//=============================================================================
+/*!
+ *  MakePipeWithDifferentSections
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections(
+                                               const Handle(TColStd_HSequenceOfTransient)& theBases,
+                                               const Handle(TColStd_HSequenceOfTransient)& theLocations,
+                                               const Handle(GEOM_Object)& thePath,
+                                               bool theWithContact,
+                                                bool theWithCorrections)
+{
+  Handle(GEOM_Object) anObj;
+  SetErrorCode(KO);
+  if(theBases.IsNull())
+    return anObj;
+
+  Standard_Integer nbBases = theBases->Length();
+  
+  if (!nbBases)
+    return anObj;
+  
+  Standard_Integer nbLocs =  (theLocations.IsNull() ? 0 :theLocations->Length());
+  //Add a new Pipe object
+  Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GetDocID(), GEOM_PIPE);
+  //Add a new Pipe function
+
+  Handle(GEOM_Function) aFunction =
+    aPipeDS->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_DIFFERENT_SECTIONS);
+  if (aFunction.IsNull()) return anObj;
+
+  //Check if the function is set correctly
+  if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return anObj;
+
+  GEOMImpl_IPipeDiffSect aCI (aFunction);
+
+  Handle(GEOM_Function) aRefPath = thePath->GetLastFunction();
+  if(aRefPath.IsNull())
+    return anObj;
+
+  Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient;
+  Handle(TColStd_HSequenceOfTransient) aSeqLocs = new TColStd_HSequenceOfTransient;
+
+  Standard_Integer i =1;
+  for( ; i <= nbBases; i++) {
+
+    Handle(Standard_Transient) anItem = theBases->Value(i);
+    if(anItem.IsNull())
+      continue;
+    
+    Handle(GEOM_Object) aBase = Handle(GEOM_Object)::DownCast(anItem);
+    if(aBase.IsNull())
+      continue;
+    Handle(GEOM_Function) aRefBase = aBase->GetLastFunction();
+    if(aRefBase.IsNull())
+      continue;
+    if(nbLocs)
+    {
+      Handle(Standard_Transient) anItemLoc = theLocations->Value(i);
+      if(anItemLoc.IsNull())
+       continue;
+    
+      Handle(GEOM_Object) aLoc = Handle(GEOM_Object)::DownCast(anItemLoc);
+      if(aLoc.IsNull())
+       continue;
+      Handle(GEOM_Function) aRefLoc = aLoc->GetLastFunction();
+      if(aRefLoc.IsNull())
+       continue;
+      aSeqLocs->Append(aRefLoc);
+    }
+    aSeqBases->Append(aRefBase);
+  }
+
+  if(!aSeqBases->Length())
+    return anObj;
+
+  aCI.SetBases(aSeqBases);
+  aCI.SetLocations(aSeqLocs);
+  aCI.SetPath(aRefPath);
+  aCI.SetWithContactMode(theWithContact);
+  aCI.SetWithCorrectionMode(theWithCorrections);
+  
+  //Compute the Pipe value
+  try {
+    if (!GetSolver()->ComputeFunction(aFunction)) {
+      SetErrorCode("Pipe with defferent section driver failed");
+      return anObj;
+    }
+  }
+  catch (Standard_Failure) {
+    Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+    SetErrorCode(aFail->GetMessageString());
+    return anObj;
+  }
+
+  //Make a Python command
+  GEOM::TPythonDump pyDump(aFunction);
+  pyDump << aPipeDS << " = geompy.MakePipeWithDifferentSections([";
+
+  for(i =1 ; i <= nbBases; i++) {
+
+    Handle(Standard_Transient) anItem = theBases->Value(i);
+    if(anItem.IsNull())
+      continue;
+    
+    Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem);
+    if(!anObj.IsNull()) {
+      pyDump<< anObj;
+      if(i < nbBases)
+       pyDump<<", ";
+    }
+    
+  }
+  
+  pyDump<< "], [";
+   
+  for(i =1 ; i <= nbLocs; i++) {
+
+    Handle(Standard_Transient) anItem = theLocations->Value(i);
+    if(anItem.IsNull())
+      continue;
+    
+    Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem);
+    if(!anObj.IsNull()) {
+      pyDump<< anObj;
+      if(i < nbLocs)
+       pyDump<<", ";
+    }
+  }  
+
+  pyDump<< "], "<<thePath<<","<<theWithContact << "," << theWithCorrections<<")";
+
+  SetErrorCode(OK);
+  return aPipeDS;
+  
+   
+}
index 2e3a5177b65277050a9af7527573198b3a598e7c..f23329e4965da16b4cd05a3bad6c41556aeed4c3 100644 (file)
@@ -26,6 +26,7 @@
 #include "GEOM_Engine.hxx"
 #include "GEOM_Object.hxx"
 #include <TDocStd_Document.hxx>
+#include <TColStd_HSequenceOfTransient.hxx>
 
 class GEOMImpl_I3DPrimOperations : public GEOM_IOperations {
  public:
@@ -73,6 +74,17 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations {
 
   Standard_EXPORT Handle(GEOM_Object) MakeFilling (Handle(GEOM_Object) theShape, int theMinDeg, int theMaxDeg, double theTol2D, double theTol3D, int theNbIter);
 
+  Standard_EXPORT Handle(GEOM_Object) MakeThruSections(const Handle(TColStd_HSequenceOfTransient)& theSeqSections,
+                                                      bool theModeSolid,
+                                                      double thePreci,
+                                                       bool theRuled);
+
+  Standard_EXPORT Handle(GEOM_Object) MakePipeWithDifferentSections(
+                                                 const Handle(TColStd_HSequenceOfTransient)& theBases,
+                                                 const Handle(TColStd_HSequenceOfTransient)& theLocations,
+                                                 const Handle(GEOM_Object)& thePath,
+                                                 bool theWithContact,
+                                                  bool theWithCorrections);
 };
 
 #endif
index 9a7ba439c387645d142b02d2581fad04fd0b2d2a..0ea2c9f0909a97ab12eb65580b10d1c4f55af291 100644 (file)
@@ -221,6 +221,55 @@ Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakePointOnCurve
   return aPoint;
 }
 
+//=============================================================================
+/*!
+ *  MakeTangentOnCurve
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakeTangentOnCurve
+                            (const Handle(GEOM_Object)& theCurve, double theParameter)
+{
+  SetErrorCode(KO);
+
+  if (theCurve.IsNull()) return NULL;
+
+  //Add a new Vector object
+  Handle(GEOM_Object) aVec = GetEngine()->AddObject(GetDocID(), GEOM_VECTOR);
+
+  //Add a new Point function for creation a point relativley another point
+  Handle(GEOM_Function) aFunction = aVec->AddFunction(GEOMImpl_VectorDriver::GetID(), VECTOR_TANGENT_CURVE_PAR);
+
+  //Check if the function is set correctly
+  if (aFunction->GetDriverGUID() != GEOMImpl_VectorDriver::GetID()) return NULL;
+
+  GEOMImpl_IVector aVI (aFunction);
+
+  Handle(GEOM_Function) aRefFunction = theCurve->GetLastFunction();
+  if (aRefFunction.IsNull()) return NULL;
+
+  aVI.SetCurve(aRefFunction);
+  aVI.SetParameter(theParameter);
+
+  //Compute the vector value
+  try {
+    if (!GetSolver()->ComputeFunction(aFunction)) {
+      SetErrorCode("Vector driver failed");
+      return NULL;
+    }
+  }
+  catch (Standard_Failure) {
+    Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+    SetErrorCode(aFail->GetMessageString());
+    return NULL;
+  }
+
+  //Make a Python command
+  GEOM::TPythonDump(aFunction) << aVec << " = geompy.MakeTangentOnCurve("
+                               << theCurve << ", " << theParameter << ")";
+
+  SetErrorCode(OK);
+  return aVec;
+}
 
 //=============================================================================
 /*!
@@ -641,3 +690,61 @@ Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakeMarker
   SetErrorCode(OK);
   return aMarker;
 }
+
+//=============================================================================
+/*!
+ *  MakeTangentPlaneOnFace
+ */
+//=============================================================================
+
+Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakeTangentPlaneOnFace(const Handle(GEOM_Object)& theFace,
+                                                                     double theParamU,
+                                                                     double theParamV,
+                                                                     double theSize)
+{
+   SetErrorCode(KO);
+
+  if (theFace.IsNull()) return NULL;
+
+  //Add a new Plane object
+  Handle(GEOM_Object) aPlane = GetEngine()->AddObject(GetDocID(), GEOM_PLANE);
+
+  //Add a new Plane function
+  Handle(GEOM_Function) aFunction =
+    aPlane->AddFunction(GEOMImpl_PlaneDriver::GetID(), PLANE_TANGENT_FACE);
+
+  //Check if the function is set correctly
+  if (aFunction->GetDriverGUID() != GEOMImpl_PlaneDriver::GetID()) return NULL;
+
+  GEOMImpl_IPlane aPI (aFunction);
+
+  Handle(GEOM_Function) aRef = theFace->GetLastFunction();
+  if (aRef.IsNull()) return NULL;
+
+  aPI.SetFace(aRef);
+  aPI.SetSize(theSize);
+  aPI.SetParameterU(theParamU);
+  aPI.SetParameterV(theParamV);
+
+  //Compute the Plane value
+  try {
+    if (!GetSolver()->ComputeFunction(aFunction)) {
+      SetErrorCode("Plane driver failed");
+      return NULL;
+    }
+  }
+  catch (Standard_Failure) {
+    Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+    SetErrorCode(aFail->GetMessageString());
+    return NULL;
+  }
+
+  //Make a Python command
+  GEOM::TPythonDump(aFunction) << aPlane << " = geompy.MakeTangentPlaneOnFace("
+                               << theFace << ", " <<theParamU <<", "<<theParamV <<", "<< theSize << ")";
+
+  SetErrorCode(OK);
+  return aPlane;
+}
+
+
index 7106f4cd98da2d25946427e81b2263b57eb4a921..2ce9377ad6067ec08b59c5c8fa61b10d38ba5951 100644 (file)
@@ -47,6 +47,9 @@ class GEOMImpl_IBasicOperations : public GEOM_IOperations {
   Standard_EXPORT Handle(GEOM_Object) MakeVectorTwoPnt (Handle(GEOM_Object) thePnt1,
                                         Handle(GEOM_Object) thePnt2);
 
+  Standard_EXPORT Handle(GEOM_Object) MakeTangentOnCurve(const Handle(GEOM_Object)& theCurve, 
+                                                        double theParameter);
+
   // Line
   Standard_EXPORT Handle(GEOM_Object) MakeLineTwoPnt (Handle(GEOM_Object) thePnt1,
                                       Handle(GEOM_Object) thePnt2);
@@ -70,6 +73,12 @@ class GEOMImpl_IBasicOperations : public GEOM_IOperations {
   Standard_EXPORT Handle(GEOM_Object) MakeMarker (double theOX,  double theOY,  double theOZ,
                                   double theXDX, double theXDY, double theXDZ,
                                   double theYDX, double theYDY, double theYDZ);
+
+  Standard_EXPORT Handle(GEOM_Object) MakeTangentPlaneOnFace(const Handle(GEOM_Object)& theFace,
+                                                            double theParamU,
+                                                            double theParamV,
+                                                            double theSize);
+
 };
 
 #endif
index 5ed0050b9bec22fe0dd5dc985426a2b72ede54fe..7362492d4e2e48447ee45e5024cc537eb9605ef6 100644 (file)
@@ -19,6 +19,8 @@
 //
 //NOTE: This is an intreface to a function for the Pipe creation.
 
+#ifndef _GEOMImpl_IPIPE_HXX_
+#define _GEOMImpl_IPIPE_HXX_
 
 #include "GEOM_Function.hxx"
 
@@ -37,7 +39,9 @@ class GEOMImpl_IPipe
   Handle(GEOM_Function) GetBase() { return _func->GetReference(PIPE_ARG_BASE); }
   Handle(GEOM_Function) GetPath() { return _func->GetReference(PIPE_ARG_PATH); }
 
- private:
+ protected:
 
   Handle(GEOM_Function) _func;
 };
+
+#endif
index 5129d6a9da8d0d79f5181c7b5ff6ec7e0b7296dc..d7c75d2f9d6ec0e6400e5b828af1f2165e54e2e7 100644 (file)
 
 #define PLN_ARG_REF 6
 
+#define PLN_ARG_PARAM_U 7
+
+#define PLN_ARG_PARAM_V 8
+
 class GEOMImpl_IPlane
 {
  public:
@@ -59,6 +63,12 @@ class GEOMImpl_IPlane
   Handle(GEOM_Function) GetPoint1() { return _func->GetReference(PLN_ARG_PNT1); }
   Handle(GEOM_Function) GetPoint2() { return _func->GetReference(PLN_ARG_PNT2); }
   Handle(GEOM_Function) GetPoint3() { return _func->GetReference(PLN_ARG_PNT3); }
+  
+  void SetParameterU(double theParamU) { _func->SetReal(PLN_ARG_PARAM_U, theParamU); }
+  double GetParameterU() { return _func->GetReal(PLN_ARG_PARAM_U); }
+
+  void SetParameterV(double theParamV) { _func->SetReal(PLN_ARG_PARAM_V, theParamV); }
+  double GetParameterV() { return _func->GetReal(PLN_ARG_PARAM_V); }
 
  private:
 
index 2214d7dfab753c52a82ef1dba9ef1b37e6d5dbfb..b83636731fc3afd9f34692be1f485ff0619b8412 100644 (file)
 #define VEC_ARG_PNT1 4
 #define VEC_ARG_PNT2 5
 
+#define VEC_ARG_CURVE 6
+#define VEC_ARG_PARAM 7
+
+
 class GEOMImpl_IVector
 {
  public:
@@ -49,6 +53,14 @@ class GEOMImpl_IVector
   Handle(GEOM_Function) GetPoint1() { return _func->GetReference(VEC_ARG_PNT1); }
   Handle(GEOM_Function) GetPoint2() { return _func->GetReference(VEC_ARG_PNT2); }
 
+  void SetCurve(Handle(GEOM_Function) theRef) { _func->SetReference(VEC_ARG_CURVE, theRef); }
+
+  Handle(GEOM_Function) GetCurve() { return _func->GetReference(VEC_ARG_CURVE); }
+
+  void SetParameter(double theParam) { _func->SetReal(VEC_ARG_PARAM, theParam); }
+
+  double GetParameter() { return _func->GetReal(VEC_ARG_PARAM); }
+
  private:
 
   Handle(GEOM_Function) _func;
index 7ab58441532c45808aab99637705108d9c8cb704..84d0237048bb0d2eb084e5c0f4a0dd370d24a315 100644 (file)
 #include <TopoDS_Wire.hxx>
 #include <TopoDS_Edge.hxx>
 #include <TopoDS_Shape.hxx>
+#include <BRepOffsetAPI_MakePipeShell.hxx>
+#include <TColStd_HSequenceOfTransient.hxx>
+#include <GEOMImpl_IPipeDiffSect.hxx>
 
 #include <Standard_NullObject.hxx>
 #include <Standard_TypeMismatch.hxx>
 #include <Standard_ConstructionError.hxx>
+#include "utilities.h"
+#include <TopExp_Explorer.hxx>
+#include <TopTools_SequenceOfShape.hxx>
+#include <BRep_Builder.hxx>
+#include <TopoDS_Compound.hxx>
 
 //=======================================================================
 //function : GetID
@@ -67,51 +75,195 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const
 {
   if (Label().IsNull()) return 0;
   Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label());
-
-  GEOMImpl_IPipe aCI (aFunction);
+  GEOMImpl_IPipe* aCI= 0;
   Standard_Integer aType = aFunction->GetType();
+  if(aType == PIPE_BASE_PATH)
+    aCI = new GEOMImpl_IPipe(aFunction);
+  else if(aType == PIPE_DIFFERENT_SECTIONS)
+    aCI = new GEOMImpl_IPipeDiffSect(aFunction);
+  else
+    return 0;
 
-  TopoDS_Shape aShape;
+  Handle(GEOM_Function) aRefPath = aCI->GetPath();
+  TopoDS_Shape aShapePath = aRefPath->GetValue();
 
-  if (aType == PIPE_BASE_PATH) {
-    Handle(GEOM_Function) aRefBase = aCI.GetBase();
-    Handle(GEOM_Function) aRefPath = aCI.GetPath();
-    TopoDS_Shape aShapeBase = aRefBase->GetValue();
-    TopoDS_Shape aShapePath = aRefPath->GetValue();
-    if (aShapeBase.IsNull() || aShapePath.IsNull()) {
-      Standard_NullObject::Raise("MakePipe aborted : null shape argument");
-    }
 
-    // Get path contour
-    TopoDS_Wire aWire;
-    if (aShapePath.ShapeType() == TopAbs_WIRE) {
-      aWire = TopoDS::Wire(aShapePath);
-    } else {
-      if (aShapePath.ShapeType() == TopAbs_EDGE) {
+  if (aShapePath.IsNull())
+  {
+    cout<<"Driver : path is null"<<endl;
+    if(aCI) delete aCI;
+    Standard_NullObject::Raise("MakePipe aborted : null path argument");
+  }
+  
+  // Get path contour
+  TopoDS_Wire aWirePath;
+  if (aShapePath.ShapeType() == TopAbs_WIRE) {
+    aWirePath = TopoDS::Wire(aShapePath);
+  } 
+  else {
+    if (aShapePath.ShapeType() == TopAbs_EDGE) {
+         
         TopoDS_Edge anEdge = TopoDS::Edge(aShapePath);
-        aWire = BRepBuilderAPI_MakeWire(anEdge);
-      } else {
-        Standard_TypeMismatch::Raise("MakePipe aborted : path shape is neither a wire nor an edge");
-      }
+        aWirePath = BRepBuilderAPI_MakeWire(anEdge);
+    } 
+    else {
+      if(aCI) delete aCI;
+      Standard_TypeMismatch::Raise("MakePipe aborted : path shape is neither a wire nor an edge");
+    } 
+  }
+  
+  TopoDS_Shape aShape;
+
+  if (aType == PIPE_BASE_PATH) 
+  {
+     
+    Handle(GEOM_Function) aRefBase = aCI->GetBase();
+   
+    TopoDS_Shape aShapeBase = aRefBase->GetValue();
+    
+    if (aShapeBase.IsNull()) {
+      if(aCI) delete aCI;
+      Standard_NullObject::Raise("MakePipe aborted : null base argument");
     }
 
     // Make pipe
-    aShape = BRepOffsetAPI_MakePipe(aWire, aShapeBase);
-  }
-  else {
+    aShape = BRepOffsetAPI_MakePipe(aWirePath, aShapeBase);
   }
 
+  //building pipe with different sections
+  else if (aType == PIPE_DIFFERENT_SECTIONS) 
+  {
+    GEOMImpl_IPipeDiffSect* aCIDS = (GEOMImpl_IPipeDiffSect*)aCI;
+    //GEOMImpl_IPipeDiffSect* aCIDS = static_cast<GEOMImpl_IPipeDiffSect*>(aCI);
+    BRepOffsetAPI_MakePipeShell aBuilder(aWirePath);
+    Handle(TColStd_HSequenceOfTransient) aBasesObjs = aCIDS->GetBases ();
+    Handle(TColStd_HSequenceOfTransient) aLocObjs = aCIDS->GetLocations ();
+    Standard_Boolean aWithContact = (aCIDS->GetWithContactMode());
+    Standard_Boolean aWithCorrect = (aCIDS->GetWithCorrectionMode());
+
+    Standard_Integer i =1, nbBases = aBasesObjs->Length(), 
+      nbLocs = (aLocObjs.IsNull() ? 0 :aLocObjs->Length());
+    
+    if(nbLocs && nbLocs != nbBases)
+    {
+      if(aCI) delete aCI;
+      Standard_ConstructionError::Raise("Number of sections is not equal to number of locations ");
+    }
+    TopTools_SequenceOfShape aSeqBases;
+    TopTools_SequenceOfShape aSeqLocs;
+    TopTools_SequenceOfShape aSeqFaces;
+    for( ; i <= nbBases; i++) 
+    {
+      Handle(Standard_Transient) anItem = aBasesObjs->Value(i);
+      if(anItem.IsNull())
+       continue;
+      Handle(GEOM_Function) aRefBase = Handle(GEOM_Function)::DownCast(anItem);
+      if(aRefBase.IsNull())
+       continue;
+      TopoDS_Shape aShapeBase = aRefBase->GetValue();
+      if(aShapeBase.IsNull())
+       continue;
+      TopAbs_ShapeEnum aTypeBase = aShapeBase.ShapeType();
+
+      //if for section was specified face with a few wires then a few
+      //    pipes were build and make solid 
+      if(aTypeBase == TopAbs_FACE)
+      {
+       //for case one path should be used other type function
+        aSeqFaces.Append(aShapeBase);
+        TopExp_Explorer aExpW(aShapeBase,TopAbs_WIRE);
+       for( ; aExpW.More(); aExpW.Next())
+       {
+         TopoDS_Shape aWireProf = aExpW.Current();
+         aSeqBases.Append(aWireProf);
+       }
+      }
+      else if(aTypeBase == TopAbs_WIRE || aTypeBase == TopAbs_VERTEX) 
+        aSeqBases.Append(aShapeBase);
+      else if(aTypeBase == TopAbs_EDGE)
+      {
+        TopoDS_Edge anEdge = TopoDS::Edge(aShapeBase);
+       TopoDS_Shape aWireProf = BRepBuilderAPI_MakeWire(anEdge);
+       aSeqBases.Append(aWireProf);
+      }
+      if(nbLocs) 
+      {
+        Handle(Standard_Transient) anItemLoc = aLocObjs->Value(i);
+       if(anItemLoc.IsNull())
+         continue;
+       Handle(GEOM_Function) aRefLoc = Handle(GEOM_Function)::DownCast(anItemLoc);
+        TopoDS_Shape aShapeLoc = aRefLoc->GetValue();
+       if(aShapeLoc.IsNull() || aShapeLoc.ShapeType() != TopAbs_VERTEX)
+         continue;
+       aSeqLocs.Append(aShapeLoc);
+      }
+    }
+    
+    nbLocs = aSeqLocs.Length();
+    Standard_Integer nbShapes = aSeqBases.Length();
+    Standard_Integer step = nbShapes/nbBases;
+    
+    if(nbShapes < nbBases || fmod(nbShapes,nbBases))
+    {
+      if(aCI) delete aCI;
+      Standard_ConstructionError::Raise("Invalid sections were specified for building pipe");
+    }
+     
+    Standard_Integer ind =0;    
+    for( i=1; i  <= nbShapes && ind < nbShapes; i++) //i+nbBases <= nbShapes
+    {
+      TopTools_SequenceOfShape usedBases;
+      Standard_Integer j = 1;
+      for( ; j <= nbBases ; j++) 
+      {
+       ind = i + (j-1)*step;
+       
+        TopoDS_Shape aWireProf = aSeqBases.Value(ind);
+        usedBases.Append(aWireProf);
+        if(nbLocs) 
+        {
+          TopoDS_Shape aShapeLoc = aSeqLocs.Value(j);
+           TopoDS_Vertex aVert = TopoDS::Vertex(aShapeLoc);
+           aBuilder.Add(aWireProf,aVert,aWithContact,aWithCorrect);
+        }
+        else
+           aBuilder.Add(aWireProf,aWithContact,aWithCorrect);
+      }
+      if(!aBuilder.IsReady())
+      {
+       if(aCI) delete aCI;
+        Standard_ConstructionError::Raise("Invalid input data for building PIPE: bases are invalid");
+      }
+      aBuilder.Build();
+      aShape = aBuilder.Shape();
+      aSeqFaces.Append(aShape);        
+      for( j = 1; j <=usedBases.Length(); j++)
+        aBuilder.Delete(usedBases.Value(j));
+    }
+       
+    //for case if section is face 
+    if(aSeqFaces.Length() >1)
+    {
+      BRep_Builder aB;
+      TopoDS_Compound aComp;
+      aB.MakeCompound(aComp);
+      for( i = 1; i <= aSeqFaces.Length(); i++)
+        aB.Add(aComp,aSeqFaces.Value(i));
+      aShape = aComp;
+    }
+  }
   if (aShape.IsNull()) return 0;
 
   BRepCheck_Analyzer ana (aShape, Standard_False);
   if (!ana.IsValid()) {
+    if(aCI) delete aCI;
     Standard_ConstructionError::Raise("Algorithm have produced an invalid shape result");
   }
 
   aFunction->SetValue(aShape);
 
   log.SetTouched(Label());
-
+  if(aCI) delete aCI;
   return 1;
 }
 
index 8941ba280deddaed8e52ac62c12b7396d471cf29..dd09d2941a8b1632a05872280483e2be5e8cc219 100644 (file)
@@ -27,6 +27,8 @@
 
 #include <BRepBuilderAPI_MakeFace.hxx>
 #include <BRep_Tool.hxx>
+#include <BRepTopAdaptor_FClass2d.hxx>
+#include <ShapeAnalysis.hxx>
 
 #include <TopAbs.hxx>
 #include <TopoDS.hxx>
@@ -42,6 +44,8 @@
 #include <gp_Pnt.hxx>
 #include <gp_Pln.hxx>
 #include <gp_Vec.hxx>
+#include <gp_Dir.hxx>
+#include <gp_Ax3.hxx>
 
 #include <Standard_ConstructionError.hxx>
 #include <Standard_TypeMismatch.hxx>
@@ -126,7 +130,45 @@ Standard_Integer GEOMImpl_PlaneDriver::Execute(TFunction_Logbook& log) const
       Standard_TypeMismatch::Raise("Plane creation aborted: non-planar face given as argument");
     }
     aShape = BRepBuilderAPI_MakeFace(aGS, -aSize, +aSize, -aSize, +aSize).Shape();
-  } else {
+  } 
+  else if (aType == PLANE_TANGENT_FACE)
+  {
+    Handle(GEOM_Function) aRefFace = aPI.GetFace();
+    TopoDS_Shape aShape1 = aRefFace->GetValue();
+    if(aShape1.IsNull())
+      Standard_TypeMismatch::Raise("Plane was not created.Basis face was not specified");
+    TopoDS_Face aFace = TopoDS::Face(aShape1);
+    
+    Standard_Real aKoefU = aPI.GetParameterU();
+    Standard_Real aKoefV = aPI.GetParameterV();
+    Standard_Real aUmin,aUmax,aVmin,aVmax;
+    ShapeAnalysis::GetFaceUVBounds(aFace,aUmin,aUmax,aVmin,aVmax);
+    Standard_Real aDeltaU = aUmax - aUmin;
+    Standard_Real aDeltaV = aVmax - aVmin;
+    Standard_Real aParamU =  aUmin + aDeltaU*aKoefU;
+    Standard_Real aParamV =  aVmin + aDeltaV*aKoefV;
+    Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace);
+    if(aSurf.IsNull())
+      Standard_TypeMismatch::Raise("Plane was not created.Base surface is absent");
+    gp_Vec aVecU,aVecV;
+    gp_Pnt aPLoc;
+    aSurf->D1(aParamU,aParamV,aPLoc,aVecU,aVecV);
+    BRepTopAdaptor_FClass2d clas(aFace,Precision::PConfusion());
+    
+    TopAbs_State stOut= clas.PerformInfinitePoint();
+    gp_Pnt2d aP2d(aParamU,aParamV);
+    TopAbs_State st= clas.Perform(aP2d);
+    if(st == stOut)
+      Standard_TypeMismatch::Raise("Plane was not created.Point lies outside the face");
+    gp_Vec aNorm = aVecU^aVecV;
+    gp_Ax3 anAxis(aPLoc,gp_Dir(aNorm),gp_Dir(aVecU));
+    gp_Pln aPlane(anAxis);
+    BRepBuilderAPI_MakeFace aTool(aPlane, -aSize, +aSize, -aSize, +aSize);
+    if(aTool.IsDone())
+      aShape = aTool.Shape();
+  }
+
+  else {
   }
 
   if (aShape.IsNull()) return 0;
index 392163c0d8e6421a23114fcdce3c0150289498eb..b193798a2f03db15349cf4c76c46b4adc13664f3 100755 (executable)
@@ -79,6 +79,8 @@
 
 #define GEOM_MARKER 39
 
+#define GEOM_THRUSECTIONS 40
+
 //GEOM_Function types
 
 #define COPY_WITH_REF    1
 #define POINT_XYZ       1
 #define POINT_XYZ_REF   2
 #define POINT_CURVE_PAR 3
+//#define POINT_FACE_PAR 4
 
 #define VECTOR_TWO_PNT  1
 #define VECTOR_DX_DY_DZ 2
+#define VECTOR_TANGENT_CURVE_PAR 3
 
 #define PLANE_PNT_VEC   1
 #define PLANE_FACE      2
 #define PLANE_THREE_PNT 3
+#define PLANE_TANGENT_FACE 4
 
 #define LINE_TWO_PNT 1
 #define LINE_PNT_DIR 2
 #define REVOLUTION_BASE_AXIS_ANGLE 1
 
 #define PIPE_BASE_PATH 1
+#define PIPE_DIFFERENT_SECTIONS 2
+
+#define THRUSECTIONS_RULED 1
+#define THRUSECTIONS_SMOOTHED 2
 
 #define BOOLEAN_COMMON  1
 #define BOOLEAN_CUT     2
index 5310775994d9f6c4612cc3cc752b7f4509f447df..cb0b81c2b3f947901fe744859905b3aae95410d4 100644 (file)
@@ -34,6 +34,8 @@
 
 #include <gp_Pnt.hxx>
 #include <Precision.hxx>
+#include <Geom_Curve.hxx>
+#include <gp_Vec.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <Standard_ConstructionError.hxx>
 
@@ -67,7 +69,7 @@ Standard_Integer GEOMImpl_VectorDriver::Execute(TFunction_Logbook& log) const
 
   GEOMImpl_IVector aPI (aFunction);
   Standard_Integer aType = aFunction->GetType();
-  if (aType != VECTOR_DX_DY_DZ && aType != VECTOR_TWO_PNT) return 0;
+  if (aType != VECTOR_DX_DY_DZ && aType != VECTOR_TWO_PNT && aType != VECTOR_TANGENT_CURVE_PAR) return 0;
 
   TopoDS_Shape aShape;
 
@@ -98,7 +100,32 @@ Standard_Integer GEOMImpl_VectorDriver::Execute(TFunction_Logbook& log) const
       Standard_ConstructionError::Raise("The end points are too close");
     }
     aShape = BRepBuilderAPI_MakeEdge(V1, V2).Shape();
-  } else {
+  } 
+  else if(aType == VECTOR_TANGENT_CURVE_PAR) {
+    Handle(GEOM_Function) aRefCurve = aPI.GetCurve();
+    TopoDS_Shape aRefShape = aRefCurve->GetValue();
+    if (aRefShape.ShapeType() != TopAbs_EDGE) {
+      Standard_TypeMismatch::Raise
+        ("Tangent On Curve creation aborted : curve shape is not an edge");
+    }
+    Standard_Real aFParam =0., aLParam =0., aParam =0.;
+    Handle(Geom_Curve) aCurve = BRep_Tool::Curve(TopoDS::Edge(aRefShape), aFParam, aLParam);
+    if(aCurve.IsNull()) {
+      Standard_TypeMismatch::Raise
+        ("Tangent On Curve creation aborted : curve is null");
+    }
+
+    aParam = aFParam + (aLParam - aFParam) * aPI.GetParameter();
+    gp_Pnt aPoint1,aPoint2;
+    gp_Vec aVec;
+    aCurve->D1(aParam,aPoint1,aVec);
+    if(aVec.Magnitude() < gp::Resolution())
+      Standard_TypeMismatch::Raise
+        ("Tangent On Curve creation aborted : invalid value of tangent");
+    aPoint2.SetXYZ(aPoint1.XYZ() + aVec.XYZ());
+    BRepBuilderAPI_MakeEdge aBuilder(aPoint1,aPoint2);
+    if(aBuilder.IsDone())
+      aShape = aBuilder.Shape();
   }
 
   if (aShape.IsNull()) return 0;
index 285d047d6515a8998bdf01972f896307c4966db5..0c03153c7bf6dae6bcdcea7bd9f88ca8a4bb68d3 100755 (executable)
@@ -18,6 +18,7 @@ FF1BBB16-5D14-4df2-980B-3A668264EA16 // Sphere
 FF1BBB17-5D14-4df2-980B-3A668264EA16 // Prism (Extrusion)
 FF1BBB18-5D14-4df2-980B-3A668264EA16 // Revolution
 FF1BBB19-5D14-4df2-980B-3A668264EA16 // Pipe
+FF1BB971-E99C-4f89-B989-5B48E061049B //ThruSections
 
 FF1BBB21-5D14-4df2-980B-3A668264EA16 // Boolean
 FF1BBB22-5D14-4df2-980B-3A668264EA16 // Partition
index 48bfdb040afc8a6c3aa8f59a3e7b4d579bfc3c58..9209e4e5aa218b691fe83a457ec052d3282f77ac 100644 (file)
@@ -59,6 +59,7 @@ LIB_SRC = GEOMImpl_IBasicOperations.cxx \
          GEOMImpl_TorusDriver.cxx \
          GEOMImpl_PrismDriver.cxx \
          GEOMImpl_PipeDriver.cxx \
+         GEOMImpl_ThruSectionsDriver.cxx \
          GEOMImpl_RevolutionDriver.cxx \
          GEOMImpl_ShapeDriver.cxx \
          GEOMImpl_BlockDriver.cxx \
index ac8d8fb6b21183eedee957ac6b78172f94c7b6fb..fbb7e1bf606a74256654b03b7736397f2b6e4a1a 100644 (file)
@@ -484,3 +484,101 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeFilling(GEOM::GEOM_Object_pt
 
   return GetObject(anObject);
 }
+
+//=============================================================================
+/*!
+ *  MakeThruSections
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeThruSections(const GEOM::ListOfGO& theSeqSections,
+                                                                CORBA::Boolean theModeSolid,
+                                                                CORBA::Double thePreci,
+                                                                CORBA::Boolean theRuled)
+{
+   GEOM::GEOM_Object_var aGEOMObject;
+
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+  Handle(TColStd_HSequenceOfTransient) aSeqSections = new TColStd_HSequenceOfTransient;
+  int ind, aLen;
+
+  //Get the shapes
+  aLen = theSeqSections.length();
+  for (ind = 0; ind < aLen; ind++) {
+    if (theSeqSections[ind] == NULL) continue;
+    Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject
+      (theSeqSections[ind]->GetStudyID(), theSeqSections[ind]->GetEntry());
+    if (!aSh.IsNull())
+      aSeqSections->Append(aSh);
+  }
+  if(!aSeqSections->Length())
+    return aGEOMObject._retn();
+
+  // Make shell or solid
+  Handle(GEOM_Object) anObject =
+    GetOperations()->MakeThruSections(aSeqSections,theModeSolid,thePreci,theRuled);
+  if (!GetOperations()->IsDone() || anObject.IsNull())
+    return aGEOMObject._retn();
+
+  return GetObject(anObject);
+}
+
+//=============================================================================
+/*!
+ *  MakePipeWithDifferentSections
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithDifferentSections(const GEOM::ListOfGO& theBases,
+                                                                             const GEOM::ListOfGO& theLocations,
+                                                                             GEOM::GEOM_Object_ptr thePath,
+                                                                             CORBA::Boolean theWithContact,
+                                                                             CORBA::Boolean theWithCorrections)
+{
+   GEOM::GEOM_Object_var aGEOMObject;
+
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+  Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient;
+  Handle(TColStd_HSequenceOfTransient) aSeqLocations = new TColStd_HSequenceOfTransient;
+  int ind=0, aNbBases =0,aNbLocs=0;
+  
+  //Get the shapes
+  aNbBases = theBases.length();
+  aNbLocs = theLocations.length();
+
+  if( aNbLocs &&  aNbBases != aNbLocs)
+    return aGEOMObject._retn();
+  
+   Handle(GEOM_Object) aPath = GetOperations()->GetEngine()->GetObject
+      (thePath->GetStudyID(), thePath->GetEntry());
+   if(aPath.IsNull())
+     return aGEOMObject._retn();
+
+  for (ind = 0; ind < aNbBases; ind++) {
+    if (theBases[ind] == NULL) continue;
+    Handle(GEOM_Object) aBase = GetOperations()->GetEngine()->GetObject(theBases[ind]->GetStudyID(), 
+                       theBases[ind]->GetEntry());
+    if(aBase.IsNull())
+      continue;
+    if(aNbLocs)
+    {
+      Handle(GEOM_Object) aLoc = GetOperations()->GetEngine()->GetObject
+       (theLocations[ind]->GetStudyID(), theLocations[ind]->GetEntry());
+      if(aLoc.IsNull())
+       continue;
+      aSeqLocations->Append(aLoc);
+    }
+    aSeqBases->Append(aBase);
+  }
+  if(!aSeqBases->Length())
+    return aGEOMObject._retn();
+
+  // Make pipe
+  Handle(GEOM_Object) anObject =
+    GetOperations()->MakePipeWithDifferentSections(aSeqBases,aSeqLocations ,aPath,
+                                                  theWithContact,theWithCorrections);
+  if (!GetOperations()->IsDone() || anObject.IsNull())
+    return aGEOMObject._retn();
+
+  return GetObject(anObject);
+}
index acee1fdfc12a91904b0de662c2c8bf15f9291e60..bd44463d481eb0ec1c34fe25afd1e35baa21afb3 100644 (file)
@@ -94,6 +94,17 @@ class GEOM_I3DPrimOperations_i :
 
   GEOM::GEOM_Object_ptr MakeFilling(GEOM::GEOM_Object_ptr theShape, CORBA::Long theMinDeg, CORBA::Long theMaxDeg, CORBA::Double theTol2D, CORBA::Double theTol3D, CORBA::Long theNbIter);
 
+  GEOM::GEOM_Object_ptr MakeThruSections(const GEOM::ListOfGO& theSeqSections,
+                                        CORBA::Boolean theModeSolid,
+                                        CORBA::Double thePreci,
+                                        CORBA::Boolean theRuled);
+  
+  GEOM::GEOM_Object_ptr MakePipeWithDifferentSections(const GEOM::ListOfGO& theBases,
+                                                     const GEOM::ListOfGO& theLocations,
+                                                     GEOM::GEOM_Object_ptr thePath,
+                                                     CORBA::Boolean theWithContact,
+                                                     CORBA::Boolean theWithCorrections);
+
   ::GEOMImpl_I3DPrimOperations* GetOperations()
   { return (::GEOMImpl_I3DPrimOperations*)GetImpl(); }
 };
index b24857da187189aaecab5f261362e172d2fce847..cc5fa043ab7494dc09802b1f005ffbce0c5398ba 100644 (file)
@@ -136,6 +136,37 @@ GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakePointOnCurve
   return GetObject(anObject);
 }
 
+//=============================================================================
+/*!
+ *  MakeTangentOnCurve
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakeTangentOnCurve
+                  (GEOM::GEOM_Object_ptr theCurve,  CORBA::Double theParameter)
+{
+  GEOM::GEOM_Object_var aGEOMObject;
+
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  if (theCurve == NULL) return aGEOMObject._retn();
+
+  //Get the reference curve
+
+  Handle(GEOM_Object) aRefernce = GetOperations()->GetEngine()->GetObject
+    (theCurve->GetStudyID(), theCurve->GetEntry());
+  if (aRefernce.IsNull()) return aGEOMObject._retn();
+
+  //Create the point
+
+  Handle(GEOM_Object) anObject =
+    GetOperations()->MakeTangentOnCurve(aRefernce, theParameter);
+  if (!GetOperations()->IsDone() || anObject.IsNull())
+    return aGEOMObject._retn();
+
+  return GetObject(anObject);
+}
+
 
 //=============================================================================
 /*!
@@ -388,3 +419,39 @@ GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakeMarker
 
   return GetObject(anObject);
 }
+
+//=============================================================================
+/*!
+ *  MakeTangentPlaneOnFace
+ */
+//=============================================================================
+
+GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakeTangentPlaneOnFace
+                     (GEOM::GEOM_Object_ptr theFace, 
+                     CORBA::Double theParameterU,
+                     CORBA::Double theParameterV,
+                     CORBA::Double theTrimSize)
+{
+  GEOM::GEOM_Object_var aGEOMObject;
+
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  if (theFace == NULL) return aGEOMObject._retn();
+
+  //Get the reference face
+
+  Handle(GEOM_Object) aRef = GetOperations()->GetEngine()->GetObject
+    (theFace->GetStudyID(), theFace->GetEntry());
+  if (aRef.IsNull()) return aGEOMObject._retn();
+
+  //Create the plane
+
+  Handle(GEOM_Object) anObject =
+    GetOperations()->MakeTangentPlaneOnFace(aRef, theParameterU,theParameterV,theTrimSize);
+  if (!GetOperations()->IsDone() || anObject.IsNull())
+    return aGEOMObject._retn();
+
+  return GetObject(anObject);
+}
+
index e46f50431072a5c8441b2b6bc48484401f2c6629..b4d3db0cfbc2ddb9dded88ed8b8266c6662f74fa 100644 (file)
@@ -52,6 +52,9 @@ class GEOM_IBasicOperations_i :
    GEOM::GEOM_Object_ptr MakePointOnCurve (GEOM::GEOM_Object_ptr theCurve,
                                           CORBA::Double theParameter);
 
+   GEOM::GEOM_Object_ptr MakeTangentOnCurve (GEOM::GEOM_Object_ptr theRefCurve,
+                                            CORBA::Double theParameter);
+
    GEOM::GEOM_Object_ptr MakeVectorDXDYDZ (CORBA::Double theDX,
                                           CORBA::Double theDY,
                                           CORBA::Double theDZ);
@@ -81,6 +84,11 @@ class GEOM_IBasicOperations_i :
                                     CORBA::Double theXDX, CORBA::Double theXDY, CORBA::Double theXDZ,
                                     CORBA::Double theYDX, CORBA::Double theYDY, CORBA::Double theYDZ);
 
+   GEOM::GEOM_Object_ptr MakeTangentPlaneOnFace (GEOM::GEOM_Object_ptr theFace, 
+                                                CORBA::Double theParameterU,
+                                                CORBA::Double theParameterV,
+                                                CORBA::Double theTrimSize);
+
    ::GEOMImpl_IBasicOperations* GetOperations() { return (::GEOMImpl_IBasicOperations*)GetImpl(); }
 };
 
index 38455e4ce7088d97954df29dce49385d3b561ccb..d53601a3e86086ca00607fad2c0695ef428a0a91 100644 (file)
@@ -536,6 +536,17 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePointOnCurve (GEOM::GEOM_Object_ptr the
   return myBasicOp->MakePointOnCurve(theRefCurve, theParameter);
 }
 
+//=============================================================================
+//  MakeTangentOnCurve:
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeTangentOnCurve (GEOM::GEOM_Object_ptr theRefCurve,
+                                                        CORBA::Double theParameter)
+{
+  MESSAGE("GEOM_Superv_i::MakeTangentOnCurve");
+  getBasicOp();
+  return myBasicOp->MakeTangentOnCurve(theRefCurve, theParameter);
+}
+
 //=============================================================================
 //  MakeVectorDXDYDZ:
 //=============================================================================
@@ -619,6 +630,19 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeMarker
   return myBasicOp->MakeMarker(theOX, theOY, theOZ, theXDX, theXDY, theXDZ, theYDX, theYDY, theYDZ);
 }
 
+//=============================================================================
+//  MakeTangentPlaneOnFace:
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeTangentPlaneOnFace (GEOM::GEOM_Object_ptr theFace, 
+                                                CORBA::Double theParameterU,
+                                                CORBA::Double theParameterV,
+                                                CORBA::Double theTrimSize)
+{
+  MESSAGE("GEOM_Superv_i::MakeTangentPlaneOnFace");
+  getBasicOp();
+  return myBasicOp->MakeTangentPlaneOnFace(theFace, theParameterU,theParameterV,theTrimSize);
+}
+
 //================= Primitives Construction : 3DPrimOperations ================
 //=============================================================================
 //  MakeBox:
@@ -845,6 +869,32 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeBoolean (GEOM::GEOM_Object_ptr theShape
   return myBoolOp->MakeBoolean(theShape1, theShape2, theOperation);
 }
 
+//=============================================================================
+//  MakeThruSections:
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeThruSections(const GEOM::ListOfGO& theSeqSections,
+                                        CORBA::Boolean theModeSolid,
+                                        CORBA::Double thePreci,
+                                        CORBA::Boolean theRuled)
+{
+  MESSAGE("GEOM_Superv_i::MakeThruSections");
+  get3DPrimOp();
+  return my3DPrimOp->MakeThruSections(theSeqSections, theModeSolid,thePreci,theRuled);
+}
+
+//=============================================================================
+//  MakePipe:
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeWithDifferentSections(const GEOM::ListOfGO& theBases,
+                                                     const GEOM::ListOfGO& theLocations,
+                                                     GEOM::GEOM_Object_ptr thePath,
+                                                     CORBA::Boolean theWithContact,
+                                                     CORBA::Boolean theWithCorrections)
+{
+  MESSAGE("GEOM_Superv_i::MakePipeWithDifferentSections");
+  get3DPrimOp();
+  return my3DPrimOp->MakePipeWithDifferentSections(theBases,theLocations, thePath,theWithContact,theWithCorrections);
+}
 //=============================================================================
 //  MakeFuse:
 //=============================================================================
index d64bfb9121e07d87faad6abe3c35ba6b8bc5ae4b..733d7d9554a0f85fba9e679a307748a8b5482397 100644 (file)
@@ -142,6 +142,8 @@ public:
                                                CORBA::Double theZ);
   GEOM::GEOM_Object_ptr MakePointOnCurve (GEOM::GEOM_Object_ptr theRefCurve,
                                          CORBA::Double theParameter);
+  GEOM::GEOM_Object_ptr MakeTangentOnCurve (GEOM::GEOM_Object_ptr theRefCurve,
+                                            CORBA::Double theParameter);
   GEOM::GEOM_Object_ptr MakeVectorDXDYDZ (CORBA::Double theDX,
                                          CORBA::Double theDY,
                                          CORBA::Double theDZ);
@@ -162,6 +164,11 @@ public:
                                    CORBA::Double theXDX, CORBA::Double theXDY, CORBA::Double theXDZ,
                                    CORBA::Double theYDX, CORBA::Double theYDY, CORBA::Double theYDZ);
 
+  GEOM::GEOM_Object_ptr MakeTangentPlaneOnFace (GEOM::GEOM_Object_ptr theFace, 
+                                                CORBA::Double theParameterU,
+                                                CORBA::Double theParameterV,
+                                                CORBA::Double theTrimSize);
+
   //-----------------------------------------------------------//
   // Primitives Construction : 3DPrimOperations                //
   //-----------------------------------------------------------//
@@ -218,6 +225,17 @@ public:
                                     CORBA::Long theMinDeg, CORBA::Long theMaxDeg,
                                     CORBA::Double theTol2D, CORBA::Double theTol3D,
                                     CORBA::Long theNbIter);
+
+  GEOM::GEOM_Object_ptr MakeThruSections(const GEOM::ListOfGO& theSeqSections,
+                                        CORBA::Boolean theModeSolid,
+                                        CORBA::Double thePreci,
+                                        CORBA::Boolean theRuled);
+  
+  GEOM::GEOM_Object_ptr MakePipeWithDifferentSections(const GEOM::ListOfGO& theBases,
+                                                     const GEOM::ListOfGO& theLocations,
+                                                     GEOM::GEOM_Object_ptr thePath,
+                                                     CORBA::Boolean theWithContact,
+                                                     CORBA::Boolean theWithCorrections);
   
   //-----------------------------------------------------------//
   // BooleanOperations                                         //
index bab57fe781f16e337333a4412b694f05282f06df..311337bc0dda889876531a62e5ca4054160e49b9 100644 (file)
@@ -184,6 +184,20 @@ def MakeVertexOnCurve(theRefCurve, theParameter):
       print "MakePointOnCurve : ", BasicOp.GetErrorCode()
     return anObj
 
+def MakeTangentOnCurve(theRefCurve, theParameter):
+    """
+     *  Create a tangent, corresponding to the given parameter on the given curve.
+     *  \param theRefCurve The referenced curve.
+     *  \param theParameter Value of parameter on the referenced curve.
+     *  \return New GEOM_Object, containing the created tangent.
+
+     *  
+    """
+    anObj = BasicOp.MakeTangentOnCurve(theRefCurve, theParameter)
+    if BasicOp.IsDone() == 0:
+      print "MakeTangentOnCurve : ", BasicOp.GetErrorCode()
+    return anObj
+
 ## Create a vector with the given components.
 #  @param theDX X component of the vector.
 #  @param theDY Y component of the vector.
@@ -668,6 +682,45 @@ def MakeRevolution(theBase, theAxis, theAngle):
       print "MakeRevolutionAxisAngle : ", PrimOp.GetErrorCode()
     return anObj
 
+def MakeThruSections(theSeqSections,theModeSolid,thePreci,theRuled):
+    """
+     *  Create a shell or solid passing through set of sections.Sections should be wires,edges or vertices.
+     *  \param theSeqSections - set of specified sections.
+     *  \param theModeSolid - mode defining building solid or shell
+     *  \param thePreci - precision 3D used for smoothing by default 1.e-6
+     *  \param theRuled - mode defining type of the result surfaces (ruled or smoothed).
+     *  \return New GEOM_Object, containing the created shell or solid.
+
+     *  Example: see GEOM_TestAll.py
+    """
+    anObj = PrimOp.MakeThruSections(theSeqSections,theModeSolid,thePreci,theRuled)
+    if PrimOp.IsDone() == 0:
+      print "MakeThruSections : ", PrimOp.GetErrorCode()
+    return anObj
+
+def MakePipeWithDifferentSections(theSeqBases, theLocations,thePath,theWithContact,theWithCorrection):
+    """
+     *  Create a shape by extrusion of the profile shape along
+     *  the path shape. The path shape can be a wire or an edge.
+     *  the several profiles can be specified in the several locations of path.        
+     *  \param theSeqBases - list of  Bases shape to be extruded.
+     *  \param theLocations - list of locations on the path corresponding
+     *                        specified list of the Bases shapes. Number of locations
+     *                        should be equal to number of bases or list of locations can be empty.
+     *  \param thePath - Path shape to extrude the base shape along it.
+     *  \param theWithContact - the mode defining that the section is translated to be in
+     *                          contact with the spine.
+     *  \param - WithCorrection - defining that the section is rotated to be
+     *                          orthogonal to the spine tangent in the correspondent point
+     *  \return New GEOM_Object, containing the created pipe.
+
+     *  Example: see GEOM_TestAll.py
+    """
+    anObj = PrimOp.MakePipeWithDifferentSections(theSeqBases, theLocations,thePath,theWithContact,theWithCorrection)
+    if PrimOp.IsDone() == 0:
+      print "MakePipeWithDifferentSections : ", PrimOp.GetErrorCode()
+    return anObj
+
 # -----------------------------------------------------------------------------
 # Create base shapes
 # -----------------------------------------------------------------------------