Welcome to mirror list, hosted at ThFree Co, Russian Federation.

BPyAddMesh.py « bpymodules « scripts « release - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 901e68866cceb3ebb5e95ff1f0b9aef8caa69594 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import Blender
from Blender.Window import EditMode, GetCursorPos, GetViewQuat
import bpy
import BPyMessages

def add_mesh_simple(name, verts, edges, faces):
	'''
	Adds a mesh from verts, edges and faces
	
	name  - new object/mesh name
	verts - list of 3d vectors
	edges - list of int pairs
	faces - list of int triplets/quads
	'''
	
	scn = bpy.data.scenes.active
	if scn.lib: return
	ob_act = scn.objects.active

	is_editmode = EditMode()

	cursor = GetCursorPos()
	quat = None
	if is_editmode or Blender.Get('add_view_align'): # Aligning seems odd for editmode, but blender does it, oh well
		try:	quat = Blender.Mathutils.Quaternion(GetViewQuat())
		except:	pass
	
	# Exist editmode for non mesh types
	if ob_act and ob_act.type != 'Mesh' and is_editmode:
		EditMode(0)
	
	# We are in mesh editmode
	if EditMode():
		me = ob_act.getData(mesh=1)
		
		if me.multires:
			BPyMessages.Error_NoMeshMultiresEdit()
			return
		
		# Add to existing mesh
		# must exit editmode to modify mesh
		EditMode(0)
		
		me.sel = False
		
		vert_offset = len(me.verts)
		edge_offset = len(me.edges)
		face_offset = len(me.faces)
		
		# transform the verts
		txmat = Blender.Mathutils.TranslationMatrix(Blender.Mathutils.Vector(cursor))
		if quat:
			mat = quat.toMatrix()
			mat.invert()
			mat.resize4x4()
			txmat = mat * txmat
		
		txmat = txmat * ob_act.matrixWorld.copy().invert()
		
		
		me.verts.extend(verts)
		# Transform the verts by the cursor and view rotation
		me.transform(txmat, selected_only=True)
		
		if vert_offset:
			me.edges.extend([[i+vert_offset for i in e] for e in edges])
			me.faces.extend([[i+vert_offset for i in f] for f in faces])
		else:
			# Mesh with no data, unlikely
			me.edges.extend(edges)
			me.faces.extend(faces)		
	else:
		
		# Object mode add new
		
		me = bpy.data.meshes.new(name)
		me.verts.extend(verts)
		me.edges.extend(edges)
		me.faces.extend(faces)
		me.sel = True
		
		# Object creation and location
		scn.objects.selected = []
		ob_act = scn.objects.new(me, name)
		scn.objects.active = ob_act
		
		if quat:
			mat = quat.toMatrix()
			mat.invert()
			mat.resize4x4()
			ob_act.setMatrix(mat)
		
		ob_act.loc = cursor
	
	me.calcNormals()
	
	if is_editmode or Blender.Get('add_editmode'):
		EditMode(1)
		
		
			


def write_mesh_script(filepath, me):
	'''
	filepath - path to py file
	me - mesh to write
	'''
	
	name = me.name
	file = open(filepath, 'w')
	
	file.write('#!BPY\n')
	file.write('"""\n')
	file.write('Name: \'%s\'\n' % name)
	file.write('Blender: 245\n')
	file.write('Group: \'AddMesh\'\n')
	file.write('"""\n\n')
	file.write('import BPyAddMesh\n')
	file.write('from Blender.Mathutils import Vector\n\n')
	
	file.write('verts = [\\\n')
	for v in me.verts:
		file.write('Vector(%f,%f,%f),\\\n' % tuple(v.co))
	file.write(']\n')
	
	file.write('edges = []\n') # TODO, write loose edges
	
	file.write('faces = [\\\n')
	for f in me.faces:
		file.write('%s,\\\n' % str(tuple([v.index for v in f])))
	file.write(']\n')
	
	file.write('BPyAddMesh.add_mesh_simple("%s", verts, edges, faces)\n' % name)

# The script below can make a file from a mesh with teh above function...
'''
#!BPY
"""
Name: 'Mesh as AddMesh Script'
Blender: 242
Group: 'Mesh'
Tip: ''
"""
import BPyAddMesh
reload(BPyAddMesh)

import bpy

def main():
	# Add error checking
	scn = bpy.data.scenes.active
	ob = scn.objects.active
	me = ob.getData(mesh=1)
	
	BPyAddMesh.write_mesh_script('/test.py', me)

main()
'''