Files
create/src/App/PropertyGeo.h
2024-11-21 21:17:42 +01:00

583 lines
15 KiB
C++

/***************************************************************************
* Copyright (c) 2002 Jürgen Riegel <juergen.riegel@web.de> *
* *
* 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 APP_PROPERTYGEO_H
#define APP_PROPERTYGEO_H
#include <Base/BoundBox.h>
#include <Base/Matrix.h>
#include <Base/Placement.h>
#include <Base/Unit.h>
#include <Base/Vector3D.h>
#include "PropertyLinks.h"
#include <FCGlobal.h>
namespace Base
{
class Writer;
}
namespace Data
{
class ComplexGeoData;
}
namespace App
{
class Placement;
/** Vector properties
* This is the father of all properties handling Integers.
*/
class AppExport PropertyVector: public Property
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
/**
* A constructor.
* A more elaborate description of the constructor.
*/
PropertyVector();
/**
* A destructor.
* A more elaborate description of the destructor.
*/
~PropertyVector() override;
/** Sets the property
*/
void setValue(const Base::Vector3d& vec);
void setValue(double x, double y, double z);
/// Get valid paths for this property; used by auto completer
void getPaths(std::vector<ObjectIdentifier>& paths) const override;
/** This method returns a string representation of the property
*/
const Base::Vector3d& getValue() const;
const char* getEditorName() const override
{
return "Gui::PropertyEditor::PropertyVectorItem";
}
PyObject* getPyObject() override;
void setPyObject(PyObject*) override;
void Save(Base::Writer& writer) const override;
void Restore(Base::XMLReader& reader) override;
Property* Copy() const override;
void Paste(const Property& from) override;
unsigned int getMemSize() const override
{
return sizeof(Base::Vector3d);
}
const boost::any getPathValue(const ObjectIdentifier& path) const override;
bool getPyPathValue(const ObjectIdentifier& path, Py::Object& res) const override;
virtual Base::Unit getUnit() const
{
return {};
}
bool isSame(const Property& other) const override
{
if (&other == this) {
return true;
}
return getTypeId() == other.getTypeId()
&& getValue() == dynamic_cast<decltype(this)>(&other)->getValue();
}
private:
Base::Vector3d _cVec;
};
class AppExport PropertyVectorDistance: public PropertyVector
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
/**
* A constructor.
* A more elaborate description of the constructor.
*/
PropertyVectorDistance();
/**
* A destructor.
* A more elaborate description of the destructor.
*/
~PropertyVectorDistance() override;
Base::Unit getUnit() const override
{
return Base::Unit::Length;
}
const char* getEditorName() const override
{
return "Gui::PropertyEditor::PropertyVectorDistanceItem";
}
};
class AppExport PropertyPosition: public PropertyVector
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
/**
* A constructor.
* A more elaborate description of the constructor.
*/
PropertyPosition();
/**
* A destructor.
* A more elaborate description of the destructor.
*/
~PropertyPosition() override;
Base::Unit getUnit() const override
{
return Base::Unit::Length;
}
const char* getEditorName() const override
{
return "Gui::PropertyEditor::PropertyPositionItem";
}
};
class AppExport PropertyDirection: public PropertyVector
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
/**
* A constructor.
* A more elaborate description of the constructor.
*/
PropertyDirection();
/**
* A destructor.
* A more elaborate description of the destructor.
*/
~PropertyDirection() override;
Base::Unit getUnit() const override
{
return Base::Unit::Length;
}
const char* getEditorName() const override
{
return "Gui::PropertyEditor::PropertyDirectionItem";
}
};
class AppExport PropertyVectorList: public PropertyListsT<Base::Vector3d>
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
using inherited = PropertyListsT<Base::Vector3d>;
public:
/**
* A constructor.
* A more elaborate description of the constructor.
*/
PropertyVectorList();
/**
* A destructor.
* A more elaborate description of the destructor.
*/
~PropertyVectorList() override;
void setValue(double x, double y, double z);
using inherited::setValue;
PyObject* getPyObject() override;
void Save(Base::Writer& writer) const override;
void Restore(Base::XMLReader& reader) override;
void SaveDocFile(Base::Writer& writer) const override;
void RestoreDocFile(Base::Reader& reader) override;
Property* Copy() const override;
void Paste(const Property& from) override;
unsigned int getMemSize() const override;
const char* getEditorName() const override
{
return "Gui::PropertyEditor::PropertyVectorListItem";
}
protected:
Base::Vector3d getPyValue(PyObject*) const override;
};
/// Property representing a 4x4 matrix
/*!
* Encapsulates a Base::Matrix4D in a Property
*/
class AppExport PropertyMatrix: public Property
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
/**
* A constructor.
* Initialises to an identity matrix
*/
PropertyMatrix();
/**
* A destructor.
* A more elaborate description of the destructor.
*/
~PropertyMatrix() override;
/** Sets the property
*/
void setValue(const Base::Matrix4D& mat);
/** This method returns a string representation of the property
*/
const Base::Matrix4D& getValue() const;
const char* getEditorName() const override
{
return "Gui::PropertyEditor::PropertyMatrixItem";
}
PyObject* getPyObject() override;
void setPyObject(PyObject*) override;
void Save(Base::Writer& writer) const override;
void Restore(Base::XMLReader& reader) override;
Property* Copy() const override;
void Paste(const Property& from) override;
unsigned int getMemSize() const override
{
return sizeof(Base::Matrix4D);
}
bool isSame(const Property& other) const override
{
if (&other == this) {
return true;
}
return getTypeId() == other.getTypeId()
&& getValue() == static_cast<decltype(this)>(&other)->getValue();
}
private:
Base::Matrix4D _cMat;
};
/// Property representing a placement
/*!
* Encapsulates a Base::Placement in a Property
*/
class AppExport PropertyPlacement: public Property
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
/**
* A constructor.
* A more elaborate description of the constructor.
*/
PropertyPlacement();
/**
* A destructor.
* A more elaborate description of the destructor.
*/
~PropertyPlacement() override;
/** Sets the property
*/
void setValue(const Base::Placement& pos);
/** Sets property only if changed
* @param pos: input placement
* @param tol: position tolerance
* @param atol: angular tolerance
*/
bool setValueIfChanged(const Base::Placement& pos, double tol = 1e-7, double atol = 1e-12);
/** This method returns a string representation of the property
*/
const Base::Placement& getValue() const;
/// Get valid paths for this property; used by auto completer
void getPaths(std::vector<ObjectIdentifier>& paths) const override;
void setPathValue(const ObjectIdentifier& path, const boost::any& value) override;
const boost::any getPathValue(const ObjectIdentifier& path) const override;
bool getPyPathValue(const ObjectIdentifier& path, Py::Object& res) const override;
const char* getEditorName() const override
{
return "Gui::PropertyEditor::PropertyPlacementItem";
}
PyObject* getPyObject() override;
void setPyObject(PyObject*) override;
void Save(Base::Writer& writer) const override;
void Restore(Base::XMLReader& reader) override;
Property* Copy() const override;
void Paste(const Property& from) override;
unsigned int getMemSize() const override
{
return sizeof(Base::Placement);
}
bool isSame(const Property& other) const override
{
if (&other == this) {
return true;
}
return getTypeId() == other.getTypeId()
&& getValue() == static_cast<decltype(this)>(&other)->getValue();
}
static const Placement Null;
private:
Base::Placement _cPos;
};
/** the general Link Property
* Main Purpose of this property is to Link Objects and Features in a document.
*/
class AppExport PropertyPlacementLink: public PropertyLink
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
/**
* A constructor.
* A more elaborate description of the constructor.
*/
PropertyPlacementLink();
/**
* A destructor.
* A more elaborate description of the destructor.
*/
~PropertyPlacementLink() override;
/** This method returns the linked DocumentObject
*/
App::Placement* getPlacementObject() const;
Property* Copy() const override;
void Paste(const Property& from) override;
};
class AppExport PropertyPlacementList: public PropertyListsT<Base::Placement>
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
/**
* A property that stores a list of placements
*/
PropertyPlacementList();
~PropertyPlacementList() override;
PyObject* getPyObject() override;
void Save(Base::Writer& writer) const override;
void Restore(Base::XMLReader& reader) override;
void SaveDocFile(Base::Writer& writer) const override;
void RestoreDocFile(Base::Reader& reader) override;
Property* Copy() const override;
void Paste(const Property& from) override;
unsigned int getMemSize() const override;
protected:
Base::Placement getPyValue(PyObject* item) const override;
};
/// Property representing a rotation
/*!
* Encapsulates a Base::Rotation in a Property
*/
class AppExport PropertyRotation: public Property
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
/**
* A constructor.
* A more elaborate description of the constructor.
*/
PropertyRotation();
/**
* A destructor.
* A more elaborate description of the destructor.
*/
~PropertyRotation() override;
/** Sets the property
*/
void setValue(const Base::Rotation& rot);
/** Sets property only if changed
* @param pos: input placement
* @param tol: position tolerance
* @param atol: angular tolerance
*/
bool setValueIfChanged(const Base::Rotation& rot, double atol = 1e-12);
/** This method returns a string representation of the property
*/
const Base::Rotation& getValue() const;
/// Get valid paths for this property; used by auto completer
void getPaths(std::vector<ObjectIdentifier>& paths) const override;
void setPathValue(const ObjectIdentifier& path, const boost::any& value) override;
const boost::any getPathValue(const ObjectIdentifier& path) const override;
bool getPyPathValue(const ObjectIdentifier& path, Py::Object& res) const override;
const char* getEditorName() const override
{
return "Gui::PropertyEditor::PropertyRotationItem";
}
PyObject* getPyObject() override;
void setPyObject(PyObject*) override;
void Save(Base::Writer& writer) const override;
void Restore(Base::XMLReader& reader) override;
Property* Copy() const override;
void Paste(const Property& from) override;
unsigned int getMemSize() const override
{
return sizeof(Base::Placement);
}
private:
Base::Rotation _rot;
};
/** The base class for all basic geometry properties.
* @author Werner Mayer
*/
class AppExport PropertyGeometry: public App::Property
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
PropertyGeometry();
~PropertyGeometry() override;
/** @name Modification */
//@{
/// Set the placement of the geometry
virtual void setTransform(const Base::Matrix4D& rclTrf) = 0;
/// Get the placement of the geometry
virtual Base::Matrix4D getTransform() const = 0;
/// Applies a transformation on the real geometric data type
virtual void transformGeometry(const Base::Matrix4D& rclMat) = 0;
/// Retrieve bounding box information
virtual Base::BoundBox3d getBoundingBox() const = 0;
//@}
};
/** The base class for all complex data properties.
* @author Werner Mayer
*/
class AppExport PropertyComplexGeoData: public App::PropertyGeometry
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
PropertyComplexGeoData();
~PropertyComplexGeoData() override;
/** @name Modification */
//@{
/// Applies a transformation on the real geometric data type
void transformGeometry(const Base::Matrix4D& rclMat) override = 0;
//@}
/** @name Getting basic geometric entities */
//@{
virtual const Data::ComplexGeoData* getComplexData() const = 0;
Base::BoundBox3d getBoundingBox() const override = 0;
//@}
/** Return the element map version
*
* @param persisted: if true, return the restored element map version. Or
* else, return the current element map version
*/
virtual std::string getElementMapVersion(bool restored = false) const;
/// Return true to signal element map version change
virtual bool checkElementMapVersion(const char* ver) const;
void afterRestore() override;
};
} // namespace App
#endif // APP_PROPERTYGEO_H