VF-Linienzug Modus 2/3: Geister-Mini-Objekte aus Pfad-Auswahl filtern
Eine Rechteck-Auswahl kann winzige Geister-/Artefakt-Objekte miterfassen (real: ein 14-mm-Mini-Bogen). gf-sortiere-objekte haengte sie per Nearest-Neighbor stumm in die Kette -> ein Geister-Bauteil (im test_modus2.dxf: eine 90-Grad- Kurve vor dem Motor, die der Nutzer nie gezeichnet hat; im SEGS-Journal als 7. Segment mit Sehne 14 mm sichtbar). vfl-in-segmente wirft jetzt VOR der Sortierung alle Objekte unter *vfk-pfad-min-segmentlaenge* (100 mm) aus und meldet Anzahl + Grund (vfl-m3-mini-objekte-verworfen, de/en). Schwelle konservativ deutlich unter jedem realen Bauteil (kleinstes: Separator 300 mm; kleinster echter Eck-Bogen R500/30 Grad hat Sehne ~259 mm) und knapp ueber dem Restlaengen-Clamp (100 mm), damit kein legitimes Segment faelschlich verworfen wird. Neue Helfer: vfl-obj-2d-laenge (LINE-Laenge / ARC-Sehne), vfl-filter-mini-objekte (-> (behalten . verworfen-anzahl)). Neue Konstante *vfk-pfad-min-segmentlaenge*. Der Bug lag NICHT im SEGS-Umbau (gf-sortiere-objekte/-analysiere-kette unveraendert) - der SEGS-Journal machte ihn nur erstmals sichtbar. 243/243 LISP-Unit-Tests gruen; JSON valide + de/en-Paritaet geprueft. Der Geometrie-Effekt (Geister-Segment weg) ist interaktiv zu bestaetigen. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
255707f136
commit
7dbf1248c9
@@ -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
|
||||
|
||||
+37
-2
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user