PyObject* FemMeshPy::addVolume(PyObject *args) { int n1,n2,n3,n4; if (!PyArg_ParseTuple(args, "iiii",&n1,&n2,&n3,&n4)) return 0; try { SMESH_Mesh* mesh = getFemMeshPtr()->getSMesh(); SMESHDS_Mesh* meshDS = mesh->GetMeshDS(); const SMDS_MeshNode* node1 = meshDS->FindNode(n1); const SMDS_MeshNode* node2 = meshDS->FindNode(n2); const SMDS_MeshNode* node3 = meshDS->FindNode(n3); const SMDS_MeshNode* node4 = meshDS->FindNode(n4); if (!node1 || !node2 || !node3 || !node4) throw std::runtime_error("Failed to get node of the given indices"); SMDS_MeshVolume* vol = meshDS->AddVolume(node1, node2, node3, node4); if (!vol) throw std::runtime_error("Failed to add volume"); return Py::new_reference_to(Py::Int(vol->GetID())); } catch (const std::exception& e) { PyErr_SetString(PyExc_Exception, e.what()); return 0; } }
PyObject* FemMeshPy::addQuad(PyObject *args) { int n1,n2,n3,n4; if (!PyArg_ParseTuple(args, "iiii",&n1,&n2,&n3,&n4)) return 0; try { SMESH_Mesh* mesh = getFemMeshPtr()->getSMesh(); SMESHDS_Mesh* meshDS = mesh->GetMeshDS(); const SMDS_MeshNode* node1 = meshDS->FindNode(n1); const SMDS_MeshNode* node2 = meshDS->FindNode(n2); const SMDS_MeshNode* node3 = meshDS->FindNode(n3); const SMDS_MeshNode* node4 = meshDS->FindNode(n4); if (!node1 || !node2 || !node3 || !node4) throw std::runtime_error("Failed to get node of the given indices"); SMDS_MeshFace* face = meshDS->AddFace(node1, node2, node3, node4); if (!face) throw std::runtime_error("Failed to add quad"); return Py::new_reference_to(Py::Long(face->GetID())); } catch (const std::exception& e) { PyErr_SetString(Base::BaseExceptionFreeCADError, e.what()); return 0; } }
PyObject* FemMeshPy::addEdge(PyObject *args) { int n1,n2; if (!PyArg_ParseTuple(args, "ii",&n1,&n2)) return 0; try { SMESH_Mesh* mesh = getFemMeshPtr()->getSMesh(); SMESHDS_Mesh* meshDS = mesh->GetMeshDS(); const SMDS_MeshNode* node1 = meshDS->FindNode(n1); const SMDS_MeshNode* node2 = meshDS->FindNode(n2); if (!node1 || !node2) throw std::runtime_error("Failed to get node of the given indices"); SMDS_MeshEdge* edge = meshDS->AddEdge(node1, node2); if (!edge) throw std::runtime_error("Failed to add edge"); return Py::new_reference_to(Py::Int(edge->GetID())); } catch (const std::exception& e) { PyErr_SetString(PyExc_Exception, e.what()); return 0; } }
PyObject* FemMeshPy::addVolume(PyObject *args) { SMESH_Mesh* mesh = getFemMeshPtr()->getSMesh(); SMESHDS_Mesh* meshDS = mesh->GetMeshDS(); int n1,n2,n3,n4; if (PyArg_ParseTuple(args, "iiii",&n1,&n2,&n3,&n4)) { try { const SMDS_MeshNode* node1 = meshDS->FindNode(n1); const SMDS_MeshNode* node2 = meshDS->FindNode(n2); const SMDS_MeshNode* node3 = meshDS->FindNode(n3); const SMDS_MeshNode* node4 = meshDS->FindNode(n4); if (!node1 || !node2 || !node3 || !node4) throw std::runtime_error("Failed to get node of the given indices"); SMDS_MeshVolume* vol = meshDS->AddVolume(node1, node2, node3, node4); if (!vol) throw std::runtime_error("Failed to add volume"); return Py::new_reference_to(Py::Long(vol->GetID())); } catch (const std::exception& e) { PyErr_SetString(Base::BaseExceptionFreeCADError, e.what()); return 0; } } PyErr_Clear(); PyObject *obj; int ElementId=-1; if (PyArg_ParseTuple(args, "O!|i", &PyList_Type, &obj, &ElementId)) { Py::List list(obj); std::vector<const SMDS_MeshNode*> Nodes; for (Py::List::iterator it = list.begin(); it != list.end(); ++it) { #if PY_MAJOR_VERSION >= 3 Py::Long NoNr(*it); #else Py::Int NoNr(*it); #endif const SMDS_MeshNode* node = meshDS->FindNode(NoNr); if (!node) throw std::runtime_error("Failed to get node of the given indices"); Nodes.push_back(node); } SMDS_MeshVolume* vol=0; if(ElementId != -1) { switch(Nodes.size()){ case 4: vol = meshDS->AddVolumeWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],ElementId); if (!vol) throw std::runtime_error("Failed to add Tet4 volume with given ElementId"); break; case 5: vol = meshDS->AddVolumeWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],ElementId); if (!vol) throw std::runtime_error("Failed to add Pyra5 volume with given ElementId"); break; case 6: vol = meshDS->AddVolumeWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],ElementId); if (!vol) throw std::runtime_error("Failed to add Penta6 volume with given ElementId"); break; case 8: vol = meshDS->AddVolumeWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],ElementId); if (!vol) throw std::runtime_error("Failed to add Hexa8 volume with given ElementId"); break; case 10: vol = meshDS->AddVolumeWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],Nodes[8],Nodes[9],ElementId); if (!vol) throw std::runtime_error("Failed to add Tet10 volume with given ElementId"); break; case 13: vol = meshDS->AddVolumeWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],Nodes[8],Nodes[9],Nodes[10],Nodes[11],Nodes[12],ElementId); if (!vol) throw std::runtime_error("Failed to add Pyra13 volume with given ElementId"); break; case 15: vol = meshDS->AddVolumeWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],Nodes[8],Nodes[9],Nodes[10],Nodes[11],Nodes[12],Nodes[13],Nodes[14],ElementId); if (!vol) throw std::runtime_error("Failed to add Penta15 volume with given ElementId"); break; case 20: vol = meshDS->AddVolumeWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],Nodes[8],Nodes[9],Nodes[10],Nodes[11],Nodes[12],Nodes[13],Nodes[14],Nodes[15],Nodes[16],Nodes[17],Nodes[18],Nodes[19],ElementId); if (!vol) throw std::runtime_error("Failed to add Hexa20 volume with given ElementId"); break; default: throw std::runtime_error("Unknown node count, [4|5|6|8|10|13|15|20] are allowed"); //unknown volume type } }else{ switch(Nodes.size()){ case 4: vol = meshDS->AddVolume(Nodes[0],Nodes[1],Nodes[2],Nodes[3]); if (!vol) throw std::runtime_error("Failed to add Tet4 volume"); break; case 5: vol = meshDS->AddVolume(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4]); if (!vol) throw std::runtime_error("Failed to add Pyra5 volume"); break; case 6: vol = meshDS->AddVolume(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5]); if (!vol) throw std::runtime_error("Failed to add Penta6 volume"); break; case 8: vol = meshDS->AddVolume(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7]); if (!vol) throw std::runtime_error("Failed to add Hexa8 volume"); break; case 10: vol = meshDS->AddVolume(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],Nodes[8],Nodes[9]); if (!vol) throw std::runtime_error("Failed to add Tet10 volume"); break; case 13: vol = meshDS->AddVolume(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],Nodes[8],Nodes[9],Nodes[10],Nodes[11],Nodes[12]); if (!vol) throw std::runtime_error("Failed to add Pyra13 volume"); break; case 15: vol = meshDS->AddVolume(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],Nodes[8],Nodes[9],Nodes[10],Nodes[11],Nodes[12],Nodes[13],Nodes[14]); if (!vol) throw std::runtime_error("Failed to add Penta15 volume"); break; case 20: vol = meshDS->AddVolume(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],Nodes[8],Nodes[9],Nodes[10],Nodes[11],Nodes[12],Nodes[13],Nodes[14],Nodes[15],Nodes[16],Nodes[17],Nodes[18],Nodes[19]); if (!vol) throw std::runtime_error("Failed to add Hexa20 volume"); break; default: throw std::runtime_error("Unknown node count, [4|5|6|8|10|13|15|20] are allowed"); //unknown volume type } } return Py::new_reference_to(Py::Long(vol->GetID())); } PyErr_SetString(PyExc_TypeError, "addVolume accepts:\n" "-- int,int,int,int\n" "-- [4|5|6|8|10|13|15|20 int],[int]\n"); return 0; }
PyObject* FemMeshPy::addFace(PyObject *args) { SMESH_Mesh* mesh = getFemMeshPtr()->getSMesh(); SMESHDS_Mesh* meshDS = mesh->GetMeshDS(); int n1,n2,n3; if (PyArg_ParseTuple(args, "iii",&n1,&n2,&n3)) { // old form, deprecated try { const SMDS_MeshNode* node1 = meshDS->FindNode(n1); const SMDS_MeshNode* node2 = meshDS->FindNode(n2); const SMDS_MeshNode* node3 = meshDS->FindNode(n3); if (!node1 || !node2 || !node3) throw std::runtime_error("Failed to get node of the given indices"); SMDS_MeshFace* face = meshDS->AddFace(node1, node2, node3); if (!face) throw std::runtime_error("Failed to add face"); return Py::new_reference_to(Py::Long(face->GetID())); } catch (const std::exception& e) { PyErr_SetString(Base::BaseExceptionFreeCADError, e.what()); return 0; } } PyErr_Clear(); PyObject *obj; int ElementId=-1; if (PyArg_ParseTuple(args, "O!|i", &PyList_Type, &obj, &ElementId)) { Py::List list(obj); std::vector<const SMDS_MeshNode*> Nodes; for (Py::List::iterator it = list.begin(); it != list.end(); ++it) { #if PY_MAJOR_VERSION >= 3 Py::Long NoNr(*it); #else Py::Int NoNr(*it); #endif const SMDS_MeshNode* node = meshDS->FindNode(NoNr); if (!node) throw std::runtime_error("Failed to get node of the given indices"); Nodes.push_back(node); } SMDS_MeshFace* face=0; if(ElementId != -1) { switch(Nodes.size()){ case 3: face = meshDS->AddFaceWithID(Nodes[0],Nodes[1],Nodes[2],ElementId); if (!face) throw std::runtime_error("Failed to add triangular face with given ElementId"); break; case 4: face = meshDS->AddFaceWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],ElementId); if (!face) throw std::runtime_error("Failed to add face with given ElementId"); break; case 6: face = meshDS->AddFaceWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],ElementId); if (!face) throw std::runtime_error("Failed to add face with given ElementId"); break; case 8: face = meshDS->AddFaceWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],ElementId); if (!face) throw std::runtime_error("Failed to add face with given ElementId"); break; default: throw std::runtime_error("Unknown node count, [3|4|6|8] are allowed"); //unknown face type } }else{ switch(Nodes.size()){ case 3: face = meshDS->AddFace(Nodes[0],Nodes[1],Nodes[2]); if (!face) throw std::runtime_error("Failed to add triangular face"); break; case 4: face = meshDS->AddFace(Nodes[0],Nodes[1],Nodes[2],Nodes[3]); if (!face) throw std::runtime_error("Failed to add face"); break; case 6: face = meshDS->AddFace(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5]); if (!face) throw std::runtime_error("Failed to add face"); break; case 8: face = meshDS->AddFace(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7]); if (!face) throw std::runtime_error("Failed to add face"); break; default: throw std::runtime_error("Unknown node count, [4|5|6|8] are allowed"); //unknown face type } } return Py::new_reference_to(Py::Long(face->GetID())); } PyErr_SetString(PyExc_TypeError, "addFace accepts:\n" "-- int,int,int\n" "-- [3|4|6|8 int],[int]\n"); return 0; }
PyObject* FemMeshPy::addEdge(PyObject *args) { SMESH_Mesh* mesh = getFemMeshPtr()->getSMesh(); SMESHDS_Mesh* meshDS = mesh->GetMeshDS(); int n1,n2; if (PyArg_ParseTuple(args, "ii",&n1,&n2)) { try { const SMDS_MeshNode* node1 = meshDS->FindNode(n1); const SMDS_MeshNode* node2 = meshDS->FindNode(n2); if (!node1 || !node2) throw std::runtime_error("Failed to get node of the given indices"); SMDS_MeshEdge* edge = meshDS->AddEdge(node1, node2); if (!edge) throw std::runtime_error("Failed to add edge"); return Py::new_reference_to(Py::Long(edge->GetID())); } catch (const std::exception& e) { PyErr_SetString(Base::BaseExceptionFreeCADError, e.what()); return 0; } } PyErr_Clear(); PyObject *obj; int ElementId=-1; if (PyArg_ParseTuple(args, "O!|i", &PyList_Type, &obj, &ElementId)) { Py::List list(obj); std::vector<const SMDS_MeshNode*> Nodes; for (Py::List::iterator it = list.begin(); it != list.end(); ++it) { #if PY_MAJOR_VERSION >= 3 Py::Long NoNr(*it); #else Py::Int NoNr(*it); #endif const SMDS_MeshNode* node = meshDS->FindNode(NoNr); if (!node) throw std::runtime_error("Failed to get node of the given indices"); Nodes.push_back(node); } SMDS_MeshEdge* edge=0; if(ElementId != -1) { switch(Nodes.size()){ case 2: edge = meshDS->AddEdgeWithID(Nodes[0],Nodes[1],ElementId); if (!edge) throw std::runtime_error("Failed to add edge with given ElementId"); break; case 3: edge = meshDS->AddEdgeWithID(Nodes[0],Nodes[1],Nodes[2],ElementId); if (!edge) throw std::runtime_error("Failed to add edge with given ElementId"); break; default: throw std::runtime_error("Unknown node count, [2|3] are allowed"); //unknown edge type } } else { switch(Nodes.size()){ case 2: edge = meshDS->AddEdge(Nodes[0],Nodes[1]); if (!edge) throw std::runtime_error("Failed to add edge"); break; case 3: edge = meshDS->AddEdge(Nodes[0],Nodes[1],Nodes[2]); if (!edge) throw std::runtime_error("Failed to add edge"); break; default: throw std::runtime_error("Unknown node count, [2|3] are allowed"); //unknown edge type } } #if PY_MAJOR_VERSION >= 3 return Py::new_reference_to(Py::Long(edge->GetID())); #else return Py::new_reference_to(Py::Int(edge->GetID())); #endif } PyErr_SetString(PyExc_TypeError, "addEdge accepts:\n" "-- int,int\n" "-- [2|3],[int]\n"); return 0; }
PyObject* FemMeshPy::addVolume(PyObject *args) { SMESH_Mesh* mesh = getFemMeshPtr()->getSMesh(); SMESHDS_Mesh* meshDS = mesh->GetMeshDS(); int n1,n2,n3,n4; if (PyArg_ParseTuple(args, "iiii",&n1,&n2,&n3,&n4)) { try { const SMDS_MeshNode* node1 = meshDS->FindNode(n1); const SMDS_MeshNode* node2 = meshDS->FindNode(n2); const SMDS_MeshNode* node3 = meshDS->FindNode(n3); const SMDS_MeshNode* node4 = meshDS->FindNode(n4); if (!node1 || !node2 || !node3 || !node4) throw std::runtime_error("Failed to get node of the given indices"); SMDS_MeshVolume* vol = meshDS->AddVolume(node1, node2, node3, node4); if (!vol) throw std::runtime_error("Failed to add volume"); return Py::new_reference_to(Py::Int(vol->GetID())); } catch (const std::exception& e) { PyErr_SetString(Base::BaseExceptionFreeCADError, e.what()); return 0; } } PyErr_Clear(); PyObject *obj; int ElementId=-1; if (PyArg_ParseTuple(args, "O!|i", &PyList_Type, &obj, &ElementId)) { Py::List list(obj); std::vector<const SMDS_MeshNode*> Nodes; for (Py::List::iterator it = list.begin(); it != list.end(); ++it) { Py::Int NoNr(*it); const SMDS_MeshNode* node = meshDS->FindNode(NoNr); if (!node) throw std::runtime_error("Failed to get node of the given indices"); Nodes.push_back(node); } SMDS_MeshVolume* vol=0; if(ElementId != -1) { switch(Nodes.size()){ case 4: vol = meshDS->AddVolumeWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],ElementId); if (!vol) throw std::runtime_error("Failed to add Tet4 volume"); break; case 8: vol = meshDS->AddVolumeWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],ElementId); if (!vol) throw std::runtime_error("Failed to add Tet10 volume"); break; case 10: vol = meshDS->AddVolumeWithID(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],Nodes[8],Nodes[9],ElementId); if (!vol) throw std::runtime_error("Failed to add Tet10 volume"); break; default: throw std::runtime_error("Unknown node count, [4|5|6|8|10|13|18] are allowed"); //unknown face type } }else{ switch(Nodes.size()){ case 4: vol = meshDS->AddVolume(Nodes[0],Nodes[1],Nodes[2],Nodes[3]); if (!vol) throw std::runtime_error("Failed to add Tet4 volume"); break; case 8: vol = meshDS->AddVolume(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7]); if (!vol) throw std::runtime_error("Failed to add Tet10 volume"); break; case 10: vol = meshDS->AddVolume(Nodes[0],Nodes[1],Nodes[2],Nodes[3],Nodes[4],Nodes[5],Nodes[6],Nodes[7],Nodes[8],Nodes[9]); if (!vol) throw std::runtime_error("Failed to add Tet10 volume"); break; default: throw std::runtime_error("Unknown node count, [4|5|6|8|10|13|18] are allowed"); //unknown face type } } return Py::new_reference_to(Py::Int(vol->GetID())); } PyErr_SetString(PyExc_TypeError, "Line constructor accepts:\n" "-- empty parameter list\n" "-- Line\n" "-- Point, Point"); return 0; }
PyObject* FemMeshPy::addFace(PyObject *args) { SMESH_Mesh* mesh = getFemMeshPtr()->getSMesh(); SMESHDS_Mesh* meshDS = mesh->GetMeshDS(); int n1,n2,n3; if (PyArg_ParseTuple(args, "iii",&n1,&n2,&n3)) { // old form, debrekadet try { const SMDS_MeshNode* node1 = meshDS->FindNode(n1); const SMDS_MeshNode* node2 = meshDS->FindNode(n2); const SMDS_MeshNode* node3 = meshDS->FindNode(n3); if (!node1 || !node2 || !node3) throw std::runtime_error("Failed to get node of the given indices"); SMDS_MeshFace* face = meshDS->AddFace(node1, node2, node3); if (!face) throw std::runtime_error("Failed to add face"); return Py::new_reference_to(Py::Int(face->GetID())); } catch (const std::exception& e) { PyErr_SetString(Base::BaseExceptionFreeCADError, e.what()); return 0; } } PyErr_Clear(); PyObject *obj; int ElementId=-1; if (PyArg_ParseTuple(args, "O!|i", &PyList_Type, &obj, &ElementId)) { Py::List list(obj); std::vector<const SMDS_MeshNode*> Nodes; for (Py::List::iterator it = list.begin(); it != list.end(); ++it) { Py::Int NoNr(*it); const SMDS_MeshNode* node = meshDS->FindNode(NoNr); if (!node) throw std::runtime_error("Failed to get node of the given indices"); Nodes.push_back(node); } SMDS_MeshFace* face=0; switch(Nodes.size()){ case 3: face = meshDS->AddFace(Nodes[0],Nodes[1],Nodes[2]); if (!face) throw std::runtime_error("Failed to add triangular face"); break; default: throw std::runtime_error("Unknown node count, [3|4|6|8] are allowed"); //unknown face type } return Py::new_reference_to(Py::Int(face->GetID())); } PyErr_SetString(PyExc_TypeError, "Line constructor accepts:\n" "-- empty parameter list\n" "-- Line\n" "-- Point, Point"); return 0; }