Files
create/src/Mod/Inspection/App/InspectionFeature.h
2022-03-24 20:45:03 +01:00

264 lines
7.9 KiB
C++

/***************************************************************************
* Copyright (c) 2011 Werner Mayer <wmayer[at]users.sourceforge.net> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#ifndef INSPECTION_FEATURE_H
#define INSPECTION_FEATURE_H
#include <App/DocumentObject.h>
#include <App/DocumentObjectGroup.h>
#include <Mod/Points/App/Points.h>
#include <Mod/Inspection/InspectionGlobal.h>
class TopoDS_Shape;
class BRepExtrema_DistShapeShape;
namespace MeshCore {
class MeshKernel;
class MeshGrid;
}
namespace Mesh { class MeshObject; }
namespace Points { class PointsGrid; }
namespace Part { class TopoShape; }
namespace Inspection
{
/** Delivers the number of points to be checked and returns the appropriate point to an index. */
class InspectionExport InspectActualGeometry
{
public:
InspectActualGeometry() {}
virtual ~InspectActualGeometry() {}
/// Number of points to be checked
virtual unsigned long countPoints() const = 0;
virtual Base::Vector3f getPoint(unsigned long) const = 0;
};
class InspectionExport InspectActualMesh : public InspectActualGeometry
{
public:
InspectActualMesh(const Mesh::MeshObject& rMesh);
~InspectActualMesh();
virtual unsigned long countPoints() const;
virtual Base::Vector3f getPoint(unsigned long) const;
private:
const MeshCore::MeshKernel& _mesh;
bool _bApply;
Base::Matrix4D _clTrf;
};
class InspectionExport InspectActualPoints : public InspectActualGeometry
{
public:
InspectActualPoints(const Points::PointKernel&);
virtual unsigned long countPoints() const;
virtual Base::Vector3f getPoint(unsigned long) const;
private:
const Points::PointKernel& _rKernel;
};
class InspectionExport InspectActualShape : public InspectActualGeometry
{
public:
InspectActualShape(const Part::TopoShape&);
virtual unsigned long countPoints() const;
virtual Base::Vector3f getPoint(unsigned long) const;
private:
const Part::TopoShape& _rShape;
std::vector<Base::Vector3d> points;
};
/** Calculates the shortest distance of the underlying geometry to a given point. */
class InspectionExport InspectNominalGeometry
{
public:
InspectNominalGeometry() {}
virtual ~InspectNominalGeometry() {}
virtual float getDistance(const Base::Vector3f&) const = 0;
};
class InspectionExport InspectNominalMesh : public InspectNominalGeometry
{
public:
InspectNominalMesh(const Mesh::MeshObject& rMesh, float offset);
~InspectNominalMesh();
virtual float getDistance(const Base::Vector3f&) const;
private:
const MeshCore::MeshKernel& _mesh;
MeshCore::MeshGrid* _pGrid;
Base::BoundBox3f _box;
bool _bApply;
Base::Matrix4D _clTrf;
};
class InspectionExport InspectNominalFastMesh : public InspectNominalGeometry
{
public:
InspectNominalFastMesh(const Mesh::MeshObject& rMesh, float offset);
~InspectNominalFastMesh();
virtual float getDistance(const Base::Vector3f&) const;
protected:
const MeshCore::MeshKernel& _mesh;
MeshCore::MeshGrid* _pGrid;
Base::BoundBox3f _box;
unsigned long max_level;
bool _bApply;
Base::Matrix4D _clTrf;
};
class InspectionExport InspectNominalPoints : public InspectNominalGeometry
{
public:
InspectNominalPoints(const Points::PointKernel&, float offset);
~InspectNominalPoints();
virtual float getDistance(const Base::Vector3f&) const;
private:
const Points::PointKernel& _rKernel;
Points::PointsGrid* _pGrid;
};
class InspectionExport InspectNominalShape : public InspectNominalGeometry
{
public:
InspectNominalShape(const TopoDS_Shape&, float offset);
~InspectNominalShape();
virtual float getDistance(const Base::Vector3f&) const;
private:
BRepExtrema_DistShapeShape* distss;
const TopoDS_Shape& _rShape;
bool isSolid;
};
class InspectionExport PropertyDistanceList: public App::PropertyLists
{
TYPESYSTEM_HEADER();
public:
/**
* A constructor.
* A more elaborate description of the constructor.
*/
PropertyDistanceList();
/**
* A destructor.
* A more elaborate description of the destructor.
*/
virtual ~PropertyDistanceList();
virtual void setSize(int newSize);
virtual int getSize(void) const;
/** Sets the property
*/
void setValue(float);
/// index operator
float operator[] (const int idx) const {return _lValueList.operator[] (idx);}
void set1Value (const int idx, float value){_lValueList.operator[] (idx) = value;}
void setValues (const std::vector<float>& values);
const std::vector<float> &getValues(void) const{return _lValueList;}
virtual PyObject *getPyObject(void);
virtual void setPyObject(PyObject *);
virtual void Save (Base::Writer &writer) const;
virtual void Restore(Base::XMLReader &reader);
virtual void SaveDocFile (Base::Writer &writer) const;
virtual void RestoreDocFile(Base::Reader &reader);
virtual Property *Copy(void) const;
virtual void Paste(const Property &from);
virtual unsigned int getMemSize (void) const;
private:
std::vector<float> _lValueList;
};
// ----------------------------------------------------------------
/** The inspection feature.
* \author Werner Mayer
*/
class InspectionExport Feature : public App::DocumentObject
{
PROPERTY_HEADER(Inspection::Feature);
public:
/// Constructor
Feature(void);
virtual ~Feature();
/** @name Properties */
//@{
App::PropertyFloat SearchRadius;
App::PropertyFloat Thickness;
App::PropertyLink Actual;
App::PropertyLinkList Nominals;
PropertyDistanceList Distances;
//@}
/** @name Actions */
//@{
short mustExecute() const;
/// recalculate the Feature
App::DocumentObjectExecReturn* execute(void);
//@}
/// returns the type name of the ViewProvider
const char* getViewProviderName(void) const
{ return "InspectionGui::ViewProviderInspection"; }
};
class InspectionExport Group : public App::DocumentObjectGroup
{
PROPERTY_HEADER(Inspection::Group);
public:
/// Constructor
Group(void);
virtual ~Group();
/// returns the type name of the ViewProvider
const char* getViewProviderName(void) const
{ return "InspectionGui::ViewProviderInspectionGroup"; }
};
} //namespace Inspection
#endif // INSPECTION_FEATURE_H