Exemplo n.º 1
0
    def __init__(self,
                 path,
                 loop=True,
                 sync=True,
                 threaded=False,
                 manager=None,
                 autoStart=True):
        # params
        self.path = path
        self.loop = loop
        self.sync = sync
        self.threaded = threaded
        self.manager = manager

        # we'll create our own manager instance if we didn't get one
        if not self.manager:
            self.manager = Manager()

        # attributes
        self.file = None
        self.thread = None
        self._kill = False
        self.pendingLine = None
        self.startTime = None

        self.startEvent = Event()
        self.stopEvent = Event()
        self.updateEvent = Event()

        if autoStart == True:
            self.start()
Exemplo n.º 2
0
class ManagerView:
    def __init__(self, manager=None, parent=None):
        self.manager = manager
        self.parent = parent
        self.setup()

    def setup(self):
        # create a manager if we didn't get an existing manager
        if self.manager == None:
            self.manager = Manager()

        self.frame = tk.LabelFrame(self.parent, text='System', padx=10, pady=10)
        self.frame.grid() #column=0, row=0)

        # create gui-elements
        self.rb_text_label = tk.Label(self.frame, text="Number of Rigid Bodies")
        self.rb_count_label = tk.Label(self.frame, text="0")
        self.reset_button = tk.Button(self.frame, text='reset', command=self.onResetButton)

        # position elements
        self.rb_text_label.grid(column=0, row=0)
        self.rb_count_label.grid(column=1, row=0)
        self.reset_button.grid(column=2, row=0)

        # register callbacks
        self.manager.updateEvent += self.onManagerUpdate

    # calback method; gets called every time anything inside the manager changes
    def onManagerUpdate(self, manager):
        self.rb_count_label.configure(text=str(len(manager.allRigidBodies())))

    def onResetButton(self):
        if self.manager:
            self.manager.reset()
Exemplo n.º 3
0
    def setup(self):
        # create a manager if we didn't get an existing manager
        if self.manager == None:
            self.manager = Manager()

        self.frame = tk.LabelFrame(self.parent,
                                   text='System',
                                   padx=10,
                                   pady=10)
        self.frame.grid()  #column=0, row=0)

        # create gui-elements
        self.rb_text_label = tk.Label(self.frame,
                                      text="Number of Rigid Bodies")
        self.rb_count_label = tk.Label(self.frame, text="0")
        self.reset_button = tk.Button(self.frame,
                                      text='reset',
                                      command=self.onResetButton)

        # position elements
        self.rb_text_label.grid(column=0, row=0)
        self.rb_count_label.grid(column=1, row=0)
        self.reset_button.grid(column=2, row=0)

        # register callbacks
        self.manager.updateEvent += self.onManagerUpdate
Exemplo n.º 4
0
    def __init__(self, path, loop=True, sync=False, threaded=False, manager=None, autoStart=True):
        # params
        self.path = path
        self.loop = loop
        self.sync = sync
        self.threaded = threaded
        self.manager = manager

        # we'll create our own manager instance if we didn't get one
        if not self.manager:
            self.manager = Manager()

        # attributes
        self.file = None
        self.thread = None
        self._kill = False
        self.pendingLine = None
        self.startTime = None

        self.startEvent = Event()
        self.stopEvent = Event()
        self.updateEvent = Event()

        if autoStart == True:
            self.start()
Exemplo n.º 5
0
 def setup(self):
     # clean existing mess before we start creating a mess
     self.destroy()
     # let's make a mess
     if self.manager == None:
         self.manager = Manager()
     self.writer = OscWriter(host=self.osc_host,
                             port=self.osc_port,
                             manager=self.manager)
     self.reader = JsonReader(self.json_file, manager=self.manager)
Exemplo n.º 6
0
    def __init__(self, owner=None):
        self.owner = owner
        self.manager = Manager.instance_by_ref(self.owner) # try to get a global manager instance
        self.config = bpy.data.objects[self.owner.name].moCapSpawnerConfig
        self.rigid_body_object_list = RigidBodyObjectList()

        if self.config.enabled:
            # register callback for new rigid bodies
            # this method will also invoke the callback for any rigid body
            # that is already in the system
            self.manager.addNewRigidBodyCallback(self.onRigidBody)
