[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20585] branches/soc-2009-kazanbas: Continuing OBJ exporter conversion.
Arystanbek Dyussenov
arystan.d at gmail.com
Tue Jun 2 22:16:33 CEST 2009
Revision: 20585
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20585
Author: kazanbas
Date: 2009-06-02 22:16:33 +0200 (Tue, 02 Jun 2009)
Log Message:
-----------
Continuing OBJ exporter conversion.
- export is initiated by an operator, output filepath is hardcoded for now.
- added code in bpy_interface.c to put 'scripts/bpymodules' in sys.path.
- no UI atm, using default option values, don't know how to do it yet
Modified Paths:
--------------
branches/soc-2009-kazanbas/release/scripts/export_obj-2.5.py
branches/soc-2009-kazanbas/source/blender/python/intern/bpy_interface.c
Modified: branches/soc-2009-kazanbas/release/scripts/export_obj-2.5.py
===================================================================
--- branches/soc-2009-kazanbas/release/scripts/export_obj-2.5.py 2009-06-02 19:29:20 UTC (rev 20584)
+++ branches/soc-2009-kazanbas/release/scripts/export_obj-2.5.py 2009-06-02 20:16:33 UTC (rev 20585)
@@ -35,18 +35,19 @@
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
-# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ***** END GPL LICENCE BLOCK *****
# --------------------------------------------------------------------------
import bpy
+import BPySys
# import Blender
# from Blender import Mesh, Scene, Window, sys, Image, Draw
@@ -56,7 +57,7 @@
# import BPyMessages
# Returns a tuple - path,extension.
-# 'hello.obj' > ('hello', '.obj')
+# 'hello.obj' > ('hello', '.obj')
def splitExt(path):
dotidx = path.rfind('.')
if dotidx == -1:
@@ -95,7 +96,7 @@
if mat:
file.write('Ns %.6f\n' % ((mat.getHardness()-1) * 1.9607843137254901) ) # Hardness, convert blenders 1-511 to MTL's
- file.write('Ka %.6f %.6f %.6f\n' % tuple([c*mat.amb for c in worldAmb]) ) # Ambient, uses mirror colour,
+ file.write('Ka %.6f %.6f %.6f\n' % tuple([c*mat.amb for c in worldAmb]) ) # Ambient, uses mirror colour,
file.write('Kd %.6f %.6f %.6f\n' % tuple([c*mat.ref for c in mat.rgbCol]) ) # Diffuse
file.write('Ks %.6f %.6f %.6f\n' % tuple([c*mat.spec for c in mat.specCol]) ) # Specular
file.write('Ni %.6f\n' % mat.IOR) # Refraction index
@@ -112,14 +113,14 @@
else:
#write a dummy material here?
file.write('Ns 0\n')
- file.write('Ka %.6f %.6f %.6f\n' % tuple([c for c in worldAmb]) ) # Ambient, uses mirror colour,
+ file.write('Ka %.6f %.6f %.6f\n' % tuple([c for c in worldAmb]) ) # Ambient, uses mirror colour,
file.write('Kd 0.8 0.8 0.8\n')
file.write('Ks 0.8 0.8 0.8\n')
file.write('d 1\n') # No alpha
file.write('illum 2\n') # light normaly
# Write images!
- if img: # We have an image on the face!
+ if img: # We have an image on the face!
file.write('map_Kd %s\n' % img.filename.split('\\')[-1].split('/')[-1]) # Diffuse mapping image
elif mat: # No face image. if we havea material search for MTex image.
@@ -183,11 +184,12 @@
copyCount+=1
print '\tCopied %d images' % copyCount
-def write(filename, objects,\
-EXPORT_TRI=False, EXPORT_EDGES=False, EXPORT_NORMALS=False, EXPORT_NORMALS_HQ=False,\
-EXPORT_UV=True, EXPORT_MTL=True, EXPORT_COPY_IMAGES=False,\
-EXPORT_APPLY_MODIFIERS=True, EXPORT_ROTX90=True, EXPORT_BLEN_OBS=True,\
-EXPORT_GROUP_BY_OB=False, EXPORT_GROUP_BY_MAT=False, EXPORT_KEEP_VERT_ORDER=False):
+def write(filename, objects,
+ EXPORT_TRI=False, EXPORT_EDGES=False,
+ EXPORT_NORMALS=False, EXPORT_NORMALS_HQ=False,
+ EXPORT_UV=True, EXPORT_MTL=True, EXPORT_COPY_IMAGES=False,
+ EXPORT_APPLY_MODIFIERS=True, EXPORT_ROTX90=True, EXPORT_BLEN_OBS=True,
+ EXPORT_GROUP_BY_OB=False, EXPORT_GROUP_BY_MAT=False, EXPORT_KEEP_VERT_ORDER=False):
'''
Basic write function. The context and options must be alredy set
This can be accessed externaly
@@ -409,9 +411,9 @@
# MAKE KEY
if faceuv and f_image: # Object is always true.
- key = materialNames[f_mat], f_image.name
+ key = materialNames[f_mat], f_image.name
else:
- key = materialNames[f_mat], None # No image, use None instead.
+ key = materialNames[f_mat], None # No image, use None instead.
# CHECK FOR CONTEXT SWITCH
if key == contextMat:
@@ -528,7 +530,7 @@
print "OBJ Export time: %.2f" % (sys.time() - time1)
-# converted: 0%
+# replaced by do_export
def write_ui(filename):
if not filename.lower().endswith('.obj'):
@@ -787,5 +789,122 @@
Window.WaitCursor(0)
-if __name__ == '__main__':
- Window.FileSelector(write_ui, 'Export Wavefront OBJ', sys.makename(ext='.obj'))
+def do_export(filename, context):
+# Window.EditMode(0)
+# Window.WaitCursor(1)
+
+ EXPORT_APPLY_MODIFIERS = True
+ EXPORT_ROTX90 = True
+ EXPORT_TRI = False
+ EXPORT_EDGES = False
+ EXPORT_NORMALS = False
+ EXPORT_NORMALS_HQ = False
+ EXPORT_UV = True
+ EXPORT_MTL = True
+ EXPORT_SEL_ONLY = True
+ EXPORT_ALL_SCENES = False # XXX not working atm
+ EXPORT_ANIMATION = False
+ EXPORT_COPY_IMAGES = False
+ EXPORT_BLEN_OBS = True
+ EXPORT_GROUP_BY_OB = False
+ EXPORT_GROUP_BY_MAT = False
+ EXPORT_KEEP_VERT_ORDER = False
+
+ base_name, ext = splitExt(filename)
+ context_name = [base_name, '', '', ext] # Base name, scene name, frame number, extension
+
+ orig_scene = context.scene
+
+# if EXPORT_ALL_SCENES:
+# export_scenes = bpy.data.scenes
+# else:
+# export_scenes = [orig_scene]
+
+ # XXX only exporting one scene atm since changing
+ # current scene is not possible.
+ # Brecht says that ideally in 2.5 we won't need such a function,
+ # allowing multiple scenes open at once.
+ export_scenes = [orig_scene]
+
+ # Export all scenes.
+ for scn in export_scenes:
+# scn.makeCurrent() # If already current, this is not slow.
+# context = scn.getRenderingContext()
+ orig_frame = scn.current_frame
+
+ if EXPORT_ALL_SCENES: # Add scene name into the context_name
+ context_name[1] = '_%s' % BPySys.cleanName(scn.name) # WARNING, its possible that this could cause a collision. we could fix if were feeling parranoied.
+
+ # Export an animation?
+ if EXPORT_ANIMATION:
+ scene_frames = xrange(scn.start_frame, context.end_frame+1) # Up to and including the end frame.
+ else:
+ scene_frames = [orig_frame] # Dont export an animation.
+
+ # Loop through all frames in the scene and export.
+ for frame in scene_frames:
+ if EXPORT_ANIMATION: # Add frame to the filename.
+ context_name[2] = '_%.6d' % frame
+
+ scn.current_frame = frame
+ if EXPORT_SEL_ONLY:
+ export_objects = context.selected_objects
+ else:
+ export_objects = scn.objects
+
+ full_path= ''.join(context_name)
+
+ # erm... bit of a problem here, this can overwrite files when exporting frames. not too bad.
+ # EXPORT THE FILE.
+# write(full_path, export_objects,
+# EXPORT_TRI, EXPORT_EDGES, EXPORT_NORMALS,
+# EXPORT_NORMALS_HQ, EXPORT_UV, EXPORT_MTL,
+# EXPORT_COPY_IMAGES, EXPORT_APPLY_MODIFIERS,
+# EXPORT_ROTX90, EXPORT_BLEN_OBS,
+# EXPORT_GROUP_BY_OB, EXPORT_GROUP_BY_MAT, EXPORT_KEEP_VERT_ORDER)
+
+ scn.current_frame = orig_frame
+
+ # Restore old active scene.
+# orig_scene.makeCurrent()
+# Window.WaitCursor(0)
+
+
+class SCRIPT_OT_export_obj(bpy.types.Operator):
+ '''
+ Operator documentatuon text, will be used for the operator tooltip and python docs.
+ '''
+ __label__ = 'My Operator'
+
+ # List of operator properties, the attributes will be assigned
+ # to the class instance from the operator settings before calling.
+ __props__ = [
+ # bpy.types.FloatProperty(attr="setting_1", name="Example 1",
+ # default=10.0, min=0, max=10, description="Add info here"),
+ # bpy.types.IntProperty(attr="setting_2", default=2),
+ # bpy.types.BoolProperty(attr="toggle", default=True)
+ ]
+
+ def execu(self, context):
+ print("Selected: " + context.active_object.name)
+
+ do_export("/tmp/test.obj", context)
+
+ return 'FINISHED'
+
+ def invoke(self, event):
+ print("Invoke")
+ return 'FINISHED'
+
+ def poll(self, context): # Poll isnt working yet
+ print("Poll")
+ return True
+
+if (hasattr(bpy.ops, "SCRIPT_OT_export_obj")):
+ bpy.ops.remove(bpy.ops.SCRIPT_OT_export_obj)
+
+bpy.ops.add(SCRIPT_OT_export_obj)
+
+bpy.ops.SCRIPT_OT_export_obj()
+
+bpy.ops.remove(bpy.ops.SCRIPT_OT_export_obj)
Modified: branches/soc-2009-kazanbas/source/blender/python/intern/bpy_interface.c
===================================================================
--- branches/soc-2009-kazanbas/source/blender/python/intern/bpy_interface.c 2009-06-02 19:29:20 UTC (rev 20584)
+++ branches/soc-2009-kazanbas/source/blender/python/intern/bpy_interface.c 2009-06-02 20:16:33 UTC (rev 20585)
@@ -35,6 +35,8 @@
#include "BPY_extern.h"
+static void bpy_init_syspath();
+
void BPY_free_compiled_text( struct Text *text )
{
if( text->compiled ) {
@@ -126,14 +128,14 @@
/* Initialize thread support (also acquires lock) */
PyEval_InitThreads();
-
/* bpy.* and lets us import it */
bpy_init_modules();
+ /* init sys.path */
+ bpy_init_syspath();
py_tstate = PyGILState_GetThisThreadState();
PyEval_ReleaseThread(py_tstate);
-
}
void BPY_end_python( void )
@@ -148,6 +150,56 @@
return;
}
+void syspath_append(char *dirname)
+{
+ PyObject *mod_sys= NULL, *dict= NULL, *path= NULL, *dir= NULL;
+ short ok=1;
+
+ mod_sys = PyImport_ImportModule( "sys" ); /* new ref */
+
+ if (mod_sys) {
+ dict = PyModule_GetDict( mod_sys ); /* borrowed ref */
+ path = PyDict_GetItemString( dict, "path" ); /* borrowed ref */
+ if ( !PyList_Check( path ) ) {
+ ok = 0;
+ }
+ } else {
+ /* cant get the sys module */
+ /* PyErr_Clear(); is called below */
+ ok = 0;
+ }
+
+ dir = PyString_FromString( dirname );
+
+ if (ok && PySequence_Contains(path, dir)==0) { /* Only add if we need to */
+ if (PyList_Append( path, dir ) != 0) /* decref below */
+ ok = 0; /* append failed */
+ }
+
+ if( (ok==0) || PyErr_Occurred( ) )
+ fprintf(stderr, "Warning: could import or build sys.path\n" );
+
+ PyErr_Clear();
+ Py_DECREF( dir );
+ Py_XDECREF( mod_sys );
+}
+
+/* Adds bpymodules to sys.path */
+static void bpy_init_syspath()
+{
+ char *dir;
+ char mod_dir[FILE_MAX];
+
+ // make path to [home]/scripts/bpymodules
+ dir = BLI_gethome_folder("scripts");
+ BLI_make_file_string("/", mod_dir, dir, "bpymodules");
+
+ if (BLI_exists(mod_dir)) {
+ syspath_append(mod_dir);
+ fprintf(stderr, "'%s' has been added to sys.path\n", mod_dir);
+ }
+}
+
/* Can run a file or text block */
int BPY_run_python_script( bContext *C, const char *fn, struct Text *text )
{
More information about the Bf-blender-cvs
mailing list