Macro MeshToPart/fr: Difference between revisions

From FreeCAD Documentation
(Created page with "Cette macro convertit certaines mailles en pièces. Il a une grande tolérance, donc utilisez le uniquement avec des objets qui n'ont aucunes courbes sinon vous obtiendrez un ...")
(Updating to match new version of source page)
Line 6: Line 6:
<syntaxhighlight>
<syntaxhighlight>


import FreeCAD,FreeCADGui,Mesh,Part,MeshPart
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>
</syntaxhighlight>

Revision as of 13:59, 8 May 2014

File:Text-x-python MeshToPart

Description
Cette macro convertit certaines mailles en pièces. Il a une grande tolérance, donc utilisez le uniquement avec des objets qui n'ont aucunes courbes sinon vous obtiendrez un résultat inattendu.

Auteur: Wmayer
Auteur
Wmayer
Téléchargement
None
Liens
Version Macro
1.0
Dernière modification
None
Version(s) FreeCAD
None
Raccourci clavier
None
Voir aussi
None

Cette macro convertit certaines mailles en pièces. Il a une grande tolérance, donc utilisez le uniquement avec des objets qui n'ont aucunes courbes sinon vous obtiendrez un résultat inattendu.


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