CSV-Export: Bounding-Box (Position/Boundingbox) und Planquadrat-Spalte ergaenzt
Nur EXPORTCSV betroffen, EXPORTSIVAS bleibt unveraendert: - Position/Boundingbox: Bounding-Box je Block per vla-getboundingbox (Lisp/export.lsp, csv:get-bbox), Mittelpunkt und Ausdehnung x/y/z. - Planquadrat: aus x/y-Koordinate berechnet nach cfg/export.cfg [Planquadrate] (Schrittweite, numerisch/alphabetisch je Achse, alphabetische Zaehlung mit Excel-Spalten-Umlauf Z->AA), siehe lib/export_planquadrat.py. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+76
-5
@@ -11,6 +11,7 @@
|
||||
;; Datei-/Skriptnamen sind fest im Code hinterlegt (*export-filenames*).
|
||||
;; ============================================================
|
||||
|
||||
(vl-load-com)
|
||||
|
||||
;; --- Export-Konfiguration aus cfg/export.cfg laden ---
|
||||
;; Nutzt den zentralen INI-Parser aus ssg_core.lsp (ssg-load-ini / ssg-ini-get /
|
||||
@@ -78,6 +79,47 @@
|
||||
)
|
||||
|
||||
|
||||
;; --- Safearray/Variant-Rueckgabe von vla-getboundingbox in Liste wandeln ---
|
||||
;; BricsCAD liefert ein Safearray, AutoCAD ein Variant mit Safearray.
|
||||
(defun csv:pt->list (v)
|
||||
(cond
|
||||
((= (type v) 'variant) (vlax-safearray->list (vlax-variant-value v)))
|
||||
((= (type v) 'safearray) (vlax-safearray->list v))
|
||||
((listp v) v)
|
||||
(t nil)
|
||||
)
|
||||
)
|
||||
|
||||
;; --- Bounding-Box (WCS, achsparallel) eines INSERT-Blocks ermitteln ---
|
||||
;; Erzwingt vorher ein vla-update (Regen), da vla-getboundingbox sonst auf
|
||||
;; nicht-regenerierten oder auf eingefrorenen Layern liegenden Bloecken scheitert.
|
||||
;; Rueckgabe: Liste (cx cy cz dx dy dz) -- Mittelpunkt + Ausdehnung, oder nil bei Fehler.
|
||||
(defun csv:get-bbox (ename / obj res minpt maxpt)
|
||||
(setq obj (vlax-ename->vla-object ename))
|
||||
(vl-catch-all-apply 'vla-update (list obj))
|
||||
(setq res
|
||||
(vl-catch-all-apply
|
||||
'(lambda ( / ll ur)
|
||||
(vla-getboundingbox obj 'll 'ur)
|
||||
(list (csv:pt->list ll) (csv:pt->list ur)))))
|
||||
(if (vl-catch-all-error-p res)
|
||||
nil
|
||||
(progn
|
||||
(setq minpt (car res))
|
||||
(setq maxpt (cadr res))
|
||||
(list
|
||||
(/ (+ (car minpt) (car maxpt)) 2.0)
|
||||
(/ (+ (cadr minpt) (cadr maxpt)) 2.0)
|
||||
(/ (+ (caddr minpt) (caddr maxpt)) 2.0)
|
||||
(- (car maxpt) (car minpt))
|
||||
(- (cadr maxpt) (cadr minpt))
|
||||
(- (caddr maxpt) (caddr minpt))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
;; --- Attribute eines INSERT-Blocks als JSON-Objekt lesen ---
|
||||
;; ename = Entity-Name des INSERT
|
||||
;; Rueckgabe: String wie {"TAG1":"Wert1","TAG2":"Wert2"}
|
||||
@@ -111,7 +153,9 @@
|
||||
|
||||
|
||||
;; --- Einen INSERT-Block als JSON-Objekt schreiben ---
|
||||
(defun csv:block-to-json (ename / ed blk-name layer pt rotation handle attribs)
|
||||
;; include-bbox = T -> zusaetzlich Bounding-Box (Mitte + Ausdehnung) ermitteln
|
||||
;; und als "bbox"-Objekt anhaengen (nur fuer EXPORTCSV, nicht fuer EXPORTSIVAS).
|
||||
(defun csv:block-to-json (ename include-bbox / ed blk-name layer pt rotation handle attribs bbox bbox-json)
|
||||
(setq ed (entget ename))
|
||||
(setq blk-name (cdr (assoc 2 ed)))
|
||||
(setq layer (cdr (assoc 8 ed)))
|
||||
@@ -120,6 +164,26 @@
|
||||
(setq handle (cdr (assoc 5 ed)))
|
||||
(if (null rotation) (setq rotation 0.0))
|
||||
(setq attribs (csv:read-attribs ename))
|
||||
(setq bbox-json "")
|
||||
(if include-bbox
|
||||
(progn
|
||||
(setq bbox (csv:get-bbox ename))
|
||||
(if bbox
|
||||
(setq bbox-json
|
||||
(strcat
|
||||
",\"bbox\":{"
|
||||
"\"cx\":" (rtos (nth 0 bbox) 2 4)
|
||||
",\"cy\":" (rtos (nth 1 bbox) 2 4)
|
||||
",\"cz\":" (rtos (nth 2 bbox) 2 4)
|
||||
",\"dx\":" (rtos (nth 3 bbox) 2 4)
|
||||
",\"dy\":" (rtos (nth 4 bbox) 2 4)
|
||||
",\"dz\":" (rtos (nth 5 bbox) 2 4)
|
||||
"}"
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(strcat
|
||||
" {\"block_name\":\"" (csv:json-escape blk-name) "\""
|
||||
",\"layer\":\"" (csv:json-escape layer) "\""
|
||||
@@ -129,6 +193,7 @@
|
||||
",\"z\":" (rtos (if (caddr pt) (caddr pt) 0.0) 2 4)
|
||||
",\"rotation\":" (rtos (* (/ rotation pi) 180.0) 2 4)
|
||||
",\"attribs\":" attribs
|
||||
bbox-json
|
||||
"}"
|
||||
)
|
||||
)
|
||||
@@ -203,7 +268,9 @@
|
||||
;; label = Anzeigename (z.B. "EXPORTCSV")
|
||||
;; py-name = Python-Skript-Name (z.B. "export_csv.py")
|
||||
;; csv-name = Ergebnis-CSV-Name (z.B. "export.csv")
|
||||
(defun csv:run-export (label py-name csv-name / ss i ename fh out-pfad
|
||||
;; include-bbox = T -> Bounding-Box je Block ermitteln und mit exportieren
|
||||
;; (siehe csv:block-to-json); fuer EXPORTSIVAS nil.
|
||||
(defun csv:run-export (label py-name csv-name include-bbox / ss i ename fh out-pfad
|
||||
py-skript ergebnis-pfad cmd first-block count out-dir)
|
||||
;; Vor dem Export: IDs aller Bloecke sicherstellen und Duplikate korrigieren
|
||||
(princ (ssg-textf "exp-check-ids" (list label)))
|
||||
@@ -254,7 +321,7 @@
|
||||
(if (not first-block)
|
||||
(write-line "," fh)
|
||||
)
|
||||
(write-line (csv:block-to-json ename) fh)
|
||||
(write-line (csv:block-to-json ename include-bbox) fh)
|
||||
(setq first-block nil)
|
||||
(setq i (1+ i))
|
||||
)
|
||||
@@ -289,14 +356,18 @@
|
||||
(defun c:EXPORTSIVAS ()
|
||||
(csv:run-export "EXPORTSIVAS"
|
||||
(export:filename "sivas_script")
|
||||
(export:filename "sivas_csv"))
|
||||
(export:filename "sivas_csv")
|
||||
nil)
|
||||
)
|
||||
|
||||
;; --- EXPORTCSV: Einfache Item-Liste aller Bloecke (ohne Summierung) ---
|
||||
;; Ermittelt zusaetzlich je Block eine Bounding-Box (siehe csv:get-bbox),
|
||||
;; die im Python-Skript als Position/Boundingbox-Spalten ausgegeben wird.
|
||||
(defun c:EXPORTCSV ()
|
||||
(csv:run-export "EXPORTCSV"
|
||||
(export:filename "csv_script")
|
||||
(export:filename "csv_csv"))
|
||||
(export:filename "csv_csv")
|
||||
T)
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user