Exemplo n.º 7
0
    def __init__(self, owner):
        self.owner = owner
        self.config = bpy.data.objects[self.owner.name].moCapOscConfig
        self.manager = Manager.instance_by_ref(self.owner) # try to get a global manager instance

        try:
            self.reader = OscReader(host=self.config.host, port=self.config.port, manager=self.manager, autoStart=self.config.enabled)
        except NameError as err:
            self.reader = None
            print("Could not initialize OscReader:")
            print(err)
Exemplo n.º 8
0
    def __init__(self, owner=None):
        self.owner = owner
        self.manager = Manager.instance_by_ref(
            self.owner)  # try to get a global manager instance
        self.config = bpy.data.objects[self.owner.name].moCapSpawnerConfig
        self.rigid_body_object_list = RigidBodyObjectList()

        if self.config.enabled:
            # register callback for new rigid bodies
            # this method will also invoke the callback for any rigid body
            # that is already in the system
            self.manager.addNewRigidBodyCallback(self.onRigidBody)
Exemplo n.º 9
0
class ManagerView:
    def __init__(self, manager=None, parent=None):
        self.manager = manager
        self.parent = parent
        self.setup()

    def setup(self):
        # create a manager if we didn't get an existing manager
        if self.manager == None:
            self.manager = Manager()

        self.frame = tk.LabelFrame(self.parent,
                                   text='System',
                                   padx=10,
                                   pady=10)
        self.frame.grid()  #column=0, row=0)

        # create gui-elements
        self.rb_text_label = tk.Label(self.frame,
                                      text="Number of Rigid Bodies")
        self.rb_count_label = tk.Label(self.frame, text="0")
        self.reset_button = tk.Button(self.frame,
                                      text='reset',
                                      command=self.onResetButton)

        # position elements
        self.rb_text_label.grid(column=0, row=0)
        self.rb_count_label.grid(column=1, row=0)
        self.reset_button.grid(column=2, row=0)

        # register callbacks
        self.manager.updateEvent += self.onManagerUpdate

    # calback method; gets called every time anything inside the manager changes
    def onManagerUpdate(self, manager):
        self.rb_count_label.configure(text=str(len(manager.allRigidBodies())))

    def onResetButton(self):
        if self.manager:
            self.manager.reset()
Exemplo n.º 10
0
    def __init__(self, owner):
        self.owner = owner
        self.config = bpy.data.objects[self.owner.name].moCapOscConfig
        self.manager = Manager.instance_by_ref(
            self.owner)  # try to get a global manager instance

        try:
            self.reader = OscReader(host=self.config.host,
                                    port=self.config.port,
                                    manager=self.manager,
                                    autoStart=self.config.enabled)
        except NameError as err:
            self.reader = None
            print("Could not initialize OscReader:")
            print(err)
Exemplo n.º 11
0
    def setup(self):
        # create a manager if we didn't get an existing manager
        if self.manager == None:
            self.manager = Manager()

        self.frame = tk.LabelFrame(self.parent, text='System', padx=10, pady=10)
        self.frame.grid() #column=0, row=0)

        # create gui-elements
        self.rb_text_label = tk.Label(self.frame, text="Number of Rigid Bodies")
        self.rb_count_label = tk.Label(self.frame, text="0")
        self.reset_button = tk.Button(self.frame, text='reset', command=self.onResetButton)

        # position elements
        self.rb_text_label.grid(column=0, row=0)
        self.rb_count_label.grid(column=1, row=0)
        self.reset_button.grid(column=2, row=0)

        # register callbacks
        self.manager.updateEvent += self.onManagerUpdate
