This commit is contained in:
2025-12-15 16:06:07 +01:00
4 changed files with 119514 additions and 25 deletions
+1 -5
View File
@@ -21,14 +21,10 @@ rot_symb2 = 0.0
asoffset = 537.90
esoffset = 479.95
[ILS 2.0 Variofoerderer]
Umlenkstation = 500.0, 0.0, 0.0
Motorstation = 500.0, 0.0, 0.0
vario_abstand = 66.5
[ILS 2.0 Variofoerderer_Bogen_block_namen]
bogen_3_auf = Vario_Bogen_auf_3°
bogen_3_ab = Vario_Bogen_ab_3°
[Ils 2.0 core winkel]
winkel_boegen = 3
winkel_motor = 3.0
@@ -37,5 +33,5 @@ winkel_as = 3.0
winkel_es = 3.0
[Omniflo]
OFgeradesivas = 821106002
Tefgeradesivas = 1
Tefgeradesivas = 0_B10030
OFfoerderer = 2
File diff suppressed because it is too large Load Diff
+11 -11
View File
@@ -35,27 +35,27 @@ class VarioFoerderer(BaseModel):
h1 = float(merkmale.get("Höhe Ende")) * 1000
laenge = float(merkmale.get("Länge in Meter")) * 1000
gefaelle_laenge = merkmale.get("Laenge_Gefaellestrecke")
gefaelle_winkel = merkmale.get("Winkel_Gefaellestrecke")
if gefaelle_laenge == None:
gefaelle_laenge = 0.0
gefaelle_winkel = 0.0
else:
gefaelle_laenge = float(gefaelle_laenge)
gefaelle_winkel = float(merkmale.get("Winkel_Gefaellestrecke")),
gefaelle_winkel = float(gefaelle_winkel)
return cls(
teileid = teileid,
laenge = laenge,
x = x,
y = y,
foerderer_richtung =merkmale.get("Förderrichtung"),
laenge = laenge,
winkel = float(merkmale.get("Winkel")),
hat_motor = bool(merkmale.get("hatMotor")),
hat_umlenk = bool(merkmale.get("hatUmlenkung")),
h0 = h0,
h1 =h1,
hat_motor = bool(merkmale.get("hatMotor")),
hat_umlenk = bool(merkmale.get("hatUmlenkung")),
drehung = float(merkmale.get("Drehung")),
foerderer_richtung =merkmale.get("Förderrichtung"),
gefaelle_laenge = gefaelle_laenge,
gefalle_winkel = gefaelle_winkel,
gefaelle_winkel = gefaelle_winkel,
anzahl_scanner = int(merkmale.get("Anzahl der Scanner")),
anzahl_separatoren = int(merkmale.get("Anzahl der Separatoren"))
@@ -503,7 +503,7 @@ class VarioFoerderer(BaseModel):
if gefaelle > 0:
if motor_vorhanden == True and umlenk_vorhanden == True:
halbesgefaelle = gefaelle/2
gefaelle_ende = ende[0], ende[1] +halbesgefaelle, ende[2] +math.sin(math.radians(gefahellewinkel))* halbesgefaelle
gefaelle_ende = ende[0], ende[1] +halbesgefaelle, ende[2] + math.sin(math.radians(gefahellewinkel))* halbesgefaelle
line_ende_gefaelle = Line.new(dxfattribs={"start": ende,"end": gefaelle_ende})
line_ende_gefaelle.dxf.layer = "6-SP"
copy_ende = line_ende_gefaelle.copy()
@@ -511,7 +511,7 @@ class VarioFoerderer(BaseModel):
block.add_entity(copy_ende)
ende = gefaelle_ende
gefaelle_start = start[0], start[1] -halbesgefaelle, start[2] -math.sin(math.radians(gefahellewinkel)) * halbesgefaelle
gefaelle_start = start[0], start[1] -halbesgefaelle, start[2] - math.sin(math.radians(gefahellewinkel)) * halbesgefaelle
line_start_gefaelle = Line.new(dxfattribs={"start": start,"end": gefaelle_start})
line_start_gefaelle.dxf.layer = "6-SP"
copy_start = line_start_gefaelle.copy()
@@ -519,7 +519,7 @@ class VarioFoerderer(BaseModel):
block.add_entity(copy_start)
start = gefaelle_start
elif motor_vorhanden == True:
gefaelle_ende = ende[0], ende[1] +gefaelle, ende[2] +math.sin(math.radians(gefahellewinkel))* gefaelle
gefaelle_ende = ende[0], ende[1] +gefaelle, ende[2] + math.sin(math.radians(gefahellewinkel))* gefaelle
line_ende_gefaelle = Line.new(dxfattribs={"start": ende,"end": gefaelle_ende})
line_ende_gefaelle.dxf.layer = "6-SP"
copy_ende = line_ende_gefaelle.copy()
@@ -527,7 +527,7 @@ class VarioFoerderer(BaseModel):
block.add_entity(copy_ende)
ende = gefaelle_ende
elif umlenk_vorhanden == True:
gefaelle_start = start[0], start[1] -gefaelle, start[2] -math.sin(math.radians(gefahellewinkel)) * gefaelle
gefaelle_start = start[0], start[1] -gefaelle, start[2] - math.sin(math.radians(gefahellewinkel)) * gefaelle
line_start_gefaelle = Line.new(dxfattribs={"start": start,"end": gefaelle_start})
line_start_gefaelle.dxf.layer = "6-SP"
copy_start = line_start_gefaelle.copy()
+82 -9
View File
@@ -55,7 +55,26 @@ def create_block_library(input_dir, output_file, config, logger=None):
src_doc = ezdxf.readfile(filepath)
src_msp = src_doc.modelspace()
entities = list(src_msp)
allowed_types = {"LINE", "LWPOLYLINE", "POLYLINE", "SPLINE", "CIRCLE", "ARC", "INSERT","ATTDEF"}
allowed_types = {
"LINE",
"LWPOLYLINE",
"POLYLINE",
"SPLINE",
"CIRCLE",
"ARC",
"INSERT",
"ATTDEF",
"3DFACE",
"MESH",
"POLYFACE",
"POLYFACEMESH",
"SURFACE",
"3DSURFACE",
"EXTRUDEDSURFACE",
"REVOLVEDSURFACE",
"LOFTEDSURFACE",
"SWEPTSURFACE",
}
filtered_entities = []
for e in entities:
@@ -375,6 +394,27 @@ def calculate_block_bounding_box(block, doc, src_doc, filename,config):
return bbox, (bbox.extmax.x -bbox.extmin.x, bbox.extmax.y -bbox.extmin.y),bbox.center
def _bbox_from_virtual_entities(entity, doc, src_doc, filename, config, transform_matrix=None):
"""
Nutzt virtual_entities(), um komplexe Objekte (z.B. SURFACE) in
auswertbare Geometrie zu zerlegen und darauf eine Bounding Box zu
berechnen.
"""
v_bbox = BoundingBox()
if not hasattr(entity, "virtual_entities"):
return v_bbox
try:
for ve in entity.virtual_entities():
ve_bbox = get_entity_bounding_box(
ve, doc, src_doc, filename, config, transform_matrix
)
if ve_bbox and ve_bbox.has_data:
v_bbox.extend(ve_bbox)
except Exception as err:
print(f"Fehler bei virtual_entities() für {entity.dxftype()}: {err}")
return v_bbox
def get_entity_bounding_box(e, doc,src_doc,filename,config, transform_matrix=None):
"""
Berechnet die Bounding Box einer einzelnen Entity
@@ -441,17 +481,42 @@ def get_entity_bounding_box(e, doc,src_doc,filename,config, transform_matrix=Non
elif e.dxftype() == 'LWPOLYLINE':
# Nutze virtuelle Entities (Linien/Bögen), inkl. Bulge-Unterstützung
for ve in e.virtual_entities():
ve_bbox = get_entity_bounding_box(ve, doc, src_doc, filename, transform_matrix)
if ve_bbox and ve_bbox.has_data:
bbox.extend(ve_bbox)
ve_bbox = _bbox_from_virtual_entities(
e, doc, src_doc, filename, config, transform_matrix
)
if ve_bbox.has_data:
bbox.extend(ve_bbox)
elif e.dxftype() == 'POLYLINE':
# 2D/3D Polylines ebenfalls über virtuelle Entities
for ve in e.virtual_entities():
ve_bbox = get_entity_bounding_box(ve, doc, src_doc, filename, transform_matrix)
if ve_bbox and ve_bbox.has_data:
bbox.extend(ve_bbox)
ve_bbox = _bbox_from_virtual_entities(
e, doc, src_doc, filename, config, transform_matrix
)
if ve_bbox.has_data:
bbox.extend(ve_bbox)
elif e.dxftype() == '3DFACE':
# 3DFace: direkte Eckpunkte verwenden
pts = []
try:
pts = [Vec3(p) for p in e.get_points()] # ezdxf API
except Exception:
try:
pts = [Vec3(v.dxf.location) for v in e.vertices]
except Exception:
pts = []
if transform_matrix:
pts = [transform_matrix.transform(p) for p in pts]
if pts:
bbox.extend(pts)
elif e.dxftype() in {'MESH', 'POLYFACE', 'POLYFACEMESH'}:
# Mesh/Polyface über virtuelle Geometrie auswerten
ve_bbox = _bbox_from_virtual_entities(
e, doc, src_doc, filename, config, transform_matrix
)
if ve_bbox.has_data:
bbox.extend(ve_bbox)
elif e.dxftype() == 'SPLINE':
# Approximation der Spline-Kurve
@@ -482,6 +547,14 @@ def get_entity_bounding_box(e, doc,src_doc,filename,config, transform_matrix=Non
insert_point = transform_matrix.transform(insert_point)
elif e.dxftype().endswith('SURFACE'):
# Viele Surface-Typen liefern ihre Proxy-Geometrie über virtual_entities()
ve_bbox = _bbox_from_virtual_entities(
e, doc, src_doc, filename, config, transform_matrix
)
if ve_bbox.has_data:
bbox.extend(ve_bbox)
elif e.dxftype() == 'INSERT':
# INSERT: Block-Inhalt mit Transformation berücksichtigen
insert_bbox = calculate_insert_bounding_box(e, doc,src_doc,filename,config, transform_matrix)