Schalter von -o auf -w geändert. Nimmt Parameter json File. Prints in getpositions entfernt.

This commit is contained in:
2025-05-20 11:33:20 +02:00
parent eb175ea768
commit a48c39018c
6 changed files with 237 additions and 71 deletions
+9 -21
View File
@@ -56,7 +56,7 @@ def get_input_positions(msp: ezdxf.document.Drawing.modelspace):
ld[attrib.dxf.tag] = attrib.dxf.text
if attrib.dxf.tag == "IO":
id = attrib.dxf.text
print(f"-- coord io {id}--: {attrib.dxf.insert}") # position des Blocks
#print(f"-- coord io {id}--: {attrib.dxf.insert}") # position des Blocks
pos = attrib.dxf.insert #Position aufzeichnen und bei Bedarf später mit REAL_POS überschreiben
ld["pos"] = (round(pos.x, 1), round(pos.y, 1))
@@ -93,7 +93,7 @@ def create_mappings(positions:dict) -> dict:
warnings = list()
for sensorname,v in positions.items():
unterverteiler_pfad = v["KENNZEICHNUNG"]
print(unterverteiler_pfad)
#print(unterverteiler_pfad)
# PFad zur Karte splitten. Dieser hat z.B. den Inhalt "=AH01+UH02-KF1FDI7"
pattern = r"^=([A-Z]+\d+)([+\-])([A-Z]+\d+)([+\-])([A-Z0-9]+)$"
@@ -148,7 +148,7 @@ def get_subdistributor_positions(msp, dist2sensors):
for distname in all_distributors:
selectstr = f'MTEXT[layer=="{layer}"]'
for text in msp.query(selectstr):
print(f"Text auf Layer 'Busverteiler-Kennzeichnung': {text.dxf.text}")
#print(f"Text auf Layer 'Busverteiler-Kennzeichnung': {text.dxf.text}")
match = re.search("-"+distname, text.dxf.text)
if match:
ret[distname] = (round(text.dxf.insert[0],1), round(text.dxf.insert[1],1)) #nur x und y Koordinate in Json schreiben
@@ -181,7 +181,7 @@ def get_rack_positions(msp):
all_layers = list(config.items('Layer_Pritschen'))
for (layer,v) in all_layers:
selectstr = f'LWPOLYLINEMTEXT[layer=="{layer}"]'
selectstr = f'LWPOLYLINE[layer=="{layer}"]'
for e in msp.query(selectstr):
#print_polyline(e)
rack_key = f"Rack_{rack_counter}"
@@ -228,10 +228,10 @@ def check_file_in_work(work_dir, filename):
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='fetches the x/y positions from a dxf file', prog='getpositions')
parser.add_argument('-f', '--filename', action='store', required=True, default="ST_6300_Steuerungstestlayout1_neueBloecke.dwg", help='which file should be fetched', metavar='myfile.dwg')
parser.add_argument('-f', '--filename', action='store', required=True, default="ST_6300_Steuerungstestlayout1_neueBloecke.dwg", help='which file should be fetched', metavar='myfile.dxf')
parser.add_argument('-s', '--sensors', action='store_true', help='fetch all position of sensors, motors, actors and subdistributors')
parser.add_argument('-r', '--rack', action='store_true', help='fetch all positions of all cable racks')
parser.add_argument('-w', '--write', action='store_true', help='write results into a json file')
parser.add_argument('-w', '--write', action='store', help='write results into a json file')
parser.add_argument('-c', '--console', action='store_true', help='print results to output')
@@ -242,19 +242,7 @@ if __name__ == '__main__':
config_dir = os.environ.get("PROJECT_CFG")
filename = args.filename
if not os.path.exists(filename):
dxf_path = os.path.join(work_dir, filename)
if not os.path.exists(dxf_path):
print(f'no such file {dxf_path}')
raise FileExistsError
else:
dxf_path = filename
if not os.path.exists(dxf_path):
print(f'no such file {dxf_path}')
raise FileExistsError
dxf_file = args.dxf
(dxf_path, dexists) = check_file_in_work(work_dir, dxf_file)
(dxf_path, dexists) = check_file_in_work(work_dir, filename)
doc = get_dxf_file(dxf_path) # type: ignore
msp = doc.modelspace()
@@ -292,8 +280,8 @@ if __name__ == '__main__':
if args.console:
print(to_json(res_rac))
if args.write:
basename = os.path.splitext(args.filename)[0]
write_results(to_json(output_results), work_dir, basename+"_positions.json")
basename = os.path.splitext(args.write)[0]
write_results(to_json(output_results), work_dir, f"{basename}.json")
else:
parser.print_help()
+12 -12
View File
@@ -634,11 +634,12 @@ class TestLinesweep(unittest.TestCase):
rack = RackIDs()
# Füge Racks aus gegebenen Daten hinzu und teile Rack_1 bestehend aus 3 Punkten in 2 Racks auf
rack.add_racks(racks_data)
# Verknüpfe Racks mit echten Schniuttpunkten und füge Schnittpunkte (exakt & beinahe) zu jeweiligem Rack hinzu
# Verknüpfe Racks mit echten Schnittpunkten und füge Schnittpunkte (exakt & beinahe) zu jeweiligem Rack hinzu
rack.join_racks()
self.assertEqual(rack.get_points_from_rack("Rack_1-1"), [Point(0, 0), Point(0, 5), Point (0, 10)])
def test_snap_segments(self):
''' Verlängert Anfangs und Endpunkte von Racks, sodass sie auf naheliegenden Racks liegen'''
racks_data = {
@@ -646,15 +647,17 @@ class TestLinesweep(unittest.TestCase):
'Rack_2': [Point(1, 5), Point(5, 5)],
'Rack_3': [Point(1.5, 7.5), Point(5,7.5)]
}
# Initialisiere Racks
rack = RackIDs()
# Füge Racks aus gegebenen Daten hinzu und teile Rack_1 bestehend aus 3 Punkten in 2 Racks auf
rack.add_racks(racks_data)
# Verknüpfe Racks mit echten Schniuttpunkten und füge Schnittpunkte (exakt & beinahe) zu jeweiligem Rack hinzu
# Verknüpfe Racks mit echten Schnittpunkten und füge Schnittpunkte (exakt & beinahe) zu jeweiligem Rack hinzu
rack.join_racks()
self.assertEqual(rack.get_points_from_rack("Rack_1"), [Point(0, 0), Point(0, 5), Point (0, 10)])
def test_ids_to_point(self):
''' Testet, ob gefragter Punkt auf Racks a, b, c liegt'''
@@ -671,7 +674,7 @@ class TestLinesweep(unittest.TestCase):
def test_add_point_interim(self):
''' Testet das inzufügen und einsortieren eines Zwischenpunktes zwische nRack-Anfang und Rack-Ende'''
''' Testet das hinzufügen und einsortieren eines Zwischenpunktes zwischen Rack-Anfang und Rack-Ende'''
res_rack_seg = {'Rack_1-0': [Point(1, 0), Point(5, 6)],
'Rack_2-0': [Point(1, 8), Point(1, 0)],
@@ -710,7 +713,8 @@ class TestLinesweep(unittest.TestCase):
def test_generate_graph(self):
'''Generiert einen Graphen in 3 unterschiedlichen Ausbauestufen (nur Racks, Racks+Sensoren, Racks+Sensoren+Unterverteiler)'''
'''Generiert einen Graphen in 3 unterschiedlichen Ausbaustufen (nur Racks, Racks+Sensoren, Racks+Sensoren+Unterverteiler)'''
rack_segs = {'Rack_1-0': [Point(0, 0), Point(0, 10)],
'Rack_2-0': [Point(10, -2), Point(10, 5)],
'Rack_2-1': [Point(0, 3), Point(10, 3)]}
@@ -733,31 +737,27 @@ class TestLinesweep(unittest.TestCase):
an.add_sensors(sensors)
an.connect_sensors_to_racks()
G2 = nx.Graph()
pos = an.generate_graph(G2)
edge_colors = [G2[u][v].get('color', 'black') for u, v in G2.edges()]
nx.draw(G2, pos, with_labels=False, node_size=10, font_size=8, edge_color=edge_colors)
plt.show()
an.add_distributors(distributors)
an.connect_distributor_to_racks()
G3 = nx.Graph()
pos = an.generate_graph(G3)
edge_colors = [G3[u][v].get('color', 'black') for u, v in G3.edges()]
nx.draw(G3, pos, with_labels=False, node_size=10, font_size=8, edge_color=edge_colors)
plt.show()
def test_Wegsuche(self):
''' Erstellt Graphen mit Racks, Sensoren und Unterverteilern und sucht kürzeste Wege von Unterverteiler zu zugehörigen Sensoren'''
rack_segs = {'Rack_1-0': [Point(0, 0), Point(0, 10)],
'Rack_2-0': [Point(10, -2), Point(10, 5)],
'Rack_2-1': [Point(0, 3), Point(10, 3)]}
rack_segs = {'Rack_1': [Point(0, 0), Point(0, 10)],
'Rack_2': [Point(10, -2), Point(10, 5)],
'Rack_2': [Point(0, 3), Point(10, 3)]}
sensors = {'Sens_1': Point(1, 1),
'Sens_2': Point(2, 4),
+28 -9
View File
@@ -13,6 +13,18 @@ from plant import Anlage
def load_json(jsonfilename):
with open(jsonfilename, encoding='utf-8') as fh:
return json.load(fh)
def write_results(jsnResults, outdir, filename):
""" write results to a json file
"""
print("writing results to a json file ...")
outfile = os.path.join(outdir, filename)
with open(outfile, 'w', encoding='utf-8') as fh:
fh.write(jsnResults)
print("done")
def to_json(d, pretty: bool = True) -> str:
return json.dumps(d, indent=2 if pretty else None, ensure_ascii=False, default=str) #ensure_ascii false für darstellung von "ue"
def create_plant(racks:dict, sensors:dict, distributors:dict, mapping:dict):
@@ -66,6 +78,8 @@ def create_plant(racks:dict, sensors:dict, distributors:dict, mapping:dict):
if args.graph:
draw_graph(G,an)
return paths
def draw_graph(G:nx.Graph, an:Anlage):
pos = an.get_node_positions()
@@ -75,10 +89,10 @@ def draw_graph(G:nx.Graph, an:Anlage):
plt.show()
def prepare_data(rawdata:dict):
sensors = data["sensors"]
subdists = data["distributors"]
racks = data["racks"]
mapping = data["mapping"]
sensors = rawdata["sensors"]
subdists = rawdata["distributors"]
racks = rawdata["racks"]
mapping = rawdata["mapping"]
dracks = dict()
for rname,lp in racks:
if rname not in dracks:
@@ -93,6 +107,7 @@ if __name__ == "__main__":
parser.add_argument('-f', '--filename', action='store', required=True, default="easy_position.json", help='file with all informations about positions gathered from getpositions', metavar='my_positions.json')
parser.add_argument('-c', '--console', action='store_true', help='Ausgabe auf Konsole')
parser.add_argument('-g', '--graph', action='store_true', help='Zeichnet den Graphen der Anlage')
parser.add_argument('-w', '--write', action='store', help='erstellt Ausgabe-file für das Zeichnen von Kabeln in drawdxf')
args = parser.parse_args()
@@ -104,16 +119,20 @@ if __name__ == "__main__":
jsonfilename = args.filename
sensors_path = os.path.join(work_dir, jsonfilename)
# Einlesen
# Einlesen und Vorbereiten der Daten
rawdata = load_json(sensors_path)
(racks, sensors, subdists, mapping) = prepare_data(rawdata)
# virtuelle Anlage erstellen
plant = create_plant(racks, sensors, subdists, mapping)
# Erstelle Anlage
cable_paths = plant
# Ausgabe schreiben
if args.write:
basename = os.path.splitext(args.write)[0]
write_results(to_json(cable_paths), work_dir, f"{basename}.json")