
Tue, 03/26/2019 - 06:47
Forums:
As well as for TopoDS_Vertex we can get the coordinates with:
int i=0;
exp0.Init(shape, TopAbs_VERTEX);
for(exp0.Init(shape, TopAbs_VERTEX); exp0.More(); exp0.Next()) {
TopoDS_Vertex vertex = TopoDS::Vertex(exp0.Current());
gp_Pnt pnt = BRep_Tool::Pnt(vertex);
cout <<"Edge " << i << ": X: " << pnt.X() << " - Y:" << pnt.Y() << " - Z: " << pnt.Z();
i++;
}
I would like to know if there is a similar mechanism to get the coordinates of a TopoDS_Face.
EDIT
With the suggestion of @jaba, that's what I did to calculate the center of mass of a series of points:
vtkSmartPointer<vtkPoints> facePoints = vtkSmartPointer<vtkPoints>::New();
int i=0;
for(exp0.Init(shape, TopAbs_FACE); exp0.More(); exp0.Next(), i++, count++) {
facePoints->Reset();
TopoDS_Face aFace = TopoDS::Face(exp0.Current());
for (TopExp_Explorer Vex(aFace, TopAbs_VERTEX); Vex.More(); Vex.Next()) {
TopoDS_Vertex vertex = TopoDS::Vertex(Vex.Current());
gp_Pnt pnt = BRep_Tool::Pnt(vertex);
facePoints->InsertNextPoint(p);
}
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
polydata->SetPoints(facePoints);
// Compute the center of mass
vtkSmartPointer<vtkCenterOfMass> centerOfMassFilter = vtkSmartPointer<vtkCenterOfMass>::New();
centerOfMassFilter->SetInputData(polydata);
centerOfMassFilter->SetUseScalarsAsWeights(false);
centerOfMassFilter->Update();
double center[3];
centerOfMassFilter->GetCenter(center);
}
Tue, 03/26/2019 - 08:04
Your code considers only topological vertices on the Face within calculations, while real geometry might be much more complicated.
OCCT provides native tools for computing surface and volume properties.
Take a look at documentation of tool BRepGProp, or Draw Harness commands vprops/sprops/lprops.