From c6123f20a8dc8369e893e6bb0a09085c31d58729 Mon Sep 17 00:00:00 2001 From: gka Date: Sat, 6 May 2006 06:44:49 +0000 Subject: [PATCH] Debug of barre --- src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx | 11 +- src/GEOMImpl/GEOMImpl_IPipe.hxx | 2 +- src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx | 13 +- src/GEOMImpl/GEOMImpl_PipeDriver.cxx | 168 ++++++++++++++------ src/GEOM_I/GEOM_I3DPrimOperations_i.cc | 4 +- 5 files changed, 135 insertions(+), 63 deletions(-) diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx index f957428f4..d61feca83 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx @@ -1056,9 +1056,9 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( Standard_Integer nbBases = theBases->Length(); - if (!nbBases) + 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); @@ -1100,7 +1100,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( if(anItemLoc.IsNull()) continue; - Handle(GEOM_Object) aLoc = Handle(GEOM_Object)::DownCast(anItem); + Handle(GEOM_Object) aLoc = Handle(GEOM_Object)::DownCast(anItemLoc); if(aLoc.IsNull()) continue; Handle(GEOM_Function) aRefLoc = aLoc->GetLastFunction(); @@ -1114,17 +1114,16 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( 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"); + SetErrorCode("Pipe with defferent section driver failed"); return anObj; } } diff --git a/src/GEOMImpl/GEOMImpl_IPipe.hxx b/src/GEOMImpl/GEOMImpl_IPipe.hxx index 4fdd314ff..7362492d4 100644 --- a/src/GEOMImpl/GEOMImpl_IPipe.hxx +++ b/src/GEOMImpl/GEOMImpl_IPipe.hxx @@ -39,7 +39,7 @@ 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; }; diff --git a/src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx b/src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx index e8dcd601a..647b8a160 100644 --- a/src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx +++ b/src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx @@ -45,13 +45,19 @@ class GEOMImpl_IPipeDiffSect : public GEOMImpl_IPipe { _func->SetReferenceList(PIPEDS_LIST_BASES,theBases); } Handle(TColStd_HSequenceOfTransient) GetBases () - { return _func->GetReferenceList(PIPEDS_LIST_BASES); } + { + Handle(TColStd_HSequenceOfTransient) aBases = _func->GetReferenceList(PIPEDS_LIST_BASES); + return aBases; + } void SetLocations (const Handle(TColStd_HSequenceOfTransient)& theLocations) { _func->SetReferenceList(PIPEDS_LIST_LOCATIONS,theLocations); } Handle(TColStd_HSequenceOfTransient) GetLocations () - { return _func->GetReferenceList(PIPEDS_LIST_BASES); } + { + Handle(TColStd_HSequenceOfTransient) aLocs = _func->GetReferenceList(PIPEDS_LIST_LOCATIONS); + return aLocs; + } //void SetPath (const Handle(GEOM_Function)& thePath) { _func->SetReference(PIPEDS_ARG_PATH, thePath); } @@ -69,9 +75,6 @@ class GEOMImpl_IPipeDiffSect : public GEOMImpl_IPipe int GetWithCorrectionMode() { return _func->GetInteger(PIPEDS_ARG_WITHCORRECT); } - private: - - Handle(GEOM_Function) _func; }; #endif diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx index 657dd5342..84d023704 100644 --- a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx @@ -42,6 +42,11 @@ #include #include #include +#include "utilities.h" +#include +#include +#include +#include //======================================================================= //function : GetID @@ -70,7 +75,6 @@ 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= 0; Standard_Integer aType = aFunction->GetType(); if(aType == PIPE_BASE_PATH) @@ -83,50 +87,55 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const Handle(GEOM_Function) aRefPath = aCI->GetPath(); TopoDS_Shape aShapePath = aRefPath->GetValue(); + if (aShapePath.IsNull()) { - Standard_NullObject::Raise("MakePipe aborted : null path argument"); + cout<<"Driver : path is null"<GetBase(); TopoDS_Shape aShapeBase = aRefBase->GetValue(); if (aShapeBase.IsNull()) { - Standard_NullObject::Raise("MakePipe aborted : null base argument"); if(aCI) delete aCI; + Standard_NullObject::Raise("MakePipe aborted : null base argument"); } // Make pipe - aShape = BRepOffsetAPI_MakePipe(aWire, aShapeBase); + aShape = BRepOffsetAPI_MakePipe(aWirePath, aShapeBase); } //building pipe with different sections - else if (aType == PIPE_DIFFERENT_SECTIONS) { + else if (aType == PIPE_DIFFERENT_SECTIONS) + { GEOMImpl_IPipeDiffSect* aCIDS = (GEOMImpl_IPipeDiffSect*)aCI; - - BRepOffsetAPI_MakePipeShell aBuilder(aWire); + //GEOMImpl_IPipeDiffSect* aCIDS = static_cast(aCI); + BRepOffsetAPI_MakePipeShell aBuilder(aWirePath); Handle(TColStd_HSequenceOfTransient) aBasesObjs = aCIDS->GetBases (); Handle(TColStd_HSequenceOfTransient) aLocObjs = aCIDS->GetLocations (); Standard_Boolean aWithContact = (aCIDS->GetWithContactMode()); @@ -134,60 +143,121 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const Standard_Integer i =1, nbBases = aBasesObjs->Length(), nbLocs = (aLocObjs.IsNull() ? 0 :aLocObjs->Length()); - + if(nbLocs && nbLocs != nbBases) { - Standard_ConstructionError::Raise("Invalid input data for building PIPE: number of sections is not equql to number of locations "); if(aCI) delete aCI; + Standard_ConstructionError::Raise("Number of sections is not equal to number of locations "); } - Standard_Integer nbAdded =0; - for( ; i <= nbBases; i++) { + 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; - - 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; - TopoDS_Vertex aVert = TopoDS::Vertex(aShapeLoc); - aBuilder.Add(aShapeBase,aVert,aWithContact,aWithCorrect); - nbAdded++; - } - else { - aBuilder.Add(aShapeBase,aWithContact,aWithCorrect); - nbAdded++; - } - + 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); + } } - if(!nbAdded || !aBuilder.IsReady()) + + nbLocs = aSeqLocs.Length(); + Standard_Integer nbShapes = aSeqBases.Length(); + Standard_Integer step = nbShapes/nbBases; + + if(nbShapes < nbBases || fmod(nbShapes,nbBases)) { - Standard_ConstructionError::Raise("Invalid input data for building PIPE: bases are invalid"); 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; } - - - aBuilder.Build(); - aShape = aBuilder.Shape(); - } - if (aShape.IsNull()) return 0; BRepCheck_Analyzer ana (aShape, Standard_False); if (!ana.IsValid()) { - Standard_ConstructionError::Raise("Algorithm have produced an invalid shape result"); if(aCI) delete aCI; + Standard_ConstructionError::Raise("Algorithm have produced an invalid shape result"); } aFunction->SetValue(aShape); diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc index e8357a820..fbb7e1bf6 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc @@ -556,8 +556,8 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithDifferentSections(co for (ind = 0; ind < aNbBases; ind++) { if (theBases[ind] == NULL) continue; - Handle(GEOM_Object) aBase = GetOperations()->GetEngine()->GetObject - (theBases[ind]->GetStudyID(), theBases[ind]->GetEntry()); + Handle(GEOM_Object) aBase = GetOperations()->GetEngine()->GetObject(theBases[ind]->GetStudyID(), + theBases[ind]->GetEntry()); if(aBase.IsNull()) continue; if(aNbLocs) -- 2.39.2