Eckrad kunktioniert

This commit is contained in:
2026-01-20 11:38:04 +01:00
parent edfb75778e
commit a5baccb40a
3 changed files with 102 additions and 38 deletions
+1 -1
View File
@@ -26,5 +26,5 @@ class Eckrad(BaseModel):
x = x,
y = y,
hoehe = hoehe,
drehung = drehung
drehrichtung = drehrichtung
)
+1 -1
View File
@@ -187,7 +187,7 @@ class Gefaellestrecke(BaseModel):
if rotation_zwischen == 0.0:
rotation_zwischen = -360.0
if (((-360.0<= rotation_zwischen< -270.0)and y > y_angetrieben_1) or ((-90.0< rotation< 0.0)and y > y_angetrieben_1) or
((-270.0< rotation_zwischen< -90.0)and y < y_angetrieben) or
((-270.0< rotation_zwischen< -90.0)and y < y_angetrieben_1) or
(rotation == -90.0 and x < x_angetrieben_1) or ((rotation == -270.0)and x<x_angetrieben_1)):
hat_umlenk_1 = True
umlenk_gerade = True
+100 -36
View File
@@ -2,7 +2,6 @@
placeblocks.py
Erzeugt DXF-Elemente aus einer RuleDesigner-CSV.
"""
import os
import sys
import csv
@@ -13,17 +12,12 @@ import configparser
import ezdxf
from ezdxf import units
from ezdxf.entities import Line
from ezdxf.addons import importer
from ezdxf.math import Matrix44, X_AXIS,Y_AXIS,Z_AXIS
from pathlib import Path
import math
from utils import check_environment_var, setup_logger
from Elemente import Kreisel, VarioFoerderer,Gefaehllestrecke,Angetriebene_Kurve,Bt_element,Omniflo
from Elemente import Kreisel, VarioFoerderer,Gefaehllestrecke,Angetriebene_Kurve,Bt_element,Omniflo, Eckrad
import as_es_methoden
import block_methoden
# --------------------------------------------------------- CFG-Leser für shapes.cfg
def get_shape_cfg(teileart, cfg_path, logger=None):
parser = configparser.ConfigParser()
@@ -136,7 +130,7 @@ def handle_ils_2_0_eckrad(msp, teileid, merkmale, x, y, doc, lib_doc, verbose, s
block_methoden.import_block("Richtungspfeil",lib_doc,doc)
eckrad_rechts = "eckrad_UZS"
eckrad_links = "eckrad_GUZS"
hight = float(merkmale.get("Höhe in m"))
hight = float(merkmale.get("Höhe in m")) * 1000
if eckrad_rechts not in doc.blocks:
block_rechts = doc.blocks.new(name= eckrad_rechts,base_point=(0,0,0))
block_links = doc.blocks.new(name= eckrad_links,base_point=(0,0,0))
@@ -246,7 +240,7 @@ def handle_ils_2_0_gefaellestrecke(msp, teileid, merkmale, x, y, doc, lib_doc, v
return
if upper_hoehe_gefaehlle == hoehe0:
hight ="higher"
else:
elif lower_hoehe_gefaehlle == hoehe0 and winkel != 0:
hight = "lower"
if hat_motor_0 == False and hat_umlenk_0 == False:
blockname = f"Ils_2.0_Gefaellestrecke_{laenge}_{drehung0}_{hoehe_gefaehlle}_{verbunden_am_einen}_{hight}"
@@ -564,12 +558,60 @@ def handle_ils_2_0_variofoerderer(msp, teileid, merkmale, x, y, doc, lib_doc, ve
gefaellestrecke_vario = nachbarn
break
laenge = foerderer.laenge
halbe_laenge = laenge / 2
# Ausrechnung der nötigen Offset falls der Vario Förderer ab mit drei grad mit einem anderen Verbunden ist
winkel_VP_offset_vorne, winkel_VP_offset_hinten = VarioFoerderer.VarioFoerderer.get_offset_of_Vario_line(doc, lib_doc,foerderer, gefaellestrecke_vario)
# Für spätere berechnung schauen ob der erste Kreis in der Liste höher ist
if upper_hoehe_vario == gefaellestrecke_vario.get("Hoehe0"):
ein_kreisel_höher = True
if "Eckrad_x" in gefaellestrecke_vario and "Eckrad_x_1" not in gefaellestrecke_vario:
x0_eckrad = gefaellestrecke_vario.get("Eckrad_x")
y0_eckrad = gefaellestrecke_vario.get("Eckrad_y")
hoehe_eckrad = gefaellestrecke_vario.get("Eckrad_höhe")
if(upper_hoehe_vario == hoehe_eckrad):
ein_kreisel_höher = True
else:
ein_kreisel_höher = False
mit_horizontal_verbunden = horizontale_ausrichtung(x, y, voerder_richtung, rotation, x0_eckrad, y0_eckrad)
blockname = (f"Vario_Foerderer_{winkel}_{voerder_richtung}_{laenge}_{hoehe_vario}_rechts_{ein_kreisel_höher}_{motor_vorhanden}_{umlenk_vorhanden}_{gefaelle}_{gefahellewinkel}_{mit_horizontal_verbunden}")
block_name_links = (f"Vario_Foerderer_{winkel}_{voerder_richtung}_{laenge}_{hoehe_vario}_links_{ein_kreisel_höher}_{motor_vorhanden}_{umlenk_vorhanden}_{gefaelle}_{gefahellewinkel}_{mit_horizontal_verbunden}")
if blockname not in doc.blocks:
block_vario = doc.blocks.new(blockname, base_point=(0,0,0))
dy_true = halbe_laenge * math.cos (0)
start = (x, y + dy_true,upper_hoehe_vario)
ende = (x,y -dy_true,lower_hoehe_vario)
start, ende = VarioFoerderer.VarioFoerderer.vario_verbuden_am_kreisel(foerderer, block_vario, start, ende, mit_horizontal_verbunden,1,1,ein_kreisel_höher)
VarioFoerderer.VarioFoerderer.vario_erstellung(foerderer, doc, lib_doc, config, block_vario,block_name_links, start, ende,voerder_richtung ,winkel_VP_offset_vorne,winkel_VP_offset_hinten)
# reintuen des förderes in den Modelspace
if merkmale.get("Motorseite")== "links":
msp.add_blockref(block_name_links,(x,y,hoehe_vario),dxfattribs={"rotation": rotation})
return
elif merkmale.get("Motorseite")== "rechts":
msp.add_blockref(blockname,(x,y,hoehe_vario),dxfattribs={"rotation": rotation})
return
if "Eckrad_x" in gefaellestrecke_vario and "Eckrad_x_1" in gefaellestrecke_vario:
blockname = (f"Vario_Foerderer_{winkel}_{voerder_richtung}_{laenge}_{hoehe_vario}_rechts_2_{motor_vorhanden}_{umlenk_vorhanden}_{gefaelle}_{gefahellewinkel}")
block_name_links = (f"Vario_Foerderer_{winkel}_{voerder_richtung}_{laenge}_{hoehe_vario}_links_2_{motor_vorhanden}_{umlenk_vorhanden}_{gefaelle}_{gefahellewinkel}")
if blockname not in doc.blocks:
block_vario = doc.blocks.new(blockname, base_point=(0,0,0))
dy_true = halbe_laenge * math.cos (0)
start = (x, y + dy_true,upper_hoehe_vario)
ende = (x,y -dy_true,lower_hoehe_vario)
start, ende = VarioFoerderer.VarioFoerderer.vario_verbuden_am_kreisel(foerderer, block_vario, start, ende, None,2,)
VarioFoerderer.VarioFoerderer.vario_erstellung(foerderer, doc, lib_doc, config, block_vario,block_name_links, start, ende,voerder_richtung ,winkel_VP_offset_vorne,winkel_VP_offset_hinten)
# reintuen des förderes in den Modelspace
if merkmale.get("Motorseite")== "links":
msp.add_blockref(block_name_links,(x,y,hoehe_vario),dxfattribs={"rotation": rotation})
return
elif merkmale.get("Motorseite")== "rechts":
msp.add_blockref(blockname,(x,y,hoehe_vario),dxfattribs={"rotation": rotation})
return
# Aufruf falls nur mit einem Kreisel verbunden
if "Drehung0" in gefaellestrecke_vario and "Drehung1" not in gefaellestrecke_vario:
# Vorbereitund der Daten des Kreisel
@@ -587,28 +629,7 @@ def handle_ils_2_0_variofoerderer(msp, teileid, merkmale, x, y, doc, lib_doc, ve
# Herausfinden ob der Förderere direkt mit dem Kreisel verbunden ist, die Werte für den Zweiten Kreisel wird auf None gesetzt weil diese nicht existieren
# None als string für späteren vergleich
mit_horizontal_verbunden = "None"
if voerder_richtung == "Horizontal":
if rotation == 0.0:
if y> y0_kreisel:
mit_horizontal_verbunden = "unten_drehung_0_or_-90"
else:
mit_horizontal_verbunden = "oben_drehung_0_or_-90"
if rotation == -180.0:
if y> y0_kreisel:
mit_horizontal_verbunden = "unten_drehung_-180_or_-270"
else:
mit_horizontal_verbunden = "oben_drehung_-180_or_-270"
if rotation == -90.0:
if x> x0_kreisel:
mit_horizontal_verbunden = "unten_drehung_0_or_-90"
else:
mit_horizontal_verbunden = "oben_drehung_0_or_-90"
if rotation == -270.0:
if x> x0_kreisel:
mit_horizontal_verbunden = "unten_drehung_-180_or_-270"
else:
mit_horizontal_verbunden = "oben_drehung_-180_or_-270"
mit_horizontal_verbunden = horizontale_ausrichtung(x, y, voerder_richtung, rotation, x0_kreisel, y0_kreisel)
am_kreisel,kreseil_verbunden =as_es_methoden.am_kreisel_direct_verbunden(x, y, upper_hoehe_vario, lower_hoehe_vario, x0_kreisel, y0_kreisel, richtung_rad0, abstand0, dx, dy, None, None, None, None )
if am_kreisel == 1:
# Erstellung der blockname für wenn die Motorstation rechts und links
@@ -702,8 +723,8 @@ def handle_ils_2_0_variofoerderer(msp, teileid, merkmale, x, y, doc, lib_doc, ve
# Falls der Förder mit beiden Kreisel verbunden ist
if kreisel_verbunden == 2:
# Erstellung der blockname für wenn die Motorstation rechts und links
blockname = (f"Vario_Foerderer_{winkel}_{voerder_richtung}_{laenge}_{hoehe_vario}_rechts_{drehung0}_{drehung1}_{kreisel_verbunden}_{motor_vorhanden}_{umlenk_vorhanden}_{gefaelle}_{gefahellewinkel}")
block_name_links = (f"Vario_Foerderer_{winkel}_{voerder_richtung}_{laenge}_{hoehe_vario}_links_{drehung0}_{drehung1}_{kreisel_verbunden}_{motor_vorhanden}_{umlenk_vorhanden}_{gefaelle}_{gefahellewinkel}")
blockname = (f"Vario_Foerderer_{winkel}_{voerder_richtung}_{laenge}_{hoehe_vario}_rechts_{kreisel_verbunden}_{motor_vorhanden}_{umlenk_vorhanden}_{gefaelle}_{gefahellewinkel}")
block_name_links = (f"Vario_Foerderer_{winkel}_{voerder_richtung}_{laenge}_{hoehe_vario}_links_{kreisel_verbunden}_{motor_vorhanden}_{umlenk_vorhanden}_{gefaelle}_{gefahellewinkel}")
# Falls der Block bereits in dem doc ist platziere diesen einfach
if blockname in doc.blocks:
if merkmale.get("Motorseite")== "links":
@@ -826,6 +847,31 @@ def handle_ils_2_0_variofoerderer(msp, teileid, merkmale, x, y, doc, lib_doc, ve
if merkmale.get("Motorseite")== "rechts":
msp.add_blockref(blockname,(x,y,hoehe_vario),dxfattribs={"rotation": rotation})
def horizontale_ausrichtung(x, y, voerder_richtung, rotation, x0_kreisel, y0_kreisel):
mit_horizontal_verbunden = "None"
if voerder_richtung == "Horizontal":
if rotation == 0.0:
if y> y0_kreisel:
mit_horizontal_verbunden = "unten_drehung_0_or_-90"
else:
mit_horizontal_verbunden = "oben_drehung_0_or_-90"
if rotation == -180.0:
if y> y0_kreisel:
mit_horizontal_verbunden = "unten_drehung_-180_or_-270"
else:
mit_horizontal_verbunden = "oben_drehung_-180_or_-270"
if rotation == -90.0:
if x> x0_kreisel:
mit_horizontal_verbunden = "unten_drehung_0_or_-90"
else:
mit_horizontal_verbunden = "oben_drehung_0_or_-90"
if rotation == -270.0:
if x> x0_kreisel:
mit_horizontal_verbunden = "unten_drehung_-180_or_-270"
else:
mit_horizontal_verbunden = "oben_drehung_-180_or_-270"
return mit_horizontal_verbunden
def handle_ils_2_0_kurve_angetrieben(msp, teileid, merkmale, x, y, doc, lib_doc, verbose, symbols, strecken_nachbarn,config,config_allgemein):
"""Erstellt eine Angetriebene Kurve (Förderer Kurve) in der neuen Dxf"""
voerder_kurve = Angetriebene_Kurve.Angetriebene_Kurve.from_merkmale(teileid,x,y,merkmale)
@@ -935,7 +981,7 @@ def get_nachbar_information(csv_path:Path) -> dict:
kreisel =[]
strecken_nachbarn = []
angetriebene_kurve= []
anweisungen = 0
eckrad_dic= []
"""Gib für jede gefällestrecke zurück welche Drehrichtung die benachbarten Kreisel haben """
with csv_path.open(newline="", encoding="utf-8") as fh:
reader = csv.DictReader(fh, delimiter=';')
@@ -987,11 +1033,19 @@ def get_nachbar_information(csv_path:Path) -> dict:
tefkurve = kurve_angetrieben.antrieb
kurve_winkel = kurve_angetrieben.winkel
angetriebene_kurve.append({"Id": Id,"H0": h0,"H1":h1,"kurvenrichtung":kurvenrichtung,"Tefkurve": tefkurve,"Kurvenwinkel": kurve_winkel,"X_angetrieben":x,"Y_angetrieben":y})
if bezeichner =="ILS 2.0 Eckrad":
Id = row["TeileId"].strip()
planquadrat = row["Planquadrat"]
x, y = extract_coords(planquadrat)
merkmale = parse_merkmale(row.get("Merkmale", ""))
eckrad_att = Eckrad.Eckrad.from_merkmale(Id,x,y,merkmale)
eckrad_dic.append({"Id": Id,"H0": eckrad_att.hoehe,"Eckrad_x": x,"Eckrad_y": y})
for gerade in geraden:
anweisungen = 0
voerder_anweisung = 0
geraden_anweisung = 0
eckrad_anweisung = 0
eintrag = {"Id": gerade["Id"]}
for foerderer in angetriebene_kurve:
if foerderer["Id"] in gerade["NachbarIds"]:
@@ -1012,7 +1066,17 @@ def get_nachbar_information(csv_path:Path) -> dict:
eintrag["Kurvenrichtung_1"] = foerderer.get("kurvenrichtung")
eintrag["Tefkurve_1"] = foerderer.get("Tefkurve")
eintrag["Kurvenwinkel_1"] = foerderer.get("Kurvenwinkel")
for eckrad in eckrad_dic:
if eckrad["Id"] in gerade["NachbarIds"]:
if eckrad_anweisung == 0:
eintrag["Eckrad_x"] = eckrad.get("Eckrad_x")
eintrag["Eckrad_y"] = eckrad.get("Eckrad_y")
eintrag["Eckrad_höhe"] = eckrad.get("H0")
eckrad_anweisung = 1
elif eckrad_anweisung == 1:
eintrag["Eckrad_x_1"] = eckrad.get("Eckrad_x")
eintrag["Eckrad_y_1"] = eckrad.get("Eckrad_y")
eintrag["Eckrad_höhe_1"] = eckrad.get("H0")
for kreis in kreisel:
if kreis["Id"] in gerade["NachbarIds"]:
if anweisungen == 0: