PspptReader

Python

This is an example of reading a PS-PPT file and plotting a force image. An easter egg has also been hidden.

main 0 files
PspptReader..py
PspptReader..py 2821 bytes
import pspylib.ppt.tools as Tools
import pspylib.ppt.defines as Defines
from pspylib.ppt.reader import Reader
from pspylib.utils.types import PsDict


class PspptReader:

    def __init__(self, file_path):
        self.reader = Reader(file_path)        
        self.start_info, self.param_info, self.rtfd_info, self.rtfd_numbers, self.frame_table = self.get_frame()

    def get_frame(self):
        frame_table = {}
        rtfd_info = {}
        rtfd_numbers = {}
        for index, entry in enumerate(self.reader.table.entries):
            try:
                frame = self.reader.read(entry)
                if frame.type.id == Defines.FRAME_TYPE_SCAN_START:
                        start_info = PsDict(frame.contents).to_dict()
                elif frame.type.id == Defines.FRAME_TYPE_PPT_PARAM :
                        param_info = PsDict(frame.contents).to_dict()
                elif frame.type.id == Defines.FRAME_TYPE_PPT_FD_CURVE:
                        rtfd = PsDict(frame.contents).to_dict()
                        rtfd_info[str(index)] = rtfd['info']
                        rtfd_numbers[str(index)] = {}
                        for i, ch in  enumerate(rtfd['info']['channels']):
                            rtfd_numbers[str(index)][ch['id']] = Tools.decode_numbers('f', rtfd['numbers'][i])
                else: break
                frame_table[str(index)] = frame.type.id
            except:
                print('ERROR')
        return start_info, param_info, rtfd_info, rtfd_numbers, frame_table


if __name__ == "__main__":
    import numpy as np
    import matplotlib.pyplot as plt

    def print_info(ps_ppt_path):
        ps_ppt_reader = PspptReader(ps_ppt_path)
        print(ps_ppt_reader.start_info)

    def get_fd(ps_ppt_path, index=10):
        ps_ppt_reader = PspptReader(ps_ppt_path)
        rtfd_numbers = ps_ppt_reader.rtfd_numbers
        force = rtfd_numbers[str(index)]['Force']
        separation = rtfd_numbers[str(index)]['Separation']
        return force, separation

    def __min_method(data):
        return np.min(data)

    def get_force_image(ps_ppt_path, method=__min_method):
        ps_ppt_reader = PspptReader(ps_ppt_path)
        rtfd_numbers = ps_ppt_reader.rtfd_numbers
        geometry = ps_ppt_reader.start_info['geometry']
        pixel_x = geometry['pixelHeight']
        pixel_y = geometry['pixelWidth']
        rotation = geometry['rotation']

        one_hot = []
        for i  in range(2,len(rtfd_numbers)+2):
            one_hot.append(method(rtfd_numbers[str(i)]['Force']))

        image = np.reshape(one_hot, (pixel_x, pixel_y))
        return image
    
    ps_ppt_path = 'example.ps-ppt'
    img = get_force_image(ps_ppt_path)
    plt.imshow(img, cmap='gray')
    plt.show()
Comments (0)

No comments yet. Be the first to comment!