Macro MeshToPart/cs: Difference between revisions

From FreeCAD Documentation
(Created page with "Makro SíťNaDíl")
 
(Updating to match new version of source page)
 
(24 intermediate revisions by 4 users not shown)
Line 1: Line 1:
<languages/>
{{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/cs
|Name=MeshToPart
|Translate=MeshToPart
|Icon=Macro_MeshToPart.png
|Description=Toto makro zkonvertuje vybrané sítě na díl. Má ovšem značné tolerance, takže je použitelné pouze pro objekty, které nemají křivky, jinak nelze zaručit správný výsledek.
|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]
}}


==Popis==
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


Toto makro zkonvertuje vybrané sítě na díl. Má ovšem značné tolerance, takže je použitelné pouze pro objekty, které nemají křivky, jinak nelze zaručit správný výsledek.


==Skript==
<syntaxhighlight>


ToolBar Icon [[Image:Macro_MeshToPart.png]]
import FreeCAD,FreeCADGui,Mesh,Part,MeshPart

'''Macro_MeshToPart.FCMacro'''

{{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}}

<languages/>
==Odkaz==

Diskuse na fóru [http://forum.freecadweb.org/viewtopic.php?f=3&t=253&hilit=getPlanarSegments Convert mesh to solid?]

Latest revision as of 11:08, 23 May 2020

MeshToPart

Popis
Toto makro zkonvertuje vybrané sítě na díl. Má ovšem značné tolerance, takže je použitelné pouze pro objekty, které nemají křivky, jinak nelze zaručit správný výsledek.

Version macro : 1.0
Date last modification : 2011-08-01
FreeCAD version : All
Download : ToolBar Icon
Autor: Wmayer
Autor
Wmayer
Download
ToolBar Icon
Odkazy
Verze
1.0
Datum poslední úpravy
2011-08-01
Verze FreeCAD
All
Výchozí zástupce
None
Viz též
None

Popis

Toto makro zkonvertuje vybrané sítě na díl. Má ovšem značné tolerance, takže je použitelné pouze pro objekty, které nemají křivky, jinak nelze zaručit správný výsledek.

Skript

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

Odkaz

Diskuse na fóru Convert mesh to solid?