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 ) { _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs