Aufbau der Planquadrate nur durch Boundingboxen. Ansonsten werden die Bereiche der Lage nicht korrekt erzeugt
This commit is contained in:
+101
-15
@@ -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)))
|
||||
|
||||
Reference in New Issue
Block a user