Merge branch 'main' of http://gitea.schoenenberger.de/mistangl/plant2dxf
This commit is contained in:
+1
-5
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user