| |
|
|
| from __future__ import annotations |
|
|
| from typing import Any, Final |
|
|
| from Base.Metadata import constmethod, export, class_declarations |
|
|
| from App.ComplexGeoData import ComplexGeoData |
|
|
| @export( |
| Twin="MeshObject", |
| TwinPointer="MeshObject", |
| Include="Mod/Mesh/App/Mesh.h", |
| Namespace="Mesh", |
| FatherInclude="App/ComplexGeoDataPy.h", |
| FatherNamespace="Data", |
| Constructor=True, |
| ) |
| @class_declarations( |
| """ |
| private: |
| friend class PropertyMeshKernel; |
| class PropertyMeshKernel* parentProperty = nullptr;""" |
| ) |
| class Mesh(ComplexGeoData): |
| """ |
| Mesh() -- Create an empty mesh object. |
| |
| This class allows one to manipulate the mesh object by adding new facets, deleting facets, importing from an STL file, |
| transforming the mesh and much more. |
| For a complete overview of what can be done see also the documentation of mesh. |
| A mesh object cannot be added to an existing document directly. Therefore the document must create an object |
| with a property class that supports meshes. |
| Example: |
| m = Mesh.Mesh() |
| ... # Manipulate the mesh |
| d = FreeCAD.activeDocument() # Get a reference to the actie document |
| f = d.addObject("Mesh::Feature", "Mesh") # Create a mesh feature |
| f.Mesh = m # Assign the mesh object to the internal property |
| d.recompute() |
| |
| Author: Juergen Riegel (Juergen.Riegel@web.de) |
| License: LGPL-2.1-or-later |
| """ |
|
|
| def read(self, **kwargs) -> Any: |
| """Read in a mesh object from file. |
| mesh.read(Filename='mymesh.stl') |
| mesh.read(Stream=file,Format='STL')""" |
| ... |
|
|
| @constmethod |
| def write(self, **kwargs) -> Any: |
| """Write the mesh object into file. |
| mesh.write(Filename='mymesh.stl',[Format='STL',Name='Object name',Material=colors]) |
| mesh.write(Stream=file,Format='STL',[Name='Object name',Material=colors])""" |
| ... |
|
|
| @constmethod |
| def writeInventor(self) -> Any: |
| """Write the mesh in OpenInventor format to a string.""" |
| ... |
|
|
| @constmethod |
| def copy(self) -> Any: |
| """Create a copy of this mesh""" |
| ... |
|
|
| def offset(self) -> Any: |
| """Move the point along their normals""" |
| ... |
|
|
| def offsetSpecial(self) -> Any: |
| """Move the point along their normals""" |
| ... |
|
|
| @constmethod |
| def crossSections(self) -> Any: |
| """Get cross-sections of the mesh through several planes""" |
| ... |
|
|
| @constmethod |
| def unite(self) -> Any: |
| """Union of this and the given mesh object.""" |
| ... |
|
|
| @constmethod |
| def intersect(self) -> Any: |
| """Intersection of this and the given mesh object.""" |
| ... |
|
|
| @constmethod |
| def difference(self) -> Any: |
| """Difference of this and the given mesh object.""" |
| ... |
|
|
| @constmethod |
| def inner(self) -> Any: |
| """Get the part inside of the intersection""" |
| ... |
|
|
| @constmethod |
| def outer(self) -> Any: |
| """Get the part outside the intersection""" |
| ... |
|
|
| @constmethod |
| def section(self, **kwargs) -> Any: |
| """Get the section curves of this and the given mesh object. |
| lines = mesh.section(mesh2, [ConnectLines=True, MinDist=0.0001])""" |
| ... |
|
|
| def translate(self) -> Any: |
| """Apply a translation to the mesh""" |
| ... |
|
|
| def rotate(self) -> Any: |
| """Apply a rotation to the mesh""" |
| ... |
|
|
| def transform(self) -> Any: |
| """Apply a transformation to the mesh""" |
| ... |
|
|
| def transformToEigen(self) -> Any: |
| """Transform the mesh to its eigenbase""" |
| ... |
|
|
| @constmethod |
| def getEigenSystem(self) -> Any: |
| """Get Eigen base of the mesh""" |
| ... |
|
|
| def addFacet(self) -> Any: |
| """Add a facet to the mesh""" |
| ... |
|
|
| def addFacets(self) -> Any: |
| """Add a list of facets to the mesh""" |
| ... |
|
|
| def removeFacets(self) -> Any: |
| """Remove a list of facet indices from the mesh""" |
| ... |
|
|
| def removeNeedles(self) -> Any: |
| """Remove all edges that are smaller than a given length""" |
| ... |
|
|
| def removeFullBoundaryFacets(self) -> Any: |
| """Remove facets whose all three points are on the boundary""" |
| ... |
|
|
| @constmethod |
| def getInternalFacets(self) -> Any: |
| """Builds a list of facet indices with triangles that are inside a volume mesh""" |
| ... |
|
|
| def rebuildNeighbourHood(self) -> Any: |
| """Repairs the neighbourhood which might be broken""" |
| ... |
|
|
| def addMesh(self) -> Any: |
| """Combine this mesh with another mesh.""" |
| ... |
|
|
| def setPoint(self) -> Any: |
| """setPoint(int, Vector) |
| Sets the point at index.""" |
| ... |
|
|
| def movePoint(self) -> Any: |
| """movePoint(int, Vector) |
| This method moves the point in the mesh along the |
| given vector. This affects the geometry of the mesh. |
| Be aware that moving points may cause self-intersections.""" |
| ... |
|
|
| @constmethod |
| def getPointNormals(self) -> Any: |
| """getPointNormals() |
| Get the normals of the points.""" |
| ... |
|
|
| def addSegment(self) -> Any: |
| """Add a list of facet indices that describes a segment to the mesh""" |
| ... |
|
|
| @constmethod |
| def countSegments(self) -> Any: |
| """Get the number of segments which may also be 0""" |
| ... |
|
|
| @constmethod |
| def getSegment(self) -> Any: |
| """Get a list of facet indices that describes a segment""" |
| ... |
|
|
| @constmethod |
| def getSeparateComponents(self) -> Any: |
| """Returns a list containing the different |
| components (separated areas) of the mesh as separate meshes |
| |
| import Mesh |
| for c in mesh.getSeparatecomponents(): |
| Mesh.show(c)""" |
| ... |
|
|
| @constmethod |
| def getFacetSelection(self) -> Any: |
| """Get a list of the indices of selected facets""" |
| ... |
|
|
| @constmethod |
| def getPointSelection(self) -> Any: |
| """Get a list of the indices of selected points""" |
| ... |
|
|
| @constmethod |
| def meshFromSegment(self) -> Any: |
| """Create a mesh from segment""" |
| ... |
|
|
| def clear(self) -> Any: |
| """Clear the mesh""" |
| ... |
|
|
| @constmethod |
| def isSolid(self) -> Any: |
| """Check if the mesh is a solid""" |
| ... |
|
|
| @constmethod |
| def hasNonManifolds(self) -> Any: |
| """Check if the mesh has non-manifolds""" |
| ... |
|
|
| def removeNonManifolds(self) -> Any: |
| """Remove non-manifolds""" |
| ... |
|
|
| def removeNonManifoldPoints(self) -> Any: |
| """Remove non-manifold points""" |
| ... |
|
|
| @constmethod |
| def hasSelfIntersections(self) -> Any: |
| """Check if the mesh intersects itself""" |
| ... |
|
|
| @constmethod |
| def getSelfIntersections(self) -> Any: |
| """Returns a tuple of indices of intersecting triangles""" |
| ... |
|
|
| def fixSelfIntersections(self) -> Any: |
| """Repair self-intersections""" |
| ... |
|
|
| def removeFoldsOnSurface(self) -> Any: |
| """Remove folds on surfaces""" |
| ... |
|
|
| @constmethod |
| def hasNonUniformOrientedFacets(self) -> Any: |
| """Check if the mesh has facets with inconsistent orientation""" |
| ... |
|
|
| @constmethod |
| def countNonUniformOrientedFacets(self) -> Any: |
| """Get the number of wrong oriented facets""" |
| ... |
|
|
| @constmethod |
| def getNonUniformOrientedFacets(self) -> Any: |
| """Get a tuple of wrong oriented facets""" |
| ... |
|
|
| @constmethod |
| def hasInvalidPoints(self) -> Any: |
| """Check if the mesh has points with invalid coordinates (NaN)""" |
| ... |
|
|
| def removeInvalidPoints(self) -> Any: |
| """Remove points with invalid coordinates (NaN)""" |
| ... |
|
|
| @constmethod |
| def hasPointsOnEdge(self) -> Any: |
| """Check if points lie on edges""" |
| ... |
|
|
| def removePointsOnEdge(self, **kwargs) -> Any: |
| """removePointsOnEdge(FillBoundary=False) |
| Remove points that lie on edges. |
| If FillBoundary is True then the holes by removing the affected facets |
| will be re-filled.""" |
| ... |
|
|
| @constmethod |
| def hasInvalidNeighbourhood(self) -> Any: |
| """Check if the mesh has invalid neighbourhood indices""" |
| ... |
|
|
| @constmethod |
| def hasPointsOutOfRange(self) -> Any: |
| """Check if the mesh has point indices that are out of range""" |
| ... |
|
|
| @constmethod |
| def hasFacetsOutOfRange(self) -> Any: |
| """Check if the mesh has facet indices that are out of range""" |
| ... |
|
|
| @constmethod |
| def hasCorruptedFacets(self) -> Any: |
| """Check if the mesh has corrupted facets""" |
| ... |
|
|
| @constmethod |
| def countComponents(self) -> Any: |
| """Get the number of topologic independent areas""" |
| ... |
|
|
| def removeComponents(self) -> Any: |
| """Remove components with less or equal to number of given facets""" |
| ... |
|
|
| def fixIndices(self) -> Any: |
| """Repair any invalid indices""" |
| ... |
|
|
| def fixCaps(self) -> Any: |
| """Repair caps by swapping the edge""" |
| ... |
|
|
| def fixDeformations(self) -> Any: |
| """Repair deformed facets""" |
| ... |
|
|
| def fixDegenerations(self) -> Any: |
| """Remove degenerated facets""" |
| ... |
|
|
| def removeDuplicatedPoints(self) -> Any: |
| """Remove duplicated points""" |
| ... |
|
|
| def removeDuplicatedFacets(self) -> Any: |
| """Remove duplicated facets""" |
| ... |
|
|
| def refine(self) -> Any: |
| """Refine the mesh""" |
| ... |
|
|
| def splitEdges(self) -> Any: |
| """Split all edges""" |
| ... |
|
|
| def splitEdge(self) -> Any: |
| """Split edge""" |
| ... |
|
|
| def splitFacet(self) -> Any: |
| """Split facet""" |
| ... |
|
|
| def swapEdge(self) -> Any: |
| """Swap the common edge with the neighbour""" |
| ... |
|
|
| def collapseEdge(self) -> Any: |
| """Remove an edge and both facets that share this edge""" |
| ... |
|
|
| def collapseFacet(self) -> Any: |
| """Remove a facet""" |
| ... |
|
|
| def collapseFacets(self) -> Any: |
| """Remove a list of facets""" |
| ... |
|
|
| def insertVertex(self) -> Any: |
| """Insert a vertex into a facet""" |
| ... |
|
|
| def snapVertex(self) -> Any: |
| """Insert a new facet at the border""" |
| ... |
|
|
| @constmethod |
| def printInfo(self) -> Any: |
| """Get detailed information about the mesh""" |
| ... |
|
|
| @constmethod |
| def foraminate(self) -> Any: |
| """Get a list of facet indices and intersection points""" |
| ... |
|
|
| def cut(self) -> Any: |
| """Cuts the mesh with a given closed polygon |
| cut(list, int) -> None |
| The argument list is an array of points, a polygon |
| The argument int is the mode: 0=inner, 1=outer""" |
| ... |
|
|
| def trim(self) -> Any: |
| """Trims the mesh with a given closed polygon |
| trim(list, int) -> None |
| The argument list is an array of points, a polygon |
| The argument int is the mode: 0=inner, 1=outer""" |
| ... |
|
|
| def trimByPlane(self) -> Any: |
| """Trims the mesh with a given plane |
| trimByPlane(Vector, Vector) -> None |
| The plane is defined by a base and normal vector. Depending on the |
| direction of the normal the part above or below will be kept.""" |
| ... |
|
|
| @constmethod |
| def harmonizeNormals(self) -> Any: |
| """Adjust wrong oriented facets""" |
| ... |
|
|
| @constmethod |
| def flipNormals(self) -> Any: |
| """Flip the mesh normals""" |
| ... |
|
|
| @constmethod |
| def fillupHoles(self) -> Any: |
| """Fillup holes""" |
| ... |
|
|
| @constmethod |
| def smooth(self, **kwargs) -> Any: |
| """Smooth the mesh |
| smooth([iteration=1,maxError=FLT_MAX])""" |
| ... |
|
|
| def decimate(self) -> Any: |
| """Decimate the mesh |
| decimate(tolerance(Float), reduction(Float)) |
| tolerance: maximum error |
| reduction: reduction factor must be in the range [0.0,1.0] |
| Example: |
| mesh.decimate(0.5, 0.1) # reduction by up to 10 percent |
| mesh.decimate(0.5, 0.9) # reduction by up to 90 percent""" |
| ... |
|
|
| def mergeFacets(self) -> Any: |
| """Merge facets to optimize topology""" |
| ... |
|
|
| @constmethod |
| def optimizeTopology(self) -> Any: |
| """Optimize the edges to get nicer facets""" |
| ... |
|
|
| @constmethod |
| def optimizeEdges(self) -> Any: |
| """Optimize the edges to get nicer facets""" |
| ... |
|
|
| @constmethod |
| def nearestFacetOnRay(self) -> Any: |
| """nearestFacetOnRay(tuple, tuple) -> dict |
| Get the index and intersection point of the nearest facet to a ray. |
| The first parameter is a tuple of three floats the base point of the ray, |
| the second parameter is ut uple of three floats for the direction. |
| The result is a dictionary with an index and the intersection point or |
| an empty dictionary if there is no intersection.""" |
| ... |
|
|
| @constmethod |
| def getPlanarSegments(self) -> Any: |
| """getPlanarSegments(dev,[min faces=0]) -> list |
| Get all planes of the mesh as segment. |
| In the worst case each triangle can be regarded as single |
| plane if none of its neighbours is coplanar.""" |
| ... |
|
|
| @constmethod |
| def getSegmentsOfType(self) -> Any: |
| """getSegmentsOfType(type, dev,[min faces=0]) -> list |
| Get all segments of type. |
| Type can be Plane, Cylinder or Sphere""" |
| ... |
|
|
| @constmethod |
| def getSegmentsByCurvature(self) -> Any: |
| """getSegmentsByCurvature(list) -> list |
| The argument list gives a list if tuples where it defines the preferred maximum curvature, |
| the preferred minimum curvature, the tolerances and the number of minimum faces for the segment. |
| Example: |
| c=(1.0, 0.0, 0.1, 0.1, 500) # search for a cylinder with radius 1.0 |
| p=(0.0, 0.0, 0.1, 0.1, 500) # search for a plane |
| mesh.getSegmentsByCurvature([c,p])""" |
| ... |
|
|
| @constmethod |
| def getCurvaturePerVertex(self) -> Any: |
| """getCurvaturePerVertex() -> list |
| The items in the list contains minimum and maximum curvature with their directions |
| """ |
| ... |
| Points: Final[list] |
| """A collection of the mesh points |
| With this attribute it is possible to get access to the points of the mesh |
| for p in mesh.Points: |
| print p.x, p.y, p.z""" |
|
|
| CountPoints: Final[int] |
| """Return the number of vertices of the mesh object.""" |
|
|
| CountEdges: Final[int] |
| """Return the number of edges of the mesh object.""" |
|
|
| Facets: Final[list] |
| """A collection of facets |
| With this attribute it is possible to get access to the facets of the mesh |
| for p in mesh.Facets: |
| print p""" |
|
|
| CountFacets: Final[int] |
| """Return the number of facets of the mesh object.""" |
|
|
| Topology: Final[tuple] |
| """Return the points and face indices as tuple.""" |
|
|
| Area: Final[float] |
| """Return the area of the mesh object.""" |
|
|
| Volume: Final[float] |
| """Return the volume of the mesh object.""" |
|
|