fix BGE bug #8668: Behavior of os.getcwd() is not consistent between operating systems
[blender-staging.git] / release / scripts / bpymodules / BPyAddMesh.py
1 import Blender
2 from Blender.Window import EditMode, GetCursorPos, GetViewQuat
3 import bpy
4 import BPyMessages
5
6 def add_mesh_simple(name, verts, edges, faces):
7         '''
8         Adds a mesh from verts, edges and faces
9         
10         name  - new object/mesh name
11         verts - list of 3d vectors
12         edges - list of int pairs
13         faces - list of int triplets/quads
14         '''
15         
16         scn = bpy.data.scenes.active
17         if scn.lib: return
18         ob_act = scn.objects.active
19
20         is_editmode = EditMode()
21
22         cursor = GetCursorPos()
23         quat = None
24         if is_editmode or Blender.Get('add_view_align'): # Aligning seems odd for editmode, but blender does it, oh well
25                 try:    quat = Blender.Mathutils.Quaternion(GetViewQuat())
26                 except: pass
27         
28         # Exist editmode for non mesh types
29         if ob_act and ob_act.type != 'Mesh' and is_editmode:
30                 EditMode(0)
31         
32         # We are in mesh editmode
33         if EditMode():
34                 me = ob_act.getData(mesh=1)
35                 
36                 if me.multires:
37                         BPyMessages.Error_NoMeshMultiresEdit()
38                         return
39                 
40                 # Add to existing mesh
41                 # must exit editmode to modify mesh
42                 EditMode(0)
43                 
44                 me.sel = False
45                 
46                 vert_offset = len(me.verts)
47                 edge_offset = len(me.edges)
48                 face_offset = len(me.faces)
49                 
50                 # transform the verts
51                 txmat = Blender.Mathutils.TranslationMatrix(Blender.Mathutils.Vector(cursor))
52                 if quat:
53                         mat = quat.toMatrix()
54                         mat.invert()
55                         mat.resize4x4()
56                         txmat = mat * txmat
57                 
58                 txmat = txmat * ob_act.matrixWorld.copy().invert()
59                 
60                 
61                 me.verts.extend(verts)
62                 # Transform the verts by the cursor and view rotation
63                 me.transform(txmat, selected_only=True)
64                 
65                 if vert_offset:
66                         me.edges.extend([[i+vert_offset for i in e] for e in edges])
67                         me.faces.extend([[i+vert_offset for i in f] for f in faces])
68                 else:
69                         # Mesh with no data, unlikely
70                         me.edges.extend(edges)
71                         me.faces.extend(faces)          
72         else:
73                 
74                 # Object mode add new
75                 
76                 me = bpy.data.meshes.new(name)
77                 me.verts.extend(verts)
78                 me.edges.extend(edges)
79                 me.faces.extend(faces)
80                 me.sel = True
81                 
82                 # Object creation and location
83                 scn.objects.selected = []
84                 ob_act = scn.objects.new(me, name)
85                 scn.objects.active = ob_act
86                 
87                 if quat:
88                         mat = quat.toMatrix()
89                         mat.invert()
90                         mat.resize4x4()
91                         ob_act.setMatrix(mat)
92                 
93                 ob_act.loc = cursor
94         
95         if is_editmode or Blender.Get('add_editmode'):
96                 EditMode(1)
97         else: # adding in object mode means we need to calc normals
98                 me.calcNormals()
99                 
100                         
101
102
103 def write_mesh_script(filepath, me):
104         '''
105         filepath - path to py file
106         me - mesh to write
107         '''
108         
109         name = me.name
110         file = open(filepath, 'w')
111         
112         file.write('#!BPY\n')
113         file.write('"""\n')
114         file.write('Name: \'%s\'\n' % name)
115         file.write('Blender: 245\n')
116         file.write('Group: \'AddMesh\'\n')
117         file.write('"""\n\n')
118         file.write('import BPyAddMesh\n')
119         file.write('from Blender.Mathutils import Vector\n\n')
120         
121         file.write('verts = [\\\n')
122         for v in me.verts:
123                 file.write('Vector(%f,%f,%f),\\\n' % tuple(v.co))
124         file.write(']\n')
125         
126         file.write('edges = []\n') # TODO, write loose edges
127         
128         file.write('faces = [\\\n')
129         for f in me.faces:
130                 file.write('%s,\\\n' % str(tuple([v.index for v in f])))
131         file.write(']\n')
132         
133         file.write('BPyAddMesh.add_mesh_simple("%s", verts, edges, faces)\n' % name)
134
135 # The script below can make a file from a mesh with teh above function...
136 '''
137 #!BPY
138 """
139 Name: 'Mesh as AddMesh Script'
140 Blender: 242
141 Group: 'Mesh'
142 Tip: ''
143 """
144 import BPyAddMesh
145 reload(BPyAddMesh)
146
147 import bpy
148
149 def main():
150         # Add error checking
151         scn = bpy.data.scenes.active
152         ob = scn.objects.active
153         me = ob.getData(mesh=1)
154         
155         BPyAddMesh.write_mesh_script('/test.py', me)
156
157 main()
158 '''