Skip to content
Snippets Groups Projects
Select Git revision
  • 54e52f64d76d4b2cf77099a27a4c48a536e6a75b
  • master default protected
  • blender-v3.6-release
  • main
  • blender-v4.1-release
  • blender-v4.0-release
  • blender-v3.3-release
  • asset-shelf
  • blender-v3.5-release
  • brush-assets-project
  • blender-v2.93-release
  • blender-v3.4-release
  • xr-dev
  • bholodeck-v3.3
  • blender-v3.2-release
  • temp-xr-tracker
  • blender-v3.1-release
  • screenshots-manual
  • gltf_vtree
  • blender-v2.83-release
  • blender-v3.0-release
  • v3.6.18
  • v3.6.19
  • v3.6.20
  • v3.6.21
  • v3.6.22
  • v3.6.23
  • v4.1.1
  • v4.1.0
  • v3.6.10
  • v3.6.11
  • v3.6.12
  • v3.6.13
  • v3.6.14
  • v3.6.15
  • v3.6.16
  • v3.6.17
  • v3.6.9
  • v3.3.16
  • v3.6.8
  • v3.3.15
41 results

tasks_queue.py

Blame
  • user avatar
    Vilém Duha authored
    This popup informs the user that BlenderKit connects to the internet directly after registration, and asks for consent with it and also performs first search.
    00fefe2d
    History
    tasks_queue.py 3.69 KiB
    # ##### BEGIN GPL LICENSE BLOCK #####
    #
    #  This program is free software; you can redistribute it and/or
    #  modify it under the terms of the GNU General Public License
    #  as published by the Free Software Foundation; either version 2
    #  of the License, or (at your option) any later version.
    #
    #  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
    #  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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    #
    # ##### END GPL LICENSE BLOCK #####
    
    if "bpy" in locals():
        from importlib import reload
    
        utils = reload(utils)
    else:
        from blenderkit import utils
    
    import bpy
    from bpy.app.handlers import persistent
    
    import queue
    
    @persistent
    def scene_load(context):
        user_preferences = bpy.context.preferences.addons['blenderkit'].preferences
        if user_preferences.use_timers:
            if not (bpy.app.timers.is_registered(queue_worker)):
                bpy.app.timers.register(queue_worker)
    
    
    def get_queue():
        # we pick just a random one of blender types, to try to get a persistent queue
        t = bpy.types.Scene
    
        if not hasattr(t, 'task_queue'):
            t.task_queue = queue.Queue()
        return t.task_queue
    
    class task_object:
        def __init__(self, command = '', arguments = (), wait = 0, only_last = False, fake_context = False, fake_context_area = 'VIEW_3D'):
            self.command = command
            self.arguments = arguments
            self.wait = wait
            self.only_last = only_last
            self.fake_context = fake_context
            self.fake_context_area = fake_context_area
    
    def add_task(task, wait = 0, only_last = False, fake_context = False, fake_context_area = 'VIEW_3D'):
        q = get_queue()
        taskob = task_object(task[0],task[1], wait = wait, only_last = only_last, fake_context = fake_context, fake_context_area = fake_context_area)
        q.put(taskob)
    
    
    def queue_worker():
        time_step = 2.0
        q = get_queue()
    
        back_to_queue = [] #delayed events
        stashed = {}
        # first round we get all tasks that are supposed to be stashed and run only once (only_last option)
        # stashing finds tasks with the property only_last and same command and executes only the last one.
        while not q.empty():
            task = q.get()
            if task.only_last:
                stashed[task.command] = task
            else:
                back_to_queue.append(task)
        #return tasks to que except for stashed
        for task in back_to_queue:
            q.put(task)
        #return stashed tasks to queue
        for k in stashed.keys():
            q.put(stashed[k])
        #second round, execute or put back waiting tasks.
        back_to_queue = []
        while not q.empty():
            # print('window manager', bpy.context.window_manager)
            task = q.get()
    
            if task.wait>0:
                task.wait-=time_step
                back_to_queue.append(task)
            else:
                utils.p('as a task:   ')
                utils.p(task.command, task.arguments)
                try:
                    if task.fake_context:
                        fc = utils.get_fake_context(bpy.context, area_type = task.fake_context_area)
                        task.command(fc,*task.arguments)
                    else:
                        task.command(*task.arguments)
                except Exception as e:
                    utils.p('task failed:')
                    print(e)
        for task in back_to_queue:
            q.put(task)
        return 2.0
    
    
    def register():
        bpy.app.handlers.load_post.append(scene_load)
    
    
    def unregister():
        bpy.app.handlers.load_post.remove(scene_load)