+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+
+CORBA::Long SMESH_MeshEditor_i::AddEdge(const SMESH::long_array & IDsOfNodes)
+{
+ initData();
+
+ int NbNodes = IDsOfNodes.length();
+ SMDS_MeshElement* elem = 0;
+ if (NbNodes == 2)
+ {
+ CORBA::Long index1 = IDsOfNodes[0];
+ CORBA::Long index2 = IDsOfNodes[1];
+ elem = GetMeshDS()->AddEdge(GetMeshDS()->FindNode(index1), GetMeshDS()->FindNode(index2));
+
+ // Update Python script
+ TPythonDump() << "edge = " << this << ".AddEdge([ "
+ << index1 << ", " << index2 <<" ])";
+ }
+ if (NbNodes == 3) {
+ CORBA::Long n1 = IDsOfNodes[0];
+ CORBA::Long n2 = IDsOfNodes[1];
+ CORBA::Long n12 = IDsOfNodes[2];
+ elem = GetMeshDS()->AddEdge(GetMeshDS()->FindNode(n1),
+ GetMeshDS()->FindNode(n2),
+ GetMeshDS()->FindNode(n12));
+ // Update Python script
+ TPythonDump() << "edgeID = " << this << ".AddEdge([ "
+ <<n1<<", "<<n2<<", "<<n12<<" ])";
+ }
+
+ if(elem)
+ return elem->GetID();
+
+ return 0;
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+
+CORBA::Long SMESH_MeshEditor_i::AddNode(CORBA::Double x,
+ CORBA::Double y, CORBA::Double z)
+{
+ initData();
+
+ const SMDS_MeshNode* N = GetMeshDS()->AddNode(x, y, z);
+
+ // Update Python script
+ TPythonDump() << "nodeID = " << this << ".AddNode( "
+ << x << ", " << y << ", " << z << " )";
+
+ return N->GetID();
+}
+
+//=============================================================================
+/*!
+ * AddFace
+ */
+//=============================================================================
+
+CORBA::Long SMESH_MeshEditor_i::AddFace(const SMESH::long_array & IDsOfNodes)
+{
+ initData();
+
+ int NbNodes = IDsOfNodes.length();
+ if (NbNodes < 3)
+ {
+ return false;
+ }
+
+ std::vector<const SMDS_MeshNode*> nodes (NbNodes);
+ for (int i = 0; i < NbNodes; i++)
+ nodes[i] = GetMeshDS()->FindNode(IDsOfNodes[i]);
+
+ SMDS_MeshElement* elem = 0;
+ if (NbNodes == 3) {
+ elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2]);
+ }
+ else if (NbNodes == 4) {
+ elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3]);
+ }
+ else if (NbNodes == 6) {
+ elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3],
+ nodes[4], nodes[5]);
+ }
+ else if (NbNodes == 8) {
+ elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3],
+ nodes[4], nodes[5], nodes[6], nodes[7]);
+ }
+
+ // Update Python script
+ TPythonDump() << "faceID = " << this << ".AddFace( " << IDsOfNodes << " )";
+
+ if(elem)
+ return elem->GetID();
+
+ return 0;
+}
+
+//=============================================================================
+/*!
+ * AddPolygonalFace
+ */
+//=============================================================================
+CORBA::Long SMESH_MeshEditor_i::AddPolygonalFace
+ (const SMESH::long_array & IDsOfNodes)
+{
+ initData();
+
+ int NbNodes = IDsOfNodes.length();
+ std::vector<const SMDS_MeshNode*> nodes (NbNodes);
+ for (int i = 0; i < NbNodes; i++)
+ nodes[i] = GetMeshDS()->FindNode(IDsOfNodes[i]);
+
+ const SMDS_MeshElement* elem = GetMeshDS()->AddPolygonalFace(nodes);
+
+ // Update Python script
+ TPythonDump() <<"faceID = "<<this<<".AddPolygonalFace( "<<IDsOfNodes<<" )";
+#ifdef _DEBUG_
+ TPythonDump() << "print 'AddPolygonalFace: ', faceID";
+#endif
+
+ if(elem)
+ return elem->GetID();
+
+ return 0;
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+
+CORBA::Long SMESH_MeshEditor_i::AddVolume(const SMESH::long_array & IDsOfNodes)
+{
+ initData();
+
+ int NbNodes = IDsOfNodes.length();
+ vector< const SMDS_MeshNode*> n(NbNodes);
+ for(int i=0;i<NbNodes;i++)
+ n[i]=GetMeshDS()->FindNode(IDsOfNodes[i]);
+
+ SMDS_MeshElement* elem = 0;
+ switch(NbNodes)
+ {
+ case 4 :elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3]); break;
+ case 5 :elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4]); break;
+ case 6 :elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5]); break;
+ case 8 :elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7]); break;
+ case 10:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],
+ n[6],n[7],n[8],n[9]);
+ break;
+ case 13:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],
+ n[7],n[8],n[9],n[10],n[11],n[12]);
+ break;
+ case 15:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],
+ n[9],n[10],n[11],n[12],n[13],n[14]);
+ break;
+ case 20:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],
+ n[8],n[9],n[10],n[11],n[12],n[13],n[14],
+ n[15],n[16],n[17],n[18],n[19]);
+ break;
+ }
+
+ // Update Python script
+ TPythonDump() << "volID = " << this << ".AddVolume( " << IDsOfNodes << " )";
+#ifdef _DEBUG_
+ TPythonDump() << "print 'AddVolume: ', volID";
+#endif
+
+ if(elem)
+ return elem->GetID();
+
+ return 0;
+}
+
+//=============================================================================
+/*!
+ * AddPolyhedralVolume
+ */
+//=============================================================================
+CORBA::Long SMESH_MeshEditor_i::AddPolyhedralVolume
+ (const SMESH::long_array & IDsOfNodes,
+ const SMESH::long_array & Quantities)
+{
+ initData();
+
+ int NbNodes = IDsOfNodes.length();
+ std::vector<const SMDS_MeshNode*> n (NbNodes);
+ for (int i = 0; i < NbNodes; i++)
+ n[i] = GetMeshDS()->FindNode(IDsOfNodes[i]);
+
+ int NbFaces = Quantities.length();
+ std::vector<int> q (NbFaces);
+ for (int j = 0; j < NbFaces; j++)
+ q[j] = Quantities[j];
+
+ const SMDS_MeshElement* elem = GetMeshDS()->AddPolyhedralVolume(n, q);
+
+ // Update Python script
+ TPythonDump() << "volID = " << this << ".AddPolyhedralVolume( "
+ << IDsOfNodes << ", " << Quantities << " )";
+#ifdef _DEBUG_
+ TPythonDump() << "print 'AddPolyhedralVolume: ', volID";
+#endif
+
+ if(elem)
+ return elem->GetID();
+
+ return 0;
+}
+
+//=============================================================================
+/*!
+ * AddPolyhedralVolumeByFaces
+ */
+//=============================================================================
+CORBA::Long SMESH_MeshEditor_i::AddPolyhedralVolumeByFaces
+ (const SMESH::long_array & IdsOfFaces)
+{
+ initData();
+
+ int NbFaces = IdsOfFaces.length();
+ std::vector<const SMDS_MeshNode*> poly_nodes;
+ std::vector<int> quantities (NbFaces);
+
+ for (int i = 0; i < NbFaces; i++) {
+ const SMDS_MeshElement* aFace = GetMeshDS()->FindElement(IdsOfFaces[i]);
+ quantities[i] = aFace->NbNodes();
+
+ SMDS_ElemIteratorPtr It = aFace->nodesIterator();
+ while (It->more()) {
+ poly_nodes.push_back(static_cast<const SMDS_MeshNode *>(It->next()));
+ }
+ }
+
+ const SMDS_MeshElement* elem = GetMeshDS()->AddPolyhedralVolume(poly_nodes, quantities);
+
+ // Update Python script
+ TPythonDump() << "volID = " << this << ".AddPolyhedralVolumeByFaces( "
+ << IdsOfFaces << " )";
+#ifdef _DEBUG_
+ TPythonDump() << "print 'AddPolyhedralVolume: ', volID";
+#endif
+
+ if(elem)
+ return elem->GetID();
+
+ return 0;
+}
+
+//=============================================================================
+/*!
+ * \brief Bind a node to a vertex
+ * \param NodeID - node ID
+ * \param VertexID - vertex ID available through GEOM_Object.GetSubShapeIndices()[0]
+ * \retval boolean - false if NodeID or VertexID is invalid
+ */
+//=============================================================================
+
+void SMESH_MeshEditor_i::SetNodeOnVertex(CORBA::Long NodeID, CORBA::Long VertexID)
+ throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+
+ SMESHDS_Mesh * mesh = GetMeshDS();
+ SMDS_MeshNode* node = const_cast<SMDS_MeshNode*>( mesh->FindNode(NodeID) );
+ if ( !node )
+ THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM);
+
+ if ( mesh->MaxShapeIndex() < VertexID )
+ THROW_SALOME_CORBA_EXCEPTION("Invalid VertexID", SALOME::BAD_PARAM);
+
+ TopoDS_Shape shape = mesh->IndexToShape( VertexID );
+ if ( shape.ShapeType() != TopAbs_VERTEX )
+ THROW_SALOME_CORBA_EXCEPTION("Invalid VertexID", SALOME::BAD_PARAM);
+
+ mesh->SetNodeOnVertex( node, VertexID );
+}