Ignore:
Timestamp:
05/31/24 03:08:59 (6 months ago)
Author:
sz
Message:
  • compatibility update for modern blender versions (2.80 or later)
  • optional, enabled by default: use a single shared mesh instance for all sticks
  • the stick cylinder is now capped
File:
1 edited

Legend:

Unmodified
Added
Removed
  • blender-povray-animation/frams-pov-import.py

    r630 r1307  
    22    "name": "Framsticks POV import & camera manipulator",
    33    "author": "Szymon Ulatowski, jm soler",
    4     "blender": (2, 70, 0),
     4    "version": (1, 0, 1),
     5    "blender": (2, 80, 0),
    56    "location": "File > Import-Export",
    67    "category": "Import-Export",
     
    140141# create an object containing reference to blender cylinder object
    141142class cylindre:
    142     def __init__(self,nom='cylinderModel',type='cyl',r1=0.1, r2=0.1,h=1.0, n=8,smooth=1):
    143           me=bpy.data.meshes.new(name=nom)
    144           r=[r1,r2]
    145           verts=[]
    146           for i in range(0,2):
    147               for j in range(0,n):
    148                   z=math.sin(j*math.pi*2/(n))*r[i]
    149                   y=math.cos(j*math.pi*2/(n))*r[i]
    150                   x=float(i)*h
    151                   verts.append((x,y,z))
    152 
    153           vlist=[v for v in range(n)]
    154           vlist.append(0)
    155           faces=[]
    156           for i in range(n):
    157               faces.append((vlist[i],vlist[i+1],vlist[i+1]+n,vlist[i]+n))
    158 
    159           if type=='cyl':
    160               pos=[[0.0,0.0,0.0],[0.0,0.0,h]]
    161               verts.append((pos[0][0],pos[0][1],pos[0][2]))
    162               verts.append((pos[1][0],pos[1][1],pos[1][2]))
    163 
    164               for i in range(n):
    165                   faces.append((vlist[i],vlist[i+1],len(vlist)-2))
    166                   faces.append((vlist[i],vlist[i+1],len(vlist)-1))
    167 
    168           me.from_pydata(verts,[],faces)
    169           me.update()
    170           self.objet=bpy.data.objects.new(nom,me)
    171           bpy.context.scene.objects.link(self.objet)
     143    def __init__(self, name='cylinderModel', r1=0.1, r2=0.1, h=1.0, n=8, caps=True):
     144        self.mesh=bpy.data.meshes.new(name=name)
     145        r=[r1,r2]
     146        verts=[]
     147        for i in range(0,2):
     148            for j in range(0,n):
     149                z=math.sin(j*math.pi*2/(n))*r[i]
     150                y=math.cos(j*math.pi*2/(n))*r[i]
     151                x=float(i)*h
     152                verts.append((x,y,z))
     153               
     154        vlist=[v for v in range(n)]
     155        vlist.append(0)
     156        faces=[]
     157        for i in range(n):
     158            faces.append((vlist[i],vlist[i+1],vlist[i+1]+n,vlist[i]+n))
     159
     160        if caps:
     161            faces.append(tuple(range(n-1,-1,-1)))
     162            faces.append(tuple(range(n,2*n)))
     163
     164        self.mesh.from_pydata(verts,[],faces)
     165        self.mesh.update()
     166
     167    def makeObject(self, name):
     168        o = bpy.data.objects.new(name, self.mesh)
     169        bpy.context.collection.objects.link(o)
     170        return o
    172171
    173172# build or update blender objects from a POV file
    174173def updateBlender(SceneParent,num):
    175     global Folder, Files, Current, RecentlyCreated, RecentlyDisappeared
     174    global Folder, Files, Current, RecentlyCreated, RecentlyDisappeared, CylinderMesh, LinkedMesh
    176175    Incoming=analysePOV(os.path.join(Folder,Files[num]))
    177176    RecentlyCreated=[]
     
    186185            # create new blender objects
    187186            bcrea=bpy.data.objects.new(oname,None)
    188             bpy.context.scene.objects.link(bcrea)
     187            bpy.context.collection.objects.link(bcrea)
    189188            bcrea.parent=SceneParent
    190189            newobj.append(bcrea)
    191190            for j in obj['joints']:
    192                 cyl=cylindre(oname+'_j','tube',0.1,0.1,1.0,6)
    193                 cyl.objet.parent=bcrea
    194                 newobj.append(cyl.objet)
     191                if not LinkedMesh:
     192                    CylinderMesh = None
     193                if not CylinderMesh:
     194                    CylinderMesh = cylindre(name = 'linked cylinder' if LinkedMesh else oname+'_j', r1=0.1, r2=0.1, h=1.0, n=6)
     195                o = CylinderMesh.makeObject(oname+'_j')
     196                o.parent=bcrea
     197                newobj.append(o)
    195198
    196199        # update blender loc/rot/scale
     
    224227            print('Creature disappeared:',oname)
    225228
     229def setHideWithKeyframe(o,hide):
     230    o.hide_render = hide
     231    o.hide_viewport = hide
     232    o.keyframe_insert(data_path="hide_viewport",frame=bpy.context.scene.frame_current)
     233    o.keyframe_insert(data_path="hide_render",frame=bpy.context.scene.frame_current)
     234           
    226235# import a sequence of POV files, create object hiererchy, animate
    227236def framsImport(startfile):
     
    232241       global  SceneParent
    233242       global  SkipFrames
     243       global  CylinderMesh
    234244
    235245       scanDir(startfile)
     
    241251       bpy.context.scene.frame_end=max(bpy.context.scene.frame_end,FirstFrame+FrameCount-1)
    242252
     253       CylinderMesh = None
    243254       SceneParent=bpy.data.objects.new("Framsticks_"+str(FirstFrame),None)
    244        bpy.context.scene.objects.link(SceneParent)
     255       bpy.context.collection.objects.link(SceneParent)
    245256       SceneParent.framspov_file=startfile
    246257       SceneParent.framspov_frame=FirstFrame
     
    263274                   obj=Current[oname]
    264275                   for bo in obj:
    265                        bo.hide=True
    266                        bo.keyframe_insert(data_path="hide",frame=bpy.context.scene.frame_current)
     276                       setHideWithKeyframe(bo,True)
    267277               for oname in RecentlyDisappeared:
    268278                   obj=Current[oname]
    269279                   for bo in obj:
    270                        bo.hide=False
    271                        bo.keyframe_insert(data_path="hide",frame=bpy.context.scene.frame_current)
     280                       setHideWithKeyframe(bo,False)
    272281               bpy.context.scene.frame_set(FirstFrame-FirstPOV+k)
    273282               for oname in RecentlyCreated:
    274283                   obj=Current[oname]
    275284                   for bo in obj:
    276                        bo.hide=False
    277                        bo.keyframe_insert(data_path="hide",frame=bpy.context.scene.frame_current)
     285                       setHideWithKeyframe(bo,False)
    278286               for oname in RecentlyDisappeared:
    279287                   obj=Current[oname]
    280288                   for bo in obj:
    281                        bo.hide=True
    282                        bo.keyframe_insert(data_path="hide",frame=bpy.context.scene.frame_current)
     289                       setHideWithKeyframe(bo,True)
    283290                   Current.pop(oname)
    284291
     
    356363    bl_options = {'UNDO'}
    357364
    358     files = CollectionProperty(name="File Path",
     365    files: CollectionProperty(name="File Path",
    359366                          description="File path used for importing",
    360367                          type=bpy.types.OperatorFileListElement)
    361     directory = StringProperty()
    362 
    363     framspov_skip = bpy.props.IntProperty(name="Frame step",min=1,max=100)
     368    directory: StringProperty()
     369
     370    framspov_skip: bpy.props.IntProperty(name="Frame step",min=1,max=100)
     371
     372    framspov_linkedmesh: bpy.props.BoolProperty(name="Linked cylinder mesh", description="Use a single shared cylinder mesh for all sticks", default=True)
    364373
    365374    filename_ext = ".pov"
    366     filter_glob = StringProperty(default="*.pov", options={'HIDDEN'})
     375    filter_glob: StringProperty(default="*.pov", options={'HIDDEN'})
    367376
    368377    def execute(self, context):
    369         global FirstFrame, FrameCount,FileName,SkipFrames
     378        global FirstFrame, FrameCount,FileName,SkipFrames,LinkedMesh
    370379        FirstFrame = bpy.context.scene.frame_current
    371380        FrameCount = 9999
    372381        SkipFrames = self.framspov_skip
     382        LinkedMesh = self.framspov_linkedmesh
    373383        framsImport(os.path.join(self.directory, self.files[0].name))
    374384        return {'FINISHED'}
     
    421431    bpy.utils.register_class(VIEW3D_OT_WritePOVCameraPath)
    422432    bpy.utils.register_class(OBJECT_PT_framspov)
    423     bpy.types.INFO_MT_file_import.append(menu_func_import)
     433    bpy.types.TOPBAR_MT_file_import.append(menu_func_import)
    424434
    425435def unregister():
     
    428438    bpy.utils.unregister_class(VIEW3D_OT_WritePOVCameraPath)
    429439    bpy.utils.unregister_class(OBJECT_PT_framspov)
    430     bpy.types.INFO_MT_file_import.remove(menu_func_import)
    431 
     440    bpy.types.TOPBAR_MT_file_import.remove(menu_func_import)
Note: See TracChangeset for help on using the changeset viewer.