Mesh Scripting/zh-cn: Difference between revisions

From FreeCAD Documentation
No edit summary
(Updating to match new version of source page)
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
<languages/>
<languages/>
{{docnav|FreeCAD Scripting Basics|Topological data scripting}}


{{TOCright}}

<div class="mw-translate-fuzzy">
=== 简介 ===
=== 简介 ===
首先,导入网格模块是必不可少的:
首先,导入网格模块是必不可少的:
</div>

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>

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


{{Code|code=
{{Code|code=
Line 16: 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")
}}
}}

(兼容网格的文件类型均列于[[Mesh_Import|此]]。)


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


{{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],
#triangle 2
#triangle 2
[-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>
随后,您将看到如何测试与检验网格数据。
{{Top}}

<div class="mw-translate-fuzzy">
=== 建模 ===
=== 建模 ===
您可以利用Python脚本BuildRegularGeoms.py来创建规则的几何图形。
您可以利用Python脚本BuildRegularGeoms.py来创建规则的几何图形。
</div>


To create regular geometries you can use one of the {{incode|create*()}} methods. A torus, for instance, can be created as follows:
{{Code|code=
import BuildRegularGeoms
}}

此脚本提供了用来定义简单旋转体(如球体、椭球、圆柱体、圆环与圆柱体)的方法。也可用它来创建简单的立方体。例如,为了创建一个圆环可以这样做:


{{Code|code=
{{Code|code=
t = BuildRegularGeoms.Toroid(8.0, 2.0, 50) # list with several thousands triangles
m = Mesh.createTorus(8.0, 2.0, 50)
m = Mesh.Mesh(t)
Mesh.show(m)
}}
}}


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

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


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


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


{{Code|code=
{{Code|code=
import Mesh, BuildRegularGeoms
import FreeCAD, Mesh
sphere = Mesh.Mesh( BuildRegularGeoms.Sphere(5.0, 50) )
cylA = Mesh.createCylinder(2.0, 10.0, True, 1.0, 36)
cylinder = Mesh.Mesh( BuildRegularGeoms.Cylinder(2.0, 10.0, True, 1.0, 50) )
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
diff = sphere
pipe = cylA
diff = diff.difference(cylinder)
pipe = pipe.difference(cylB)
d = FreeCAD.newDocument()
pipe.flipNormals() # somehow required
d.addObject("Mesh::Feature","Diff_Sphere_Cylinder").Mesh=diff
doc = FreeCAD.ActiveDocument
d.recompute()
obj = d.addObject("Mesh::Feature", "Pipe")
obj.Mesh = pipe
doc.recompute()
}}
}}
{{Top}}

<div class="mw-translate-fuzzy">
=== 测试与检验 ===

=== 编写您自己的算法 ===

=== 导出 ===
您甚至可以将网格导出为一个python模块:

{{Code|code=
m.write("D:/Develop/Projekte/FreeCAD/FreeCAD_0.7/Mod/Mesh/SavedMesh.py")
import SavedMesh
m2 = Mesh.Mesh(SavedMesh.faces)
}}

=== 与Gui有关的内容 ===

=== 七零八碎的小东东 ===
=== 七零八碎的小东东 ===
这里还有一个与网格有关的脚本扩展源:即网格模块的单元测试脚本(尽管挺难使的)。
这里还有一个与网格有关的脚本扩展源:即网格模块的单元测试脚本(尽管挺难使的)。
在此单元测试中,将调用所有的方法并调整所有的属性,以确保它们的正确性。
在此单元测试中,将调用所有的方法并调整所有的属性,以确保它们的正确性。
所以,如果您有充足的冒险精神,就可以去看一看[https://github.com/FreeCAD/FreeCAD/blob/master/src/Mod/Mesh/App/MeshTestsApp.py 单元测试模块]。
所以,如果您有充足的冒险精神,就可以去看一看[https://github.com/FreeCAD/FreeCAD/blob/master/src/Mod/Mesh/App/MeshTestsApp.py 单元测试模块]。
</div>


An extensive, though hard to use, source of mesh related scripting are the unit test scripts of the {{incode|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 [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}}
{{docnav|FreeCAD Scripting Basics|Topological data scripting}}
{{Powerdocnavi{{#translation:}}}}

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

{{Mesh Tools navi{{#translation:}}}}
{{Userdocnavi}}

[[Category:Poweruser Documentation]]

[[Category:Python Code]]

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