extend interface to get actual property with geometric data, get center of gravity of a geometry

This commit is contained in:
wmayer
2017-03-05 18:05:11 +01:00
parent d6549e7dd7
commit 63943e4bb8
10 changed files with 68 additions and 0 deletions

View File

@@ -148,3 +148,8 @@ void ComplexGeoData::getFaces(std::vector<Base::Vector3d> &Points,
(void)Accuracy;
(void)flags;
}
bool ComplexGeoData::getCenterOfGravity(Base::Vector3d&) const
{
return false;
}

View File

@@ -145,6 +145,11 @@ public:
/** Get faces from object with given accuracy */
virtual void getFaces(std::vector<Base::Vector3d> &Points,std::vector<Facet> &faces,
float Accuracy, uint16_t flags=0) const;
/** Get the center of gravity
* If this method is implemented then true is returned and the center of gravity.
* The default implementation only returns false.
*/
virtual bool getCenterOfGravity(Base::Vector3d& center) const;
//@}
protected:

View File

@@ -53,3 +53,8 @@ void GeoFeature::transformPlacement(const Base::Placement &transform)
plm = transform * plm;
this->Placement.setValue(plm);
}
const PropertyComplexGeoData* GeoFeature::getPropertyOfGeometry() const
{
return nullptr;
}

View File

@@ -54,6 +54,13 @@ public:
* @param transform (input).
*/
virtual void transformPlacement(const Base::Placement &transform);
/**
* This method returns the main property of a geometric object that holds
* the actual geometry. For a part object this is the Shape property, for
* a mesh object the Mesh property and so on.
* The default implementation returns null.
*/
virtual const PropertyComplexGeoData* getPropertyOfGeometry() const;
};
} //namespace App

View File

@@ -77,6 +77,9 @@ public:
virtual const char* getViewProviderName(void) const {
return "MeshGui::ViewProviderMeshFaceSet";
}
virtual const App::PropertyComplexGeoData* getPropertyOfGeometry() const {
return &Mesh;
}
/// handles the MeshPy object
virtual PyObject* getPyObject(void);

View File

@@ -238,6 +238,11 @@ const char* Feature::getViewProviderName(void) const {
return "PartGui::ViewProviderPart";
}
const App::PropertyComplexGeoData* Feature::getPropertyOfGeometry() const
{
return &Shape;
}
// ---------------------------------------------------------
PROPERTY_SOURCE(Part::FilletBase, Part::Feature)

View File

@@ -60,6 +60,7 @@ public:
/// returns the type name of the ViewProvider
virtual const char* getViewProviderName(void) const;
virtual const App::PropertyComplexGeoData* getPropertyOfGeometry() const;
virtual PyObject* getPyObject(void);
virtual std::vector<PyObject *> getPySubObjects(const std::vector<std::string>&) const;

View File

@@ -63,6 +63,7 @@
# include <BRepCheck_Result.hxx>
# include <BRepClass_FaceClassifier.hxx>
# include <BRepFilletAPI_MakeFillet.hxx>
# include <BRepGProp.hxx>
# include <BRepMesh_IncrementalMesh.hxx>
# include <BRepMesh_Triangle.hxx>
# include <BRepMesh_Edge.hxx>
@@ -94,6 +95,7 @@
# include <GeomFill_SectionLaw.hxx>
# include <GeomFill_Sweep.hxx>
# include <GeomLib.hxx>
# include <GProp_GProps.hxx>
# include <Law_BSpFunc.hxx>
# include <Law_BSpline.hxx>
# include <Law_BSpFunc.hxx>
@@ -928,6 +930,36 @@ Base::BoundBox3d TopoShape::getBoundBox(void) const
return box;
}
bool TopoShape::getCenterOfGravity(Base::Vector3d& center) const
{
if (_Shape.IsNull())
return false;
// Computing of CentreOfMass
gp_Pnt pnt;
if (_Shape.ShapeType() == TopAbs_VERTEX) {
pnt = BRep_Tool::Pnt(TopoDS::Vertex(_Shape));
}
else {
GProp_GProps prop;
if (_Shape.ShapeType() == TopAbs_EDGE || _Shape.ShapeType() == TopAbs_WIRE) {
BRepGProp::LinearProperties(_Shape, prop);
}
else if (_Shape.ShapeType() == TopAbs_FACE || _Shape.ShapeType() == TopAbs_SHELL) {
BRepGProp::SurfaceProperties(_Shape, prop);
}
else {
BRepGProp::VolumeProperties(_Shape, prop);
}
pnt = prop.CentreOfMass();
}
center.Set(pnt.X(), pnt.Y(), pnt.Z());
return true;
}
void TopoShape::Save (Base::Writer & ) const
{
}

View File

@@ -81,6 +81,7 @@ public:
Base::Matrix4D getTransform(void) const;
/// Bound box from the CasCade shape
Base::BoundBox3d getBoundBox(void)const;
virtual bool getCenterOfGravity(Base::Vector3d& center) const;
static void convertTogpTrsf(const Base::Matrix4D& mtrx, gp_Trsf& trsf);
static void convertToMatrix(const gp_Trsf& trsf, Base::Matrix4D& mtrx);
//@}

View File

@@ -69,6 +69,10 @@ public:
virtual const char* getViewProviderName(void) const {
return "PointsGui::ViewProviderScattered";
}
virtual const App::PropertyComplexGeoData* getPropertyOfGeometry() const {
return &Points;
}
protected:
void onChanged(const App::Property* prop);
//@}