Mesh Scripting/zh-cn: Difference between revisions
(Created page with "或者利用一组三角形(即利用构成三角形的顶点)来创建网格:") |
(Updating to match new version of source page) |
||
(18 intermediate revisions by 2 users 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( |
mesh = Mesh.Mesh("D:/temp/Something.stl") |
||
}} |
}} |
||
(兼容网格的文件类型均列于[[Mesh_Import|此]]。) |
|||
或者利用一组三角形(即利用构成三角形的顶点)来创建网格: |
或者利用一组三角形(即利用构成三角形的顶点)来创建网格: |
||
{{Code|code= |
{{Code|code= |
||
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], |
||
] |
] |
||
meshObject = Mesh.Mesh(triangles) |
|||
Mesh.show( |
Mesh.show(meshObject) |
||
}} |
}} |
||
<div class="mw-translate-fuzzy"> |
|||
The Mesh-Kernel takes care about creating a topological correct data structure by sorting |
|||
网格内核会通过对重合点与边进行排序来小心地创建一个正确的拓扑数据结构。 |
|||
coincident points and edges together. |
|||
</div> |
|||
{{Top}} |
|||
<div class="mw-translate-fuzzy"> |
|||
=== 建模 === |
|||
您可以利用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: |
|||
Later on you will see how you can test and examine mesh data. |
|||
=== Modeling === |
|||
To create regular geometries you can use the Python script BuildRegularGeoms.py. |
|||
{{Code|code= |
{{Code|code= |
||
m = Mesh.createTorus(8.0, 2.0, 50) |
|||
import BuildRegularGeoms |
|||
Mesh.show(m) |
|||
}} |
}} |
||
<div class="mw-translate-fuzzy"> |
|||
This script provides methods to define simple rotation bodies like spheres, ellipsoids, cylinders, toroids and cones. And it also has a method to create a simple cube. |
|||
前两个参数定义了圆环的半径,而第三个参数则是针对创建多少个三角形而设置的子采样因子。第三个参数的值越大,则物体表面就越平滑且细节愈丰富细腻。网格类提供了一组以建模为目的的布尔函数,其中有对两个网格对象进行并、交、差的操作。 |
|||
To create a toroid, for instance, can be done as follows: |
|||
</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) |
|||
}} |
|||
The first two parameters define the radiuses of the toroid and the third parameter is a sub-sampling factor for how many triangles are created. The higher this value the smoother and the lower the coarser the body is. |
|||
The Mesh class provides a set of boolean functions that can be used for modeling purposes. It provides union, intersection and difference of two mesh objects. |
|||
{{Code|code= |
{{Code|code= |
||
Line 72: | Line 80: | ||
}} |
}} |
||
<div class="mw-translate-fuzzy"> |
|||
Finally, a full example that computes the intersection between a sphere and a cylinder that intersects the sphere. |
|||
最后,这里给出一个计算球体与立方体相交的示例,显示的是在球体上两者的交集。 |
|||
</div> |
|||
{{Code|code= |
{{Code|code= |
||
import |
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 |
|||
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"> |
|||
=== 七零八碎的小东东 === |
|||
这里还有一个与网格有关的脚本扩展源:即网格模块的单元测试脚本(尽管挺难使的)。 |
|||
在此单元测试中,将调用所有的方法并调整所有的属性,以确保它们的正确性。 |
|||
所以,如果您有充足的冒险精神,就可以去看一看[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. |
|||
=== Examining and Testing === |
|||
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]. |
|||
=== Write your own Algorithms === |
|||
=== Exporting === |
|||
You can even write the mesh to a python module: |
|||
{{Code|code= |
|||
m.write("D:/Develop/Projekte/FreeCAD/FreeCAD_0.7/Mod/Mesh/SavedMesh.py") |
|||
import SavedMesh |
|||
m2 = Mesh.Mesh(SavedMesh.faces) |
|||
}} |
|||
=== Gui related stuff === |
|||
=== Odds and Ends === |
|||
An extensive (though hard to use) source of Mesh related scripting are the unit test scripts of the Mesh-Module. |
|||
In this unit tests literally all methods are called and all properties/attributes are tweaked. |
|||
So if you are bold enough, take a look at the [http://free-cad.svn.sourceforge.net/viewvc/free-cad/trunk/src/Mod/Mesh/App/MeshTestsApp.py?view=markup 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)
网格内核会通过对重合点与边进行排序来小心地创建一个正确的拓扑数据结构。
建模
您可以利用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()
七零八碎的小东东
这里还有一个与网格有关的脚本扩展源:即网格模块的单元测试脚本(尽管挺难使的)。 在此单元测试中,将调用所有的方法并调整所有的属性,以确保它们的正确性。 所以,如果您有充足的冒险精神,就可以去看一看单元测试模块。
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
- FreeCAD scripting: Python, Introduction to Python, Python scripting tutorial, FreeCAD Scripting Basics
- Modules: Builtin modules, Units, Quantity
- Workbenches: Workbench creation, Gui Commands, Commands, Installing more workbenches
- Meshes and Parts: Mesh Scripting, Topological data scripting, Mesh to Part, PythonOCC
- Parametric objects: Scripted objects, Viewproviders (Custom icon in tree view)
- Scenegraph: Coin (Inventor) scenegraph, Pivy
- Graphical interface: Interface creation, Interface creation completely in Python (1, 2, 3, 4, 5), PySide, PySide examples beginner, intermediate, advanced
- Macros: Macros, How to install macros
- Embedding: Embedding FreeCAD, Embedding FreeCADGui
- Other: Expressions, Code snippets, Line drawing function, FreeCAD vector math library (deprecated)
- Hubs: User hub, Power users hub, Developer hub
- Miscellaneous: Import mesh, Export mesh, Create mesh from shape, Regular solid, Unwrap Mesh, Unwrap Face
- Modifying: Harmonize normals, Flip normals, Fill holes, Close hole, Add triangle, Remove components, Remove components by hand, Smooth, Refinement, Decimation, Scale
- Boolean: Union, Intersection, Difference
- Cutting: Cut mesh, Trim mesh, Trim mesh with a plane, Create section from mesh and plane, Cross-sections
- Components and segments: Merge, Split by components, Create mesh segments, Create mesh segments from best-fit surfaces