Cleanup: API docs
[blender.git] / doc / python_api / examples / bmesh.ops.1.py
1 # This script uses bmesh operators to make 2 links of a chain.
2
3 import bpy
4 import bmesh
5 import math
6 import mathutils
7
8 # Make a new BMesh
9 bm = bmesh.new()
10
11 # Add a circle XXX, should return all geometry created, not just verts.
12 bmesh.ops.create_circle(
13         bm,
14         cap_ends=False,
15         diameter=0.2,
16         segments=8)
17
18
19 # Spin and deal with geometry on side 'a'
20 edges_start_a = bm.edges[:]
21 geom_start_a = bm.verts[:] + edges_start_a
22 ret = bmesh.ops.spin(
23         bm,
24         geom=geom_start_a,
25         angle=math.radians(180.0),
26         steps=8,
27         axis=(1.0, 0.0, 0.0),
28         cent=(0.0, 1.0, 0.0))
29 edges_end_a = [ele for ele in ret["geom_last"]
30                if isinstance(ele, bmesh.types.BMEdge)]
31 del ret
32
33
34 # Extrude and create geometry on side 'b'
35 ret = bmesh.ops.extrude_edge_only(
36         bm,
37         edges=edges_start_a)
38 geom_extrude_mid = ret["geom"]
39 del ret
40
41
42 # Collect the edges to spin XXX, 'extrude_edge_only' could return this.
43 verts_extrude_b = [ele for ele in geom_extrude_mid
44                    if isinstance(ele, bmesh.types.BMVert)]
45 edges_extrude_b = [ele for ele in geom_extrude_mid
46                    if isinstance(ele, bmesh.types.BMEdge) and ele.is_boundary]
47 bmesh.ops.translate(
48         bm,
49         verts=verts_extrude_b,
50         vec=(0.0, 0.0, 1.0))
51
52
53 # Create the circle on side 'b'
54 ret = bmesh.ops.spin(
55         bm,
56         geom=verts_extrude_b + edges_extrude_b,
57         angle=-math.radians(180.0),
58         steps=8,
59         axis=(1.0, 0.0, 0.0),
60         cent=(0.0, 1.0, 1.0))
61 edges_end_b = [ele for ele in ret["geom_last"]
62                if isinstance(ele, bmesh.types.BMEdge)]
63 del ret
64
65
66 # Bridge the resulting edge loops of both spins 'a & b'
67 bmesh.ops.bridge_loops(
68         bm,
69         edges=edges_end_a + edges_end_b)
70
71
72 # Now we have made a links of the chain, make a copy and rotate it
73 # (so this looks something like a chain)
74
75 ret = bmesh.ops.duplicate(
76         bm,
77         geom=bm.verts[:] + bm.edges[:] + bm.faces[:])
78 geom_dupe = ret["geom"]
79 verts_dupe = [ele for ele in geom_dupe if isinstance(ele, bmesh.types.BMVert)]
80 del ret
81
82 # position the new link
83 bmesh.ops.translate(
84         bm,
85         verts=verts_dupe,
86         vec=(0.0, 0.0, 2.0))
87 bmesh.ops.rotate(
88         bm,
89         verts=verts_dupe,
90         cent=(0.0, 1.0, 0.0),
91         matrix=mathutils.Matrix.Rotation(math.radians(90.0), 3, 'Z'))
92
93 # Done with creating the mesh, simply link it into the scene so we can see it
94
95 # Finish up, write the bmesh into a new mesh
96 me = bpy.data.meshes.new("Mesh")
97 bm.to_mesh(me)
98 bm.free()
99
100
101 # Add the mesh to the scene
102 scene = bpy.context.scene
103 obj = bpy.data.objects.new("Object", me)
104 scene.objects.link(obj)
105
106 # Select and make active
107 scene.objects.active = obj
108 obj.select = True