[Bf-extensions-cvs] [1eecd96] master: Added: IMPORTER in an operator (primitives.py) from Main import menu or special povray add menu to import povray primitives and mesh objects from several *.POV/*.INC files at once. confirmed to work with avogadro files and some other test scenes.

Maurice Raybaud noreply at git.blender.org
Sat Jul 2 19:42:25 CEST 2016


Commit: 1eecd9602f9908350e610c9bef2cb6f0028558ad
Author: Maurice Raybaud
Date:   Sat Jul 2 19:42:09 2016 +0200
Branches: master
https://developer.blender.org/rBA1eecd9602f9908350e610c9bef2cb6f0028558ad

Added: IMPORTER in an operator (primitives.py) from Main import menu or special povray add menu to import povray primitives and mesh objects from several *.POV/*.INC files at once. confirmed to work with avogadro files and some other test scenes.

===================================================================

M	render_povray/__init__.py
M	render_povray/primitives.py
M	render_povray/render.py
M	render_povray/shading.py
M	render_povray/ui.py

===================================================================

diff --git a/render_povray/__init__.py b/render_povray/__init__.py
index f272355..31b7671 100644
--- a/render_povray/__init__.py
+++ b/render_povray/__init__.py
@@ -993,6 +993,11 @@ class RenderPovSettingsObject(PropertyGroup):
         name="Imported Pov location",
         precision=6, 
         default=(0.0, 0.0, 0.0))
+        
+    imported_loc_cap = FloatVectorProperty(
+        name="Imported Pov location",
+        precision=6, 
+        default=(0.0, 0.0, 2.0))
 
     unlock_parameters = BoolProperty(name="Lock",default = False)
     
@@ -1061,11 +1066,7 @@ class RenderPovSettingsObject(PropertyGroup):
     addboundorclip = BoolProperty(description="",default=False)
     
     blob_threshold = FloatProperty(name="Threshold",min=0.00, max=10.0, default=0.6)
-    
-    cylinder_radius = FloatProperty(name="Cylinder R",min=0.00, max=10.0, default=0.04)
-    
 
-    
     blob_strength = FloatProperty(name="Strength",min=-10.00, max=10.0, default=1.00)
     
     res_u = IntProperty(name="U",min=100, max=1000, default=500)
@@ -1089,14 +1090,32 @@ class RenderPovSettingsObject(PropertyGroup):
     all_intersections = BoolProperty(name="All Intersections",default=False)
     
     max_trace = IntProperty(name="Max Trace",min=1, max=100,default=1)
-    
-    
-    
+
+
+    def prop_update_cylinder(self, context):
+        if bpy.ops.pov.cylinder_update.poll():
+            bpy.ops.pov.cylinder_update()
+    cylinder_radius = FloatProperty(name="Cylinder R",min=0.00, max=10.0, default=0.04, update=prop_update_cylinder)
+    cylinder_location_cap = FloatVectorProperty(
+            name="Cylinder Cap Location", subtype='TRANSLATION',
+            description="The position of the 'other' end of the cylinder (relative to object location)",
+            default=(0.0, 0.0, 2.0), update=prop_update_cylinder,
+    )
+
+    imported_cyl_loc = FloatVectorProperty(
+        name="Imported Pov location",
+        precision=6, 
+        default=(0.0, 0.0, 0.0))
+        
+    imported_cyl_loc_cap = FloatVectorProperty(
+        name="Imported Pov location",
+        precision=6, 
+        default=(0.0, 0.0, 2.0))
+
     def prop_update_sphere(self, context):
         bpy.ops.pov.sphere_update()
-    sphere_radius = FloatProperty(name="Sphere radius",min=0.00, max=10.0, default=0.5, update=prop_update_sphere)    
+    sphere_radius = FloatProperty(name="Sphere radius",min=0.00, max=10.0, default=0.5, update=prop_update_sphere)
 
-            
 
     def prop_update_cone(self, context):
         bpy.ops.pov.cone_update()
diff --git a/render_povray/primitives.py b/render_povray/primitives.py
index c668ed2..27010ba 100644
--- a/render_povray/primitives.py
+++ b/render_povray/primitives.py
@@ -1,8 +1,6 @@
 ############ To get POV-Ray specific objects In and Out of Blender ###########
 
 import bpy
-#from . import render
-#from render import POVRAY_RENDER
 from bpy_extras.io_utils import ImportHelper
 from bpy_extras import object_utils
 from math import atan, pi, degrees, sqrt, cos, sin
@@ -19,6 +17,11 @@ from bpy.props import (
         CollectionProperty,
         )
 
+from mathutils import (
+        Vector,
+        )
+        
+#import collections
 
 def pov_define_mesh(mesh, verts, edges, faces, name, hide_geometry=True):
     if mesh is None:
@@ -602,31 +605,115 @@ class POVRAY_OT_box_add(bpy.types.Operator):
         ob.pov.object_as = "BOX"
         return {'FINISHED'}
 
+
+def pov_cylinder_define(context, op, ob, radius, loc, loc_cap):
+    if op:
+        R = op.R
+        loc = bpy.context.scene.cursor_location
+        loc_cap[0] = loc[0]
+        loc_cap[1] = loc[1]
+        loc_cap[2] = (loc[2]+2)
+    vec = Vector(loc_cap) - Vector(loc)
+    depth = vec.length
+    rot = Vector((0, 0, 1)).rotation_difference(vec)  # Rotation from Z axis.
+    trans = rot * Vector((0, 0, depth / 2)) # Such that origin is at center of the base of the cylinder.
+    roteuler = rot.to_euler()
+    if not ob:
+        bpy.ops.object.add(type='MESH', location=loc)
+        ob = context.object
+        ob.name = ob.data.name = "PovCylinder"
+        ob.pov.cylinder_radius = radius
+        ob.pov.cylinder_location_cap = vec
+        ob.pov.object_as = "CYLINDER"
+    else:
+        ob.location = loc
+
+    bpy.ops.object.mode_set(mode="EDIT")
+    bpy.ops.mesh.reveal()
+    bpy.ops.mesh.select_all(action='SELECT')
+    bpy.ops.mesh.delete(type='VERT')
+    bpy.ops.mesh.primitive_cylinder_add(radius=radius, depth=depth, location=loc, rotation=roteuler, end_fill_type='NGON') #'NOTHING'
+    bpy.ops.transform.translate(value=trans)
+
+    bpy.ops.mesh.hide(unselected=False)
+    bpy.ops.object.mode_set(mode="OBJECT")
+    bpy.ops.object.shade_smooth()
+
+
 class POVRAY_OT_cylinder_add(bpy.types.Operator):
     bl_idname = "pov.addcylinder"
     bl_label = "Cylinder"
     bl_description = "Add Cylinder"
     bl_options = {'REGISTER', 'UNDO'}
 
+    # XXX Keep it in sync with __init__'s cylinder Primitive
+    R = FloatProperty(name="Cylinder radius", min=0.00, max=10.0, default=1.0) 
+
+    imported_cyl_loc = FloatVectorProperty(
+        name="Imported Pov base location",
+        precision=6, 
+        default=(0.0, 0.0, 0.0))    
+
+    imported_cyl_loc_cap = FloatVectorProperty(
+        name="Imported Pov cap location",
+        precision=6, 
+        default=(0.0, 0.0, 2.0))
+
     def execute(self,context):
+        props = self.properties
+        R = props.R
+        ob = context.object    
         layers = 20*[False]
         layers[0] = True
-        bpy.ops.mesh.primitive_cylinder_add(layers = layers)
+        if ob:
+            if ob.pov.imported_cyl_loc:
+                LOC = ob.pov.imported_cyl_loc
+            if ob.pov.imported_cyl_loc_cap:
+                LOC_CAP = ob.pov.imported_cyl_loc_cap
+        else:
+            if not props.imported_cyl_loc:
+                LOC_CAP = LOC = bpy.context.scene.cursor_location
+                LOC_CAP[2] += 2.0
+            else:
+                LOC = props.imported_cyl_loc
+                LOC_CAP = props.imported_cyl_loc_cap
+            self.report({'WARNING'}, "This native POV-Ray primitive "
+                                     "won't have any vertex to show in edit mode")            
+
+        pov_cylinder_define(context, self, None, self.R, LOC, LOC_CAP)
+
+        return {'FINISHED'}
+
+
+class POVRAY_OT_cylinder_update(bpy.types.Operator):
+    bl_idname = "pov.cylinder_update"
+    bl_label = "Update"
+    bl_description = "Update Cylinder"
+    bl_options = {'REGISTER', 'UNDO'}
+    COMPAT_ENGINES = {'POVRAY_RENDER'}
+
+    @classmethod
+    def poll(cls, context):
+        engine = context.scene.render.engine
         ob = context.object
-        ob.name = ob.data.name = 'PovCylinder'
-        bpy.ops.object.mode_set(mode="EDIT")
-        self.report({'WARNING'}, "This native POV-Ray primitive "
-                                 "won't have any vertex to show in edit mode")
-        bpy.ops.mesh.hide(unselected=False)
-        bpy.ops.object.mode_set(mode="OBJECT")
-        ob.pov.object_as = "CYLINDER"
+        return (ob and ob.data and ob.type == 'MESH' and ob.pov.object_as == "CYLINDER" and engine in cls.COMPAT_ENGINES)
+
+    def execute(self, context):
+        ob = context.object
+        radius = ob.pov.cylinder_radius
+        loc = ob.location
+        loc_cap = loc + ob.pov.cylinder_location_cap
+
+        pov_cylinder_define(context, None, ob, radius, loc, loc_cap)
 
         return {'FINISHED'}
+
+
 ################################SPHERE##########################################
 def pov_sphere_define(context, op, ob, loc):
         if op:
             R = op.R
-
+            loc = bpy.context.scene.cursor_location
         else:
             assert(ob)
             R = ob.pov.sphere_radius
@@ -648,6 +735,7 @@ def pov_sphere_define(context, op, ob, loc):
             
             bpy.ops.mesh.hide(unselected=False)
             bpy.ops.object.mode_set(mode="OBJECT")
+            bpy.ops.object.shade_smooth()
             #bpy.ops.transform.rotate(axis=obrot,constraint_orientation='GLOBAL')
 
         if not ob:
@@ -659,6 +747,7 @@ def pov_sphere_define(context, op, ob, loc):
             bpy.ops.object.mode_set(mode="EDIT")
             bpy.ops.mesh.hide(unselected=False)
             bpy.ops.object.mode_set(mode="OBJECT")
+
 class POVRAY_OT_sphere_add(bpy.types.Operator):
     bl_idname = "pov.addsphere"
     bl_label = "Sphere"
@@ -677,14 +766,22 @@ class POVRAY_OT_sphere_add(bpy.types.Operator):
         props = self.properties
         R = props.R
         ob = context.object
+        
+        
+        
         if ob:
             if ob.pov.imported_loc:
                 LOC = ob.pov.imported_loc
         else:
-            LOC = bpy.context.scene.cursor_location
+            if not props.imported_loc:
+                LOC = bpy.context.scene.cursor_location
+                
+            else:
+                LOC = props.imported_loc                
+                self.report({'WARNING'}, "This native POV-Ray primitive "
+                                         "won't have any vertex to show in edit mode")            
         pov_sphere_define(context, self, None, LOC)
-        self.report({'WARNING'}, "This native POV-Ray primitive "
-                                 "won't have any vertex to show in edit mode")
+
         return {'FINISHED'}
         
     # def execute(self,context):
@@ -1355,140 +1452,376 @@ class POVRAY_OT_shape_polygon_to_circle_add(bpy.types.Operator):
         return {'FINISHED'}
         
 #############################IMPORT
-class ImportAvogadroPOV(bpy.types.Operator, ImportHelper):
-    """Load Povray File as output by Avogadro"""
-    bl_idname = "import_scene.avogadro"
-    bl_label = "Import POV Avogadro"
+        
+class ImportPOV(bpy.types.Operator, ImportHelper):
+    """Load Povray files"""
+    bl_idname = "import_scene.pov"
+    bl_label = "POV-Ray files (.pov/.inc)"
     bl_options = {'PRESET', 'UNDO'}
     COMPAT_ENGINES = {'POVRAY_RENDER'}
 
-    filename_ext = ".pov"
+    # -----------
+    # File props.
+    files = CollectionProperty(type=bpy.types.OperatorFileListElement, options={'HIDDEN', 'SKIP_SAVE'})
+    directory = Stri

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list