[Bf-extensions-cvs] [77a5597] master: separated pov native primitives to this other python file with operators for import and export.

Maurice Raybaud noreply at git.blender.org
Mon Dec 28 19:02:38 CET 2015


Commit: 77a55970d67fef57b6557e9c969a184b59eb3a23
Author: Maurice Raybaud
Date:   Mon Dec 28 19:02:16 2015 +0100
Branches: master
https://developer.blender.org/rBA77a55970d67fef57b6557e9c969a184b59eb3a23

separated pov native primitives to this other python file with operators for import and export.

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

A	render_povray/primitives.py

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

diff --git a/render_povray/primitives.py b/render_povray/primitives.py
new file mode 100644
index 0000000..c668ed2
--- /dev/null
+++ b/render_povray/primitives.py
@@ -0,0 +1,1494 @@
+############ 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
+
+
+from bpy.props import (
+        StringProperty,
+        BoolProperty,
+        IntProperty,
+        FloatProperty,
+        FloatVectorProperty,
+        EnumProperty,
+        PointerProperty,
+        CollectionProperty,
+        )
+
+
+def pov_define_mesh(mesh, verts, edges, faces, name, hide_geometry=True):
+    if mesh is None:
+        mesh = bpy.data.meshes.new(name)
+    mesh.from_pydata(verts, edges, faces)
+    mesh.update()
+    mesh.validate(False)  # Set it to True to see debug messages (helps ensure you generate valid geometry).
+    if hide_geometry:
+        mesh.vertices.foreach_set("hide", [True] * len(mesh.vertices))
+        mesh.edges.foreach_set("hide", [True] * len(mesh.edges))
+        mesh.polygons.foreach_set("hide", [True] * len(mesh.polygons))
+    return mesh
+
+
+class POVRAY_OT_lathe_add(bpy.types.Operator):
+    bl_idname = "pov.addlathe"
+    bl_label = "Lathe"
+    bl_options = {'REGISTER','UNDO'}
+    bl_description = "adds lathe"
+
+
+    def execute(self, context):
+        layers=[False]*20
+        layers[0]=True
+        bpy.ops.curve.primitive_bezier_curve_add(location=(0, 0, 0),
+            rotation=(0, 0, 0), layers=layers)
+        ob=context.scene.objects.active
+        ob.name = ob.data.name = "PovLathe"
+        ob.pov.object_as='LATHE' 
+        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.transform.rotate(value=-pi/2, axis=(0, 0, 1))
+        bpy.ops.object.mode_set(mode='OBJECT')
+        ob.pov.curveshape = "lathe"
+        bpy.ops.object.modifier_add(type='SCREW')
+        bpy.context.object.modifiers["Screw"].axis = 'Y'
+        bpy.context.object.modifiers["Screw"].show_render = False
+        return {'FINISHED'}
+
+
+        
+def pov_superellipsoid_define(context, op, ob):
+
+        if op:
+            mesh = None
+
+            u = op.se_u
+            v = op.se_v
+            n1 = op.se_n1
+            n2 = op.se_n2
+            edit = op.se_edit
+            se_param1 = n2 # op.se_param1
+            se_param2 = n1 # op.se_param2
+            
+        else:
+            assert(ob)
+            mesh = ob.data
+
+            u = ob.pov.se_u
+            v = ob.pov.se_v
+            n1 = ob.pov.se_n1
+            n2 = ob.pov.se_n2
+            edit = ob.pov.se_edit
+            se_param1 = ob.pov.se_param1
+            se_param2 = ob.pov.se_param2
+            
+        verts = []
+        r=1
+        
+        stepSegment=360/v*pi/180
+        stepRing=pi/u
+        angSegment=0
+        angRing=-pi/2
+
+        step=0
+        for ring in range(0,u-1):
+            angRing += stepRing
+            for segment in range(0,v):
+                step += 1
+                angSegment += stepSegment
+                x = r*(abs(cos(angRing))**n1)*(abs(cos(angSegment))**n2)
+                if (cos(angRing) < 0 and cos(angSegment) > 0) or \
+                        (cos(angRing) > 0 and cos(angSegment) < 0):
+                    x = -x
+                y = r*(abs(cos(angRing))**n1)*(abs(sin(angSegment))**n2)
+                if (cos(angRing) < 0 and sin(angSegment) > 0) or \
+                        (cos(angRing) > 0 and sin(angSegment) < 0):
+                    y = -y
+                z = r*(abs(sin(angRing))**n1)
+                if sin(angRing) < 0:
+                    z = -z
+                x = round(x,4)
+                y = round(y,4)
+                z = round(z,4)
+                verts.append((x,y,z))
+        if edit == 'TRIANGLES':
+            verts.append((0,0,1))
+            verts.append((0,0,-1))
+            
+        faces = []
+        
+        for i in range(0,u-2):
+            m=i*v
+            for p in range(0,v):
+                if p < v-1:
+                    face=(m+p,1+m+p,v+1+m+p,v+m+p)
+                if p == v-1:
+                    face=(m+p,m,v+m,v+m+p)
+                faces.append(face)
+        if edit == 'TRIANGLES':
+            indexUp=len(verts)-2
+            indexDown=len(verts)-1
+            indexStartDown=len(verts)-2-v
+            for i in range(0,v):
+                if i < v-1:
+                    face=(indexDown,i,i+1)
+                    faces.append(face)
+                if i == v-1:
+                    face=(indexDown,i,0)
+                    faces.append(face)
+            for i in range(0,v):
+                if i < v-1:
+                    face=(indexUp,i+indexStartDown,i+indexStartDown+1)
+                    faces.append(face)
+                if i == v-1:
+                    face=(indexUp,i+indexStartDown,indexStartDown)
+                    faces.append(face)
+        if edit == 'NGONS':
+            face=[]
+            for i in range(0,v):
+                face.append(i)
+            faces.append(face)
+            face=[]
+            indexUp=len(verts)-1
+            for i in range(0,v):
+                face.append(indexUp-i)
+            faces.append(face)
+        mesh = pov_define_mesh(mesh, verts, [], faces, "SuperEllipsoid")
+
+        if not ob:
+            ob_base = object_utils.object_data_add(context, mesh, operator=None)
+            ob = ob_base.object
+            #engine = context.scene.render.engine what for?
+            ob = context.object
+            ob.name =  ob.data.name = "PovSuperellipsoid"
+            ob.pov.object_as = 'SUPERELLIPSOID'
+            ob.pov.se_param1 = n2
+            ob.pov.se_param2 = n1
+            
+            ob.pov.se_u = u
+            ob.pov.se_v = v
+            ob.pov.se_n1 = n1 
+            ob.pov.se_n2 = n2
+            ob.pov.se_edit = edit        
+
+            bpy.ops.object.mode_set(mode="EDIT")
+            bpy.ops.mesh.hide(unselected=False)
+            bpy.ops.object.mode_set(mode="OBJECT")
+            
+class POVRAY_OT_superellipsoid_add(bpy.types.Operator):
+    bl_idname = "pov.addsuperellipsoid"
+    bl_label = "Add SuperEllipsoid"
+    bl_description = "Create a SuperEllipsoid"
+    bl_options = {'REGISTER', 'UNDO'}
+    COMPAT_ENGINES = {'POVRAY_RENDER'}
+
+    # XXX Keep it in sync with __init__'s RenderPovSettingsConePrimitive
+    #     If someone knows how to define operators' props from a func, I'd be delighted to learn it!
+    se_param1 = FloatProperty(
+            name="Parameter 1",
+            description="",
+            min=0.00, max=10.0, default=0.04)
+
+    se_param2 = FloatProperty(
+            name="Parameter 2",
+            description="",
+            min=0.00, max=10.0, default=0.04)
+            
+    se_u = IntProperty(name = "U-segments",
+                    description = "radial segmentation",
+                    default = 20, min = 4, max = 265)
+    se_v = IntProperty(name = "V-segments",
+                    description = "lateral segmentation",
+                    default = 20, min = 4, max = 265)
+    se_n1 = FloatProperty(name = "Ring manipulator",
+                      description = "Manipulates the shape of the Ring",
+                      default = 1.0, min = 0.01, max = 100.0)
+    se_n2 = FloatProperty(name = "Cross manipulator",
+                      description = "Manipulates the shape of the cross-section",
+                      default = 1.0, min = 0.01, max = 100.0)
+    se_edit = EnumProperty(items=[("NOTHING", "Nothing", ""),
+                                ("NGONS", "N-Gons", ""),
+                                ("TRIANGLES", "Triangles", "")],
+                        name="Fill up and down",
+                        description="",
+                        default='TRIANGLES')
+
+    @classmethod
+    def poll(cls, context):
+        engine = context.scene.render.engine
+        return (engine in cls.COMPAT_ENGINES)
+        
+    def execute(self,context):
+        pov_superellipsoid_define(context, self, None)
+
+        self.report({'WARNING'}, "This native POV-Ray primitive won't have any vertex to show in edit mode")   
+
+        return {'FINISHED'}
+
+class POVRAY_OT_superellipsoid_update(bpy.types.Operator):
+    bl_idname = "pov.superellipsoid_update"
+    bl_label = "Update"
+    bl_description = "Update Superellipsoid"
+    bl_options = {'REGISTER', 'UNDO'}
+    COMPAT_ENGINES = {'POVRAY_RENDER'}
+
+    @classmethod
+    def poll(cls, context):
+        engine = context.scene.render.engine
+        ob = context.object
+        return (ob and ob.data and ob.type == 'MESH' and engine in cls.COMPAT_ENGINES)
+
+    def execute(self, context):
+        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.object.mode_set(mode="OBJECT")
+
+        pov_superellipsoid_define(context, None, context.object)
+
+        return {'FINISHED'}
+
+def createFaces(vertIdx1, vertIdx2, closed=False, flipped=False):
+    faces = []
+    if not vertIdx1 or not vertIdx2:
+        return None
+    if len(vertIdx1) < 2 and len(vertIdx2) < 2:
+        return None
+    fan = False
+    if (len(vertIdx1) != len(vertIdx2)):
+        if (len(vertIdx1) == 1 and len(vertIdx2) > 1):
+            fan = True
+        else:
+            return None
+    total = len(vertIdx2)
+    if closed:
+        if flipped:
+            face = [
+                vertIdx1[0],
+                vertIdx2[0],
+                vertIdx2[total - 1]]
+            if not fan:
+                face.append(vertIdx1[total - 1])
+            faces.append(face)
+
+        else:
+            face = [vertIdx2[0], vertIdx1[0]]
+            if not fan:
+                face.append(vertIdx1[total - 1])
+            face.append(vertIdx2[total - 1])
+            faces.append(face)
+    for num in range

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list