aufgerufen von: main
returned: Variablen-Objekt, GOTT-Objekt
# -*- coding:utf-8 -*- from Knoten import Knoten from Weg import Weg import numpy as np class Variablen: '''Design Nach Singleton''' #Erstellt Attribut mit jedem Eintrag des Namedtuples welches in config() aus der JSON datei gebaut wird class __Variablen: def __init__(self,tupel=None): for x in tupel._fields: setattr(self,x,tupel.__getattribute__(x)) instance=None def __init__(self,tupel=None): if not Variablen.instance: Variablen.instance=Variablen.__Variablen(tupel) def __setattr__(self,name,val): setattr(self.instance,name,val) def __getattr__(self, name): return getattr(self.instance,name) class GOTT: class __GOTT: def __init__(self): self.knotenliste=[] self.wegliste=[] self.warteliste=[] instance=None def __init__(self): if not GOTT.instance: GOTT.instance=GOTT.__GOTT() def __setattr__(self,name,val): setattr(self.instance,name,val) def __getattr__(self, name): return getattr(self.instance,name) def config(): '''Importiert JSON txt und baut "variablen" Objekt mit statischen Variablen sowie "GOTT" Objekt mit Knoten-und Wegliste''' import json from collections import namedtuple d=open("./conf.txt",'r') variablen=d.read() d.close() variablen=json.loads(variablen,object_hook= lambda d: namedtuple('X',d.keys())(*d.values())) #Erstellt Variablen-Objekt aus namedtuple-Objekt variablen=Variablen(variablen) #Erstellt np.array aus liste variablen.zentrum=np.array(variablen.zentrum) #Erstellt Knoten-Objekte aus Koordinaten der Axiome variablen.axiom=[Knoten(np.array([float(x[0]),float(x[1])])) for x in variablen.axiom] #Findet die laengste mögliche Kantenlaenge und speichert sie als Attribut ein. variablen.maximaleKantenlaenge=max(variablen.radiallMax,variablen.gitterlMax,variablen.verzweigtlMax,variablen.nebenstrasselMax,variablen.seedlMax) def bilder_setup(img_name, img2_name): ''' Nimmt ein Bild als input, erstellt eine "Regel-Karte". Bei der Bild- erstellung bedenken: Rot = Gitter, Gruen = Verzweigt, Blau = Radial, wobei ein schwarzer Pixel ein Zentrum definiert. ''' import matplotlib.image as mpimg variablen.img = mpimg.imread(img_name) zentrum = [np.argwhere(variablen.img == [0,0,0])[0][1],np.argwhere(variablen.img == [0,0,0])[0][0]] variablen.img2 = mpimg.imread(img2_name) import os bilder_setup(os.getcwd()+"/Regelbilder/"+variablen.regelbild_name, os.getcwd()+"/Bevoelkerungsdichtebilder/"+variablen.bevoelkerungsbild_name) #Erstelt GOTT-Objekt mit Dynamischer Knoten- und Wegliste from copy import copy gott=GOTT() gott.knotenliste=copy(variablen.axiom) gott.wegliste=[] gott.warteliste=[] #Setzt die Nachbarn im Axiom richtig def setNachbarn(knoten): '''Setzt für jeden knoten im Axiom den richtigen Nachbarn''' d=np.inf nachbar=None for v in variablen.axiom: if v is not knoten: dneu=np.linalg.norm(v.koords-knoten.koords) if dneu<d: d=dneu nachbar=v knoten.nachbarn=[nachbar] def axiomwege(): '''Weist den Axiom-Knoten die richtigen Wege zu''' done=[] for i in range(len(variablen.axiom)): if (variablen.axiom[i] not in done) and (variablen.axiom[i].nachbarn[0] not in done): done.append(variablen.axiom[i]) done.append(variablen.axiom[i].nachbarn[0]) for i in range(len(done)/2): w=Weg(done[2*i],done[2*i+1]) gott.wegliste.append(w) done[2*i].nachbarn.remove(done[2*i+1]) done[2*i+1].nachbarn.remove(done[2*i]) for k in variablen.axiom: setNachbarn(k) axiomwege() return variablen,gott
Zunächst werden die beiden Singleton-Objekte die verwendet werden definiert. Das Variablen Objekt enthält alle Inputs, welche sich in der Laufzeit des Programmes nicht ändern. Dazu wird conf.txt mit dem Python eigenen Json-Parser eingelesen und es wird zunächst ein Namedtuple Objekt gebaut. Jedes Element des Namedtuples wird dann zu einem Attribut des Variablen-Objektes gemacht. Dabei werden einige Inputs leicht verändert (z.B werden aus den Axiom-Koordinaten jeweils Knoten-Objekte gemacht).