
| Current Path : /home/ift/52_procpy/dataninja/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : //home/ift/52_procpy/dataninja/procobj.py |
# -*- coding: utf-8 -*-
import os
import re
import sys
import time
import math
import json
#*********************************************************************
class Procobj (object):
def __init__ (self):
pass
#*********************************************************************
def load (self,filename):
self.text = open(filename).read()
self.generate_data()
self.check_data()
#*********************************************************************
def generate_data (self):
'''
Computes data structure
'''
exec(self.text)
self.data = {} # all variables of all functions will be stored here
self.vars = set() # set of all variables at all
obj = PROC()
for fkt in PROC.__dict__:
try:
obj.__dict__ = {}
PROC.__dict__[fkt](obj)
self.data[fkt] = obj.__dict__.copy()
except:
continue
self.vars = self.vars | set( self.data[fkt].keys() )
self.vars = list(self.vars)
self.vars.sort()
#*********************************************************************
def check_data (self):
self.targets = ''
for fkt in self.data: # Normalize
if not 'BLOCK' in self.data[fkt]:
self.data[fkt]['BLOCK'] = [ fkt, 'DEFAULT', 0, 0, 0, 0]
else:
if type(self.data[fkt]['BLOCK']) == type(''):
self.data[fkt]['BLOCK'] = [self.data[fkt]['BLOCK'],"DEFAULT"]
try:
self.data[fkt]['BLOCK'][1]
except:
self.data[fkt]['BLOCK'].append('DEFAULT')
try:
self.data[fkt]['BLOCK'][5]
except:
self.data[fkt]['BLOCK'] = self.data[fkt]['BLOCK'][0:2] + [0,0,0,0]
if 'JUMP' in self.data[fkt]:
if type(self.data[fkt]['JUMP']) == type(''):
if self.data[fkt]['JUMP'] == '':
self.data[fkt]['JUMP'] = {}
else:
self.data[fkt]['JUMP'] = { self.data[fkt]['JUMP'] : [0] }
if type(self.data[fkt]['JUMP']) == type({}):
for i in self.data[fkt]['JUMP']:
if not type(self.data[fkt]['JUMP'][i]) == type([]):
self.data[fkt]['JUMP'][i] = [ self.data[fkt]['JUMP'][i] ]
#*********************************************************************
def new_data (self):
blockmaxx = { '__init__' : 0 } # maximal width of blocks
blockmaxy = { '__init__' : 0 } # maximal height of blocks
anzahl_func = 0
self.funcs = {}
for fkt in self.data: # check all functions but __init__
if fkt == '__init__':
continue
self.funcs[fkt] = anzahl_func
if 'TIME' in self.data[fkt] and 'EFFORT' in self.data[fkt]:
blockmaxx[fkt] = 0
blockmaxy[fkt] = 0
if type(self.data[fkt]['TIME']) == type(()):
for i in self.data[fkt]['TIME']:
blockmaxx[fkt] = blockmaxx[fkt] + float(i)
relative_effort = float(self.data[fkt]['EFFORT'])/float(i)
blockmaxy[fkt] = max(blockmaxy[fkt],relative_effort)
else:
i = float(self.data[fkt]['TIME'])
blockmaxx[fkt] = blockmaxx[fkt] + float(i)
relative_effort = float(self.data[fkt]['EFFORT'])/float(i)
blockmaxy[fkt] = max(blockmaxy[fkt],relative_effort)
blockmaxx['__init__'] = max(blockmaxx['__init__'],blockmaxx[fkt])
blockmaxy['__init__'] = max(blockmaxy['__init__'],blockmaxx[fkt])
anzahl_func = anzahl_func + 1
maxx = (anzahl_func) * blockmaxx['__init__'] # Computation of the
maxy = (anzahl_func) * blockmaxy['__init__'] # dimension of the process
radiusx = 2.7 * (maxx - blockmaxx['__init__'])/2
radiusy = 1.0 * (maxy - blockmaxy['__init__'])/2
zaehler = 0
mittelpunktx = {}
mittelpunkty = {}
for fkt in self.data: # computation of mittelpunkt, width and height of each block
if 'TIME' in self.data[fkt] and 'EFFORT' in self.data[fkt]:
pass
else:
blockmaxx[fkt] = blockmaxx['__init__']
blockmaxy[fkt] = blockmaxy['__init__']
mittelpunktx[fkt] = maxx/2 + math.sin(math.pi*(1.0+2.0*float(zaehler)/float(anzahl_func))) * radiusx
mittelpunkty[fkt] = maxy/2 + math.cos(math.pi*(1.0+2.0*float(zaehler)/float(anzahl_func))) * radiusy
try:
bbxmax = max(bbxmax,mittelpunktx[fkt]+blockmaxx[fkt]/2)
except:
bbxmax = mittelpunktx[fkt]+blockmaxx[fkt]/2
try:
bbxmin = min(bbxmin,mittelpunktx[fkt]-blockmaxx[fkt]/2)
except:
bbxmin = mittelpunktx[fkt]-blockmaxx[fkt]/2
try:
bbymax = max(bbymax,mittelpunkty[fkt]+blockmaxy[fkt]/2)
except:
bbymax = mittelpunkty[fkt]+blockmaxy[fkt]/2
try:
bbymin = min(bbymin,mittelpunkty[fkt]-blockmaxy[fkt]/2)
except:
bbymin = mittelpunkty[fkt]-blockmaxy[fkt]/2
self.data[fkt]['BLOCK'] = self.data[fkt]['BLOCK'][0:2] + [mittelpunktx[fkt],mittelpunkty[fkt],
blockmaxx[fkt],blockmaxy[fkt]]
zaehler = zaehler + 1
self.data['__init__']['BLOCK'] = [blockmaxx['__init__'],blockmaxy['__init__'],
(bbxmax+bbxmin)/2,(bbymax+bbymin)/2,bbxmax-bbxmin,bbymax-bbymin]
#*********************************************************************
def x (self,fkt='__init__'):
return( self.data[fkt]['BLOCK'][2] )
def y (self,fkt='__init__'):
return( self.data[fkt]['BLOCK'][3] )
def w (self,fkt='__init__'):
return( self.data[fkt]['BLOCK'][4] )
def h (self,fkt='__init__'):
return( self.data[fkt]['BLOCK'][5] )
def x0 (self,fkt='__init__'):
return( self.data[fkt]['BLOCK'][2] - self.data[fkt]['BLOCK'][4]/2 )
def x1 (self,fkt='__init__'):
return( self.data[fkt]['BLOCK'][2] + self.data[fkt]['BLOCK'][4]/2 )
def y0 (self,fkt='__init__'):
return( self.data[fkt]['BLOCK'][3] - self.data[fkt]['BLOCK'][5]/2 )
def y1 (self,fkt='__init__'):
return( self.data[fkt]['BLOCK'][3] + self.data[fkt]['BLOCK'][5]/2 )
#*********************************************************************
def prg (self,fkt):
prgcode = ""
for i in self.data[fkt]:
if re.search(r"^(BLOCK|JUMP|ARROW|EXEC|TIME|EFFORT)$",i):
continue
prgcode = prgcode + i + ": " + str(self.data[fkt][i]) + "\n"
return(prgcode)
#*********************************************************************
#if __name__ == '__main__':
#
# if sys.argv[1] == "1":
# pass