extend interface to get actual property with geometric data, get center of gravity of a geometry
This commit is contained in:
@@ -148,3 +148,8 @@ void ComplexGeoData::getFaces(std::vector<Base::Vector3d> &Points,
|
||||
(void)Accuracy;
|
||||
(void)flags;
|
||||
}
|
||||
|
||||
bool ComplexGeoData::getCenterOfGravity(Base::Vector3d&) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
//@}
|
||||
|
||||
@@ -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);
|
||||
//@}
|
||||
|
||||
Reference in New Issue
Block a user