Aufbau der Planquadrate nur durch Boundingboxen. Ansonsten werden die Bereiche der Lage nicht korrekt erzeugt

This commit is contained in:
2026-09-08 12:37:58 +02:00
parent e78d1cb9ca
commit 0e0f011ea4
4 changed files with 182 additions and 32 deletions
+101 -15
View File
@@ -10,15 +10,33 @@
;; je Spalte die zugehoerige Zaehlung (alphabetisch oder numerisch, je nach
;; x_description/y_description).
;;
;; Bereich: die aktuellen Zeichnungs-Extents (EXTMIN/EXTMAX), aber IMMER auf
;; ein ganzzahliges Vielfaches der Schrittweite ab dem Ursprung aufgerundet -
;; das Raster bildet also stets ein GESCHLOSSENES Rechteck: jede senkrechte
;; Linie endet exakt auf der letzten waagerechten und umgekehrt (kein
;; "Ueberstand" einzelner Linien ueber die letzte volle Zeile/Spalte hinaus).
;; Bereich: aus den EXPORTIERTEN Bloecken (dieselbe Blockmenge, die
;; csv:collect-export-blocks in export.lsp fuer EXPORTCSV sammelt - siehe
;; plq-export-bbox), NICHT die Zeichnungs-Extents (EXTMIN/EXTMAX). Ursprung
;; (Index 1) UND obere Grenze kommen BEIDE aus der tatsaechlichen Bounding-Box
;; jedes Blocks (csv:get-bbox, dieselbe wie bbox_columns()/
;; planquadrat_column()/_bbox_min() in lib/export_csv.py bzw.
;; lib/export_planquadrat.py), NICHT aus dem reinen Einfuegepunkt: bei einem
;; gedrehten oder exzentrisch eingefuegten Block (z.B. ein um 90 Grad
;; gedrehter Kreisel, dessen Insertpunkt an einem Rand statt der Mitte liegt)
;; kann das Bounding-Box-Zentrum weit vom Einfuegepunkt abweichen - Ursprung
;; und Zellzuordnung MUESSEN auf derselben Referenz beruhen, sonst driften sie
;; auseinander (realer Bug: ein Kreisel landete dadurch in der CSV-Spalte
;; "F/3-G/13" statt der laut Zeichnung korrekten Spalte A). Reine
;; Hilfsgeometrie (Kreisel-Umfahrungsboegen als eigene Linien, Texte, das
;; Planquadrat-Raster selbst) zaehlt zu EXTMIN/EXTMAX, gehoert aber zu keinem
;; Export-Block - das BricsCAD-Raster muss daher auf derselben Blockmenge wie
;; der CSV-Export rechnen, sonst landet ein Bauteil im CSV in einer anderen
;; Spalte/Zeile als im Raster in der Zeichnung.
;; Der Bereich wird IMMER auf ein ganzzahliges Vielfaches der Schrittweite ab
;; dem Ursprung aufgerundet - das Raster bildet also stets ein GESCHLOSSENES
;; Rechteck: jede senkrechte Linie endet exakt auf der letzten waagerechten
;; und umgekehrt (kein "Ueberstand" einzelner Linien ueber die letzte volle
;; Zeile/Spalte hinaus).
;; x_origin/y_origin aus [Planquadrate] legen die Koordinate von Index 1 fest
;; (wie im CSV-Export); sind sie leer, faellt der Ursprung auf EXTMIN zurueck
;; (= kleinstes X/Y der Zeichnung, analog zur Auto-Ermittlung in
;; export_planquadrat.resolve_origins).
;; (wie im CSV-Export) und ueberschreiben den automatisch ermittelten
;; Ursprung. Fallback auf EXTMIN/EXTMAX, falls keine exportfaehigen Bloecke in
;; der Zeichnung stehen.
;;
;; Das fertige Raster (Linien + Beschriftungstexte) wird zu EINEM Block
;; (*plq-blockname*) zusammengefasst und bei (0,0,0) eingefuegt - dadurch
@@ -108,6 +126,60 @@
(if pos (vl-string-trim " \t" (substr s 1 pos)) (vl-string-trim " \t" s))
)
;; Ursprung + Ausdehnung aus den EXPORTIERTEN Bloecken ermitteln - dieselbe
;; Blockmenge, die csv:collect-export-blocks (export.lsp) fuer EXPORTCSV
;; sammelt. Der reine EXTMIN/EXTMAX der Zeichnung (alle Entities, auch
;; Hilfsgeometrie wie Kreisel-Umfahrungsboegen) weicht davon ab und fuehrte zu
;; einem im BricsCAD-Raster verschobenen Planquadrat gegenueber der CSV-Spalte
;; - siehe cfg/export.cfg [Planquadrate] und den Hinweis oben in der
;; Moduldoku. Sowohl Ursprung als auch obere Grenze kommen aus der
;; tatsaechlichen Bounding-Box (csv:get-bbox, dieselbe wie
;; bbox_columns()/planquadrat_column()/_bbox_min() in lib/export_csv.py bzw.
;; lib/export_planquadrat.py), NICHT aus dem reinen Einfuegepunkt: bei einem
;; gedrehten oder exzentrisch eingefuegten Block (z.B. ein um 90 Grad
;; gedrehter Kreisel, dessen Insertpunkt an einem Rand statt der Mitte liegt)
;; kann das BBox-Zentrum weit vom Einfuegepunkt abweichen - Ursprung und
;; Zellzuordnung MUESSEN auf derselben Referenz beruhen, sonst driften sie
;; auseinander (genau der Bug, der zur Einfuehrung von plq-export-bbox
;; fuehrte). Fallback auf den Einfuegepunkt (Gruppencode 10) nur, wenn
;; csv:get-bbox fuer einen Block scheitert (z.B. auf eingefrorenem Layer).
;; Rueckgabe: Liste (xmin ymin xmax ymax) oder nil, wenn keine Bloecke.
(defun plq-export-bbox ( / ss i ename ed pt bbox xmin ymin xmax ymax)
(setq ss (csv:collect-export-blocks))
(if ss
(progn
(setq i 0)
(while (setq ename (ssname ss i))
(setq ed (entget ename))
(setq pt (cdr (assoc 10 ed)))
(setq bbox (csv:get-bbox ename))
(if bbox
(progn
(setq xmin (if xmin (min xmin (- (nth 0 bbox) (/ (nth 3 bbox) 2.0)))
(- (nth 0 bbox) (/ (nth 3 bbox) 2.0))))
(setq ymin (if ymin (min ymin (- (nth 1 bbox) (/ (nth 4 bbox) 2.0)))
(- (nth 1 bbox) (/ (nth 4 bbox) 2.0))))
(setq xmax (if xmax (max xmax (+ (nth 0 bbox) (/ (nth 3 bbox) 2.0)))
(+ (nth 0 bbox) (/ (nth 3 bbox) 2.0))))
(setq ymax (if ymax (max ymax (+ (nth 1 bbox) (/ (nth 4 bbox) 2.0)))
(+ (nth 1 bbox) (/ (nth 4 bbox) 2.0))))
)
(if pt
(progn
(setq xmin (if xmin (min xmin (car pt)) (car pt)))
(setq ymin (if ymin (min ymin (cadr pt)) (cadr pt)))
(setq xmax (if xmax (max xmax (car pt)) (car pt)))
(setq ymax (if ymax (max ymax (cadr pt)) (cadr pt)))
)
)
)
(setq i (1+ i))
)
)
)
(if xmin (list xmin ymin xmax ymax))
)
;; Zeichnet eine Linie auf dem aktuellen Layer.
(defun plq-line (p1 p2)
(entmake (list
@@ -135,7 +207,7 @@
;; DRAW_PLANQUADRATE - Raster zeichnen/neu aufbauen
;; ============================================================
(defun c:DRAW_PLANQUADRATE ( / section x-step x-alpha y-step y-alpha
ext-min ext-max x-origin y-origin
ext-min ext-max bbox x-origin y-origin
x0 y0 x1 y1 lay hoehe n-x n-y i x y
label textabstand lastEnt ss e)
(ssg-start "DRAW_PLANQUADRATE" '(("OSMODE")))
@@ -156,28 +228,42 @@
(princ (ssg-text "plq-ungueltige-schrittweite"))
(progn
;; Vorhandenes Raster zuerst entfernen (Block + Definition) -
;; wiederholte Aufrufe erzeugen so keine Dubletten.
;; wiederholte Aufrufe erzeugen so keine Dubletten UND ein alter
;; Planquadrat-Block verfaelscht nicht die Bloecke-BBox unten
;; (Raster-Linien/-Texte zaehlen ohnehin nicht zu den Export-
;; Blockmustern, aber so ist es unabhaengig davon sauber).
(plq-block-entfernen)
;; Referenzbereich: dieselbe Blockmenge wie EXPORTCSV
;; (csv:collect-export-blocks, export.lsp) - siehe plq-export-bbox.
;; Fallback auf die Zeichnungs-Extents (EXTMIN/EXTMAX), falls keine
;; exportfaehigen Bloecke in der Zeichnung stehen.
(setq bbox (plq-export-bbox))
(setq ext-min (getvar "EXTMIN"))
(setq ext-max (getvar "EXTMAX"))
(setq x-origin (export:cfg "Planquadrate" "x_origin" ""))
(setq x-origin (if (and x-origin (/= x-origin "")) (* 1000.0 (atof x-origin)) (car ext-min)))
(setq x-origin (if (and x-origin (/= x-origin ""))
(* 1000.0 (atof x-origin))
(if bbox (nth 0 bbox) (car ext-min))
))
(setq y-origin (export:cfg "Planquadrate" "y_origin" ""))
(setq y-origin (if (and y-origin (/= y-origin "")) (* 1000.0 (atof y-origin)) (cadr ext-min)))
(setq y-origin (if (and y-origin (/= y-origin ""))
(* 1000.0 (atof y-origin))
(if bbox (nth 1 bbox) (cadr ext-min))
))
(setq x0 x-origin)
(setq y0 y-origin)
;; Anzahl Spalten/Zeilen: mind. 1, sonst so viele volle Schritte,
;; bis die Zeichnungs-Extents (mind.) abgedeckt sind - AUFGERUNDET,
;; bis der Referenzbereich (mind.) abgedeckt ist - AUFGERUNDET,
;; damit x1/y1 exakt auf einem Rasterschritt liegen. Damit endet
;; JEDE senkrechte Linie exakt auf der letzten waagerechten (bei
;; y1) und jede waagerechte exakt auf der letzten senkrechten (bei
;; x1) - das Raster bildet immer ein geschlossenes Rechteck.
(setq n-x (max 1 (fix (+ 0.999999 (/ (- (car ext-max) x0) x-step)))))
(setq n-y (max 1 (fix (+ 0.999999 (/ (- (cadr ext-max) y0) y-step)))))
(setq n-x (max 1 (fix (+ 0.999999 (/ (- (if bbox (nth 2 bbox) (car ext-max)) x0) x-step)))))
(setq n-y (max 1 (fix (+ 0.999999 (/ (- (if bbox (nth 3 bbox) (cadr ext-max)) y0) y-step)))))
(setq x1 (+ x0 (* n-x x-step)))
(setq y1 (+ y0 (* n-y y-step)))