d804b889e2090d92fea16e533a5ecd2d88fb5685
[blender.git] / doc / python_api / rst / include__bmesh.rst
1 ..
2    This document is appended to the auto generated bmesh api doc to avoid clogging up the C files with details.
3    to test this run:
4    ./blender.bin -b -noaudio -P doc/python_api/sphinx_doc_gen.py -- --partial bmesh* ; cd doc/python_api ; sphinx-build sphinx-in sphinx-out ; cd ../../
5
6
7 Submodules:
8
9 * :mod:`bmesh.ops`
10 * :mod:`bmesh.types`
11 * :mod:`bmesh.utils`
12
13
14 Intro
15 -----
16
17 This API gives access the blenders internal mesh editing api, featuring geometry connectivity data and
18 access to editing operations such as split, separate, collapse and dissolve.
19
20 The features exposed closely follow the C API,
21 giving python access to the functions used by blenders own mesh editing tools.
22
23 For an overview of BMesh data types and how they reference each other see:
24 `BMesh Design Document <http://wiki.blender.org/index.php/Dev:2.6/Source/Modeling/BMesh/Design>`_ .
25
26
27 .. note::
28
29    **Disk** and **Radial** data is not exposed by the python api since this is for internal use only.
30
31
32 .. warning::
33
34    This API is still in development and experimental, while we don't expect to see large changes,
35    many areas are not well tested yet and so its possible changes will be made that break scripts.
36
37    *Campbell Barton, 13, March 2012*
38
39
40 .. warning::
41
42    TODO items are...
43
44    * add access to BMesh **walkers**
45    * add api for calling BMesh operators (unrelated to bpy.ops)
46    * add custom-data manipulation functions add/remove/rename.
47
48 Example Script
49 --------------
50
51 .. literalinclude:: ../../../release/scripts/templates/bmesh_simple.py
52
53
54 Stand-Alone Module
55 ^^^^^^^^^^^^^^^^^^
56
57 The bmesh module is written to be standalone except for :mod:`mathutils`
58 which is used for vertex locations and normals.
59
60 The only other exception to this are when converting mesh data to and from :class:`bpy.types.Mesh`.
61
62
63 Mesh Access
64 -----------
65
66 There are 2 ways to access BMesh data, you can create a new BMesh by converting a mesh from
67 :class:`bpy.types.BlendData.meshes` or by accessing the current edit mode mesh.
68 see: :class:`bmesh.types.BMesh.from_mesh` and :mod:`bmesh.from_edit_mesh` respectively.
69
70 When explicitly converting from mesh data python **owns** the data, that is to say - that the mesh only exists while
71 python holds a reference to it, and the script is responsible for putting it back into a mesh data-block when the edits
72 are done.
73
74 Note that unlike :mod:`bpy`, a BMesh does not necessarily correspond to data in the currently open blend file,
75 a BMesh can be created, edited and freed without the user ever seeing or having access to it.
76 Unlike edit mode, the bmesh module can use multiple BMesh instances at once.
77
78 Take care when dealing with multiple BMesh instances since the mesh data can use a lot of memory, while a mesh that
79 python owns will be freed in when the script holds no references to it,
80 its good practice to call :class:`bmesh.types.BMesh.free` which will remove all the mesh data immediately and disable
81 further access.
82
83
84 EditMode Tessellation
85 ^^^^^^^^^^^^^^^^^^^^^
86
87 When writing scripts that operate on editmode data you will normally want to re-calculate the tessellation after
88 running the  script, this needs to be called explicitly.
89
90 The BMesh its self does not store the triangulated faces, they are stored in the :class:`bpy.types.Mesh`,
91 to refresh tessellation faces call :class:`bpy.types.Mesh.calc_tessface`.
92
93
94 CustomData Access
95 -----------------
96
97 BMesh has a unified way to access mesh attributes such as UV's vertex colors, shape keys, edge crease etc.
98
99 This works by having a **layers** property on bmesh data sequences to access the custom data layers which can then be
100 used to access the actual data on each vert/edge/face/loop.
101
102 Here are some examples ...
103
104 .. code-block:: python
105
106    uv_lay = bm.loops.layers.uv.active
107
108    for face in bm.faces:
109        for loop in face.loops:
110            uv = loop[uv_lay].uv
111            print("Loop UV: %f, %f" % uv[:])
112            vert = loop.vert
113            print("Loop Vert: (%f,%f,%f)" % vert.co[:])
114
115
116 .. code-block:: python
117
118    shape_lay = bm.verts.layers.shape["Key.001"]
119
120    for vert in bm.verts:
121        shape = vert[shape_lay]
122        print("Vert Shape: %f, %f, %f" % (shape.x, shape.y, shape.z))
123
124
125 .. code-block:: python
126
127    # in this example the active vertex group index is used,
128    # this is stored in the object, not the BMesh
129    group_index = obj.vertex_groups.active_index
130
131    # only ever one deform weight layer
132    dvert_lay = bm.verts.layers.deform.active
133
134    for vert in bm.verts:
135        dvert = vert[dvert_lay]
136
137        if group_index in dvert:
138            print("Weight %f" % dvert[group_index])
139        else:
140            print("Setting Weight")
141            dvert[group_index] = 0.5
142
143
144 Keeping a Correct State
145 -----------------------
146
147 When modeling in blender there are certain assumptions made about the state of the mesh.
148
149 * hidden geometry isn't selected.
150 * when an edge is selected, its vertices are selected too.
151 * when a face is selected, its edges and vertices are selected.
152 * duplicate edges / faces don't exist.
153 * faces have at least 3 vertices.
154
155 To give developers flexibility these conventions are not enforced,
156 however tools must leave the mesh in a valid state else other tools may behave incorrectly.
157
158 Any errors that arise from not following these conventions is considered a bug in the script,
159 not a bug in blender.
160
161
162 Selection / Flushing
163 ^^^^^^^^^^^^^^^^^^^^
164
165 As mentioned above, it is possible to create an invalid selection state
166 (by selecting a state and then de-selecting one of its vertices's for example), mostly the best way to solve this is to
167 flush the selection after performing a series of edits. this validates the selection state.
168
169
170 Module Functions
171 ----------------