Macro MeshToPart: Difference between revisions

From FreeCAD Documentation
(<translate>)
(Use {{MacroCode}})
 
(18 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages/>
<translate>
<translate>
<!--T:1-->
{{Macro|Icon=Text-x-python|Name=MeshToPart|Description=This macro converts selected meshes to parts. It has a broad tolerance, so use it only with objects that have no curves otherwise you'll get weird results|Author=Wmayer}}
{{Macro
|Name=MeshToPart
|Icon=Macro_MeshToPart.png
|Description=This macro converts selected meshes to parts. It has a broad tolerance, so use it only with objects that have no curves otherwise you'll get weird results
|Author=Wmayer
|Version=1.0
|Date=2011-08-01
|FCVersion=All
|Download=[https://www.freecadweb.org/wiki/images/f/fa/Macro_MeshToPart.png ToolBar Icon]
}}


==Description== <!--T:2-->
This macro converts selected meshes to parts. It has a broad tolerance, so use it only with objects that have no curves otherwise you'll get weird results


<!--T:3-->
This macro converts selected meshes to parts. It has a broad tolerance, so use it only with objects that have no curves otherwise you'll get errors or weird results

==Script== <!--T:6-->
</translate>
</translate>


ToolBar Icon [[Image:Macro_MeshToPart.png]]
<syntaxhighlight>


'''Macro_MeshToPart.FCMacro'''
import FreeCAD,FreeCADGui,Mesh,Part,MeshPart

{{MacroCode|code=

import FreeCAD,FreeCADGui,Mesh,Part,MeshPart
for obj in FreeCADGui.Selection.getSelection():
for obj in FreeCADGui.Selection.getSelection():
if "Mesh" in obj.PropertiesList:
if "Mesh" in obj.PropertiesList:
faces = []
faces = []
mesh = obj.Mesh
mesh = obj.Mesh
segments = mesh.getPlanes(0.01) # use rather strict tolerance here
segments = mesh.getPlanarSegments(0.01) # use rather strict tolerance here
for i in segments:
for i in segments:
if len(i) > 0:
if len(i) > 0:
# a segment can have inner holes
# a segment can have inner holes
wires = MeshPart.wireFromSegment(mesh, i)
wires = MeshPart.wireFromSegment(mesh, i)
# we assume that the exterior boundary is that one with the biggest bounding box
# we assume that the exterior boundary is that one with the biggest bounding box
if len(wires) > 0:
if len(wires) > 0:
ext = None
ext = None
max_length = 0
max_length = 0
for i in wires:
for i in wires:
if i.BoundBox.DiagonalLength > max_length:
if i.BoundBox.DiagonalLength > max_length:
max_length = i.BoundBox.DiagonalLength
max_length = i.BoundBox.DiagonalLength
ext = i
ext = i
wires.remove(ext)
wires.remove(ext)
# all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails
# all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails
for i in wires:
for i in wires:
i.reverse()
i.reverse()
# make sure that the exterior wires comes as first in the lsit
# make sure that the exterior wires comes as first in the lsit
wires.insert(0, ext)
wires.insert(0, ext)
faces.append(Part.Face(wires))
faces.append(Part.Face(wires))
shell=Part.Compound(faces)
shell=Part.Compound(faces)
solid = Part.Solid(Part.Shell(faces))
solid = Part.Solid(Part.Shell(faces))
name = obj.Name
name = obj.Name
FreeCAD.ActiveDocument.removeObject(name)
FreeCAD.ActiveDocument.removeObject(name)
FreeCAD.ActiveDocument.addObject("Part::Feature",name).Shape = solid
FreeCAD.ActiveDocument.addObject("Part::Feature",name).Shape = solid
}}

</syntaxhighlight>
{{clear}}
{{clear}}
<translate>
<languages/>

==Link== <!--T:4-->

<!--T:5-->
The discussion on the forum [http://forum.freecadweb.org/viewtopic.php?f=3&t=253&hilit=getPlanarSegments Convert mesh to solid?]

</translate>

Latest revision as of 23:35, 7 May 2020

MeshToPart

Description
This macro converts selected meshes to parts. It has a broad tolerance, so use it only with objects that have no curves otherwise you'll get weird results

Macro version: 1.0
Last modified: 2011-08-01
FreeCAD version: All
Download: ToolBar Icon
Author: Wmayer
Author
Wmayer
Download
ToolBar Icon
Links
Macro Version
1.0
Date last modified
2011-08-01
FreeCAD Version(s)
All
Default shortcut
None
See also
None

Description

This macro converts selected meshes to parts. It has a broad tolerance, so use it only with objects that have no curves otherwise you'll get errors or weird results

Script

ToolBar Icon

Macro_MeshToPart.FCMacro

import FreeCAD,FreeCADGui,Mesh,Part,MeshPart
 
for obj in FreeCADGui.Selection.getSelection():
    if "Mesh" in obj.PropertiesList:
        faces = []      
        mesh = obj.Mesh
        segments = mesh.getPlanarSegments(0.01) # use rather strict tolerance here
 
        for i in segments:
          if len(i) > 0:
             # a segment can have inner holes
             wires = MeshPart.wireFromSegment(mesh, i)
             # we assume that the exterior boundary is that one with the biggest bounding box
             if len(wires) > 0:
                ext = None
                max_length = 0
                for i in wires:     
                   if i.BoundBox.DiagonalLength > max_length:
                      max_length = i.BoundBox.DiagonalLength
                      ext = i
                wires.remove(ext)
                # all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails
                for i in wires:
                   i.reverse()
                # make sure that the exterior wires comes as first in the lsit
                wires.insert(0, ext)
                faces.append(Part.Face(wires))
 
        shell=Part.Compound(faces)
        solid = Part.Solid(Part.Shell(faces))
        name = obj.Name
        FreeCAD.ActiveDocument.removeObject(name)
        FreeCAD.ActiveDocument.addObject("Part::Feature",name).Shape = solid

Link

The discussion on the forum Convert mesh to solid?