Mesh Scripting/zh-cn: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
(Updating to match new version of source page)
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
<languages/>
<languages/>
{{Docnav
|[[FreeCAD_Scripting_Basics|FreeCAD Scripting Basics]]
|[[Topological_data_scripting|Topological data scripting]]
}}


{{TOCright}}
{{TOCright}}
Line 12: Line 8:
</div>
</div>


First of all you have to import the Mesh module:
To get access to the {{incode|Mesh}} module you have to import it first:


{{Code|code=
{{Code|code=
import Mesh
import Mesh
}}
}}

此后,您就可以访问网格模块与网格类了,继而方便地使用FreeCAD C++网格内核中的各种函数。


<div class="mw-translate-fuzzy">
<div class="mw-translate-fuzzy">
Line 24: Line 18:
如果要创建一个空的网格对象,仅需轻松地调用以下标准构造函数:
如果要创建一个空的网格对象,仅需轻松地调用以下标准构造函数:
</div>
</div>

To create an empty mesh object just use the standard constructor:


{{Code|code=
{{Code|code=
Line 29: Line 25:
}}
}}


<div class="mw-translate-fuzzy">
您也可以利用文件中的数据来创建一个网格对象:
您也可以利用文件中的数据来创建一个网格对象:
</div>


{{Code|code=
{{Code|code=
mesh = Mesh.Mesh('D:/temp/Something.stl')
mesh = Mesh.Mesh("D:/temp/Something.stl")
}}
}}

<div class="mw-translate-fuzzy">
(兼容网格的文件类型均列于[[Mesh_Import|此]]。)
</div>


或者利用一组三角形(即利用构成三角形的顶点)来创建网格:
或者利用一组三角形(即利用构成三角形的顶点)来创建网格:


{{Code|code=
{{Code|code=
planarMesh = [
triangles = [
# triangle 1
# triangle 1
[-0.5000, -0.5000, 0.0000], [0.5000, 0.5000, 0.0000], [-0.5000, 0.5000, 0.0000],
[-0.5000, -0.5000, 0.0000], [0.5000, 0.5000, 0.0000], [-0.5000, 0.5000, 0.0000],
Line 48: Line 42:
[-0.5000, -0.5000, 0.0000], [0.5000, -0.5000, 0.0000], [0.5000, 0.5000, 0.0000],
[-0.5000, -0.5000, 0.0000], [0.5000, -0.5000, 0.0000], [0.5000, 0.5000, 0.0000],
]
]
planarMeshObject = Mesh.Mesh(planarMesh)
meshObject = Mesh.Mesh(triangles)
Mesh.show(planarMeshObject)
Mesh.show(meshObject)
}}
}}


<div class="mw-translate-fuzzy">
<div class="mw-translate-fuzzy">
网格内核会通过对重合点与边进行排序来小心地创建一个正确的拓扑数据结构。
网格内核会通过对重合点与边进行排序来小心地创建一个正确的拓扑数据结构。
</div>
</div>
{{Top}}

随后,您将看到如何测试与检验网格数据。

