/*************************************************************************** * Copyright (c) 2002 Jürgen Riegel * * * * 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 #include #include #include #include #include "PropertyLinks.h" #include 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& 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(&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 { TYPESYSTEM_HEADER_WITH_OVERRIDE(); using inherited = PropertyListsT; 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(&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& 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(&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 { 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& 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