1 // Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // File : SMESH_MeshEditor_i.cxx
23 // Author : Nicolas REJNERI
30 // A macro used in SMESH_TryCatch.hxx,
31 // it re-raises a CORBA SALOME exception thrown by SMESH_MeshEditor_i and caught by SMESH_CATCH
32 #define SMY_OWN_CATCH \
33 catch ( SALOME::SALOME_Exception & e ) { throw e; }
35 #include "SMESH_MeshEditor_i.hxx"
37 #include "SMDS_EdgePosition.hxx"
38 #include "SMDS_ElemIterator.hxx"
39 #include "SMDS_FacePosition.hxx"
40 #include "SMDS_IteratorOnIterators.hxx"
41 #include "SMDS_LinearEdge.hxx"
42 #include "SMDS_Mesh0DElement.hxx"
43 #include "SMDS_MeshFace.hxx"
44 #include "SMDS_MeshVolume.hxx"
45 #include "SMDS_PolyhedralVolumeOfNodes.hxx"
46 #include "SMDS_SetIterator.hxx"
47 #include "SMDS_VolumeTool.hxx"
48 #include "SMESHDS_Group.hxx"
49 #include "SMESHDS_GroupOnGeom.hxx"
50 #include "SMESH_ControlsDef.hxx"
51 #include "SMESH_Filter_i.hxx"
52 #include "SMESH_Gen_i.hxx"
53 #include "SMESH_Group.hxx"
54 #include "SMESH_Group_i.hxx"
55 #include "SMESH_MeshAlgos.hxx"
56 #include "SMESH_MeshPartDS.hxx"
57 #include "SMESH_MesherHelper.hxx"
58 #include "SMESH_PythonDump.hxx"
59 #include "SMESH_subMeshEventListener.hxx"
60 #include "SMESH_subMesh_i.hxx"
62 #include <utilities.h>
63 #include <Utils_ExceptHandlers.hxx>
64 #include <Utils_CorbaException.hxx>
65 #include <SALOMEDS_wrap.hxx>
66 #include <SALOME_GenericObj_i.hh>
67 #include <Basics_OCCTVersion.hxx>
69 #include <BRepAdaptor_Surface.hxx>
70 #include <BRep_Tool.hxx>
71 #include <TopExp_Explorer.hxx>
73 #include <TopoDS_Edge.hxx>
74 #include <TopoDS_Face.hxx>
79 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
83 #include <Standard_Failure.hxx>
86 #include <Standard_ErrorHandler.hxx>
92 #include "SMESH_TryCatch.hxx" // include after OCCT headers!
94 #define cast2Node(elem) static_cast<const SMDS_MeshNode*>( elem )
97 using SMESH::TPythonDump;
100 namespace MeshEditor_I {
102 //=============================================================================
104 * \brief Mesh to apply modifications for preview purposes
106 //=============================================================================
108 struct TPreviewMesh: public SMESH_Mesh
110 SMDSAbs_ElementType myPreviewType; // type to show
112 TPreviewMesh(SMDSAbs_ElementType previewElements = SMDSAbs_All) {
113 _isShapeToMesh = (_id =_studyId = 0);
114 _myMeshDS = new SMESHDS_Mesh( _id, true );
115 myPreviewType = previewElements;
118 virtual ~TPreviewMesh() { delete _myMeshDS; _myMeshDS = 0; }
119 //!< Copy a set of elements
120 void Copy(const TIDSortedElemSet & theElements,
121 TIDSortedElemSet& theCopyElements,
122 SMDSAbs_ElementType theSelectType = SMDSAbs_All,
123 SMDSAbs_ElementType theAvoidType = SMDSAbs_All)
125 // loop on theIDsOfElements
126 TIDSortedElemSet::const_iterator eIt = theElements.begin();
127 for ( ; eIt != theElements.end(); ++eIt )
129 const SMDS_MeshElement* anElem = *eIt;
130 if ( !anElem ) continue;
131 SMDSAbs_ElementType type = anElem->GetType();
132 if ( type == theAvoidType ||
133 ( theSelectType != SMDSAbs_All && type != theSelectType ))
135 const SMDS_MeshElement* anElemCopy;
136 if ( type == SMDSAbs_Node)
137 anElemCopy = Copy( cast2Node(anElem) );
139 anElemCopy = Copy( anElem );
141 theCopyElements.insert( theCopyElements.end(), anElemCopy );
145 SMDS_MeshElement* Copy( const SMDS_MeshElement* anElem )
147 // copy element nodes
148 int anElemNbNodes = anElem->NbNodes();
149 vector< int > anElemNodesID( anElemNbNodes ) ;
150 SMDS_ElemIteratorPtr itElemNodes = anElem->nodesIterator();
151 for ( int i = 0; itElemNodes->more(); i++)
153 const SMDS_MeshNode* anElemNode = cast2Node( itElemNodes->next() );
155 anElemNodesID[i] = anElemNode->GetID();
158 // creates a corresponding element on copied nodes
159 SMDS_MeshElement* anElemCopy = 0;
160 if ( anElem->IsPoly() && anElem->GetType() == SMDSAbs_Volume )
162 const SMDS_VtkVolume* ph =
163 dynamic_cast<const SMDS_VtkVolume*> (anElem);
165 anElemCopy = _myMeshDS->AddPolyhedralVolumeWithID
166 (anElemNodesID, ph->GetQuantities(),anElem->GetID());
169 anElemCopy = ::SMESH_MeshEditor(this).AddElement( anElemNodesID,
176 SMDS_MeshNode* Copy( const SMDS_MeshNode* anElemNode )
178 return _myMeshDS->AddNodeWithID(anElemNode->X(), anElemNode->Y(), anElemNode->Z(),
179 anElemNode->GetID());
183 GetMeshDS()->ClearMesh();
185 };// struct TPreviewMesh
187 static SMESH_NodeSearcher * theNodeSearcher = 0;
188 static SMESH_ElementSearcher * theElementSearcher = 0;
190 //=============================================================================
192 * \brief Deleter of theNodeSearcher at any compute event occured
194 //=============================================================================
196 struct TSearchersDeleter : public SMESH_subMeshEventListener
199 string myMeshPartIOR;
201 TSearchersDeleter(): SMESH_subMeshEventListener( false, // won't be deleted by submesh
202 "SMESH_MeshEditor_i::TSearchersDeleter"),
204 //!< Delete theNodeSearcher
207 if ( theNodeSearcher ) delete theNodeSearcher; theNodeSearcher = 0;
208 if ( theElementSearcher ) delete theElementSearcher; theElementSearcher = 0;
210 typedef map < int, SMESH_subMesh * > TDependsOnMap;
211 //!< The meshod called by submesh: do my main job
212 void ProcessEvent(const int, const int eventType, SMESH_subMesh* sm,
213 SMESH_subMeshEventListenerData*,const SMESH_Hypothesis*)
215 if ( eventType == SMESH_subMesh::COMPUTE_EVENT ) {
217 Unset( sm->GetFather() );
220 //!< set self on all submeshes and delete theNodeSearcher if other mesh is set
221 void Set(SMESH_Mesh* mesh, const string& meshPartIOR = string())
223 if ( myMesh != mesh || myMeshPartIOR != meshPartIOR)
230 myMeshPartIOR = meshPartIOR;
231 SMESH_subMesh* sm = mesh->GetSubMesh( mesh->GetShapeToMesh() );
232 SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator( /*includeSelf=*/true );
233 while ( smIt->more() )
236 sm->SetEventListener( this, 0, sm );
240 //!< delete self from all submeshes
241 void Unset(SMESH_Mesh* mesh)
243 if ( SMESH_subMesh* sm = mesh->GetSubMeshContaining(1) ) {
244 SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator( /*includeSelf=*/true );
245 while ( smIt->more() )
246 smIt->next()->DeleteEventListener( this );
251 } theSearchersDeleter;
253 TCollection_AsciiString mirrorTypeName( SMESH::SMESH_MeshEditor::MirrorType theMirrorType )
255 TCollection_AsciiString typeStr;
256 switch ( theMirrorType ) {
257 case SMESH::SMESH_MeshEditor::POINT:
258 typeStr = "SMESH.SMESH_MeshEditor.POINT";
260 case SMESH::SMESH_MeshEditor::AXIS:
261 typeStr = "SMESH.SMESH_MeshEditor.AXIS";
264 typeStr = "SMESH.SMESH_MeshEditor.PLANE";
268 //================================================================================
270 * \brief function for conversion of long_array to TIDSortedElemSet
271 * \param IDs - array of IDs
272 * \param aMesh - mesh
273 * \param aMap - collection to fill
274 * \param aType - element type
276 //================================================================================
278 void arrayToSet(const SMESH::long_array & IDs,
279 const SMESHDS_Mesh* aMesh,
280 TIDSortedElemSet& aMap,
281 const SMDSAbs_ElementType aType = SMDSAbs_All,
282 SMDS_MeshElement::Filter* aFilter = NULL)
284 SMDS_MeshElement::NonNullFilter filter1;
285 SMDS_MeshElement::TypeFilter filter2( aType );
287 if ( aFilter == NULL )
288 aFilter = ( aType == SMDSAbs_All ) ? (SMDS_MeshElement::Filter*) &filter1 : (SMDS_MeshElement::Filter*) &filter2;
290 SMDS_MeshElement::Filter & filter = *aFilter;
292 if ( aType == SMDSAbs_Node )
293 for (int i=0; i<IDs.length(); i++) {
294 const SMDS_MeshElement * elem = aMesh->FindNode( IDs[i] );
296 aMap.insert( aMap.end(), elem );
299 for (int i=0; i<IDs.length(); i++) {
300 const SMDS_MeshElement * elem = aMesh->FindElement( IDs[i] );
302 aMap.insert( aMap.end(), elem );
305 //================================================================================
307 * \brief Retrieve elements of given type from SMESH_IDSource
309 //================================================================================
311 enum IDSource_Error { IDSource_OK, IDSource_INVALID, IDSource_EMPTY };
313 bool idSourceToSet(SMESH::SMESH_IDSource_ptr theIDSource,
314 const SMESHDS_Mesh* theMeshDS,
315 TIDSortedElemSet& theElemSet,
316 const SMDSAbs_ElementType theType,
317 const bool emptyIfIsMesh = false,
318 IDSource_Error* error = 0)
321 if ( error ) *error = IDSource_OK;
323 if ( CORBA::is_nil( theIDSource ) )
325 if ( error ) *error = IDSource_INVALID;
328 if ( emptyIfIsMesh && SMESH::DownCast<SMESH_Mesh_i*>( theIDSource ))
330 if ( error && theMeshDS->GetMeshInfo().NbElements( theType ) == 0 )
331 *error = IDSource_EMPTY;
334 SMESH::long_array_var anIDs = theIDSource->GetIDs();
335 if ( anIDs->length() == 0 )
337 if ( error ) *error = IDSource_EMPTY;
340 SMESH::array_of_ElementType_var types = theIDSource->GetTypes();
341 if ( types->length() == 1 && types[0] == SMESH::NODE ) // group of nodes
343 if ( theType == SMDSAbs_All || theType == SMDSAbs_Node )
345 arrayToSet( anIDs, theMeshDS, theElemSet, SMDSAbs_Node );
349 if ( error ) *error = IDSource_INVALID;
355 arrayToSet( anIDs, theMeshDS, theElemSet, theType);
356 if ( bool(anIDs->length()) != bool(theElemSet.size()))
358 if ( error ) *error = IDSource_INVALID;
364 //================================================================================
366 * \brief Retrieve nodes from SMESH_IDSource
368 //================================================================================
370 void idSourceToNodeSet(SMESH::SMESH_IDSource_ptr theObject,
371 const SMESHDS_Mesh* theMeshDS,
372 TIDSortedNodeSet& theNodeSet)
375 if ( CORBA::is_nil( theObject ) )
377 SMESH::array_of_ElementType_var types = theObject->GetTypes();
378 SMESH::long_array_var aElementsId = theObject->GetIDs();
379 if ( types->length() == 1 && types[0] == SMESH::NODE)
381 for(int i = 0; i < aElementsId->length(); i++)
382 if ( const SMDS_MeshNode * n = theMeshDS->FindNode( aElementsId[i] ))
383 theNodeSet.insert( theNodeSet.end(), n);
385 else if ( SMESH::DownCast<SMESH_Mesh_i*>( theObject ))
387 SMDS_NodeIteratorPtr nIt = theMeshDS->nodesIterator();
388 while ( nIt->more( ))
389 if( const SMDS_MeshElement * elem = nIt->next() )
390 theNodeSet.insert( elem->begin_nodes(), elem->end_nodes());
394 for(int i = 0; i < aElementsId->length(); i++)
395 if( const SMDS_MeshElement * elem = theMeshDS->FindElement( aElementsId[i] ))
396 theNodeSet.insert( elem->begin_nodes(), elem->end_nodes());
400 //================================================================================
402 * \brief Returns elements connected to the given elements
404 //================================================================================
406 void getElementsAround(const TIDSortedElemSet& theElements,
407 const SMESHDS_Mesh* theMeshDS,
408 TIDSortedElemSet& theElementsAround)
410 if ( theElements.empty() ) return;
412 SMDSAbs_ElementType elemType = (*theElements.begin())->GetType();
413 bool sameElemType = ( elemType == (*theElements.rbegin())->GetType() );
415 theMeshDS->GetMeshInfo().NbElements( elemType ) == theElements.size() )
416 return; // all the elements are in theElements
419 elemType = SMDSAbs_All;
421 vector<bool> isNodeChecked( theMeshDS->NbNodes(), false );
423 TIDSortedElemSet::const_iterator elemIt = theElements.begin();
424 for ( ; elemIt != theElements.end(); ++elemIt )
426 const SMDS_MeshElement* e = *elemIt;
427 int i = e->NbCornerNodes();
430 const SMDS_MeshNode* n = e->GetNode( i );
431 if ( !isNodeChecked[ n->GetID() ])
433 isNodeChecked[ n->GetID() ] = true;
434 SMDS_ElemIteratorPtr invIt = n->GetInverseElementIterator(elemType);
435 while ( invIt->more() )
437 const SMDS_MeshElement* elemAround = invIt->next();
438 if ( !theElements.count( elemAround ))
439 theElementsAround.insert( elemAround );
446 //================================================================================
448 * \brief Return a string used to detect change of mesh part on which theElementSearcher
449 * is going to be used
451 //================================================================================
453 string getPartIOR( SMESH::SMESH_IDSource_ptr theMeshPart, SMESH::ElementType type)
455 string partIOR = SMESH_Gen_i::GetORB()->object_to_string( theMeshPart );
456 if ( SMESH_Group_i* group_i = SMESH::DownCast<SMESH_Group_i*>( theMeshPart ))
457 // take into account passible group modification
458 partIOR += SMESH_Comment( ((SMESHDS_Group*)group_i->GetGroupDS())->SMDSGroup().Tic() );
459 partIOR += SMESH_Comment( type );
463 } // namespace MeshEditor_I
465 using namespace MeshEditor_I;
467 //=============================================================================
471 //=============================================================================
473 SMESH_MeshEditor_i::SMESH_MeshEditor_i(SMESH_Mesh_i* theMesh, bool isPreview):
475 myMesh( &theMesh->GetImpl() ),
477 myIsPreviewMode ( isPreview ),
483 //================================================================================
487 //================================================================================
489 SMESH_MeshEditor_i::~SMESH_MeshEditor_i()
491 PortableServer::POA_var poa = SMESH_Gen_i::GetPOA();
492 PortableServer::ObjectId_var anObjectId = poa->servant_to_id(this);
493 poa->deactivate_object(anObjectId.in());
495 //deleteAuxIDSources();
496 delete myPreviewMesh; myPreviewMesh = 0;
497 delete myPreviewEditor; myPreviewEditor = 0;
500 //================================================================================
502 * \brief Clear members
504 //================================================================================
506 void SMESH_MeshEditor_i::initData(bool deleteSearchers)
508 if ( myIsPreviewMode ) {
509 if ( myPreviewMesh ) myPreviewMesh->RemoveAll();
512 if ( deleteSearchers )
513 TSearchersDeleter::Delete();
515 getEditor().GetError().reset();
516 getEditor().CrearLastCreated();
519 //================================================================================
521 * \brief Increment mesh modif time and optionally record that the performed
522 * modification may influence futher mesh re-compute.
523 * \param [in] isReComputeSafe - true if the modification does not infulence
524 * futher mesh re-compute
526 //================================================================================
528 void SMESH_MeshEditor_i::declareMeshModified( bool isReComputeSafe )
530 myMesh->GetMeshDS()->Modified();
531 if ( !isReComputeSafe )
532 myMesh->SetIsModified( true );
535 //================================================================================
537 * \brief Return either myEditor or myPreviewEditor depending on myIsPreviewMode.
538 * WARNING: in preview mode call getPreviewMesh() before getEditor()!
540 //================================================================================
542 ::SMESH_MeshEditor& SMESH_MeshEditor_i::getEditor()
544 if ( myIsPreviewMode && !myPreviewEditor ) {
545 if ( !myPreviewMesh ) getPreviewMesh();
546 myPreviewEditor = new ::SMESH_MeshEditor( myPreviewMesh );
548 return myIsPreviewMode ? *myPreviewEditor : myEditor;
551 //================================================================================
553 * \brief Initialize and return myPreviewMesh
554 * \param previewElements - type of elements to show in preview
556 * WARNING: call it once par a method!
558 //================================================================================
560 TPreviewMesh * SMESH_MeshEditor_i::getPreviewMesh(SMDSAbs_ElementType previewElements)
562 if ( !myPreviewMesh || myPreviewMesh->myPreviewType != previewElements )
564 delete myPreviewEditor;
566 delete myPreviewMesh;
567 myPreviewMesh = new TPreviewMesh( previewElements );
569 myPreviewMesh->Clear();
570 return myPreviewMesh;
573 //================================================================================
575 * Return data of mesh edition preview
577 //================================================================================
579 SMESH::MeshPreviewStruct* SMESH_MeshEditor_i::GetPreviewData()
580 throw (SALOME::SALOME_Exception)
583 const bool hasBadElems = ( getEditor().GetError() && getEditor().GetError()->HasBadElems() );
585 if ( myIsPreviewMode || hasBadElems ) { // --- MeshPreviewStruct filling ---
587 list<int> aNodesConnectivity;
588 typedef map<int, int> TNodesMap;
591 SMESHDS_Mesh* aMeshDS;
592 std::auto_ptr< SMESH_MeshPartDS > aMeshPartDS;
594 aMeshPartDS.reset( new SMESH_MeshPartDS( getEditor().GetError()->myBadElements ));
595 aMeshDS = aMeshPartDS.get();
598 aMeshDS = getEditor().GetMeshDS();
600 myPreviewData = new SMESH::MeshPreviewStruct();
601 myPreviewData->nodesXYZ.length(aMeshDS->NbNodes());
604 SMDSAbs_ElementType previewType = SMDSAbs_All;
606 if (TPreviewMesh * aPreviewMesh = dynamic_cast< TPreviewMesh* >( getEditor().GetMesh() )) {
607 previewType = aPreviewMesh->myPreviewType;
608 switch ( previewType ) {
609 case SMDSAbs_Edge : break;
610 case SMDSAbs_Face : break;
611 case SMDSAbs_Volume: break;
613 if ( aMeshDS->GetMeshInfo().NbElements() == 0 ) previewType = SMDSAbs_Node;
617 myPreviewData->elementTypes.length( aMeshDS->GetMeshInfo().NbElements( previewType ));
619 SMDS_ElemIteratorPtr itMeshElems = aMeshDS->elementsIterator(previewType);
621 while ( itMeshElems->more() ) {
622 const SMDS_MeshElement* aMeshElem = itMeshElems->next();
623 SMDS_NodeIteratorPtr itElemNodes = aMeshElem->nodeIterator();
624 while ( itElemNodes->more() ) {
625 const SMDS_MeshNode* aMeshNode = itElemNodes->next();
626 int aNodeID = aMeshNode->GetID();
627 TNodesMap::iterator anIter = nodesMap.find(aNodeID);
628 if ( anIter == nodesMap.end() ) {
629 // filling the nodes coordinates
630 myPreviewData->nodesXYZ[j].x = aMeshNode->X();
631 myPreviewData->nodesXYZ[j].y = aMeshNode->Y();
632 myPreviewData->nodesXYZ[j].z = aMeshNode->Z();
633 anIter = nodesMap.insert( make_pair(aNodeID, j) ).first;
636 aNodesConnectivity.push_back(anIter->second);
639 // filling the elements types
640 SMDSAbs_ElementType aType = aMeshElem->GetType();
641 bool isPoly = aMeshElem->IsPoly();
642 myPreviewData->elementTypes[i].SMDS_ElementType = (SMESH::ElementType) aType;
643 myPreviewData->elementTypes[i].isPoly = isPoly;
644 myPreviewData->elementTypes[i].nbNodesInElement = aMeshElem->NbNodes();
647 myPreviewData->nodesXYZ.length( j );
649 // filling the elements connectivities
650 list<int>::iterator aConnIter = aNodesConnectivity.begin();
651 myPreviewData->elementConnectivities.length(aNodesConnectivity.size());
652 for( int i = 0; aConnIter != aNodesConnectivity.end(); aConnIter++, i++ )
653 myPreviewData->elementConnectivities[i] = *aConnIter;
655 return myPreviewData._retn();
657 SMESH_CATCH( SMESH::throwCorbaException );
661 //================================================================================
663 * \brief Returns list of it's IDs of created nodes
664 * \retval SMESH::long_array* - list of node ID
666 //================================================================================
668 SMESH::long_array* SMESH_MeshEditor_i::GetLastCreatedNodes()
669 throw (SALOME::SALOME_Exception)
672 SMESH::long_array_var myLastCreatedNodes = new SMESH::long_array();
674 const SMESH_SequenceOfElemPtr& aSeq = getEditor().GetLastCreatedNodes();
675 myLastCreatedNodes->length( aSeq.Length() );
676 for (int i = 1; i <= aSeq.Length(); i++)
677 myLastCreatedNodes[i-1] = aSeq.Value(i)->GetID();
679 return myLastCreatedNodes._retn();
680 SMESH_CATCH( SMESH::throwCorbaException );
684 //================================================================================
686 * \brief Returns list of it's IDs of created elements
687 * \retval SMESH::long_array* - list of elements' ID
689 //================================================================================
691 SMESH::long_array* SMESH_MeshEditor_i::GetLastCreatedElems()
692 throw (SALOME::SALOME_Exception)
695 SMESH::long_array_var myLastCreatedElems = new SMESH::long_array();
697 const SMESH_SequenceOfElemPtr& aSeq = getEditor().GetLastCreatedElems();
698 myLastCreatedElems->length( aSeq.Length() );
699 for ( int i = 1; i <= aSeq.Length(); i++ )
700 myLastCreatedElems[i-1] = aSeq.Value(i)->GetID();
702 return myLastCreatedElems._retn();
703 SMESH_CATCH( SMESH::throwCorbaException );
707 //=======================================================================
708 //function : ClearLastCreated
709 //purpose : Clears sequences of last created elements and nodes
710 //=======================================================================
712 void SMESH_MeshEditor_i::ClearLastCreated() throw (SALOME::SALOME_Exception)
715 getEditor().CrearLastCreated();
716 SMESH_CATCH( SMESH::throwCorbaException );
719 //=======================================================================
721 * Returns description of an error/warning occured during the last operation
722 * WARNING: ComputeError.code >= 100 and no corresponding enum in IDL API
724 //=======================================================================
726 SMESH::ComputeError* SMESH_MeshEditor_i::GetLastError()
727 throw (SALOME::SALOME_Exception)
730 SMESH::ComputeError_var errOut = new SMESH::ComputeError;
731 SMESH_ComputeErrorPtr& errIn = getEditor().GetError();
732 if ( errIn && !errIn->IsOK() )
734 errOut->code = -( errIn->myName < 0 ? errIn->myName + 1: errIn->myName ); // -1 -> 0
735 errOut->comment = errIn->myComment.c_str();
736 errOut->subShapeID = -1;
737 errOut->hasBadMesh = !errIn->myBadElements.empty();
742 errOut->subShapeID = -1;
743 errOut->hasBadMesh = false;
746 return errOut._retn();
747 SMESH_CATCH( SMESH::throwCorbaException );
751 //=======================================================================
752 //function : MakeIDSource
753 //purpose : Wrap a sequence of ids in a SMESH_IDSource.
754 // Call UnRegister() as you fininsh using it!!
755 //=======================================================================
757 struct SMESH_MeshEditor_i::_IDSource : public virtual POA_SMESH::SMESH_IDSource,
758 public virtual SALOME::GenericObj_i
760 SMESH::long_array _ids;
761 SMESH::ElementType _type;
762 SMESH::SMESH_Mesh_ptr _mesh;
763 SMESH::long_array* GetIDs() { return new SMESH::long_array( _ids ); }
764 SMESH::long_array* GetMeshInfo() { return 0; }
765 SMESH::long_array* GetNbElementsByType()
767 SMESH::long_array_var aRes = new SMESH::long_array();
768 aRes->length(SMESH::NB_ELEMENT_TYPES);
769 for (int i = 0; i < SMESH::NB_ELEMENT_TYPES; i++)
770 aRes[ i ] = ( i == _type ) ? _ids.length() : 0;
773 SMESH::SMESH_Mesh_ptr GetMesh() { return SMESH::SMESH_Mesh::_duplicate( _mesh ); }
774 bool IsMeshInfoCorrect() { return true; }
775 SMESH::array_of_ElementType* GetTypes()
777 SMESH::array_of_ElementType_var types = new SMESH::array_of_ElementType;
778 if ( _ids.length() > 0 ) {
782 return types._retn();
784 SALOMEDS::TMPFile* GetVtkUgStream()
786 SALOMEDS::TMPFile_var SeqFile;
787 return SeqFile._retn();
791 SMESH::SMESH_IDSource_ptr SMESH_MeshEditor_i::MakeIDSource(const SMESH::long_array& ids,
792 SMESH::ElementType type)
794 _IDSource* idSrc = new _IDSource;
795 idSrc->_mesh = myMesh_i->_this();
798 if ( type == SMESH::ALL && ids.length() > 0 )
799 idSrc->_type = myMesh_i->GetElementType( ids[0], true );
801 SMESH::SMESH_IDSource_var anIDSourceVar = idSrc->_this();
803 return anIDSourceVar._retn();
806 bool SMESH_MeshEditor_i::IsTemporaryIDSource( SMESH::SMESH_IDSource_ptr& idSource )
808 return SMESH::DownCast<SMESH_MeshEditor_i::_IDSource*>( idSource );
811 CORBA::Long* SMESH_MeshEditor_i::GetTemporaryIDs( SMESH::SMESH_IDSource_ptr& idSource,
814 if ( _IDSource* tmpIdSource = SMESH::DownCast<SMESH_MeshEditor_i::_IDSource*>( idSource ))
816 nbIds = (int) tmpIdSource->_ids.length();
817 return & tmpIdSource->_ids[0];
823 // void SMESH_MeshEditor_i::deleteAuxIDSources()
825 // std::list< _IDSource* >::iterator idSrcIt = myAuxIDSources.begin();
826 // for ( ; idSrcIt != myAuxIDSources.end(); ++idSrcIt )
828 // myAuxIDSources.clear();
831 //=============================================================================
835 //=============================================================================
838 SMESH_MeshEditor_i::RemoveElements(const SMESH::long_array & IDsOfElements)
839 throw (SALOME::SALOME_Exception)
846 for (int i = 0; i < IDsOfElements.length(); i++)
847 IdList.push_back( IDsOfElements[i] );
849 // Update Python script
850 TPythonDump() << "isDone = " << this << ".RemoveElements( " << IDsOfElements << " )";
853 bool ret = getEditor().Remove( IdList, false );
855 declareMeshModified( /*isReComputeSafe=*/ IDsOfElements.length() == 0 ); // issue 0020693
858 SMESH_CATCH( SMESH::throwCorbaException );
862 //=============================================================================
866 //=============================================================================
868 CORBA::Boolean SMESH_MeshEditor_i::RemoveNodes(const SMESH::long_array & IDsOfNodes)
869 throw (SALOME::SALOME_Exception)
875 for (int i = 0; i < IDsOfNodes.length(); i++)
876 IdList.push_back( IDsOfNodes[i] );
878 // Update Python script
879 TPythonDump() << "isDone = " << this << ".RemoveNodes( " << IDsOfNodes << " )";
881 bool ret = getEditor().Remove( IdList, true );
883 declareMeshModified( /*isReComputeSafe=*/ !ret ); // issue 0020693
886 SMESH_CATCH( SMESH::throwCorbaException );
890 //=============================================================================
894 //=============================================================================
896 CORBA::Long SMESH_MeshEditor_i::RemoveOrphanNodes()
897 throw (SALOME::SALOME_Exception)
902 // Update Python script
903 TPythonDump() << "nbRemoved = " << this << ".RemoveOrphanNodes()";
905 // Create filter to find all orphan nodes
906 SMESH::Controls::Filter::TIdSequence seq;
907 SMESH::Controls::PredicatePtr predicate( new SMESH::Controls::FreeNodes() );
908 SMESH::Controls::Filter::GetElementsId( getMeshDS(), predicate, seq );
910 // remove orphan nodes (if there are any)
912 for ( int i = 0; i < seq.size(); i++ )
913 IdList.push_back( seq[i] );
915 int nbNodesBefore = myMesh->NbNodes();
916 getEditor().Remove( IdList, true );
917 int nbNodesAfter = myMesh->NbNodes();
919 declareMeshModified( /*isReComputeSafe=*/ IdList.size() == 0 ); // issue 0020693
920 return nbNodesBefore - nbNodesAfter;
922 SMESH_CATCH( SMESH::throwCorbaException );
926 //=============================================================================
930 //=============================================================================
932 CORBA::Long SMESH_MeshEditor_i::AddNode(CORBA::Double x,CORBA::Double y, CORBA::Double z)
933 throw (SALOME::SALOME_Exception)
938 const SMDS_MeshNode* N = getMeshDS()->AddNode(x, y, z);
940 // Update Python script
941 TPythonDump() << "nodeID = " << this << ".AddNode( "
942 << TVar( x ) << ", " << TVar( y ) << ", " << TVar( z )<< " )";
944 declareMeshModified( /*isReComputeSafe=*/false );
947 SMESH_CATCH( SMESH::throwCorbaException );
951 //=============================================================================
953 * Create 0D element on the given node.
955 //=============================================================================
957 CORBA::Long SMESH_MeshEditor_i::Add0DElement(CORBA::Long IDOfNode)
958 throw (SALOME::SALOME_Exception)
963 const SMDS_MeshNode* aNode = getMeshDS()->FindNode(IDOfNode);
964 SMDS_MeshElement* elem = getMeshDS()->Add0DElement(aNode);
966 // Update Python script
967 TPythonDump() << "elem0d = " << this << ".Add0DElement( " << IDOfNode <<" )";
969 declareMeshModified( /*isReComputeSafe=*/false );
971 return elem ? elem->GetID() : 0;
973 SMESH_CATCH( SMESH::throwCorbaException );
977 //=============================================================================
979 * Create a ball element on the given node.
981 //=============================================================================
983 CORBA::Long SMESH_MeshEditor_i::AddBall(CORBA::Long IDOfNode, CORBA::Double diameter)
984 throw (SALOME::SALOME_Exception)
989 if ( diameter < std::numeric_limits<double>::min() )
990 THROW_SALOME_CORBA_EXCEPTION("Invalid diameter", SALOME::BAD_PARAM);
992 const SMDS_MeshNode* aNode = getMeshDS()->FindNode(IDOfNode);
993 SMDS_MeshElement* elem = getMeshDS()->AddBall(aNode, diameter);
995 // Update Python script
996 TPythonDump() << "ballElem = "
997 << this << ".AddBall( " << IDOfNode << ", " << diameter <<" )";
999 declareMeshModified( /*isReComputeSafe=*/false );
1000 return elem ? elem->GetID() : 0;
1002 SMESH_CATCH( SMESH::throwCorbaException );
1006 //=============================================================================
1008 * Create an edge, either linear and quadratic (this is determed
1009 * by number of given nodes, two or three)
1011 //=============================================================================
1013 CORBA::Long SMESH_MeshEditor_i::AddEdge(const SMESH::long_array & IDsOfNodes)
1014 throw (SALOME::SALOME_Exception)
1019 int NbNodes = IDsOfNodes.length();
1020 SMDS_MeshElement* elem = 0;
1023 CORBA::Long index1 = IDsOfNodes[0];
1024 CORBA::Long index2 = IDsOfNodes[1];
1025 elem = getMeshDS()->AddEdge( getMeshDS()->FindNode(index1),
1026 getMeshDS()->FindNode(index2));
1028 // Update Python script
1029 TPythonDump() << "edge = " << this << ".AddEdge([ "
1030 << index1 << ", " << index2 <<" ])";
1033 CORBA::Long n1 = IDsOfNodes[0];
1034 CORBA::Long n2 = IDsOfNodes[1];
1035 CORBA::Long n12 = IDsOfNodes[2];
1036 elem = getMeshDS()->AddEdge( getMeshDS()->FindNode(n1),
1037 getMeshDS()->FindNode(n2),
1038 getMeshDS()->FindNode(n12));
1039 // Update Python script
1040 TPythonDump() << "edgeID = " << this << ".AddEdge([ "
1041 <<n1<<", "<<n2<<", "<<n12<<" ])";
1044 declareMeshModified( /*isReComputeSafe=*/false );
1045 return elem ? elem->GetID() : 0;
1047 SMESH_CATCH( SMESH::throwCorbaException );
1051 //=============================================================================
1055 //=============================================================================
1057 CORBA::Long SMESH_MeshEditor_i::AddFace(const SMESH::long_array & IDsOfNodes)
1058 throw (SALOME::SALOME_Exception)
1063 int NbNodes = IDsOfNodes.length();
1069 std::vector<const SMDS_MeshNode*> nodes (NbNodes);
1070 for (int i = 0; i < NbNodes; i++)
1071 nodes[i] = getMeshDS()->FindNode(IDsOfNodes[i]);
1073 SMDS_MeshElement* elem = 0;
1075 case 3: elem = getMeshDS()->AddFace(nodes[0], nodes[1], nodes[2]); break;
1076 case 4: elem = getMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3]); break;
1077 case 6: elem = getMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3],
1078 nodes[4], nodes[5]); break;
1079 case 7: elem = getMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3],
1080 nodes[4], nodes[5], nodes[6]); break;
1081 case 8: elem = getMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3],
1082 nodes[4], nodes[5], nodes[6], nodes[7]); break;
1083 case 9: elem = getMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3],
1084 nodes[4], nodes[5], nodes[6], nodes[7],
1086 default: elem = getMeshDS()->AddPolygonalFace(nodes);
1089 // Update Python script
1090 TPythonDump() << "faceID = " << this << ".AddFace( " << IDsOfNodes << " )";
1092 declareMeshModified( /*isReComputeSafe=*/false );
1094 return elem ? elem->GetID() : 0;
1096 SMESH_CATCH( SMESH::throwCorbaException );
1100 //=============================================================================
1104 //=============================================================================
1105 CORBA::Long SMESH_MeshEditor_i::AddPolygonalFace (const SMESH::long_array & IDsOfNodes)
1106 throw (SALOME::SALOME_Exception)
1111 int NbNodes = IDsOfNodes.length();
1112 std::vector<const SMDS_MeshNode*> nodes (NbNodes);
1113 for (int i = 0; i < NbNodes; i++)
1114 nodes[i] = getMeshDS()->FindNode(IDsOfNodes[i]);
1116 const SMDS_MeshElement* elem = getMeshDS()->AddPolygonalFace(nodes);
1118 // Update Python script
1119 TPythonDump() <<"faceID = "<<this<<".AddPolygonalFace( "<<IDsOfNodes<<" )";
1121 declareMeshModified( /*isReComputeSafe=*/false );
1122 return elem ? elem->GetID() : 0;
1124 SMESH_CATCH( SMESH::throwCorbaException );
1128 //=============================================================================
1130 * Create volume, either linear and quadratic (this is determed
1131 * by number of given nodes)
1133 //=============================================================================
1135 CORBA::Long SMESH_MeshEditor_i::AddVolume(const SMESH::long_array & IDsOfNodes)
1136 throw (SALOME::SALOME_Exception)
1141 int NbNodes = IDsOfNodes.length();
1142 vector< const SMDS_MeshNode*> n(NbNodes);
1143 for(int i=0;i<NbNodes;i++)
1144 n[i]= getMeshDS()->FindNode(IDsOfNodes[i]);
1146 SMDS_MeshElement* elem = 0;
1149 case 4 :elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3]); break;
1150 case 5 :elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4]); break;
1151 case 6 :elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5]); break;
1152 case 8 :elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7]); break;
1153 case 10:elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],
1154 n[6],n[7],n[8],n[9]);
1156 case 12:elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],
1157 n[6],n[7],n[8],n[9],n[10],n[11]);
1159 case 13:elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],
1160 n[7],n[8],n[9],n[10],n[11],n[12]);
1162 case 15:elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],
1163 n[9],n[10],n[11],n[12],n[13],n[14]);
1165 case 20:elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],
1166 n[8],n[9],n[10],n[11],n[12],n[13],n[14],
1167 n[15],n[16],n[17],n[18],n[19]);
1169 case 27:elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],
1170 n[8],n[9],n[10],n[11],n[12],n[13],n[14],
1171 n[15],n[16],n[17],n[18],n[19],
1172 n[20],n[21],n[22],n[23],n[24],n[25],n[26]);
1176 // Update Python script
1177 TPythonDump() << "volID = " << this << ".AddVolume( " << IDsOfNodes << " )";
1179 declareMeshModified( /*isReComputeSafe=*/false );
1180 return elem ? elem->GetID() : 0;
1182 SMESH_CATCH( SMESH::throwCorbaException );
1186 //=============================================================================
1188 * AddPolyhedralVolume
1190 //=============================================================================
1191 CORBA::Long SMESH_MeshEditor_i::AddPolyhedralVolume (const SMESH::long_array & IDsOfNodes,
1192 const SMESH::long_array & Quantities)
1193 throw (SALOME::SALOME_Exception)
1198 int NbNodes = IDsOfNodes.length();
1199 std::vector<const SMDS_MeshNode*> n (NbNodes);
1200 for (int i = 0; i < NbNodes; i++)
1202 const SMDS_MeshNode* aNode = getMeshDS()->FindNode(IDsOfNodes[i]);
1203 if (!aNode) return 0;
1207 int NbFaces = Quantities.length();
1208 std::vector<int> q (NbFaces);
1209 for (int j = 0; j < NbFaces; j++)
1210 q[j] = Quantities[j];
1212 const SMDS_MeshElement* elem = getMeshDS()->AddPolyhedralVolume(n, q);
1214 // Update Python script
1215 TPythonDump() << "volID = " << this << ".AddPolyhedralVolume( "
1216 << IDsOfNodes << ", " << Quantities << " )";
1218 declareMeshModified( /*isReComputeSafe=*/false );
1219 return elem ? elem->GetID() : 0;
1221 SMESH_CATCH( SMESH::throwCorbaException );
1225 //=============================================================================
1227 * AddPolyhedralVolumeByFaces
1229 //=============================================================================
1231 CORBA::Long SMESH_MeshEditor_i::AddPolyhedralVolumeByFaces (const SMESH::long_array & IdsOfFaces)
1232 throw (SALOME::SALOME_Exception)
1237 int NbFaces = IdsOfFaces.length();
1238 std::vector<const SMDS_MeshNode*> poly_nodes;
1239 std::vector<int> quantities (NbFaces);
1241 for (int i = 0; i < NbFaces; i++) {
1242 const SMDS_MeshElement* aFace = getMeshDS()->FindElement(IdsOfFaces[i]);
1243 quantities[i] = aFace->NbNodes();
1245 SMDS_ElemIteratorPtr It = aFace->nodesIterator();
1246 while (It->more()) {
1247 poly_nodes.push_back(static_cast<const SMDS_MeshNode *>(It->next()));
1251 const SMDS_MeshElement* elem = getMeshDS()->AddPolyhedralVolume(poly_nodes, quantities);
1253 // Update Python script
1254 TPythonDump() << "volID = " << this << ".AddPolyhedralVolumeByFaces( "
1255 << IdsOfFaces << " )";
1257 declareMeshModified( /*isReComputeSafe=*/false );
1258 return elem ? elem->GetID() : 0;
1260 SMESH_CATCH( SMESH::throwCorbaException );
1264 //=============================================================================
1266 // \brief Create 0D elements on all nodes of the given object except those
1267 // nodes on which a 0D element already exists.
1268 // \param theObject object on whose nodes 0D elements will be created.
1269 // \param theGroupName optional name of a group to add 0D elements created
1270 // and/or found on nodes of \a theObject.
1271 // \return an object (a new group or a temporary SMESH_IDSource) holding
1272 // ids of new and/or found 0D elements.
1274 //=============================================================================
1276 SMESH::SMESH_IDSource_ptr
1277 SMESH_MeshEditor_i::Create0DElementsOnAllNodes(SMESH::SMESH_IDSource_ptr theObject,
1278 const char* theGroupName)
1279 throw (SALOME::SALOME_Exception)
1284 SMESH::SMESH_IDSource_var result;
1287 TIDSortedElemSet elements, elems0D;
1288 prepareIdSource( theObject );
1289 if ( idSourceToSet( theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
1290 getEditor().Create0DElementsOnAllNodes( elements, elems0D );
1292 SMESH::long_array_var newElems = new SMESH::long_array;
1293 newElems->length( elems0D.size() );
1294 TIDSortedElemSet::iterator eIt = elems0D.begin();
1295 for ( size_t i = 0; i < elems0D.size(); ++i, ++eIt )
1296 newElems[ i ] = (*eIt)->GetID();
1298 SMESH::SMESH_GroupBase_var groupToFill;
1299 if ( theGroupName && strlen( theGroupName ))
1301 // Get existing group named theGroupName
1302 SMESH::ListOfGroups_var groups = myMesh_i->GetGroups();
1303 for (int i = 0, nbGroups = groups->length(); i < nbGroups; i++ ) {
1304 SMESH::SMESH_GroupBase_var group = groups[i];
1305 if ( !group->_is_nil() ) {
1306 CORBA::String_var name = group->GetName();
1307 if ( strcmp( name.in(), theGroupName ) == 0 && group->GetType() == SMESH::ELEM0D ) {
1308 groupToFill = group;
1313 if ( groupToFill->_is_nil() )
1314 groupToFill = myMesh_i->CreateGroup( SMESH::ELEM0D, theGroupName );
1315 else if ( !SMESH::DownCast< SMESH_Group_i* > ( groupToFill ))
1316 groupToFill = myMesh_i->ConvertToStandalone( groupToFill );
1319 if ( SMESH_Group_i* group_i = SMESH::DownCast< SMESH_Group_i* > ( groupToFill ))
1321 group_i->Add( newElems );
1322 result = SMESH::SMESH_IDSource::_narrow( groupToFill );
1323 pyDump << groupToFill;
1327 result = MakeIDSource( newElems, SMESH::ELEM0D );
1328 pyDump << "elem0DIDs";
1331 pyDump << " = " << this << ".Create0DElementsOnAllNodes( "
1332 << theObject << ", '" << theGroupName << "' )";
1334 return result._retn();
1336 SMESH_CATCH( SMESH::throwCorbaException );
1340 //=============================================================================
1342 * \brief Bind a node to a vertex
1343 * \param NodeID - node ID
1344 * \param VertexID - vertex ID available through GEOM_Object.GetSubShapeIndices()[0]
1345 * \retval boolean - false if NodeID or VertexID is invalid
1347 //=============================================================================
1349 void SMESH_MeshEditor_i::SetNodeOnVertex(CORBA::Long NodeID, CORBA::Long VertexID)
1350 throw (SALOME::SALOME_Exception)
1354 SMESHDS_Mesh * mesh = getMeshDS();
1355 SMDS_MeshNode* node = const_cast<SMDS_MeshNode*>( mesh->FindNode(NodeID) );
1357 THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM);
1359 if ( mesh->MaxShapeIndex() < VertexID )
1360 THROW_SALOME_CORBA_EXCEPTION("Invalid VertexID", SALOME::BAD_PARAM);
1362 TopoDS_Shape shape = mesh->IndexToShape( VertexID );
1363 if ( shape.ShapeType() != TopAbs_VERTEX )
1364 THROW_SALOME_CORBA_EXCEPTION("Invalid VertexID", SALOME::BAD_PARAM);
1366 mesh->SetNodeOnVertex( node, VertexID );
1368 myMesh->SetIsModified( true );
1370 SMESH_CATCH( SMESH::throwCorbaException );
1373 //=============================================================================
1375 * \brief Store node position on an edge
1376 * \param NodeID - node ID
1377 * \param EdgeID - edge ID available through GEOM_Object.GetSubShapeIndices()[0]
1378 * \param paramOnEdge - parameter on edge where the node is located
1379 * \retval boolean - false if any parameter is invalid
1381 //=============================================================================
1383 void SMESH_MeshEditor_i::SetNodeOnEdge(CORBA::Long NodeID, CORBA::Long EdgeID,
1384 CORBA::Double paramOnEdge)
1385 throw (SALOME::SALOME_Exception)
1389 SMESHDS_Mesh * mesh = getMeshDS();
1390 SMDS_MeshNode* node = const_cast<SMDS_MeshNode*>( mesh->FindNode(NodeID) );
1392 THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM);
1394 if ( mesh->MaxShapeIndex() < EdgeID )
1395 THROW_SALOME_CORBA_EXCEPTION("Invalid EdgeID", SALOME::BAD_PARAM);
1397 TopoDS_Shape shape = mesh->IndexToShape( EdgeID );
1398 if ( shape.ShapeType() != TopAbs_EDGE )
1399 THROW_SALOME_CORBA_EXCEPTION("Invalid EdgeID", SALOME::BAD_PARAM);
1402 BRep_Tool::Range( TopoDS::Edge( shape ), f,l);
1403 if ( paramOnEdge < f || paramOnEdge > l )
1404 THROW_SALOME_CORBA_EXCEPTION("Invalid paramOnEdge", SALOME::BAD_PARAM);
1406 mesh->SetNodeOnEdge( node, EdgeID, paramOnEdge );
1408 myMesh->SetIsModified( true );
1410 SMESH_CATCH( SMESH::throwCorbaException );
1413 //=============================================================================
1415 * \brief Store node position on a face
1416 * \param NodeID - node ID
1417 * \param FaceID - face ID available through GEOM_Object.GetSubShapeIndices()[0]
1418 * \param u - U parameter on face where the node is located
1419 * \param v - V parameter on face where the node is located
1420 * \retval boolean - false if any parameter is invalid
1422 //=============================================================================
1424 void SMESH_MeshEditor_i::SetNodeOnFace(CORBA::Long NodeID, CORBA::Long FaceID,
1425 CORBA::Double u, CORBA::Double v)
1426 throw (SALOME::SALOME_Exception)
1429 SMESHDS_Mesh * mesh = getMeshDS();
1430 SMDS_MeshNode* node = const_cast<SMDS_MeshNode*>( mesh->FindNode(NodeID) );
1432 THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM);
1434 if ( mesh->MaxShapeIndex() < FaceID )
1435 THROW_SALOME_CORBA_EXCEPTION("Invalid FaceID", SALOME::BAD_PARAM);
1437 TopoDS_Shape shape = mesh->IndexToShape( FaceID );
1438 if ( shape.ShapeType() != TopAbs_FACE )
1439 THROW_SALOME_CORBA_EXCEPTION("Invalid FaceID", SALOME::BAD_PARAM);
1441 BRepAdaptor_Surface surf( TopoDS::Face( shape ));
1442 bool isOut = ( u < surf.FirstUParameter() ||
1443 u > surf.LastUParameter() ||
1444 v < surf.FirstVParameter() ||
1445 v > surf.LastVParameter() );
1449 MESSAGE ( "FACE " << FaceID << " (" << u << "," << v << ") out of "
1450 << " u( " << surf.FirstUParameter()
1451 << "," << surf.LastUParameter()
1452 << ") v( " << surf.FirstVParameter()
1453 << "," << surf.LastVParameter() << ")" );
1455 THROW_SALOME_CORBA_EXCEPTION("Invalid UV", SALOME::BAD_PARAM);
1458 mesh->SetNodeOnFace( node, FaceID, u, v );
1459 myMesh->SetIsModified( true );
1461 SMESH_CATCH( SMESH::throwCorbaException );
1464 //=============================================================================
1466 * \brief Bind a node to a solid
1467 * \param NodeID - node ID
1468 * \param SolidID - vertex ID available through GEOM_Object.GetSubShapeIndices()[0]
1469 * \retval boolean - false if NodeID or SolidID is invalid
1471 //=============================================================================
1473 void SMESH_MeshEditor_i::SetNodeInVolume(CORBA::Long NodeID, CORBA::Long SolidID)
1474 throw (SALOME::SALOME_Exception)
1477 SMESHDS_Mesh * mesh = getMeshDS();
1478 SMDS_MeshNode* node = const_cast<SMDS_MeshNode*>( mesh->FindNode(NodeID) );
1480 THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM);
1482 if ( mesh->MaxShapeIndex() < SolidID )
1483 THROW_SALOME_CORBA_EXCEPTION("Invalid SolidID", SALOME::BAD_PARAM);
1485 TopoDS_Shape shape = mesh->IndexToShape( SolidID );
1486 if ( shape.ShapeType() != TopAbs_SOLID &&
1487 shape.ShapeType() != TopAbs_SHELL)
1488 THROW_SALOME_CORBA_EXCEPTION("Invalid SolidID", SALOME::BAD_PARAM);
1490 mesh->SetNodeInVolume( node, SolidID );
1492 SMESH_CATCH( SMESH::throwCorbaException );
1495 //=============================================================================
1497 * \brief Bind an element to a shape
1498 * \param ElementID - element ID
1499 * \param ShapeID - shape ID available through GEOM_Object.GetSubShapeIndices()[0]
1501 //=============================================================================
1503 void SMESH_MeshEditor_i::SetMeshElementOnShape(CORBA::Long ElementID,
1504 CORBA::Long ShapeID)
1505 throw (SALOME::SALOME_Exception)
1508 SMESHDS_Mesh * mesh = getMeshDS();
1509 SMDS_MeshElement* elem = const_cast<SMDS_MeshElement*>(mesh->FindElement(ElementID));
1511 THROW_SALOME_CORBA_EXCEPTION("Invalid ElementID", SALOME::BAD_PARAM);
1513 if ( mesh->MaxShapeIndex() < ShapeID || ShapeID < 1 )
1514 THROW_SALOME_CORBA_EXCEPTION("Invalid ShapeID", SALOME::BAD_PARAM);
1516 TopoDS_Shape shape = mesh->IndexToShape( ShapeID );
1517 if ( shape.ShapeType() != TopAbs_EDGE &&
1518 shape.ShapeType() != TopAbs_FACE &&
1519 shape.ShapeType() != TopAbs_SOLID &&
1520 shape.ShapeType() != TopAbs_SHELL )
1521 THROW_SALOME_CORBA_EXCEPTION("Invalid shape type", SALOME::BAD_PARAM);
1523 mesh->SetMeshElementOnShape( elem, ShapeID );
1525 myMesh->SetIsModified( true );
1527 SMESH_CATCH( SMESH::throwCorbaException );
1530 //=============================================================================
1534 //=============================================================================
1536 CORBA::Boolean SMESH_MeshEditor_i::InverseDiag(CORBA::Long NodeID1,
1537 CORBA::Long NodeID2)
1538 throw (SALOME::SALOME_Exception)
1543 const SMDS_MeshNode * n1 = getMeshDS()->FindNode( NodeID1 );
1544 const SMDS_MeshNode * n2 = getMeshDS()->FindNode( NodeID2 );
1548 // Update Python script
1549 TPythonDump() << "isDone = " << this << ".InverseDiag( "
1550 << NodeID1 << ", " << NodeID2 << " )";
1552 int ret = getEditor().InverseDiag ( n1, n2 );
1554 declareMeshModified( /*isReComputeSafe=*/false );
1557 SMESH_CATCH( SMESH::throwCorbaException );
1561 //=============================================================================
1565 //=============================================================================
1567 CORBA::Boolean SMESH_MeshEditor_i::DeleteDiag(CORBA::Long NodeID1,
1568 CORBA::Long NodeID2)
1569 throw (SALOME::SALOME_Exception)
1574 const SMDS_MeshNode * n1 = getMeshDS()->FindNode( NodeID1 );
1575 const SMDS_MeshNode * n2 = getMeshDS()->FindNode( NodeID2 );
1579 // Update Python script
1580 TPythonDump() << "isDone = " << this << ".DeleteDiag( "
1581 << NodeID1 << ", " << NodeID2 << " )";
1584 bool stat = getEditor().DeleteDiag ( n1, n2 );
1586 declareMeshModified( /*isReComputeSafe=*/!stat );
1590 SMESH_CATCH( SMESH::throwCorbaException );
1594 //=============================================================================
1598 //=============================================================================
1600 CORBA::Boolean SMESH_MeshEditor_i::Reorient(const SMESH::long_array & IDsOfElements)
1601 throw (SALOME::SALOME_Exception)
1606 for (int i = 0; i < IDsOfElements.length(); i++)
1608 CORBA::Long index = IDsOfElements[i];
1609 const SMDS_MeshElement * elem = getMeshDS()->FindElement(index);
1611 getEditor().Reorient( elem );
1613 // Update Python script
1614 TPythonDump() << "isDone = " << this << ".Reorient( " << IDsOfElements << " )";
1616 declareMeshModified( /*isReComputeSafe=*/ IDsOfElements.length() == 0 );
1619 SMESH_CATCH( SMESH::throwCorbaException );
1623 //=============================================================================
1627 //=============================================================================
1629 CORBA::Boolean SMESH_MeshEditor_i::ReorientObject(SMESH::SMESH_IDSource_ptr theObject)
1630 throw (SALOME::SALOME_Exception)
1635 TPythonDump aTPythonDump; // suppress dump in Reorient()
1637 prepareIdSource( theObject );
1639 SMESH::long_array_var anElementsId = theObject->GetIDs();
1640 CORBA::Boolean isDone = Reorient(anElementsId);
1642 // Update Python script
1643 aTPythonDump << "isDone = " << this << ".ReorientObject( " << theObject << " )";
1645 declareMeshModified( /*isReComputeSafe=*/ anElementsId->length() == 0 );
1648 SMESH_CATCH( SMESH::throwCorbaException );
1652 //=======================================================================
1653 //function : Reorient2D
1654 //purpose : Reorient faces contained in \a the2Dgroup.
1655 // the2Dgroup - the mesh or its part to reorient
1656 // theDirection - desired direction of normal of \a theFace
1657 // theFace - ID of face whose orientation is checked.
1658 // It can be < 1 then \a thePoint is used to find a face.
1659 // thePoint - is used to find a face if \a theFace < 1.
1660 // return number of reoriented elements.
1661 //=======================================================================
1663 CORBA::Long SMESH_MeshEditor_i::Reorient2D(SMESH::SMESH_IDSource_ptr the2Dgroup,
1664 const SMESH::DirStruct& theDirection,
1665 CORBA::Long theFace,
1666 const SMESH::PointStruct& thePoint)
1667 throw (SALOME::SALOME_Exception)
1670 initData(/*deleteSearchers=*/false);
1672 TIDSortedElemSet elements;
1673 prepareIdSource( the2Dgroup );
1674 IDSource_Error error;
1675 idSourceToSet( the2Dgroup, getMeshDS(), elements, SMDSAbs_Face, /*emptyIfIsMesh=*/1, &error );
1676 if ( error == IDSource_EMPTY )
1678 if ( error == IDSource_INVALID )
1679 THROW_SALOME_CORBA_EXCEPTION("No faces in given group", SALOME::BAD_PARAM);
1682 const SMDS_MeshElement* face = 0;
1685 face = getMeshDS()->FindElement( theFace );
1687 THROW_SALOME_CORBA_EXCEPTION("Inexistent face given", SALOME::BAD_PARAM);
1688 if ( face->GetType() != SMDSAbs_Face )
1689 THROW_SALOME_CORBA_EXCEPTION("Wrong element type", SALOME::BAD_PARAM);
1693 // create theElementSearcher if needed
1694 theSearchersDeleter.Set( myMesh, getPartIOR( the2Dgroup, SMESH::FACE ));
1695 if ( !theElementSearcher )
1697 if ( elements.empty() ) // search in the whole mesh
1699 if ( myMesh->NbFaces() == 0 )
1700 THROW_SALOME_CORBA_EXCEPTION("No faces in the mesh", SALOME::BAD_PARAM);
1702 theElementSearcher = SMESH_MeshAlgos::GetElementSearcher( *getMeshDS() );
1706 typedef SMDS_SetIterator<const SMDS_MeshElement*, TIDSortedElemSet::const_iterator > TIter;
1707 SMDS_ElemIteratorPtr elemsIt( new TIter( elements.begin(), elements.end() ));
1709 theElementSearcher = SMESH_MeshAlgos::GetElementSearcher( *getMeshDS(), elemsIt);
1713 gp_Pnt p( thePoint.x, thePoint.y, thePoint.z );
1714 face = theElementSearcher->FindClosestTo( p, SMDSAbs_Face );
1717 THROW_SALOME_CORBA_EXCEPTION("No face found by point", SALOME::INTERNAL_ERROR );
1718 if ( !elements.empty() && !elements.count( face ))
1719 THROW_SALOME_CORBA_EXCEPTION("Found face is not in the group", SALOME::BAD_PARAM );
1722 const SMESH::PointStruct * P = &theDirection.PS;
1723 gp_Vec dirVec( P->x, P->y, P->z );
1724 if ( dirVec.Magnitude() < std::numeric_limits< double >::min() )
1725 THROW_SALOME_CORBA_EXCEPTION("Zero size vector", SALOME::BAD_PARAM);
1727 int nbReori = getEditor().Reorient2D( elements, dirVec, face );
1730 declareMeshModified( /*isReComputeSafe=*/false );
1732 TPythonDump() << this << ".Reorient2D( "
1733 << the2Dgroup << ", "
1734 << theDirection << ", "
1736 << thePoint << " )";
1740 SMESH_CATCH( SMESH::throwCorbaException );
1744 //=======================================================================
1745 //function : Reorient2DBy3D
1746 //purpose : Reorient faces basing on orientation of adjacent volumes.
1747 //=======================================================================
1749 CORBA::Long SMESH_MeshEditor_i::Reorient2DBy3D(const SMESH::ListOfIDSources& faceGroups,
1750 SMESH::SMESH_IDSource_ptr volumeGroup,
1751 CORBA::Boolean outsideNormal)
1752 throw (SALOME::SALOME_Exception)
1757 TIDSortedElemSet volumes;
1758 prepareIdSource( volumeGroup );
1759 IDSource_Error volsError;
1760 idSourceToSet( volumeGroup, getMeshDS(), volumes, SMDSAbs_Volume, /*emptyIfMesh=*/1, &volsError);
1763 for ( size_t i = 0; i < faceGroups.length(); ++i )
1765 SMESH::SMESH_IDSource_ptr faceGrp = faceGroups[i].in();
1766 prepareIdSource( faceGrp );
1768 TIDSortedElemSet faces;
1769 IDSource_Error error;
1770 idSourceToSet( faceGrp, getMeshDS(), faces, SMDSAbs_Face, /*emptyIfIsMesh=*/1, &error );
1771 if ( error == IDSource_INVALID && faceGroups.length() == 1 )
1772 THROW_SALOME_CORBA_EXCEPTION("No faces in a given object", SALOME::BAD_PARAM);
1773 if ( error == IDSource_OK && volsError != IDSource_OK )
1774 THROW_SALOME_CORBA_EXCEPTION("No volumes in a given object", SALOME::BAD_PARAM);
1776 nbReori += getEditor().Reorient2DBy3D( faces, volumes, outsideNormal );
1778 if ( error != IDSource_EMPTY && faces.empty() ) // all faces in the mesh treated
1783 declareMeshModified( /*isReComputeSafe=*/false );
1785 TPythonDump() << this << ".Reorient2DBy3D( "
1786 << faceGroups << ", "
1787 << volumeGroup << ", "
1788 << outsideNormal << " )";
1792 SMESH_CATCH( SMESH::throwCorbaException );
1796 //=============================================================================
1798 * \brief Fuse neighbour triangles into quadrangles.
1800 //=============================================================================
1802 CORBA::Boolean SMESH_MeshEditor_i::TriToQuad (const SMESH::long_array & IDsOfElements,
1803 SMESH::NumericalFunctor_ptr Criterion,
1804 CORBA::Double MaxAngle)
1805 throw (SALOME::SALOME_Exception)
1810 SMESHDS_Mesh* aMesh = getMeshDS();
1811 TIDSortedElemSet faces,copyFaces;
1812 SMDS_MeshElement::GeomFilter triaFilter(SMDSGeom_TRIANGLE);
1813 arrayToSet(IDsOfElements, aMesh, faces, SMDSAbs_Face, & triaFilter);
1814 TIDSortedElemSet* workElements = & faces;
1816 if ( myIsPreviewMode ) {
1817 SMDSAbs_ElementType select = SMDSAbs_Face;
1818 getPreviewMesh( SMDSAbs_Face )->Copy( faces, copyFaces, select );
1819 workElements = & copyFaces;
1822 SMESH::NumericalFunctor_i* aNumericalFunctor =
1823 dynamic_cast<SMESH::NumericalFunctor_i*>( SMESH_Gen_i::GetServant( Criterion ).in() );
1824 SMESH::Controls::NumericalFunctorPtr aCrit;
1825 if ( !aNumericalFunctor )
1826 aCrit.reset( new SMESH::Controls::MaxElementLength2D() );
1828 aCrit = aNumericalFunctor->GetNumericalFunctor();
1830 if ( !myIsPreviewMode ) {
1831 // Update Python script
1832 TPythonDump() << "isDone = " << this << ".TriToQuad( "
1833 << IDsOfElements << ", " << aNumericalFunctor << ", " << TVar( MaxAngle ) << " )";
1836 bool stat = getEditor().TriToQuad( *workElements, aCrit, MaxAngle );
1838 declareMeshModified( /*isReComputeSafe=*/!stat );
1841 SMESH_CATCH( SMESH::throwCorbaException );
1845 //=============================================================================
1847 * \brief Fuse neighbour triangles into quadrangles.
1849 //=============================================================================
1851 CORBA::Boolean SMESH_MeshEditor_i::TriToQuadObject (SMESH::SMESH_IDSource_ptr theObject,
1852 SMESH::NumericalFunctor_ptr Criterion,
1853 CORBA::Double MaxAngle)
1854 throw (SALOME::SALOME_Exception)
1859 TPythonDump aTPythonDump; // suppress dump in TriToQuad()
1861 prepareIdSource( theObject );
1862 SMESH::long_array_var anElementsId = theObject->GetIDs();
1863 CORBA::Boolean isDone = TriToQuad(anElementsId, Criterion, MaxAngle);
1865 if ( !myIsPreviewMode ) {
1866 SMESH::NumericalFunctor_i* aNumericalFunctor =
1867 SMESH::DownCast<SMESH::NumericalFunctor_i*>( Criterion );
1869 // Update Python script
1870 aTPythonDump << "isDone = " << this << ".TriToQuadObject("
1871 << theObject << ", " << aNumericalFunctor << ", " << TVar( MaxAngle ) << " )";
1876 SMESH_CATCH( SMESH::throwCorbaException );
1880 //=============================================================================
1882 * \brief Split quadrangles into triangles.
1884 //=============================================================================
1886 CORBA::Boolean SMESH_MeshEditor_i::QuadToTri (const SMESH::long_array & IDsOfElements,
1887 SMESH::NumericalFunctor_ptr Criterion)
1888 throw (SALOME::SALOME_Exception)
1893 SMESHDS_Mesh* aMesh = getMeshDS();
1894 TIDSortedElemSet faces;
1895 arrayToSet(IDsOfElements, aMesh, faces, SMDSAbs_Face);
1897 SMESH::NumericalFunctor_i* aNumericalFunctor =
1898 dynamic_cast<SMESH::NumericalFunctor_i*>( SMESH_Gen_i::GetServant( Criterion ).in() );
1899 SMESH::Controls::NumericalFunctorPtr aCrit;
1900 if ( !aNumericalFunctor )
1901 aCrit.reset( new SMESH::Controls::AspectRatio() );
1903 aCrit = aNumericalFunctor->GetNumericalFunctor();
1906 // Update Python script
1907 TPythonDump() << "isDone = " << this << ".QuadToTri( " << IDsOfElements << ", " << aNumericalFunctor << " )";
1909 CORBA::Boolean stat = getEditor().QuadToTri( faces, aCrit );
1911 declareMeshModified( /*isReComputeSafe=*/false );
1914 SMESH_CATCH( SMESH::throwCorbaException );
1918 //=============================================================================
1920 * \brief Split quadrangles into triangles.
1922 //=============================================================================
1924 CORBA::Boolean SMESH_MeshEditor_i::QuadToTriObject (SMESH::SMESH_IDSource_ptr theObject,
1925 SMESH::NumericalFunctor_ptr Criterion)
1926 throw (SALOME::SALOME_Exception)
1931 TPythonDump aTPythonDump; // suppress dump in QuadToTri()
1933 prepareIdSource( theObject );
1934 SMESH::long_array_var anElementsId = theObject->GetIDs();
1935 CORBA::Boolean isDone = QuadToTri(anElementsId, Criterion);
1937 SMESH::NumericalFunctor_i* aNumericalFunctor =
1938 SMESH::DownCast<SMESH::NumericalFunctor_i*>( Criterion );
1940 // Update Python script
1941 aTPythonDump << "isDone = " << this << ".QuadToTriObject( " << theObject << ", " << aNumericalFunctor << " )";
1943 declareMeshModified( /*isReComputeSafe=*/false );
1946 SMESH_CATCH( SMESH::throwCorbaException );
1950 //================================================================================
1952 * \brief Split each of quadrangles into 4 triangles.
1953 * \param [in] theObject - theQuads Container of quadrangles to split.
1955 //================================================================================
1957 void SMESH_MeshEditor_i::QuadTo4Tri (SMESH::SMESH_IDSource_ptr theObject)
1958 throw (SALOME::SALOME_Exception)
1963 TIDSortedElemSet faces;
1964 prepareIdSource( theObject );
1965 if ( !idSourceToSet( theObject, getMeshDS(), faces, SMDSAbs_Face, /*emptyIfIsMesh=*/true ) &&
1967 THROW_SALOME_CORBA_EXCEPTION("No faces given", SALOME::BAD_PARAM);
1969 getEditor().QuadTo4Tri( faces );
1970 TPythonDump() << this << ".QuadTo4Tri( " << theObject << " )";
1972 SMESH_CATCH( SMESH::throwCorbaException );
1975 //=============================================================================
1977 * \brief Split quadrangles into triangles.
1979 //=============================================================================
1981 CORBA::Boolean SMESH_MeshEditor_i::SplitQuad (const SMESH::long_array & IDsOfElements,
1982 CORBA::Boolean Diag13)
1983 throw (SALOME::SALOME_Exception)
1988 SMESHDS_Mesh* aMesh = getMeshDS();
1989 TIDSortedElemSet faces;
1990 arrayToSet(IDsOfElements, aMesh, faces, SMDSAbs_Face);
1992 // Update Python script
1993 TPythonDump() << "isDone = " << this << ".SplitQuad( "
1994 << IDsOfElements << ", " << Diag13 << " )";
1996 CORBA::Boolean stat = getEditor().QuadToTri( faces, Diag13 );
1998 declareMeshModified( /*isReComputeSafe=*/ !stat );
2001 SMESH_CATCH( SMESH::throwCorbaException );
2005 //=============================================================================
2007 * \brief Split quadrangles into triangles.
2009 //=============================================================================
2011 CORBA::Boolean SMESH_MeshEditor_i::SplitQuadObject (SMESH::SMESH_IDSource_ptr theObject,
2012 CORBA::Boolean Diag13)
2013 throw (SALOME::SALOME_Exception)
2018 TPythonDump aTPythonDump; // suppress dump in SplitQuad()
2020 prepareIdSource( theObject );
2021 SMESH::long_array_var anElementsId = theObject->GetIDs();
2022 CORBA::Boolean isDone = SplitQuad(anElementsId, Diag13);
2024 // Update Python script
2025 aTPythonDump << "isDone = " << this << ".SplitQuadObject( "
2026 << theObject << ", " << Diag13 << " )";
2028 declareMeshModified( /*isReComputeSafe=*/!isDone );
2031 SMESH_CATCH( SMESH::throwCorbaException );
2036 //=============================================================================
2038 * Find better splitting of the given quadrangle.
2039 * \param IDOfQuad ID of the quadrangle to be splitted.
2040 * \param Criterion A criterion to choose a diagonal for splitting.
2041 * \return 1 if 1-3 diagonal is better, 2 if 2-4
2042 * diagonal is better, 0 if error occurs.
2044 //=============================================================================
2046 CORBA::Long SMESH_MeshEditor_i::BestSplit (CORBA::Long IDOfQuad,
2047 SMESH::NumericalFunctor_ptr Criterion)
2048 throw (SALOME::SALOME_Exception)
2053 const SMDS_MeshElement* quad = getMeshDS()->FindElement(IDOfQuad);
2054 if (quad && quad->GetType() == SMDSAbs_Face && quad->NbNodes() == 4)
2056 SMESH::NumericalFunctor_i* aNumericalFunctor =
2057 dynamic_cast<SMESH::NumericalFunctor_i*>(SMESH_Gen_i::GetServant(Criterion).in());
2058 SMESH::Controls::NumericalFunctorPtr aCrit;
2059 if (aNumericalFunctor)
2060 aCrit = aNumericalFunctor->GetNumericalFunctor();
2062 aCrit.reset(new SMESH::Controls::AspectRatio());
2064 int id = getEditor().BestSplit(quad, aCrit);
2065 declareMeshModified( /*isReComputeSafe=*/ id < 1 );
2069 SMESH_CATCH( SMESH::throwCorbaException );
2073 //================================================================================
2075 * \brief Split volumic elements into tetrahedrons
2077 //================================================================================
2079 void SMESH_MeshEditor_i::SplitVolumesIntoTetra (SMESH::SMESH_IDSource_ptr elems,
2080 CORBA::Short methodFlags)
2081 throw (SALOME::SALOME_Exception)
2085 prepareIdSource( elems );
2087 ::SMESH_MeshEditor::TFacetOfElem elemSet;
2088 const int noneFacet = -1;
2089 SMDS_ElemIteratorPtr volIt = myMesh_i->GetElements( elems, SMESH::VOLUME );
2090 while( volIt->more() )
2091 elemSet.insert( elemSet.end(), make_pair( volIt->next(), noneFacet ));
2093 getEditor().SplitVolumes( elemSet, int( methodFlags ));
2094 declareMeshModified( /*isReComputeSafe=*/true ); // it does not influence Compute()
2096 TPythonDump() << this << ".SplitVolumesIntoTetra( "
2097 << elems << ", " << methodFlags << " )";
2099 SMESH_CATCH( SMESH::throwCorbaException );
2102 //================================================================================
2104 * \brief Split hexahedra into triangular prisms
2105 * \param elems - elements to split
2106 * \param facetToSplitNormal - normal used to find a facet of hexahedron
2107 * to split into triangles
2108 * \param methodFlags - flags passing splitting method:
2109 * 1 - split the hexahedron into 2 prisms
2110 * 2 - split the hexahedron into 4 prisms
2112 //================================================================================
2114 void SMESH_MeshEditor_i::SplitHexahedraIntoPrisms (SMESH::SMESH_IDSource_ptr elems,
2115 const SMESH::PointStruct & startHexPoint,
2116 const SMESH::DirStruct& facetToSplitNormal,
2117 CORBA::Short methodFlags,
2118 CORBA::Boolean allDomains)
2119 throw (SALOME::SALOME_Exception)
2123 prepareIdSource( elems );
2125 gp_Ax1 facetNorm( gp_Pnt( startHexPoint.x,
2128 gp_Dir( facetToSplitNormal.PS.x,
2129 facetToSplitNormal.PS.y,
2130 facetToSplitNormal.PS.z ));
2131 TIDSortedElemSet elemSet;
2132 SMESH::long_array_var anElementsId = elems->GetIDs();
2133 SMDS_MeshElement::GeomFilter filter( SMDSGeom_HEXA );
2134 arrayToSet( anElementsId, getMeshDS(), elemSet, SMDSAbs_Volume, &filter );
2136 ::SMESH_MeshEditor::TFacetOfElem elemFacets;
2137 while ( !elemSet.empty() )
2139 getEditor().GetHexaFacetsToSplit( elemSet, facetNorm, elemFacets );
2143 ::SMESH_MeshEditor::TFacetOfElem::iterator ef = elemFacets.begin();
2144 for ( ; ef != elemFacets.end(); ++ef )
2145 elemSet.erase( ef->first );
2148 if ( methodFlags == 2 )
2149 methodFlags = int( ::SMESH_MeshEditor::HEXA_TO_4_PRISMS );
2151 methodFlags = int( ::SMESH_MeshEditor::HEXA_TO_2_PRISMS );
2153 getEditor().SplitVolumes( elemFacets, int( methodFlags ));
2154 declareMeshModified( /*isReComputeSafe=*/true ); // it does not influence Compute()
2156 TPythonDump() << this << ".SplitHexahedraIntoPrisms( "
2158 << startHexPoint << ", "
2159 << facetToSplitNormal<< ", "
2160 << methodFlags<< ", "
2161 << allDomains << " )";
2163 SMESH_CATCH( SMESH::throwCorbaException );
2166 //=======================================================================
2169 //=======================================================================
2172 SMESH_MeshEditor_i::Smooth(const SMESH::long_array & IDsOfElements,
2173 const SMESH::long_array & IDsOfFixedNodes,
2174 CORBA::Long MaxNbOfIterations,
2175 CORBA::Double MaxAspectRatio,
2176 SMESH::SMESH_MeshEditor::Smooth_Method Method)
2177 throw (SALOME::SALOME_Exception)
2179 return smooth( IDsOfElements, IDsOfFixedNodes, MaxNbOfIterations,
2180 MaxAspectRatio, Method, false );
2184 //=======================================================================
2185 //function : SmoothParametric
2187 //=======================================================================
2190 SMESH_MeshEditor_i::SmoothParametric(const SMESH::long_array & IDsOfElements,
2191 const SMESH::long_array & IDsOfFixedNodes,
2192 CORBA::Long MaxNbOfIterations,
2193 CORBA::Double MaxAspectRatio,
2194 SMESH::SMESH_MeshEditor::Smooth_Method Method)
2195 throw (SALOME::SALOME_Exception)
2197 return smooth( IDsOfElements, IDsOfFixedNodes, MaxNbOfIterations,
2198 MaxAspectRatio, Method, true );
2202 //=======================================================================
2203 //function : SmoothObject
2205 //=======================================================================
2208 SMESH_MeshEditor_i::SmoothObject(SMESH::SMESH_IDSource_ptr theObject,
2209 const SMESH::long_array & IDsOfFixedNodes,
2210 CORBA::Long MaxNbOfIterations,
2211 CORBA::Double MaxAspectRatio,
2212 SMESH::SMESH_MeshEditor::Smooth_Method Method)
2213 throw (SALOME::SALOME_Exception)
2215 return smoothObject (theObject, IDsOfFixedNodes, MaxNbOfIterations,
2216 MaxAspectRatio, Method, false);
2220 //=======================================================================
2221 //function : SmoothParametricObject
2223 //=======================================================================
2226 SMESH_MeshEditor_i::SmoothParametricObject(SMESH::SMESH_IDSource_ptr theObject,
2227 const SMESH::long_array & IDsOfFixedNodes,
2228 CORBA::Long MaxNbOfIterations,
2229 CORBA::Double MaxAspectRatio,
2230 SMESH::SMESH_MeshEditor::Smooth_Method Method)
2231 throw (SALOME::SALOME_Exception)
2233 return smoothObject (theObject, IDsOfFixedNodes, MaxNbOfIterations,
2234 MaxAspectRatio, Method, true);
2238 //=============================================================================
2242 //=============================================================================
2245 SMESH_MeshEditor_i::smooth(const SMESH::long_array & IDsOfElements,
2246 const SMESH::long_array & IDsOfFixedNodes,
2247 CORBA::Long MaxNbOfIterations,
2248 CORBA::Double MaxAspectRatio,
2249 SMESH::SMESH_MeshEditor::Smooth_Method Method,
2251 throw (SALOME::SALOME_Exception)
2256 SMESHDS_Mesh* aMesh = getMeshDS();
2258 TIDSortedElemSet elements;
2259 arrayToSet(IDsOfElements, aMesh, elements, SMDSAbs_Face);
2261 set<const SMDS_MeshNode*> fixedNodes;
2262 for (int i = 0; i < IDsOfFixedNodes.length(); i++) {
2263 CORBA::Long index = IDsOfFixedNodes[i];
2264 const SMDS_MeshNode * node = aMesh->FindNode(index);
2266 fixedNodes.insert( node );
2268 ::SMESH_MeshEditor::SmoothMethod method = ::SMESH_MeshEditor::LAPLACIAN;
2269 if ( Method != SMESH::SMESH_MeshEditor::LAPLACIAN_SMOOTH )
2270 method = ::SMESH_MeshEditor::CENTROIDAL;
2272 getEditor().Smooth(elements, fixedNodes, method,
2273 MaxNbOfIterations, MaxAspectRatio, IsParametric );
2275 declareMeshModified( /*isReComputeSafe=*/true ); // does not prevent re-compute
2277 // Update Python script
2278 TPythonDump() << "isDone = " << this << "."
2279 << (IsParametric ? "SmoothParametric( " : "Smooth( ")
2280 << IDsOfElements << ", " << IDsOfFixedNodes << ", "
2281 << TVar( MaxNbOfIterations ) << ", " << TVar( MaxAspectRatio ) << ", "
2282 << "SMESH.SMESH_MeshEditor."
2283 << ( Method == SMESH::SMESH_MeshEditor::CENTROIDAL_SMOOTH ?
2284 "CENTROIDAL_SMOOTH )" : "LAPLACIAN_SMOOTH )");
2288 SMESH_CATCH( SMESH::throwCorbaException );
2292 //=============================================================================
2296 //=============================================================================
2299 SMESH_MeshEditor_i::smoothObject(SMESH::SMESH_IDSource_ptr theObject,
2300 const SMESH::long_array & IDsOfFixedNodes,
2301 CORBA::Long MaxNbOfIterations,
2302 CORBA::Double MaxAspectRatio,
2303 SMESH::SMESH_MeshEditor::Smooth_Method Method,
2305 throw (SALOME::SALOME_Exception)
2310 TPythonDump aTPythonDump; // suppress dump in smooth()
2312 prepareIdSource( theObject );
2313 SMESH::long_array_var anElementsId = theObject->GetIDs();
2314 CORBA::Boolean isDone = smooth (anElementsId, IDsOfFixedNodes, MaxNbOfIterations,
2315 MaxAspectRatio, Method, IsParametric);
2317 // Update Python script
2318 aTPythonDump << "isDone = " << this << "."
2319 << (IsParametric ? "SmoothParametricObject( " : "SmoothObject( ")
2320 << theObject << ", " << IDsOfFixedNodes << ", "
2321 << TVar( MaxNbOfIterations ) << ", " << TVar( MaxAspectRatio ) << ", "
2322 << "SMESH.SMESH_MeshEditor."
2323 << ( Method == SMESH::SMESH_MeshEditor::CENTROIDAL_SMOOTH ?
2324 "CENTROIDAL_SMOOTH )" : "LAPLACIAN_SMOOTH )");
2328 SMESH_CATCH( SMESH::throwCorbaException );
2332 //=============================================================================
2336 //=============================================================================
2338 void SMESH_MeshEditor_i::RenumberNodes()
2339 throw (SALOME::SALOME_Exception)
2342 // Update Python script
2343 TPythonDump() << this << ".RenumberNodes()";
2345 getMeshDS()->Renumber( true );
2347 SMESH_CATCH( SMESH::throwCorbaException );
2350 //=============================================================================
2354 //=============================================================================
2356 void SMESH_MeshEditor_i::RenumberElements()
2357 throw (SALOME::SALOME_Exception)
2360 // Update Python script
2361 TPythonDump() << this << ".RenumberElements()";
2363 getMeshDS()->Renumber( false );
2365 SMESH_CATCH( SMESH::throwCorbaException );
2368 //=======================================================================
2370 * \brief Return groups by their IDs
2372 //=======================================================================
2374 SMESH::ListOfGroups* SMESH_MeshEditor_i::getGroups(const std::list<int>* groupIDs)
2375 throw (SALOME::SALOME_Exception)
2380 myMesh_i->CreateGroupServants();
2381 return myMesh_i->GetGroups( *groupIDs );
2383 SMESH_CATCH( SMESH::throwCorbaException );
2387 //=======================================================================
2388 //function : rotationSweep
2390 //=======================================================================
2392 SMESH::ListOfGroups*
2393 SMESH_MeshEditor_i::rotationSweep(const SMESH::long_array & theIDsOfElements,
2394 const SMESH::AxisStruct & theAxis,
2395 CORBA::Double theAngleInRadians,
2396 CORBA::Long theNbOfSteps,
2397 CORBA::Double theTolerance,
2398 const bool theMakeGroups,
2399 const SMDSAbs_ElementType theElementType)
2400 throw (SALOME::SALOME_Exception)
2405 TIDSortedElemSet inElements, copyElements;
2406 arrayToSet(theIDsOfElements, getMeshDS(), inElements, theElementType);
2408 TIDSortedElemSet* workElements = & inElements;
2409 bool makeWalls=true;
2410 if ( myIsPreviewMode )
2412 SMDSAbs_ElementType select = SMDSAbs_All, avoid = SMDSAbs_Volume;
2413 getPreviewMesh( SMDSAbs_Face )->Copy( inElements, copyElements, select, avoid );
2414 workElements = & copyElements;
2415 //makeWalls = false;
2418 gp_Ax1 Ax1 (gp_Pnt( theAxis.x, theAxis.y, theAxis.z ),
2419 gp_Vec( theAxis.vx, theAxis.vy, theAxis.vz ));
2421 ::SMESH_MeshEditor::PGroupIDs groupIds =
2422 getEditor().RotationSweep (*workElements, Ax1, theAngleInRadians,
2423 theNbOfSteps, theTolerance, theMakeGroups, makeWalls);
2425 declareMeshModified( /*isReComputeSafe=*/true ); // does not influence Compute()
2427 return theMakeGroups ? getGroups(groupIds.get()) : 0;
2429 SMESH_CATCH( SMESH::throwCorbaException );
2433 //=======================================================================
2434 //function : RotationSweep
2436 //=======================================================================
2438 void SMESH_MeshEditor_i::RotationSweep(const SMESH::long_array & theIDsOfElements,
2439 const SMESH::AxisStruct & theAxis,
2440 CORBA::Double theAngleInRadians,
2441 CORBA::Long theNbOfSteps,
2442 CORBA::Double theTolerance)
2443 throw (SALOME::SALOME_Exception)
2445 if ( !myIsPreviewMode ) {
2446 TPythonDump() << this << ".RotationSweep( "
2447 << theIDsOfElements << ", "
2449 << TVar( theAngleInRadians ) << ", "
2450 << TVar( theNbOfSteps ) << ", "
2451 << TVar( theTolerance ) << " )";
2453 rotationSweep(theIDsOfElements,
2461 //=======================================================================
2462 //function : RotationSweepMakeGroups
2464 //=======================================================================
2466 SMESH::ListOfGroups*
2467 SMESH_MeshEditor_i::RotationSweepMakeGroups(const SMESH::long_array& theIDsOfElements,
2468 const SMESH::AxisStruct& theAxis,
2469 CORBA::Double theAngleInRadians,
2470 CORBA::Long theNbOfSteps,
2471 CORBA::Double theTolerance)
2472 throw (SALOME::SALOME_Exception)
2474 TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
2476 SMESH::ListOfGroups *aGroups = rotationSweep(theIDsOfElements,
2482 if (!myIsPreviewMode) {
2483 dumpGroupsList(aPythonDump, aGroups);
2484 aPythonDump << this << ".RotationSweepMakeGroups( "
2485 << theIDsOfElements << ", "
2487 << TVar( theAngleInRadians ) << ", "
2488 << TVar( theNbOfSteps ) << ", "
2489 << TVar( theTolerance ) << " )";
2494 //=======================================================================
2495 //function : RotationSweepObject
2497 //=======================================================================
2499 void SMESH_MeshEditor_i::RotationSweepObject(SMESH::SMESH_IDSource_ptr theObject,
2500 const SMESH::AxisStruct & theAxis,
2501 CORBA::Double theAngleInRadians,
2502 CORBA::Long theNbOfSteps,
2503 CORBA::Double theTolerance)
2504 throw (SALOME::SALOME_Exception)
2506 if ( !myIsPreviewMode ) {
2507 TPythonDump() << this << ".RotationSweepObject( "
2508 << theObject << ", "
2510 << theAngleInRadians << ", "
2511 << theNbOfSteps << ", "
2512 << theTolerance << " )";
2514 prepareIdSource( theObject );
2515 SMESH::long_array_var anElementsId = theObject->GetIDs();
2516 rotationSweep(anElementsId,
2524 //=======================================================================
2525 //function : RotationSweepObject1D
2527 //=======================================================================
2529 void SMESH_MeshEditor_i::RotationSweepObject1D(SMESH::SMESH_IDSource_ptr theObject,
2530 const SMESH::AxisStruct & theAxis,
2531 CORBA::Double theAngleInRadians,
2532 CORBA::Long theNbOfSteps,
2533 CORBA::Double theTolerance)
2534 throw (SALOME::SALOME_Exception)
2536 if ( !myIsPreviewMode ) {
2537 TPythonDump() << this << ".RotationSweepObject1D( "
2538 << theObject << ", "
2540 << TVar( theAngleInRadians ) << ", "
2541 << TVar( theNbOfSteps ) << ", "
2542 << TVar( theTolerance ) << " )";
2544 prepareIdSource( theObject );
2545 SMESH::long_array_var anElementsId = theObject->GetIDs();
2546 rotationSweep(anElementsId,
2555 //=======================================================================
2556 //function : RotationSweepObject2D
2558 //=======================================================================
2560 void SMESH_MeshEditor_i::RotationSweepObject2D(SMESH::SMESH_IDSource_ptr theObject,
2561 const SMESH::AxisStruct & theAxis,
2562 CORBA::Double theAngleInRadians,
2563 CORBA::Long theNbOfSteps,
2564 CORBA::Double theTolerance)
2565 throw (SALOME::SALOME_Exception)
2567 if ( !myIsPreviewMode ) {
2568 TPythonDump() << this << ".RotationSweepObject2D( "
2569 << theObject << ", "
2571 << TVar( theAngleInRadians ) << ", "
2572 << TVar( theNbOfSteps ) << ", "
2573 << TVar( theTolerance ) << " )";
2575 prepareIdSource( theObject );
2576 SMESH::long_array_var anElementsId = theObject->GetIDs();
2577 rotationSweep(anElementsId,
2586 //=======================================================================
2587 //function : RotationSweepObjectMakeGroups
2589 //=======================================================================
2591 SMESH::ListOfGroups*
2592 SMESH_MeshEditor_i::RotationSweepObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObject,
2593 const SMESH::AxisStruct& theAxis,
2594 CORBA::Double theAngleInRadians,
2595 CORBA::Long theNbOfSteps,
2596 CORBA::Double theTolerance)
2597 throw (SALOME::SALOME_Exception)
2599 TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
2601 prepareIdSource( theObject );
2602 SMESH::long_array_var anElementsId = theObject->GetIDs();
2603 SMESH::ListOfGroups *aGroups = rotationSweep(anElementsId,
2609 if (!myIsPreviewMode) {
2610 dumpGroupsList(aPythonDump, aGroups);
2611 aPythonDump << this << ".RotationSweepObjectMakeGroups( "
2612 << theObject << ", "
2614 << theAngleInRadians << ", "
2615 << theNbOfSteps << ", "
2616 << theTolerance << " )";
2621 //=======================================================================
2622 //function : RotationSweepObject1DMakeGroups
2624 //=======================================================================
2626 SMESH::ListOfGroups*
2627 SMESH_MeshEditor_i::RotationSweepObject1DMakeGroups(SMESH::SMESH_IDSource_ptr theObject,
2628 const SMESH::AxisStruct& theAxis,
2629 CORBA::Double theAngleInRadians,
2630 CORBA::Long theNbOfSteps,
2631 CORBA::Double theTolerance)
2632 throw (SALOME::SALOME_Exception)
2634 TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
2636 prepareIdSource( theObject );
2637 SMESH::long_array_var anElementsId = theObject->GetIDs();
2638 SMESH::ListOfGroups *aGroups = rotationSweep(anElementsId,
2645 if (!myIsPreviewMode) {
2646 dumpGroupsList(aPythonDump, aGroups);
2647 aPythonDump << this << ".RotationSweepObject1DMakeGroups( "
2648 << theObject << ", "
2650 << TVar( theAngleInRadians ) << ", "
2651 << TVar( theNbOfSteps ) << ", "
2652 << TVar( theTolerance ) << " )";
2657 //=======================================================================
2658 //function : RotationSweepObject2DMakeGroups
2660 //=======================================================================
2662 SMESH::ListOfGroups*
2663 SMESH_MeshEditor_i::RotationSweepObject2DMakeGroups(SMESH::SMESH_IDSource_ptr theObject,
2664 const SMESH::AxisStruct& theAxis,
2665 CORBA::Double theAngleInRadians,
2666 CORBA::Long theNbOfSteps,
2667 CORBA::Double theTolerance)
2668 throw (SALOME::SALOME_Exception)
2670 TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
2672 prepareIdSource( theObject );
2673 SMESH::long_array_var anElementsId = theObject->GetIDs();
2674 SMESH::ListOfGroups *aGroups = rotationSweep(anElementsId,
2681 if (!myIsPreviewMode) {
2682 dumpGroupsList(aPythonDump, aGroups);
2683 aPythonDump << this << ".RotationSweepObject2DMakeGroups( "
2684 << theObject << ", "
2686 << TVar( theAngleInRadians ) << ", "
2687 << TVar( theNbOfSteps ) << ", "
2688 << TVar( theTolerance ) << " )";
2693 namespace MeshEditor_I
2696 * \brief Structure used to pass extrusion parameters to ::SMESH_MeshEditor
2698 struct ExtrusionParams : public ::SMESH_MeshEditor::ExtrusParam
2700 bool myIsExtrusionByNormal;
2702 static int makeFlags( CORBA::Boolean MakeGroups,
2703 CORBA::Boolean ByAverageNormal = false,
2704 CORBA::Boolean UseInputElemsOnly = false,
2705 CORBA::Long Flags = 0,
2706 CORBA::Boolean MakeBoundary = true )
2708 if ( MakeGroups ) Flags |= ::SMESH_MeshEditor::EXTRUSION_FLAG_GROUPS;
2709 if ( ByAverageNormal ) Flags |= ::SMESH_MeshEditor::EXTRUSION_FLAG_BY_AVG_NORMAL;
2710 if ( UseInputElemsOnly) Flags |= ::SMESH_MeshEditor::EXTRUSION_FLAG_USE_INPUT_ELEMS_ONLY;
2711 if ( MakeBoundary ) Flags |= ::SMESH_MeshEditor::EXTRUSION_FLAG_BOUNDARY;
2715 ExtrusionParams(const SMESH::DirStruct & theDir,
2716 CORBA::Long theNbOfSteps,
2717 CORBA::Boolean theMakeGroups):
2718 ::SMESH_MeshEditor::ExtrusParam ( gp_Vec( theDir.PS.x,
2722 makeFlags( theMakeGroups )),
2723 myIsExtrusionByNormal( false )
2727 ExtrusionParams(const SMESH::DirStruct & theDir,
2728 CORBA::Long theNbOfSteps,
2729 CORBA::Boolean theMakeGroups,
2730 CORBA::Long theExtrFlags,
2731 CORBA::Double theSewTolerance):
2732 ::SMESH_MeshEditor::ExtrusParam ( gp_Vec( theDir.PS.x,
2736 makeFlags( theMakeGroups, false, false,
2737 theExtrFlags, false ),
2739 myIsExtrusionByNormal( false )
2742 // params for extrusion by normal
2743 ExtrusionParams(CORBA::Double theStepSize,
2744 CORBA::Long theNbOfSteps,
2745 CORBA::Short theDim,
2746 CORBA::Boolean theUseInputElemsOnly,
2747 CORBA::Boolean theByAverageNormal,
2748 CORBA::Boolean theMakeGroups ):
2749 ::SMESH_MeshEditor::ExtrusParam ( theStepSize,
2751 makeFlags( theMakeGroups,
2752 theByAverageNormal, theUseInputElemsOnly ),
2754 myIsExtrusionByNormal( true )
2760 Flags() &= ~(::SMESH_MeshEditor::EXTRUSION_FLAG_GROUPS);
2765 //=======================================================================
2766 //function : extrusionSweep
2768 //=======================================================================
2770 SMESH::ListOfGroups*
2771 SMESH_MeshEditor_i::extrusionSweep(const SMESH::long_array & theIDsOfElements,
2772 MeshEditor_I::ExtrusionParams& theParams,
2773 const SMDSAbs_ElementType theElementType)
2774 throw (SALOME::SALOME_Exception)
2779 TIDSortedElemSet elements, copyElements;
2780 arrayToSet( theIDsOfElements, getMeshDS(), elements, theElementType );
2782 TIDSortedElemSet* workElements = & elements;
2784 if ( myIsPreviewMode )
2786 SMDSAbs_ElementType previewType = SMDSAbs_Face;
2787 if (theElementType == SMDSAbs_Node)
2788 previewType = SMDSAbs_Edge;
2790 SMDSAbs_ElementType select = SMDSAbs_All, avoid = SMDSAbs_Volume;
2791 getPreviewMesh( previewType )->Copy( elements, copyElements, select, avoid );
2792 workElements = & copyElements;
2793 theParams.SetNoGroups();
2795 if ( theParams.myIsExtrusionByNormal && !theParams.ToUseInpElemsOnly() )
2797 TIDSortedElemSet elemsAround, elemsAroundCopy;
2798 getElementsAround( elements, getMeshDS(), elemsAround );
2799 getPreviewMesh( previewType )->Copy( elemsAround, elemsAroundCopy, select, avoid );
2803 ::SMESH_MeshEditor::TTElemOfElemListMap aHystory;
2804 ::SMESH_MeshEditor::PGroupIDs groupIds =
2805 getEditor().ExtrusionSweep (*workElements, theParams, aHystory );
2807 declareMeshModified( /*isReComputeSafe=*/true ); // does not influence Compute()
2809 return theParams.ToMakeGroups() ? getGroups(groupIds.get()) : 0;
2811 SMESH_CATCH( SMESH::throwCorbaException );
2815 //=======================================================================
2816 //function : ExtrusionSweep
2818 //=======================================================================
2820 void SMESH_MeshEditor_i::ExtrusionSweep(const SMESH::long_array & theIDsOfElements,
2821 const SMESH::DirStruct & theStepVector,
2822 CORBA::Long theNbOfSteps)
2823 throw (SALOME::SALOME_Exception)
2825 ExtrusionParams params( theStepVector, theNbOfSteps, false );
2826 extrusionSweep( theIDsOfElements, params );
2827 if (!myIsPreviewMode) {
2828 TPythonDump() << this << ".ExtrusionSweep( "
2829 << theIDsOfElements << ", " << theStepVector <<", " << TVar(theNbOfSteps) << " )";
2833 //=======================================================================
2834 //function : ExtrusionSweep0D
2836 //=======================================================================
2838 void SMESH_MeshEditor_i::ExtrusionSweep0D(const SMESH::long_array & theIDsOfElements,
2839 const SMESH::DirStruct & theStepVector,
2840 CORBA::Long theNbOfSteps)
2841 throw (SALOME::SALOME_Exception)
2843 ExtrusionParams params( theStepVector, theNbOfSteps, false );
2844 extrusionSweep( theIDsOfElements, params, SMDSAbs_Node );
2845 if (!myIsPreviewMode) {
2846 TPythonDump() << this << ".ExtrusionSweep0D( "
2847 << theIDsOfElements << ", " << theStepVector <<", " << TVar(theNbOfSteps)<< " )";
2851 //=======================================================================
2852 //function : ExtrusionSweepObject
2854 //=======================================================================
2856 void SMESH_MeshEditor_i::ExtrusionSweepObject(SMESH::SMESH_IDSource_ptr theObject,
2857 const SMESH::DirStruct & theStepVector,
2858 CORBA::Long theNbOfSteps)
2859 throw (SALOME::SALOME_Exception)
2861 prepareIdSource( theObject );
2862 SMESH::long_array_var anElementsId = theObject->GetIDs();
2863 ExtrusionParams params( theStepVector, theNbOfSteps, false );
2864 extrusionSweep( anElementsId, params );
2865 if (!myIsPreviewMode) {
2866 TPythonDump() << this << ".ExtrusionSweepObject( "
2867 << theObject << ", " << theStepVector << ", " << theNbOfSteps << " )";
2871 //=======================================================================
2872 //function : ExtrusionSweepObject0D
2874 //=======================================================================
2876 void SMESH_MeshEditor_i::ExtrusionSweepObject0D(SMESH::SMESH_IDSource_ptr theObject,
2877 const SMESH::DirStruct & theStepVector,
2878 CORBA::Long theNbOfSteps)
2879 throw (SALOME::SALOME_Exception)
2881 prepareIdSource( theObject );
2882 SMESH::long_array_var anElementsId = theObject->GetIDs();
2883 if ( anElementsId->length() == 0 )
2884 if ( SMESH_Mesh_i* mesh = SMESH::DownCast<SMESH_Mesh_i*>( theObject ))
2885 anElementsId = mesh->GetNodesId();
2887 ExtrusionParams params( theStepVector, theNbOfSteps, false );
2888 extrusionSweep( anElementsId, params, SMDSAbs_Node );
2889 if ( !myIsPreviewMode ) {
2890 TPythonDump() << this << ".ExtrusionSweepObject0D( "
2891 << theObject << ", " << theStepVector << ", " << TVar( theNbOfSteps ) << " )";
2895 //=======================================================================
2896 //function : ExtrusionSweepObject1D
2898 //=======================================================================
2900 void SMESH_MeshEditor_i::ExtrusionSweepObject1D(SMESH::SMESH_IDSource_ptr theObject,
2901 const SMESH::DirStruct & theStepVector,
2902 CORBA::Long theNbOfSteps)
2903 throw (SALOME::SALOME_Exception)
2905 prepareIdSource( theObject );
2906 SMESH::long_array_var anElementsId = theObject->GetIDs();
2907 ExtrusionParams params( theStepVector, theNbOfSteps, false );
2908 extrusionSweep( anElementsId, params, SMDSAbs_Edge );
2909 if ( !myIsPreviewMode ) {
2910 TPythonDump() << this << ".ExtrusionSweepObject1D( "
2911 << theObject << ", " << theStepVector << ", " << TVar( theNbOfSteps ) << " )";
2915 //=======================================================================
2916 //function : ExtrusionSweepObject2D
2918 //=======================================================================
2920 void SMESH_MeshEditor_i::ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObject,
2921 const SMESH::DirStruct & theStepVector,
2922 CORBA::Long theNbOfSteps)
2923 throw (SALOME::SALOME_Exception)
2925 prepareIdSource( theObject );
2926 SMESH::long_array_var anElementsId = theObject->GetIDs();
2927 ExtrusionParams params( theStepVector, theNbOfSteps, false );
2928 extrusionSweep( anElementsId, params, SMDSAbs_Face );
2929 if ( !myIsPreviewMode ) {
2930 TPythonDump() << this << ".ExtrusionSweepObject2D( "
2931 << theObject << ", " << theStepVector << ", " << TVar( theNbOfSteps ) << " )";
2935 //=======================================================================
2936 //function : ExtrusionSweepMakeGroups
2938 //=======================================================================
2940 SMESH::ListOfGroups*
2941 SMESH_MeshEditor_i::ExtrusionSweepMakeGroups(const SMESH::long_array& theIDsOfElements,
2942 const SMESH::DirStruct& theStepVector,
2943 CORBA::Long theNbOfSteps)
2944 throw (SALOME::SALOME_Exception)
2946 TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
2948 ExtrusionParams params( theStepVector, theNbOfSteps, true );
2949 SMESH::ListOfGroups* aGroups = extrusionSweep( theIDsOfElements, params );
2951 if (!myIsPreviewMode) {
2952 dumpGroupsList(aPythonDump, aGroups);
2953 aPythonDump << this << ".ExtrusionSweepMakeGroups( " << theIDsOfElements
2954 << ", " << theStepVector <<", " << TVar( theNbOfSteps ) << " )";
2959 //=======================================================================
2960 //function : ExtrusionSweepMakeGroups0D
2962 //=======================================================================
2964 SMESH::ListOfGroups*
2965 SMESH_MeshEditor_i::ExtrusionSweepMakeGroups0D(const SMESH::long_array& theIDsOfElements,
2966 const SMESH::DirStruct& theStepVector,
2967 CORBA::Long theNbOfSteps)
2968 throw (SALOME::SALOME_Exception)
2970 TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
2972 ExtrusionParams params( theStepVector, theNbOfSteps, true );
2973 SMESH::ListOfGroups* aGroups = extrusionSweep( theIDsOfElements, params, SMDSAbs_Node );
2975 if (!myIsPreviewMode) {
2976 dumpGroupsList(aPythonDump, aGroups);
2977 aPythonDump << this << ".ExtrusionSweepMakeGroups0D( " << theIDsOfElements
2978 << ", " << theStepVector <<", " << TVar( theNbOfSteps ) << " )";
2983 //=======================================================================
2984 //function : ExtrusionSweepObjectMakeGroups
2986 //=======================================================================
2988 SMESH::ListOfGroups*
2989 SMESH_MeshEditor_i::ExtrusionSweepObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObject,
2990 const SMESH::DirStruct& theStepVector,
2991 CORBA::Long theNbOfSteps)
2992 throw (SALOME::SALOME_Exception)
2994 TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
2996 prepareIdSource( theObject );
2997 SMESH::long_array_var anElementsId = theObject->GetIDs();
2998 ExtrusionParams params( theStepVector, theNbOfSteps, true );
2999 SMESH::ListOfGroups* aGroups = extrusionSweep( anElementsId, params );
3001 if (!myIsPreviewMode) {
3002 dumpGroupsList(aPythonDump, aGroups);
3003 aPythonDump << this << ".ExtrusionSweepObjectMakeGroups( " << theObject
3004 << ", " << theStepVector << ", " << theNbOfSteps << " )";
3009 //=======================================================================
3010 //function : ExtrusionSweepObject0DMakeGroups
3012 //=======================================================================
3014 SMESH::ListOfGroups*
3015 SMESH_MeshEditor_i::ExtrusionSweepObject0DMakeGroups(SMESH::SMESH_IDSource_ptr theObject,
3016 const SMESH::DirStruct& theStepVector,
3017 CORBA::Long theNbOfSteps)
3018 throw (SALOME::SALOME_Exception)
3020 TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
3022 prepareIdSource( theObject );
3023 SMESH::long_array_var anElementsId = theObject->GetIDs();
3024 ExtrusionParams params( theStepVector, theNbOfSteps, true );
3025 SMESH::ListOfGroups* aGroups = extrusionSweep( anElementsId, params, SMDSAbs_Node );
3027 if (!myIsPreviewMode) {
3028 dumpGroupsList(aPythonDump, aGroups);
3029 aPythonDump << this << ".ExtrusionSweepObject0DMakeGroups( " << theObject
3030 << ", " << theStepVector << ", " << TVar( theNbOfSteps ) << " )";
3035 //=======================================================================
3036 //function : ExtrusionSweepObject1DMakeGroups
3038 //=======================================================================
3040 SMESH::ListOfGroups*
3041 SMESH_MeshEditor_i::ExtrusionSweepObject1DMakeGroups(SMESH::SMESH_IDSource_ptr theObject,
3042 const SMESH::DirStruct& theStepVector,
3043 CORBA::Long theNbOfSteps)
3044 throw (SALOME::SALOME_Exception)