From 7640175a01d714c80ab9518fa9ccb8c4a9e6913f Mon Sep 17 00:00:00 2001 From: gka Date: Mon, 24 Apr 2006 07:53:09 +0000 Subject: [PATCH] Add methods for creation pipe with different sections and thrusections --- src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx | 243 ++++++++++++++++++++ src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx | 12 + 2 files changed, 255 insertions(+) diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx index 266e4de26..f957428f4 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -56,6 +57,8 @@ #include #include #include +#include +#include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC @@ -933,3 +936,243 @@ 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<< "],"<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(anItem); + 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("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 << 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<< "], "< +#include 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 -- 2.39.2