| |
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | #ifndef MESH_MESH_H
|
| | #define MESH_MESH_H
|
| |
|
| | #include <list>
|
| | #include <map>
|
| | #include <set>
|
| | #include <string>
|
| | #include <vector>
|
| |
|
| | #include <App/ComplexGeoData.h>
|
| | #include <App/PropertyGeo.h>
|
| |
|
| | #include <Base/Matrix.h>
|
| | #include <Base/Tools3D.h>
|
| |
|
| | #include "Core/Iterator.h"
|
| | #include "Core/MeshIO.h"
|
| | #include "Core/MeshKernel.h"
|
| |
|
| | #include "Facet.h"
|
| | #include "MeshPoint.h"
|
| | #include "Segment.h"
|
| |
|
| |
|
| | namespace Py
|
| | {
|
| | class List;
|
| | }
|
| |
|
| | namespace Base
|
| | {
|
| | class Polygon2d;
|
| | class ViewProjMethod;
|
| | }
|
| |
|
| | namespace MeshCore
|
| | {
|
| | class AbstractPolygonTriangulator;
|
| | }
|
| |
|
| | namespace Mesh
|
| | {
|
| |
|
| | class MeshObject;
|
| | class MeshExport MeshSegment: public Data::Segment
|
| | {
|
| | TYPESYSTEM_HEADER_WITH_OVERRIDE();
|
| |
|
| | public:
|
| | std::string getName() const override
|
| | {
|
| | return "MeshSegment";
|
| | }
|
| |
|
| | Base::Reference<MeshObject> mesh;
|
| | std::unique_ptr<Mesh::Segment> segment;
|
| | };
|
| |
|
| | |
| | |
| | |
| | |
| | |
| |
|
| | class MeshExport MeshObject: public Data::ComplexGeoData
|
| | {
|
| | TYPESYSTEM_HEADER_WITH_OVERRIDE();
|
| |
|
| | public:
|
| | enum GeometryType
|
| | {
|
| | PLANE,
|
| | CYLINDER,
|
| | SPHERE
|
| | };
|
| | enum CutType
|
| | {
|
| | INNER,
|
| | OUTER
|
| | };
|
| |
|
| | using TFacePair = std::pair<FacetIndex, FacetIndex>;
|
| | using TFacePairs = std::vector<TFacePair>;
|
| |
|
| |
|
| | using TPlane = std::pair<Base::Vector3f, Base::Vector3f>;
|
| | using TPolylines = std::list<std::vector<Base::Vector3f>>;
|
| | using TRay = std::pair<Base::Vector3d, Base::Vector3d>;
|
| | using TFaceSection = std::pair<FacetIndex, Base::Vector3d>;
|
| |
|
| | MeshObject();
|
| | explicit MeshObject(const MeshCore::MeshKernel& Kernel);
|
| | explicit MeshObject(const MeshCore::MeshKernel& Kernel, const Base::Matrix4D& Mtrx);
|
| | MeshObject(const MeshObject&);
|
| | MeshObject(MeshObject&&);
|
| | ~MeshObject() override;
|
| |
|
| | MeshObject& operator=(const MeshObject&);
|
| | MeshObject& operator=(MeshObject&&);
|
| |
|
| |
|
| |
|
| | |
| | |
| | |
| |
|
| | std::vector<const char*> getElementTypes() const override;
|
| | unsigned long countSubElements(const char* Type) const override;
|
| |
|
| | Data::Segment* getSubElement(const char* Type, unsigned long) const override;
|
| |
|
| | void getFacesFromSubElement(
|
| | const Data::Segment*,
|
| | std::vector<Base::Vector3d>& Points,
|
| | std::vector<Base::Vector3d>& PointNormals,
|
| | std::vector<Facet>& faces
|
| | ) const override;
|
| |
|
| |
|
| | void setTransform(const Base::Matrix4D& rclTrf) override;
|
| | Base::Matrix4D getTransform() const override;
|
| | void transformGeometry(const Base::Matrix4D& rclMat) override;
|
| |
|
| | |
| | |
| |
|
| | void swap(MeshCore::MeshKernel& Kernel);
|
| | void swap(MeshObject& mesh);
|
| |
|
| |
|
| |
|
| | std::string representation() const;
|
| | std::string topologyInfo() const;
|
| | unsigned long countPoints() const;
|
| | unsigned long countFacets() const;
|
| | unsigned long countEdges() const;
|
| | unsigned long countSegments() const;
|
| | bool isSolid() const;
|
| | Base::Vector3d getPoint(PointIndex) const;
|
| | MeshPoint getMeshPoint(PointIndex) const;
|
| | Mesh::Facet getMeshFacet(FacetIndex) const;
|
| | double getSurface() const;
|
| | double getVolume() const;
|
| |
|
| | void getPoints(
|
| | std::vector<Base::Vector3d>& Points,
|
| | std::vector<Base::Vector3d>& Normals,
|
| | double Accuracy,
|
| | uint16_t flags = 0
|
| | ) const override;
|
| | void getFaces(
|
| | std::vector<Base::Vector3d>& Points,
|
| | std::vector<Facet>& Topo,
|
| | double Accuracy,
|
| | uint16_t flags = 0
|
| | ) const override;
|
| | std::vector<PointIndex> getPointsFromFacets(const std::vector<FacetIndex>& facets) const;
|
| | bool nearestFacetOnRay(const TRay& ray, double maxAngle, TFaceSection& output) const;
|
| | std::vector<TFaceSection> foraminate(const TRay& ray, double maxAngle) const;
|
| |
|
| |
|
| | void setKernel(const MeshCore::MeshKernel& m);
|
| | MeshCore::MeshKernel& getKernel()
|
| | {
|
| | return _kernel;
|
| | }
|
| | const MeshCore::MeshKernel& getKernel() const
|
| | {
|
| | return _kernel;
|
| | }
|
| |
|
| | Base::BoundBox3d getBoundBox() const override;
|
| | bool getCenterOfGravity(Base::Vector3d& center) const override;
|
| |
|
| |
|
| |
|
| |
|
| | unsigned int getMemSize() const override;
|
| | void Save(Base::Writer& writer) const override;
|
| | void SaveDocFile(Base::Writer& writer) const override;
|
| | void Restore(Base::XMLReader& reader) override;
|
| | void RestoreDocFile(Base::Reader& reader) override;
|
| | void save(
|
| | const char* file,
|
| | MeshCore::MeshIO::Format f = MeshCore::MeshIO::Undefined,
|
| | const MeshCore::Material* mat = nullptr,
|
| | const char* objectname = nullptr
|
| | ) const;
|
| | void save(
|
| | std::ostream&,
|
| | MeshCore::MeshIO::Format f,
|
| | const MeshCore::Material* mat = nullptr,
|
| | const char* objectname = nullptr
|
| | ) const;
|
| | bool load(const char* file, MeshCore::Material* mat = nullptr);
|
| | bool load(std::istream&, MeshCore::MeshIO::Format f, MeshCore::Material* mat = nullptr);
|
| |
|
| | void save(std::ostream&) const;
|
| | void load(std::istream&);
|
| | void writeInventor(std::ostream& str, float creaseangle = 0.0F) const;
|
| |
|
| |
|
| |
|
| |
|
| | void addFacet(const MeshCore::MeshGeomFacet& facet);
|
| | void addFacets(const std::vector<MeshCore::MeshGeomFacet>& facets);
|
| | void addFacets(const std::vector<MeshCore::MeshFacet>& facets, bool checkManifolds);
|
| | void addFacets(
|
| | const std::vector<MeshCore::MeshFacet>& facets,
|
| | const std::vector<Base::Vector3f>& points,
|
| | bool checkManifolds
|
| | );
|
| | void addFacets(
|
| | const std::vector<Data::ComplexGeoData::Facet>& facets,
|
| | const std::vector<Base::Vector3d>& points,
|
| | bool checkManifolds
|
| | );
|
| | void setFacets(const std::vector<MeshCore::MeshGeomFacet>& facets);
|
| | void setFacets(
|
| | const std::vector<Data::ComplexGeoData::Facet>& facets,
|
| | const std::vector<Base::Vector3d>& points
|
| | );
|
| | |
| | |
| | |
| | |
| |
|
| | void addMesh(const MeshObject&);
|
| | |
| | |
| | |
| | |
| |
|
| | void addMesh(const MeshCore::MeshKernel&);
|
| | void deleteFacets(const std::vector<FacetIndex>& removeIndices);
|
| | void deletePoints(const std::vector<PointIndex>& removeIndices);
|
| | std::vector<std::vector<FacetIndex>> getComponents() const;
|
| | unsigned long countComponents() const;
|
| | void removeComponents(unsigned long);
|
| | |
| | |
| | |
| | |
| | |
| |
|
| | unsigned long getPointDegree(
|
| | const std::vector<FacetIndex>& indices,
|
| | std::vector<PointIndex>& point_degree
|
| | ) const;
|
| | void fillupHoles(unsigned long, int, MeshCore::AbstractPolygonTriangulator&);
|
| | void offset(float fSize);
|
| | void offsetSpecial2(float fSize);
|
| | void offsetSpecial(float fSize, float zmax, float zmin);
|
| |
|
| | void clear();
|
| | void transformToEigenSystem();
|
| | Base::Matrix4D getEigenSystem(Base::Vector3d& v) const;
|
| | void movePoint(PointIndex, const Base::Vector3d& v);
|
| | void setPoint(PointIndex index, const Base::Vector3d& p);
|
| | void smooth(int iterations, float d_max);
|
| | void decimate(float fTolerance, float fReduction);
|
| | void decimate(int targetSize);
|
| | Base::Vector3d getPointNormal(PointIndex) const;
|
| | std::vector<Base::Vector3d> getPointNormals() const;
|
| | void crossSections(
|
| | const std::vector<TPlane>&,
|
| | std::vector<TPolylines>& sections,
|
| | float fMinEps = 1.0e-2F,
|
| | bool bConnectPolygons = false
|
| | ) const;
|
| | void cut(const Base::Polygon2d& polygon, const Base::ViewProjMethod& proj, CutType);
|
| | void trim(const Base::Polygon2d& polygon, const Base::ViewProjMethod& proj, CutType);
|
| | void trimByPlane(const Base::Vector3f& base, const Base::Vector3f& normal);
|
| |
|
| |
|
| |
|
| |
|
| | void deleteSelectedFacets();
|
| | void deleteSelectedPoints();
|
| | void addFacetsToSelection(const std::vector<FacetIndex>&) const;
|
| | void addPointsToSelection(const std::vector<PointIndex>&) const;
|
| | void removeFacetsFromSelection(const std::vector<FacetIndex>&) const;
|
| | void removePointsFromSelection(const std::vector<PointIndex>&) const;
|
| | unsigned long countSelectedFacets() const;
|
| | bool hasSelectedFacets() const;
|
| | unsigned long countSelectedPoints() const;
|
| | bool hasSelectedPoints() const;
|
| | void getFacetsFromSelection(std::vector<FacetIndex>&) const;
|
| | void getPointsFromSelection(std::vector<PointIndex>&) const;
|
| | void clearFacetSelection() const;
|
| | void clearPointSelection() const;
|
| |
|
| |
|
| |
|
| |
|
| | MeshObject* unite(const MeshObject&) const;
|
| | MeshObject* intersect(const MeshObject&) const;
|
| | MeshObject* subtract(const MeshObject&) const;
|
| | MeshObject* inner(const MeshObject&) const;
|
| | MeshObject* outer(const MeshObject&) const;
|
| | std::vector<std::vector<Base::Vector3f>> section(
|
| | const MeshObject&,
|
| | bool connectLines,
|
| | float fMinDist
|
| | ) const;
|
| |
|
| |
|
| |
|
| |
|
| | void refine();
|
| | void removeNeedles(float);
|
| | void optimizeTopology(float);
|
| | void optimizeEdges();
|
| | void splitEdges();
|
| | void splitEdge(FacetIndex, FacetIndex, const Base::Vector3f&);
|
| | void splitFacet(FacetIndex, const Base::Vector3f&, const Base::Vector3f&);
|
| | void swapEdge(FacetIndex, FacetIndex);
|
| | void collapseEdge(FacetIndex, FacetIndex);
|
| | void collapseFacet(FacetIndex);
|
| | void collapseFacets(const std::vector<FacetIndex>&);
|
| | void insertVertex(FacetIndex, const Base::Vector3f& v);
|
| | void snapVertex(FacetIndex, const Base::Vector3f& v);
|
| |
|
| |
|
| |
|
| |
|
| | unsigned long countNonUniformOrientedFacets() const;
|
| | void flipNormals();
|
| | void harmonizeNormals();
|
| | void validateIndices();
|
| | void validateCaps(float fMaxAngle, float fSplitFactor);
|
| | void validateDeformations(float fMaxAngle, float fEps);
|
| | void validateDegenerations(float fEps);
|
| | void removeDuplicatedPoints();
|
| | void removeDuplicatedFacets();
|
| | bool hasNonManifolds() const;
|
| | bool hasInvalidNeighbourhood() const;
|
| | bool hasPointsOutOfRange() const;
|
| | bool hasFacetsOutOfRange() const;
|
| | bool hasCorruptedFacets() const;
|
| | void removeNonManifolds();
|
| | void removeNonManifoldPoints();
|
| | bool hasSelfIntersections() const;
|
| | TFacePairs getSelfIntersections() const;
|
| | std::vector<Base::Line3d> getSelfIntersections(const TFacePairs&) const;
|
| | void removeSelfIntersections();
|
| | void removeSelfIntersections(const std::vector<FacetIndex>&);
|
| | void removeFoldsOnSurface();
|
| | void removeFullBoundaryFacets();
|
| | bool hasInvalidPoints() const;
|
| | void removeInvalidPoints();
|
| | void mergeFacets();
|
| | bool hasPointsOnEdge() const;
|
| | void removePointsOnEdge(bool fillBoundary);
|
| |
|
| |
|
| |
|
| |
|
| | void addSegment(const Segment&);
|
| | void addSegment(const std::vector<FacetIndex>&);
|
| | const Segment& getSegment(unsigned long) const;
|
| | Segment& getSegment(unsigned long);
|
| | MeshObject* meshFromSegment(const std::vector<FacetIndex>&) const;
|
| | std::vector<Segment> getSegmentsOfType(GeometryType, float dev, unsigned long minFacets) const;
|
| |
|
| |
|
| |
|
| |
|
| | static MeshObject* createMeshFromList(Py::List& list);
|
| | static MeshObject* createSphere(float, int);
|
| | static MeshObject* createEllipsoid(float, float, int);
|
| | static MeshObject* createCylinder(float, float, int, float, int);
|
| | static MeshObject* createCone(float, float, float, int, float, int);
|
| | static MeshObject* createTorus(float, float, int);
|
| | static MeshObject* createCube(float, float, float);
|
| | static MeshObject* createCube(float, float, float, float);
|
| | static MeshObject* createCube(const Base::BoundBox3d&);
|
| |
|
| |
|
| | public:
|
| | class MeshExport const_point_iterator
|
| | {
|
| | public:
|
| | const_point_iterator(const MeshObject*, PointIndex index);
|
| | const_point_iterator(const const_point_iterator& pi);
|
| | const_point_iterator(const_point_iterator&& pi);
|
| | ~const_point_iterator();
|
| |
|
| | const_point_iterator& operator=(const const_point_iterator& pi);
|
| | const_point_iterator& operator=(const_point_iterator&& pi);
|
| | const MeshPoint& operator*();
|
| | const MeshPoint* operator->();
|
| | bool operator==(const const_point_iterator& pi) const;
|
| | bool operator!=(const const_point_iterator& pi) const;
|
| | const_point_iterator& operator++();
|
| | const_point_iterator& operator--();
|
| |
|
| | private:
|
| | void dereference();
|
| | const MeshObject* _mesh;
|
| | MeshPoint _point;
|
| | MeshCore::MeshPointIterator _p_it;
|
| | };
|
| |
|
| | class MeshExport const_facet_iterator
|
| | {
|
| | public:
|
| | const_facet_iterator(const MeshObject*, FacetIndex index);
|
| | const_facet_iterator(const const_facet_iterator& fi);
|
| | const_facet_iterator(const_facet_iterator&& fi);
|
| | ~const_facet_iterator();
|
| |
|
| | const_facet_iterator& operator=(const const_facet_iterator& fi);
|
| | const_facet_iterator& operator=(const_facet_iterator&& fi);
|
| | Mesh::Facet& operator*();
|
| | Mesh::Facet* operator->();
|
| | bool operator==(const const_facet_iterator& fi) const;
|
| | bool operator!=(const const_facet_iterator& fi) const;
|
| | const_facet_iterator& operator++();
|
| | const_facet_iterator& operator--();
|
| |
|
| | private:
|
| | void dereference();
|
| | const MeshObject* _mesh;
|
| | Mesh::Facet _facet;
|
| | MeshCore::MeshFacetIterator _f_it;
|
| | };
|
| |
|
| |
|
| |
|
| | const_point_iterator points_begin() const
|
| | {
|
| | return {this, 0};
|
| | }
|
| | const_point_iterator points_end() const
|
| | {
|
| | return {this, countPoints()};
|
| | }
|
| |
|
| | const_facet_iterator facets_begin() const
|
| | {
|
| | return {this, 0};
|
| | }
|
| | const_facet_iterator facets_end() const
|
| | {
|
| | return {this, countFacets()};
|
| | }
|
| |
|
| | using const_segment_iterator = std::vector<Segment>::const_iterator;
|
| | const_segment_iterator segments_begin() const
|
| | {
|
| | return _segments.begin();
|
| | }
|
| | const_segment_iterator segments_end() const
|
| | {
|
| | return _segments.end();
|
| | }
|
| |
|
| |
|
| |
|
| | friend class Segment;
|
| |
|
| | private:
|
| | void deletedFacets(const std::vector<FacetIndex>& remFacets);
|
| | void updateMesh(const std::vector<FacetIndex>&) const;
|
| | void updateMesh() const;
|
| | void swapKernel(MeshCore::MeshKernel& kernel, const std::vector<std::string>& g);
|
| | void copySegments(const MeshObject&);
|
| | void swapSegments(MeshObject&);
|
| |
|
| | private:
|
| | Base::Matrix4D _Mtrx;
|
| | MeshCore::MeshKernel _kernel;
|
| | std::vector<Segment> _segments;
|
| | static const float Epsilon;
|
| | };
|
| |
|
| | }
|
| |
|
| |
|
| | #endif
|
| |
|