diff --git a/Lisp/vf_konstanten.lsp b/Lisp/vf_konstanten.lsp index cba3082..a2c1811 100644 --- a/Lisp/vf_konstanten.lsp +++ b/Lisp/vf_konstanten.lsp @@ -193,6 +193,17 @@ ;; etage-foerderanlage-einfuegen (vf_etage.lsp). (if (null *vfk-etage-auslauf-min-clamp*) (setq *vfk-etage-auslauf-min-clamp* 50.0)) +;; Mindest-2D-Laenge (mm) eines Pfad-Segments (LINE-Laenge bzw. ARC-Sehne), +;; das der Linienzug-Modus 2/3 aus einer Objektauswahl akzeptiert. Kuerzere +;; Objekte sind Geister-/Artefakt-Elemente (z.B. ein von einer Rechteck-Auswahl +;; miterfasstes Mini-Segment) und werden VOR der Sortierung ausgeworfen, mit +;; Warnung an den Nutzer (vfl-in-segmente). Konservativ deutlich unter jedem +;; realen Bauteil (kleinstes Bauteil = Separator 300 mm; kleinster echter +;; Eck-Bogen R500/30 Grad hat eine Sehne von ~259 mm) und knapp ueber dem +;; allgemeinen Restlaengen-Clamp (100 mm), damit kein legitimes Segment +;; faelschlich verworfen wird. +(if (null *vfk-pfad-min-segmentlaenge*) (setq *vfk-pfad-min-segmentlaenge* 100.0)) + ;; ============================================================ ;; TEIL 4: FALLBACK-VERSATZWERTE (mm) - AS-/ES-/Gefaellebogen-Masse, falls ;; die Blockdefinition/das Koordinatensystem nicht extrahierbar ist diff --git a/Lisp/vf_linienzug.lsp b/Lisp/vf_linienzug.lsp index 7161032..9275f97 100644 --- a/Lisp/vf_linienzug.lsp +++ b/Lisp/vf_linienzug.lsp @@ -8847,6 +8847,31 @@ (setq i (1+ i))) (reverse out)) +;; 2D-Laenge eines Pfad-Objekts: LINE = Abstand Start-Endpunkt, ARC = Sehne +;; (Abstand Start-Endpunkt, dasselbe Mass wie gf-analysiere-kette es fuer die +;; Segmentlaenge nutzt). Nicht-LINE/ARC liefern 0.0 (werden dadurch als "zu +;; kurz" ausgewertet und verworfen). Rein lesend, ohne Nebeneffekt. +(defun vfl-obj-2d-laenge (obj / objname sp ep) + (setq objname (vla-get-ObjectName obj)) + (if (or (= objname "AcDbLine") (= objname "AcDbArc")) + (progn + (setq sp (vlax-safearray->list (vlax-variant-value (vla-get-StartPoint obj)))) + (setq ep (vlax-safearray->list (vlax-variant-value (vla-get-EndPoint obj)))) + (gf-abstand-2d sp ep)) + 0.0)) + +;; Aus einer Objektliste alle Elemente unter *vfk-pfad-min-segmentlaenge* +;; herauswerfen (Geister-/Artefakt-Segmente, z.B. von einer Rechteck-Auswahl +;; miterfasste Mini-Objekte). Rueckgabe: (behalten-liste . verworfen-anzahl). +;; Reine Filterung, keine Meldung - der Aufrufer entscheidet ueber die Warnung. +(defun vfl-filter-mini-objekte (obj-liste / behalten verworfen) + (setq behalten '() verworfen 0) + (foreach obj obj-liste + (if (< (vfl-obj-2d-laenge obj) *vfk-pfad-min-segmentlaenge*) + (setq verworfen (1+ verworfen)) + (setq behalten (cons obj behalten)))) + (cons (reverse behalten) verworfen)) + ;; Objektauswahl + Analyse (Live) ODER Segment-Essenz aus dem Journal (Replay). ;; Gegenstueck zu vfl-in-selection, aber persistiert NICHT die Entity-Handles, ;; sondern die abgeleitete 9-Feld-Segmentliste (Journal-Art "SEGS"). Damit ist @@ -8855,7 +8880,7 @@ ;; Rueckgabe: die 9-Feld-Segmentliste oder nil (Abbruch/leer). filter/startpunkt ;; wie bei der Live-Auswahl; ecke-tol wird nur im Live-Zweig fuer die ;; Eck-Vorpruefung gebraucht (Replay-Daten sind bereits geprueft eingefroren). -(defun vfl-in-segmente (filter startpunkt ecke-tol / popped ss k obj-liste kette segmente ecke-bad segs9) +(defun vfl-in-segmente (filter startpunkt ecke-tol / popped ss k obj-liste kette segmente ecke-bad segs9 filter-erg verworfen) (setq popped (if *vfl-replay-queue* (vfl-replay-pop) nil)) (if popped ;; --- Replay: fertige Segment-Essenz direkt aus dem Journal --- @@ -8877,7 +8902,17 @@ (setq obj-liste (cons (vlax-ename->vla-object (ssname ss k)) obj-liste)) (setq k (1+ k))) (setq obj-liste (reverse obj-liste)) - (setq kette (gf-sortiere-objekte obj-liste startpunkt)) + ;; Geister-/Mini-Objekte VOR der Sortierung ausfiltern: ein von einer + ;; Rechteck-Auswahl miterfasstes winziges Segment (unter + ;; *vfk-pfad-min-segmentlaenge*) wuerde sonst per Nearest-Neighbor + ;; stumm in die Kette gehaengt und ein Geister-Bauteil erzeugen (realer + ;; Bug: 14-mm-Bogen am Kettenende). Verworfene mit Grund melden. + (setq filter-erg (vfl-filter-mini-objekte obj-liste)) + (setq obj-liste (car filter-erg) verworfen (cdr filter-erg)) + (if (> verworfen 0) + (vfl-meldung (ssg-textf "vfl-m3-mini-objekte-verworfen" + (list (itoa verworfen) (rtos *vfk-pfad-min-segmentlaenge* 2 0))))) + (setq kette (if obj-liste (gf-sortiere-objekte obj-liste startpunkt) nil)) (if (null kette) (progn (princ (ssg-text "vfl-m3-fehler-nicht-sortierbar")) (vfl-journal-record "NIL" nil) nil) diff --git a/lang/de_DE.json b/lang/de_DE.json index a829b30..e4b2653 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -185,6 +185,7 @@ "vfl-m3-vf-lauf-noetig": "\n[M3a] Genau EIN VF-Lauf noetig (GF...VF...GF; Vario-Kurven duerfen im Lauf liegen).", "vfl-m3-vf-lauf-m3b": "\n[M3a] Mehrere/keine VF-Laeufe -> M3b spaeter.", "vfl-m3-vf-lauf-alert": "VF-Linienzug Modus 2 kann diese Kette nicht bauen.\n\nGefunden: %1 VarioFoerderer-Laeufe.\nModus 2 baut zurzeit nur Ketten mit GENAU EINEM VF-Lauf (GF...VF...GF; Vario-Kurven duerfen innerhalb des Laufs liegen).\n\nBitte den Pfad so aufteilen, dass nur ein zusammenhaengender VF-Bereich entsteht.", + "vfl-m3-mini-objekte-verworfen": "%1 zu kurze(s) Objekt(e) wurden aus der Auswahl ausgeschlossen (unter %2 mm 2D-Laenge).\n\nSolche Mini-Segmente sind meist Geister-/Artefakt-Elemente, die eine Rechteck-Auswahl versehentlich miterfasst - ein reales Bauteil (kleinstes: Separator 300 mm) ist nie so kurz. Sie werden ignoriert, damit sie keine Geister-Bausteine in die Kette bringen.", "vfl-m3-vf-lauf-ohne-gerade": "\n[M3a] VF-Lauf ohne VF-Gerade - Abbruch.", "vfl-m3-anker-vorschau-header": "\n M3a ANKER-VORSCHAU (grob geschaetzt; exakte Werte beim Bau)", "vfl-m3-start-hoehe": "\n Start-Hoehe Z: %1 mm", diff --git a/lang/en_GB.json b/lang/en_GB.json index b1982a2..8882059 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -185,6 +185,7 @@ "vfl-m3-vf-lauf-noetig": "\n[M3a] Exactly ONE VF run required (GF...VF...GF; Vario curves may lie within the run).", "vfl-m3-vf-lauf-m3b": "\n[M3a] Several/no VF runs -> M3b later.", "vfl-m3-vf-lauf-alert": "VF line path mode 2 cannot build this chain.\n\nFound: %1 VarioFoerderer runs.\nMode 2 currently builds only chains with EXACTLY ONE VF run (GF...VF...GF; Vario curves may lie within the run).\n\nPlease split the path so that only one contiguous VF section remains.", + "vfl-m3-mini-objekte-verworfen": "%1 object(s) too short were excluded from the selection (below %2 mm 2D length).\n\nSuch mini segments are usually ghost/artefact elements a window selection caught by accident - a real part (smallest: separator 300 mm) is never that short. They are ignored so they cannot introduce ghost parts into the chain.", "vfl-m3-vf-lauf-ohne-gerade": "\n[M3a] VF run without a VF straight - aborting.", "vfl-m3-anker-vorschau-header": "\n M3a ANCHOR PREVIEW (rough estimate; exact values during build)", "vfl-m3-start-hoehe": "\n Start height Z: %1 mm",