Exemplo n.º 12
0
class JsonReader:
    def __init__(self, path, loop=True, sync=False, threaded=False, manager=None, autoStart=True):
        # params
        self.path = path
        self.loop = loop
        self.sync = sync
        self.threaded = threaded
        self.manager = manager

        # we'll create our own manager instance if we didn't get one
        if not self.manager:
            self.manager = Manager()

        # attributes
        self.file = None
        self.thread = None
        self._kill = False
        self.pendingLine = None
        self.startTime = None

        self.startEvent = Event()
        self.stopEvent = Event()
        self.updateEvent = Event()

        if autoStart == True:
            self.start()

    def setup(self):
        try:
            self.file = open(self.path, 'r')
            ColorTerminal().success("Opened file %s" % self.path)
        except:
            ColorTerminal().fail("Could not open file %s" % self.path)

        self.startTime = datetime.now()
        self.startEvent(self)

    def update(self):
        if not self.manager:
            return

        if self.pendingLine == None:
            data = self._nextJsonLine()
        else:
            data = self.pendingLine
            self.pendingLine = None

        if data == None:
            return

        # are we performing frame time-syncs?
        if self.sync:
            # wait until it's time for the next
            dt = self.getTime()
            if data["t"] > dt:
                # store in pendingLine for later processing
                self.pendingLine = data
                return

        if 'markers' in data:
            # print('JsonReader got markers:', data['markers'])
            for markers in data['markers']:
                self.manager.processMarkersData(data['markers'], batch=data['t'])

        if 'rigidbodies' in data:
            for rigid in data['rigidbodies']:
                self.manager.processRigidBodyObject({
                    'id': rigid['id'],
                    'position': rigid['p'],
                    'orientation': rigid['r']
                }, batch=data['t'])

        # TODO; skeletons?

        # current frame imported, trigger notifications
        self.manager.finishBatch(data['t'])
        self.updateEvent(self)

    def destroy(self):
        if self.file:
            self.file.close()
        self.file = None
        self.startTime = None
        self.stopEvent(self)

    def configure(self, path=None):
        if path: self.path = path

        if path and self.isRunning():
            self.stop()
            self.start()

    def setLoop(self, loop):
        self.loop = loop

    def setFile(self, path):
        if self.isRunning():
            self.stop()
            self.path = path
            self.start()
        else:
            self.path = path

    def getTime(self):
        if self.startTime is None:
            return 0
        return (datetime.now()-self.startTime).total_seconds()

    def _nextJsonLine(self):
        if self.file == None:
            return None

        # this limit avoid we're getting stuck in an endless loop if
        # there are no valid json lines in the file and looping is enabled
        maxTries = 10
        tryCount = 0

        while tryCount < maxTries:
            line = self._readLine()

            try:
                # parse json string
                data = json.loads(line)
                # return parsed string as json object
                return data
            except ValueError:
                # probably a comment line
                # we'll just ignore any non-json line in the file
                pass

            # next try
            tryCount += 1

    def _readLine(self):
        # we need a file handle
        if self.file is None:
            # print "File does not exist."
            return None

        # grab next line from file the file
        line = self.file.readline()

        # if we've got something, return it
        if line != '':
            return line

        # got nothing, probably reached the end of the file
        # if we're looping, start back at the beginning of the file and try again
        if self.loop:
            self.file.seek(0)
            self.startTime = datetime.now()
            return self._readLine()

        # nothing (more) to read and we're not looping
        self.stop()
        return None

    def start(self):
        if not self.threaded:
            self.setup()
            return

        if self.thread and self.thread.isAlive():
            ColorTerminal().warn("OscReader - Can't start while a thread is already running")
            return

        self._kill = False
        # threaded loop method will call setup
        self.thread = threading.Thread(target=self.threaded_loop)
        self.thread.start()

    def stop(self):
        if self.threaded:
            # threaded loop method will call destroy
            self._kill = True
        else:
            self.destroy()

    def threaded_loop(self):
        self.setup()

        while not self._kill:
            self.update()

        self.destroy()

    def isRunning(self):
        return self.startTime != None
