From b4d8632fdfbdc892e1b09acb343ff5ff22e5c8c1 Mon Sep 17 00:00:00 2001
From: Paul Wolok
Date: Mon, 8 Dec 2025 14:21:14 +0100
Subject: [PATCH] refectoring von omniflo
---
lib/Elemente/Omniflo.py | 95 +++++++++++++++++++++++++++++++++++
lib/plant2dxf.py | 108 +++++++++-------------------------------
2 files changed, 118 insertions(+), 85 deletions(-)
create mode 100644 lib/Elemente/Omniflo.py
diff --git a/lib/Elemente/Omniflo.py b/lib/Elemente/Omniflo.py
new file mode 100644
index 0000000..cbf1798
--- /dev/null
+++ b/lib/Elemente/Omniflo.py
@@ -0,0 +1,95 @@
+
+from ezdxf.entities import Line
+import math
+from pydantic import BaseModel, Field, field_validator
+from typing import Optional
+import plant2dxf
+class Omniflo(BaseModel):
+ teileid:str
+ x:float
+ y:float
+
+ sivasnummer:str
+ laenge: Optional [float]
+ drehung: float
+ hoehe : Optional[float]
+ h0: Optional[float] = Field(default = 0.0,description="Höhe unten im CSV")
+ h1: Optional[float] = Field(default = 0.0, description="Höhe Oben im CSV")
+
+ @classmethod
+ def from_merkmale(cls, teileid,x,y, merkmale):
+ sivasnummer = merkmale.get("SivasNummer")
+ try:
+ laenge = float(merkmale.get("Länge in Meter", "0").replace(",", ".")) * 1000 # Meter → mm
+ except Exception:
+ laenge = 0
+ try:
+ winkel = float(merkmale.get("Drehung"))
+ except Exception:
+ winkel = 0.0
+ try:
+ hoehe = float(merkmale.get("Höhe"))
+ except Exception:
+ hoehe = 0.0
+ try:
+ h0 = float(merkmale.get("Höhe unten"))
+ except Exception:
+ h0 = 0.0
+ try:
+ h1 = float(merkmale.get("Höhe oben"))
+ except Exception:
+ h1 = 0.0
+ return cls(
+ teileid= teileid,
+ x=x,
+ y=y,
+ sivasnummer = sivasnummer,
+ laenge = laenge,
+ drehung = winkel,
+ hoehe = hoehe,
+ h0 = h0,
+ h1 = h1
+ )
+ def Omniflo_geraden_erstellung(msp, x, y, doc, tefsivas, omniflo_objekt):
+ winkel_rad = math.radians(omniflo_objekt.drehung)
+ halbe_laenge = omniflo_objekt.laenge / 2
+ # Man muss bei sin -1 machen wegen des links koordinaten system
+ dx = halbe_laenge * math.sin(winkel_rad * -1)
+ dy = halbe_laenge * math.cos(winkel_rad)
+ start = (x + dx, y + dy, omniflo_objekt.h1 )
+ ende = (x - dx, y - dy, omniflo_objekt.h0)
+ if "A-2" not in doc.layers:
+ doc.layers.add(name="A-2", color=2)
+ if "F-1" not in doc.layers:
+ doc.layers.add(name="F-1", color =1)
+ linie=msp.add_line(start, ende)
+ if omniflo_objekt.sivasnummer == tefsivas:
+ linie.dxf.layer = "F-1"
+ else:
+ linie.dxf.layer = "A-2"
+ def omniflo_foerdererstellung(msp, x, y, doc, lib_doc, omniflo_objekt, rotation):
+ plant2dxf.import_block("bogen1",lib_doc,doc)
+ plant2dxf.import_block("bogen2",lib_doc,doc)
+
+ laenge = omniflo_objekt.laenge
+ h0 = omniflo_objekt.h0
+ h1 = omniflo_objekt.h1
+ h_zwischen = (h0 + h1)/2
+ blockname = (f"OF_Förderer_{laenge}_{h_zwischen}")
+ winkel_rad = math.radians(rotation)
+ halbe_laenge = laenge / 2
+ # Man muss bei sin -1 machen wegen des links koordinaten system
+ dx = halbe_laenge * math.sin(rotation * -1)
+ dy = halbe_laenge * math.cos(rotation)
+ start = (x + dx, y + dy, h1 )
+ ende = (x - dx, y - dy, h0)
+ if blockname not in doc.blocks:
+ block = doc.blocks.new(blockname, base_point=(0,0,0))
+ block.add_blockref("bogen1",start)
+ block.add_blockref("bogen2",ende)
+ line = Line.new(dxfattribs={"start": start,"end":ende})
+ copy = line.copy()
+ copy.translate(-x,-y,-h_zwischen)
+ block.add_entity(copy)
+ msp.add_blockref(blockname,(x,y,h_zwischen),dxfattribs={"rotation": rotation})
+
\ No newline at end of file
diff --git a/lib/plant2dxf.py b/lib/plant2dxf.py
index e10bddd..9405b10 100644
--- a/lib/plant2dxf.py
+++ b/lib/plant2dxf.py
@@ -21,7 +21,7 @@ import math
from pydantic import BaseModel, Field, field_validator
from typing import Optional
from utils import check_environment_var, setup_logger
-from Elemente import Kreisel, VarioFoerderer,Gefaehllestrecke,Angetriebene_Kurve,Bt_element
+from Elemente import Kreisel, VarioFoerderer,Gefaehllestrecke,Angetriebene_Kurve,Bt_element,Omniflo
import as_es_methoden
@@ -1255,14 +1255,7 @@ def handle_bt___entladung(msp, teileid, merkmale, x, y, doc, lib_doc, verbose, s
import_block(blockname,lib_doc,doc)
msp.add_blockref(blockname,(x,y,hight),dxfattribs={"rotation": rotation})
-class Omniflo(BaseModel):
- teileid:str
- sivasnummer:str
- laenge: Optional [float]
- drehung: float
- hoehe : Optional[float]
- h0: Optional[float] = Field(description="Höhe unten im CSV")
- h0: Optional[float] = Field(description="Höhe Oben im CSV")
+
def handle_omniflo(msp, teileid, merkmale, x, y, doc, lib_doc, verbose, symbols, strecken_nachbarn,config,config_allgemein):
"""
Für Omniflo Gerade: zeichnet eine Linie (Mitte = Koordinate, Länge und Winkel aus Merkmale).
@@ -1272,84 +1265,29 @@ def handle_omniflo(msp, teileid, merkmale, x, y, doc, lib_doc, verbose, symbols,
omnisivas = config.get("Omniflo","OFgeradesivas")
tefsivas = config.get("Omniflo","Tefgeradesivas")
foerderer = config.get("Omniflo","OFfoerderer")
-
- if merkmale.get("SivasNummer") == omnisivas or merkmale.get("SivasNummer") == tefsivas:
- try:
- laenge = float(merkmale.get("Länge in Meter", "0").replace(",", ".")) * 1000 # Meter → mm
- except Exception:
- laenge = 0
- try:
- winkel = float(merkmale.get("Drehung"))
- except Exception:
- winkel = 0.0
-
- winkel_rad = math.radians(winkel)
- halbe_laenge = laenge / 2
- # Man muss bei sin -1 machen wegen des links koordinaten system
- dx = halbe_laenge * math.sin(winkel_rad * -1)
- dy = halbe_laenge * math.cos(winkel_rad)
- start = (x + dx, y + dy, float(merkmale.get("Höhe oben")) )
- ende = (x - dx, y - dy, float(merkmale.get("Höhe unten")))
- if "A-2" not in doc.layers:
- doc.layers.add(name="A-2", color=2)
- if "F-1" not in doc.layers:
- doc.layers.add(name="F-1", color =1)
- linie=msp.add_line(start, ende)
- if merkmale.get("SivasNummer") == tefsivas:
- linie.dxf.layer = "F-1"
- else:
- linie.dxf.layer = "A-2"
-
-
- if verbose:
- print(f"[INFO] Omniflo Gerade → {teileid} Linie von ({start[0]:.1f}, {start[1]:.1f}) nach ({ende[0]:.1f}, {ende[1]:.1f})")
- return
+ omniflo_objekt = Omniflo.Omniflo.from_merkmale(teileid,x,y,merkmale)
+ rotation = omniflo_objekt.drehung
+ if omniflo_objekt.sivasnummer == omnisivas or omniflo_objekt.sivasnummer == tefsivas:
+ Omniflo.Omniflo.Omniflo_geraden_erstellung(msp, x, y, doc, tefsivas, omniflo_objekt)
- if merkmale.get("SivasNummer") == foerderer:
- import_block("bogen1",lib_doc,doc)
- import_block("bogen2",lib_doc,doc)
- rotation = float(merkmale.get("Drehung"))
- laenge = float(merkmale.get("laenge in meter")) * 1000
- h0 = float(merkmale.get("Höhe unten"))
- h1 = float(merkmale.get("Höhe oben"))
- h_zwischen = (h0 + h1)/2
- blockname = (f"OF_Förderer_{laenge}_{h_zwischen}")
- winkel_rad = math.radians(rotation)
- halbe_laenge = laenge / 2
- # Man muss bei sin -1 machen wegen des links koordinaten system
- dx = halbe_laenge * math.sin(rotation * -1)
- dy = halbe_laenge * math.cos(rotation)
- start = (x + dx, y + dy, float(merkmale.get("Höhe oben")) )
- ende = (x - dx, y - dy, float(merkmale.get("Höhe unten")))
- if blockname not in doc.blocks:
- block = doc.blocks.new(blockname, base_point=(0,0,0))
- block.add_blockref("bogen1",start)
- block.add_blockref("bogen2",ende)
- line = Line.new(dxfattribs={"start": start,"end":ende})
- copy = line.copy()
- copy.translate(-x,-y,-h_zwischen)
- block.add_entity(copy)
- msp.add_blockref(blockname,(x,y,h_zwischen),dxfattribs={"rotation": rotation})
- return
+ elif omniflo_objekt.sivasnummer == foerderer:
+ Omniflo.Omniflo.omniflo_foerdererstellung(msp, x, y, doc, lib_doc, omniflo_objekt, rotation)
# Sonst wie gehabt: Block mit SivasNummer
- if not lib_doc:
- print("[WARN] lib_doc nicht verfügbar, Block wird nicht eingefügt.")
- return
- blockname = merkmale.get("SivasNummer")
- if not blockname:
- print(f"[WARN] Keine SivasNummer für {teileid}, überspringe.")
- return
- if blockname not in lib_doc.blocks:
- print(f"[WARN] Omniflo-Block '{blockname}' nicht in Bibliothek {lib_doc.filename}. Überspringe {teileid}.")
- return
- blockname = blockname
- drehung = merkmale.get("Drehung")
- import_block(blockname, lib_doc, doc)
-
- # blockref_layer = get_layer(doc, lib_doc, blockname)
- drehung = merkmale.get("Drehung")
- msp.add_blockref(blockname, (x, y,float(merkmale.get("Höhe"))), dxfattribs={"rotation": drehung})
-
+ else:
+ if not lib_doc:
+ print("[WARN] lib_doc nicht verfügbar, Block wird nicht eingefügt.")
+ return
+ blockname = merkmale.get("SivasNummer")
+ if not blockname:
+ print(f"[WARN] Keine SivasNummer für {teileid}, überspringe.")
+ return
+ if blockname not in lib_doc.blocks:
+ print(f"[WARN] Omniflo-Block '{blockname}' nicht in Bibliothek {lib_doc.filename}. Überspringe {teileid}.")
+ return
+ blockname = blockname
+ import_block(blockname, lib_doc, doc)
+ layer, color = get_insert_color_layer(lib_doc, omniflo_objekt.sivasnummer)
+ msp.add_blockref(blockname, (x, y,omniflo_objekt.hoehe), dxfattribs={"rotation": rotation,"layer": layer, "color": color})
def get_insert_color_layer(lib_doc, blockname):