1 |
#!BPY |
#!BPY |
2 |
|
|
3 |
""" |
''' |
4 |
Name: 'Usata' |
Name: "Usata" |
5 |
Blender: 234 |
Blender: 234 |
6 |
Group: 'Export' |
Group: "Export" |
7 |
Tooltip: 'Export to Usata mesh format.' |
Tooltip: "Export to Usata mesh format." |
8 |
""" |
''' |
9 |
# -*- coding: 'utf-8' -*- |
# -*- coding: 'utf-8' -*- |
10 |
|
|
11 |
# Copyright (C) 2001-2005 Chong Kai Xiong (descender) |
# Copyright (C) 2001-2005 Chong Kai Xiong (descender) |
26 |
# * Add save feedback |
# * Add save feedback |
27 |
# * Add more GUI controls |
# * Add more GUI controls |
28 |
|
|
29 |
__author__ = "Chong Kai Xiong" |
__author__ = 'Chong Kai Xiong' |
30 |
__version__ = "0.2" |
__version__ = '0.2' |
31 |
__email__ = "descender@phreaker.net" |
__email__ = 'descender@phreaker.net' |
32 |
__url__ = "http://www.nongnu.org/usata" |
__url__ = 'http://www.nongnu.org/usata' |
33 |
|
|
34 |
import Blender |
import Blender |
35 |
import xml.sax.writer |
import xml.sax.writer |
40 |
|
|
41 |
# i18n |
# i18n |
42 |
|
|
43 |
I18N_DOMAIN = "blender-usata-export" |
I18N_DOMAIN = 'blender-usata-export' |
44 |
|
|
45 |
# event numbers |
# event numbers |
46 |
|
|
48 |
EVENT_SAVE = 100 |
EVENT_SAVE = 100 |
49 |
EVENT_QUIT = 101 |
EVENT_QUIT = 101 |
50 |
EVENT_FILENAME = 102 |
EVENT_FILENAME = 102 |
51 |
|
EVENT_SELECT_CAMERA = 103 |
52 |
|
EVENT_SELECT_MESH = 104 |
53 |
|
|
54 |
|
|
55 |
_ = gettext.gettext |
_ = gettext.gettext |
56 |
|
|
65 |
|
|
66 |
class XmlExporter(object): |
class XmlExporter(object): |
67 |
|
|
68 |
def __init__(self, filename, charset, fp_format): |
def __init__(self, filename, charset, fp_format, export): |
69 |
self.filename = filename |
self.filename = filename |
70 |
self.charset = charset |
self.charset = charset |
71 |
self.fp_format = fp_format |
self.fp_format = fp_format |
72 |
|
self.export = export |
73 |
|
|
74 |
self.file = None |
self.file = None |
75 |
self.writer = None |
self.writer = None |
76 |
|
|
77 |
def write_vertex(self, vertex): |
def write_vertex(self, vertex): |
78 |
self.writer.startElement("vertex", {}) |
self.writer.startElement('vertex', {}) |
79 |
|
|
80 |
self.writer.startElement("position", |
self.writer.startElement('position', |
81 |
{"x": self.fp_format % vertex.co[0], |
{'x': self.fp_format % vertex.co[0], |
82 |
"y": self.fp_format % vertex.co[1], |
'y': self.fp_format % vertex.co[1], |
83 |
"z": self.fp_format % vertex.co[2]} |
'z': self.fp_format % vertex.co[2]} |
84 |
) |
) |
85 |
self.writer.endElement("position") |
self.writer.endElement('position') |
86 |
|
|
87 |
self.writer.startElement("texture", |
self.writer.startElement('texture', |
88 |
{"u": self.fp_format % vertex.uvco[0], |
{'u': self.fp_format % vertex.uvco[0], |
89 |
"v": self.fp_format % vertex.uvco[1]} |
'v': self.fp_format % vertex.uvco[1]} |
90 |
) |
) |
91 |
self.writer.endElement("texture") |
self.writer.endElement('texture') |
92 |
|
|
93 |
self.writer.startElement("normal", |
self.writer.startElement('normal', |
94 |
{"x": self.fp_format % vertex.no[0], |
{'x': self.fp_format % vertex.no[0], |
95 |
"y": self.fp_format % vertex.no[1], |
'y': self.fp_format % vertex.no[1], |
96 |
"z": self.fp_format % vertex.no[2]} |
'z': self.fp_format % vertex.no[2]} |
97 |
) |
) |
98 |
self.writer.endElement("normal") |
self.writer.endElement('normal') |
99 |
|
|
100 |
self.writer.endElement("vertex") |
self.writer.endElement('vertex') |
101 |
|
|
102 |
def write_vertex_list(self, vertices): |
def write_vertex_list(self, vertices): |
103 |
self.writer.startElement("vertices", {}) |
self.writer.startElement('vertices', {}) |
104 |
|
|
105 |
for vertex in vertices: |
for vertex in vertices: |
106 |
self.write_vertex(vertex) |
self.write_vertex(vertex) |
107 |
|
|
108 |
self.writer.endElement("vertices") |
self.writer.endElement('vertices') |
109 |
|
|
110 |
def write_vertex_index_list(self, vertices): |
def write_vertex_index_list(self, vertices): |
111 |
self.writer.startElement("vertex_indices", {}) |
self.writer.startElement('vertex_indices', {}) |
112 |
|
|
113 |
for vertex in vertices: |
for vertex in vertices: |
114 |
self.writer.startElement("index", {}) |
self.writer.startElement('index', {}) |
115 |
self.writer.characters("%d" % vertex.index) |
self.writer.characters('%d' % vertex.index) |
116 |
self.writer.endElement("index") |
self.writer.endElement('index') |
117 |
|
|
118 |
self.writer.endElement("vertex_indices") |
self.writer.endElement('vertex_indices') |
119 |
|
|
120 |
def write_face(self, face): |
def write_face(self, face): |
121 |
self.writer.startElement("face", {}) |
self.writer.startElement('face', {}) |
122 |
|
|
123 |
self.write_vertex_index_list(face.v) |
self.write_vertex_index_list(face.v) |
124 |
|
|
125 |
self.writer.startElement("material", {}) |
self.writer.startElement('material', {}) |
126 |
self.writer.characters("%d" % face.mat) |
self.writer.characters('%d' % face.mat) |
127 |
self.writer.endElement("material") |
self.writer.endElement('material') |
128 |
|
|
129 |
self.writer.endElement("face") |
self.writer.endElement('face') |
130 |
|
|
131 |
def write_face_list(self, faces): |
def write_face_list(self, faces): |
132 |
|
|
133 |
self.writer.startElement("faces", {}) |
self.writer.startElement('faces', {}) |
134 |
|
|
135 |
for face in faces: |
for face in faces: |
136 |
self.write_face(face) |
self.write_face(face) |
137 |
|
|
138 |
self.writer.endElement("faces") |
self.writer.endElement('faces') |
139 |
|
|
140 |
def write_camera(self, camera): |
def write_camera(self, camera): |
141 |
|
|
142 |
camera_obj = Blender.Object.Get(camera.getName()) |
camera_obj = Blender.Object.Get(camera.getName()) |
143 |
|
|
144 |
self.writer.startElement("camera", {}) |
self.writer.startElement('camera', {}) |
145 |
|
|
146 |
self.writer.startElement("name", {}) |
self.writer.startElement('name', {}) |
147 |
self.writer.characters(camera.getName()); |
self.writer.characters(camera.getName()); |
148 |
self.writer.endElement("name") |
self.writer.endElement('name') |
149 |
|
|
150 |
self.writer.startElement("position", |
self.writer.startElement('position', |
151 |
{"x": self.fp_format % camera_obj.loc[0], |
{'x': self.fp_format % camera_obj.loc[0], |
152 |
"y": self.fp_format % camera_obj.loc[1], |
'y': self.fp_format % camera_obj.loc[1], |
153 |
"z": self.fp_format % camera_obj.loc[2]} |
'z': self.fp_format % camera_obj.loc[2]} |
154 |
) |
) |
155 |
self.writer.endElement("position") |
self.writer.endElement('position') |
156 |
|
|
157 |
self.writer.startElement("lens", {}) |
self.writer.startElement('lens', {}) |
158 |
self.writer.characters(self.fp_format % camera.getLens()) |
self.writer.characters(self.fp_format % camera.getLens()) |
159 |
self.writer.endElement("lens") |
self.writer.endElement('lens') |
160 |
|
|
161 |
self.writer.startElement("near", {}) |
self.writer.startElement('near', {}) |
162 |
self.writer.characters(self.fp_format % camera.getClipStart()) |
self.writer.characters(self.fp_format % camera.getClipStart()) |
163 |
self.writer.endElement("near") |
self.writer.endElement('near') |
164 |
|
|
165 |
self.writer.startElement("far", {}) |
self.writer.startElement('far', {}) |
166 |
self.writer.characters(self.fp_format % camera.getClipEnd()) |
self.writer.characters(self.fp_format % camera.getClipEnd()) |
167 |
self.writer.endElement("far") |
self.writer.endElement('far') |
168 |
|
|
169 |
self.writer.endElement("camera") |
self.writer.endElement('camera') |
170 |
|
|
171 |
def write_mesh(self, mesh): |
def write_mesh(self, mesh): |
172 |
|
|
173 |
|
self.writer.startElement('mesh') |
174 |
self.write_vertex_list(mesh.verts) |
self.write_vertex_list(mesh.verts) |
175 |
self.write_face_list(mesh.faces) |
self.write_face_list(mesh.faces) |
176 |
|
self.writer.endElement('mesh') |
177 |
|
|
178 |
def write_object(self, object): |
def write_object(self, object): |
179 |
self.writer.startElement("object", {}) |
self.writer.startElement('object', {}) |
180 |
|
|
181 |
self.writer.startElement("name", {}) |
self.writer.startElement('name', {}) |
182 |
self.writer.characters(object.name) |
self.writer.characters(object.name) |
183 |
self.writer.endElement("name") |
self.writer.endElement('name') |
184 |
|
|
185 |
self.write_mesh(Blender.NMesh.GetRaw(object.name)) |
location = object.getLocation() |
186 |
|
self.writer.startElement('position', |
187 |
|
{'x': self.fp_format % location[0], |
188 |
|
'y': self.fp_format % location[1], |
189 |
|
'z': self.fp_format % location[2]} |
190 |
|
) |
191 |
|
self.writer.endElement('position') |
192 |
|
|
193 |
|
orientn = object.getEuler() |
194 |
|
self.writer.startElement('orientation', |
195 |
|
{'x': self.fp_format % orientn[0], |
196 |
|
'y': self.fp_format % orientn[1], |
197 |
|
'z': self.fp_format % orientn[2]} |
198 |
|
) |
199 |
|
self.writer.endElement('orientation') |
200 |
|
|
201 |
|
size = object.size |
202 |
|
self.writer.startElement('size', |
203 |
|
{'x': self.fp_format % size[0], |
204 |
|
'y': self.fp_format % size[1], |
205 |
|
'z': self.fp_format % size[2]} |
206 |
|
) |
207 |
|
self.writer.endElement('size') |
208 |
|
|
209 |
|
mesh = Blender.NMesh.GetRaw(object.name) |
210 |
|
if mesh and self.export['mesh']: |
211 |
|
self.write_mesh(Blender.NMesh.GetRaw(object.name)) |
212 |
|
|
213 |
self.writer.endElement("object") |
self.writer.endElement('object') |
214 |
|
|
215 |
def write_scene(self): |
def write_scene(self): |
216 |
self.writer.startElement("scene", {}) |
self.writer.startElement('scene', {}) |
|
|
|
|
# write all cameras |
|
|
for camera in Blender.Camera.Get(): |
|
|
self.write_camera(camera) |
|
|
|
|
|
# write mesh objects |
|
|
for object in Blender.Object.Get(): |
|
|
# check if object is a mesh |
|
|
|
|
|
mesh = Blender.NMesh.GetRaw(object.name) |
|
|
if (mesh == None): |
|
|
continue |
|
|
|
|
|
self.write_object(object) |
|
217 |
|
|
218 |
self.writer.endElement("scene") |
if self.export['camera']: |
219 |
|
# write all cameras |
220 |
|
for camera in Blender.Camera.Get(): |
221 |
|
self.write_camera(camera) |
222 |
|
|
223 |
|
if self.export['object']: |
224 |
|
# write all mesh objects |
225 |
|
for object in Blender.Object.Get(): |
226 |
|
if Blender.NMesh.GetRaw(object.name): |
227 |
|
self.write_object(object) |
228 |
|
|
229 |
|
self.writer.endElement('scene') |
230 |
|
|
231 |
def write(self): |
def write(self): |
232 |
print "Writing to file (%s)..." % self.filename |
print 'Writing to file (%s)...' % self.filename |
233 |
|
|
234 |
self.file = open(self.filename, "wt") |
self.file = open(self.filename, 'wt') |
235 |
self.writer = XmlWriter(self.file) |
self.writer = XmlWriter(self.file) |
236 |
|
|
237 |
self.writer.startDocument() |
self.writer.startDocument() |
252 |
|
|
253 |
self.settings.setdefault('filename', 'untitled.xml') |
self.settings.setdefault('filename', 'untitled.xml') |
254 |
self.settings.setdefault('charset', 'UTF-8') |
self.settings.setdefault('charset', 'UTF-8') |
255 |
self.settings.setdefault('float-format', "%.8f") |
self.settings.setdefault('float-format', '%.8f') |
256 |
|
|
257 |
|
self.settings.setdefault('export', |
258 |
|
{'camera' : True, |
259 |
|
'object' : True, |
260 |
|
'mesh' : True} |
261 |
|
) |
262 |
|
|
263 |
def save_settings(self): |
def save_settings(self): |
264 |
Registry.SetKey('Usata', self.settings) |
Registry.SetKey('Usata', self.settings) |
265 |
|
|
266 |
def export(self): |
def export(self): |
267 |
print "Exporting scene..." |
print 'Exporting scene...' |
268 |
exporter = XmlExporter(self.settings['filename'], |
exporter = XmlExporter(self.settings['filename'], |
269 |
self.settings['charset'], |
self.settings['charset'], |
270 |
self.settings['float-format']) |
self.settings['float-format'], |
271 |
|
self.settings['export']) |
272 |
exporter.write() |
exporter.write() |
273 |
|
|
274 |
def draw(self): |
def draw(self): |
279 |
# draw title |
# draw title |
280 |
glColor3f(0.0, 0.0, 0.0) |
glColor3f(0.0, 0.0, 0.0) |
281 |
glRasterPos2i(50, 500) |
glRasterPos2i(50, 500) |
282 |
Blender.Draw.Text(_("Usata XML file exporter")) |
Blender.Draw.Text(_('Usata XML file exporter')) |
283 |
|
|
284 |
# filename entry button |
# filename entry button |
285 |
self.output_name = Blender.Draw.String(_("File: "), EVENT_FILENAME, |
self.output_name = Blender.Draw.String(_('File: '), EVENT_FILENAME, |
286 |
50, 400, 400, 20, |
50, 400, 400, 20, |
287 |
self.settings['filename'], 255, |
self.settings['filename'], 255, |
288 |
"Output filename") |
_('Output filename')) |
289 |
|
|
290 |
# save button |
# export set selection toggles |
291 |
Blender.Draw.Button(_("Save"), EVENT_SAVE, 50, 350, 50, 20, |
|
292 |
"save file") |
self.export_camera = Blender.Draw.Toggle(_('Camera'), EVENT_SELECT_CAMERA, |
293 |
|
50, 450, 50, 20, |
294 |
# quit button |
self.settings['export']['camera'], |
295 |
Blender.Draw.Button(_("Quit"), EVENT_QUIT, 110, 350, 50, 20, |
_('Export cameras')) |
296 |
"exit script") |
|
297 |
|
self.export_mesh = Blender.Draw.Toggle(_('Mesh'), EVENT_SELECT_MESH, |
298 |
|
110, 450, 50, 20, |
299 |
|
self.settings['export']['mesh'], |
300 |
|
_('Export meshes')) |
301 |
|
|
302 |
|
# save/quit buttons |
303 |
|
Blender.Draw.Button(_('Save'), EVENT_SAVE, 50, 350, 50, 20, _('Save file')) |
304 |
|
Blender.Draw.Button(_('Quit'), EVENT_QUIT, 110, 350, 50, 20, _('Exit script')) |
305 |
|
|
306 |
def run(self): |
def run(self): |
307 |
Blender.Draw.Register(self.draw, None, self.handle_event) |
Blender.Draw.Register(self.draw, None, self.handle_event) |
310 |
if event == EVENT_FILENAME: |
if event == EVENT_FILENAME: |
311 |
self.settings['filename'] = self.output_name.val |
self.settings['filename'] = self.output_name.val |
312 |
|
|
313 |
|
elif event == EVENT_SELECT_CAMERA: |
314 |
|
self.settings['export']['camera'] = self.export_camera.val |
315 |
|
|
316 |
|
elif event == EVENT_SELECT_MESH: |
317 |
|
self.settings['export']['object'] = self.export_mesh.val |
318 |
|
self.settings['export']['mesh'] = self.export_mesh.val |
319 |
|
|
320 |
elif event == EVENT_SAVE: |
elif event == EVENT_SAVE: |
321 |
self.export() |
self.export() |
322 |
|
|
334 |
gui = GUIControl() |
gui = GUIControl() |
335 |
gui.run() |
gui.run() |
336 |
|
|
337 |
if __name__ == "__main__": |
if __name__ == '__main__': |
338 |
main() |
main() |