From 34fb01e7b5b520e2193fd44c066322e970d471b1 Mon Sep 17 00:00:00 2001 From: skl Date: Wed, 10 Jun 2009 07:09:15 +0000 Subject: [PATCH] Implementation of new version ExtrusionAlongPath (20003 from Mantis). --- .../SMESH/images/extr_along_wire_after.png | Bin 0 -> 7221 bytes .../SMESH/images/extr_along_wire_before.png | Bin 0 -> 7120 bytes doc/salome/gui/SMESH/images/extrusion1.png | Bin 21458 -> 38296 bytes .../gui/SMESH/input/extrusion_along_path.doc | 46 +- idl/SMESH_MeshEditor.idl | 24 + src/SMESH/SMESH_MeshEditor.cxx | 512 +++++++++++++++--- src/SMESH/SMESH_MeshEditor.hxx | 76 +++ .../SMESHGUI_ExtrusionAlongPathDlg.cxx | 130 ++--- src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.h | 9 +- src/SMESHGUI/SMESH_msg_en.ts | 2 +- src/SMESH_I/SMESH_MeshEditor_i.cxx | 221 +++++++- src/SMESH_I/SMESH_MeshEditor_i.hxx | 36 ++ src/SMESH_SWIG/smeshDC.py | 49 +- 13 files changed, 912 insertions(+), 193 deletions(-) create mode 100644 doc/salome/gui/SMESH/images/extr_along_wire_after.png create mode 100644 doc/salome/gui/SMESH/images/extr_along_wire_before.png diff --git a/doc/salome/gui/SMESH/images/extr_along_wire_after.png b/doc/salome/gui/SMESH/images/extr_along_wire_after.png new file mode 100644 index 0000000000000000000000000000000000000000..eb39bdd08b47d6d55eac9939fa6d26cbb3c62bdd GIT binary patch literal 7221 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 PL1#|bn3o=RyZ`?HoleSS literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/extr_along_wire_before.png b/doc/salome/gui/SMESH/images/extr_along_wire_before.png new file mode 100644 index 0000000000000000000000000000000000000000..2f30ceeaba466d84936bf6f2ce36b051c43bb3b7 GIT binary patch literal 7120 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
uR|{5!Q3u1sm$oX(Uu-75{`ttCt&>vA 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 aT3>xy`f_K_$r|wF0JoE#C&(^gSN;OY>XO6& diff --git a/doc/salome/gui/SMESH/input/extrusion_along_path.doc b/doc/salome/gui/SMESH/input/extrusion_along_path.doc index 31174dde2..96f0e9f1a 100644 --- a/doc/salome/gui/SMESH/input/extrusion_along_path.doc +++ b/doc/salome/gui/SMESH/input/extrusion_along_path.doc @@ -4,13 +4,14 @@ \n In principle, Extrusion along a path works in the same way as \b Extrusion, the main difference is that we define not a vector, -but a path of extrusion which must be a meshed edge. To get an idea of -how this algorithm works, examine several examples, starting from the -most simple case of extrusion along a straight edge. In all examples -the same mesh will be extruded along different paths and with -different parameters. This sample 2D mesh has two quadrangle faces and -seven edges. Look at the picture, where white digits are the node -numbers and green are the element numbers: +but a path of extrusion which must be a 1D mesh or 1D sub-mesh. To +get an idea of how this algorithm works, examine several examples, +starting from the most simple case of extrusion along a straight edge. +In following examples the meshes will be extruded along different +paths and with different parameters. +This sample 2D mesh has two quadrangle faces and seven edges. Look +at the picture, where white digits are the node numbers and green +are the element numbers: \image html mesh_for_extr_along_path.png @@ -40,29 +41,15 @@ been selected as Start node. \image html curvi_angles_after.png
The same, but using angles {45, 45, 45, 0, -45, -45, -45}
-

Extrusion along a sub-mesh

+

Extrusion of 2d face along a mesh builds on wire

-In this example the path mesh has been built on a wire (polyline with -six edges). The first edge of the wire was used as Shape (edge), node -#1 as Start node. The angles have been defined as {10, 10, 10}. The -middle edge (#4) of the initial mesh has been extruded. +In this example the path mesh has been built on a wire contains 3 +edges. Node #1 is used as start node. Linear angle variation by 180 +degree is applied. -\image html edge_wire_before.png +\image html extr_along_wire_before.png -\image html edge_wire_after.png - -

Extrusion of 2d elements along a sub-mesh

- -This extrusion bases on the same path mesh as in the previous example -but the third edge of the wire was set as Shape (edge) and node -#4 as Start node. Please note, that the extrusion has been done -in direction from node #4 to node #3, i.e. against the wire -direction. In this example both faces of the initial mesh have been -extruded. - -\image html edge_wire_3d_before.png - -\image html edge_wire_3d_after.png +\image html extr_along_wire_after.png

Extrusion of 2d elements along a closed path

@@ -113,9 +100,8 @@ about filters in the \ref selection_filter_library_page "Selection filter librar
  • define the Path along which the elements will be extruded, \n Path definition consists of several elements:
      -
    • \b Mesh - containing a 1D sub-mesh on the edge, along which proceeds the extrusion
    • -
    • Shape (edge) - as the mesh can be complex, the edge is used to define the sub-mesh for the path
    • -
    • Start node - the first or the last node on the edge. It is used to define the direction of extrusion
    • +
    • Mesh or submesh - 1D mesh or 1D sub-mesh, along which proceeds the extrusion
    • +
    • Start node - the start node. It is used to define the direction of extrusion
  • activate Generate Groups checkbox if it is necessary to copy the groups of diff --git a/idl/SMESH_MeshEditor.idl b/idl/SMESH_MeshEditor.idl index 0a4b5b7cd..21ea8a5dd 100644 --- a/idl/SMESH_MeshEditor.idl +++ b/idl/SMESH_MeshEditor.idl @@ -392,6 +392,30 @@ module SMESH EXTR_CANT_GET_TANGENT }; + ListOfGroups ExtrusionAlongPathX(in long_array IDsOfElements, + in SMESH_IDSource Path, + in long NodeStart, + in boolean HasAngles, + in double_array Angles, + in boolean LinearVariation, + in boolean HasRefPoint, + in PointStruct RefPoint, + in boolean MakeGroups, + in ElementType ElemType, + out Extrusion_Error Error); + + ListOfGroups ExtrusionAlongPathObjX(in SMESH_IDSource theObject, + in SMESH_IDSource Path, + in long NodeStart, + in boolean HasAngles, + in double_array Angles, + in boolean LinearVariation, + in boolean HasRefPoint, + in PointStruct RefPoint, + in boolean MakeGroups, + in ElementType ElemType, + out Extrusion_Error Error); + Extrusion_Error ExtrusionAlongPath(in long_array IDsOfElements, in SMESH_Mesh PathMesh, in GEOM::GEOM_Object PathShape, diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index 18ae0388b..81d71320c 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -3732,7 +3733,7 @@ SMESH_MeshEditor::ExtrusionSweep (TIDSortedElemSet & theElems, return newGroupIDs; } - +/* //======================================================================= //class : SMESH_MeshEditor_PathPoint //purpose : auxiliary class @@ -3776,6 +3777,7 @@ protected: double myAngle; double myPrm; }; +*/ //======================================================================= //function : ExtrusionAlongTrack @@ -3787,6 +3789,7 @@ SMESH_MeshEditor::Extrusion_Error const SMDS_MeshNode* theN1, const bool theHasAngles, list& theAngles, + const bool theLinearVariation, const bool theHasRefPoint, const gp_Pnt& theRefPoint, const bool theMakeGroups) @@ -3794,20 +3797,11 @@ SMESH_MeshEditor::Extrusion_Error myLastCreatedElems.Clear(); myLastCreatedNodes.Clear(); - // source elements for each generated one - SMESH_SequenceOfElemPtr srcElems, srcNodes; - - int j, aNbTP, aNbE, aNb; - double aT1, aT2, aT, aAngle, aX, aY, aZ; + int aNbE; std::list aPrms; - std::list::iterator aItD; TIDSortedElemSet::iterator itElem; - Standard_Real aTx1, aTx2, aL2, aTolVec, aTolVec2; - gp_Pnt aP3D, aV0; - gp_Vec aVec; gp_XYZ aGC; - Handle(Geom_Curve) aC3D; TopoDS_Edge aTrackEdge; TopoDS_Vertex aV1, aV2; @@ -3816,11 +3810,6 @@ SMESH_MeshEditor::Extrusion_Error SMDSAbs_ElementType aTypeE; TNodeOfNodeListMap mapNewNodes; - TElemOfVecOfNnlmiMap mapElemNewNodes; - TElemOfElemListMap newElemsMap; - - aTolVec=1.e-7; - aTolVec2=aTolVec*aTolVec; // 1. Check data aNbE = theElements.size(); @@ -3831,7 +3820,7 @@ SMESH_MeshEditor::Extrusion_Error // 1.1 Track Pattern ASSERT( theTrack ); - SMESHDS_SubMesh* pSubMeshDS=theTrack->GetSubMeshDS(); + SMESHDS_SubMesh* pSubMeshDS = theTrack->GetSubMeshDS(); aItE = pSubMeshDS->GetElements(); while ( aItE->more() ) { @@ -3842,63 +3831,325 @@ SMESH_MeshEditor::Extrusion_Error return EXTR_PATH_NOT_EDGE; } + list fullList; + const TopoDS_Shape& aS = theTrack->GetSubShape(); - // Sub shape for the Pattern must be an Edge - if ( aS.ShapeType() != TopAbs_EDGE ) + // Sub shape for the Pattern must be an Edge or Wire + if( aS.ShapeType() == TopAbs_EDGE ) { + aTrackEdge = TopoDS::Edge( aS ); + // the Edge must not be degenerated + if ( BRep_Tool::Degenerated( aTrackEdge ) ) + return EXTR_BAD_PATH_SHAPE; + TopExp::Vertices( aTrackEdge, aV1, aV2 ); + aItN = theTrack->GetFather()->GetSubMesh( aV1 )->GetSubMeshDS()->GetNodes(); + const SMDS_MeshNode* aN1 = aItN->next(); + aItN = theTrack->GetFather()->GetSubMesh( aV2 )->GetSubMeshDS()->GetNodes(); + const SMDS_MeshNode* aN2 = aItN->next(); + // starting node must be aN1 or aN2 + if ( !( aN1 == theN1 || aN2 == theN1 ) ) + return EXTR_BAD_STARTING_NODE; + aItN = pSubMeshDS->GetNodes(); + while ( aItN->more() ) { + const SMDS_MeshNode* pNode = aItN->next(); + const SMDS_EdgePosition* pEPos = + static_cast( pNode->GetPosition().get() ); + double aT = pEPos->GetUParameter(); + aPrms.push_back( aT ); + } + Extrusion_Error err = MakeEdgePathPoints(aPrms, aTrackEdge, (aN1==theN1), fullList); + } + else if( aS.ShapeType() == TopAbs_WIRE ) { + list< SMESH_subMesh* > LSM; + TopTools_SequenceOfShape Edges; + SMESH_subMeshIteratorPtr itSM = theTrack->getDependsOnIterator(false,true); + while(itSM->more()) { + SMESH_subMesh* SM = itSM->next(); + LSM.push_back(SM); + const TopoDS_Shape& aS = SM->GetSubShape(); + Edges.Append(aS); + } + list< list > LLPPs; + int startNid = theN1->GetID(); + TColStd_MapOfInteger UsedNums; + int NbEdges = Edges.Length(); + int i = 1; + for(; i<=NbEdges; i++) { + int k = 0; + list< SMESH_subMesh* >::iterator itLSM = LSM.begin(); + for(; itLSM!=LSM.end(); itLSM++) { + k++; + if(UsedNums.Contains(k)) continue; + aTrackEdge = TopoDS::Edge( Edges.Value(k) ); + SMESH_subMesh* locTrack = *itLSM; + SMESHDS_SubMesh* locMeshDS = locTrack->GetSubMeshDS(); + TopExp::Vertices( aTrackEdge, aV1, aV2 ); + aItN = locTrack->GetFather()->GetSubMesh(aV1)->GetSubMeshDS()->GetNodes(); + const SMDS_MeshNode* aN1 = aItN->next(); + aItN = locTrack->GetFather()->GetSubMesh(aV2)->GetSubMeshDS()->GetNodes(); + const SMDS_MeshNode* aN2 = aItN->next(); + // starting node must be aN1 or aN2 + if ( !( aN1->GetID() == startNid || aN2->GetID() == startNid ) ) continue; + // 2. Collect parameters on the track edge + aPrms.clear(); + aItN = locMeshDS->GetNodes(); + while ( aItN->more() ) { + const SMDS_MeshNode* pNode = aItN->next(); + const SMDS_EdgePosition* pEPos = + static_cast( pNode->GetPosition().get() ); + double aT = pEPos->GetUParameter(); + aPrms.push_back( aT ); + } + list LPP; + Extrusion_Error err = MakeEdgePathPoints(aPrms, aTrackEdge, + (aN1->GetID()==startNid), LPP); + LLPPs.push_back(LPP); + UsedNums.Add(k); + // update startN for search following egde + if( aN1->GetID() == startNid ) startNid = aN2->GetID(); + else startNid = aN1->GetID(); + break; + } + } + list< list >::iterator itLLPP = LLPPs.begin(); + list firstList = *itLLPP; + list::iterator itPP = firstList.begin(); + for(; itPP!=firstList.end(); itPP++) { + fullList.push_back( *itPP ); + } + SMESH_MeshEditor_PathPoint PP1 = fullList.back(); + fullList.pop_back(); + itLLPP++; + for(; itLLPP!=LLPPs.end(); itLLPP++) { + list currList = *itLLPP; + itPP = currList.begin(); + SMESH_MeshEditor_PathPoint PP2 = currList.front(); + gp_Dir D1 = PP1.Tangent(); + gp_Dir D2 = PP2.Tangent(); + gp_Dir Dnew( gp_Vec( (D1.X()+D2.X())/2, (D1.Y()+D2.Y())/2, + (D1.Z()+D2.Z())/2 ) ); + PP1.SetTangent(Dnew); + fullList.push_back(PP1); + itPP++; + for(; itPP!=firstList.end(); itPP++) { + fullList.push_back( *itPP ); + } + PP1 = fullList.back(); + fullList.pop_back(); + } + // if wire not closed + fullList.push_back(PP1); + // else ??? + } + else { return EXTR_BAD_PATH_SHAPE; + } - aTrackEdge = TopoDS::Edge( aS ); - // the Edge must not be degenerated - if ( BRep_Tool::Degenerated( aTrackEdge ) ) + return MakeExtrElements(theElements, fullList, theHasAngles, theAngles, theLinearVariation, + theHasRefPoint, theRefPoint, theMakeGroups); +} + + +//======================================================================= +//function : ExtrusionAlongTrack +//purpose : +//======================================================================= +SMESH_MeshEditor::Extrusion_Error + SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet & theElements, + SMESH_Mesh* theTrack, + const SMDS_MeshNode* theN1, + const bool theHasAngles, + list& theAngles, + const bool theLinearVariation, + const bool theHasRefPoint, + const gp_Pnt& theRefPoint, + const bool theMakeGroups) +{ + myLastCreatedElems.Clear(); + myLastCreatedNodes.Clear(); + + int aNbE; + std::list aPrms; + TIDSortedElemSet::iterator itElem; + + gp_XYZ aGC; + TopoDS_Edge aTrackEdge; + TopoDS_Vertex aV1, aV2; + + SMDS_ElemIteratorPtr aItE; + SMDS_NodeIteratorPtr aItN; + SMDSAbs_ElementType aTypeE; + + TNodeOfNodeListMap mapNewNodes; + + // 1. Check data + aNbE = theElements.size(); + // nothing to do + if ( !aNbE ) + return EXTR_NO_ELEMENTS; + + // 1.1 Track Pattern + ASSERT( theTrack ); + + SMESHDS_Mesh* pMeshDS = theTrack->GetMeshDS(); + + aItE = pMeshDS->elementsIterator(); + while ( aItE->more() ) { + const SMDS_MeshElement* pE = aItE->next(); + aTypeE = pE->GetType(); + // Pattern must contain links only + if ( aTypeE != SMDSAbs_Edge ) + return EXTR_PATH_NOT_EDGE; + } + + list fullList; + + const TopoDS_Shape& aS = theTrack->GetShapeToMesh(); + // Sub shape for the Pattern must be an Edge or Wire + if( aS.ShapeType() == TopAbs_EDGE ) { + aTrackEdge = TopoDS::Edge( aS ); + // the Edge must not be degenerated + if ( BRep_Tool::Degenerated( aTrackEdge ) ) + return EXTR_BAD_PATH_SHAPE; + TopExp::Vertices( aTrackEdge, aV1, aV2 ); + aItN = theTrack->GetSubMesh( aV1 )->GetSubMeshDS()->GetNodes(); + const SMDS_MeshNode* aN1 = aItN->next(); + aItN = theTrack->GetSubMesh( aV2 )->GetSubMeshDS()->GetNodes(); + const SMDS_MeshNode* aN2 = aItN->next(); + // starting node must be aN1 or aN2 + if ( !( aN1 == theN1 || aN2 == theN1 ) ) + return EXTR_BAD_STARTING_NODE; + aItN = pMeshDS->nodesIterator(); + while ( aItN->more() ) { + const SMDS_MeshNode* pNode = aItN->next(); + if( pNode==aN1 || pNode==aN2 ) continue; + const SMDS_EdgePosition* pEPos = + static_cast( pNode->GetPosition().get() ); + double aT = pEPos->GetUParameter(); + aPrms.push_back( aT ); + } + Extrusion_Error err = MakeEdgePathPoints(aPrms, aTrackEdge, (aN1==theN1), fullList); + } + else if( aS.ShapeType() == TopAbs_WIRE ) { + list< SMESH_subMesh* > LSM; + TopTools_SequenceOfShape Edges; + TopExp_Explorer eExp(aS, TopAbs_EDGE); + for(; eExp.More(); eExp.Next()) { + TopoDS_Edge E = TopoDS::Edge( eExp.Current() ); + if( BRep_Tool::Degenerated(E) ) continue; + SMESH_subMesh* SM = theTrack->GetSubMesh(E); + if(SM) { + LSM.push_back(SM); + Edges.Append(E); + } + } + list< list > LLPPs; + int startNid = theN1->GetID(); + TColStd_MapOfInteger UsedNums; + int NbEdges = Edges.Length(); + int i = 1; + for(; i<=NbEdges; i++) { + int k = 0; + list< SMESH_subMesh* >::iterator itLSM = LSM.begin(); + for(; itLSM!=LSM.end(); itLSM++) { + k++; + if(UsedNums.Contains(k)) continue; + aTrackEdge = TopoDS::Edge( Edges.Value(k) ); + SMESH_subMesh* locTrack = *itLSM; + SMESHDS_SubMesh* locMeshDS = locTrack->GetSubMeshDS(); + TopExp::Vertices( aTrackEdge, aV1, aV2 ); + aItN = locTrack->GetFather()->GetSubMesh(aV1)->GetSubMeshDS()->GetNodes(); + const SMDS_MeshNode* aN1 = aItN->next(); + aItN = locTrack->GetFather()->GetSubMesh(aV2)->GetSubMeshDS()->GetNodes(); + const SMDS_MeshNode* aN2 = aItN->next(); + // starting node must be aN1 or aN2 + if ( !( aN1->GetID() == startNid || aN2->GetID() == startNid ) ) continue; + // 2. Collect parameters on the track edge + aPrms.clear(); + aItN = locMeshDS->GetNodes(); + while ( aItN->more() ) { + const SMDS_MeshNode* pNode = aItN->next(); + const SMDS_EdgePosition* pEPos = + static_cast( pNode->GetPosition().get() ); + double aT = pEPos->GetUParameter(); + aPrms.push_back( aT ); + } + list LPP; + Extrusion_Error err = MakeEdgePathPoints(aPrms, aTrackEdge, + (aN1->GetID()==startNid), LPP); + LLPPs.push_back(LPP); + UsedNums.Add(k); + // update startN for search following egde + if( aN1->GetID() == startNid ) startNid = aN2->GetID(); + else startNid = aN1->GetID(); + break; + } + } + list< list >::iterator itLLPP = LLPPs.begin(); + list firstList = *itLLPP; + list::iterator itPP = firstList.begin(); + for(; itPP!=firstList.end(); itPP++) { + fullList.push_back( *itPP ); + } + SMESH_MeshEditor_PathPoint PP1 = fullList.back(); + fullList.pop_back(); + itLLPP++; + for(; itLLPP!=LLPPs.end(); itLLPP++) { + list currList = *itLLPP; + itPP = currList.begin(); + SMESH_MeshEditor_PathPoint PP2 = currList.front(); + gp_Pnt P1 = PP1.Pnt(); + //cout<<" PP1: Pnt("<& aPrms, + const TopoDS_Edge& aTrackEdge, + bool FirstIsStart, + list& LPP) +{ + Standard_Real aTx1, aTx2, aL2, aTolVec, aTolVec2; + aTolVec=1.e-7; + aTolVec2=aTolVec*aTolVec; + double aT1, aT2; + TopoDS_Vertex aV1, aV2; TopExp::Vertices( aTrackEdge, aV1, aV2 ); aT1=BRep_Tool::Parameter( aV1, aTrackEdge ); aT2=BRep_Tool::Parameter( aV2, aTrackEdge ); - - aItN = theTrack->GetFather()->GetSubMesh( aV1 )->GetSubMeshDS()->GetNodes(); - const SMDS_MeshNode* aN1 = aItN->next(); - - aItN = theTrack->GetFather()->GetSubMesh( aV2 )->GetSubMeshDS()->GetNodes(); - const SMDS_MeshNode* aN2 = aItN->next(); - - // starting node must be aN1 or aN2 - if ( !( aN1 == theN1 || aN2 == theN1 ) ) - return EXTR_BAD_STARTING_NODE; - - aNbTP = pSubMeshDS->NbNodes() + 2; - - // 1.2. Angles - vector aAngles( aNbTP ); - - for ( j=0; j < aNbTP; ++j ) { - aAngles[j] = 0.; - } - - if ( theHasAngles ) { - aItD = theAngles.begin(); - for ( j=1; (aItD != theAngles.end()) && (jGetNodes(); - while ( aItN->more() ) { - const SMDS_MeshNode* pNode = aItN->next(); - const SMDS_EdgePosition* pEPos = - static_cast( pNode->GetPosition().get() ); - aT = pEPos->GetUParameter(); - aPrms.push_back( aT ); - } - // sort parameters aPrms.sort(); - if ( aN1 == theN1 ) { + if( FirstIsStart ) { if ( aT1 > aT2 ) { aPrms.reverse(); } @@ -3908,48 +4159,100 @@ SMESH_MeshEditor::Extrusion_Error aPrms.reverse(); } } - // 3. Path Points SMESH_MeshEditor_PathPoint aPP; - vector aPPs( aNbTP ); - // - aC3D = BRep_Tool::Curve( aTrackEdge, aTx1, aTx2 ); - // - aItD = aPrms.begin(); - for ( j=0; aItD != aPrms.end(); ++aItD, ++j ) { - aT = *aItD; + Handle(Geom_Curve) aC3D = BRep_Tool::Curve( aTrackEdge, aTx1, aTx2 ); + std::list::iterator aItD = aPrms.begin(); + for(; aItD != aPrms.end(); ++aItD) { + double aT = *aItD; + gp_Pnt aP3D; + gp_Vec aVec; aC3D->D1( aT, aP3D, aVec ); aL2 = aVec.SquareMagnitude(); if ( aL2 < aTolVec2 ) return EXTR_CANT_GET_TANGENT; - gp_Dir aTgt( aVec ); - aAngle = aAngles[j]; - aPP.SetPnt( aP3D ); aPP.SetTangent( aTgt ); - aPP.SetAngle( aAngle ); aPP.SetParameter( aT ); - aPPs[j]=aPP; + LPP.push_back(aPP); + } +} + + +//======================================================================= +//function : MakeExtrElements +//purpose : auxilary for ExtrusionAlongTrack +//======================================================================= +SMESH_MeshEditor::Extrusion_Error +SMESH_MeshEditor::MakeExtrElements(TIDSortedElemSet& theElements, + list& fullList, + const bool theHasAngles, + list& theAngles, + const bool theLinearVariation, + const bool theHasRefPoint, + const gp_Pnt& theRefPoint, + const bool theMakeGroups) +{ + //cout<<"MakeExtrElements fullList.size() = "< aPPs(aNbTP); + // Angles + if( theHasAngles && theAngles.size()>0 && theLinearVariation ) { + LinearAngleVariation(aNbTP-1, theAngles); + } + vector aAngles( aNbTP ); + int j = 0; + for(; j::iterator aItD = theAngles.begin(); + for ( j=1; (aItD != theAngles.end()) && (j::iterator itPP = fullList.begin(); + for(; itPP!=fullList.end(); itPP++) { + j++; + SMESH_MeshEditor_PathPoint PP = *itPP; + PP.SetAngle(aAngles[j]); + aPPs[j] = PP; } + TNodeOfNodeListMap mapNewNodes; + TElemOfVecOfNnlmiMap mapElemNewNodes; + TElemOfElemListMap newElemsMap; + TIDSortedElemSet::iterator itElem; + double aX, aY, aZ; + int aNb; + SMDSAbs_ElementType aTypeE; + // source elements for each generated one + SMESH_SequenceOfElemPtr srcElems, srcNodes; + // 3. Center of rotation aV0 - aV0 = theRefPoint; + gp_Pnt aV0 = theRefPoint; + gp_XYZ aGC; if ( !theHasRefPoint ) { aNb = 0; aGC.SetCoord( 0.,0.,0. ); - + itElem = theElements.begin(); for ( ; itElem != theElements.end(); itElem++ ) { const SMDS_MeshElement* elem = *itElem; - + SMDS_ElemIteratorPtr itN = elem->nodesIterator(); while ( itN->more() ) { const SMDS_MeshNode* node = static_cast( itN->next() ); aX = node->X(); aY = node->Y(); aZ = node->Z(); - + if ( mapNewNodes.find( node ) == mapNewNodes.end() ) { list aLNx; mapNewNodes[node] = aLNx; @@ -4008,6 +4311,7 @@ SMESH_MeshEditor::Extrusion_Error const SMESH_MeshEditor_PathPoint& aPP0 = aPPs[0]; aP0x = aPP0.Pnt(); aDT0x= aPP0.Tangent(); + //cout<<"j = 0 PP: Pnt("<& Angles) +{ + int nbAngles = Angles.size(); + if( nbSteps > nbAngles ) { + vector theAngles(nbAngles); + list::iterator it = Angles.begin(); + int i = -1; + for(; it!=Angles.end(); it++) { + i++; + theAngles[i] = (*it); + } + list res; + double rAn2St = double( nbAngles ) / double( nbSteps ); + double angPrev = 0, angle; + for ( int iSt = 0; iSt < nbSteps; ++iSt ) { + double angCur = rAn2St * ( iSt+1 ); + double angCurFloor = floor( angCur ); + double angPrevFloor = floor( angPrev ); + if ( angPrevFloor == angCurFloor ) + angle = rAn2St * theAngles[ int( angCurFloor ) ]; + else { + int iP = int( angPrevFloor ); + double angPrevCeil = ceil(angPrev); + angle = ( angPrevCeil - angPrev ) * theAngles[ iP ]; + + int iC = int( angCurFloor ); + if ( iC < nbAngles ) + angle += ( angCur - angCurFloor ) * theAngles[ iC ]; + + iP = int( angPrevCeil ); + while ( iC-- > iP ) + angle += theAngles[ iC ]; + } + res.push_back(angle); + angPrev = angCur; + } + Angles.clear(); + it = res.begin(); + for(; it!=res.end(); it++) + Angles.push_back( *it ); + } +} + + //======================================================================= //function : Transform //purpose : diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index 06896059b..b92b62686 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -85,6 +85,53 @@ struct SMESH_NodeSearcher virtual const SMDS_MeshNode* FindClosestTo( const gp_Pnt& pnt ) = 0; }; + +//======================================================================= +/*! + * auxiliary class + */ +//======================================================================= +class SMESH_MeshEditor_PathPoint { +public: + SMESH_MeshEditor_PathPoint() { + myPnt.SetCoord(99., 99., 99.); + myTgt.SetCoord(1.,0.,0.); + myAngle=0.; + myPrm=0.; + } + void SetPnt(const gp_Pnt& aP3D){ + myPnt=aP3D; + } + void SetTangent(const gp_Dir& aTgt){ + myTgt=aTgt; + } + void SetAngle(const double& aBeta){ + myAngle=aBeta; + } + void SetParameter(const double& aPrm){ + myPrm=aPrm; + } + const gp_Pnt& Pnt()const{ + return myPnt; + } + const gp_Dir& Tangent()const{ + return myTgt; + } + double Angle()const{ + return myAngle; + } + double Parameter()const{ + return myPrm; + } + +protected: + gp_Pnt myPnt; + gp_Dir myTgt; + double myAngle; + double myPrm; +}; + + // ============================================================ /*! * \brief Editor of a mesh @@ -292,6 +339,16 @@ public: const SMDS_MeshNode* theNodeStart, const bool theHasAngles, std::list& theAngles, + const bool theLinearVariation, + const bool theHasRefPoint, + const gp_Pnt& theRefPoint, + const bool theMakeGroups); + Extrusion_Error ExtrusionAlongTrack (TIDSortedElemSet & theElements, + SMESH_Mesh* theTrackPattern, + const SMDS_MeshNode* theNodeStart, + const bool theHasAngles, + std::list& theAngles, + const bool theLinearVariation, const bool theHasRefPoint, const gp_Pnt& theRefPoint, const bool theMakeGroups); @@ -583,6 +640,25 @@ private: TIDSortedElemSet& elemSet, const int nbSteps, SMESH_SequenceOfElemPtr& srcElements); + + /*! + * auxilary for ExtrusionAlongTrack + */ + Extrusion_Error MakeEdgePathPoints(std::list& aPrms, + const TopoDS_Edge& aTrackEdge, + bool FirstIsStart, + list& LPP); + Extrusion_Error MakeExtrElements(TIDSortedElemSet& theElements, + list& fullList, + const bool theHasAngles, + list& theAngles, + const bool theLinearVariation, + const bool theHasRefPoint, + const gp_Pnt& theRefPoint, + const bool theMakeGroups); + void LinearAngleVariation(const int NbSteps, + list& theAngles); + private: SMESH_Mesh * myMesh; diff --git a/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx b/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx index a9af10b76..8d1d9c300 100644 --- a/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx @@ -186,15 +186,6 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod PathMeshLineEdit = new QLineEdit(PathGrp); PathMeshLineEdit->setReadOnly(true); - // Controls for path shape selection - QLabel* PathShapeLab = new QLabel(tr("SMESH_PATH_SHAPE"), PathGrp); - - SelectPathShapeButton = new QToolButton(PathGrp); - SelectPathShapeButton->setIcon(selectImage); - - PathShapeLineEdit = new QLineEdit(PathGrp); - PathShapeLineEdit->setReadOnly(true); - // Controls for path starting point selection QLabel* StartPointLab = new QLabel(tr("SMESH_PATH_START"), PathGrp); @@ -208,12 +199,9 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod PathGrpLayout->addWidget(PathMeshLab, 0, 0); PathGrpLayout->addWidget(SelectPathMeshButton, 0, 1); PathGrpLayout->addWidget(PathMeshLineEdit, 0, 2); - PathGrpLayout->addWidget(PathShapeLab, 1, 0); - PathGrpLayout->addWidget(SelectPathShapeButton, 1, 1); - PathGrpLayout->addWidget(PathShapeLineEdit, 1, 2); - PathGrpLayout->addWidget(StartPointLab, 2, 0); - PathGrpLayout->addWidget(SelectStartPointButton, 2, 1); - PathGrpLayout->addWidget(StartPointLineEdit, 2, 2); + PathGrpLayout->addWidget(StartPointLab, 1, 0); + PathGrpLayout->addWidget(SelectStartPointButton, 1, 1); + PathGrpLayout->addWidget(StartPointLineEdit, 1, 2); BasePointGrp = new QGroupBox(tr("SMESH_BASE_POINT"), GroupArguments); BasePointGrp->setCheckable(true); @@ -337,7 +325,8 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter); myElementsFilter = new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR); - myPathMeshFilter = new SMESH_TypeFilter (MESH); + //myPathMeshFilter = new SMESH_TypeFilter (MESH); + myPathMeshFilter = new SMESH_TypeFilter(MESHorSUBMESH); myHelpFileName = "extrusion_along_path_page.html"; @@ -357,7 +346,6 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod connect(SelectElementsButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(SelectPathMeshButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(SelectPathShapeButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(SelectStartPointButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(SelectBasePointButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); @@ -405,12 +393,10 @@ void SMESHGUI_ExtrusionAlongPathDlg::Init (bool ResetControls) myMesh = SMESH::SMESH_Mesh::_nil(); myIDSource = SMESH::SMESH_IDSource::_nil(); myMeshActor = 0; - myPathMesh = SMESH::SMESH_Mesh::_nil(); - myPathShape = GEOM::GEOM_Object::_nil(); + myPath = SMESH::SMESH_IDSource::_nil(); ElementsLineEdit->clear(); PathMeshLineEdit->clear(); - PathShapeLineEdit->clear(); StartPointLineEdit->clear(); if (ResetControls) { @@ -483,8 +469,10 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() if (mySMESHGUI->isActiveStudyLocked()) return false; - if (myMesh->_is_nil() || MeshCheck->isChecked() && myIDSource->_is_nil() || - !myMeshActor || myPathMesh->_is_nil() || myPathShape->_is_nil()) + //if (myMesh->_is_nil() || MeshCheck->isChecked() && myIDSource->_is_nil() || + // !myMeshActor || myPathMesh->_is_nil() || myPathShape->_is_nil()) + if ( myMesh->_is_nil() || MeshCheck->isChecked() && myIDSource->_is_nil() || + !myMeshActor || myPath->_is_nil() ) return false; if (!isValid()) @@ -563,10 +551,12 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() try { SUIT_OverrideCursor wc; SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - if ( LinearAnglesCheck->isChecked() ) - anAngles = aMeshEditor->LinearAnglesVariation( myPathMesh, myPathShape, anAngles ); + //if ( LinearAnglesCheck->isChecked() ) { + // anAngles = aMeshEditor->LinearAnglesVariation( myPathMesh, myPathShape, anAngles ); + //} SMESH::SMESH_MeshEditor::Extrusion_Error retVal; + /* if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) { if( MeshCheck->isChecked() ) { if( GetConstructorId() == 0 ) @@ -608,6 +598,27 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() AnglesGrp->isChecked(), anAngles, BasePointGrp->isChecked(), aBasePoint); } + */ + + bool NeedGroups = ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ); + SMESH::ElementType ElemType = SMESH::FACE; + if( GetConstructorId() == 0 ) + ElemType = SMESH::EDGE; + if( !MeshCheck->isChecked() ) { + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionAlongPathX(anElementsId, myPath, aNodeStart, AnglesGrp->isChecked(), + anAngles, LinearAnglesCheck->isChecked(), + BasePointGrp->isChecked(), aBasePoint, + NeedGroups, ElemType, retVal); + } + else { + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionAlongPathObjX(myIDSource, myPath, aNodeStart, AnglesGrp->isChecked(), + anAngles, LinearAnglesCheck->isChecked(), + BasePointGrp->isChecked(), aBasePoint, + NeedGroups, ElemType, retVal); + } + if( retVal == SMESH::SMESH_MeshEditor::EXTR_OK ) myMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) ); @@ -767,10 +778,11 @@ void SMESHGUI_ExtrusionAlongPathDlg::onTextChange (const QString& theNewText) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->highlight( anIO, true, true ); } - } else if (send == StartPointLineEdit && + } + else if (send == StartPointLineEdit && myEditCurrentArgument == StartPointLineEdit) { - if (!myPathMesh->_is_nil()) { - SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh); + if (!myPath->_is_nil()) { + SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath); SMDS_Mesh* aMesh = 0; if (aPathActor) aMesh = aPathActor->GetObject()->GetMesh(); @@ -862,57 +874,37 @@ void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument() SMESH::GetNameOfSelectedElements(mySelector, IO, aString); ElementsLineEdit->setText(aString); } - } else if (myEditCurrentArgument == PathMeshLineEdit) { + } + else if (myEditCurrentArgument == PathMeshLineEdit) { // we are now selecting path mesh // reset PathMeshLineEdit->clear(); - myPathMesh = SMESH::SMESH_Mesh::_nil(); - PathShapeLineEdit->clear(); - myPathShape = GEOM::GEOM_Object::_nil(); + myPath = SMESH::SMESH_IDSource::_nil(); StartPointLineEdit->clear(); - + // try to get mesh from selection Handle(SALOME_InteractiveObject) IO = aList.First(); - myPathMesh = SMESH::IObjectToInterface(IO); - if(myPathMesh->_is_nil()) + myPath = SMESH::IObjectToInterface(IO); + if( myPath->_is_nil() ) return; - + QString aString; SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); PathMeshLineEdit->setText(aString); - } else if (myEditCurrentArgument == PathShapeLineEdit) { - // we are now selecting path mesh - // reset - PathShapeLineEdit->clear(); - myPathShape = GEOM::GEOM_Object::_nil(); - StartPointLineEdit->clear(); - - // return if path mesh is not yet selected - if (myPathMesh->_is_nil()) - return; - - // try to get shape from selection - Handle(SALOME_InteractiveObject) IO = aList.First(); - myPathShape = SMESH::IObjectToInterface(IO); - if (myPathShape->_is_nil()) - return; - - QString aString; - SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); - PathShapeLineEdit->setText(aString); - } else if (myEditCurrentArgument == StartPointLineEdit) { + } + else if (myEditCurrentArgument == StartPointLineEdit) { // we are now selecting start point of path // reset StartPointLineEdit->clear(); // return if path mesh or path shape is not yet selected - if (myPathMesh->_is_nil() || myPathShape->_is_nil()) + if( myPath->_is_nil() ) return; // try to get shape from selection Handle(SALOME_InteractiveObject) IO = aList.First(); - SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh); + SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath); if ( !aPathActor ) return; @@ -983,7 +975,6 @@ void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument() QToolButton* send = (QToolButton*)sender(); if (send != SelectElementsButton && send != SelectPathMeshButton && - send != SelectPathShapeButton && send != SelectStartPointButton && send != SelectBasePointButton) return; @@ -1027,26 +1018,11 @@ void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument (QToolButton* button aViewWindow->SetSelectionMode(ActorSelection); mySelectionMgr->installFilter(myPathMeshFilter); } - else if (button == SelectPathShapeButton) { - myEditCurrentArgument = PathShapeLineEdit; - SMESH::SetPointRepresentation(false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - - if (!myPathMesh->_is_nil()) { - GEOM::GEOM_Object_var aMainShape = myPathMesh->GetShapeToMesh(); - SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh); - - if (!aMainShape->_is_nil() && aPathActor) - mySelectionMgr->installFilter(new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE, -1, - TopAbs_EDGE, aMainShape)); - //SMESH::SetPickable(aPathActor); - } - } else if (button == SelectStartPointButton) { myEditCurrentArgument = StartPointLineEdit; - if (!myPathMesh->_is_nil()) { - SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh); + //if (!myPathMesh->_is_nil()) { + if (!myPath->_is_nil()) { + SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath); if (aPathActor) { SMESH::SetPointRepresentation(true); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) diff --git a/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.h b/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.h index 5d70d6306..e93985ae1 100644 --- a/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.h +++ b/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.h @@ -94,8 +94,9 @@ private: SMESH::SMESH_Mesh_var myMesh; SMESH_Actor* myMeshActor; SMESH::SMESH_IDSource_var myIDSource; - SMESH::SMESH_Mesh_var myPathMesh; - GEOM::GEOM_Object_var myPathShape; + //SMESH::SMESH_Mesh_var myPathMesh; + SMESH::SMESH_IDSource_var myPath; + //GEOM::GEOM_Object_var myPathShape; SUIT_SelectionFilter* myElementsFilter; SUIT_SelectionFilter* myPathMeshFilter; int myType; @@ -115,8 +116,8 @@ private: QGroupBox* PathGrp; QToolButton* SelectPathMeshButton; QLineEdit* PathMeshLineEdit; - QToolButton* SelectPathShapeButton; - QLineEdit* PathShapeLineEdit; + //QToolButton* SelectPathShapeButton; + //QLineEdit* PathShapeLineEdit; QToolButton* SelectStartPointButton; QLineEdit* StartPointLineEdit; QCheckBox* LinearAnglesCheck; diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index 3668a6aac..27f0d1453 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -3497,7 +3497,7 @@ Please select a groups and try again SMESH_PATH_MESH - Mesh + Mesh or submesh SMESH_PATH_SHAPE diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index a68bd8fb2..0463ee5d2 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -34,6 +34,8 @@ #include "SMESH_subMeshEventListener.hxx" #include "SMESH_Gen_i.hxx" #include "SMESH_Filter_i.hxx" +#include "SMESH_subMesh_i.hxx" +#include "SMESH_Group_i.hxx" #include "SMESH_PythonDump.hxx" #include "utilities.h" @@ -1996,7 +1998,7 @@ SMESH_MeshEditor_i::extrusionAlongPath(const SMESH::long_array & theIDsOfEleme ::SMESH_MeshEditor anEditor( myMesh ); ::SMESH_MeshEditor::Extrusion_Error error = anEditor.ExtrusionAlongTrack( elements, aSubMesh, nodeStart, - theHasAngles, angles, + theHasAngles, angles, false, theHasRefPoint, refPnt, theMakeGroups ); storeResult(anEditor); theError = convExtrError( error ); @@ -2011,6 +2013,105 @@ SMESH_MeshEditor_i::extrusionAlongPath(const SMESH::long_array & theIDsOfEleme return 0; } + +//======================================================================= +//function : extrusionAlongPathX +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::extrusionAlongPathX(const SMESH::long_array & IDsOfElements, + SMESH::SMESH_IDSource_ptr Path, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array& Angles, + CORBA::Boolean LinearVariation, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct& RefPoint, + const bool MakeGroups, + const SMDSAbs_ElementType ElementType, + SMESH::SMESH_MeshEditor::Extrusion_Error & Error) +{ + SMESH::ListOfGroups* EmptyGr = new SMESH::ListOfGroups; + + initData(); + + list angles; + for (int i = 0; i < Angles.length(); i++) { + angles.push_back( Angles[i] ); + } + gp_Pnt refPnt( RefPoint.x, RefPoint.y, RefPoint.z ); + int nbOldGroups = myMesh->NbGroup(); + + if ( Path->_is_nil() ) { + Error = SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE; + return EmptyGr; + } + + TIDSortedElemSet elements; + arrayToSet(IDsOfElements, GetMeshDS(), elements, ElementType); + + ::SMESH_MeshEditor anEditor( myMesh ); + ::SMESH_MeshEditor::Extrusion_Error error; + + SMESH_Mesh_i* aMeshImp = SMESH::DownCast( Path ); + if(aMeshImp) { + // path as mesh + SMDS_MeshNode* aNodeStart = + (SMDS_MeshNode*)aMeshImp->GetImpl().GetMeshDS()->FindNode(NodeStart); + if ( !aNodeStart ) { + Error = SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE; + return EmptyGr; + } + error = anEditor.ExtrusionAlongTrack( elements, &(aMeshImp->GetImpl()), aNodeStart, + HasAngles, angles, LinearVariation, + HasRefPoint, refPnt, MakeGroups ); + } + else { + SMESH_subMesh_i* aSubMeshImp = SMESH::DownCast( Path ); + if(aSubMeshImp) { + // path as submesh + SMESH::SMESH_Mesh_ptr aPathMesh = aSubMeshImp->GetFather(); + aMeshImp = SMESH::DownCast( aPathMesh ); + SMDS_MeshNode* aNodeStart = + (SMDS_MeshNode*)aMeshImp->GetImpl().GetMeshDS()->FindNode(NodeStart); + if ( !aNodeStart ) { + Error = SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE; + return EmptyGr; + } + SMESH_subMesh* aSubMesh = + aMeshImp->GetImpl().GetSubMeshContaining(aSubMeshImp->GetId()); + error = anEditor.ExtrusionAlongTrack( elements, aSubMesh, aNodeStart, + HasAngles, angles, LinearVariation, + HasRefPoint, refPnt, MakeGroups ); + } + else { + SMESH_Group_i* aGroupImp = SMESH::DownCast( Path ); + if(aGroupImp) { + // path as group of 1D elements + } + else { + // invalid path + Error = SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE; + return EmptyGr; + } + } + } + + storeResult(anEditor); + Error = convExtrError( error ); + + if ( MakeGroups ) { + list groupIDs = myMesh->GetGroupIds(); + list::iterator newBegin = groupIDs.begin(); + std::advance( newBegin, nbOldGroups ); // skip old groups + groupIDs.erase( groupIDs.begin(), newBegin ); + return getGroups( & groupIDs ); + } + return EmptyGr; +} + + //======================================================================= //function : ExtrusionAlongPath //purpose : @@ -2409,6 +2510,124 @@ ExtrusionAlongPathObject2DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, return aGroups; } + +//======================================================================= +//function : ExtrusionAlongPathObjX +//purpose : +//======================================================================= +SMESH::ListOfGroups* SMESH_MeshEditor_i:: +ExtrusionAlongPathObjX(SMESH::SMESH_IDSource_ptr Object, + SMESH::SMESH_IDSource_ptr Path, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array& Angles, + CORBA::Boolean LinearVariation, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct& RefPoint, + CORBA::Boolean MakeGroups, + SMESH::ElementType ElemType, + SMESH::SMESH_MeshEditor::Extrusion_Error& Error) +{ + SMESH::long_array_var anElementsId = Object->GetIDs(); + SMESH::ListOfGroups * aGroups = extrusionAlongPathX(anElementsId, + Path, + NodeStart, + HasAngles, + Angles, + LinearVariation, + HasRefPoint, + RefPoint, + MakeGroups, + (SMDSAbs_ElementType)ElemType, + Error); + + if ( !myPreviewMode ) { + bool isDumpGroups = aGroups && aGroups->length() > 0; + TPythonDump aPythonDump; + if(isDumpGroups) { + aPythonDump << "("<length() > 0; + TPythonDump aPythonDump; + if(isDumpGroups) { + aPythonDump << "("<