X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_MeshEditor_i.cxx;h=1a457eefbaceaf04e1618e233d7d712a51fd79da;hb=68f20ecf75a5a1d60883b99499a9829816bb0bc1;hp=0c46be9fe4b994850d2c7639fea6db5369e61fc3;hpb=c9c6669fab21f2a0d544d79e60ceb119800b4cb5;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index 0c46be9fe..1a457eefb 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -1,6 +1,6 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // // This library is free software; you can redistribute it and/or @@ -17,52 +17,303 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses // File : SMESH_MeshEditor_i.cxx // Author : Nicolas REJNERI // Module : SMESH -// $Header$ - +// #include "SMESH_MeshEditor_i.hxx" +#include "SMDS_Mesh0DElement.hxx" #include "SMDS_MeshEdge.hxx" #include "SMDS_MeshFace.hxx" #include "SMDS_MeshVolume.hxx" - -#include "SMESH_MeshEditor.hxx" - +#include "SMDS_PolyhedralVolumeOfNodes.hxx" +#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 "SMESH_ControlsDef.hxx" #include "utilities.h" - +#include "Utils_ExceptHandlers.hxx" +#include "Utils_CorbaException.hxx" + +#include +#include +#include +#include +#include +#include #include #include #include +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 +#define NO_CAS_CATCH +#endif + +#include + +#ifdef NO_CAS_CATCH +#include +#endif + #include +#include + +#define cast2Node(elem) static_cast( elem ) using namespace std; +using SMESH::TPythonDump; -//======================================================================= -//function : addAxis -//purpose : -//======================================================================= +namespace { -static TCollection_AsciiString& addAxis(TCollection_AsciiString& theStr, - const SMESH::AxisStruct & theAxis) -{ - theStr += "SMESH.AxisStruct( "; - theStr += TCollection_AsciiString( theAxis.x ) + ", "; - theStr += TCollection_AsciiString( theAxis.y ) + ", "; - theStr += TCollection_AsciiString( theAxis.z ) + ", "; - theStr += TCollection_AsciiString( theAxis.vx ) + ", "; - theStr += TCollection_AsciiString( theAxis.vy ) + ", "; - theStr += TCollection_AsciiString( theAxis.vz ) + " )"; - return theStr; + //============================================================================= + /*! + * \brief Mesh to apply modifications for preview purposes + */ + //============================================================================= + + struct TPreviewMesh: public SMESH_Mesh + { + SMDSAbs_ElementType myPreviewType; // type to show + //!< Constructor + TPreviewMesh(SMDSAbs_ElementType previewElements = SMDSAbs_All) { + _isShapeToMesh = (_id =_studyId =_idDoc = 0); + _myMeshDS = new SMESHDS_Mesh( _id, true ); + myPreviewType = previewElements; + } + //!< Destructor + virtual ~TPreviewMesh() { delete _myMeshDS; } + //!< Copy a set of elements + void Copy(const TIDSortedElemSet & theElements, + TIDSortedElemSet& theCopyElements, + SMDSAbs_ElementType theSelectType = SMDSAbs_All, + SMDSAbs_ElementType theAvoidType = SMDSAbs_All) + { + // loop on theIDsOfElements + TIDSortedElemSet::const_iterator eIt = theElements.begin(); + for ( ; eIt != theElements.end(); ++eIt ) + { + const SMDS_MeshElement* anElem = *eIt; + if ( !anElem ) continue; + SMDSAbs_ElementType type = anElem->GetType(); + if ( type == theAvoidType || + ( theSelectType != SMDSAbs_All && type != theSelectType )) + continue; + + if ( const SMDS_MeshElement* anElemCopy = Copy( anElem )) + theCopyElements.insert( theCopyElements.end(), anElemCopy ); + } + } + //!< Copy an element + SMDS_MeshElement* Copy( const SMDS_MeshElement* anElem ) + { + // copy element nodes + int anElemNbNodes = anElem->NbNodes(); + vector< int > anElemNodesID( anElemNbNodes ) ; + SMDS_ElemIteratorPtr itElemNodes = anElem->nodesIterator(); + for ( int i = 0; itElemNodes->more(); i++) + { + const SMDS_MeshNode* anElemNode = cast2Node( itElemNodes->next() ); + Copy( anElemNode ); + anElemNodesID[i] = anElemNode->GetID(); + } + + // creates a corresponding element on copied nodes + SMDS_MeshElement* anElemCopy = 0; + if ( anElem->IsPoly() && anElem->GetType() == SMDSAbs_Volume ) + { + const SMDS_PolyhedralVolumeOfNodes* ph = + dynamic_cast (anElem); + if ( ph ) + anElemCopy = _myMeshDS->AddPolyhedralVolumeWithID + (anElemNodesID, ph->GetQuanities(),anElem->GetID()); + } + else { + anElemCopy = ::SMESH_MeshEditor(this).AddElement( anElemNodesID, + anElem->GetType(), + anElem->IsPoly() ); + } + return anElemCopy; + } + //!< Copy a node + SMDS_MeshNode* Copy( const SMDS_MeshNode* anElemNode ) + { + return _myMeshDS->AddNodeWithID(anElemNode->X(), anElemNode->Y(), anElemNode->Z(), + anElemNode->GetID()); + } + };// struct TPreviewMesh + + static SMESH_NodeSearcher * theNodeSearcher = 0; + static SMESH_ElementSearcher * theElementSearcher = 0; + + //============================================================================= + /*! + * \brief Deleter of theNodeSearcher at any compute event occured + */ + //============================================================================= + + struct TSearchersDeleter : public SMESH_subMeshEventListener + { + SMESH_Mesh* myMesh; + //!< Constructor + TSearchersDeleter(): SMESH_subMeshEventListener( false ), // won't be deleted by submesh + myMesh(0) {} + //!< Delete theNodeSearcher + static void Delete() + { + if ( theNodeSearcher ) delete theNodeSearcher; theNodeSearcher = 0; + if ( theElementSearcher ) delete theElementSearcher; theElementSearcher = 0; + } + typedef map < int, SMESH_subMesh * > TDependsOnMap; + //!< The meshod called by submesh: do my main job + void ProcessEvent(const int, const int eventType, SMESH_subMesh* sm, + SMESH_subMeshEventListenerData*,const SMESH_Hypothesis*) + { + if ( eventType == SMESH_subMesh::COMPUTE_EVENT ) { + Delete(); + Unset( sm->GetFather() ); + } + } + //!< set self on all submeshes and delete theNodeSearcher if other mesh is set + void Set(SMESH_Mesh* mesh) + { + if ( myMesh != mesh ) + { + if ( myMesh ) { + Delete(); + Unset( myMesh ); + } + myMesh = mesh; + if ( SMESH_subMesh* myMainSubMesh = mesh->GetSubMeshContaining(1) ) { + const TDependsOnMap & subMeshes = myMainSubMesh->DependsOn(); + TDependsOnMap::const_iterator sm; + for (sm = subMeshes.begin(); sm != subMeshes.end(); sm++) + sm->second->SetEventListener( this, 0, sm->second ); + } + } + } + //!< delete self from all submeshes + void Unset(SMESH_Mesh* mesh) + { + if ( SMESH_subMesh* myMainSubMesh = mesh->GetSubMeshContaining(1) ) { + const TDependsOnMap & subMeshes = myMainSubMesh->DependsOn(); + TDependsOnMap::const_iterator sm; + for (sm = subMeshes.begin(); sm != subMeshes.end(); sm++) + sm->second->DeleteEventListener( this ); + } + myMesh = 0; + } + + } theSearchersDeleter; + + TCollection_AsciiString mirrorTypeName( SMESH::SMESH_MeshEditor::MirrorType theMirrorType ) + { + TCollection_AsciiString typeStr; + switch ( theMirrorType ) { + case SMESH::SMESH_MeshEditor::POINT: + typeStr = "SMESH.SMESH_MeshEditor.POINT"; + break; + case SMESH::SMESH_MeshEditor::AXIS: + typeStr = "SMESH.SMESH_MeshEditor.AXIS"; + break; + default: + typeStr = "SMESH.SMESH_MeshEditor.PLANE"; + } + return typeStr; + } + //================================================================================ + /*! + * \brief function for conversion long_array to TIDSortedElemSet + * \param IDs - array of IDs + * \param aMesh - mesh + * \param aMap - collection to fill + * \param aType - element type + */ + //================================================================================ + + void arrayToSet(const SMESH::long_array & IDs, + const SMESHDS_Mesh* aMesh, + TIDSortedElemSet& aMap, + const SMDSAbs_ElementType aType = SMDSAbs_All ) + { + for (int i=0; iFindNode(ind) : aMesh->FindElement(ind)); + if ( elem && ( aType == SMDSAbs_All || elem->GetType() == aType )) + aMap.insert( elem ); + } + } + //================================================================================ + /*! + * \brief Retrieve elements of given type from SMESH_IDSource + */ + //================================================================================ + + bool idSourceToSet(SMESH::SMESH_IDSource_ptr theIDSource, + const SMESHDS_Mesh* theMeshDS, + TIDSortedElemSet& theElemSet, + const SMDSAbs_ElementType theType, + const bool emptyIfIsMesh=false) + + { + if ( CORBA::is_nil( theIDSource ) ) + return false; + if ( emptyIfIsMesh && SMESH::DownCast( theIDSource )) + return true; + + SMESH::long_array_var anIDs = theIDSource->GetIDs(); + if ( anIDs->length() == 0 ) + return false; + SMESH::array_of_ElementType_var types = theIDSource->GetTypes(); + if ( types->length() == 1 && types[0] == SMESH::NODE ) // group of nodes + { + if ( theType == SMDSAbs_All || theType == SMDSAbs_Node ) + arrayToSet( anIDs, theMeshDS, theElemSet, SMDSAbs_Node ); + else + return false; + } + else + { + arrayToSet( anIDs, theMeshDS, theElemSet, theType); + } + return true; + } + //================================================================================ + /*! + * \brief Retrieve nodes from SMESH_IDSource + */ + //================================================================================ + + void idSourceToNodeSet(SMESH::SMESH_IDSource_ptr theObject, + const SMESHDS_Mesh* theMeshDS, + TIDSortedNodeSet& theNodeSet) + + { + if ( CORBA::is_nil( theObject ) ) + return; + SMESH::array_of_ElementType_var types = theObject->GetTypes(); + SMESH::long_array_var aElementsId = theObject->GetIDs(); + if ( types->length() == 1 && types[0] == SMESH::NODE) + { + for(int i = 0; i < aElementsId->length(); i++) + if ( const SMDS_MeshNode * n = theMeshDS->FindNode( aElementsId[i] )) + theNodeSet.insert( theNodeSet.end(), n); + } + else { + for(int i = 0; i < aElementsId->length(); i++) + if( const SMDS_MeshElement * elem = theMeshDS->FindElement( aElementsId[i] )) + theNodeSet.insert( elem->begin_nodes(), elem->end_nodes()); + } + } } //============================================================================= @@ -71,11 +322,73 @@ static TCollection_AsciiString& addAxis(TCollection_AsciiString& theStr, */ //============================================================================= -SMESH_MeshEditor_i::SMESH_MeshEditor_i(SMESH_Mesh* theMesh) +SMESH_MeshEditor_i::SMESH_MeshEditor_i(SMESH_Mesh_i* theMesh, bool isPreview) { - _myMesh = theMesh; + myMesh_i = theMesh; + myMesh = & theMesh->GetImpl(); + myPreviewMode = isPreview; +} + +//================================================================================ +/*! + * \brief Destructor + */ +//================================================================================ + +SMESH_MeshEditor_i::~SMESH_MeshEditor_i() +{ +} + +//================================================================================ +/*! + * \brief Clear members + */ +//================================================================================ + +void SMESH_MeshEditor_i::initData(bool deleteSearchers) +{ + if ( myPreviewMode ) { + myPreviewData = new SMESH::MeshPreviewStruct(); + } + else { + myLastCreatedElems = new SMESH::long_array(); + myLastCreatedNodes = new SMESH::long_array(); + if ( deleteSearchers ) + TSearchersDeleter::Delete(); + } +} + +//======================================================================= +//function : MakeIDSource +//purpose : Wrap a sequence of ids in a SMESH_IDSource +//======================================================================= + +struct _IDSource : public POA_SMESH::SMESH_IDSource +{ + SMESH::long_array _ids; + SMESH::ElementType _type; + SMESH::long_array* GetIDs() { return new SMESH::long_array( _ids ); } + SMESH::long_array* GetMeshInfo() { return 0; } + SMESH::array_of_ElementType* GetTypes() + { + SMESH::array_of_ElementType_var types = new SMESH::array_of_ElementType; + types->length( 1 ); + types[0] = _type; + return types._retn(); + } }; +SMESH::SMESH_IDSource_ptr SMESH_MeshEditor_i::MakeIDSource(const SMESH::long_array& ids, + SMESH::ElementType type) +{ + _IDSource* anIDSource = new _IDSource; + anIDSource->_ids = ids; + anIDSource->_type = type; + SMESH::SMESH_IDSource_var anIDSourceVar = anIDSource->_this(); + + return anIDSourceVar._retn(); +} + //============================================================================= /*! * @@ -83,24 +396,25 @@ SMESH_MeshEditor_i::SMESH_MeshEditor_i(SMESH_Mesh* theMesh) //============================================================================= CORBA::Boolean - SMESH_MeshEditor_i::RemoveElements(const SMESH::long_array & IDsOfElements) +SMESH_MeshEditor_i::RemoveElements(const SMESH::long_array & IDsOfElements) { - ::SMESH_MeshEditor anEditor( _myMesh ); + initData(); + + ::SMESH_MeshEditor anEditor( myMesh ); list< int > IdList; for (int i = 0; i < IDsOfElements.length(); i++) IdList.push_back( IDsOfElements[i] ); // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.RemoveElements("); - SMESH_Gen_i::AddArray( str, IDsOfElements ) += ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"RemoveElements: \", isDone" ); -#endif + TPythonDump() << "isDone = " << this << ".RemoveElements( " << IDsOfElements << " )"; + + if ( IDsOfElements.length() ) + myMesh->SetIsModified( true ); // issue 0020693 + // Remove Elements return anEditor.Remove( IdList, false ); -}; +} //============================================================================= /*! @@ -108,24 +422,23 @@ CORBA::Boolean */ //============================================================================= -CORBA::Boolean SMESH_MeshEditor_i::RemoveNodes(const SMESH:: - long_array & IDsOfNodes) +CORBA::Boolean SMESH_MeshEditor_i::RemoveNodes(const SMESH::long_array & IDsOfNodes) { - ::SMESH_MeshEditor anEditor( _myMesh ); + initData(); + + ::SMESH_MeshEditor anEditor( myMesh ); list< int > IdList; for (int i = 0; i < IDsOfNodes.length(); i++) IdList.push_back( IDsOfNodes[i] ); // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.RemoveNodes("); - SMESH_Gen_i::AddArray( str, IDsOfNodes ) += ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"RemoveNodes: \", isDone" ); -#endif + TPythonDump() << "isDone = " << this << ".RemoveNodes( " << IDsOfNodes << " )"; + + if ( IDsOfNodes.length() ) + myMesh->SetIsModified( true ); // issue 0020693 return anEditor.Remove( IdList, true ); -}; +} //============================================================================= /*! @@ -133,22 +446,29 @@ CORBA::Boolean SMESH_MeshEditor_i::RemoveNodes(const SMESH:: */ //============================================================================= -CORBA::Boolean SMESH_MeshEditor_i::AddEdge(const SMESH::long_array & IDsOfNodes) +CORBA::Long SMESH_MeshEditor_i::RemoveOrphanNodes() { - int NbNodes = IDsOfNodes.length(); - if (NbNodes == 2) - { - CORBA::Long index1 = IDsOfNodes[0]; - CORBA::Long index2 = IDsOfNodes[1]; - GetMeshDS()->AddEdge(GetMeshDS()->FindNode(index1), GetMeshDS()->FindNode(index2)); + initData(); - // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.AddEdge(["); - str += TCollection_AsciiString((int) index1) + ", "; - str += TCollection_AsciiString((int) index2) + " ])"; - SMESH_Gen_i::AddToCurrentPyScript( str ); - } - return true; + ::SMESH_MeshEditor anEditor( myMesh ); + + // Update Python script + TPythonDump() << "nbRemoved = " << this << ".RemoveOrphanNodes()"; + + // Create filter to find all orphan nodes + SMESH::Controls::Filter::TIdSequence seq; + SMESH::Controls::PredicatePtr predicate( new SMESH::Controls::FreeNodes() ); + SMESH::Controls::Filter::GetElementsId( GetMeshDS(), predicate, seq ); + + // remove orphan nodes (if there are any) + list< int > IdList; + for ( int i = 0; i < seq.size(); i++ ) + IdList.push_back( seq[i] ); + + if ( IdList.size() ) + myMesh->SetIsModified( true ); + + return anEditor.Remove( IdList, true ); } //============================================================================= @@ -157,19 +477,83 @@ CORBA::Boolean SMESH_MeshEditor_i::AddEdge(const SMESH::long_array & IDsOfNodes) */ //============================================================================= -CORBA::Boolean SMESH_MeshEditor_i::AddNode(CORBA::Double x, - CORBA::Double y, CORBA::Double z) +CORBA::Long SMESH_MeshEditor_i::AddNode(CORBA::Double x, + CORBA::Double y, CORBA::Double z) { - GetMeshDS()->AddNode(x, y, z); + initData(); + + const SMDS_MeshNode* N = GetMeshDS()->AddNode(x, y, z); // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.AddNode("); - str += TCollection_AsciiString( x ) + ", "; - str += TCollection_AsciiString( y ) + ", "; - str += TCollection_AsciiString( z ) + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); + TPythonDump() << "nodeID = " << this << ".AddNode( " + << x << ", " << y << ", " << z << " )"; - return true; + myMesh->SetIsModified( true ); // issue 0020693 + + return N->GetID(); +} + +//============================================================================= +/*! + * + */ +//============================================================================= +CORBA::Long SMESH_MeshEditor_i::Add0DElement(CORBA::Long IDOfNode) +{ + initData(); + + const SMDS_MeshNode* aNode = GetMeshDS()->FindNode(IDOfNode); + SMDS_MeshElement* elem = GetMeshDS()->Add0DElement(aNode); + + // Update Python script + TPythonDump() << "elem0d = " << this << ".Add0DElement( " << IDOfNode <<" )"; + + myMesh->SetIsModified( true ); // issue 0020693 + + if (elem) + return elem->GetID(); + + return 0; +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +CORBA::Long SMESH_MeshEditor_i::AddEdge(const SMESH::long_array & IDsOfNodes) +{ + initData(); + + int NbNodes = IDsOfNodes.length(); + SMDS_MeshElement* elem = 0; + if (NbNodes == 2) + { + CORBA::Long index1 = IDsOfNodes[0]; + CORBA::Long index2 = IDsOfNodes[1]; + elem = GetMeshDS()->AddEdge(GetMeshDS()->FindNode(index1), GetMeshDS()->FindNode(index2)); + + // Update Python script + TPythonDump() << "edge = " << this << ".AddEdge([ " + << index1 << ", " << index2 <<" ])"; + } + if (NbNodes == 3) { + CORBA::Long n1 = IDsOfNodes[0]; + CORBA::Long n2 = IDsOfNodes[1]; + CORBA::Long n12 = IDsOfNodes[2]; + elem = GetMeshDS()->AddEdge(GetMeshDS()->FindNode(n1), + GetMeshDS()->FindNode(n2), + GetMeshDS()->FindNode(n12)); + // Update Python script + TPythonDump() << "edgeID = " << this << ".AddEdge([ " + <SetIsModified( true ), elem->GetID(); + + return 0; } //============================================================================= @@ -178,41 +562,69 @@ CORBA::Boolean SMESH_MeshEditor_i::AddNode(CORBA::Double x, */ //============================================================================= -CORBA::Boolean SMESH_MeshEditor_i::AddFace(const SMESH::long_array & IDsOfNodes) +CORBA::Long SMESH_MeshEditor_i::AddFace(const SMESH::long_array & IDsOfNodes) { + initData(); + int NbNodes = IDsOfNodes.length(); if (NbNodes < 3) { - return false; + return 0; } std::vector nodes (NbNodes); for (int i = 0; i < NbNodes; i++) nodes[i] = GetMeshDS()->FindNode(IDsOfNodes[i]); - if (NbNodes == 3) - { - GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2]); + SMDS_MeshElement* elem = 0; + if (NbNodes == 3) { + elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2]); } - else if (NbNodes == 4) - { - GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3]); + else if (NbNodes == 4) { + elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3]); } - else - { - GetMeshDS()->AddPolygonalFace(nodes); + else if (NbNodes == 6) { + elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3], + nodes[4], nodes[5]); + } + else if (NbNodes == 8) { + elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3], + nodes[4], nodes[5], nodes[6], nodes[7]); + } + else if (NbNodes > 2) { + elem = GetMeshDS()->AddPolygonalFace(nodes); } // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.AddFace("); - SMESH_Gen_i::AddArray( str, IDsOfNodes ) += ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"AddFace: \", isDone" ); -#endif + TPythonDump() << "faceID = " << this << ".AddFace( " << IDsOfNodes << " )"; - return true; -}; + if(elem) + return myMesh->SetIsModified( true ), elem->GetID(); + + return 0; +} + +//============================================================================= +/*! + * AddPolygonalFace + */ +//============================================================================= +CORBA::Long SMESH_MeshEditor_i::AddPolygonalFace (const SMESH::long_array & IDsOfNodes) +{ + initData(); + + int NbNodes = IDsOfNodes.length(); + std::vector nodes (NbNodes); + for (int i = 0; i < NbNodes; i++) + nodes[i] = GetMeshDS()->FindNode(IDsOfNodes[i]); + + const SMDS_MeshElement* elem = GetMeshDS()->AddPolygonalFace(nodes); + + // Update Python script + TPythonDump() <<"faceID = "<SetIsModified( true ), elem->GetID()) : 0; +} //============================================================================= /*! @@ -220,41 +632,56 @@ CORBA::Boolean SMESH_MeshEditor_i::AddFace(const SMESH::long_array & IDsOfNodes) */ //============================================================================= -CORBA::Boolean SMESH_MeshEditor_i::AddVolume(const SMESH:: - long_array & IDsOfNodes) +CORBA::Long SMESH_MeshEditor_i::AddVolume(const SMESH::long_array & IDsOfNodes) { + initData(); + int NbNodes = IDsOfNodes.length(); vector< const SMDS_MeshNode*> n(NbNodes); for(int i=0;iFindNode(IDsOfNodes[i]); + SMDS_MeshElement* elem = 0; switch(NbNodes) { - case 4:GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3]); break; - case 5:GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4]); break; - case 6:GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5]); break; - case 8:GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7]); break; + case 4 :elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3]); break; + case 5 :elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4]); break; + case 6 :elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5]); break; + case 8 :elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7]); break; + case 10:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5], + n[6],n[7],n[8],n[9]); + break; + case 13:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6], + n[7],n[8],n[9],n[10],n[11],n[12]); + break; + case 15:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8], + n[9],n[10],n[11],n[12],n[13],n[14]); + break; + case 20:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7], + n[8],n[9],n[10],n[11],n[12],n[13],n[14], + n[15],n[16],n[17],n[18],n[19]); + break; } + // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.AddVolume("); - SMESH_Gen_i::AddArray( str, IDsOfNodes ) += ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"AddVolume: \", isDone" ); -#endif + TPythonDump() << "volID = " << this << ".AddVolume( " << IDsOfNodes << " )"; - return true; -}; + if(elem) + return myMesh->SetIsModified( true ), elem->GetID(); + + return 0; +} //============================================================================= /*! * AddPolyhedralVolume */ //============================================================================= -CORBA::Boolean SMESH_MeshEditor_i::AddPolyhedralVolume - (const SMESH::long_array & IDsOfNodes, - const SMESH::long_array & Quantities) +CORBA::Long SMESH_MeshEditor_i::AddPolyhedralVolume (const SMESH::long_array & IDsOfNodes, + const SMESH::long_array & Quantities) { + initData(); + int NbNodes = IDsOfNodes.length(); std::vector n (NbNodes); for (int i = 0; i < NbNodes; i++) @@ -265,28 +692,24 @@ CORBA::Boolean SMESH_MeshEditor_i::AddPolyhedralVolume for (int j = 0; j < NbFaces; j++) q[j] = Quantities[j]; - GetMeshDS()->AddPolyhedralVolume(n, q); + const SMDS_MeshElement* elem = GetMeshDS()->AddPolyhedralVolume(n, q); // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.AddPolyhedralVolume("); - SMESH_Gen_i::AddArray( str, IDsOfNodes ) += ", "; - SMESH_Gen_i::AddArray( str, Quantities ) += ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"AddPolyhedralVolume: \", isDone" ); -#endif + TPythonDump() << "volID = " << this << ".AddPolyhedralVolume( " + << IDsOfNodes << ", " << Quantities << " )"; - return true; -}; + return elem ? ( myMesh->SetIsModified( true ), elem->GetID()) : 0; +} //============================================================================= /*! * AddPolyhedralVolumeByFaces */ //============================================================================= -CORBA::Boolean SMESH_MeshEditor_i::AddPolyhedralVolumeByFaces - (const SMESH::long_array & IdsOfFaces) +CORBA::Long SMESH_MeshEditor_i::AddPolyhedralVolumeByFaces (const SMESH::long_array & IdsOfFaces) { + initData(); + int NbFaces = IdsOfFaces.length(); std::vector poly_nodes; std::vector quantities (NbFaces); @@ -301,105 +724,272 @@ CORBA::Boolean SMESH_MeshEditor_i::AddPolyhedralVolumeByFaces } } - GetMeshDS()->AddPolyhedralVolume(poly_nodes, quantities); + const SMDS_MeshElement* elem = GetMeshDS()->AddPolyhedralVolume(poly_nodes, quantities); // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.AddPolyhedralVolumeByFaces("); - SMESH_Gen_i::AddArray( str, IdsOfFaces ) += ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"AddPolyhedralVolume: \", isDone" ); -#endif + TPythonDump() << "volID = " << this << ".AddPolyhedralVolumeByFaces( " + << IdsOfFaces << " )"; - return true; -}; + return elem ? ( myMesh->SetIsModified( true ), elem->GetID()) : 0; +} //============================================================================= /*! - * + * \brief Bind a node to a vertex + * \param NodeID - node ID + * \param VertexID - vertex ID available through GEOM_Object.GetSubShapeIndices()[0] + * \retval boolean - false if NodeID or VertexID is invalid */ //============================================================================= -CORBA::Boolean SMESH_MeshEditor_i::MoveNode(CORBA::Long NodeID, - CORBA::Double x, - CORBA::Double y, - CORBA::Double z) +void SMESH_MeshEditor_i::SetNodeOnVertex(CORBA::Long NodeID, CORBA::Long VertexID) + throw (SALOME::SALOME_Exception) { - const SMDS_MeshNode * node = GetMeshDS()->FindNode( NodeID ); + Unexpect aCatch(SALOME_SalomeException); + + SMESHDS_Mesh * mesh = GetMeshDS(); + SMDS_MeshNode* node = const_cast( mesh->FindNode(NodeID) ); if ( !node ) - return false; + THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM); - GetMeshDS()->MoveNode(node, x, y, z); + if ( mesh->MaxShapeIndex() < VertexID ) + THROW_SALOME_CORBA_EXCEPTION("Invalid VertexID", SALOME::BAD_PARAM); - // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.MoveNode("); - str += TCollection_AsciiString((Standard_Integer) NodeID) + ", "; - str += TCollection_AsciiString((Standard_Real) x) + ", "; - str += TCollection_AsciiString((Standard_Real) y) + ", "; - str += TCollection_AsciiString((Standard_Real) z) + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); + TopoDS_Shape shape = mesh->IndexToShape( VertexID ); + if ( shape.ShapeType() != TopAbs_VERTEX ) + THROW_SALOME_CORBA_EXCEPTION("Invalid VertexID", SALOME::BAD_PARAM); - return true; + mesh->SetNodeOnVertex( node, VertexID ); + + myMesh->SetIsModified( true ); } //============================================================================= /*! - * + * \brief Store node position on an edge + * \param NodeID - node ID + * \param EdgeID - edge ID available through GEOM_Object.GetSubShapeIndices()[0] + * \param paramOnEdge - parameter on edge where the node is located + * \retval boolean - false if any parameter is invalid */ //============================================================================= -CORBA::Boolean SMESH_MeshEditor_i::InverseDiag(CORBA::Long NodeID1, - CORBA::Long NodeID2) +void SMESH_MeshEditor_i::SetNodeOnEdge(CORBA::Long NodeID, CORBA::Long EdgeID, + CORBA::Double paramOnEdge) + throw (SALOME::SALOME_Exception) { - const SMDS_MeshNode * n1 = GetMeshDS()->FindNode( NodeID1 ); - const SMDS_MeshNode * n2 = GetMeshDS()->FindNode( NodeID2 ); - if ( !n1 || !n2 ) - return false; + Unexpect aCatch(SALOME_SalomeException); - // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.InverseDiag("); - str += TCollection_AsciiString((Standard_Integer) NodeID1) + ", "; - str += TCollection_AsciiString((Standard_Integer) NodeID2) + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); + SMESHDS_Mesh * mesh = GetMeshDS(); + SMDS_MeshNode* node = const_cast( mesh->FindNode(NodeID) ); + if ( !node ) + THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM); - ::SMESH_MeshEditor aMeshEditor( _myMesh ); - return aMeshEditor.InverseDiag ( n1, n2 ); + if ( mesh->MaxShapeIndex() < EdgeID ) + THROW_SALOME_CORBA_EXCEPTION("Invalid EdgeID", SALOME::BAD_PARAM); + + TopoDS_Shape shape = mesh->IndexToShape( EdgeID ); + if ( shape.ShapeType() != TopAbs_EDGE ) + THROW_SALOME_CORBA_EXCEPTION("Invalid EdgeID", SALOME::BAD_PARAM); + + Standard_Real f,l; + BRep_Tool::Range( TopoDS::Edge( shape ), f,l); + if ( paramOnEdge < f || paramOnEdge > l ) + THROW_SALOME_CORBA_EXCEPTION("Invalid paramOnEdge", SALOME::BAD_PARAM); + + mesh->SetNodeOnEdge( node, EdgeID, paramOnEdge ); + + myMesh->SetIsModified( true ); } //============================================================================= /*! - * + * \brief Store node position on a face + * \param NodeID - node ID + * \param FaceID - face ID available through GEOM_Object.GetSubShapeIndices()[0] + * \param u - U parameter on face where the node is located + * \param v - V parameter on face where the node is located + * \retval boolean - false if any parameter is invalid */ //============================================================================= -CORBA::Boolean SMESH_MeshEditor_i::DeleteDiag(CORBA::Long NodeID1, - CORBA::Long NodeID2) +void SMESH_MeshEditor_i::SetNodeOnFace(CORBA::Long NodeID, CORBA::Long FaceID, + CORBA::Double u, CORBA::Double v) + throw (SALOME::SALOME_Exception) { - const SMDS_MeshNode * n1 = GetMeshDS()->FindNode( NodeID1 ); - const SMDS_MeshNode * n2 = GetMeshDS()->FindNode( NodeID2 ); - if ( !n1 || !n2 ) - return false; + Unexpect aCatch(SALOME_SalomeException); - // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.DeleteDiag("); - str += TCollection_AsciiString((Standard_Integer) NodeID1) + ", "; - str += TCollection_AsciiString((Standard_Integer) NodeID2) + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); + SMESHDS_Mesh * mesh = GetMeshDS(); + SMDS_MeshNode* node = const_cast( mesh->FindNode(NodeID) ); + if ( !node ) + THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM); + + if ( mesh->MaxShapeIndex() < FaceID ) + THROW_SALOME_CORBA_EXCEPTION("Invalid FaceID", SALOME::BAD_PARAM); + + TopoDS_Shape shape = mesh->IndexToShape( FaceID ); + if ( shape.ShapeType() != TopAbs_FACE ) + THROW_SALOME_CORBA_EXCEPTION("Invalid FaceID", SALOME::BAD_PARAM); - ::SMESH_MeshEditor aMeshEditor( _myMesh ); - return aMeshEditor.DeleteDiag ( n1, n2 ); + BRepAdaptor_Surface surf( TopoDS::Face( shape )); + bool isOut = ( u < surf.FirstUParameter() || + u > surf.LastUParameter() || + v < surf.FirstVParameter() || + v > surf.LastVParameter() ); + + if ( isOut ) { +#ifdef _DEBUG_ + MESSAGE ( "FACE " << FaceID << " (" << u << "," << v << ") out of " + << " u( " << surf.FirstUParameter() + << "," << surf.LastUParameter() + << ") v( " << surf.FirstVParameter() + << "," << surf.LastVParameter() << ")" ); +#endif + THROW_SALOME_CORBA_EXCEPTION("Invalid UV", SALOME::BAD_PARAM); + } + + mesh->SetNodeOnFace( node, FaceID, u, v ); + + myMesh->SetIsModified( true ); } //============================================================================= /*! - * + * \brief Bind a node to a solid + * \param NodeID - node ID + * \param SolidID - vertex ID available through GEOM_Object.GetSubShapeIndices()[0] + * \retval boolean - false if NodeID or SolidID is invalid */ //============================================================================= -CORBA::Boolean SMESH_MeshEditor_i::Reorient(const SMESH::long_array & IDsOfElements) +void SMESH_MeshEditor_i::SetNodeInVolume(CORBA::Long NodeID, CORBA::Long SolidID) + throw (SALOME::SALOME_Exception) { - ::SMESH_MeshEditor anEditor( _myMesh ); - for (int i = 0; i < IDsOfElements.length(); i++) + Unexpect aCatch(SALOME_SalomeException); + + SMESHDS_Mesh * mesh = GetMeshDS(); + SMDS_MeshNode* node = const_cast( mesh->FindNode(NodeID) ); + if ( !node ) + THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM); + + if ( mesh->MaxShapeIndex() < SolidID ) + THROW_SALOME_CORBA_EXCEPTION("Invalid SolidID", SALOME::BAD_PARAM); + + TopoDS_Shape shape = mesh->IndexToShape( SolidID ); + if ( shape.ShapeType() != TopAbs_SOLID && + shape.ShapeType() != TopAbs_SHELL) + THROW_SALOME_CORBA_EXCEPTION("Invalid SolidID", SALOME::BAD_PARAM); + + mesh->SetNodeInVolume( node, SolidID ); + + // myMesh->SetIsModified( true ); - SetNodeInVolume() can't prevent re-compute, I believe +} + +//============================================================================= +/*! + * \brief Bind an element to a shape + * \param ElementID - element ID + * \param ShapeID - shape ID available through GEOM_Object.GetSubShapeIndices()[0] + * \retval boolean - false if ElementID or ShapeID is invalid + */ +//============================================================================= + +void SMESH_MeshEditor_i::SetMeshElementOnShape(CORBA::Long ElementID, + CORBA::Long ShapeID) + throw (SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + + SMESHDS_Mesh * mesh = GetMeshDS(); + SMDS_MeshElement* elem = const_cast(mesh->FindElement(ElementID)); + if ( !elem ) + THROW_SALOME_CORBA_EXCEPTION("Invalid ElementID", SALOME::BAD_PARAM); + + if ( mesh->MaxShapeIndex() < ShapeID ) + THROW_SALOME_CORBA_EXCEPTION("Invalid ShapeID", SALOME::BAD_PARAM); + + TopoDS_Shape shape = mesh->IndexToShape( ShapeID ); + if ( shape.ShapeType() != TopAbs_EDGE && + shape.ShapeType() != TopAbs_FACE && + shape.ShapeType() != TopAbs_SOLID && + shape.ShapeType() != TopAbs_SHELL ) + THROW_SALOME_CORBA_EXCEPTION("Invalid shape type", SALOME::BAD_PARAM); + + mesh->SetMeshElementOnShape( elem, ShapeID ); + + myMesh->SetIsModified( true ); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +CORBA::Boolean SMESH_MeshEditor_i::InverseDiag(CORBA::Long NodeID1, + CORBA::Long NodeID2) +{ + initData(); + + const SMDS_MeshNode * n1 = GetMeshDS()->FindNode( NodeID1 ); + const SMDS_MeshNode * n2 = GetMeshDS()->FindNode( NodeID2 ); + if ( !n1 || !n2 ) + return false; + + // Update Python script + TPythonDump() << "isDone = " << this << ".InverseDiag( " + << NodeID1 << ", " << NodeID2 << " )"; + + myMesh->SetIsModified( true ); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + return aMeshEditor.InverseDiag ( n1, n2 ); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +CORBA::Boolean SMESH_MeshEditor_i::DeleteDiag(CORBA::Long NodeID1, + CORBA::Long NodeID2) +{ + initData(); + + const SMDS_MeshNode * n1 = GetMeshDS()->FindNode( NodeID1 ); + const SMDS_MeshNode * n2 = GetMeshDS()->FindNode( NodeID2 ); + if ( !n1 || !n2 ) + return false; + + // Update Python script + TPythonDump() << "isDone = " << this << ".DeleteDiag( " + << NodeID1 << ", " << NodeID2 << " )"; + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + + bool stat = aMeshEditor.DeleteDiag ( n1, n2 ); + + if ( stat ) + myMesh->SetIsModified( true ); // issue 0020693 + + storeResult(aMeshEditor); + + return stat; +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +CORBA::Boolean SMESH_MeshEditor_i::Reorient(const SMESH::long_array & IDsOfElements) +{ + initData(); + + ::SMESH_MeshEditor anEditor( myMesh ); + for (int i = 0; i < IDsOfElements.length(); i++) { CORBA::Long index = IDsOfElements[i]; const SMDS_MeshElement * elem = GetMeshDS()->FindElement(index); @@ -407,9 +997,10 @@ CORBA::Boolean SMESH_MeshEditor_i::Reorient(const SMESH::long_array & IDsOfEleme anEditor.Reorient( elem ); } // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.Reorient("); - SMESH_Gen_i::AddArray( str, IDsOfElements ) += ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); + TPythonDump() << "isDone = " << this << ".Reorient( " << IDsOfElements << " )"; + + if ( IDsOfElements.length() ) + myMesh->SetIsModified( true ); // issue 0020693 return true; } @@ -423,17 +1014,15 @@ CORBA::Boolean SMESH_MeshEditor_i::Reorient(const SMESH::long_array & IDsOfEleme CORBA::Boolean SMESH_MeshEditor_i::ReorientObject(SMESH::SMESH_IDSource_ptr theObject) { + initData(); + + TPythonDump aTPythonDump; // suppress dump in Reorient() + SMESH::long_array_var anElementsId = theObject->GetIDs(); CORBA::Boolean isDone = Reorient(anElementsId); - // Clear python line, created by Reorient() - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); - // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.ReorientObject("); - SMESH_Gen_i::AddObject( str, theObject ) += ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); + aTPythonDump << "isDone = " << this << ".ReorientObject( " << theObject << " )"; return isDone; } @@ -447,14 +1036,12 @@ CORBA::Boolean SMESH_MeshEditor_i::TriToQuad (const SMESH::long_array & IDsOfE SMESH::NumericalFunctor_ptr Criterion, CORBA::Double MaxAngle) { - set faces; - for (int i = 0; i < IDsOfElements.length(); i++) - { - CORBA::Long index = IDsOfElements[i]; - const SMDS_MeshElement * elem = GetMeshDS()->FindElement(index); - if ( elem && elem->GetType() == SMDSAbs_Face) - faces.insert( elem ); - } + initData(); + + SMESHDS_Mesh* aMesh = GetMeshDS(); + TIDSortedElemSet faces; + arrayToSet(IDsOfElements, aMesh, faces, SMDSAbs_Face); + SMESH::NumericalFunctor_i* aNumericalFunctor = dynamic_cast( SMESH_Gen_i::GetServant( Criterion ).in() ); SMESH::Controls::NumericalFunctorPtr aCrit; @@ -464,18 +1051,21 @@ CORBA::Boolean SMESH_MeshEditor_i::TriToQuad (const SMESH::long_array & IDsOfE aCrit = aNumericalFunctor->GetNumericalFunctor(); // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.TriToQuad("); - SMESH_Gen_i::AddArray( str, IDsOfElements ) += ", None, "; - str += TCollection_AsciiString((Standard_Real) MaxAngle) + ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"TriToQuad: \", isDone" ); -#endif + TPythonDump() << "isDone = " << this << ".TriToQuad( " + << IDsOfElements << ", " << aNumericalFunctor << ", " << MaxAngle << " )"; - ::SMESH_MeshEditor anEditor( _myMesh ); - return anEditor.TriToQuad( faces, aCrit, MaxAngle ); + ::SMESH_MeshEditor anEditor( myMesh ); + + bool stat = anEditor.TriToQuad( faces, aCrit, MaxAngle ); + if ( stat ) + myMesh->SetIsModified( true ); // issue 0020693 + + storeResult(anEditor); + + return stat; } + //============================================================================= /*! * @@ -485,28 +1075,23 @@ CORBA::Boolean SMESH_MeshEditor_i::TriToQuadObject (SMESH::SMESH_IDSource_ptr SMESH::NumericalFunctor_ptr Criterion, CORBA::Double MaxAngle) { + initData(); + + TPythonDump aTPythonDump; // suppress dump in TriToQuad() SMESH::long_array_var anElementsId = theObject->GetIDs(); CORBA::Boolean isDone = TriToQuad(anElementsId, Criterion, MaxAngle); - // Clear python line(s), created by TriToQuad() - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); -#ifdef _DEBUG_ - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); -#endif + SMESH::NumericalFunctor_i* aNumericalFunctor = + SMESH::DownCast( Criterion ); // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.TriToQuadObject("); - SMESH_Gen_i::AddObject( str, theObject ) += ", None, "; - str += TCollection_AsciiString((Standard_Real) MaxAngle) + ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"TriToQuadObject: \", isDone" ); -#endif + aTPythonDump << "isDone = " << this << ".TriToQuadObject(" + << theObject << ", " << aNumericalFunctor << ", " << MaxAngle << " )"; return isDone; } + //============================================================================= /*! * @@ -515,14 +1100,12 @@ CORBA::Boolean SMESH_MeshEditor_i::TriToQuadObject (SMESH::SMESH_IDSource_ptr CORBA::Boolean SMESH_MeshEditor_i::QuadToTri (const SMESH::long_array & IDsOfElements, SMESH::NumericalFunctor_ptr Criterion) { - set faces; - for (int i = 0; i < IDsOfElements.length(); i++) - { - CORBA::Long index = IDsOfElements[i]; - const SMDS_MeshElement * elem = GetMeshDS()->FindElement(index); - if ( elem && elem->GetType() == SMDSAbs_Face) - faces.insert( elem ); - } + initData(); + + SMESHDS_Mesh* aMesh = GetMeshDS(); + TIDSortedElemSet faces; + arrayToSet(IDsOfElements, aMesh, faces, SMDSAbs_Face); + SMESH::NumericalFunctor_i* aNumericalFunctor = dynamic_cast( SMESH_Gen_i::GetServant( Criterion ).in() ); SMESH::Controls::NumericalFunctorPtr aCrit; @@ -533,17 +1116,19 @@ CORBA::Boolean SMESH_MeshEditor_i::QuadToTri (const SMESH::long_array & IDsOfE // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.QuadToTri("); - SMESH_Gen_i::AddArray( str, IDsOfElements ) += ", None )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"QuadToTri: \", isDone" ); -#endif + TPythonDump() << "isDone = " << this << ".QuadToTri( " << IDsOfElements << ", " << aNumericalFunctor << " )"; + + ::SMESH_MeshEditor anEditor( myMesh ); + CORBA::Boolean stat = anEditor.QuadToTri( faces, aCrit ); + if ( stat ) + myMesh->SetIsModified( true ); // issue 0020693 - ::SMESH_MeshEditor anEditor( _myMesh ); - return anEditor.QuadToTri( faces, aCrit ); + storeResult(anEditor); + + return stat; } + //============================================================================= /*! * @@ -552,27 +1137,23 @@ CORBA::Boolean SMESH_MeshEditor_i::QuadToTri (const SMESH::long_array & IDsOfE CORBA::Boolean SMESH_MeshEditor_i::QuadToTriObject (SMESH::SMESH_IDSource_ptr theObject, SMESH::NumericalFunctor_ptr Criterion) { + initData(); + + TPythonDump aTPythonDump; // suppress dump in QuadToTri() + SMESH::long_array_var anElementsId = theObject->GetIDs(); CORBA::Boolean isDone = QuadToTri(anElementsId, Criterion); - // Clear python line(s), created by QuadToTri() - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); -#ifdef _DEBUG_ - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); -#endif + SMESH::NumericalFunctor_i* aNumericalFunctor = + SMESH::DownCast( Criterion ); // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.QuadToTriObject("); - SMESH_Gen_i::AddObject( str, theObject ) += ", None )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"QuadToTriObject: \", isDone" ); -#endif + aTPythonDump << "isDone = " << this << ".QuadToTriObject( " << theObject << ", " << aNumericalFunctor << " )"; return isDone; } + //============================================================================= /*! * @@ -581,28 +1162,28 @@ CORBA::Boolean SMESH_MeshEditor_i::QuadToTriObject (SMESH::SMESH_IDSource_ptr CORBA::Boolean SMESH_MeshEditor_i::SplitQuad (const SMESH::long_array & IDsOfElements, CORBA::Boolean Diag13) { - set faces; - for (int i = 0; i < IDsOfElements.length(); i++) - { - CORBA::Long index = IDsOfElements[i]; - const SMDS_MeshElement * elem = GetMeshDS()->FindElement(index); - if ( elem && elem->GetType() == SMDSAbs_Face) - faces.insert( elem ); - } + initData(); + + SMESHDS_Mesh* aMesh = GetMeshDS(); + TIDSortedElemSet faces; + arrayToSet(IDsOfElements, aMesh, faces, SMDSAbs_Face); // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.SplitQuad("); - SMESH_Gen_i::AddArray( str, IDsOfElements ) += ", "; - str += TCollection_AsciiString( Diag13 ) + ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"SplitQuad: \", isDone" ); -#endif + TPythonDump() << "isDone = " << this << ".SplitQuad( " + << IDsOfElements << ", " << Diag13 << " )"; + + ::SMESH_MeshEditor anEditor( myMesh ); + CORBA::Boolean stat = anEditor.QuadToTri( faces, Diag13 ); + if ( stat ) + myMesh->SetIsModified( true ); // issue 0020693 + + + storeResult(anEditor); - ::SMESH_MeshEditor anEditor( _myMesh ); - return anEditor.QuadToTri( faces, Diag13 ); + return stat; } + //============================================================================= /*! * @@ -611,28 +1192,21 @@ CORBA::Boolean SMESH_MeshEditor_i::SplitQuad (const SMESH::long_array & IDsOfEle CORBA::Boolean SMESH_MeshEditor_i::SplitQuadObject (SMESH::SMESH_IDSource_ptr theObject, CORBA::Boolean Diag13) { + initData(); + + TPythonDump aTPythonDump; // suppress dump in SplitQuad() + SMESH::long_array_var anElementsId = theObject->GetIDs(); CORBA::Boolean isDone = SplitQuad(anElementsId, Diag13); - // Clear python line(s), created by SplitQuad() - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); -#ifdef _DEBUG_ - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); -#endif - // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor.SplitQuadObject("); - SMESH_Gen_i::AddObject( str, theObject ) += ", "; - str += TCollection_AsciiString( Diag13 ) + ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"SplitQuadObject: \", isDone" ); -#endif + aTPythonDump << "isDone = " << this << ".SplitQuadObject( " + << theObject << ", " << Diag13 << " )"; return isDone; } + //============================================================================= /*! * BestSplit @@ -641,6 +1215,8 @@ CORBA::Boolean SMESH_MeshEditor_i::SplitQuadObject (SMESH::SMESH_IDSource_ptr th CORBA::Long SMESH_MeshEditor_i::BestSplit (CORBA::Long IDOfQuad, SMESH::NumericalFunctor_ptr Criterion) { + initData(); + const SMDS_MeshElement* quad = GetMeshDS()->FindElement(IDOfQuad); if (quad && quad->GetType() == SMDSAbs_Face && quad->NbNodes() == 4) { @@ -652,76 +1228,110 @@ CORBA::Long SMESH_MeshEditor_i::BestSplit (CORBA::Long IDOfQuad, else aCrit.reset(new SMESH::Controls::AspectRatio()); - ::SMESH_MeshEditor anEditor (_myMesh); + ::SMESH_MeshEditor anEditor (myMesh); return anEditor.BestSplit(quad, aCrit); } return -1; } +//================================================================================ +/*! + * \brief Split volumic elements into tetrahedrons + */ +//================================================================================ + +void SMESH_MeshEditor_i::SplitVolumesIntoTetra (SMESH::SMESH_IDSource_ptr elems, + CORBA::Short methodFlags) + throw (SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + + initData(); + + SMESH::long_array_var anElementsId = elems->GetIDs(); + TIDSortedElemSet elemSet; + arrayToSet( anElementsId, GetMeshDS(), elemSet, SMDSAbs_Volume ); + + ::SMESH_MeshEditor anEditor (myMesh); + anEditor.SplitVolumesIntoTetra( elemSet, int( methodFlags )); + + storeResult(anEditor); + +// if ( myLastCreatedElems.length() ) - it does not influence Compute() +// myMesh->SetIsModified( true ); // issue 0020693 + + TPythonDump() << this << ".SplitVolumesIntoTetra( " + << elems << ", " << methodFlags << " )"; +} + //======================================================================= //function : Smooth //purpose : //======================================================================= CORBA::Boolean - SMESH_MeshEditor_i::Smooth(const SMESH::long_array & IDsOfElements, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method) +SMESH_MeshEditor_i::Smooth(const SMESH::long_array & IDsOfElements, + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method) { return smooth( IDsOfElements, IDsOfFixedNodes, MaxNbOfIterations, - MaxAspectRatio, Method, false ); + MaxAspectRatio, Method, false ); } + //======================================================================= //function : SmoothParametric //purpose : //======================================================================= CORBA::Boolean - SMESH_MeshEditor_i::SmoothParametric(const SMESH::long_array & IDsOfElements, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method) +SMESH_MeshEditor_i::SmoothParametric(const SMESH::long_array & IDsOfElements, + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method) { return smooth( IDsOfElements, IDsOfFixedNodes, MaxNbOfIterations, - MaxAspectRatio, Method, true ); + MaxAspectRatio, Method, true ); } + //======================================================================= //function : SmoothObject //purpose : //======================================================================= CORBA::Boolean - SMESH_MeshEditor_i::SmoothObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method) +SMESH_MeshEditor_i::SmoothObject(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method) { return smoothObject (theObject, IDsOfFixedNodes, MaxNbOfIterations, MaxAspectRatio, Method, false); } + //======================================================================= //function : SmoothParametricObject //purpose : //======================================================================= CORBA::Boolean - SMESH_MeshEditor_i::SmoothParametricObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method) +SMESH_MeshEditor_i::SmoothParametricObject(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method) { return smoothObject (theObject, IDsOfFixedNodes, MaxNbOfIterations, MaxAspectRatio, Method, true); } + //============================================================================= /*! * @@ -729,27 +1339,22 @@ CORBA::Boolean //============================================================================= CORBA::Boolean - SMESH_MeshEditor_i::smooth(const SMESH::long_array & IDsOfElements, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method, - bool IsParametric) +SMESH_MeshEditor_i::smooth(const SMESH::long_array & IDsOfElements, + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method, + bool IsParametric) { + initData(); + SMESHDS_Mesh* aMesh = GetMeshDS(); - set elements; - for (int i = 0; i < IDsOfElements.length(); i++) - { - CORBA::Long index = IDsOfElements[i]; - const SMDS_MeshElement * elem = aMesh->FindElement(index); - if ( elem && elem->GetType() == SMDSAbs_Face) - elements.insert( elem ); - } + TIDSortedElemSet elements; + arrayToSet(IDsOfElements, aMesh, elements, SMDSAbs_Face); set fixedNodes; - for (int i = 0; i < IDsOfFixedNodes.length(); i++) - { + for (int i = 0; i < IDsOfFixedNodes.length(); i++) { CORBA::Long index = IDsOfFixedNodes[i]; const SMDS_MeshNode * node = aMesh->FindNode(index); if ( node ) @@ -759,32 +1364,27 @@ CORBA::Boolean if ( Method != SMESH::SMESH_MeshEditor::LAPLACIAN_SMOOTH ) method = ::SMESH_MeshEditor::CENTROIDAL; - ::SMESH_MeshEditor anEditor( _myMesh ); + ::SMESH_MeshEditor anEditor( myMesh ); anEditor.Smooth(elements, fixedNodes, method, MaxNbOfIterations, MaxAspectRatio, IsParametric ); + myMesh->SetIsModified( true ); // issue 0020693 + + storeResult(anEditor); + // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor."); - str += (char*) (IsParametric ? "SmoothParametric( " : "Smooth( "); - SMESH_Gen_i::AddArray( str, IDsOfElements ) += ", "; - SMESH_Gen_i::AddArray( str, IDsOfFixedNodes ) += ", "; - str += (Standard_Integer) MaxNbOfIterations; - str += ", "; - str += (Standard_Real) MaxAspectRatio; - if ( method == ::SMESH_MeshEditor::CENTROIDAL ) - str += ", SMESH.SMESH_MeshEditor.CENTROIDAL_SMOOTH, "; - else - str += ", SMESH.SMESH_MeshEditor.LAPLACIAN_SMOOTH, "; - str += IsParametric; - str += " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"Smooth: \", isDone" ); -#endif + TPythonDump() << "isDone = " << this << "." + << (IsParametric ? "SmoothParametric( " : "Smooth( ") + << IDsOfElements << ", " << IDsOfFixedNodes << ", " + << MaxNbOfIterations << ", " << MaxAspectRatio << ", " + << "SMESH.SMESH_MeshEditor." + << ( Method == SMESH::SMESH_MeshEditor::CENTROIDAL_SMOOTH ? + "CENTROIDAL_SMOOTH )" : "LAPLACIAN_SMOOTH )"); return true; } + //============================================================================= /*! * @@ -792,46 +1392,34 @@ CORBA::Boolean //============================================================================= CORBA::Boolean - SMESH_MeshEditor_i::smoothObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method, - bool IsParametric) +SMESH_MeshEditor_i::smoothObject(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method, + bool IsParametric) { + initData(); + + TPythonDump aTPythonDump; // suppress dump in smooth() + SMESH::long_array_var anElementsId = theObject->GetIDs(); CORBA::Boolean isDone = smooth (anElementsId, IDsOfFixedNodes, MaxNbOfIterations, MaxAspectRatio, Method, IsParametric); - // Clear python line(s), created by Smooth() - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); -#ifdef _DEBUG_ - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); -#endif - // Update Python script - TCollection_AsciiString str ("isDone = mesh_editor."); - str += (char*) (IsParametric ? "SmoothParametricObject( " : "SmoothObject( "); - SMESH_Gen_i::AddObject( str, theObject ) += ", "; - SMESH_Gen_i::AddArray( str, IDsOfFixedNodes ) += ", "; - str += (Standard_Integer) MaxNbOfIterations; - str += ", "; - str += (Standard_Real) MaxAspectRatio; - if ( Method == SMESH::SMESH_MeshEditor::CENTROIDAL_SMOOTH ) - str += ", SMESH.SMESH_MeshEditor.CENTROIDAL_SMOOTH, "; - else - str += ", SMESH.SMESH_MeshEditor.LAPLACIAN_SMOOTH, "; - str += IsParametric; - str += " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); -#ifdef _DEBUG_ - SMESH_Gen_i::AddToCurrentPyScript( "print \"SmoothObject: \", isDone" ); -#endif + aTPythonDump << "isDone = " << this << "." + << (IsParametric ? "SmoothParametricObject( " : "SmoothObject( ") + << theObject << ", " << IDsOfFixedNodes << ", " + << MaxNbOfIterations << ", " << MaxAspectRatio << ", " + << "SMESH.SMESH_MeshEditor." + << ( Method == SMESH::SMESH_MeshEditor::CENTROIDAL_SMOOTH ? + "CENTROIDAL_SMOOTH )" : "LAPLACIAN_SMOOTH )"); return isDone; } + //============================================================================= /*! * @@ -841,11 +1429,12 @@ CORBA::Boolean void SMESH_MeshEditor_i::RenumberNodes() { // Update Python script - SMESH_Gen_i::AddToCurrentPyScript( "mesh_editor.RenumberNodes()" ); + TPythonDump() << this << ".RenumberNodes()"; GetMeshDS()->Renumber( true ); } + //============================================================================= /*! * @@ -855,11 +1444,75 @@ void SMESH_MeshEditor_i::RenumberNodes() void SMESH_MeshEditor_i::RenumberElements() { // Update Python script - SMESH_Gen_i::AddToCurrentPyScript( "mesh_editor.RenumberElements()" ); + TPythonDump() << this << ".RenumberElements()"; GetMeshDS()->Renumber( false ); } +//======================================================================= +/*! + * \brief Return groups by their IDs + */ +//======================================================================= + +SMESH::ListOfGroups* SMESH_MeshEditor_i::getGroups(const std::list* groupIDs) +{ + if ( !groupIDs ) + return 0; + myMesh_i->CreateGroupServants(); + return myMesh_i->GetGroups( *groupIDs ); +} + +//======================================================================= +//function : rotationSweep +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::rotationSweep(const SMESH::long_array & theIDsOfElements, + const SMESH::AxisStruct & theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance, + const bool theMakeGroups, + const SMDSAbs_ElementType theElementType) +{ + initData(); + + TIDSortedElemSet inElements, copyElements; + arrayToSet(theIDsOfElements, GetMeshDS(), inElements, theElementType); + + TIDSortedElemSet* workElements = & inElements; + TPreviewMesh tmpMesh( SMDSAbs_Face ); + SMESH_Mesh* mesh = 0; + bool makeWalls=true; + if ( myPreviewMode ) + { + SMDSAbs_ElementType select = SMDSAbs_All, avoid = SMDSAbs_Volume; + tmpMesh.Copy( inElements, copyElements, select, avoid ); + mesh = &tmpMesh; + workElements = & copyElements; + //makeWalls = false; + } + else + { + mesh = myMesh; + } + + gp_Ax1 Ax1 (gp_Pnt( theAxis.x, theAxis.y, theAxis.z ), + gp_Vec( theAxis.vx, theAxis.vy, theAxis.vz )); + + ::SMESH_MeshEditor anEditor( mesh ); + ::SMESH_MeshEditor::PGroupIDs groupIds = + anEditor.RotationSweep (*workElements, Ax1, theAngleInRadians, + theNbOfSteps, theTolerance, theMakeGroups, makeWalls); + storeResult(anEditor); + + // myMesh->SetIsModified( true ); -- it does not influence Compute() + + return theMakeGroups ? getGroups(groupIds.get()) : 0; +} + //======================================================================= //function : RotationSweep //purpose : @@ -871,33 +1524,51 @@ void SMESH_MeshEditor_i::RotationSweep(const SMESH::long_array & theIDsOfElement CORBA::Long theNbOfSteps, CORBA::Double theTolerance) { - SMESHDS_Mesh* aMesh = GetMeshDS(); - - set elements; - for (int i = 0; i < theIDsOfElements.length(); i++) - { - CORBA::Long index = theIDsOfElements[i]; - const SMDS_MeshElement * elem = aMesh->FindElement(index); - if ( elem ) - elements.insert( elem ); + if ( !myPreviewMode ) { + TPythonDump() << this << ".RotationSweep( " + << theIDsOfElements << ", " + << theAxis << ", " + << theAngleInRadians << ", " + << theNbOfSteps << ", " + << theTolerance << " )"; } - gp_Ax1 Ax1 (gp_Pnt( theAxis.x, theAxis.y, theAxis.z ), - gp_Vec( theAxis.vx, theAxis.vy, theAxis.vz )); + rotationSweep(theIDsOfElements, + theAxis, + theAngleInRadians, + theNbOfSteps, + theTolerance, + false); +} - ::SMESH_MeshEditor anEditor( _myMesh ); - anEditor.RotationSweep (elements, Ax1, theAngleInRadians, - theNbOfSteps, theTolerance); +//======================================================================= +//function : RotationSweepMakeGroups +//purpose : +//======================================================================= - // Update Python script - TCollection_AsciiString str = "axis = "; - addAxis( str, theAxis ); - SMESH_Gen_i::AddToCurrentPyScript( str ); - str = "mesh_editor.RotationSweep("; - SMESH_Gen_i::AddArray( str, theIDsOfElements ) += ", axis, "; - str += TCollection_AsciiString( theAngleInRadians ) + ", "; - str += TCollection_AsciiString( (int)theNbOfSteps ) + ", "; - str += TCollection_AsciiString( theTolerance ) + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); +SMESH::ListOfGroups* +SMESH_MeshEditor_i::RotationSweepMakeGroups(const SMESH::long_array& theIDsOfElements, + const SMESH::AxisStruct& theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance) +{ + SMESH::ListOfGroups *aGroups = rotationSweep(theIDsOfElements, + theAxis, + theAngleInRadians, + theNbOfSteps, + theTolerance, + true); + if ( !myPreviewMode ) { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump<< this << ".RotationSweepMakeGroups( " + << theIDsOfElements << ", " + << theAxis << ", " + << theAngleInRadians << ", " + << theNbOfSteps << ", " + << theTolerance << " )"; + } + return aGroups; } //======================================================================= @@ -906,797 +1577,3642 @@ void SMESH_MeshEditor_i::RotationSweep(const SMESH::long_array & theIDsOfElement //======================================================================= void SMESH_MeshEditor_i::RotationSweepObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & theAxis, - CORBA::Double theAngleInRadians, - CORBA::Long theNbOfSteps, - CORBA::Double theTolerance) + const SMESH::AxisStruct & theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance) { + if ( !myPreviewMode ) { + TPythonDump() << this << ".RotationSweepObject( " + << theObject << ", " + << theAxis << ", " + << theAngleInRadians << ", " + << theNbOfSteps << ", " + << theTolerance << " )"; + } SMESH::long_array_var anElementsId = theObject->GetIDs(); - RotationSweep(anElementsId, theAxis, theAngleInRadians, theNbOfSteps, theTolerance); - - // Clear python line, created by RotationSweep() - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); - - // Update Python script - TCollection_AsciiString str ("mesh_editor.RotationSweepObject("); - SMESH_Gen_i::AddObject( str, theObject ) += ", axis, "; - str += TCollection_AsciiString( theAngleInRadians ) + ", "; - str += TCollection_AsciiString( (int)theNbOfSteps ) + ", "; - str += TCollection_AsciiString( theTolerance ) + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); + rotationSweep(anElementsId, + theAxis, + theAngleInRadians, + theNbOfSteps, + theTolerance, + false); } //======================================================================= -//function : ExtrusionSweep +//function : RotationSweepObject1D //purpose : //======================================================================= -void SMESH_MeshEditor_i::ExtrusionSweep(const SMESH::long_array & theIDsOfElements, - const SMESH::DirStruct & theStepVector, - CORBA::Long theNbOfSteps) +void SMESH_MeshEditor_i::RotationSweepObject1D(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::AxisStruct & theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance) { - SMESHDS_Mesh* aMesh = GetMeshDS(); - - set elements; - for (int i = 0; i < theIDsOfElements.length(); i++) - { - CORBA::Long index = theIDsOfElements[i]; - const SMDS_MeshElement * elem = aMesh->FindElement(index); - if ( elem ) - elements.insert( elem ); + if ( !myPreviewMode ) { + TPythonDump() << this << ".RotationSweepObject1D( " + << theObject << ", " + << theAxis << ", " + << theAngleInRadians << ", " + << theNbOfSteps << ", " + << theTolerance << " )"; } - const SMESH::PointStruct * P = &theStepVector.PS; - gp_Vec stepVec( P->x, P->y, P->z ); - - ::SMESH_MeshEditor anEditor( _myMesh ); - anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps); - - // Update Python script - TCollection_AsciiString str = "stepVector = SMESH.DirStruct( SMESH.PointStruct ( "; - str += (TCollection_AsciiString) stepVec.X() + ", "; - str += (TCollection_AsciiString) stepVec.Y() + ", "; - str += (TCollection_AsciiString) stepVec.Z() + " ))"; - SMESH_Gen_i::AddToCurrentPyScript( str ); - str = ("mesh_editor.ExtrusionSweep("); - SMESH_Gen_i::AddArray( str, theIDsOfElements ) += ", stepVector, "; - str += TCollection_AsciiString((int)theNbOfSteps) + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); + SMESH::long_array_var anElementsId = theObject->GetIDs(); + rotationSweep(anElementsId, + theAxis, + theAngleInRadians, + theNbOfSteps, + theTolerance, + false, + SMDSAbs_Edge); } - //======================================================================= -//function : ExtrusionSweepObject +//function : RotationSweepObject2D //purpose : //======================================================================= -void SMESH_MeshEditor_i::ExtrusionSweepObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::DirStruct & theStepVector, - CORBA::Long theNbOfSteps) +void SMESH_MeshEditor_i::RotationSweepObject2D(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::AxisStruct & theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance) { + if ( !myPreviewMode ) { + TPythonDump() << this << ".RotationSweepObject2D( " + << theObject << ", " + << theAxis << ", " + << theAngleInRadians << ", " + << theNbOfSteps << ", " + << theTolerance << " )"; + } SMESH::long_array_var anElementsId = theObject->GetIDs(); - ExtrusionSweep(anElementsId, theStepVector, theNbOfSteps); - - // Clear python line, created by ExtrusionSweep() - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); - - // Update Python script - TCollection_AsciiString str ("mesh_editor.ExtrusionSweepObject("); - SMESH_Gen_i::AddObject( str, theObject ) += ", stepVector, "; - str += TCollection_AsciiString((int)theNbOfSteps) + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); + rotationSweep(anElementsId, + theAxis, + theAngleInRadians, + theNbOfSteps, + theTolerance, + false, + SMDSAbs_Face); } + //======================================================================= -//function : ExtrusionSweepObject1D -//purpose : +//function : RotationSweepObjectMakeGroups +//purpose : //======================================================================= -void SMESH_MeshEditor_i::ExtrusionSweepObject1D(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::DirStruct & theStepVector, - CORBA::Long theNbOfSteps) +SMESH::ListOfGroups* +SMESH_MeshEditor_i::RotationSweepObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::AxisStruct& theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance) { - SMESHDS_Mesh* aMesh = GetMeshDS(); - - SMESH::long_array_var allElementsId = theObject->GetIDs(); - - set elements; - for (int i = 0; i < allElementsId->length(); i++) - { - CORBA::Long index = allElementsId[i]; - const SMDS_MeshElement * elem = aMesh->FindElement(index); - if ( elem && elem->GetType() == SMDSAbs_Edge ) - elements.insert( elem ); + SMESH::long_array_var anElementsId = theObject->GetIDs(); + SMESH::ListOfGroups *aGroups = rotationSweep(anElementsId, + theAxis, + theAngleInRadians, + theNbOfSteps, + theTolerance, + true); + if ( !myPreviewMode ) { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump<< this << ".RotationSweepObjectMakeGroups( " + << theObject << ", " + << theAxis << ", " + << theAngleInRadians << ", " + << theNbOfSteps << ", " + << theTolerance << " )"; } - const SMESH::PointStruct * P = &theStepVector.PS; - gp_Vec stepVec( P->x, P->y, P->z ); - - ::SMESH_MeshEditor anEditor( _myMesh ); - anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps); + return aGroups; } //======================================================================= -//function : ExtrusionSweepObject2D -//purpose : +//function : RotationSweepObject1DMakeGroups +//purpose : //======================================================================= -void SMESH_MeshEditor_i::ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::DirStruct & theStepVector, - CORBA::Long theNbOfSteps) +SMESH::ListOfGroups* +SMESH_MeshEditor_i::RotationSweepObject1DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::AxisStruct& theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance) { - SMESHDS_Mesh* aMesh = GetMeshDS(); - - SMESH::long_array_var allElementsId = theObject->GetIDs(); - - set elements; - for (int i = 0; i < allElementsId->length(); i++) - { - CORBA::Long index = allElementsId[i]; - const SMDS_MeshElement * elem = aMesh->FindElement(index); - if ( elem && elem->GetType() == SMDSAbs_Face ) - elements.insert( elem ); + SMESH::long_array_var anElementsId = theObject->GetIDs(); + SMESH::ListOfGroups *aGroups = rotationSweep(anElementsId, + theAxis, + theAngleInRadians, + theNbOfSteps, + theTolerance, + true, + SMDSAbs_Edge); + if ( !myPreviewMode ) { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump<< this << ".RotationSweepObject1DMakeGroups( " + << theObject << ", " + << theAxis << ", " + << theAngleInRadians << ", " + << theNbOfSteps << ", " + << theTolerance << " )"; } - const SMESH::PointStruct * P = &theStepVector.PS; - gp_Vec stepVec( P->x, P->y, P->z ); - - ::SMESH_MeshEditor anEditor( _myMesh ); - anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps); + return aGroups; } -#define RETCASE(enm) case ::SMESH_MeshEditor::enm: return SMESH::SMESH_MeshEditor::enm; +//======================================================================= +//function : RotationSweepObject2DMakeGroups +//purpose : +//======================================================================= -static SMESH::SMESH_MeshEditor::Extrusion_Error convExtrError( const::SMESH_MeshEditor::Extrusion_Error e ) +SMESH::ListOfGroups* +SMESH_MeshEditor_i::RotationSweepObject2DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::AxisStruct& theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance) { - switch ( e ) { - RETCASE( EXTR_OK ); - RETCASE( EXTR_NO_ELEMENTS ); - RETCASE( EXTR_PATH_NOT_EDGE ); - RETCASE( EXTR_BAD_PATH_SHAPE ); - RETCASE( EXTR_BAD_STARTING_NODE ); - RETCASE( EXTR_BAD_ANGLES_NUMBER ); - RETCASE( EXTR_CANT_GET_TANGENT ); + SMESH::long_array_var anElementsId = theObject->GetIDs(); + SMESH::ListOfGroups *aGroups = rotationSweep(anElementsId, + theAxis, + theAngleInRadians, + theNbOfSteps, + theTolerance, + true, + SMDSAbs_Face); + if ( !myPreviewMode ) { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump<< this << ".RotationSweepObject2DMakeGroups( " + << theObject << ", " + << theAxis << ", " + << theAngleInRadians << ", " + << theNbOfSteps << ", " + << theTolerance << " )"; } - return SMESH::SMESH_MeshEditor::EXTR_OK; + return aGroups; } + //======================================================================= -//function : ExtrusionAlongPath -//purpose : +//function : extrusionSweep +//purpose : //======================================================================= -SMESH::SMESH_MeshEditor::Extrusion_Error - SMESH_MeshEditor_i::ExtrusionAlongPath(const SMESH::long_array & theIDsOfElements, - SMESH::SMESH_Mesh_ptr thePathMesh, - GEOM::GEOM_Object_ptr thePathShape, - CORBA::Long theNodeStart, - CORBA::Boolean theHasAngles, - const SMESH::double_array & theAngles, - CORBA::Boolean theHasRefPoint, - const SMESH::PointStruct & theRefPoint) +SMESH::ListOfGroups* +SMESH_MeshEditor_i::extrusionSweep(const SMESH::long_array & theIDsOfElements, + const SMESH::DirStruct & theStepVector, + CORBA::Long theNbOfSteps, + const bool theMakeGroups, + const SMDSAbs_ElementType theElementType) { - SMESHDS_Mesh* aMesh = GetMeshDS(); + initData(); - if ( thePathMesh->_is_nil() || thePathShape->_is_nil() ) - return SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE; + try { +#ifdef NO_CAS_CATCH + OCC_CATCH_SIGNALS; +#endif + TIDSortedElemSet elements; + arrayToSet(theIDsOfElements, GetMeshDS(), elements, theElementType); - SMESH_Mesh_i* aMeshImp = dynamic_cast( SMESH_Gen_i::GetServant( thePathMesh ).in() ); - TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( thePathShape ); - SMESH_subMesh* aSubMesh = aMeshImp->GetImpl().GetSubMesh( aShape ); + const SMESH::PointStruct * P = &theStepVector.PS; + gp_Vec stepVec( P->x, P->y, P->z ); - if ( !aSubMesh ) - return SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE; + TElemOfElemListMap aHystory; + ::SMESH_MeshEditor anEditor( myMesh ); + ::SMESH_MeshEditor::PGroupIDs groupIds = + anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory, theMakeGroups); - SMDS_MeshNode* nodeStart = (SMDS_MeshNode*)aMeshImp->GetImpl().GetMeshDS()->FindNode(theNodeStart); - if ( !nodeStart ) - return SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE; + storeResult(anEditor); - set elements; - for (int i = 0; i < theIDsOfElements.length(); i++) - { - CORBA::Long index = theIDsOfElements[i]; - const SMDS_MeshElement * elem = aMesh->FindElement(index); - if ( elem ) - elements.insert( elem ); - } + return theMakeGroups ? getGroups(groupIds.get()) : 0; - list angles; - for (int i = 0; i < theAngles.length(); i++) - { - angles.push_back( theAngles[i] ); + } catch(Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + INFOS( "SMESH_MeshEditor_i::ExtrusionSweep fails - "<< aFail->GetMessageString() ); } - - gp_Pnt refPnt( theRefPoint.x, theRefPoint.y, theRefPoint.z ); - - // Update Python script - TCollection_AsciiString str = "refPoint = SMESH.PointStruct( "; - str += (TCollection_AsciiString) refPnt.X() + ", "; - str += (TCollection_AsciiString) refPnt.Y() + ", "; - str += (TCollection_AsciiString) refPnt.Z() + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); - str = ("error = mesh_editor.ExtrusionAlongPath("); - SMESH_Gen_i::AddArray ( str, theIDsOfElements ) += ", "; - SMESH_Gen_i::AddObject( str, thePathMesh ) += ", "; - SMESH_Gen_i::AddObject( str, thePathShape ) += ", "; - str += TCollection_AsciiString( (int)theNodeStart ) + ", "; - str += TCollection_AsciiString( (int)theHasAngles ) + ", "; - SMESH_Gen_i::AddArray ( str, theAngles ) += ", "; - str += (TCollection_AsciiString) theHasRefPoint + ", refPoint )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); - - ::SMESH_MeshEditor anEditor( _myMesh ); - return convExtrError( anEditor.ExtrusionAlongTrack( elements, aSubMesh, nodeStart, theHasAngles, angles, theHasRefPoint, refPnt ) ); + return 0; } //======================================================================= -//function : ExtrusionAlongPathObject +//function : ExtrusionSweep //purpose : //======================================================================= -SMESH::SMESH_MeshEditor::Extrusion_Error - SMESH_MeshEditor_i::ExtrusionAlongPathObject(SMESH::SMESH_IDSource_ptr theObject, - SMESH::SMESH_Mesh_ptr thePathMesh, - GEOM::GEOM_Object_ptr thePathShape, - CORBA::Long theNodeStart, - CORBA::Boolean theHasAngles, - const SMESH::double_array & theAngles, - CORBA::Boolean theHasRefPoint, - const SMESH::PointStruct & theRefPoint) +void SMESH_MeshEditor_i::ExtrusionSweep(const SMESH::long_array & theIDsOfElements, + const SMESH::DirStruct & theStepVector, + CORBA::Long theNbOfSteps) { - SMESH::long_array_var anElementsId = theObject->GetIDs(); - SMESH::SMESH_MeshEditor::Extrusion_Error error = ExtrusionAlongPath - (anElementsId, thePathMesh, thePathShape, theNodeStart, - theHasAngles, theAngles, theHasRefPoint, theRefPoint); + extrusionSweep (theIDsOfElements, theStepVector, theNbOfSteps, false ); + if ( !myPreviewMode ) { + TPythonDump() << this << ".ExtrusionSweep( " + << theIDsOfElements << ", " << theStepVector <<", " << theNbOfSteps << " )"; + } +} - // Clear python line, created by ExtrusionAlongPath() - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); - // Update Python script - TCollection_AsciiString str ("error = mesh_editor.ExtrusionAlongPathObject("); - SMESH_Gen_i::AddObject( str, theObject ) += ", "; - SMESH_Gen_i::AddObject( str, thePathMesh ) += ", "; - SMESH_Gen_i::AddObject( str, thePathShape ) += ", "; - str += TCollection_AsciiString( (int)theNodeStart ) + ", "; - str += TCollection_AsciiString( theHasAngles ) + ", "; - SMESH_Gen_i::AddArray ( str, theAngles ) += ", "; - str += TCollection_AsciiString( theHasRefPoint ) + ", refPoint )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); +//======================================================================= +//function : ExtrusionSweepObject +//purpose : +//======================================================================= - return error; +void SMESH_MeshEditor_i::ExtrusionSweepObject(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::DirStruct & theStepVector, + CORBA::Long theNbOfSteps) +{ + SMESH::long_array_var anElementsId = theObject->GetIDs(); + extrusionSweep (anElementsId, theStepVector, theNbOfSteps, false ); + if ( !myPreviewMode ) { + TPythonDump() << this << ".ExtrusionSweepObject( " + << theObject << ", " << theStepVector << ", " << theNbOfSteps << " )"; + } } //======================================================================= -//function : Mirror +//function : ExtrusionSweepObject1D //purpose : //======================================================================= -void SMESH_MeshEditor_i::Mirror(const SMESH::long_array & theIDsOfElements, - const SMESH::AxisStruct & theAxis, - SMESH::SMESH_MeshEditor::MirrorType theMirrorType, - CORBA::Boolean theCopy) +void SMESH_MeshEditor_i::ExtrusionSweepObject1D(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::DirStruct & theStepVector, + CORBA::Long theNbOfSteps) { - SMESHDS_Mesh* aMesh = GetMeshDS(); - - set elements; - for (int i = 0; i < theIDsOfElements.length(); i++) - { - CORBA::Long index = theIDsOfElements[i]; - const SMDS_MeshElement * elem = aMesh->FindElement(index); - if ( elem ) - elements.insert( elem ); - } - gp_Pnt P ( theAxis.x, theAxis.y, theAxis.z ); - gp_Vec V ( theAxis.vx, theAxis.vy, theAxis.vz ); - - gp_Trsf aTrsf; - TCollection_AsciiString typeStr, copyStr( theCopy ); - switch ( theMirrorType ) { - case SMESH::SMESH_MeshEditor::POINT: - aTrsf.SetMirror( P ); - typeStr = "SMESH.SMESH_MeshEditor.POINT"; - break; - case SMESH::SMESH_MeshEditor::AXIS: - aTrsf.SetMirror( gp_Ax1( P, V )); - typeStr = "SMESH.SMESH_MeshEditor.AXIS"; - break; - default: - aTrsf.SetMirror( gp_Ax2( P, V )); - typeStr = "SMESH.SMESH_MeshEditor.PLANE"; + SMESH::long_array_var anElementsId = theObject->GetIDs(); + extrusionSweep (anElementsId, theStepVector, theNbOfSteps, false, SMDSAbs_Edge ); + if ( !myPreviewMode ) { + TPythonDump() << this << ".ExtrusionSweepObject1D( " + << theObject << ", " << theStepVector << ", " << theNbOfSteps << " )"; } - - // Update Python script - TCollection_AsciiString str ("mesh_editor.Mirror("); - SMESH_Gen_i::AddArray( str, theIDsOfElements ) += ", "; - addAxis( str, theAxis ) += ", "; - str += typeStr + ", "; - str += copyStr + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); - - ::SMESH_MeshEditor anEditor( _myMesh ); - anEditor.Transform (elements, aTrsf, theCopy); } //======================================================================= -//function : MirrorObject +//function : ExtrusionSweepObject2D //purpose : //======================================================================= -void SMESH_MeshEditor_i::MirrorObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & theAxis, - SMESH::SMESH_MeshEditor::MirrorType theMirrorType, - CORBA::Boolean theCopy) +void SMESH_MeshEditor_i::ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::DirStruct & theStepVector, + CORBA::Long theNbOfSteps) { SMESH::long_array_var anElementsId = theObject->GetIDs(); - Mirror(anElementsId, theAxis, theMirrorType, theCopy); - - // Clear python line, created by Mirror() - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); - - // Update Python script - TCollection_AsciiString typeStr, copyStr( theCopy ); - switch ( theMirrorType ) { - case SMESH::SMESH_MeshEditor::POINT: - typeStr = "SMESH.SMESH_MeshEditor.POINT"; - break; - case SMESH::SMESH_MeshEditor::AXIS: - typeStr = "SMESH.SMESH_MeshEditor.AXIS"; - break; - default: - typeStr = "SMESH.SMESH_MeshEditor.PLANE"; + extrusionSweep (anElementsId, theStepVector, theNbOfSteps, false, SMDSAbs_Face ); + if ( !myPreviewMode ) { + TPythonDump() << this << ".ExtrusionSweepObject2D( " + << theObject << ", " << theStepVector << ", " << theNbOfSteps << " )"; } - - TCollection_AsciiString str ("mesh_editor.MirrorObject("); - SMESH_Gen_i::AddObject( str, theObject ) += ", "; - addAxis( str, theAxis ) += ", "; - str += typeStr + ", " + copyStr + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); } //======================================================================= -//function : Translate -//purpose : +//function : ExtrusionSweepMakeGroups +//purpose : //======================================================================= -void SMESH_MeshEditor_i::Translate(const SMESH::long_array & theIDsOfElements, - const SMESH::DirStruct & theVector, - CORBA::Boolean theCopy) +SMESH::ListOfGroups* +SMESH_MeshEditor_i::ExtrusionSweepMakeGroups(const SMESH::long_array& theIDsOfElements, + const SMESH::DirStruct& theStepVector, + CORBA::Long theNbOfSteps) { - SMESHDS_Mesh* aMesh = GetMeshDS(); + SMESH::ListOfGroups* aGroups = extrusionSweep (theIDsOfElements, theStepVector, theNbOfSteps, true ); - set elements; - for (int i = 0; i < theIDsOfElements.length(); i++) - { - CORBA::Long index = theIDsOfElements[i]; - const SMDS_MeshElement * elem = aMesh->FindElement(index); - if ( elem ) - elements.insert( elem ); + if ( !myPreviewMode ) { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump << this << ".ExtrusionSweepMakeGroups( " + << theIDsOfElements << ", " << theStepVector <<", " << theNbOfSteps << " )"; } - gp_Trsf aTrsf; - const SMESH::PointStruct * P = &theVector.PS; - aTrsf.SetTranslation( gp_Vec( P->x, P->y, P->z )); + return aGroups; +} +//======================================================================= +//function : ExtrusionSweepObjectMakeGroups +//purpose : +//======================================================================= - ::SMESH_MeshEditor anEditor( _myMesh ); - anEditor.Transform (elements, aTrsf, theCopy); +SMESH::ListOfGroups* +SMESH_MeshEditor_i::ExtrusionSweepObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::DirStruct& theStepVector, + CORBA::Long theNbOfSteps) +{ + SMESH::long_array_var anElementsId = theObject->GetIDs(); + SMESH::ListOfGroups * aGroups = extrusionSweep (anElementsId, theStepVector, theNbOfSteps, true ); - // Update Python script - TCollection_AsciiString str = "vector = SMESH.DirStruct( SMESH.PointStruct ( "; - str += (TCollection_AsciiString) P->x + ", "; - str += (TCollection_AsciiString) P->y + ", "; - str += (TCollection_AsciiString) P->z + " ))"; - SMESH_Gen_i::AddToCurrentPyScript( str ); - str = ("mesh_editor.Translate("); - SMESH_Gen_i::AddArray( str, theIDsOfElements ) += ", vector, "; - str += (TCollection_AsciiString) theCopy + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); + if ( !myPreviewMode ) { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump<< this << ".ExtrusionSweepObjectMakeGroups( " + << theObject << ", " << theStepVector << ", " << theNbOfSteps << " )"; + } + return aGroups; } //======================================================================= -//function : TranslateObject -//purpose : +//function : ExtrusionSweepObject1DMakeGroups +//purpose : //======================================================================= -void SMESH_MeshEditor_i::TranslateObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::DirStruct & theVector, - CORBA::Boolean theCopy) +SMESH::ListOfGroups* +SMESH_MeshEditor_i::ExtrusionSweepObject1DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::DirStruct& theStepVector, + CORBA::Long theNbOfSteps) { SMESH::long_array_var anElementsId = theObject->GetIDs(); - Translate(anElementsId, theVector, theCopy); + SMESH::ListOfGroups * aGroups = extrusionSweep (anElementsId, theStepVector, theNbOfSteps, true, SMDSAbs_Edge ); + if ( !myPreviewMode ) { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump << this << ".ExtrusionSweepObject1DMakeGroups( " + << theObject << ", " << theStepVector << ", " << theNbOfSteps << " )"; + } + return aGroups; +} - // Clear python line, created by Translate() - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); +//======================================================================= +//function : ExtrusionSweepObject2DMakeGroups +//purpose : +//======================================================================= - // Update Python script - TCollection_AsciiString str ("mesh_editor.TranslateObject("); - SMESH_Gen_i::AddObject( str, theObject ) += ", vector, "; - str += TCollection_AsciiString( theCopy ) + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); +SMESH::ListOfGroups* +SMESH_MeshEditor_i::ExtrusionSweepObject2DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::DirStruct& theStepVector, + CORBA::Long theNbOfSteps) +{ + SMESH::long_array_var anElementsId = theObject->GetIDs(); + SMESH::ListOfGroups * aGroups = extrusionSweep (anElementsId, theStepVector, theNbOfSteps, true, SMDSAbs_Face ); + if ( !myPreviewMode ) { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump << this << ".ExtrusionSweepObject2DMakeGroups( " + << theObject << ", " << theStepVector << ", " << theNbOfSteps << " )"; + } + return aGroups; } + //======================================================================= -//function : Rotate -//purpose : +//function : advancedExtrusion +//purpose : //======================================================================= -void SMESH_MeshEditor_i::Rotate(const SMESH::long_array & theIDsOfElements, - const SMESH::AxisStruct & theAxis, - CORBA::Double theAngle, - CORBA::Boolean theCopy) +SMESH::ListOfGroups* +SMESH_MeshEditor_i::advancedExtrusion(const SMESH::long_array & theIDsOfElements, + const SMESH::DirStruct & theStepVector, + CORBA::Long theNbOfSteps, + CORBA::Long theExtrFlags, + CORBA::Double theSewTolerance, + const bool theMakeGroups) { - SMESHDS_Mesh* aMesh = GetMeshDS(); + initData(); - set elements; - for (int i = 0; i < theIDsOfElements.length(); i++) - { - CORBA::Long index = theIDsOfElements[i]; - const SMDS_MeshElement * elem = aMesh->FindElement(index); - if ( elem ) - elements.insert( elem ); - } - gp_Pnt P ( theAxis.x, theAxis.y, theAxis.z ); - gp_Vec V ( theAxis.vx, theAxis.vy, theAxis.vz ); + TIDSortedElemSet elements; + arrayToSet(theIDsOfElements, GetMeshDS(), elements); - gp_Trsf aTrsf; - aTrsf.SetRotation( gp_Ax1( P, V ), theAngle); + const SMESH::PointStruct * P = &theStepVector.PS; + gp_Vec stepVec( P->x, P->y, P->z ); - ::SMESH_MeshEditor anEditor( _myMesh ); - anEditor.Transform (elements, aTrsf, theCopy); + ::SMESH_MeshEditor anEditor( myMesh ); + TElemOfElemListMap aHystory; + ::SMESH_MeshEditor::PGroupIDs groupIds = + anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory, + theMakeGroups, theExtrFlags, theSewTolerance); + storeResult(anEditor); - // Update Python script - TCollection_AsciiString str ("axis = "); - addAxis( str, theAxis ); - SMESH_Gen_i::AddToCurrentPyScript( str ); - str = ("mesh_editor.Rotate("); - SMESH_Gen_i::AddArray( str, theIDsOfElements ) += ", axis, "; - str += (TCollection_AsciiString) theAngle + ", "; - str += (TCollection_AsciiString) theCopy + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); + return theMakeGroups ? getGroups(groupIds.get()) : 0; } //======================================================================= -//function : RotateObject +//function : AdvancedExtrusion //purpose : //======================================================================= -void SMESH_MeshEditor_i::RotateObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & theAxis, - CORBA::Double theAngle, - CORBA::Boolean theCopy) +void SMESH_MeshEditor_i::AdvancedExtrusion(const SMESH::long_array & theIDsOfElements, + const SMESH::DirStruct & theStepVector, + CORBA::Long theNbOfSteps, + CORBA::Long theExtrFlags, + CORBA::Double theSewTolerance) { - SMESH::long_array_var anElementsId = theObject->GetIDs(); - Rotate(anElementsId, theAxis, theAngle, theCopy); - - // Clear python line, created by Rotate() - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - aSMESHGen->RemoveLastFromPythonScript(aSMESHGen->GetCurrentStudyID()); - - // Update Python script - TCollection_AsciiString str ("mesh_editor.RotateObject("); - SMESH_Gen_i::AddObject( str, theObject ) += ", axis, "; - str += TCollection_AsciiString( theAngle ) + ", "; - str += TCollection_AsciiString( theCopy ) + " )"; - SMESH_Gen_i::AddToCurrentPyScript( str ); + if ( !myPreviewMode ) { + TPythonDump() << "stepVector = " << theStepVector; + TPythonDump() << this << ".AdvancedExtrusion(" + << theIDsOfElements + << ", stepVector, " + << theNbOfSteps << "," + << theExtrFlags << ", " + << theSewTolerance << " )"; + } + advancedExtrusion( theIDsOfElements, + theStepVector, + theNbOfSteps, + theExtrFlags, + theSewTolerance, + false); } //======================================================================= -//function : FindCoincidentNodes -//purpose : +//function : AdvancedExtrusionMakeGroups +//purpose : //======================================================================= -void SMESH_MeshEditor_i::FindCoincidentNodes (CORBA::Double Tolerance, - SMESH::array_of_long_array_out GroupsOfNodes) +SMESH::ListOfGroups* +SMESH_MeshEditor_i::AdvancedExtrusionMakeGroups(const SMESH::long_array& theIDsOfElements, + const SMESH::DirStruct& theStepVector, + CORBA::Long theNbOfSteps, + CORBA::Long theExtrFlags, + CORBA::Double theSewTolerance) { - ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes; - ::SMESH_MeshEditor anEditor( _myMesh ); - set nodes; // no input nodes - anEditor.FindCoincidentNodes( nodes, Tolerance, aListOfListOfNodes ); + SMESH::ListOfGroups * aGroups = advancedExtrusion( theIDsOfElements, + theStepVector, + theNbOfSteps, + theExtrFlags, + theSewTolerance, + true); + + if ( !myPreviewMode ) { + TPythonDump() << "stepVector = " << theStepVector; + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump << this << ".AdvancedExtrusionMakeGroups(" + << theIDsOfElements + << ", stepVector, " + << theNbOfSteps << "," + << theExtrFlags << ", " + << theSewTolerance << " )"; + } + return aGroups; +} - GroupsOfNodes = new SMESH::array_of_long_array; - GroupsOfNodes->length( aListOfListOfNodes.size() ); - ::SMESH_MeshEditor::TListOfListOfNodes::iterator llIt = aListOfListOfNodes.begin(); - for ( CORBA::Long i = 0; llIt != aListOfListOfNodes.end(); llIt++, i++ ) - { - list< const SMDS_MeshNode* >& aListOfNodes = *llIt; - list< const SMDS_MeshNode* >::iterator lIt = aListOfNodes.begin();; - SMESH::long_array& aGroup = GroupsOfNodes[ i ]; - aGroup.length( aListOfNodes.size() ); - for ( int j = 0; lIt != aListOfNodes.end(); lIt++, j++ ) - aGroup[ j ] = (*lIt)->GetID(); + +//================================================================================ +/*! + * \brief Convert extrusion error to IDL enum + */ +//================================================================================ + +#define RETCASE(enm) case ::SMESH_MeshEditor::enm: return SMESH::SMESH_MeshEditor::enm; + +static SMESH::SMESH_MeshEditor::Extrusion_Error convExtrError( const::SMESH_MeshEditor::Extrusion_Error e ) +{ + switch ( e ) { + RETCASE( EXTR_OK ); + RETCASE( EXTR_NO_ELEMENTS ); + RETCASE( EXTR_PATH_NOT_EDGE ); + RETCASE( EXTR_BAD_PATH_SHAPE ); + RETCASE( EXTR_BAD_STARTING_NODE ); + RETCASE( EXTR_BAD_ANGLES_NUMBER ); + RETCASE( EXTR_CANT_GET_TANGENT ); } + return SMESH::SMESH_MeshEditor::EXTR_OK; } + //======================================================================= -//function : MergeNodes -//purpose : +//function : extrusionAlongPath +//purpose : //======================================================================= -void SMESH_MeshEditor_i::MergeNodes (const SMESH::array_of_long_array& GroupsOfNodes) +SMESH::ListOfGroups* +SMESH_MeshEditor_i::extrusionAlongPath(const SMESH::long_array & theIDsOfElements, + SMESH::SMESH_Mesh_ptr thePathMesh, + GEOM::GEOM_Object_ptr thePathShape, + CORBA::Long theNodeStart, + CORBA::Boolean theHasAngles, + const SMESH::double_array & theAngles, + CORBA::Boolean theHasRefPoint, + const SMESH::PointStruct & theRefPoint, + const bool theMakeGroups, + SMESH::SMESH_MeshEditor::Extrusion_Error & theError, + const SMDSAbs_ElementType theElementType) { - SMESHDS_Mesh* aMesh = GetMeshDS(); + initData(); - TCollection_AsciiString str( "mesh_editor.MergeNodes([" ); - ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes; - for (int i = 0; i < GroupsOfNodes.length(); i++) - { - const SMESH::long_array& aNodeGroup = GroupsOfNodes[ i ]; - aListOfListOfNodes.push_back( list< const SMDS_MeshNode* >() ); - list< const SMDS_MeshNode* >& aListOfNodes = aListOfListOfNodes.back(); - for ( int j = 0; j < aNodeGroup.length(); j++ ) - { - CORBA::Long index = aNodeGroup[ j ]; - const SMDS_MeshNode * node = aMesh->FindNode(index); - if ( node ) - aListOfNodes.push_back( node ); - } - if ( aListOfNodes.size() < 2 ) - aListOfListOfNodes.pop_back(); + if ( thePathMesh->_is_nil() || thePathShape->_is_nil() ) { + theError = SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE; + return 0; + } + SMESH_Mesh_i* aMeshImp = SMESH::DownCast( thePathMesh ); + + TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( thePathShape ); + SMESH_subMesh* aSubMesh = aMeshImp->GetImpl().GetSubMesh( aShape ); - if ( i > 0 ) - str += ","; - SMESH_Gen_i::AddArray( str, aNodeGroup ); + if ( !aSubMesh || !aSubMesh->GetSubMeshDS()) { + theError = SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE; + return 0; } - ::SMESH_MeshEditor anEditor( _myMesh ); - anEditor.MergeNodes( aListOfListOfNodes ); - // Update Python script - SMESH_Gen_i::AddToCurrentPyScript( str + "])" ); + SMDS_MeshNode* nodeStart = (SMDS_MeshNode*)aMeshImp->GetImpl().GetMeshDS()->FindNode(theNodeStart); + if ( !nodeStart ) { + theError = SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE; + return 0; + } + + TIDSortedElemSet elements; + arrayToSet(theIDsOfElements, GetMeshDS(), elements, theElementType); + + list angles; + for (int i = 0; i < theAngles.length(); i++) { + angles.push_back( theAngles[i] ); + } + + gp_Pnt refPnt( theRefPoint.x, theRefPoint.y, theRefPoint.z ); + + int nbOldGroups = myMesh->NbGroup(); + + ::SMESH_MeshEditor anEditor( myMesh ); + ::SMESH_MeshEditor::Extrusion_Error error = + anEditor.ExtrusionAlongTrack( elements, aSubMesh, nodeStart, + theHasAngles, angles, false, + theHasRefPoint, refPnt, theMakeGroups ); + storeResult(anEditor); + theError = convExtrError( error ); + + if ( theMakeGroups ) { + 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 0; } + //======================================================================= -//function : MergeEqualElements -//purpose : +//function : extrusionAlongPathX +//purpose : //======================================================================= -void SMESH_MeshEditor_i::MergeEqualElements() +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_MeshEditor anEditor( _myMesh ); - anEditor.MergeEqualElements(); + SMESH::ListOfGroups* EmptyGr = new SMESH::ListOfGroups; - // Update Python script - SMESH_Gen_i::AddToCurrentPyScript( "mesh_editor.MergeEqualElements()" ); + 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 : operator +//function : ExtrusionAlongPath //purpose : //======================================================================= -#define RETCASE(enm) case ::SMESH_MeshEditor::enm: return SMESH::SMESH_MeshEditor::enm; - -static SMESH::SMESH_MeshEditor::Sew_Error convError( const::SMESH_MeshEditor::Sew_Error e ) +SMESH::SMESH_MeshEditor::Extrusion_Error +SMESH_MeshEditor_i::ExtrusionAlongPath(const SMESH::long_array & theIDsOfElements, + SMESH::SMESH_Mesh_ptr thePathMesh, + GEOM::GEOM_Object_ptr thePathShape, + CORBA::Long theNodeStart, + CORBA::Boolean theHasAngles, + const SMESH::double_array & theAngles, + CORBA::Boolean theHasRefPoint, + const SMESH::PointStruct & theRefPoint) { - switch ( e ) { - RETCASE( SEW_OK ); - RETCASE( SEW_BORDER1_NOT_FOUND ); - RETCASE( SEW_BORDER2_NOT_FOUND ); - RETCASE( SEW_BOTH_BORDERS_NOT_FOUND ); - RETCASE( SEW_BAD_SIDE_NODES ); - RETCASE( SEW_VOLUMES_TO_SPLIT ); - RETCASE( SEW_DIFF_NB_OF_ELEMENTS ); - RETCASE( SEW_TOPO_DIFF_SETS_OF_ELEMENTS ); - RETCASE( SEW_BAD_SIDE1_NODES ); - RETCASE( SEW_BAD_SIDE2_NODES ); + if ( !myPreviewMode ) { + TPythonDump() << "error = " << this << ".ExtrusionAlongPath( " + << theIDsOfElements << ", " + << thePathMesh << ", " + << thePathShape << ", " + << theNodeStart << ", " + << theHasAngles << ", " + << theAngles << ", " + << theHasRefPoint << ", " + << "SMESH.PointStruct( " + << ( theHasRefPoint ? theRefPoint.x : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.y : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )"; } - return SMESH::SMESH_MeshEditor::SEW_OK; + SMESH::SMESH_MeshEditor::Extrusion_Error anError; + extrusionAlongPath( theIDsOfElements, + thePathMesh, + thePathShape, + theNodeStart, + theHasAngles, + theAngles, + theHasRefPoint, + theRefPoint, + false, + anError); + return anError; } //======================================================================= -//function : SewFreeBorders +//function : ExtrusionAlongPathObject //purpose : //======================================================================= -SMESH::SMESH_MeshEditor::Sew_Error - SMESH_MeshEditor_i::SewFreeBorders(CORBA::Long FirstNodeID1, - CORBA::Long SecondNodeID1, - CORBA::Long LastNodeID1, - CORBA::Long FirstNodeID2, - CORBA::Long SecondNodeID2, - CORBA::Long LastNodeID2, - CORBA::Boolean CreatePolygons, - CORBA::Boolean CreatePolyedrs) +SMESH::SMESH_MeshEditor::Extrusion_Error +SMESH_MeshEditor_i::ExtrusionAlongPathObject(SMESH::SMESH_IDSource_ptr theObject, + SMESH::SMESH_Mesh_ptr thePathMesh, + GEOM::GEOM_Object_ptr thePathShape, + CORBA::Long theNodeStart, + CORBA::Boolean theHasAngles, + const SMESH::double_array & theAngles, + CORBA::Boolean theHasRefPoint, + const SMESH::PointStruct & theRefPoint) { + if ( !myPreviewMode ) { + TPythonDump() << "error = " << this << ".ExtrusionAlongPathObject( " + << theObject << ", " + << thePathMesh << ", " + << thePathShape << ", " + << theNodeStart << ", " + << theHasAngles << ", " + << theAngles << ", " + << theHasRefPoint << ", " + << "SMESH.PointStruct( " + << ( theHasRefPoint ? theRefPoint.x : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.y : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )"; + } + SMESH::SMESH_MeshEditor::Extrusion_Error anError; + SMESH::long_array_var anElementsId = theObject->GetIDs(); + extrusionAlongPath( anElementsId, + thePathMesh, + thePathShape, + theNodeStart, + theHasAngles, + theAngles, + theHasRefPoint, + theRefPoint, + false, + anError); + return anError; +} + +//======================================================================= +//function : ExtrusionAlongPathObject1D +//purpose : +//======================================================================= + +SMESH::SMESH_MeshEditor::Extrusion_Error +SMESH_MeshEditor_i::ExtrusionAlongPathObject1D(SMESH::SMESH_IDSource_ptr theObject, + SMESH::SMESH_Mesh_ptr thePathMesh, + GEOM::GEOM_Object_ptr thePathShape, + CORBA::Long theNodeStart, + CORBA::Boolean theHasAngles, + const SMESH::double_array & theAngles, + CORBA::Boolean theHasRefPoint, + const SMESH::PointStruct & theRefPoint) +{ + if ( !myPreviewMode ) { + TPythonDump() << "error = " << this << ".ExtrusionAlongPathObject1D( " + << theObject << ", " + << thePathMesh << ", " + << thePathShape << ", " + << theNodeStart << ", " + << theHasAngles << ", " + << theAngles << ", " + << theHasRefPoint << ", " + << "SMESH.PointStruct( " + << ( theHasRefPoint ? theRefPoint.x : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.y : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )"; + } + SMESH::SMESH_MeshEditor::Extrusion_Error anError; + SMESH::long_array_var anElementsId = theObject->GetIDs(); + extrusionAlongPath( anElementsId, + thePathMesh, + thePathShape, + theNodeStart, + theHasAngles, + theAngles, + theHasRefPoint, + theRefPoint, + false, + anError, + SMDSAbs_Edge); + return anError; +} + +//======================================================================= +//function : ExtrusionAlongPathObject2D +//purpose : +//======================================================================= + +SMESH::SMESH_MeshEditor::Extrusion_Error +SMESH_MeshEditor_i::ExtrusionAlongPathObject2D(SMESH::SMESH_IDSource_ptr theObject, + SMESH::SMESH_Mesh_ptr thePathMesh, + GEOM::GEOM_Object_ptr thePathShape, + CORBA::Long theNodeStart, + CORBA::Boolean theHasAngles, + const SMESH::double_array & theAngles, + CORBA::Boolean theHasRefPoint, + const SMESH::PointStruct & theRefPoint) +{ + if ( !myPreviewMode ) { + TPythonDump() << "error = " << this << ".ExtrusionAlongPathObject2D( " + << theObject << ", " + << thePathMesh << ", " + << thePathShape << ", " + << theNodeStart << ", " + << theHasAngles << ", " + << theAngles << ", " + << theHasRefPoint << ", " + << "SMESH.PointStruct( " + << ( theHasRefPoint ? theRefPoint.x : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.y : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )"; + } + SMESH::SMESH_MeshEditor::Extrusion_Error anError; + SMESH::long_array_var anElementsId = theObject->GetIDs(); + extrusionAlongPath( anElementsId, + thePathMesh, + thePathShape, + theNodeStart, + theHasAngles, + theAngles, + theHasRefPoint, + theRefPoint, + false, + anError, + SMDSAbs_Face); + return anError; +} + + +//======================================================================= +//function : ExtrusionAlongPathMakeGroups +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::ExtrusionAlongPathMakeGroups(const SMESH::long_array& theIDsOfElements, + SMESH::SMESH_Mesh_ptr thePathMesh, + GEOM::GEOM_Object_ptr thePathShape, + CORBA::Long theNodeStart, + CORBA::Boolean theHasAngles, + const SMESH::double_array& theAngles, + CORBA::Boolean theHasRefPoint, + const SMESH::PointStruct& theRefPoint, + SMESH::SMESH_MeshEditor::Extrusion_Error& Error) +{ + SMESH::ListOfGroups * aGroups = extrusionAlongPath( theIDsOfElements, + thePathMesh, + thePathShape, + theNodeStart, + theHasAngles, + theAngles, + theHasRefPoint, + theRefPoint, + true, + Error); + if ( !myPreviewMode ) { + bool isDumpGroups = aGroups && aGroups->length() > 0; + TPythonDump aPythonDump; + if(isDumpGroups) { + aPythonDump << "("<GetIDs(); + SMESH::ListOfGroups * aGroups = extrusionAlongPath( anElementsId, + thePathMesh, + thePathShape, + theNodeStart, + theHasAngles, + theAngles, + theHasRefPoint, + theRefPoint, + true, + Error); + + if ( !myPreviewMode ) { + bool isDumpGroups = aGroups && aGroups->length() > 0; + TPythonDump aPythonDump; + if(isDumpGroups) { + aPythonDump << "("<GetIDs(); + SMESH::ListOfGroups * aGroups = extrusionAlongPath( anElementsId, + thePathMesh, + thePathShape, + theNodeStart, + theHasAngles, + theAngles, + theHasRefPoint, + theRefPoint, + true, + Error, + SMDSAbs_Edge); + + if ( !myPreviewMode ) { + bool isDumpGroups = aGroups && aGroups->length() > 0; + TPythonDump aPythonDump; + if(isDumpGroups) { + aPythonDump << "("<GetIDs(); + SMESH::ListOfGroups * aGroups = extrusionAlongPath( anElementsId, + thePathMesh, + thePathShape, + theNodeStart, + theHasAngles, + theAngles, + theHasRefPoint, + theRefPoint, + true, + Error, + SMDSAbs_Face); + + if ( !myPreviewMode ) { + bool isDumpGroups = aGroups && aGroups->length() > 0; + TPythonDump aPythonDump; + if(isDumpGroups) { + aPythonDump << "("<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 << "("< 0 && !thePathMesh->_is_nil() && !thePathShape->_is_nil() ) + { + SMESH_Mesh_i* aMeshImp = SMESH::DownCast( thePathMesh ); + TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( thePathShape ); + SMESH_subMesh* aSubMesh = aMeshImp->GetImpl().GetSubMesh( aShape ); + if ( !aSubMesh || !aSubMesh->GetSubMeshDS()) + return aResult._retn(); + int nbSteps = aSubMesh->GetSubMeshDS()->NbElements(); + if ( nbSteps == nbAngles ) + { + aResult.inout() = theAngles; + } + else + { + aResult->length( nbSteps ); + 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 ]; + } + aResult[ iSt ] = angle; + angPrev = angCur; + } + } + } + // Update Python script + TPythonDump() << "rotAngles = " << theAngles; + TPythonDump() << "rotAngles = " << this << ".LinearAnglesVariation( " + << thePathMesh << ", " + << thePathShape << ", " + << "rotAngles )"; + + return aResult._retn(); +} + + +//======================================================================= +//function : mirror +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::mirror(TIDSortedElemSet & theElements, + const SMESH::AxisStruct & theAxis, + SMESH::SMESH_MeshEditor::MirrorType theMirrorType, + CORBA::Boolean theCopy, + const bool theMakeGroups, + ::SMESH_Mesh* theTargetMesh) +{ + initData(); + + gp_Pnt P ( theAxis.x, theAxis.y, theAxis.z ); + gp_Vec V ( theAxis.vx, theAxis.vy, theAxis.vz ); + + gp_Trsf aTrsf; + switch ( theMirrorType ) { + case SMESH::SMESH_MeshEditor::POINT: + aTrsf.SetMirror( P ); + break; + case SMESH::SMESH_MeshEditor::AXIS: + aTrsf.SetMirror( gp_Ax1( P, V )); + break; + default: + aTrsf.SetMirror( gp_Ax2( P, V )); + } + + ::SMESH_MeshEditor anEditor( myMesh ); + ::SMESH_MeshEditor::PGroupIDs groupIds = + anEditor.Transform (theElements, aTrsf, theCopy, theMakeGroups, theTargetMesh); + + if(theCopy) + storeResult(anEditor); + else + myMesh->SetIsModified( true ); + + return theMakeGroups ? getGroups(groupIds.get()) : 0; +} + +//======================================================================= +//function : Mirror +//purpose : +//======================================================================= + +void SMESH_MeshEditor_i::Mirror(const SMESH::long_array & theIDsOfElements, + const SMESH::AxisStruct & theAxis, + SMESH::SMESH_MeshEditor::MirrorType theMirrorType, + CORBA::Boolean theCopy) +{ + if ( !myPreviewMode ) { + TPythonDump() << this << ".Mirror( " + << theIDsOfElements << ", " + << theAxis << ", " + << mirrorTypeName(theMirrorType) << ", " + << theCopy << " )"; + } + if ( theIDsOfElements.length() > 0 ) + { + TIDSortedElemSet elements; + arrayToSet(theIDsOfElements, GetMeshDS(), elements); + mirror(elements, theAxis, theMirrorType, theCopy, false); + } +} + + +//======================================================================= +//function : MirrorObject +//purpose : +//======================================================================= + +void SMESH_MeshEditor_i::MirrorObject(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::AxisStruct & theAxis, + SMESH::SMESH_MeshEditor::MirrorType theMirrorType, + CORBA::Boolean theCopy) +{ + if ( !myPreviewMode ) { + TPythonDump() << this << ".MirrorObject( " + << theObject << ", " + << theAxis << ", " + << mirrorTypeName(theMirrorType) << ", " + << theCopy << " )"; + } + TIDSortedElemSet elements; + if (idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1)) + mirror(elements, theAxis, theMirrorType, theCopy, false); +} + +//======================================================================= +//function : MirrorMakeGroups +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::MirrorMakeGroups(const SMESH::long_array& theIDsOfElements, + const SMESH::AxisStruct& theMirror, + SMESH::SMESH_MeshEditor::MirrorType theMirrorType) +{ + SMESH::ListOfGroups * aGroups = 0; + if ( theIDsOfElements.length() > 0 ) + { + TIDSortedElemSet elements; + arrayToSet(theIDsOfElements, GetMeshDS(), elements); + aGroups = mirror(elements, theMirror, theMirrorType, true, true); + } + if ( !myPreviewMode ) { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump << this << ".MirrorMakeGroups( " + << theIDsOfElements << ", " + << theMirror << ", " + << mirrorTypeName(theMirrorType) << " )"; + } + return aGroups; +} + +//======================================================================= +//function : MirrorObjectMakeGroups +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::MirrorObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::AxisStruct& theMirror, + SMESH::SMESH_MeshEditor::MirrorType theMirrorType) +{ + SMESH::ListOfGroups * aGroups = 0; + TIDSortedElemSet elements; + if ( idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1)) + aGroups = mirror(elements, theMirror, theMirrorType, true, true); + + if ( !myPreviewMode ) + { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump << this << ".MirrorObjectMakeGroups( " + << theObject << ", " + << theMirror << ", " + << mirrorTypeName(theMirrorType) << " )"; + } + return aGroups; +} + +//======================================================================= +//function : MirrorMakeMesh +//purpose : +//======================================================================= + +SMESH::SMESH_Mesh_ptr +SMESH_MeshEditor_i::MirrorMakeMesh(const SMESH::long_array& theIDsOfElements, + const SMESH::AxisStruct& theMirror, + SMESH::SMESH_MeshEditor::MirrorType theMirrorType, + CORBA::Boolean theCopyGroups, + const char* theMeshName) +{ + SMESH_Mesh_i* mesh_i; + SMESH::SMESH_Mesh_var mesh; + { // open new scope to dump "MakeMesh" command + // and then "GetGroups" using SMESH_Mesh::GetGroups() + + TPythonDump pydump; // to prevent dump at mesh creation + + mesh = makeMesh( theMeshName ); + mesh_i = SMESH::DownCast( mesh ); + if (mesh_i && theIDsOfElements.length() > 0 ) + { + TIDSortedElemSet elements; + arrayToSet(theIDsOfElements, GetMeshDS(), elements); + mirror(elements, theMirror, theMirrorType, + false, theCopyGroups, & mesh_i->GetImpl()); + mesh_i->CreateGroupServants(); + } + + if ( !myPreviewMode ) { + pydump << mesh << " = " << this << ".MirrorMakeMesh( " + << theIDsOfElements << ", " + << theMirror << ", " + << mirrorTypeName(theMirrorType) << ", " + << theCopyGroups << ", '" + << theMeshName << "' )"; + } + } + + //dump "GetGroups" + if(!myPreviewMode && mesh_i) + mesh_i->GetGroups(); + + return mesh._retn(); +} + +//======================================================================= +//function : MirrorObjectMakeMesh +//purpose : +//======================================================================= + +SMESH::SMESH_Mesh_ptr +SMESH_MeshEditor_i::MirrorObjectMakeMesh(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::AxisStruct& theMirror, + SMESH::SMESH_MeshEditor::MirrorType theMirrorType, + CORBA::Boolean theCopyGroups, + const char* theMeshName) +{ + SMESH_Mesh_i* mesh_i; + SMESH::SMESH_Mesh_var mesh; + { // open new scope to dump "MakeMesh" command + // and then "GetGroups" using SMESH_Mesh::GetGroups() + + TPythonDump pydump; // to prevent dump at mesh creation + + mesh = makeMesh( theMeshName ); + mesh_i = SMESH::DownCast( mesh ); + TIDSortedElemSet elements; + if ( mesh_i && + idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1)) + { + mirror(elements, theMirror, theMirrorType, + false, theCopyGroups, & mesh_i->GetImpl()); + mesh_i->CreateGroupServants(); + } + if ( !myPreviewMode ) { + pydump << mesh << " = " << this << ".MirrorObjectMakeMesh( " + << theObject << ", " + << theMirror << ", " + << mirrorTypeName(theMirrorType) << ", " + << theCopyGroups << ", '" + << theMeshName << "' )"; + } + } + + //dump "GetGroups" + if(!myPreviewMode && mesh_i) + mesh_i->GetGroups(); + + return mesh._retn(); +} + +//======================================================================= +//function : translate +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::translate(TIDSortedElemSet & theElements, + const SMESH::DirStruct & theVector, + CORBA::Boolean theCopy, + const bool theMakeGroups, + ::SMESH_Mesh* theTargetMesh) +{ + initData(); + + gp_Trsf aTrsf; + const SMESH::PointStruct * P = &theVector.PS; + aTrsf.SetTranslation( gp_Vec( P->x, P->y, P->z )); + + ::SMESH_MeshEditor anEditor( myMesh ); + ::SMESH_MeshEditor::PGroupIDs groupIds = + anEditor.Transform (theElements, aTrsf, theCopy, theMakeGroups, theTargetMesh); + + if(theCopy) + storeResult(anEditor); + else + myMesh->SetIsModified( true ); + + return theMakeGroups ? getGroups(groupIds.get()) : 0; +} + +//======================================================================= +//function : Translate +//purpose : +//======================================================================= + +void SMESH_MeshEditor_i::Translate(const SMESH::long_array & theIDsOfElements, + const SMESH::DirStruct & theVector, + CORBA::Boolean theCopy) +{ + if ( !myPreviewMode ) { + TPythonDump() << this << ".Translate( " + << theIDsOfElements << ", " + << theVector << ", " + << theCopy << " )"; + } + if ( theIDsOfElements.length() ) + { + TIDSortedElemSet elements; + arrayToSet(theIDsOfElements, GetMeshDS(), elements); + translate(elements,theVector,theCopy,false); + } +} + +//======================================================================= +//function : TranslateObject +//purpose : +//======================================================================= + +void SMESH_MeshEditor_i::TranslateObject(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::DirStruct & theVector, + CORBA::Boolean theCopy) +{ + if ( !myPreviewMode ) { + TPythonDump() << this << ".TranslateObject( " + << theObject << ", " + << theVector << ", " + << theCopy << " )"; + } + TIDSortedElemSet elements; + if ( idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1)) + translate( elements, theVector, theCopy, false); +} + +//======================================================================= +//function : TranslateMakeGroups +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::TranslateMakeGroups(const SMESH::long_array& theIDsOfElements, + const SMESH::DirStruct& theVector) +{ + SMESH::ListOfGroups * aGroups = 0; + if ( theIDsOfElements.length() ) + { + TIDSortedElemSet elements; + arrayToSet(theIDsOfElements, GetMeshDS(), elements); + aGroups = translate(elements,theVector,true,true); + } + if ( !myPreviewMode ) { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump << this << ".TranslateMakeGroups( " + << theIDsOfElements << ", " + << theVector << " )"; + } + return aGroups; +} + +//======================================================================= +//function : TranslateObjectMakeGroups +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::TranslateObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::DirStruct& theVector) +{ + SMESH::ListOfGroups * aGroups = 0; + TIDSortedElemSet elements; + if (idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1)) + aGroups = translate(elements, theVector, true, true); + + if ( !myPreviewMode ) { + + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump << this << ".TranslateObjectMakeGroups( " + << theObject << ", " + << theVector << " )"; + } + return aGroups; +} + +//======================================================================= +//function : TranslateMakeMesh +//purpose : +//======================================================================= + +SMESH::SMESH_Mesh_ptr +SMESH_MeshEditor_i::TranslateMakeMesh(const SMESH::long_array& theIDsOfElements, + const SMESH::DirStruct& theVector, + CORBA::Boolean theCopyGroups, + const char* theMeshName) +{ + SMESH_Mesh_i* mesh_i; + SMESH::SMESH_Mesh_var mesh; + + { // open new scope to dump "MakeMesh" command + // and then "GetGroups" using SMESH_Mesh::GetGroups() + + TPythonDump pydump; // to prevent dump at mesh creation + + mesh = makeMesh( theMeshName ); + mesh_i = SMESH::DownCast( mesh ); + + if ( mesh_i && theIDsOfElements.length() ) + { + TIDSortedElemSet elements; + arrayToSet(theIDsOfElements, GetMeshDS(), elements); + translate(elements, theVector, false, theCopyGroups, & mesh_i->GetImpl()); + mesh_i->CreateGroupServants(); + } + + if ( !myPreviewMode ) { + pydump << mesh << " = " << this << ".TranslateMakeMesh( " + << theIDsOfElements << ", " + << theVector << ", " + << theCopyGroups << ", '" + << theMeshName << "' )"; + } + } + + //dump "GetGroups" + if(!myPreviewMode && mesh_i) + mesh_i->GetGroups(); + + return mesh._retn(); +} + +//======================================================================= +//function : TranslateObjectMakeMesh +//purpose : +//======================================================================= + +SMESH::SMESH_Mesh_ptr +SMESH_MeshEditor_i::TranslateObjectMakeMesh(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::DirStruct& theVector, + CORBA::Boolean theCopyGroups, + const char* theMeshName) +{ + SMESH_Mesh_i* mesh_i; + SMESH::SMESH_Mesh_var mesh; + { // open new scope to dump "MakeMesh" command + // and then "GetGroups" using SMESH_Mesh::GetGroups() + + TPythonDump pydump; // to prevent dump at mesh creation + mesh = makeMesh( theMeshName ); + mesh_i = SMESH::DownCast( mesh ); + + TIDSortedElemSet elements; + if ( mesh_i && + idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1)) + { + translate(elements, theVector,false, theCopyGroups, & mesh_i->GetImpl()); + mesh_i->CreateGroupServants(); + } + if ( !myPreviewMode ) { + pydump << mesh << " = " << this << ".TranslateObjectMakeMesh( " + << theObject << ", " + << theVector << ", " + << theCopyGroups << ", '" + << theMeshName << "' )"; + } + } + + //dump "GetGroups" + if(!myPreviewMode && mesh_i) + mesh_i->GetGroups(); + + return mesh._retn(); +} + +//======================================================================= +//function : rotate +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::rotate(TIDSortedElemSet & theElements, + const SMESH::AxisStruct & theAxis, + CORBA::Double theAngle, + CORBA::Boolean theCopy, + const bool theMakeGroups, + ::SMESH_Mesh* theTargetMesh) +{ + initData(); + + gp_Pnt P ( theAxis.x, theAxis.y, theAxis.z ); + gp_Vec V ( theAxis.vx, theAxis.vy, theAxis.vz ); + + gp_Trsf aTrsf; + aTrsf.SetRotation( gp_Ax1( P, V ), theAngle); + + ::SMESH_MeshEditor anEditor( myMesh ); + ::SMESH_MeshEditor::PGroupIDs groupIds = + anEditor.Transform (theElements, aTrsf, theCopy, theMakeGroups, theTargetMesh); + + if(theCopy) + storeResult(anEditor); + else + myMesh->SetIsModified( true ); + + return theMakeGroups ? getGroups(groupIds.get()) : 0; +} + +//======================================================================= +//function : Rotate +//purpose : +//======================================================================= + +void SMESH_MeshEditor_i::Rotate(const SMESH::long_array & theIDsOfElements, + const SMESH::AxisStruct & theAxis, + CORBA::Double theAngle, + CORBA::Boolean theCopy) +{ + if ( !myPreviewMode ) { + TPythonDump() << this << ".Rotate( " + << theIDsOfElements << ", " + << theAxis << ", " + << theAngle << ", " + << theCopy << " )"; + } + if ( theIDsOfElements.length() > 0 ) + { + TIDSortedElemSet elements; + arrayToSet(theIDsOfElements, GetMeshDS(), elements); + rotate(elements,theAxis,theAngle,theCopy,false); + } +} + +//======================================================================= +//function : RotateObject +//purpose : +//======================================================================= + +void SMESH_MeshEditor_i::RotateObject(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::AxisStruct & theAxis, + CORBA::Double theAngle, + CORBA::Boolean theCopy) +{ + if ( !myPreviewMode ) { + TPythonDump() << this << ".RotateObject( " + << theObject << ", " + << theAxis << ", " + << theAngle << ", " + << theCopy << " )"; + } + TIDSortedElemSet elements; + if (idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1)) + rotate(elements,theAxis,theAngle,theCopy,false); +} + +//======================================================================= +//function : RotateMakeGroups +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::RotateMakeGroups(const SMESH::long_array& theIDsOfElements, + const SMESH::AxisStruct& theAxis, + CORBA::Double theAngle) +{ + SMESH::ListOfGroups * aGroups = 0; + if ( theIDsOfElements.length() > 0 ) + { + TIDSortedElemSet elements; + arrayToSet(theIDsOfElements, GetMeshDS(), elements); + aGroups = rotate(elements,theAxis,theAngle,true,true); + } + if ( !myPreviewMode ) { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump << this << ".RotateMakeGroups( " + << theIDsOfElements << ", " + << theAxis << ", " + << theAngle << " )"; + } + return aGroups; +} + +//======================================================================= +//function : RotateObjectMakeGroups +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::RotateObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::AxisStruct& theAxis, + CORBA::Double theAngle) +{ + SMESH::ListOfGroups * aGroups = 0; + TIDSortedElemSet elements; + if ( idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1)) + aGroups = rotate(elements,theAxis,theAngle,true,true); + + if ( !myPreviewMode ) { + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump << this << ".RotateObjectMakeGroups( " + << theObject << ", " + << theAxis << ", " + << theAngle << " )"; + } + return aGroups; +} + +//======================================================================= +//function : RotateMakeMesh +//purpose : +//======================================================================= + +SMESH::SMESH_Mesh_ptr +SMESH_MeshEditor_i::RotateMakeMesh(const SMESH::long_array& theIDsOfElements, + const SMESH::AxisStruct& theAxis, + CORBA::Double theAngleInRadians, + CORBA::Boolean theCopyGroups, + const char* theMeshName) +{ + SMESH::SMESH_Mesh_var mesh; + SMESH_Mesh_i* mesh_i; + + { // open new scope to dump "MakeMesh" command + // and then "GetGroups" using SMESH_Mesh::GetGroups() + + TPythonDump pydump; // to prevent dump at mesh creation + + mesh = makeMesh( theMeshName ); + mesh_i = SMESH::DownCast( mesh ); + + if ( mesh_i && theIDsOfElements.length() > 0 ) + { + TIDSortedElemSet elements; + arrayToSet(theIDsOfElements, GetMeshDS(), elements); + rotate(elements, theAxis, theAngleInRadians, + false, theCopyGroups, & mesh_i->GetImpl()); + mesh_i->CreateGroupServants(); + } + if ( !myPreviewMode ) { + pydump << mesh << " = " << this << ".RotateMakeMesh( " + << theIDsOfElements << ", " + << theAxis << ", " + << theAngleInRadians << ", " + << theCopyGroups << ", '" + << theMeshName << "' )"; + } + } + + //dump "GetGroups" + if(!myPreviewMode && mesh_i && theIDsOfElements.length() > 0 ) + mesh_i->GetGroups(); + + return mesh._retn(); +} + +//======================================================================= +//function : RotateObjectMakeMesh +//purpose : +//======================================================================= + +SMESH::SMESH_Mesh_ptr +SMESH_MeshEditor_i::RotateObjectMakeMesh(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::AxisStruct& theAxis, + CORBA::Double theAngleInRadians, + CORBA::Boolean theCopyGroups, + const char* theMeshName) +{ + SMESH::SMESH_Mesh_var mesh; + SMESH_Mesh_i* mesh_i; + + {// open new scope to dump "MakeMesh" command + // and then "GetGroups" using SMESH_Mesh::GetGroups() + + TPythonDump pydump; // to prevent dump at mesh creation + mesh = makeMesh( theMeshName ); + mesh_i = SMESH::DownCast( mesh ); + + TIDSortedElemSet elements; + if (mesh_i && + idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1)) + { + rotate(elements, theAxis, theAngleInRadians, + false, theCopyGroups, & mesh_i->GetImpl()); + mesh_i->CreateGroupServants(); + } + if ( !myPreviewMode ) { + pydump << mesh << " = " << this << ".RotateObjectMakeMesh( " + << theObject << ", " + << theAxis << ", " + << theAngleInRadians << ", " + << theCopyGroups << ", '" + << theMeshName << "' )"; + } + } + + //dump "GetGroups" + if(!myPreviewMode && mesh_i) + mesh_i->GetGroups(); + + return mesh._retn(); +} + +//======================================================================= +//function : scale +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::scale(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::PointStruct& thePoint, + const SMESH::double_array& theScaleFact, + CORBA::Boolean theCopy, + const bool theMakeGroups, + ::SMESH_Mesh* theTargetMesh) +{ + initData(); + if ( theScaleFact.length() < 1 ) + THROW_SALOME_CORBA_EXCEPTION("Scale factor not given", SALOME::BAD_PARAM); + if ( theScaleFact.length() == 2 ) + THROW_SALOME_CORBA_EXCEPTION("Invalid nb of scale factors : 2", SALOME::BAD_PARAM); + + TIDSortedElemSet elements; + if ( !idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/true)) + return 0; + + vector S(3); + S[0] = theScaleFact[0]; + S[1] = (theScaleFact.length() == 1) ? theScaleFact[0] : theScaleFact[1]; + S[2] = (theScaleFact.length() == 1) ? theScaleFact[0] : theScaleFact[2]; + double tol = std::numeric_limits::max(); + gp_Trsf aTrsf; + aTrsf.SetValues( S[0], 0, 0, thePoint.x * (1-S[0]), + 0, S[1], 0, thePoint.y * (1-S[1]), + 0, 0, S[2], thePoint.z * (1-S[2]), tol, tol); + + ::SMESH_MeshEditor anEditor( myMesh ); + ::SMESH_MeshEditor::PGroupIDs groupIds = + anEditor.Transform (elements, aTrsf, theCopy, theMakeGroups, theTargetMesh); + + if(theCopy) + storeResult(anEditor); + else + myMesh->SetIsModified( true ); + + return theMakeGroups ? getGroups(groupIds.get()) : 0; +} + +//======================================================================= +//function : Scale +//purpose : +//======================================================================= + +void SMESH_MeshEditor_i::Scale(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::PointStruct& thePoint, + const SMESH::double_array& theScaleFact, + CORBA::Boolean theCopy) +{ + if ( !myPreviewMode ) { + TPythonDump() << this << ".Scale( " + << theObject << ", " + << "SMESH.PointStruct( " << thePoint.x << ", " + << thePoint.y << ", " << thePoint.z << " ) ," + << theScaleFact << ", " + << theCopy << " )"; + } + scale(theObject, thePoint, theScaleFact, theCopy, false); +} + + +//======================================================================= +//function : ScaleMakeGroups +//purpose : +//======================================================================= + +SMESH::ListOfGroups* +SMESH_MeshEditor_i::ScaleMakeGroups(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::PointStruct& thePoint, + const SMESH::double_array& theScaleFact) +{ + SMESH::ListOfGroups * aGroups = scale(theObject, thePoint, theScaleFact, true, true); + if ( !myPreviewMode ) { + + TPythonDump aPythonDump; + DumpGroupsList(aPythonDump,aGroups); + aPythonDump << this << ".Scale(" + << theObject << "," + << "SMESH.PointStruct(" <( mesh ); + + if ( mesh_i ) + { + scale(theObject, thePoint, theScaleFact,false, theCopyGroups, & mesh_i->GetImpl()); + mesh_i->CreateGroupServants(); + } + if ( !myPreviewMode ) + pydump << mesh << " = " << this << ".ScaleMakeMesh( " + << theObject << ", " + << "SMESH.PointStruct( " << thePoint.x << ", " + << thePoint.y << ", " << thePoint.z << " ) ," + << theScaleFact << ", " + << theCopyGroups << ", '" + << theMeshName << "' )"; + } + + //dump "GetGroups" + if(!myPreviewMode && mesh_i) + mesh_i->GetGroups(); + + return mesh._retn(); +} + + +//======================================================================= +//function : FindCoincidentNodes +//purpose : +//======================================================================= + +void SMESH_MeshEditor_i::FindCoincidentNodes (CORBA::Double Tolerance, + SMESH::array_of_long_array_out GroupsOfNodes) +{ + initData(); + + ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes; + ::SMESH_MeshEditor anEditor( myMesh ); + TIDSortedNodeSet nodes; // no input nodes + anEditor.FindCoincidentNodes( nodes, Tolerance, aListOfListOfNodes ); + + GroupsOfNodes = new SMESH::array_of_long_array; + GroupsOfNodes->length( aListOfListOfNodes.size() ); + ::SMESH_MeshEditor::TListOfListOfNodes::iterator llIt = aListOfListOfNodes.begin(); + for ( CORBA::Long i = 0; llIt != aListOfListOfNodes.end(); llIt++, i++ ) { + list< const SMDS_MeshNode* >& aListOfNodes = *llIt; + list< const SMDS_MeshNode* >::iterator lIt = aListOfNodes.begin();; + SMESH::long_array& aGroup = (*GroupsOfNodes)[ i ]; + aGroup.length( aListOfNodes.size() ); + for ( int j = 0; lIt != aListOfNodes.end(); lIt++, j++ ) + aGroup[ j ] = (*lIt)->GetID(); + } + TPythonDump() << "coincident_nodes = " << this << ".FindCoincidentNodes( " + << Tolerance << " )"; +} + +//======================================================================= +//function : FindCoincidentNodesOnPart +//purpose : +//======================================================================= +void SMESH_MeshEditor_i::FindCoincidentNodesOnPart(SMESH::SMESH_IDSource_ptr theObject, + CORBA::Double Tolerance, + SMESH::array_of_long_array_out GroupsOfNodes) +{ + initData(); + + TIDSortedNodeSet nodes; + idSourceToNodeSet( theObject, GetMeshDS(), nodes ); + + ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes; + ::SMESH_MeshEditor anEditor( myMesh ); + if(!nodes.empty()) + anEditor.FindCoincidentNodes( nodes, Tolerance, aListOfListOfNodes ); + + GroupsOfNodes = new SMESH::array_of_long_array; + GroupsOfNodes->length( aListOfListOfNodes.size() ); + ::SMESH_MeshEditor::TListOfListOfNodes::iterator llIt = aListOfListOfNodes.begin(); + for ( CORBA::Long i = 0; llIt != aListOfListOfNodes.end(); llIt++, i++ ) + { + list< const SMDS_MeshNode* >& aListOfNodes = *llIt; + list< const SMDS_MeshNode* >::iterator lIt = aListOfNodes.begin();; + SMESH::long_array& aGroup = (*GroupsOfNodes)[ i ]; + aGroup.length( aListOfNodes.size() ); + for ( int j = 0; lIt != aListOfNodes.end(); lIt++, j++ ) + aGroup[ j ] = (*lIt)->GetID(); + } + TPythonDump() << "coincident_nodes_on_part = " << this << ".FindCoincidentNodesOnPart( " + <length( aListOfListOfNodes.size() ); + ::SMESH_MeshEditor::TListOfListOfNodes::iterator llIt = aListOfListOfNodes.begin(); + for ( CORBA::Long i = 0; llIt != aListOfListOfNodes.end(); llIt++, i++ ) + { + list< const SMDS_MeshNode* >& aListOfNodes = *llIt; + list< const SMDS_MeshNode* >::iterator lIt = aListOfNodes.begin();; + SMESH::long_array& aGroup = (*theGroupsOfNodes)[ i ]; + aGroup.length( aListOfNodes.size() ); + for ( int j = 0; lIt != aListOfNodes.end(); lIt++, j++ ) + aGroup[ j ] = (*lIt)->GetID(); + } + TPythonDump() << "coincident_nodes_on_part = " << this << ".FindCoincidentNodesOnPartBut( " + << theObject<<", " + << theTolerance << ", " + << theExceptSubMeshOrGroups << " )"; +} + +//======================================================================= +//function : MergeNodes +//purpose : +//======================================================================= + +void SMESH_MeshEditor_i::MergeNodes (const SMESH::array_of_long_array& GroupsOfNodes) +{ + initData(); + + SMESHDS_Mesh* aMesh = GetMeshDS(); + + TPythonDump aTPythonDump; + aTPythonDump << this << ".MergeNodes(["; + ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes; + for (int i = 0; i < GroupsOfNodes.length(); i++) + { + const SMESH::long_array& aNodeGroup = GroupsOfNodes[ i ]; + aListOfListOfNodes.push_back( list< const SMDS_MeshNode* >() ); + list< const SMDS_MeshNode* >& aListOfNodes = aListOfListOfNodes.back(); + for ( int j = 0; j < aNodeGroup.length(); j++ ) + { + CORBA::Long index = aNodeGroup[ j ]; + const SMDS_MeshNode * node = aMesh->FindNode(index); + if ( node ) + aListOfNodes.push_back( node ); + } + if ( aListOfNodes.size() < 2 ) + aListOfListOfNodes.pop_back(); + + if ( i > 0 ) aTPythonDump << ", "; + aTPythonDump << aNodeGroup; + } + ::SMESH_MeshEditor anEditor( myMesh ); + anEditor.MergeNodes( aListOfListOfNodes ); + + aTPythonDump << "])"; + + myMesh->SetIsModified( true ); +} + +//======================================================================= +//function : FindEqualElements +//purpose : +//======================================================================= +void SMESH_MeshEditor_i::FindEqualElements(SMESH::SMESH_IDSource_ptr theObject, + SMESH::array_of_long_array_out GroupsOfElementsID) +{ + initData(); + + SMESH::SMESH_GroupBase_var group = SMESH::SMESH_GroupBase::_narrow(theObject); + if ( !(!group->_is_nil() && group->GetType() == SMESH::NODE) ) + { + typedef list TListOfIDs; + set elems; + SMESH::long_array_var aElementsId = theObject->GetIDs(); + SMESHDS_Mesh* aMesh = GetMeshDS(); + + for(int i = 0; i < aElementsId->length(); i++) { + CORBA::Long anID = aElementsId[i]; + const SMDS_MeshElement * elem = aMesh->FindElement(anID); + if (elem) { + elems.insert(elem); + } + } + + ::SMESH_MeshEditor::TListOfListOfElementsID aListOfListOfElementsID; + ::SMESH_MeshEditor anEditor( myMesh ); + anEditor.FindEqualElements( elems, aListOfListOfElementsID ); + + GroupsOfElementsID = new SMESH::array_of_long_array; + GroupsOfElementsID->length( aListOfListOfElementsID.size() ); + + ::SMESH_MeshEditor::TListOfListOfElementsID::iterator arraysIt = aListOfListOfElementsID.begin(); + for (CORBA::Long j = 0; arraysIt != aListOfListOfElementsID.end(); ++arraysIt, ++j) { + SMESH::long_array& aGroup = (*GroupsOfElementsID)[ j ]; + TListOfIDs& listOfIDs = *arraysIt; + aGroup.length( listOfIDs.size() ); + TListOfIDs::iterator idIt = listOfIDs.begin(); + for (int k = 0; idIt != listOfIDs.end(); ++idIt, ++k ) { + aGroup[ k ] = *idIt; + } + } + + TPythonDump() << "equal_elements = " << this << ".FindEqualElements( " + <() ); + list< int >& aListOfElemsID = aListOfListOfElementsID.back(); + for ( int j = 0; j < anElemsIDGroup.length(); j++ ) { + CORBA::Long id = anElemsIDGroup[ j ]; + aListOfElemsID.push_back( id ); + } + if ( aListOfElemsID.size() < 2 ) + aListOfListOfElementsID.pop_back(); + if ( i > 0 ) aTPythonDump << ", "; + aTPythonDump << anElemsIDGroup; + } + + ::SMESH_MeshEditor anEditor( myMesh ); + anEditor.MergeElements(aListOfListOfElementsID); + + myMesh->SetIsModified( true ); + + aTPythonDump << "] )"; +} + +//======================================================================= +//function : MergeEqualElements +//purpose : +//======================================================================= + +void SMESH_MeshEditor_i::MergeEqualElements() +{ + initData(); + + ::SMESH_MeshEditor anEditor( myMesh ); + anEditor.MergeEqualElements(); + + TPythonDump() << this << ".MergeEqualElements()"; +} + +//============================================================================= +/*! + * Move the node to a given point + */ +//============================================================================= + +CORBA::Boolean SMESH_MeshEditor_i::MoveNode(CORBA::Long NodeID, + CORBA::Double x, + CORBA::Double y, + CORBA::Double z) +{ + initData(/*deleteSearchers=*/false); + + const SMDS_MeshNode * node = GetMeshDS()->FindNode( NodeID ); + if ( !node ) + return false; + + if ( theNodeSearcher ) + theSearchersDeleter.Set( myMesh ); // remove theNodeSearcher if mesh is other + + if ( myPreviewMode ) // make preview data + { + // in a preview mesh, make edges linked to a node + TPreviewMesh tmpMesh; + TIDSortedElemSet linkedNodes; + ::SMESH_MeshEditor::GetLinkedNodes( node, linkedNodes ); + TIDSortedElemSet::iterator nIt = linkedNodes.begin(); + for ( ; nIt != linkedNodes.end(); ++nIt ) + { + SMDS_MeshEdge edge( node, cast2Node( *nIt )); + tmpMesh.Copy( &edge ); + } + // move copied node + node = tmpMesh.GetMeshDS()->FindNode( NodeID ); + if ( node ) + tmpMesh.GetMeshDS()->MoveNode(node, x, y, z); + // fill preview data + ::SMESH_MeshEditor anEditor( & tmpMesh ); + storeResult( anEditor ); + } + else if ( theNodeSearcher ) // move node and update theNodeSearcher data accordingly + theNodeSearcher->MoveNode(node, gp_Pnt( x,y,z )); + else + GetMeshDS()->MoveNode(node, x, y, z); + + if ( !myPreviewMode ) + { + // Update Python script + TPythonDump() << "isDone = " << this << ".MoveNode( " + << NodeID << ", " << x << ", " << y << ", " << z << " )"; + + myMesh->SetIsModified( true ); + } + + return true; +} + +//================================================================================ +/*! + * \brief Return ID of node closest to a given point + */ +//================================================================================ + +CORBA::Long SMESH_MeshEditor_i::FindNodeClosestTo(CORBA::Double x, + CORBA::Double y, + CORBA::Double z) +{ + theSearchersDeleter.Set( myMesh ); // remove theNodeSearcher if mesh is other + + if ( !theNodeSearcher ) { + ::SMESH_MeshEditor anEditor( myMesh ); + theNodeSearcher = anEditor.GetNodeSearcher(); + } + gp_Pnt p( x,y,z ); + if ( const SMDS_MeshNode* node = theNodeSearcher->FindClosestTo( p )) + return node->GetID(); + + return 0; +} + +//================================================================================ +/*! + * \brief If the given ID is a valid node ID (nodeID > 0), just move this node, else + * move the node closest to the point to point's location and return ID of the node + */ +//================================================================================ + +CORBA::Long SMESH_MeshEditor_i::MoveClosestNodeToPoint(CORBA::Double x, + CORBA::Double y, + CORBA::Double z, + CORBA::Long theNodeID) +{ + // We keep theNodeSearcher until any mesh modification: + // 1) initData() deletes theNodeSearcher at any edition, + // 2) TSearchersDeleter - at any mesh compute event and mesh change + + initData(/*deleteSearchers=*/false); + + theSearchersDeleter.Set( myMesh ); // remove theNodeSearcher if mesh is other + + int nodeID = theNodeID; + const SMDS_MeshNode* node = GetMeshDS()->FindNode( nodeID ); + if ( !node ) // preview moving node + { + if ( !theNodeSearcher ) { + ::SMESH_MeshEditor anEditor( myMesh ); + theNodeSearcher = anEditor.GetNodeSearcher(); + } + gp_Pnt p( x,y,z ); + node = theNodeSearcher->FindClosestTo( p ); + } + if ( node ) { + nodeID = node->GetID(); + if ( myPreviewMode ) // make preview data + { + // in a preview mesh, make edges linked to a node + TPreviewMesh tmpMesh; + TIDSortedElemSet linkedNodes; + ::SMESH_MeshEditor::GetLinkedNodes( node, linkedNodes ); + TIDSortedElemSet::iterator nIt = linkedNodes.begin(); + for ( ; nIt != linkedNodes.end(); ++nIt ) + { + SMDS_MeshEdge edge( node, cast2Node( *nIt )); + tmpMesh.Copy( &edge ); + } + // move copied node + node = tmpMesh.GetMeshDS()->FindNode( nodeID ); + if ( node ) + tmpMesh.GetMeshDS()->MoveNode(node, x, y, z); + // fill preview data + ::SMESH_MeshEditor anEditor( & tmpMesh ); + storeResult( anEditor ); + } + else if ( theNodeSearcher ) // move node and update theNodeSearcher data accordingly + { + theNodeSearcher->MoveNode(node, gp_Pnt( x,y,z )); + } + else + { + GetMeshDS()->MoveNode(node, x, y, z); + } + } + + if ( !myPreviewMode ) + { + TPythonDump() << "nodeID = " << this + << ".MoveClosestNodeToPoint( "<< x << ", " << y << ", " << z + << ", " << nodeID << " )"; + + myMesh->SetIsModified( true ); + } + + return nodeID; +} + +//======================================================================= +/*! + * Return elements of given type where the given point is IN or ON. + * + * 'ALL' type means elements of any type excluding nodes + */ +//======================================================================= + +SMESH::long_array* SMESH_MeshEditor_i::FindElementsByPoint(CORBA::Double x, + CORBA::Double y, + CORBA::Double z, + SMESH::ElementType type) +{ + SMESH::long_array_var res = new SMESH::long_array; + vector< const SMDS_MeshElement* > foundElems; + + theSearchersDeleter.Set( myMesh ); + if ( !theElementSearcher ) { + ::SMESH_MeshEditor anEditor( myMesh ); + theElementSearcher = anEditor.GetElementSearcher(); + } + theElementSearcher->FindElementsByPoint( gp_Pnt( x,y,z ), + SMDSAbs_ElementType( type ), + foundElems); + res->length( foundElems.size() ); + for ( int i = 0; i < foundElems.size(); ++i ) + res[i] = foundElems[i]->GetID(); + + if ( !myPreviewMode ) // call from tui + TPythonDump() << res << " = " << this << ".FindElementsByPoint( " + << x << ", " + << y << ", " + << z << ", " + << type << " )"; + + return res._retn(); +} + +//======================================================================= +//function : GetPointState +//purpose : Return point state in a closed 2D mesh in terms of TopAbs_State enumeration. +// TopAbs_UNKNOWN state means that either mesh is wrong or the analysis fails. +//======================================================================= + +CORBA::Short SMESH_MeshEditor_i::GetPointState(CORBA::Double x, + CORBA::Double y, + CORBA::Double z) +{ + theSearchersDeleter.Set( myMesh ); + if ( !theElementSearcher ) { + ::SMESH_MeshEditor anEditor( myMesh ); + theElementSearcher = anEditor.GetElementSearcher(); + } + return CORBA::Short( theElementSearcher->GetPointState( gp_Pnt( x,y,z ))); +} + +//======================================================================= +//function : convError +//purpose : +//======================================================================= + +#define RETCASE(enm) case ::SMESH_MeshEditor::enm: return SMESH::SMESH_MeshEditor::enm; + +static SMESH::SMESH_MeshEditor::Sew_Error convError( const::SMESH_MeshEditor::Sew_Error e ) +{ + switch ( e ) { + RETCASE( SEW_OK ); + RETCASE( SEW_BORDER1_NOT_FOUND ); + RETCASE( SEW_BORDER2_NOT_FOUND ); + RETCASE( SEW_BOTH_BORDERS_NOT_FOUND ); + RETCASE( SEW_BAD_SIDE_NODES ); + RETCASE( SEW_VOLUMES_TO_SPLIT ); + RETCASE( SEW_DIFF_NB_OF_ELEMENTS ); + RETCASE( SEW_TOPO_DIFF_SETS_OF_ELEMENTS ); + RETCASE( SEW_BAD_SIDE1_NODES ); + RETCASE( SEW_BAD_SIDE2_NODES ); + } + return SMESH::SMESH_MeshEditor::SEW_OK; +} + +//======================================================================= +//function : SewFreeBorders +//purpose : +//======================================================================= + +SMESH::SMESH_MeshEditor::Sew_Error +SMESH_MeshEditor_i::SewFreeBorders(CORBA::Long FirstNodeID1, + CORBA::Long SecondNodeID1, + CORBA::Long LastNodeID1, + CORBA::Long FirstNodeID2, + CORBA::Long SecondNodeID2, + CORBA::Long LastNodeID2, + CORBA::Boolean CreatePolygons, + CORBA::Boolean CreatePolyedrs) +{ + initData(); + + SMESHDS_Mesh* aMesh = GetMeshDS(); + + const SMDS_MeshNode* aBorderFirstNode = aMesh->FindNode( FirstNodeID1 ); + const SMDS_MeshNode* aBorderSecondNode = aMesh->FindNode( SecondNodeID1 ); + const SMDS_MeshNode* aBorderLastNode = aMesh->FindNode( LastNodeID1 ); + const SMDS_MeshNode* aSide2FirstNode = aMesh->FindNode( FirstNodeID2 ); + const SMDS_MeshNode* aSide2SecondNode = aMesh->FindNode( SecondNodeID2 ); + const SMDS_MeshNode* aSide2ThirdNode = aMesh->FindNode( LastNodeID2 ); + + if (!aBorderFirstNode || + !aBorderSecondNode|| + !aBorderLastNode) + return SMESH::SMESH_MeshEditor::SEW_BORDER1_NOT_FOUND; + if (!aSide2FirstNode || + !aSide2SecondNode || + !aSide2ThirdNode) + return SMESH::SMESH_MeshEditor::SEW_BORDER2_NOT_FOUND; + + TPythonDump() << "error = " << this << ".SewFreeBorders( " + << FirstNodeID1 << ", " + << SecondNodeID1 << ", " + << LastNodeID1 << ", " + << FirstNodeID2 << ", " + << SecondNodeID2 << ", " + << LastNodeID2 << ", " + << CreatePolygons<< ", " + << CreatePolyedrs<< " )"; + + ::SMESH_MeshEditor anEditor( myMesh ); + SMESH::SMESH_MeshEditor::Sew_Error error = + convError( anEditor.SewFreeBorder (aBorderFirstNode, + aBorderSecondNode, + aBorderLastNode, + aSide2FirstNode, + aSide2SecondNode, + aSide2ThirdNode, + true, + CreatePolygons, + CreatePolyedrs) ); + + storeResult(anEditor); + + myMesh->SetIsModified( true ); + + return error; +} + + +//======================================================================= +//function : SewConformFreeBorders +//purpose : +//======================================================================= + +SMESH::SMESH_MeshEditor::Sew_Error +SMESH_MeshEditor_i::SewConformFreeBorders(CORBA::Long FirstNodeID1, + CORBA::Long SecondNodeID1, + CORBA::Long LastNodeID1, + CORBA::Long FirstNodeID2, + CORBA::Long SecondNodeID2) +{ + initData(); + + SMESHDS_Mesh* aMesh = GetMeshDS(); + + const SMDS_MeshNode* aBorderFirstNode = aMesh->FindNode( FirstNodeID1 ); + const SMDS_MeshNode* aBorderSecondNode = aMesh->FindNode( SecondNodeID1 ); + const SMDS_MeshNode* aBorderLastNode = aMesh->FindNode( LastNodeID1 ); + const SMDS_MeshNode* aSide2FirstNode = aMesh->FindNode( FirstNodeID2 ); + const SMDS_MeshNode* aSide2SecondNode = aMesh->FindNode( SecondNodeID2 ); + const SMDS_MeshNode* aSide2ThirdNode = 0; + + if (!aBorderFirstNode || + !aBorderSecondNode|| + !aBorderLastNode ) + return SMESH::SMESH_MeshEditor::SEW_BORDER1_NOT_FOUND; + if (!aSide2FirstNode || + !aSide2SecondNode) + return SMESH::SMESH_MeshEditor::SEW_BORDER2_NOT_FOUND; + + TPythonDump() << "error = " << this << ".SewConformFreeBorders( " + << FirstNodeID1 << ", " + << SecondNodeID1 << ", " + << LastNodeID1 << ", " + << FirstNodeID2 << ", " + << SecondNodeID2 << " )"; + + ::SMESH_MeshEditor anEditor( myMesh ); + SMESH::SMESH_MeshEditor::Sew_Error error = + convError( anEditor.SewFreeBorder (aBorderFirstNode, + aBorderSecondNode, + aBorderLastNode, + aSide2FirstNode, + aSide2SecondNode, + aSide2ThirdNode, + true, + false, false) ); + + storeResult(anEditor); + + myMesh->SetIsModified( true ); + + return error; +} + + +//======================================================================= +//function : SewBorderToSide +//purpose : +//======================================================================= + +SMESH::SMESH_MeshEditor::Sew_Error +SMESH_MeshEditor_i::SewBorderToSide(CORBA::Long FirstNodeIDOnFreeBorder, + CORBA::Long SecondNodeIDOnFreeBorder, + CORBA::Long LastNodeIDOnFreeBorder, + CORBA::Long FirstNodeIDOnSide, + CORBA::Long LastNodeIDOnSide, + CORBA::Boolean CreatePolygons, + CORBA::Boolean CreatePolyedrs) +{ + initData(); + + SMESHDS_Mesh* aMesh = GetMeshDS(); + + const SMDS_MeshNode* aBorderFirstNode = aMesh->FindNode( FirstNodeIDOnFreeBorder ); + const SMDS_MeshNode* aBorderSecondNode = aMesh->FindNode( SecondNodeIDOnFreeBorder ); + const SMDS_MeshNode* aBorderLastNode = aMesh->FindNode( LastNodeIDOnFreeBorder ); + const SMDS_MeshNode* aSide2FirstNode = aMesh->FindNode( FirstNodeIDOnSide ); + const SMDS_MeshNode* aSide2SecondNode = aMesh->FindNode( LastNodeIDOnSide ); + const SMDS_MeshNode* aSide2ThirdNode = 0; + + if (!aBorderFirstNode || + !aBorderSecondNode|| + !aBorderLastNode ) + return SMESH::SMESH_MeshEditor::SEW_BORDER1_NOT_FOUND; + if (!aSide2FirstNode || + !aSide2SecondNode) + return SMESH::SMESH_MeshEditor::SEW_BAD_SIDE_NODES; + + TPythonDump() << "error = " << this << ".SewBorderToSide( " + << FirstNodeIDOnFreeBorder << ", " + << SecondNodeIDOnFreeBorder << ", " + << LastNodeIDOnFreeBorder << ", " + << FirstNodeIDOnSide << ", " + << LastNodeIDOnSide << ", " + << CreatePolygons << ", " + << CreatePolyedrs << ") "; + + ::SMESH_MeshEditor anEditor( myMesh ); + SMESH::SMESH_MeshEditor::Sew_Error error = + convError( anEditor.SewFreeBorder (aBorderFirstNode, + aBorderSecondNode, + aBorderLastNode, + aSide2FirstNode, + aSide2SecondNode, + aSide2ThirdNode, + false, + CreatePolygons, + CreatePolyedrs) ); + + storeResult(anEditor); + + myMesh->SetIsModified( true ); + + return error; +} + + +//======================================================================= +//function : SewSideElements +//purpose : +//======================================================================= + +SMESH::SMESH_MeshEditor::Sew_Error +SMESH_MeshEditor_i::SewSideElements(const SMESH::long_array& IDsOfSide1Elements, + const SMESH::long_array& IDsOfSide2Elements, + CORBA::Long NodeID1OfSide1ToMerge, + CORBA::Long NodeID1OfSide2ToMerge, + CORBA::Long NodeID2OfSide1ToMerge, + CORBA::Long NodeID2OfSide2ToMerge) +{ + initData(); + SMESHDS_Mesh* aMesh = GetMeshDS(); - const SMDS_MeshNode* aBorderFirstNode = aMesh->FindNode( FirstNodeID1 ); - const SMDS_MeshNode* aBorderSecondNode = aMesh->FindNode( SecondNodeID1 ); - const SMDS_MeshNode* aBorderLastNode = aMesh->FindNode( LastNodeID1 ); - const SMDS_MeshNode* aSide2FirstNode = aMesh->FindNode( FirstNodeID2 ); - const SMDS_MeshNode* aSide2SecondNode = aMesh->FindNode( SecondNodeID2 ); - const SMDS_MeshNode* aSide2ThirdNode = aMesh->FindNode( LastNodeID2 ); + const SMDS_MeshNode* aFirstNode1ToMerge = aMesh->FindNode( NodeID1OfSide1ToMerge ); + const SMDS_MeshNode* aFirstNode2ToMerge = aMesh->FindNode( NodeID1OfSide2ToMerge ); + const SMDS_MeshNode* aSecondNode1ToMerge = aMesh->FindNode( NodeID2OfSide1ToMerge ); + const SMDS_MeshNode* aSecondNode2ToMerge = aMesh->FindNode( NodeID2OfSide2ToMerge ); + + if (!aFirstNode1ToMerge || + !aFirstNode2ToMerge ) + return SMESH::SMESH_MeshEditor::SEW_BAD_SIDE1_NODES; + if (!aSecondNode1ToMerge|| + !aSecondNode2ToMerge) + return SMESH::SMESH_MeshEditor::SEW_BAD_SIDE2_NODES; + + TIDSortedElemSet aSide1Elems, aSide2Elems; + arrayToSet(IDsOfSide1Elements, aMesh, aSide1Elems); + arrayToSet(IDsOfSide2Elements, aMesh, aSide2Elems); + + TPythonDump() << "error = " << this << ".SewSideElements( " + << IDsOfSide1Elements << ", " + << IDsOfSide2Elements << ", " + << NodeID1OfSide1ToMerge << ", " + << NodeID1OfSide2ToMerge << ", " + << NodeID2OfSide1ToMerge << ", " + << NodeID2OfSide2ToMerge << ")"; + + ::SMESH_MeshEditor anEditor( myMesh ); + SMESH::SMESH_MeshEditor::Sew_Error error = + convError( anEditor.SewSideElements (aSide1Elems, aSide2Elems, + aFirstNode1ToMerge, + aFirstNode2ToMerge, + aSecondNode1ToMerge, + aSecondNode2ToMerge)); + + storeResult(anEditor); + + myMesh->SetIsModified( true ); + + return error; +} + +//================================================================================ +/*! + * \brief Set new nodes for given element + * \param ide - element id + * \param newIDs - new node ids + * \retval CORBA::Boolean - true if result is OK + */ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::ChangeElemNodes(CORBA::Long ide, + const SMESH::long_array& newIDs) +{ + initData(); + + const SMDS_MeshElement* elem = GetMeshDS()->FindElement(ide); + if(!elem) return false; + + int nbn = newIDs.length(); + int i=0; + vector aNodes(nbn); + int nbn1=-1; + for(; iFindNode(newIDs[i]); + if(aNode) { + nbn1++; + aNodes[nbn1] = aNode; + } + } + TPythonDump() << "isDone = " << this << ".ChangeElemNodes( " + << ide << ", " << newIDs << " )"; + + bool res = GetMeshDS()->ChangeElementNodes( elem, & aNodes[0], nbn1+1 ); + + if ( res ) + myMesh->SetIsModified( true ); + + return res; +} + +//================================================================================ +/*! + * \brief Update myLastCreated* or myPreviewData + * \param anEditor - it contains last modification results + */ +//================================================================================ + +void SMESH_MeshEditor_i::storeResult(::SMESH_MeshEditor& anEditor) +{ + if ( myPreviewMode ) { // --- MeshPreviewStruct filling --- + + list aNodesConnectivity; + typedef map TNodesMap; + TNodesMap nodesMap; + + TPreviewMesh * aPreviewMesh = dynamic_cast< TPreviewMesh* >( anEditor.GetMesh() ); + SMDSAbs_ElementType previewType = aPreviewMesh->myPreviewType; + + SMESHDS_Mesh* aMeshDS = anEditor.GetMeshDS(); + int nbEdges = aMeshDS->NbEdges(); + int nbFaces = aMeshDS->NbFaces(); + int nbVolum = aMeshDS->NbVolumes(); + switch ( previewType ) { + case SMDSAbs_Edge : nbFaces = nbVolum = 0; break; + case SMDSAbs_Face : nbEdges = nbVolum = 0; break; + case SMDSAbs_Volume: nbEdges = nbFaces = 0; break; + default:; + } + myPreviewData->nodesXYZ.length(aMeshDS->NbNodes()); + myPreviewData->elementTypes.length(nbEdges + nbFaces + nbVolum); + int i = 0, j = 0; + SMDS_ElemIteratorPtr itMeshElems = aMeshDS->elementsIterator(); + + while ( itMeshElems->more() ) { + const SMDS_MeshElement* aMeshElem = itMeshElems->next(); + if ( previewType != SMDSAbs_All && aMeshElem->GetType() != previewType ) + continue; + + SMDS_ElemIteratorPtr itElemNodes = aMeshElem->nodesIterator(); + while ( itElemNodes->more() ) { + const SMDS_MeshNode* aMeshNode = + static_cast( itElemNodes->next() ); + int aNodeID = aMeshNode->GetID(); + TNodesMap::iterator anIter = nodesMap.find(aNodeID); + if ( anIter == nodesMap.end() ) { + // filling the nodes coordinates + myPreviewData->nodesXYZ[j].x = aMeshNode->X(); + myPreviewData->nodesXYZ[j].y = aMeshNode->Y(); + myPreviewData->nodesXYZ[j].z = aMeshNode->Z(); + anIter = nodesMap.insert( make_pair(aNodeID, j) ).first; + j++; + } + aNodesConnectivity.push_back(anIter->second); + } + + // filling the elements types + SMDSAbs_ElementType aType; + bool isPoly; + /*if (aMeshElem->GetType() == SMDSAbs_Volume) { + aType = SMDSAbs_Node; + isPoly = false; + } + else*/ { + aType = aMeshElem->GetType(); + isPoly = aMeshElem->IsPoly(); + } + + myPreviewData->elementTypes[i].SMDS_ElementType = (SMESH::ElementType) aType; + myPreviewData->elementTypes[i].isPoly = isPoly; + myPreviewData->elementTypes[i].nbNodesInElement = aMeshElem->NbNodes(); + i++; + + } + myPreviewData->nodesXYZ.length( j ); + + // filling the elements connectivities + list::iterator aConnIter = aNodesConnectivity.begin(); + myPreviewData->elementConnectivities.length(aNodesConnectivity.size()); + for( int i = 0; aConnIter != aNodesConnectivity.end(); aConnIter++, i++ ) + myPreviewData->elementConnectivities[i] = *aConnIter; + + return; + } + + { + // add new nodes into myLastCreatedNodes + const SMESH_SequenceOfElemPtr& aSeq = anEditor.GetLastCreatedNodes(); + myLastCreatedNodes->length(aSeq.Length()); + for(int i=0; iGetID(); + } + { + // add new elements into myLastCreatedElems + const SMESH_SequenceOfElemPtr& aSeq = anEditor.GetLastCreatedElems(); + myLastCreatedElems->length(aSeq.Length()); + for(int i=0; iGetID(); + } +} + +//================================================================================ +/*! + * Return data of mesh edition preview + */ +//================================================================================ + +SMESH::MeshPreviewStruct* SMESH_MeshEditor_i::GetPreviewData() +{ + return myPreviewData._retn(); +} + +//================================================================================ +/*! + * \brief Returns list of it's IDs of created nodes + * \retval SMESH::long_array* - list of node ID + */ +//================================================================================ - if (!aBorderFirstNode || - !aBorderSecondNode|| - !aBorderLastNode) - return SMESH::SMESH_MeshEditor::SEW_BORDER1_NOT_FOUND; - if (!aSide2FirstNode || - !aSide2SecondNode || - !aSide2ThirdNode) - return SMESH::SMESH_MeshEditor::SEW_BORDER2_NOT_FOUND; +SMESH::long_array* SMESH_MeshEditor_i::GetLastCreatedNodes() +{ + return myLastCreatedNodes._retn(); +} - // Update Python script - TCollection_AsciiString str ("error = mesh_editor.SewFreeBorders( "); - str += TCollection_AsciiString( (int) FirstNodeID1 ) + ", "; - str += TCollection_AsciiString( (int) SecondNodeID1 ) + ", "; - str += TCollection_AsciiString( (int) LastNodeID1 ) + ", "; - str += TCollection_AsciiString( (int) FirstNodeID2 ) + ", "; - str += TCollection_AsciiString( (int) SecondNodeID2 ) + ", "; - str += TCollection_AsciiString( (int) LastNodeID2 ) + ", "; - str += TCollection_AsciiString( CreatePolygons ) + ", "; - str += TCollection_AsciiString( CreatePolyedrs ) + ") "; - SMESH_Gen_i::AddToCurrentPyScript( str ); - - ::SMESH_MeshEditor anEditor( _myMesh ); - return convError( anEditor.SewFreeBorder (aBorderFirstNode, - aBorderSecondNode, - aBorderLastNode, - aSide2FirstNode, - aSide2SecondNode, - aSide2ThirdNode, - true, - CreatePolygons, - CreatePolyedrs) ); +//================================================================================ +/*! + * \brief Returns list of it's IDs of created elements + * \retval SMESH::long_array* - list of elements' ID + */ +//================================================================================ + +SMESH::long_array* SMESH_MeshEditor_i::GetLastCreatedElems() +{ + return myLastCreatedElems._retn(); } //======================================================================= -//function : SewConformFreeBorders +//function : ConvertToQuadratic //purpose : //======================================================================= -SMESH::SMESH_MeshEditor::Sew_Error - SMESH_MeshEditor_i::SewConformFreeBorders(CORBA::Long FirstNodeID1, - CORBA::Long SecondNodeID1, - CORBA::Long LastNodeID1, - CORBA::Long FirstNodeID2, - CORBA::Long SecondNodeID2) +void SMESH_MeshEditor_i::ConvertToQuadratic(CORBA::Boolean theForce3d) { - SMESHDS_Mesh* aMesh = GetMeshDS(); + ::SMESH_MeshEditor anEditor( myMesh ); + anEditor.ConvertToQuadratic(theForce3d); + TPythonDump() << this << ".ConvertToQuadratic( " << theForce3d << " )"; + myMesh->SetIsModified( true ); +} - const SMDS_MeshNode* aBorderFirstNode = aMesh->FindNode( FirstNodeID1 ); - const SMDS_MeshNode* aBorderSecondNode = aMesh->FindNode( SecondNodeID1 ); - const SMDS_MeshNode* aBorderLastNode = aMesh->FindNode( LastNodeID1 ); - const SMDS_MeshNode* aSide2FirstNode = aMesh->FindNode( FirstNodeID2 ); - const SMDS_MeshNode* aSide2SecondNode = aMesh->FindNode( SecondNodeID2 ); - const SMDS_MeshNode* aSide2ThirdNode = 0; +//======================================================================= +//function : ConvertFromQuadratic +//purpose : +//======================================================================= - if (!aBorderFirstNode || - !aBorderSecondNode|| - !aBorderLastNode ) - return SMESH::SMESH_MeshEditor::SEW_BORDER1_NOT_FOUND; - if (!aSide2FirstNode || - !aSide2SecondNode) - return SMESH::SMESH_MeshEditor::SEW_BORDER2_NOT_FOUND; +CORBA::Boolean SMESH_MeshEditor_i::ConvertFromQuadratic() +{ + ::SMESH_MeshEditor anEditor( myMesh ); + CORBA::Boolean isDone = anEditor.ConvertFromQuadratic(); + TPythonDump() << this << ".ConvertFromQuadratic()"; + if ( isDone ) + myMesh->SetIsModified( true ); + return isDone; +} - // Update Python script - TCollection_AsciiString str ("error = mesh_editor.SewConformFreeBorders( "); - str += TCollection_AsciiString( (int) FirstNodeID1 ) + ", "; - str += TCollection_AsciiString( (int) SecondNodeID1 ) + ", "; - str += TCollection_AsciiString( (int) LastNodeID1 ) + ", "; - str += TCollection_AsciiString( (int) FirstNodeID2 ) + ", "; - str += TCollection_AsciiString( (int) SecondNodeID2 ) + ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); - - ::SMESH_MeshEditor anEditor( _myMesh ); - return convError( anEditor.SewFreeBorder (aBorderFirstNode, - aBorderSecondNode, - aBorderLastNode, - aSide2FirstNode, - aSide2SecondNode, - aSide2ThirdNode, - true, - false, false) ); +//======================================================================= +//function : makeMesh +//purpose : create a named imported mesh +//======================================================================= + +SMESH::SMESH_Mesh_ptr SMESH_MeshEditor_i::makeMesh(const char* theMeshName) +{ + SMESH_Gen_i* gen = SMESH_Gen_i::GetSMESHGen(); + SMESH::SMESH_Mesh_var mesh = gen->CreateEmptyMesh(); + SALOMEDS::Study_var study = gen->GetCurrentStudy(); + SALOMEDS::SObject_var meshSO = gen->ObjectToSObject( study, mesh ); + gen->SetName( meshSO, theMeshName, "Mesh" ); + gen->SetPixMap( meshSO, "ICON_SMESH_TREE_MESH_IMPORTED"); + + return mesh._retn(); } //======================================================================= -//function : SewBorderToSide +//function : DumpGroupsList //purpose : //======================================================================= +void SMESH_MeshEditor_i::DumpGroupsList(TPythonDump & theDumpPython, + const SMESH::ListOfGroups * theGroupList) +{ + bool isDumpGroupList = theGroupList && theGroupList->length() > 0; + if(isDumpGroupList) { + theDumpPython << theGroupList << " = "; + } +} -SMESH::SMESH_MeshEditor::Sew_Error - SMESH_MeshEditor_i::SewBorderToSide(CORBA::Long FirstNodeIDOnFreeBorder, - CORBA::Long SecondNodeIDOnFreeBorder, - CORBA::Long LastNodeIDOnFreeBorder, - CORBA::Long FirstNodeIDOnSide, - CORBA::Long LastNodeIDOnSide, - CORBA::Boolean CreatePolygons, - CORBA::Boolean CreatePolyedrs) +//================================================================================ +/*! + \brief Generates the unique group name. + \param thePrefix name prefix + \return unique name +*/ +//================================================================================ +string SMESH_MeshEditor_i::generateGroupName(const string& thePrefix) { - SMESHDS_Mesh* aMesh = GetMeshDS(); + SMESH::ListOfGroups_var groups = myMesh_i->GetGroups(); + set groupNames; + + // Get existing group names + for (int i = 0, nbGroups = groups->length(); i < nbGroups; i++ ) { + SMESH::SMESH_GroupBase_var aGroup = groups[i]; + if (CORBA::is_nil(aGroup)) + continue; + + groupNames.insert(aGroup->GetName()); + } - const SMDS_MeshNode* aBorderFirstNode = aMesh->FindNode( FirstNodeIDOnFreeBorder ); - const SMDS_MeshNode* aBorderSecondNode = aMesh->FindNode( SecondNodeIDOnFreeBorder ); - const SMDS_MeshNode* aBorderLastNode = aMesh->FindNode( LastNodeIDOnFreeBorder ); - const SMDS_MeshNode* aSide2FirstNode = aMesh->FindNode( FirstNodeIDOnSide ); - const SMDS_MeshNode* aSide2SecondNode = aMesh->FindNode( LastNodeIDOnSide ); - const SMDS_MeshNode* aSide2ThirdNode = 0; + // Find new name + string name = thePrefix; + int index = 0; - if (!aBorderFirstNode || - !aBorderSecondNode|| - !aBorderLastNode ) - return SMESH::SMESH_MeshEditor::SEW_BORDER1_NOT_FOUND; - if (!aSide2FirstNode || - !aSide2SecondNode) - return SMESH::SMESH_MeshEditor::SEW_BAD_SIDE_NODES; + while (!groupNames.insert(name).second) { + if (index == 0) { + name += "_1"; + } + else { + TCollection_AsciiString nbStr(index+1); + name.resize( name.rfind('_')+1 ); + name += nbStr.ToCString(); + } + ++index; + } + + return name; +} + +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + \param theNodes - identifiers of nodes to be doubled + \param theModifiedElems - identifiers of elements to be updated by the new (doubled) + nodes. If list of element identifiers is empty then nodes are doubled but + they not assigned to elements + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNode(), DoubleNodeGroup(), DoubleNodeGroups() +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodes( const SMESH::long_array& theNodes, + const SMESH::long_array& theModifiedElems ) +{ + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + list< int > aListOfNodes; + int i, n; + for ( i = 0, n = theNodes.length(); i < n; i++ ) + aListOfNodes.push_back( theNodes[ i ] ); + + list< int > aListOfElems; + for ( i = 0, n = theModifiedElems.length(); i < n; i++ ) + aListOfElems.push_back( theModifiedElems[ i ] ); + + bool aResult = aMeshEditor.DoubleNodes( aListOfNodes, aListOfElems ); + + storeResult( aMeshEditor) ; + if ( aResult ) + myMesh->SetIsModified( true ); // Update Python script - TCollection_AsciiString str ("error = mesh_editor.SewBorderToSide( "); - str += TCollection_AsciiString( (int) FirstNodeIDOnFreeBorder ) + ", "; - str += TCollection_AsciiString( (int) SecondNodeIDOnFreeBorder ) + ", "; - str += TCollection_AsciiString( (int) LastNodeIDOnFreeBorder ) + ", "; - str += TCollection_AsciiString( (int) FirstNodeIDOnSide ) + ", "; - str += TCollection_AsciiString( (int) LastNodeIDOnSide ) + ", "; - str += TCollection_AsciiString( CreatePolygons ) + ", "; - str += TCollection_AsciiString( CreatePolyedrs ) + ") "; - SMESH_Gen_i::AddToCurrentPyScript( str ); - - ::SMESH_MeshEditor anEditor( _myMesh ); - return convError( anEditor.SewFreeBorder (aBorderFirstNode, - aBorderSecondNode, - aBorderLastNode, - aSide2FirstNode, - aSide2SecondNode, - aSide2ThirdNode, - false, - CreatePolygons, - CreatePolyedrs) ); + TPythonDump() << this << ".DoubleNodes( " << theNodes << ", "<< theModifiedElems << " )"; + + return aResult; } -//======================================================================= -//function : SewSideElements -//purpose : -//======================================================================= +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + This method provided for convenience works as DoubleNodes() described above. + \param theNodeId - identifier of node to be doubled. + \param theModifiedElems - identifiers of elements to be updated. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNodes(), DoubleNodeGroup(), DoubleNodeGroups() +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNode( CORBA::Long theNodeId, + const SMESH::long_array& theModifiedElems ) +{ + SMESH::long_array_var aNodes = new SMESH::long_array; + aNodes->length( 1 ); + aNodes[ 0 ] = theNodeId; -SMESH::SMESH_MeshEditor::Sew_Error - SMESH_MeshEditor_i::SewSideElements(const SMESH::long_array& IDsOfSide1Elements, - const SMESH::long_array& IDsOfSide2Elements, - CORBA::Long NodeID1OfSide1ToMerge, - CORBA::Long NodeID1OfSide2ToMerge, - CORBA::Long NodeID2OfSide1ToMerge, - CORBA::Long NodeID2OfSide2ToMerge) + TPythonDump pyDump; // suppress dump by the next line + + CORBA::Boolean done = DoubleNodes( aNodes, theModifiedElems ); + + pyDump << this << ".DoubleNode( " << theNodeId << ", " << theModifiedElems << " )"; + + return done; +} + +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + This method provided for convenience works as DoubleNodes() described above. + \param theNodes - group of nodes to be doubled. + \param theModifiedElems - group of elements to be updated. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNode(), DoubleNodes(), DoubleNodeGroups() +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroup(SMESH::SMESH_GroupBase_ptr theNodes, + SMESH::SMESH_GroupBase_ptr theModifiedElems ) { - SMESHDS_Mesh* aMesh = GetMeshDS(); + if ( CORBA::is_nil( theNodes ) && theNodes->GetType() != SMESH::NODE ) + return false; - const SMDS_MeshNode* aFirstNode1ToMerge = aMesh->FindNode( NodeID1OfSide1ToMerge ); - const SMDS_MeshNode* aFirstNode2ToMerge = aMesh->FindNode( NodeID1OfSide2ToMerge ); - const SMDS_MeshNode* aSecondNode1ToMerge = aMesh->FindNode( NodeID2OfSide1ToMerge ); - const SMDS_MeshNode* aSecondNode2ToMerge = aMesh->FindNode( NodeID2OfSide2ToMerge ); + SMESH::long_array_var aNodes = theNodes->GetListOfID(); + SMESH::long_array_var aModifiedElems; + if ( !CORBA::is_nil( theModifiedElems ) ) + aModifiedElems = theModifiedElems->GetListOfID(); + else + { + aModifiedElems = new SMESH::long_array; + aModifiedElems->length( 0 ); + } - if (!aFirstNode1ToMerge || - !aFirstNode2ToMerge ) - return SMESH::SMESH_MeshEditor::SEW_BAD_SIDE1_NODES; - if (!aSecondNode1ToMerge|| - !aSecondNode2ToMerge) - return SMESH::SMESH_MeshEditor::SEW_BAD_SIDE2_NODES; + TPythonDump pyDump; // suppress dump by the next line + + bool done = DoubleNodes( aNodes, aModifiedElems ); - set aSide1Elems, aSide2Elems; - for (int i = 0; i < IDsOfSide1Elements.length(); i++) + pyDump << this << ".DoubleNodeGroup( " << theNodes << ", " << theModifiedElems << " )"; + + return done; +} + +/*! + * \brief Creates a hole in a mesh by doubling the nodes of some particular elements. + * Works as DoubleNodeGroup(), but returns a new group with newly created nodes. + * \param theNodes - group of nodes to be doubled. + * \param theModifiedElems - group of elements to be updated. + * \return a new group with newly created nodes + * \sa DoubleNodeGroup() + */ +SMESH::SMESH_Group_ptr SMESH_MeshEditor_i::DoubleNodeGroupNew( SMESH::SMESH_GroupBase_ptr theNodes, + SMESH::SMESH_GroupBase_ptr theModifiedElems ) +{ + if ( CORBA::is_nil( theNodes ) && theNodes->GetType() != SMESH::NODE ) + return false; + + SMESH::SMESH_Group_var aNewGroup; + + // Duplicate nodes + SMESH::long_array_var aNodes = theNodes->GetListOfID(); + SMESH::long_array_var aModifiedElems; + if ( !CORBA::is_nil( theModifiedElems ) ) + aModifiedElems = theModifiedElems->GetListOfID(); + else { + aModifiedElems = new SMESH::long_array; + aModifiedElems->length( 0 ); + } + + TPythonDump pyDump; // suppress dump by the next line + + bool aResult = DoubleNodes( aNodes, aModifiedElems ); + + if ( aResult ) { - CORBA::Long index = IDsOfSide1Elements[i]; - const SMDS_MeshElement * elem = aMesh->FindElement(index); - if ( elem ) - aSide1Elems.insert( elem ); + // Create group with newly created nodes + SMESH::long_array_var anIds = GetLastCreatedNodes(); + if (anIds->length() > 0) { + string anUnindexedName (theNodes->GetName()); + string aNewName = generateGroupName(anUnindexedName + "_double"); + aNewGroup = myMesh_i->CreateGroup(SMESH::NODE, aNewName.c_str()); + aNewGroup->Add(anIds); + } + } + + pyDump << "createdNodes = " << this << ".DoubleNodeGroupNew( " << theNodes << ", " + << theModifiedElems << " )"; + + return aNewGroup._retn(); +} + +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + This method provided for convenience works as DoubleNodes() described above. + \param theNodes - list of groups of nodes to be doubled + \param theModifiedElems - list of groups of elements to be updated. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNode(), DoubleNodeGroup(), DoubleNodes() +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroups(const SMESH::ListOfGroups& theNodes, + const SMESH::ListOfGroups& theModifiedElems ) +{ + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + + std::list< int > aNodes; + int i, n, j, m; + for ( i = 0, n = theNodes.length(); i < n; i++ ) + { + SMESH::SMESH_GroupBase_var aGrp = theNodes[ i ]; + if ( !CORBA::is_nil( aGrp ) && aGrp->GetType() == SMESH::NODE ) + { + SMESH::long_array_var aCurr = aGrp->GetListOfID(); + for ( j = 0, m = aCurr->length(); j < m; j++ ) + aNodes.push_back( aCurr[ j ] ); + } } - for (int i = 0; i < IDsOfSide2Elements.length(); i++) + + std::list< int > anElems; + for ( i = 0, n = theModifiedElems.length(); i < n; i++ ) { - CORBA::Long index = IDsOfSide2Elements[i]; - const SMDS_MeshElement * elem = aMesh->FindElement(index); - if ( elem ) - aSide2Elems.insert( elem ); + SMESH::SMESH_GroupBase_var aGrp = theModifiedElems[ i ]; + if ( !CORBA::is_nil( aGrp ) && aGrp->GetType() != SMESH::NODE ) + { + SMESH::long_array_var aCurr = aGrp->GetListOfID(); + for ( j = 0, m = aCurr->length(); j < m; j++ ) + anElems.push_back( aCurr[ j ] ); + } + } + + bool aResult = aMeshEditor.DoubleNodes( aNodes, anElems ); + + storeResult( aMeshEditor) ; + + if ( aResult ) + myMesh->SetIsModified( true ); + + + TPythonDump() << this << ".DoubleNodeGroups( " << theNodes << ", " << theModifiedElems << " )"; + + return aResult; +} + +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + \param theElems - the list of elements (edges or faces) to be replicated + The nodes for duplication could be found from these elements + \param theNodesNot - list of nodes to NOT replicate + \param theAffectedElems - the list of elements (cells and edges) to which the + replicated nodes should be associated to. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNodeGroup(), DoubleNodeGroups() +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElem( const SMESH::long_array& theElems, + const SMESH::long_array& theNodesNot, + const SMESH::long_array& theAffectedElems ) + +{ + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + + SMESHDS_Mesh* aMeshDS = GetMeshDS(); + TIDSortedElemSet anElems, aNodes, anAffected; + arrayToSet(theElems, aMeshDS, anElems, SMDSAbs_All); + arrayToSet(theNodesNot, aMeshDS, aNodes, SMDSAbs_Node); + arrayToSet(theAffectedElems, aMeshDS, anAffected, SMDSAbs_All); + + bool aResult = aMeshEditor.DoubleNodes( anElems, aNodes, anAffected ); + + storeResult( aMeshEditor) ; + + if ( aResult ) + myMesh->SetIsModified( true ); + + // Update Python script + TPythonDump() << this << ".DoubleNodeElem( " << theElems << ", " + << theNodesNot << ", " << theAffectedElems << " )"; + return aResult; +} + +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + \param theElems - the list of elements (edges or faces) to be replicated + The nodes for duplication could be found from these elements + \param theNodesNot - list of nodes to NOT replicate + \param theShape - shape to detect affected elements (element which geometric center + located on or inside shape). + The replicated nodes should be associated to affected elements. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNodeGroupInRegion(), DoubleNodeGroupsInRegion() +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemInRegion ( const SMESH::long_array& theElems, + const SMESH::long_array& theNodesNot, + GEOM::GEOM_Object_ptr theShape ) + +{ + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + + SMESHDS_Mesh* aMeshDS = GetMeshDS(); + TIDSortedElemSet anElems, aNodes; + arrayToSet(theElems, aMeshDS, anElems, SMDSAbs_All); + arrayToSet(theNodesNot, aMeshDS, aNodes, SMDSAbs_Node); + + TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( theShape ); + bool aResult = aMeshEditor.DoubleNodesInRegion( anElems, aNodes, aShape ); + + storeResult( aMeshEditor) ; + + if ( aResult ) + myMesh->SetIsModified( true ); + + // Update Python script + TPythonDump() << "isDone = " << this << ".DoubleNodeElemInRegion( " << theElems << ", " + << theNodesNot << ", " << theShape << " )"; + return aResult; +} + +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + \param theElems - group of of elements (edges or faces) to be replicated + \param theNodesNot - group of nodes not to replicated + \param theAffectedElems - group of elements to which the replicated nodes + should be associated to. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNodes(), DoubleNodeGroups() +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemGroup(SMESH::SMESH_GroupBase_ptr theElems, + SMESH::SMESH_GroupBase_ptr theNodesNot, + SMESH::SMESH_GroupBase_ptr theAffectedElems) +{ + if ( CORBA::is_nil( theElems ) && theElems->GetType() == SMESH::NODE ) + return false; + + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + + SMESHDS_Mesh* aMeshDS = GetMeshDS(); + TIDSortedElemSet anElems, aNodes, anAffected; + idSourceToSet( theElems, aMeshDS, anElems, SMDSAbs_All ); + idSourceToSet( theNodesNot, aMeshDS, aNodes, SMDSAbs_Node ); + idSourceToSet( theAffectedElems, aMeshDS, anAffected, SMDSAbs_All ); + + bool aResult = aMeshEditor.DoubleNodes( anElems, aNodes, anAffected ); + + storeResult( aMeshEditor) ; + + if ( aResult ) + myMesh->SetIsModified( true ); + + // Update Python script + TPythonDump() << "isDone = " << this << ".DoubleNodeElemGroup( " << theElems << ", " + << theNodesNot << ", " << theAffectedElems << " )"; + return aResult; +} + +/*! + * \brief Creates a hole in a mesh by doubling the nodes of some particular elements + * Works as DoubleNodeElemGroup(), but returns a new group with newly created elements. + * \param theElems - group of of elements (edges or faces) to be replicated + * \param theNodesNot - group of nodes not to replicated + * \param theAffectedElems - group of elements to which the replicated nodes + * should be associated to. + * \return a new group with newly created elements + * \sa DoubleNodeElemGroup() + */ +SMESH::SMESH_Group_ptr SMESH_MeshEditor_i::DoubleNodeElemGroupNew(SMESH::SMESH_GroupBase_ptr theElems, + SMESH::SMESH_GroupBase_ptr theNodesNot, + SMESH::SMESH_GroupBase_ptr theAffectedElems) +{ + if ( CORBA::is_nil( theElems ) && theElems->GetType() == SMESH::NODE ) + return false; + + SMESH::SMESH_Group_var aNewGroup; + + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + + SMESHDS_Mesh* aMeshDS = GetMeshDS(); + TIDSortedElemSet anElems, aNodes, anAffected; + idSourceToSet( theElems, aMeshDS, anElems, SMDSAbs_All ); + idSourceToSet( theNodesNot, aMeshDS, aNodes, SMDSAbs_Node ); + idSourceToSet( theAffectedElems, aMeshDS, anAffected, SMDSAbs_All ); + + + bool aResult = aMeshEditor.DoubleNodes( anElems, aNodes, anAffected ); + + storeResult( aMeshEditor) ; + + if ( aResult ) { + myMesh->SetIsModified( true ); + + // Create group with newly created elements + SMESH::long_array_var anIds = GetLastCreatedElems(); + if (anIds->length() > 0) { + SMESH::ElementType aGroupType = myMesh_i->GetElementType(anIds[0], true); + string anUnindexedName (theElems->GetName()); + string aNewName = generateGroupName(anUnindexedName + "_double"); + aNewGroup = myMesh_i->CreateGroup(aGroupType, aNewName.c_str()); + aNewGroup->Add(anIds); + } + } + + // Update Python script + TPythonDump() << "createdElems = " << this << ".DoubleNodeElemGroupNew( " << theElems << ", " + << theNodesNot << ", " << theAffectedElems << " )"; + return aNewGroup._retn(); +} + +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + \param theElems - group of of elements (edges or faces) to be replicated + \param theNodesNot - group of nodes not to replicated + \param theShape - shape to detect affected elements (element which geometric center + located on or inside shape). + The replicated nodes should be associated to affected elements. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNodesInRegion(), DoubleNodeGroupsInRegion() +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemGroupInRegion(SMESH::SMESH_GroupBase_ptr theElems, + SMESH::SMESH_GroupBase_ptr theNodesNot, + GEOM::GEOM_Object_ptr theShape ) + +{ + if ( CORBA::is_nil( theElems ) && theElems->GetType() == SMESH::NODE ) + return false; + + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + + SMESHDS_Mesh* aMeshDS = GetMeshDS(); + TIDSortedElemSet anElems, aNodes, anAffected; + idSourceToSet( theElems, aMeshDS, anElems, SMDSAbs_All ); + idSourceToSet( theNodesNot, aMeshDS, aNodes, SMDSAbs_Node ); + + TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( theShape ); + bool aResult = aMeshEditor.DoubleNodesInRegion( anElems, aNodes, aShape ); + + storeResult( aMeshEditor) ; + + if ( aResult ) + myMesh->SetIsModified( true ); + + // Update Python script + TPythonDump() << "isDone = " << this << ".DoubleNodeElemGroupInRegion( " << theElems << ", " + << theNodesNot << ", " << theShape << " )"; + return aResult; +} + +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + This method provided for convenience works as DoubleNodes() described above. + \param theElems - list of groups of elements (edges or faces) to be replicated + \param theNodesNot - list of groups of nodes not to replicated + \param theAffectedElems - group of elements to which the replicated nodes + should be associated to. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNodeGroup(), DoubleNodes() +*/ +//================================================================================ + +static void listOfGroupToSet(const SMESH::ListOfGroups& theGrpList, + SMESHDS_Mesh* theMeshDS, + TIDSortedElemSet& theElemSet, + const bool theIsNodeGrp) +{ + for ( int i = 0, n = theGrpList.length(); i < n; i++ ) + { + SMESH::SMESH_GroupBase_var aGrp = theGrpList[ i ]; + if ( !CORBA::is_nil( aGrp ) && (theIsNodeGrp ? aGrp->GetType() == SMESH::NODE + : aGrp->GetType() != SMESH::NODE ) ) + { + SMESH::long_array_var anIDs = aGrp->GetIDs(); + arrayToSet( anIDs, theMeshDS, theElemSet, theIsNodeGrp ? SMDSAbs_Node : SMDSAbs_All ); + } } +} + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemGroups(const SMESH::ListOfGroups& theElems, + const SMESH::ListOfGroups& theNodesNot, + const SMESH::ListOfGroups& theAffectedElems) +{ + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + + SMESHDS_Mesh* aMeshDS = GetMeshDS(); + TIDSortedElemSet anElems, aNodes, anAffected; + listOfGroupToSet(theElems, aMeshDS, anElems, false ); + listOfGroupToSet(theNodesNot, aMeshDS, aNodes, true ); + listOfGroupToSet(theAffectedElems, aMeshDS, anAffected, false ); + + bool aResult = aMeshEditor.DoubleNodes( anElems, aNodes, anAffected ); + + storeResult( aMeshEditor) ; + + if ( aResult ) + myMesh->SetIsModified( true ); + + // Update Python script + TPythonDump() << "isDone = " << this << ".DoubleNodeElemGroups( " << &theElems << ", " + << &theNodesNot << ", " << &theAffectedElems << " )"; + return aResult; +} + +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + This method provided for convenience works as DoubleNodes() described above. + \param theElems - list of groups of elements (edges or faces) to be replicated + \param theNodesNot - list of groups of nodes not to replicated + \param theShape - shape to detect affected elements (element which geometric center + located on or inside shape). + The replicated nodes should be associated to affected elements. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNodeGroupInRegion(), DoubleNodesInRegion() +*/ +//================================================================================ + +CORBA::Boolean +SMESH_MeshEditor_i::DoubleNodeElemGroupsInRegion(const SMESH::ListOfGroups& theElems, + const SMESH::ListOfGroups& theNodesNot, + GEOM::GEOM_Object_ptr theShape ) +{ + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + + SMESHDS_Mesh* aMeshDS = GetMeshDS(); + TIDSortedElemSet anElems, aNodes; + listOfGroupToSet(theElems, aMeshDS, anElems,false ); + listOfGroupToSet(theNodesNot, aMeshDS, aNodes, true ); + + TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( theShape ); + bool aResult = aMeshEditor.DoubleNodesInRegion( anElems, aNodes, aShape ); + + storeResult( aMeshEditor) ; + + if ( aResult ) + myMesh->SetIsModified( true ); + // Update Python script - TCollection_AsciiString str ("error = mesh_editor.SewSideElements( "); - SMESH_Gen_i::AddArray( str, IDsOfSide1Elements ) += ", "; - SMESH_Gen_i::AddArray( str, IDsOfSide2Elements ) += ", "; - str += TCollection_AsciiString( (int) NodeID1OfSide1ToMerge ) + ", "; - str += TCollection_AsciiString( (int) NodeID1OfSide2ToMerge ) + ", "; - str += TCollection_AsciiString( (int) NodeID2OfSide1ToMerge ) + ", "; - str += TCollection_AsciiString( (int) NodeID2OfSide2ToMerge ) + ")"; - SMESH_Gen_i::AddToCurrentPyScript( str ); - - ::SMESH_MeshEditor anEditor( _myMesh ); - return convError( anEditor.SewSideElements (aSide1Elems, aSide2Elems, - aFirstNode1ToMerge, - aFirstNode2ToMerge, - aSecondNode1ToMerge, - aSecondNode2ToMerge)); + TPythonDump() << "isDone = " << this << ".DoubleNodeElemGroupsInRegion( " << &theElems << ", " + << &theNodesNot << ", " << theShape << " )"; + return aResult; +} + +//================================================================================ +/*! + \brief Generated skin mesh (containing 2D cells) from 3D mesh + The created 2D mesh elements based on nodes of free faces of boundary volumes + \return TRUE if operation has been completed successfully, FALSE otherwise +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::Make2DMeshFrom3D() +{ + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + bool aResult = aMeshEditor.Make2DMeshFrom3D(); + storeResult( aMeshEditor) ; + + TPythonDump() << "isDone = " << this << ".Make2DMeshFrom3D()"; + return aResult; +} + +//================================================================================ +/*! + * \brief Creates missing boundary elements + * \param elements - elements whose boundary is to be checked + * \param dimension - defines type of boundary elements to create + * \param groupName - a name of group to store created boundary elements in, + * "" means not to create the group + * \param meshName - a name of new mesh to store created boundary elements in, + * "" means not to create the new mesh + * \param toCopyElements - if true, the checked elements will be copied into the new mesh + * \param toCopyExistingBondary - if true, not only new but also pre-existing + * boundary elements will be copied into the new mesh + * \param group - returns the create group, if any + * \retval SMESH::SMESH_Mesh - the mesh where elements were added to + */ +//================================================================================ + +SMESH::SMESH_Mesh_ptr +SMESH_MeshEditor_i::MakeBoundaryMesh(SMESH::SMESH_IDSource_ptr elements, + SMESH::Bnd_Dimension dimension, + const char* groupName, + const char* meshName, + CORBA::Boolean toCopyElements, + CORBA::Boolean toCopyMissingBondary, + SMESH::SMESH_Group_out group) +{ + + return SMESH::SMESH_Mesh::_duplicate( myMesh_i->_this() ); }