[[#top|top]]

<div class="mw-translate-fuzzy">
<div class="mw-translate-fuzzy">
=== 建模 ===
=== 建模 ===
Line 65: Line 55:
</div>
</div>


To create regular geometries you can use the Python script {{FileName|BuildRegularGeoms.py}}.
To create regular geometries you can use one of the {{incode|create*()}} methods. A torus, for instance, can be created as follows:


{{Code|code=
{{Code|code=
m = Mesh.createTorus(8.0, 2.0, 50)
import BuildRegularGeoms
Mesh.show(m)
}}
}}


<div class="mw-translate-fuzzy">
<div class="mw-translate-fuzzy">
前两个参数定义了圆环的半径,而第三个参数则是针对创建多少个三角形而设置的子采样因子。第三个参数的值越大,则物体表面就越平滑且细节愈丰富细腻。网格类提供了一组以建模为目的的布尔函数,其中有对两个网格对象进行并、交、差的操作。
此脚本提供了用来定义简单旋转体(如球体、椭球、圆柱体、圆环与圆柱体)的方法。也可用它来创建简单的立方体。例如,为了创建一个圆环可以这样做:
</div>
</div>


The {{incode|Mesh}} module also provides three Boolean methods: {{incode|union()}}, {{incode|intersection()}} and {{incode|difference()}}:
{{Code|code=
t = BuildRegularGeoms.Toroid(8.0, 2.0, 50) # list with several thousands triangles
m = Mesh.Mesh(t)
}}

<div class="mw-translate-fuzzy">
前两个参数定义了圆环的半径,而第三个参数则是针对创建多少个三角形而设置的子采样因子。第三个参数的值越大,则物体表面就越平滑且细节愈丰富细腻。网格类提供了一组以建模为目的的布尔函数,其中有对两个网格对象进行并、交、差的操作。
</div>


{{Code|code=
{{Code|code=
Line 96: Line 80:
}}
}}


<div class="mw-translate-fuzzy">
最后,这里给出一个计算球体与立方体相交的示例,显示的是在球体上两者的交集。
最后,这里给出一个计算球体与立方体相交的示例,显示的是在球体上两者的交集。

{{Code|code=
import Mesh, BuildRegularGeoms
sphere = Mesh.Mesh(BuildRegularGeoms.Sphere(5.0, 50))
cylinder = Mesh.Mesh(BuildRegularGeoms.Cylinder(2.0, 10.0, True, 1.0, 50))
diff = sphere
diff = diff.difference(cylinder)
d = FreeCAD.newDocument()
d.addObject("Mesh::Feature", "Diff_Sphere_Cylinder").Mesh = diff
d.recompute()
}}

[[#top|top]]

<div class="mw-translate-fuzzy">
=== 导出 ===
您甚至可以将网格导出为一个python模块:
</div>
</div>


{{Code|code=
{{Code|code=
import FreeCAD, Mesh
m.write("D:/Develop/Projekte/FreeCAD/FreeCAD_0.7/Mod/Mesh/SavedMesh.py")
cylA = Mesh.createCylinder(2.0, 10.0, True, 1.0, 36)
import SavedMesh
cylB = Mesh.createCylinder(1.0, 12.0, True, 1.0, 36)
m2 = Mesh.Mesh(SavedMesh.faces)
cylB.Placement.Base = (FreeCAD.Vector(-1, 0, 0)) # move cylB to avoid co-planar faces
pipe = cylA
pipe = pipe.difference(cylB)
pipe.flipNormals() # somehow required
doc = FreeCAD.ActiveDocument
obj = d.addObject("Mesh::Feature", "Pipe")
obj.Mesh = pipe
doc.recompute()
}}
}}
{{Top}}

[[#top|top]]

<div class="mw-translate-fuzzy">
<div class="mw-translate-fuzzy">
=== 七零八碎的小东东 ===
=== 七零八碎的小东东 ===
Line 131: Line 105:
</div>
</div>


An extensive (though hard to use) source of Mesh related scripting are the unit test scripts of the Mesh-Module.
An extensive, though hard to use, source of mesh related scripting are the unit test scripts of the {{incode|Mesh}} module.
In this unit tests literally all methods are called and all properties/attributes are tweaked.
In these unit tests literally all methods are called and all properties/attributes are tweaked.
So if you are bold enough, take a look at the [https://github.com/FreeCAD/FreeCAD/blob/master/src/Mod/Mesh/App/MeshTestsApp.py Unit Test module].
So if you are bold enough, take a look at the [https://github.com/FreeCAD/FreeCAD/blob/master/src/Mod/Mesh/App/MeshTestsApp.py Unit Test module].


<div class="mw-translate-fuzzy">
参见[[Mesh_API|Mesh API]]
参见[[Mesh_API|Mesh API]]
</div>

{{Top}}
[[#top|top]]

{{Docnav
|[[FreeCAD_Scripting_Basics|FreeCAD Scripting Basics]]
|[[Topological_data_scripting|Topological data scripting]]
}}

{{Mesh Tools navi{{#translation:}}}}
{{Powerdocnavi{{#translation:}}}}
{{Powerdocnavi{{#translation:}}}}
[[Category:Developer Documentation{{#translation:}}]]
[[Category:Python Code{{#translation:}}]]
[[Category:Python Code{{#translation:}}]]
{{Mesh Tools navi{{#translation:}}}}
{{clear}}
{{clear}}

Latest revision as of 08:28, 5 September 2021

简介

首先,导入网格模块是必不可少的:

To get access to the Mesh module you have to import it first:

import Mesh

创建与加载

如果要创建一个空的网格对象,仅需轻松地调用以下标准构造函数:

To create an empty mesh object just use the standard constructor:

mesh = Mesh.Mesh()

您也可以利用文件中的数据来创建一个网格对象:

mesh = Mesh.Mesh("D:/temp/Something.stl")

或者利用一组三角形(即利用构成三角形的顶点)来创建网格:

triangles = [
# triangle 1
[-0.5000, -0.5000, 0.0000], [0.5000, 0.5000, 0.0000], [-0.5000, 0.5000, 0.0000],
#triangle 2
[-0.5000, -0.5000, 0.0000], [0.5000, -0.5000, 0.0000], [0.5000, 0.5000, 0.0000],
]
meshObject = Mesh.Mesh(triangles)
Mesh.show(meshObject)

网格内核会通过对重合点与边进行排序来小心地创建一个正确的拓扑数据结构。

Top

建模

您可以利用Python脚本BuildRegularGeoms.py来创建规则的几何图形。

To create regular geometries you can use one of the create*() methods. A torus, for instance, can be created as follows:

m = Mesh.createTorus(8.0, 2.0, 50)
Mesh.show(m)

前两个参数定义了圆环的半径,而第三个参数则是针对创建多少个三角形而设置的子采样因子。第三个参数的值越大,则物体表面就越平滑且细节愈丰富细腻。网格类提供了一组以建模为目的的布尔函数,其中有对两个网格对象进行并、交、差的操作。

The Mesh module also provides three Boolean methods: union(), intersection() and difference():

m1, m2              # are the input mesh objects
m3 = Mesh.Mesh(m1)  # create a copy of m1
m3.unite(m2)        # union of m1 and m2, the result is stored in m3
m4 = Mesh.Mesh(m1)
m4.intersect(m2)    # intersection of m1 and m2
m5 = Mesh.Mesh(m1)
m5.difference(m2)   # the difference of m1 and m2
m6 = Mesh.Mesh(m2)
m6.difference(m1)   # the difference of m2 and m1, usually the result is different to m5

最后,这里给出一个计算球体与立方体相交的示例,显示的是在球体上两者的交集。

import FreeCAD, Mesh
cylA = Mesh.createCylinder(2.0, 10.0, True, 1.0, 36)
cylB = Mesh.createCylinder(1.0, 12.0, True, 1.0, 36)
cylB.Placement.Base = (FreeCAD.Vector(-1, 0, 0)) # move cylB to avoid co-planar faces
pipe = cylA
pipe = pipe.difference(cylB)
pipe.flipNormals() # somehow required
doc = FreeCAD.ActiveDocument
obj = d.addObject("Mesh::Feature", "Pipe")
obj.Mesh = pipe
doc.recompute()

Top

七零八碎的小东东

这里还有一个与网格有关的脚本扩展源:即网格模块的单元测试脚本(尽管挺难使的)。 在此单元测试中,将调用所有的方法并调整所有的属性,以确保它们的正确性。 所以,如果您有充足的冒险精神,就可以去看一看单元测试模块

An extensive, though hard to use, source of mesh related scripting are the unit test scripts of the Mesh module. In these unit tests literally all methods are called and all properties/attributes are tweaked. So if you are bold enough, take a look at the Unit Test module.

参见Mesh API

Top