Exemplo n.º 13
0
class JsonReader:
    def __init__(self,
                 path,
                 loop=True,
                 sync=True,
                 threaded=False,
                 manager=None,
                 autoStart=True):
        # params
        self.path = path
        self.loop = loop
        self.sync = sync
        self.threaded = threaded
        self.manager = manager

        # we'll create our own manager instance if we didn't get one
        if not self.manager:
            self.manager = Manager()

        # attributes
        self.file = None
        self.thread = None
        self._kill = False
        self.pendingLine = None
        self.startTime = None

        self.startEvent = Event()
        self.stopEvent = Event()
        self.updateEvent = Event()

        if autoStart == True:
            self.start()

    def setup(self):
        try:
            self.file = open(self.path, 'r')
            ColorTerminal().success("Opened file %s" % self.path)
        except:
            ColorTerminal().fail("Could not open file %s" % self.path)

        self.startTime = datetime.now()
        self.startEvent(self)

    def update(self):
        if not self.manager:
            return

        if self.pendingLine == None:
            data = self._nextJsonLine()
        else:
            data = self.pendingLine
            self.pendingLine = None

        if data == None:
            return

        # are we performing frame time-syncs?
        if self.sync:
            # wait until it's time for the next
            dt = self.getTime()
            if data["t"] > dt:
                # store in pendingLine for later processing
                self.pendingLine = data
                return

        if 'markers' in data:
            # print('JsonReader got markers:', data['markers'])
            for markers in data['markers']:
                self.manager.processMarkersData(data['markers'],
                                                batch=data['t'])

        if 'rigidbodies' in data:
            for rigid in data['rigidbodies']:
                self.manager.processRigidBodyObject(
                    {
                        'id': rigid['id'],
                        'position': rigid['p'],
                        'orientation': rigid['r']
                    },
                    batch=data['t'])

        # TODO; skeletons?

        # current frame imported, trigger notifications
        self.manager.finishBatch(data['t'])
        self.updateEvent(self)

    def destroy(self):
        if self.file:
            self.file.close()
        self.file = None
        self.startTime = None
        self.stopEvent(self)

    def configure(self, path=None):
        if path: self.path = path

        if path and self.isRunning():
            self.stop()
            self.start()

    def setLoop(self, loop):
        self.loop = loop

    def setFile(self, path):
        if self.isRunning():
            self.stop()
            self.path = path
            self.start()
        else:
            self.path = path

    def getTime(self):
        if self.startTime is None:
            return 0
        return (datetime.now() - self.startTime).total_seconds()

    def _nextJsonLine(self):
        if self.file == None:
            return None

        # this limit avoid we're getting stuck in an endless loop if
        # there are no valid json lines in the file and looping is enabled
        maxTries = 10
        tryCount = 0

        while tryCount < maxTries:
            line = self._readLine()

            try:
                # parse json string
                data = json.loads(line)
                # return parsed string as json object
                return data
            except ValueError:
                # probably a comment line
                # we'll just ignore any non-json line in the file
                pass

            # next try
            tryCount += 1

    def _readLine(self):
        # we need a file handle
        if self.file is None:
            # print "File does not exist."
            return None

        # grab next line from file the file
        line = self.file.readline()

        # if we've got something, return it
        if line != '':
            return line

        # got nothing, probably reached the end of the file
        # if we're looping, start back at the beginning of the file and try again
        if self.loop:
            self.file.seek(0)
            self.startTime = datetime.now()
            return self._readLine()

        # nothing (more) to read and we're not looping
        self.stop()
        return None

    def start(self):
        if not self.threaded:
            self.setup()
            return

        if self.thread and self.thread.isAlive():
            ColorTerminal().warn(
                "OscReader - Can't start while a thread is already running")
            return

        self._kill = False
        # threaded loop method will call setup
        self.thread = threading.Thread(target=self.threaded_loop)
        self.thread.start()

    def stop(self):
        if self.threaded:
            # threaded loop method will call destroy
            self._kill = True
        else:
            self.destroy()

    def threaded_loop(self):
        self.setup()

        while not self._kill:
            self.update()

        self.destroy()

    def isRunning(self):
        return self.startTime != None
Exemplo n.º 14
0
 def __init__(self, owner):
     self.owner = owner
     self.config = bpy.data.objects[self.owner.name].moCapJsonConfig
     self.manager = Manager.instance_by_ref(self.owner) # try to get a global manager instance
     self.json_reader = JsonReader(path=self.config.file, loop=self.config.loop, sync=self.config.sync, manager=self.manager, autoStart=self.config.enabled)