From 866668ace07d10bc4c0772bd0fab1ea360832ece Mon Sep 17 00:00:00 2001 From: jriegel Date: Thu, 12 Sep 2013 21:55:32 +0200 Subject: [PATCH] start node index interface --- src/Mod/Fem/App/AppFemPy.cpp | 538 ---------------------------- src/Mod/Fem/App/FemMeshPy.xml | 17 +- src/Mod/Fem/App/FemMeshPyImp.cpp | 27 ++ src/Mod/Part/App/TopoShapePy.xml | 7 +- src/Mod/Part/App/TopoShapePyImp.cpp | 35 ++ 5 files changed, 79 insertions(+), 545 deletions(-) diff --git a/src/Mod/Fem/App/AppFemPy.cpp b/src/Mod/Fem/App/AppFemPy.cpp index 36cd37e87..f4475b175 100755 --- a/src/Mod/Fem/App/AppFemPy.cpp +++ b/src/Mod/Fem/App/AppFemPy.cpp @@ -140,535 +140,6 @@ show(PyObject *self, PyObject *args) } -//static PyObject * SMESH_PCA(PyObject *self, PyObject *args) -//{ -// PyObject *input; -// -// if (!PyArg_ParseTuple(args, "O",&input)) -// return NULL; -// -// PY_TRY { -// -// FemMeshPy *inputMesh = static_cast(input); -// MeshCore::MeshKernel aMesh; -// MeshCore::MeshPointArray vertices; -// vertices.clear(); -// MeshCore::MeshFacetArray faces; -// faces.clear(); -// MeshCore::MeshPoint current_node; -// SMDS_NodeIteratorPtr aNodeIter = inputMesh->getFemMeshPtr()->getSMesh()->GetMeshDS()->nodesIterator(); -// for (;aNodeIter->more();) { -// const SMDS_MeshNode* aNode = aNodeIter->next(); -// current_node.Set(float(aNode->X()),float(aNode->Y()),float(aNode->Z())); -// vertices.push_back(current_node); -// } -// -// MeshCore::MeshFacet aFacet; -// aFacet._aulPoints[0] = 0;aFacet._aulPoints[1] = 1;aFacet._aulPoints[2] = 2; -// faces.push_back(aFacet); -// //Fill the Kernel with the temp smesh structure and delete the current containers -// aMesh.Adopt(vertices,faces); -// MeshCore::MeshEigensystem pca(aMesh); -// pca.Evaluate(); -// Base::Matrix4D Trafo = pca.Transform(); -// /*Letīs transform the input mesh with the PCA Matrix*/ -// inputMesh->getFemMeshPtr()->transformGeometry(Trafo); -// //inputMesh->getFemMeshPtr()->getSMesh()->ExportUNV("C:/Temp/PCA_alignment.unv"); -// //Now lets check if the smallest dimension of the BBox is oriented towards the Z-Axis. If not, lets rotate it around the X or Y axis -// //Use the SMESH structure for that -// // aMesh.Transform(Trafo); -// -// //Base::Rotation rotatex,rotatey,rotatez; -// //const Base::Vector3d rotate_axis_x(1.0,0.0,0.0),rotate_axis_y(0.0,1.0,0.0),rotate_axis_z(0.0,0.0,1.0); -// //double bbox_length_x,bbox_length_y,bbox_length_z; -// ////Rotate around the each axes and choose the settings for the min bbox -// //Base::Matrix4D final_trafo; -// //Base::BoundBox3f aBBox; -// ////Get the current BBOX and look for the size -// //aBBox = aMesh.GetBoundBox(); -// //bbox_length_x = aBBox.LengthX();bbox_length_y = aBBox.LengthY();bbox_length_z = aBBox.LengthZ(); -// ////Now do the rotation stuff -// //if (bbox_length_z < bbox_length_x && bbox_length_z < bbox_length_y) -// // Py_Return; -// //else if ( -// -// -// //MeshCore::MeshKernel atempkernel; -// -// //float it_steps=10.0; -// //double step_size; -// //double alpha_x=0.0,alpha_y=0.0,alpha_z=0.0; -// //double perfect_ax=0.0,perfect_ay=0.0,perfect_az=0.0; -// -// ////Do a Monte Carlo approach and start from the Principal Axis System -// ////and rotate +/- 60° around each axis in a first iteration -// //double angle_range_min_x=-PI/3.0,angle_range_max_x=PI/3.0, -// // angle_range_min_y=-PI/3.0,angle_range_max_y=PI/3.0, -// // angle_range_min_z=-PI/3.0,angle_range_max_z=PI/3.0; -// -// ////We rotate until we are 0.1° sure to be in the right position -// //for (step_size = (2.0*PI/it_steps);step_size>(2.0*PI/3600.0);step_size=(2.0*PI/it_steps)) -// //{ -// // for(alpha_x=angle_range_min_x;alpha_x(input); -// -// SMDS_VolumeIteratorPtr aVolIter = inputMesh->getFemMeshPtr()->getSMesh()->GetMeshDS()->volumesIterator(); -// Base::Vector3d a,b,c,a_b_product,temp,temp1; -// double volume =0.0; -// for (;aVolIter->more();) -// { -// const SMDS_MeshVolume* aVol = aVolIter->next(); -// //To make sure that the volume calculation is based on the ABAQUS element convention -// //The following Node mapping from SMESH to ABAQUS is necessary -// //ABAQUS_Node_Number|SMESH_Node_Number -// //0|0 -// //1|2 -// //2|1 -// //3|3 -// //4|6 -// //5|5 -// //6|4 -// //7|8 -// //8|9 -// //9|7 -// //The following coordinates of the little pyramids are based on ABAQUS convention and are numbered from -// //1 to 10 -// //1,5,8,7 -// temp.Set(aVol->GetNode(6)->X(),aVol->GetNode(6)->Y(),aVol->GetNode(6)->Z()); -// temp1.Set(aVol->GetNode(0)->X(),aVol->GetNode(0)->Y(),aVol->GetNode(0)->Z()); -// a = temp - temp1; -// temp.Set(aVol->GetNode(8)->X(),aVol->GetNode(8)->Y(),aVol->GetNode(8)->Z()); -// temp1.Set(aVol->GetNode(0)->X(),aVol->GetNode(0)->Y(),aVol->GetNode(0)->Z()); -// b = temp - temp1; -// temp.Set(aVol->GetNode(4)->X(),aVol->GetNode(4)->Y(),aVol->GetNode(4)->Z()); -// temp1.Set(aVol->GetNode(0)->X(),aVol->GetNode(0)->Y(),aVol->GetNode(0)->Z()); -// c = temp - temp1; -// a_b_product.x = a.y*b.z-b.y*a.z;a_b_product.y = a.z*b.x-b.z*a.x;a_b_product.z = a.x*b.y-b.x*a.y; -// volume += 1.0/6.0 * fabs((a_b_product.x * c.x)+ (a_b_product.y * c.y)+(a_b_product.z * c.z)); -// //5,9,8,7 -// temp.Set(aVol->GetNode(9)->X(),aVol->GetNode(9)->Y(),aVol->GetNode(9)->Z()); -// temp1.Set(aVol->GetNode(6)->X(),aVol->GetNode(6)->Y(),aVol->GetNode(6)->Z()); -// a = temp - temp1; -// temp.Set(aVol->GetNode(8)->X(),aVol->GetNode(8)->Y(),aVol->GetNode(8)->Z()); -// temp1.Set(aVol->GetNode(6)->X(),aVol->GetNode(6)->Y(),aVol->GetNode(6)->Z()); -// b = temp - temp1; -// temp.Set(aVol->GetNode(4)->X(),aVol->GetNode(4)->Y(),aVol->GetNode(4)->Z()); -// temp1.Set(aVol->GetNode(6)->X(),aVol->GetNode(6)->Y(),aVol->GetNode(6)->Z()); -// c = temp - temp1; -// a_b_product.x = a.y*b.z-b.y*a.z;a_b_product.y = a.z*b.x-b.z*a.x;a_b_product.z = a.x*b.y-b.x*a.y; -// volume += 1.0/6.0 * fabs((a_b_product.x * c.x)+ (a_b_product.y * c.y)+(a_b_product.z * c.z)); -// //5,2,9,7 -// temp.Set(aVol->GetNode(2)->X(),aVol->GetNode(2)->Y(),aVol->GetNode(2)->Z()); -// temp1.Set(aVol->GetNode(6)->X(),aVol->GetNode(6)->Y(),aVol->GetNode(6)->Z()); -// a = temp - temp1; -// temp.Set(aVol->GetNode(9)->X(),aVol->GetNode(9)->Y(),aVol->GetNode(9)->Z()); -// temp1.Set(aVol->GetNode(6)->X(),aVol->GetNode(6)->Y(),aVol->GetNode(6)->Z()); -// b = temp - temp1; -// temp.Set(aVol->GetNode(4)->X(),aVol->GetNode(4)->Y(),aVol->GetNode(4)->Z()); -// temp1.Set(aVol->GetNode(6)->X(),aVol->GetNode(6)->Y(),aVol->GetNode(6)->Z()); -// c = temp - temp1; -// a_b_product.x = a.y*b.z-b.y*a.z;a_b_product.y = a.z*b.x-b.z*a.x;a_b_product.z = a.x*b.y-b.x*a.y; -// volume += 1.0/6.0 * fabs((a_b_product.x * c.x)+ (a_b_product.y * c.y)+(a_b_product.z * c.z)); -// //2,6,9,7 -// temp.Set(aVol->GetNode(5)->X(),aVol->GetNode(5)->Y(),aVol->GetNode(5)->Z()); -// temp1.Set(aVol->GetNode(2)->X(),aVol->GetNode(2)->Y(),aVol->GetNode(2)->Z()); -// a = temp - temp1; -// temp.Set(aVol->GetNode(9)->X(),aVol->GetNode(9)->Y(),aVol->GetNode(9)->Z()); -// temp1.Set(aVol->GetNode(2)->X(),aVol->GetNode(2)->Y(),aVol->GetNode(2)->Z()); -// b = temp - temp1; -// temp.Set(aVol->GetNode(4)->X(),aVol->GetNode(4)->Y(),aVol->GetNode(4)->Z()); -// temp1.Set(aVol->GetNode(2)->X(),aVol->GetNode(2)->Y(),aVol->GetNode(2)->Z()); -// c = temp - temp1; -// a_b_product.x = a.y*b.z-b.y*a.z;a_b_product.y = a.z*b.x-b.z*a.x;a_b_product.z = a.x*b.y-b.x*a.y; -// volume += 1.0/6.0 * fabs((a_b_product.x * c.x)+ (a_b_product.y * c.y)+(a_b_product.z * c.z)); -// //9,6,10,7 -// temp.Set(aVol->GetNode(5)->X(),aVol->GetNode(5)->Y(),aVol->GetNode(5)->Z()); -// temp1.Set(aVol->GetNode(9)->X(),aVol->GetNode(9)->Y(),aVol->GetNode(9)->Z()); -// a = temp - temp1; -// temp.Set(aVol->GetNode(7)->X(),aVol->GetNode(7)->Y(),aVol->GetNode(7)->Z()); -// temp1.Set(aVol->GetNode(9)->X(),aVol->GetNode(9)->Y(),aVol->GetNode(9)->Z()); -// b = temp - temp1; -// temp.Set(aVol->GetNode(4)->X(),aVol->GetNode(4)->Y(),aVol->GetNode(4)->Z()); -// temp1.Set(aVol->GetNode(9)->X(),aVol->GetNode(9)->Y(),aVol->GetNode(9)->Z()); -// c = temp - temp1; -// a_b_product.x = a.y*b.z-b.y*a.z;a_b_product.y = a.z*b.x-b.z*a.x;a_b_product.z = a.x*b.y-b.x*a.y; -// volume += 1.0/6.0 * fabs((a_b_product.x * c.x)+ (a_b_product.y * c.y)+(a_b_product.z * c.z)); -// //6,3,10,7 -// temp.Set(aVol->GetNode(1)->X(),aVol->GetNode(1)->Y(),aVol->GetNode(1)->Z()); -// temp1.Set(aVol->GetNode(5)->X(),aVol->GetNode(5)->Y(),aVol->GetNode(5)->Z()); -// a = temp - temp1; -// temp.Set(aVol->GetNode(7)->X(),aVol->GetNode(7)->Y(),aVol->GetNode(7)->Z()); -// temp1.Set(aVol->GetNode(5)->X(),aVol->GetNode(5)->Y(),aVol->GetNode(5)->Z()); -// b = temp - temp1; -// temp.Set(aVol->GetNode(4)->X(),aVol->GetNode(4)->Y(),aVol->GetNode(4)->Z()); -// temp1.Set(aVol->GetNode(5)->X(),aVol->GetNode(5)->Y(),aVol->GetNode(5)->Z()); -// c = temp - temp1; -// a_b_product.x = a.y*b.z-b.y*a.z;a_b_product.y = a.z*b.x-b.z*a.x;a_b_product.z = a.x*b.y-b.x*a.y; -// volume += 1.0/6.0 * fabs((a_b_product.x * c.x)+ (a_b_product.y * c.y)+(a_b_product.z * c.z)); -// //8,9,10,7 -// temp.Set(aVol->GetNode(9)->X(),aVol->GetNode(9)->Y(),aVol->GetNode(9)->Z()); -// temp1.Set(aVol->GetNode(8)->X(),aVol->GetNode(8)->Y(),aVol->GetNode(8)->Z()); -// a = temp - temp1; -// temp.Set(aVol->GetNode(7)->X(),aVol->GetNode(7)->Y(),aVol->GetNode(7)->Z()); -// temp1.Set(aVol->GetNode(8)->X(),aVol->GetNode(8)->Y(),aVol->GetNode(8)->Z()); -// b = temp - temp1; -// temp.Set(aVol->GetNode(4)->X(),aVol->GetNode(4)->Y(),aVol->GetNode(4)->Z()); -// temp1.Set(aVol->GetNode(8)->X(),aVol->GetNode(8)->Y(),aVol->GetNode(8)->Z()); -// c = temp - temp1; -// a_b_product.x = a.y*b.z-b.y*a.z;a_b_product.y = a.z*b.x-b.z*a.x;a_b_product.z = a.x*b.y-b.x*a.y; -// volume += 1.0/6.0 * fabs((a_b_product.x * c.x)+ (a_b_product.y * c.y)+(a_b_product.z * c.z)); -// //8,9,10,4 -// temp.Set(aVol->GetNode(9)->X(),aVol->GetNode(9)->Y(),aVol->GetNode(9)->Z()); -// temp1.Set(aVol->GetNode(8)->X(),aVol->GetNode(8)->Y(),aVol->GetNode(8)->Z()); -// a = temp - temp1; -// temp.Set(aVol->GetNode(7)->X(),aVol->GetNode(7)->Y(),aVol->GetNode(7)->Z()); -// temp1.Set(aVol->GetNode(8)->X(),aVol->GetNode(8)->Y(),aVol->GetNode(8)->Z()); -// b = temp - temp1; -// temp.Set(aVol->GetNode(3)->X(),aVol->GetNode(3)->Y(),aVol->GetNode(3)->Z()); -// temp1.Set(aVol->GetNode(8)->X(),aVol->GetNode(8)->Y(),aVol->GetNode(8)->Z()); -// c = temp - temp1; -// a_b_product.x = a.y*b.z-b.y*a.z;a_b_product.y = a.z*b.x-b.z*a.x;a_b_product.z = a.x*b.y-b.x*a.y; -// volume += 1.0/6.0 * fabs((a_b_product.x * c.x)+ (a_b_product.y * c.y)+(a_b_product.z * c.z)); -// } -// Py::Float py_volume(volume); -// return Py::new_reference_to(py_volume); -// -// } PY_CATCH; -// -// Py_Return; -//} - -//static PyObject * checkBB(PyObject *self, PyObject *args) -//{ -// PyObject *input; -// PyObject* plm=0; -// float billet_thickness; -// bool oversize = false; -// -// if (!PyArg_ParseTuple(args, "O|O!f", &input,&(Base::PlacementPy::Type),&plm,&billet_thickness)) -// return NULL; -// -// try { -// Base::Placement* placement = 0; -// if (plm) { -// placement = static_cast(plm)->getPlacementPtr(); -// -// } -// Base::Vector3d current_node; -// Base::Matrix4D matrix = placement->toMatrix(); -// FemMeshPy *inputMesh = static_cast(input); -// SMDS_NodeIteratorPtr aNodeIter = inputMesh->getFemMeshPtr()->getSMesh()->GetMeshDS()->nodesIterator(); -// for (;aNodeIter->more();) { -// const SMDS_MeshNode* aNode = aNodeIter->next(); -// current_node.Set(float(aNode->X()),float(aNode->Y()),float(aNode->Z())); -// current_node = matrix * current_node; -// if(current_node.z > billet_thickness || current_node.z < -0.1) -// { -// //lets jump out of the function as soon as we find a -// //Node that is higher or lower than billet thickness -// oversize = true; -// Py::Boolean py_oversize(oversize); -// return Py::new_reference_to(py_oversize); -// } -// } -// Py::Boolean py_oversize(oversize); -// return Py::new_reference_to(py_oversize); -// } -// catch (const std::exception& e) { -// PyErr_SetString(PyExc_Exception, e.what()); -// return 0; -// } -// Py_Return; -//} -// -// -// -// -//static PyObject * getBoundary_Conditions(PyObject *self, PyObject *args) -//{ -// PyObject *input; -// Py::List boundary_nodes; -// -// if (!PyArg_ParseTuple(args, "O!", &(FemMeshPy::Type), &input)) -// //if (!PyArg_ParseTuple(args, "O",&input)) -// return NULL; -// -// PY_TRY { -// -// FemMeshPy *inputMesh = static_cast(input); -// MeshCore::MeshKernel aMesh; -// MeshCore::MeshPointArray vertices; -// vertices.clear(); -// MeshCore::MeshFacetArray faces; -// faces.clear(); -// MeshCore::MeshPoint current_node; -// SMDS_NodeIteratorPtr aNodeIter = inputMesh->getFemMeshPtr()->getSMesh()->GetMeshDS()->nodesIterator(); -// SMDS_VolumeIteratorPtr aVolIter = inputMesh->getFemMeshPtr()->getSMesh()->GetMeshDS()->volumesIterator(); -// for (;aNodeIter->more();) { -// const SMDS_MeshNode* aNode = aNodeIter->next(); -// current_node.Set(float(aNode->X()),float(aNode->Y()),float(aNode->Z())); -// vertices.push_back(current_node); -// } -// MeshCore::MeshFacet aFacet; -// aFacet._aulPoints[0] = 0;aFacet._aulPoints[1] = 1;aFacet._aulPoints[2] = 2; -// faces.push_back(aFacet); -// //Fill the Kernel with the temp smesh structure and delete the current containers -// aMesh.Adopt(vertices,faces); -// Base::BoundBox3f aBBox; -// aBBox = aMesh.GetBoundBox(); -// -// float dist_length; -// Base::Vector3f dist; -// int minNodeID,maxNodeID,midNodeID; -// dist_length = FLOAT_MAX; -// -// aVolIter = inputMesh->getFemMeshPtr()->getSMesh()->GetMeshDS()->volumesIterator(); -// //We only search in non midside nodes (equals the first four nodes of each element) -// for (;aVolIter->more();) -// { -// const SMDS_MeshVolume* aVol = aVolIter->next(); -// for (unsigned j=0;j<4;j++) -// { -// const SMDS_MeshNode* aNode = aVol->GetNode(j); -// //Calc distance between the lower left corner and the most next point of the mesh -// dist.x = float(aNode->X())-aBBox.MinX;dist.y = float(aNode->Y())-aBBox.MinY;dist.z = float(aNode->Z())-aBBox.MinZ; -// if(dist.Length()GetID(); -// dist_length = dist.Length(); -// } -// } -// } -// -// boundary_nodes.append(Py::Int(minNodeID)); -// -// dist_length = FLOAT_MAX; -// aVolIter = inputMesh->getFemMeshPtr()->getSMesh()->GetMeshDS()->volumesIterator(); -// for (;aVolIter->more();) -// { -// const SMDS_MeshVolume* aVol = aVolIter->next(); -// for (unsigned j=0;j<4;j++) -// { -// const SMDS_MeshNode* aNode = aVol->GetNode(j); -// //Calc distance between the lower right corner and the most next point of the mesh -// dist.x = float(aNode->X())-aBBox.MaxX;dist.y = float(aNode->Y())-aBBox.MinY;dist.z = float(aNode->Z())-aBBox.MinZ; -// if(dist.Length()GetID(); -// dist_length = dist.Length(); -// } -// } -// } -// boundary_nodes.append(Py::Int(midNodeID)); -// -// dist_length = FLOAT_MAX; -// aVolIter = inputMesh->getFemMeshPtr()->getSMesh()->GetMeshDS()->volumesIterator(); -// for (;aVolIter->more();) -// { -// const SMDS_MeshVolume* aVol = aVolIter->next(); -// for (unsigned j=0;j<4;j++) -// { -// const SMDS_MeshNode* aNode = aVol->GetNode(j); -// //Calc distance between the lowest lower right corner and the most next point of the mesh -// dist.x = float(aNode->X())-aBBox.MinX;dist.y = float(aNode->Y())-aBBox.MaxY;dist.z = float(aNode->Z())-aBBox.MinZ; -// if(dist.Length()GetID(); -// dist_length = dist.Length(); -// } -// } -// } -// boundary_nodes.append(Py::Int(maxNodeID)); -// -// -// -// -// return Py::new_reference_to(boundary_nodes); -// -// -// } PY_CATCH; -// -// Py_Return; -//} - - - - -//static PyObject * minBoundingBox(PyObject *self, PyObject *args) -//{ -// -// PyObject *input; -// -// if (!PyArg_ParseTuple(args, "O",&input)) -// return NULL; -// -// PY_TRY { -// FemMeshPy *inputMesh = static_cast(input); -// MeshCore::MeshKernel aMesh; -// MeshCore::MeshPointArray vertices; -// vertices.clear(); -// MeshCore::MeshFacetArray faces; -// faces.clear(); -// MeshCore::MeshPoint current_node; -// SMDS_NodeIteratorPtr aNodeIter = inputMesh->getFemMeshPtr()->getSMesh()->GetMeshDS()->nodesIterator(); -// for (;aNodeIter->more();) { -// const SMDS_MeshNode* aNode = aNodeIter->next(); -// current_node.Set(float(aNode->X()),float(aNode->Y()),float(aNode->Z())); -// vertices.push_back(current_node); -// } -// MeshCore::MeshFacet aFacet; -// aFacet._aulPoints[0] = 0;aFacet._aulPoints[1] = 1;aFacet._aulPoints[2] = 2; -// faces.push_back(aFacet); -// //Fill the Kernel with the temp smesh structure and delete the current containers -// aMesh.Adopt(vertices,faces); -// -// /////////////////////////////////////////////////////////////////////////// -// //Now do Monte Carlo to minimize the BBox of the part -// //Use Quaternions for the rotation stuff -// Base::Rotation rotatex,rotatey,rotatez; -// const Base::Vector3d rotate_axis_x(1.0,0.0,0.0),rotate_axis_y(0.0,1.0,0.0),rotate_axis_z(0.0,0.0,1.0); -// -// //Rotate around each axes and choose the settings for the min bbox -// Base::Matrix4D final_trafo; -// Base::BoundBox3f aBBox,min_bbox; -// double volumeBBOX,min_volumeBBOX; -// //Get the current min_volumeBBOX and look if we find a lower one -// aBBox = aMesh.GetBoundBox(); -// min_volumeBBOX = aBBox.LengthX()*aBBox.LengthY()*aBBox.LengthZ(); -// -// MeshCore::MeshKernel atempkernel; -// -// float it_steps=10.0; -// double step_size; -// double alpha_x=0.0,alpha_y=0.0,alpha_z=0.0; -// double perfect_ax=0.0,perfect_ay=0.0,perfect_az=0.0; -// -// //Do a Monte Carlo approach and start from the Principal Axis System -// //and rotate +/- 60° around each axis in a first iteration -// double angle_range_min_x=-M_PI/3.0,angle_range_max_x=M_PI/3.0, -// angle_range_min_y=-M_PI/3.0,angle_range_max_y=M_PI/3.0, -// angle_range_min_z=-M_PI/3.0,angle_range_max_z=M_PI/3.0; -// -// //We rotate until we are 0.1° sure to be in the right position -// for (step_size = (2.0*M_PI/it_steps);step_size>(2.0*M_PI/3600.0);step_size=(2.0*M_PI/it_steps)) -// { -// for(alpha_x=angle_range_min_x;alpha_xgetFemMeshPtr()->transformGeometry(final_trafo); -// ////////////////////////////////////////////////////////////////////////////////////// -// //Now lets also do the movement to the 1st Quadrant in this function -// aBBox = aMesh.GetBoundBox(); -// //Get Distance vector from current lower left corner of BBox to origin -// Base::Vector3f dist_vector; -// dist_vector.x = -aBBox.MinX;dist_vector.y=-aBBox.MinY;dist_vector.z=-aBBox.MinZ; -// Base::Matrix4D trans_matrix( -// float(1.0),float(0.0),float(0.0),dist_vector.x, -// float(0.0),float(1.0),float(0.0),dist_vector.y, -// float(0.0),float(0.0),float(1.0),dist_vector.z, -// float(0.0),float(0.0),float(0.0),float(1.0)); -// inputMesh->getFemMeshPtr()->transformGeometry(trans_matrix); -// -// //inputMesh->getFemMeshPtr()->getSMesh()->ExportUNV("C:/temp/fine_tuning.unv"); -// -// } PY_CATCH; -// -// Py_Return; -//} static PyObject * importer(PyObject *self, PyObject *args) @@ -1105,14 +576,5 @@ struct PyMethodDef Fem_methods[] = { {"read" ,read, Py_NEWARGS, "Read a mesh from a file and returns a Mesh object."}, {"show" ,show ,METH_VARARGS, "show(shape) -- Add the shape to the active document or create one if no document exists."}, - // {"calcMeshVolume", calcMeshVolume, Py_NEWARGS, - // "Calculate Mesh Volume for C3D10"}, - // {"getBoundary_Conditions" , getBoundary_Conditions, Py_NEWARGS, - // "Get Boundary Conditions for Residual Stress Calculation"}, - //{"SMESH_PCA" , SMESH_PCA, Py_NEWARGS, - // "Get a Matrix4D related to the PCA of a Mesh Object"}, - //{"import_NASTRAN",import_NASTRAN, Py_NEWARGS, "Import Nastran files, for tests only. Use read() or insert()"}, - //{"minBoundingBox",minBoundingBox,Py_NEWARGS,"Minimize the Bounding Box and reorient the mesh to the 1st Quadrant"}, - //{"checkBB",checkBB,Py_NEWARGS,"Check if the nodal z-values are still in the prescribed range"}, {NULL, NULL} /* sentinel */ }; diff --git a/src/Mod/Fem/App/FemMeshPy.xml b/src/Mod/Fem/App/FemMeshPy.xml index 3f388a742..ebc7b0b8f 100755 --- a/src/Mod/Fem/App/FemMeshPy.xml +++ b/src/Mod/Fem/App/FemMeshPy.xml @@ -84,12 +84,17 @@ Make a copy of this FEM mesh. - - - Get the node position vector by an Node-ID - - - + + + Get the node position vector by an Node-ID + + + + + Return a list of node IDs which belong to a TopoFace + + + Dictionary of Nodes by ID (int ID:Vector()) diff --git a/src/Mod/Fem/App/FemMeshPyImp.cpp b/src/Mod/Fem/App/FemMeshPyImp.cpp index 6a925e56b..b12d9f6f8 100755 --- a/src/Mod/Fem/App/FemMeshPyImp.cpp +++ b/src/Mod/Fem/App/FemMeshPyImp.cpp @@ -29,12 +29,14 @@ #include #include +#include #include #include #include #include +#include #include #include "Mod/Fem/App/FemMesh.h" @@ -479,6 +481,31 @@ PyObject* FemMeshPy::getNodeById(PyObject *args) } } +PyObject* FemMeshPy::getNodesByFace(PyObject *args) +{ + PyObject *pW; + if (!PyArg_ParseTuple(args, "O!", &(Part::TopoShapeFacePy::Type), &pW)) + return 0; + + try { + const TopoDS_Shape& sh = static_cast(pW)->getTopoShapePtr()->_Shape; + if (sh.IsNull()) { + PyErr_SetString(PyExc_Exception, "Face is empty"); + return 0; + } + Py::List ret; + + + } + catch (Standard_Failure) { + Handle_Standard_Failure e = Standard_Failure::Caught(); + PyErr_SetString(PyExc_Exception, e->GetMessageString()); + return 0; + } + +} + + // ===== Atributes ============================================================ diff --git a/src/Mod/Part/App/TopoShapePy.xml b/src/Mod/Part/App/TopoShapePy.xml index 92b56f50f..9646324cd 100644 --- a/src/Mod/Part/App/TopoShapePy.xml +++ b/src/Mod/Part/App/TopoShapePy.xml @@ -321,7 +321,12 @@ Boolean indicates if the point lying directly on a face is considered to be insi Removes redundant edges from the B-REP model -