mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-25 08:50:35 +05:00
Implementation of new version ExtrusionAlongPath (20003 from Mantis).
This commit is contained in:
parent
6a528ce128
commit
34fb01e7b5
BIN
doc/salome/gui/SMESH/images/extr_along_wire_after.png
Normal file
BIN
doc/salome/gui/SMESH/images/extr_along_wire_after.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.1 KiB |
BIN
doc/salome/gui/SMESH/images/extr_along_wire_before.png
Normal file
BIN
doc/salome/gui/SMESH/images/extr_along_wire_before.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.0 KiB |
Binary file not shown.
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 37 KiB |
@ -4,13 +4,14 @@
|
|||||||
|
|
||||||
\n In principle, <b>Extrusion along a path</b> works in the same way
|
\n In principle, <b>Extrusion along a path</b> works in the same way
|
||||||
as \b Extrusion, the main difference is that we define not a vector,
|
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
|
but a path of extrusion which must be a 1D mesh or 1D sub-mesh. To
|
||||||
how this algorithm works, examine several examples, starting from the
|
get an idea of how this algorithm works, examine several examples,
|
||||||
most simple case of extrusion along a straight edge. In all examples
|
starting from the most simple case of extrusion along a straight edge.
|
||||||
the same mesh will be extruded along different paths and with
|
In following examples the meshes will be extruded along different
|
||||||
different parameters. This sample 2D mesh has two quadrangle faces and
|
paths and with different parameters.
|
||||||
seven edges. Look at the picture, where white digits are the node
|
This sample 2D mesh has two quadrangle faces and seven edges. Look
|
||||||
numbers and green are the element numbers:
|
at the picture, where white digits are the node numbers and green
|
||||||
|
are the element numbers:
|
||||||
|
|
||||||
\image html mesh_for_extr_along_path.png
|
\image html mesh_for_extr_along_path.png
|
||||||
|
|
||||||
@ -40,29 +41,15 @@ been selected as <b>Start node</b>.</center>
|
|||||||
\image html curvi_angles_after.png
|
\image html curvi_angles_after.png
|
||||||
<center>The same, but using angles {45, 45, 45, 0, -45, -45, -45}</center>
|
<center>The same, but using angles {45, 45, 45, 0, -45, -45, -45}</center>
|
||||||
|
|
||||||
<br><center><h2>Extrusion along a sub-mesh</h2></center>
|
<br><center><h2>Extrusion of 2d face along a mesh builds on wire</h2></center>
|
||||||
|
|
||||||
In this example the path mesh has been built on a wire (polyline with
|
In this example the path mesh has been built on a wire contains 3
|
||||||
six edges). The first edge of the wire was used as <b>Shape (edge)</b>, node
|
edges. Node #1 is used as start node. Linear angle variation by 180
|
||||||
#1 as <b>Start node</b>. The angles have been defined as {10, 10, 10}. The
|
degree is applied.
|
||||||
middle edge (#4) of the initial mesh has been extruded.
|
|
||||||
|
|
||||||
\image html edge_wire_before.png
|
\image html extr_along_wire_before.png
|
||||||
|
|
||||||
\image html edge_wire_after.png
|
\image html extr_along_wire_after.png
|
||||||
|
|
||||||
<br><center><h2>Extrusion of 2d elements along a sub-mesh</h2></center>
|
|
||||||
|
|
||||||
This extrusion bases on the same path mesh as in the previous example
|
|
||||||
but the third edge of the wire was set as <b>Shape (edge)</b> and node
|
|
||||||
#4 as <b>Start node</b>. 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
|
|
||||||
|
|
||||||
<br><center><h2>Extrusion of 2d elements along a closed path</h2></center>
|
<br><center><h2>Extrusion of 2d elements along a closed path</h2></center>
|
||||||
|
|
||||||
@ -113,9 +100,8 @@ about filters in the \ref selection_filter_library_page "Selection filter librar
|
|||||||
<li>define the Path along which the elements will be extruded,
|
<li>define the Path along which the elements will be extruded,
|
||||||
\n Path definition consists of several elements:
|
\n Path definition consists of several elements:
|
||||||
<ul>
|
<ul>
|
||||||
<li>\b Mesh - containing a 1D sub-mesh on the edge, along which proceeds the extrusion</li>
|
<li><b>Mesh or submesh</b> - 1D mesh or 1D sub-mesh, along which proceeds the extrusion</li>
|
||||||
<li><b>Shape (edge)</b> - as the mesh can be complex, the edge is used to define the sub-mesh for the path</li>
|
<li><b>Start node</b> - the start node. It is used to define the direction of extrusion </li>
|
||||||
<li><b>Start node</b> - the first or the last node on the edge. It is used to define the direction of extrusion </li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>activate <b>Generate Groups</b> checkbox if it is necessary to copy the groups of
|
<li>activate <b>Generate Groups</b> checkbox if it is necessary to copy the groups of
|
||||||
|
@ -392,6 +392,30 @@ module SMESH
|
|||||||
EXTR_CANT_GET_TANGENT
|
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,
|
Extrusion_Error ExtrusionAlongPath(in long_array IDsOfElements,
|
||||||
in SMESH_Mesh PathMesh,
|
in SMESH_Mesh PathMesh,
|
||||||
in GEOM::GEOM_Object PathShape,
|
in GEOM::GEOM_Object PathShape,
|
||||||
|
@ -59,6 +59,7 @@
|
|||||||
#include <TopExp_Explorer.hxx>
|
#include <TopExp_Explorer.hxx>
|
||||||
#include <TopTools_ListIteratorOfListOfShape.hxx>
|
#include <TopTools_ListIteratorOfListOfShape.hxx>
|
||||||
#include <TopTools_ListOfShape.hxx>
|
#include <TopTools_ListOfShape.hxx>
|
||||||
|
#include <TopTools_SequenceOfShape.hxx>
|
||||||
#include <TopoDS.hxx>
|
#include <TopoDS.hxx>
|
||||||
#include <TopoDS_Face.hxx>
|
#include <TopoDS_Face.hxx>
|
||||||
#include <gp.hxx>
|
#include <gp.hxx>
|
||||||
@ -3732,7 +3733,7 @@ SMESH_MeshEditor::ExtrusionSweep (TIDSortedElemSet & theElems,
|
|||||||
return newGroupIDs;
|
return newGroupIDs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//class : SMESH_MeshEditor_PathPoint
|
//class : SMESH_MeshEditor_PathPoint
|
||||||
//purpose : auxiliary class
|
//purpose : auxiliary class
|
||||||
@ -3776,6 +3777,7 @@ protected:
|
|||||||
double myAngle;
|
double myAngle;
|
||||||
double myPrm;
|
double myPrm;
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : ExtrusionAlongTrack
|
//function : ExtrusionAlongTrack
|
||||||
@ -3787,6 +3789,7 @@ SMESH_MeshEditor::Extrusion_Error
|
|||||||
const SMDS_MeshNode* theN1,
|
const SMDS_MeshNode* theN1,
|
||||||
const bool theHasAngles,
|
const bool theHasAngles,
|
||||||
list<double>& theAngles,
|
list<double>& theAngles,
|
||||||
|
const bool theLinearVariation,
|
||||||
const bool theHasRefPoint,
|
const bool theHasRefPoint,
|
||||||
const gp_Pnt& theRefPoint,
|
const gp_Pnt& theRefPoint,
|
||||||
const bool theMakeGroups)
|
const bool theMakeGroups)
|
||||||
@ -3794,20 +3797,11 @@ SMESH_MeshEditor::Extrusion_Error
|
|||||||
myLastCreatedElems.Clear();
|
myLastCreatedElems.Clear();
|
||||||
myLastCreatedNodes.Clear();
|
myLastCreatedNodes.Clear();
|
||||||
|
|
||||||
// source elements for each generated one
|
int aNbE;
|
||||||
SMESH_SequenceOfElemPtr srcElems, srcNodes;
|
|
||||||
|
|
||||||
int j, aNbTP, aNbE, aNb;
|
|
||||||
double aT1, aT2, aT, aAngle, aX, aY, aZ;
|
|
||||||
std::list<double> aPrms;
|
std::list<double> aPrms;
|
||||||
std::list<double>::iterator aItD;
|
|
||||||
TIDSortedElemSet::iterator itElem;
|
TIDSortedElemSet::iterator itElem;
|
||||||
|
|
||||||
Standard_Real aTx1, aTx2, aL2, aTolVec, aTolVec2;
|
|
||||||
gp_Pnt aP3D, aV0;
|
|
||||||
gp_Vec aVec;
|
|
||||||
gp_XYZ aGC;
|
gp_XYZ aGC;
|
||||||
Handle(Geom_Curve) aC3D;
|
|
||||||
TopoDS_Edge aTrackEdge;
|
TopoDS_Edge aTrackEdge;
|
||||||
TopoDS_Vertex aV1, aV2;
|
TopoDS_Vertex aV1, aV2;
|
||||||
|
|
||||||
@ -3816,11 +3810,6 @@ SMESH_MeshEditor::Extrusion_Error
|
|||||||
SMDSAbs_ElementType aTypeE;
|
SMDSAbs_ElementType aTypeE;
|
||||||
|
|
||||||
TNodeOfNodeListMap mapNewNodes;
|
TNodeOfNodeListMap mapNewNodes;
|
||||||
TElemOfVecOfNnlmiMap mapElemNewNodes;
|
|
||||||
TElemOfElemListMap newElemsMap;
|
|
||||||
|
|
||||||
aTolVec=1.e-7;
|
|
||||||
aTolVec2=aTolVec*aTolVec;
|
|
||||||
|
|
||||||
// 1. Check data
|
// 1. Check data
|
||||||
aNbE = theElements.size();
|
aNbE = theElements.size();
|
||||||
@ -3831,7 +3820,7 @@ SMESH_MeshEditor::Extrusion_Error
|
|||||||
// 1.1 Track Pattern
|
// 1.1 Track Pattern
|
||||||
ASSERT( theTrack );
|
ASSERT( theTrack );
|
||||||
|
|
||||||
SMESHDS_SubMesh* pSubMeshDS=theTrack->GetSubMeshDS();
|
SMESHDS_SubMesh* pSubMeshDS = theTrack->GetSubMeshDS();
|
||||||
|
|
||||||
aItE = pSubMeshDS->GetElements();
|
aItE = pSubMeshDS->GetElements();
|
||||||
while ( aItE->more() ) {
|
while ( aItE->more() ) {
|
||||||
@ -3842,63 +3831,325 @@ SMESH_MeshEditor::Extrusion_Error
|
|||||||
return EXTR_PATH_NOT_EDGE;
|
return EXTR_PATH_NOT_EDGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
const TopoDS_Shape& aS = theTrack->GetSubShape();
|
list<SMESH_MeshEditor_PathPoint> fullList;
|
||||||
// Sub shape for the Pattern must be an Edge
|
|
||||||
if ( aS.ShapeType() != TopAbs_EDGE )
|
|
||||||
return EXTR_BAD_PATH_SHAPE;
|
|
||||||
|
|
||||||
|
const TopoDS_Shape& aS = theTrack->GetSubShape();
|
||||||
|
// Sub shape for the Pattern must be an Edge or Wire
|
||||||
|
if( aS.ShapeType() == TopAbs_EDGE ) {
|
||||||
aTrackEdge = TopoDS::Edge( aS );
|
aTrackEdge = TopoDS::Edge( aS );
|
||||||
// the Edge must not be degenerated
|
// the Edge must not be degenerated
|
||||||
if ( BRep_Tool::Degenerated( aTrackEdge ) )
|
if ( BRep_Tool::Degenerated( aTrackEdge ) )
|
||||||
return EXTR_BAD_PATH_SHAPE;
|
return EXTR_BAD_PATH_SHAPE;
|
||||||
|
|
||||||
TopExp::Vertices( aTrackEdge, 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();
|
aItN = theTrack->GetFather()->GetSubMesh( aV1 )->GetSubMeshDS()->GetNodes();
|
||||||
const SMDS_MeshNode* aN1 = aItN->next();
|
const SMDS_MeshNode* aN1 = aItN->next();
|
||||||
|
|
||||||
aItN = theTrack->GetFather()->GetSubMesh( aV2 )->GetSubMeshDS()->GetNodes();
|
aItN = theTrack->GetFather()->GetSubMesh( aV2 )->GetSubMeshDS()->GetNodes();
|
||||||
const SMDS_MeshNode* aN2 = aItN->next();
|
const SMDS_MeshNode* aN2 = aItN->next();
|
||||||
|
|
||||||
// starting node must be aN1 or aN2
|
// starting node must be aN1 or aN2
|
||||||
if ( !( aN1 == theN1 || aN2 == theN1 ) )
|
if ( !( aN1 == theN1 || aN2 == theN1 ) )
|
||||||
return EXTR_BAD_STARTING_NODE;
|
return EXTR_BAD_STARTING_NODE;
|
||||||
|
|
||||||
aNbTP = pSubMeshDS->NbNodes() + 2;
|
|
||||||
|
|
||||||
// 1.2. Angles
|
|
||||||
vector<double> aAngles( aNbTP );
|
|
||||||
|
|
||||||
for ( j=0; j < aNbTP; ++j ) {
|
|
||||||
aAngles[j] = 0.;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( theHasAngles ) {
|
|
||||||
aItD = theAngles.begin();
|
|
||||||
for ( j=1; (aItD != theAngles.end()) && (j<aNbTP); ++aItD, ++j ) {
|
|
||||||
aAngle = *aItD;
|
|
||||||
aAngles[j] = aAngle;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Collect parameters on the track edge
|
|
||||||
aPrms.push_back( aT1 );
|
|
||||||
aPrms.push_back( aT2 );
|
|
||||||
|
|
||||||
aItN = pSubMeshDS->GetNodes();
|
aItN = pSubMeshDS->GetNodes();
|
||||||
while ( aItN->more() ) {
|
while ( aItN->more() ) {
|
||||||
const SMDS_MeshNode* pNode = aItN->next();
|
const SMDS_MeshNode* pNode = aItN->next();
|
||||||
const SMDS_EdgePosition* pEPos =
|
const SMDS_EdgePosition* pEPos =
|
||||||
static_cast<const SMDS_EdgePosition*>( pNode->GetPosition().get() );
|
static_cast<const SMDS_EdgePosition*>( pNode->GetPosition().get() );
|
||||||
aT = pEPos->GetUParameter();
|
double aT = pEPos->GetUParameter();
|
||||||
aPrms.push_back( aT );
|
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<SMESH_MeshEditor_PathPoint> > 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<const SMDS_EdgePosition*>( pNode->GetPosition().get() );
|
||||||
|
double aT = pEPos->GetUParameter();
|
||||||
|
aPrms.push_back( aT );
|
||||||
|
}
|
||||||
|
list<SMESH_MeshEditor_PathPoint> 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<SMESH_MeshEditor_PathPoint> >::iterator itLLPP = LLPPs.begin();
|
||||||
|
list<SMESH_MeshEditor_PathPoint> firstList = *itLLPP;
|
||||||
|
list<SMESH_MeshEditor_PathPoint>::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<SMESH_MeshEditor_PathPoint> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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<double>& theAngles,
|
||||||
|
const bool theLinearVariation,
|
||||||
|
const bool theHasRefPoint,
|
||||||
|
const gp_Pnt& theRefPoint,
|
||||||
|
const bool theMakeGroups)
|
||||||
|
{
|
||||||
|
myLastCreatedElems.Clear();
|
||||||
|
myLastCreatedNodes.Clear();
|
||||||
|
|
||||||
|
int aNbE;
|
||||||
|
std::list<double> 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<SMESH_MeshEditor_PathPoint> 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<const SMDS_EdgePosition*>( 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<SMESH_MeshEditor_PathPoint> > 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<const SMDS_EdgePosition*>( pNode->GetPosition().get() );
|
||||||
|
double aT = pEPos->GetUParameter();
|
||||||
|
aPrms.push_back( aT );
|
||||||
|
}
|
||||||
|
list<SMESH_MeshEditor_PathPoint> 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<SMESH_MeshEditor_PathPoint> >::iterator itLLPP = LLPPs.begin();
|
||||||
|
list<SMESH_MeshEditor_PathPoint> firstList = *itLLPP;
|
||||||
|
list<SMESH_MeshEditor_PathPoint>::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<SMESH_MeshEditor_PathPoint> currList = *itLLPP;
|
||||||
|
itPP = currList.begin();
|
||||||
|
SMESH_MeshEditor_PathPoint PP2 = currList.front();
|
||||||
|
gp_Pnt P1 = PP1.Pnt();
|
||||||
|
//cout<<" PP1: Pnt("<<P1.X()<<","<<P1.Y()<<","<<P1.Z()<<")"<<endl;
|
||||||
|
gp_Pnt P2 = PP2.Pnt();
|
||||||
|
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!=currList.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MakeExtrElements(theElements, fullList, theHasAngles, theAngles, theLinearVariation,
|
||||||
|
theHasRefPoint, theRefPoint, theMakeGroups);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : MakeEdgePathPoints
|
||||||
|
//purpose : auxilary for ExtrusionAlongTrack
|
||||||
|
//=======================================================================
|
||||||
|
SMESH_MeshEditor::Extrusion_Error
|
||||||
|
SMESH_MeshEditor::MakeEdgePathPoints(std::list<double>& aPrms,
|
||||||
|
const TopoDS_Edge& aTrackEdge,
|
||||||
|
bool FirstIsStart,
|
||||||
|
list<SMESH_MeshEditor_PathPoint>& 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 );
|
||||||
|
// 2. Collect parameters on the track edge
|
||||||
|
aPrms.push_front( aT1 );
|
||||||
|
aPrms.push_back( aT2 );
|
||||||
// sort parameters
|
// sort parameters
|
||||||
aPrms.sort();
|
aPrms.sort();
|
||||||
if ( aN1 == theN1 ) {
|
if( FirstIsStart ) {
|
||||||
if ( aT1 > aT2 ) {
|
if ( aT1 > aT2 ) {
|
||||||
aPrms.reverse();
|
aPrms.reverse();
|
||||||
}
|
}
|
||||||
@ -3908,33 +4159,85 @@ SMESH_MeshEditor::Extrusion_Error
|
|||||||
aPrms.reverse();
|
aPrms.reverse();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. Path Points
|
// 3. Path Points
|
||||||
SMESH_MeshEditor_PathPoint aPP;
|
SMESH_MeshEditor_PathPoint aPP;
|
||||||
vector<SMESH_MeshEditor_PathPoint> aPPs( aNbTP );
|
Handle(Geom_Curve) aC3D = BRep_Tool::Curve( aTrackEdge, aTx1, aTx2 );
|
||||||
//
|
std::list<double>::iterator aItD = aPrms.begin();
|
||||||
aC3D = BRep_Tool::Curve( aTrackEdge, aTx1, aTx2 );
|
for(; aItD != aPrms.end(); ++aItD) {
|
||||||
//
|
double aT = *aItD;
|
||||||
aItD = aPrms.begin();
|
gp_Pnt aP3D;
|
||||||
for ( j=0; aItD != aPrms.end(); ++aItD, ++j ) {
|
gp_Vec aVec;
|
||||||
aT = *aItD;
|
|
||||||
aC3D->D1( aT, aP3D, aVec );
|
aC3D->D1( aT, aP3D, aVec );
|
||||||
aL2 = aVec.SquareMagnitude();
|
aL2 = aVec.SquareMagnitude();
|
||||||
if ( aL2 < aTolVec2 )
|
if ( aL2 < aTolVec2 )
|
||||||
return EXTR_CANT_GET_TANGENT;
|
return EXTR_CANT_GET_TANGENT;
|
||||||
|
|
||||||
gp_Dir aTgt( aVec );
|
gp_Dir aTgt( aVec );
|
||||||
aAngle = aAngles[j];
|
|
||||||
|
|
||||||
aPP.SetPnt( aP3D );
|
aPP.SetPnt( aP3D );
|
||||||
aPP.SetTangent( aTgt );
|
aPP.SetTangent( aTgt );
|
||||||
aPP.SetAngle( aAngle );
|
|
||||||
aPP.SetParameter( aT );
|
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<SMESH_MeshEditor_PathPoint>& fullList,
|
||||||
|
const bool theHasAngles,
|
||||||
|
list<double>& theAngles,
|
||||||
|
const bool theLinearVariation,
|
||||||
|
const bool theHasRefPoint,
|
||||||
|
const gp_Pnt& theRefPoint,
|
||||||
|
const bool theMakeGroups)
|
||||||
|
{
|
||||||
|
//cout<<"MakeExtrElements fullList.size() = "<<fullList.size()<<endl;
|
||||||
|
int aNbTP = fullList.size();
|
||||||
|
vector<SMESH_MeshEditor_PathPoint> aPPs(aNbTP);
|
||||||
|
// Angles
|
||||||
|
if( theHasAngles && theAngles.size()>0 && theLinearVariation ) {
|
||||||
|
LinearAngleVariation(aNbTP-1, theAngles);
|
||||||
|
}
|
||||||
|
vector<double> aAngles( aNbTP );
|
||||||
|
int j = 0;
|
||||||
|
for(; j<aNbTP; ++j) {
|
||||||
|
aAngles[j] = 0.;
|
||||||
|
}
|
||||||
|
if ( theHasAngles ) {
|
||||||
|
double anAngle;;
|
||||||
|
std::list<double>::iterator aItD = theAngles.begin();
|
||||||
|
for ( j=1; (aItD != theAngles.end()) && (j<aNbTP); ++aItD, ++j ) {
|
||||||
|
anAngle = *aItD;
|
||||||
|
aAngles[j] = anAngle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// fill vector of path points with angles
|
||||||
|
//aPPs.resize(fullList.size());
|
||||||
|
j = -1;
|
||||||
|
list<SMESH_MeshEditor_PathPoint>::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
|
// 3. Center of rotation aV0
|
||||||
aV0 = theRefPoint;
|
gp_Pnt aV0 = theRefPoint;
|
||||||
|
gp_XYZ aGC;
|
||||||
if ( !theHasRefPoint ) {
|
if ( !theHasRefPoint ) {
|
||||||
aNb = 0;
|
aNb = 0;
|
||||||
aGC.SetCoord( 0.,0.,0. );
|
aGC.SetCoord( 0.,0.,0. );
|
||||||
@ -4008,6 +4311,7 @@ SMESH_MeshEditor::Extrusion_Error
|
|||||||
const SMESH_MeshEditor_PathPoint& aPP0 = aPPs[0];
|
const SMESH_MeshEditor_PathPoint& aPP0 = aPPs[0];
|
||||||
aP0x = aPP0.Pnt();
|
aP0x = aPP0.Pnt();
|
||||||
aDT0x= aPP0.Tangent();
|
aDT0x= aPP0.Tangent();
|
||||||
|
//cout<<"j = 0 PP: Pnt("<<aP0x.X()<<","<<aP0x.Y()<<","<<aP0x.Z()<<")"<<endl;
|
||||||
|
|
||||||
for ( j = 1; j < aNbTP; ++j ) {
|
for ( j = 1; j < aNbTP; ++j ) {
|
||||||
const SMESH_MeshEditor_PathPoint& aPP1 = aPPs[j];
|
const SMESH_MeshEditor_PathPoint& aPP1 = aPPs[j];
|
||||||
@ -4116,6 +4420,56 @@ SMESH_MeshEditor::Extrusion_Error
|
|||||||
return EXTR_OK;
|
return EXTR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : LinearAngleVariation
|
||||||
|
//purpose : auxilary for ExtrusionAlongTrack
|
||||||
|
//=======================================================================
|
||||||
|
void SMESH_MeshEditor::LinearAngleVariation(const int nbSteps,
|
||||||
|
list<double>& Angles)
|
||||||
|
{
|
||||||
|
int nbAngles = Angles.size();
|
||||||
|
if( nbSteps > nbAngles ) {
|
||||||
|
vector<double> theAngles(nbAngles);
|
||||||
|
list<double>::iterator it = Angles.begin();
|
||||||
|
int i = -1;
|
||||||
|
for(; it!=Angles.end(); it++) {
|
||||||
|
i++;
|
||||||
|
theAngles[i] = (*it);
|
||||||
|
}
|
||||||
|
list<double> 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
|
//function : Transform
|
||||||
//purpose :
|
//purpose :
|
||||||
|
@ -85,6 +85,53 @@ struct SMESH_NodeSearcher
|
|||||||
virtual const SMDS_MeshNode* FindClosestTo( const gp_Pnt& pnt ) = 0;
|
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
|
* \brief Editor of a mesh
|
||||||
@ -292,6 +339,16 @@ public:
|
|||||||
const SMDS_MeshNode* theNodeStart,
|
const SMDS_MeshNode* theNodeStart,
|
||||||
const bool theHasAngles,
|
const bool theHasAngles,
|
||||||
std::list<double>& theAngles,
|
std::list<double>& 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<double>& theAngles,
|
||||||
|
const bool theLinearVariation,
|
||||||
const bool theHasRefPoint,
|
const bool theHasRefPoint,
|
||||||
const gp_Pnt& theRefPoint,
|
const gp_Pnt& theRefPoint,
|
||||||
const bool theMakeGroups);
|
const bool theMakeGroups);
|
||||||
@ -583,6 +640,25 @@ private:
|
|||||||
TIDSortedElemSet& elemSet,
|
TIDSortedElemSet& elemSet,
|
||||||
const int nbSteps,
|
const int nbSteps,
|
||||||
SMESH_SequenceOfElemPtr& srcElements);
|
SMESH_SequenceOfElemPtr& srcElements);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* auxilary for ExtrusionAlongTrack
|
||||||
|
*/
|
||||||
|
Extrusion_Error MakeEdgePathPoints(std::list<double>& aPrms,
|
||||||
|
const TopoDS_Edge& aTrackEdge,
|
||||||
|
bool FirstIsStart,
|
||||||
|
list<SMESH_MeshEditor_PathPoint>& LPP);
|
||||||
|
Extrusion_Error MakeExtrElements(TIDSortedElemSet& theElements,
|
||||||
|
list<SMESH_MeshEditor_PathPoint>& fullList,
|
||||||
|
const bool theHasAngles,
|
||||||
|
list<double>& theAngles,
|
||||||
|
const bool theLinearVariation,
|
||||||
|
const bool theHasRefPoint,
|
||||||
|
const gp_Pnt& theRefPoint,
|
||||||
|
const bool theMakeGroups);
|
||||||
|
void LinearAngleVariation(const int NbSteps,
|
||||||
|
list<double>& theAngles);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
SMESH_Mesh * myMesh;
|
SMESH_Mesh * myMesh;
|
||||||
|
@ -186,15 +186,6 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod
|
|||||||
PathMeshLineEdit = new QLineEdit(PathGrp);
|
PathMeshLineEdit = new QLineEdit(PathGrp);
|
||||||
PathMeshLineEdit->setReadOnly(true);
|
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
|
// Controls for path starting point selection
|
||||||
QLabel* StartPointLab = new QLabel(tr("SMESH_PATH_START"), PathGrp);
|
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(PathMeshLab, 0, 0);
|
||||||
PathGrpLayout->addWidget(SelectPathMeshButton, 0, 1);
|
PathGrpLayout->addWidget(SelectPathMeshButton, 0, 1);
|
||||||
PathGrpLayout->addWidget(PathMeshLineEdit, 0, 2);
|
PathGrpLayout->addWidget(PathMeshLineEdit, 0, 2);
|
||||||
PathGrpLayout->addWidget(PathShapeLab, 1, 0);
|
PathGrpLayout->addWidget(StartPointLab, 1, 0);
|
||||||
PathGrpLayout->addWidget(SelectPathShapeButton, 1, 1);
|
PathGrpLayout->addWidget(SelectStartPointButton, 1, 1);
|
||||||
PathGrpLayout->addWidget(PathShapeLineEdit, 1, 2);
|
PathGrpLayout->addWidget(StartPointLineEdit, 1, 2);
|
||||||
PathGrpLayout->addWidget(StartPointLab, 2, 0);
|
|
||||||
PathGrpLayout->addWidget(SelectStartPointButton, 2, 1);
|
|
||||||
PathGrpLayout->addWidget(StartPointLineEdit, 2, 2);
|
|
||||||
|
|
||||||
BasePointGrp = new QGroupBox(tr("SMESH_BASE_POINT"), GroupArguments);
|
BasePointGrp = new QGroupBox(tr("SMESH_BASE_POINT"), GroupArguments);
|
||||||
BasePointGrp->setCheckable(true);
|
BasePointGrp->setCheckable(true);
|
||||||
@ -337,7 +325,8 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod
|
|||||||
if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter);
|
if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter);
|
||||||
|
|
||||||
myElementsFilter = new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
|
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";
|
myHelpFileName = "extrusion_along_path_page.html";
|
||||||
|
|
||||||
@ -357,7 +346,6 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod
|
|||||||
|
|
||||||
connect(SelectElementsButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
|
connect(SelectElementsButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
|
||||||
connect(SelectPathMeshButton, 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(SelectStartPointButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
|
||||||
connect(SelectBasePointButton, 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();
|
myMesh = SMESH::SMESH_Mesh::_nil();
|
||||||
myIDSource = SMESH::SMESH_IDSource::_nil();
|
myIDSource = SMESH::SMESH_IDSource::_nil();
|
||||||
myMeshActor = 0;
|
myMeshActor = 0;
|
||||||
myPathMesh = SMESH::SMESH_Mesh::_nil();
|
myPath = SMESH::SMESH_IDSource::_nil();
|
||||||
myPathShape = GEOM::GEOM_Object::_nil();
|
|
||||||
|
|
||||||
ElementsLineEdit->clear();
|
ElementsLineEdit->clear();
|
||||||
PathMeshLineEdit->clear();
|
PathMeshLineEdit->clear();
|
||||||
PathShapeLineEdit->clear();
|
|
||||||
StartPointLineEdit->clear();
|
StartPointLineEdit->clear();
|
||||||
|
|
||||||
if (ResetControls) {
|
if (ResetControls) {
|
||||||
@ -483,8 +469,10 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply()
|
|||||||
if (mySMESHGUI->isActiveStudyLocked())
|
if (mySMESHGUI->isActiveStudyLocked())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (myMesh->_is_nil() || MeshCheck->isChecked() && myIDSource->_is_nil() ||
|
//if (myMesh->_is_nil() || MeshCheck->isChecked() && myIDSource->_is_nil() ||
|
||||||
!myMeshActor || myPathMesh->_is_nil() || myPathShape->_is_nil())
|
// !myMeshActor || myPathMesh->_is_nil() || myPathShape->_is_nil())
|
||||||
|
if ( myMesh->_is_nil() || MeshCheck->isChecked() && myIDSource->_is_nil() ||
|
||||||
|
!myMeshActor || myPath->_is_nil() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!isValid())
|
if (!isValid())
|
||||||
@ -563,10 +551,12 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply()
|
|||||||
try {
|
try {
|
||||||
SUIT_OverrideCursor wc;
|
SUIT_OverrideCursor wc;
|
||||||
SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
|
SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
|
||||||
if ( LinearAnglesCheck->isChecked() )
|
//if ( LinearAnglesCheck->isChecked() ) {
|
||||||
anAngles = aMeshEditor->LinearAnglesVariation( myPathMesh, myPathShape, anAngles );
|
// anAngles = aMeshEditor->LinearAnglesVariation( myPathMesh, myPathShape, anAngles );
|
||||||
|
//}
|
||||||
|
|
||||||
SMESH::SMESH_MeshEditor::Extrusion_Error retVal;
|
SMESH::SMESH_MeshEditor::Extrusion_Error retVal;
|
||||||
|
/*
|
||||||
if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) {
|
if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) {
|
||||||
if( MeshCheck->isChecked() ) {
|
if( MeshCheck->isChecked() ) {
|
||||||
if( GetConstructorId() == 0 )
|
if( GetConstructorId() == 0 )
|
||||||
@ -608,6 +598,27 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply()
|
|||||||
AnglesGrp->isChecked(), anAngles,
|
AnglesGrp->isChecked(), anAngles,
|
||||||
BasePointGrp->isChecked(), aBasePoint);
|
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 )
|
if( retVal == SMESH::SMESH_MeshEditor::EXTR_OK )
|
||||||
myMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) );
|
myMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) );
|
||||||
@ -767,10 +778,11 @@ void SMESHGUI_ExtrusionAlongPathDlg::onTextChange (const QString& theNewText)
|
|||||||
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
|
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
|
||||||
aViewWindow->highlight( anIO, true, true );
|
aViewWindow->highlight( anIO, true, true );
|
||||||
}
|
}
|
||||||
} else if (send == StartPointLineEdit &&
|
}
|
||||||
|
else if (send == StartPointLineEdit &&
|
||||||
myEditCurrentArgument == StartPointLineEdit) {
|
myEditCurrentArgument == StartPointLineEdit) {
|
||||||
if (!myPathMesh->_is_nil()) {
|
if (!myPath->_is_nil()) {
|
||||||
SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
|
SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath);
|
||||||
SMDS_Mesh* aMesh = 0;
|
SMDS_Mesh* aMesh = 0;
|
||||||
if (aPathActor)
|
if (aPathActor)
|
||||||
aMesh = aPathActor->GetObject()->GetMesh();
|
aMesh = aPathActor->GetObject()->GetMesh();
|
||||||
@ -862,57 +874,37 @@ void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument()
|
|||||||
SMESH::GetNameOfSelectedElements(mySelector, IO, aString);
|
SMESH::GetNameOfSelectedElements(mySelector, IO, aString);
|
||||||
ElementsLineEdit->setText(aString);
|
ElementsLineEdit->setText(aString);
|
||||||
}
|
}
|
||||||
} else if (myEditCurrentArgument == PathMeshLineEdit) {
|
}
|
||||||
|
else if (myEditCurrentArgument == PathMeshLineEdit) {
|
||||||
// we are now selecting path mesh
|
// we are now selecting path mesh
|
||||||
// reset
|
// reset
|
||||||
PathMeshLineEdit->clear();
|
PathMeshLineEdit->clear();
|
||||||
myPathMesh = SMESH::SMESH_Mesh::_nil();
|
myPath = SMESH::SMESH_IDSource::_nil();
|
||||||
PathShapeLineEdit->clear();
|
|
||||||
myPathShape = GEOM::GEOM_Object::_nil();
|
|
||||||
StartPointLineEdit->clear();
|
StartPointLineEdit->clear();
|
||||||
|
|
||||||
// try to get mesh from selection
|
// try to get mesh from selection
|
||||||
Handle(SALOME_InteractiveObject) IO = aList.First();
|
Handle(SALOME_InteractiveObject) IO = aList.First();
|
||||||
myPathMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO);
|
myPath = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
|
||||||
if(myPathMesh->_is_nil())
|
if( myPath->_is_nil() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QString aString;
|
QString aString;
|
||||||
SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
|
SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
|
||||||
PathMeshLineEdit->setText(aString);
|
PathMeshLineEdit->setText(aString);
|
||||||
} else if (myEditCurrentArgument == PathShapeLineEdit) {
|
}
|
||||||
// we are now selecting path mesh
|
else if (myEditCurrentArgument == StartPointLineEdit) {
|
||||||
// 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<GEOM::GEOM_Object>(IO);
|
|
||||||
if (myPathShape->_is_nil())
|
|
||||||
return;
|
|
||||||
|
|
||||||
QString aString;
|
|
||||||
SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
|
|
||||||
PathShapeLineEdit->setText(aString);
|
|
||||||
} else if (myEditCurrentArgument == StartPointLineEdit) {
|
|
||||||
// we are now selecting start point of path
|
// we are now selecting start point of path
|
||||||
// reset
|
// reset
|
||||||
StartPointLineEdit->clear();
|
StartPointLineEdit->clear();
|
||||||
|
|
||||||
// return if path mesh or path shape is not yet selected
|
// return if path mesh or path shape is not yet selected
|
||||||
if (myPathMesh->_is_nil() || myPathShape->_is_nil())
|
if( myPath->_is_nil() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// try to get shape from selection
|
// try to get shape from selection
|
||||||
Handle(SALOME_InteractiveObject) IO = aList.First();
|
Handle(SALOME_InteractiveObject) IO = aList.First();
|
||||||
|
|
||||||
SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
|
SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath);
|
||||||
if ( !aPathActor )
|
if ( !aPathActor )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -983,7 +975,6 @@ void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument()
|
|||||||
QToolButton* send = (QToolButton*)sender();
|
QToolButton* send = (QToolButton*)sender();
|
||||||
if (send != SelectElementsButton &&
|
if (send != SelectElementsButton &&
|
||||||
send != SelectPathMeshButton &&
|
send != SelectPathMeshButton &&
|
||||||
send != SelectPathShapeButton &&
|
|
||||||
send != SelectStartPointButton &&
|
send != SelectStartPointButton &&
|
||||||
send != SelectBasePointButton)
|
send != SelectBasePointButton)
|
||||||
return;
|
return;
|
||||||
@ -1027,26 +1018,11 @@ void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument (QToolButton* button
|
|||||||
aViewWindow->SetSelectionMode(ActorSelection);
|
aViewWindow->SetSelectionMode(ActorSelection);
|
||||||
mySelectionMgr->installFilter(myPathMeshFilter);
|
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) {
|
else if (button == SelectStartPointButton) {
|
||||||
myEditCurrentArgument = StartPointLineEdit;
|
myEditCurrentArgument = StartPointLineEdit;
|
||||||
if (!myPathMesh->_is_nil()) {
|
//if (!myPathMesh->_is_nil()) {
|
||||||
SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
|
if (!myPath->_is_nil()) {
|
||||||
|
SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath);
|
||||||
if (aPathActor) {
|
if (aPathActor) {
|
||||||
SMESH::SetPointRepresentation(true);
|
SMESH::SetPointRepresentation(true);
|
||||||
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
|
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
|
||||||
|
@ -94,8 +94,9 @@ private:
|
|||||||
SMESH::SMESH_Mesh_var myMesh;
|
SMESH::SMESH_Mesh_var myMesh;
|
||||||
SMESH_Actor* myMeshActor;
|
SMESH_Actor* myMeshActor;
|
||||||
SMESH::SMESH_IDSource_var myIDSource;
|
SMESH::SMESH_IDSource_var myIDSource;
|
||||||
SMESH::SMESH_Mesh_var myPathMesh;
|
//SMESH::SMESH_Mesh_var myPathMesh;
|
||||||
GEOM::GEOM_Object_var myPathShape;
|
SMESH::SMESH_IDSource_var myPath;
|
||||||
|
//GEOM::GEOM_Object_var myPathShape;
|
||||||
SUIT_SelectionFilter* myElementsFilter;
|
SUIT_SelectionFilter* myElementsFilter;
|
||||||
SUIT_SelectionFilter* myPathMeshFilter;
|
SUIT_SelectionFilter* myPathMeshFilter;
|
||||||
int myType;
|
int myType;
|
||||||
@ -115,8 +116,8 @@ private:
|
|||||||
QGroupBox* PathGrp;
|
QGroupBox* PathGrp;
|
||||||
QToolButton* SelectPathMeshButton;
|
QToolButton* SelectPathMeshButton;
|
||||||
QLineEdit* PathMeshLineEdit;
|
QLineEdit* PathMeshLineEdit;
|
||||||
QToolButton* SelectPathShapeButton;
|
//QToolButton* SelectPathShapeButton;
|
||||||
QLineEdit* PathShapeLineEdit;
|
//QLineEdit* PathShapeLineEdit;
|
||||||
QToolButton* SelectStartPointButton;
|
QToolButton* SelectStartPointButton;
|
||||||
QLineEdit* StartPointLineEdit;
|
QLineEdit* StartPointLineEdit;
|
||||||
QCheckBox* LinearAnglesCheck;
|
QCheckBox* LinearAnglesCheck;
|
||||||
|
@ -3497,7 +3497,7 @@ Please select a groups and try again</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>SMESH_PATH_MESH</source>
|
<source>SMESH_PATH_MESH</source>
|
||||||
<translation>Mesh</translation>
|
<translation>Mesh or submesh</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>SMESH_PATH_SHAPE</source>
|
<source>SMESH_PATH_SHAPE</source>
|
||||||
|
@ -34,6 +34,8 @@
|
|||||||
#include "SMESH_subMeshEventListener.hxx"
|
#include "SMESH_subMeshEventListener.hxx"
|
||||||
#include "SMESH_Gen_i.hxx"
|
#include "SMESH_Gen_i.hxx"
|
||||||
#include "SMESH_Filter_i.hxx"
|
#include "SMESH_Filter_i.hxx"
|
||||||
|
#include "SMESH_subMesh_i.hxx"
|
||||||
|
#include "SMESH_Group_i.hxx"
|
||||||
#include "SMESH_PythonDump.hxx"
|
#include "SMESH_PythonDump.hxx"
|
||||||
|
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
@ -1996,7 +1998,7 @@ SMESH_MeshEditor_i::extrusionAlongPath(const SMESH::long_array & theIDsOfEleme
|
|||||||
::SMESH_MeshEditor anEditor( myMesh );
|
::SMESH_MeshEditor anEditor( myMesh );
|
||||||
::SMESH_MeshEditor::Extrusion_Error error =
|
::SMESH_MeshEditor::Extrusion_Error error =
|
||||||
anEditor.ExtrusionAlongTrack( elements, aSubMesh, nodeStart,
|
anEditor.ExtrusionAlongTrack( elements, aSubMesh, nodeStart,
|
||||||
theHasAngles, angles,
|
theHasAngles, angles, false,
|
||||||
theHasRefPoint, refPnt, theMakeGroups );
|
theHasRefPoint, refPnt, theMakeGroups );
|
||||||
storeResult(anEditor);
|
storeResult(anEditor);
|
||||||
theError = convExtrError( error );
|
theError = convExtrError( error );
|
||||||
@ -2011,6 +2013,105 @@ SMESH_MeshEditor_i::extrusionAlongPath(const SMESH::long_array & theIDsOfEleme
|
|||||||
return 0;
|
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<double> 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<SMESH_Mesh_i*>( 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<SMESH_subMesh_i*>( Path );
|
||||||
|
if(aSubMeshImp) {
|
||||||
|
// path as submesh
|
||||||
|
SMESH::SMESH_Mesh_ptr aPathMesh = aSubMeshImp->GetFather();
|
||||||
|
aMeshImp = SMESH::DownCast<SMESH_Mesh_i*>( 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<SMESH_Group_i*>( 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<int> groupIDs = myMesh->GetGroupIds();
|
||||||
|
list<int>::iterator newBegin = groupIDs.begin();
|
||||||
|
std::advance( newBegin, nbOldGroups ); // skip old groups
|
||||||
|
groupIDs.erase( groupIDs.begin(), newBegin );
|
||||||
|
return getGroups( & groupIDs );
|
||||||
|
}
|
||||||
|
return EmptyGr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : ExtrusionAlongPath
|
//function : ExtrusionAlongPath
|
||||||
//purpose :
|
//purpose :
|
||||||
@ -2409,6 +2510,124 @@ ExtrusionAlongPathObject2DMakeGroups(SMESH::SMESH_IDSource_ptr theObject,
|
|||||||
return aGroups;
|
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 << "("<<aGroups;
|
||||||
|
}
|
||||||
|
if(isDumpGroups)
|
||||||
|
aPythonDump << ", error)";
|
||||||
|
else
|
||||||
|
aPythonDump <<"error";
|
||||||
|
|
||||||
|
aPythonDump << " = " << this << ".ExtrusionAlongPathObjX( "
|
||||||
|
<< Object << ", "
|
||||||
|
<< Path << ", "
|
||||||
|
<< NodeStart << ", "
|
||||||
|
<< HasAngles << ", "
|
||||||
|
<< Angles << ", "
|
||||||
|
<< LinearVariation << ", "
|
||||||
|
<< HasRefPoint << ", "
|
||||||
|
<< "SMESH.PointStruct( "
|
||||||
|
<< ( HasRefPoint ? RefPoint.x : 0 ) << ", "
|
||||||
|
<< ( HasRefPoint ? RefPoint.y : 0 ) << ", "
|
||||||
|
<< ( HasRefPoint ? RefPoint.z : 0 ) << " ), "
|
||||||
|
<< ElemType << " )";
|
||||||
|
}
|
||||||
|
return aGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//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,
|
||||||
|
CORBA::Boolean MakeGroups,
|
||||||
|
SMESH::ElementType ElemType,
|
||||||
|
SMESH::SMESH_MeshEditor::Extrusion_Error& Error)
|
||||||
|
{
|
||||||
|
SMESH::ListOfGroups * aGroups = extrusionAlongPathX(IDsOfElements,
|
||||||
|
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 << "("<<aGroups;
|
||||||
|
}
|
||||||
|
if(isDumpGroups)
|
||||||
|
aPythonDump << ", error)";
|
||||||
|
else
|
||||||
|
aPythonDump <<"error";
|
||||||
|
|
||||||
|
aPythonDump << " = " << this << ".ExtrusionAlongPathX( "
|
||||||
|
<< IDsOfElements << ", "
|
||||||
|
<< Path << ", "
|
||||||
|
<< NodeStart << ", "
|
||||||
|
<< HasAngles << ", "
|
||||||
|
<< Angles << ", "
|
||||||
|
<< LinearVariation << ", "
|
||||||
|
<< HasRefPoint << ", "
|
||||||
|
<< "SMESH.PointStruct( "
|
||||||
|
<< ( HasRefPoint ? RefPoint.x : 0 ) << ", "
|
||||||
|
<< ( HasRefPoint ? RefPoint.y : 0 ) << ", "
|
||||||
|
<< ( HasRefPoint ? RefPoint.z : 0 ) << " ), "
|
||||||
|
<< ElemType << " )";
|
||||||
|
}
|
||||||
|
return aGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//================================================================================
|
//================================================================================
|
||||||
/*!
|
/*!
|
||||||
* \brief Compute rotation angles for ExtrusionAlongPath as linear variation
|
* \brief Compute rotation angles for ExtrusionAlongPath as linear variation
|
||||||
|
@ -348,6 +348,31 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor
|
|||||||
CORBA::Boolean HasRefPoint,
|
CORBA::Boolean HasRefPoint,
|
||||||
const SMESH::PointStruct& RefPoint,
|
const SMESH::PointStruct& RefPoint,
|
||||||
SMESH::SMESH_MeshEditor::Extrusion_Error& Error);
|
SMESH::SMESH_MeshEditor::Extrusion_Error& Error);
|
||||||
|
|
||||||
|
// skl 04.06.2009
|
||||||
|
SMESH::ListOfGroups* 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::ListOfGroups* 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,
|
||||||
|
CORBA::Boolean MakeGroups,
|
||||||
|
SMESH::ElementType ElemType,
|
||||||
|
SMESH::SMESH_MeshEditor::Extrusion_Error& Error);
|
||||||
|
|
||||||
SMESH::ListOfGroups* MirrorMakeGroups(const SMESH::long_array& IDsOfElements,
|
SMESH::ListOfGroups* MirrorMakeGroups(const SMESH::long_array& IDsOfElements,
|
||||||
const SMESH::AxisStruct& Mirror,
|
const SMESH::AxisStruct& Mirror,
|
||||||
SMESH::SMESH_MeshEditor::MirrorType MirrorType);
|
SMESH::SMESH_MeshEditor::MirrorType MirrorType);
|
||||||
@ -534,6 +559,17 @@ private: //!< private methods
|
|||||||
const bool MakeGroups,
|
const bool MakeGroups,
|
||||||
SMESH::SMESH_MeshEditor::Extrusion_Error & Error,
|
SMESH::SMESH_MeshEditor::Extrusion_Error & Error,
|
||||||
const SMDSAbs_ElementType ElementType=SMDSAbs_All);
|
const SMDSAbs_ElementType ElementType=SMDSAbs_All);
|
||||||
|
SMESH::ListOfGroups* 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 & theError);
|
||||||
SMESH::ListOfGroups* mirror(const SMESH::long_array & IDsOfElements,
|
SMESH::ListOfGroups* mirror(const SMESH::long_array & IDsOfElements,
|
||||||
const SMESH::AxisStruct & Axis,
|
const SMESH::AxisStruct & Axis,
|
||||||
SMESH::SMESH_MeshEditor::MirrorType MirrorType,
|
SMESH::SMESH_MeshEditor::MirrorType MirrorType,
|
||||||
|
@ -2733,6 +2733,53 @@ class Mesh:
|
|||||||
self.editor.ExtrusionSweepObject2D(theObject, StepVector, NbOfSteps)
|
self.editor.ExtrusionSweepObject2D(theObject, StepVector, NbOfSteps)
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Generates new elements by extrusion of the given elements
|
||||||
|
# The path of extrusion must be a meshed edge.
|
||||||
|
# @param Base mesh or list of ids of elements for extrusion
|
||||||
|
# @param Path - 1D mesh or 1D sub-mesh, along which proceeds the extrusion
|
||||||
|
# @param NodeStart the start node from Path. Defines the direction of extrusion
|
||||||
|
# @param HasAngles allows the shape to be rotated around the path
|
||||||
|
# to get the resulting mesh in a helical fashion
|
||||||
|
# @param Angles list of angles in radians
|
||||||
|
# @param LinearVariation forces the computation of rotation angles as linear
|
||||||
|
# variation of the given Angles along path steps
|
||||||
|
# @param HasRefPoint allows using the reference point
|
||||||
|
# @param RefPoint the point around which the shape is rotated (the mass center of the shape by default).
|
||||||
|
# The User can specify any point as the Reference Point.
|
||||||
|
# @param MakeGroups forces the generation of new groups from existing ones
|
||||||
|
# @param ElemType type of elements for extrusion (if param Base is a mesh)
|
||||||
|
# @return list of created groups (SMESH_GroupBase) and SMESH::Extrusion_Error if MakeGroups=True,
|
||||||
|
# only SMESH::Extrusion_Error otherwise
|
||||||
|
# @ingroup l2_modif_extrurev
|
||||||
|
def ExtrusionAlongPathX(self, Base, Path, NodeStart,
|
||||||
|
HasAngles, Angles, LinearVariation,
|
||||||
|
HasRefPoint, RefPoint, MakeGroups, ElemType):
|
||||||
|
Angles,AnglesParameters = ParseAngles(Angles)
|
||||||
|
RefPoint,RefPointParameters = ParsePointStruct(RefPoint)
|
||||||
|
if ( isinstance( RefPoint, geompyDC.GEOM._objref_GEOM_Object)):
|
||||||
|
RefPoint = self.smeshpyD.GetPointStruct(RefPoint)
|
||||||
|
pass
|
||||||
|
Parameters = AnglesParameters + var_separator + RefPointParameters
|
||||||
|
self.mesh.SetParameters(Parameters)
|
||||||
|
|
||||||
|
if isinstance(Base,list):
|
||||||
|
IDsOfElements = []
|
||||||
|
if Base == []: IDsOfElements = self.GetElementsId()
|
||||||
|
else: IDsOfElements = Base
|
||||||
|
return self.editor.ExtrusionAlongPathX(IDsOfElements, Path, NodeStart,
|
||||||
|
HasAngles, Angles, LinearVariation,
|
||||||
|
HasRefPoint, RefPoint, MakeGroups, ElemType)
|
||||||
|
else:
|
||||||
|
if isinstance(Base,Mesh):
|
||||||
|
return self.editor.ExtrusionAlongPathObjX(Base.GetMesh(), Path, NodeStart,
|
||||||
|
HasAngles, Angles, LinearVariation,
|
||||||
|
HasRefPoint, RefPoint, MakeGroups, ElemType)
|
||||||
|
else:
|
||||||
|
raise RuntimeError, "Invalid Base for ExtrusionAlongPathX"
|
||||||
|
|
||||||
|
|
||||||
## Generates new elements by extrusion of the given elements
|
## Generates new elements by extrusion of the given elements
|
||||||
# The path of extrusion must be a meshed edge.
|
# The path of extrusion must be a meshed edge.
|
||||||
# @param IDsOfElements ids of elements
|
# @param IDsOfElements ids of elements
|
||||||
@ -2741,7 +2788,7 @@ class Mesh:
|
|||||||
# @param NodeStart the first or the last node on the edge. Defines the direction of extrusion
|
# @param NodeStart the first or the last node on the edge. Defines the direction of extrusion
|
||||||
# @param HasAngles allows the shape to be rotated around the path
|
# @param HasAngles allows the shape to be rotated around the path
|
||||||
# to get the resulting mesh in a helical fashion
|
# to get the resulting mesh in a helical fashion
|
||||||
# @param Angles list of angles
|
# @param Angles list of angles in radians
|
||||||
# @param HasRefPoint allows using the reference point
|
# @param HasRefPoint allows using the reference point
|
||||||
# @param RefPoint the point around which the shape is rotated (the mass center of the shape by default).
|
# @param RefPoint the point around which the shape is rotated (the mass center of the shape by default).
|
||||||
# The User can specify any point as the Reference Point.
|
# The User can specify any point as the Reference Point.
|
||||||
|
Loading…
Reference in New Issue
Block a user