Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros
This commit is contained in:
@@ -141,9 +141,9 @@
|
||||
(setq ks-results '())
|
||||
(setq sub-entities (vlax-invoke block-obj 'Explode))
|
||||
(foreach sub-obj sub-entities
|
||||
;; KS-Blocknamen normalisieren: aeltere Bloecke nutzen KS_EIN/KS_AUS,
|
||||
;; Vario_Kurve-Bloecke KSYS_EIN/KSYS_AUS (inline, damit diese Fallback-
|
||||
;; Kopie unabhaengig von vf_core.lsp funktioniert).
|
||||
;; KS-Blocknamen normalisieren: Standard KS_EIN/KS_AUS; historische
|
||||
;; Bestandsbloecke koennen noch KSYS_EIN/KSYS_AUS fuehren (inline, damit
|
||||
;; diese Fallback-Kopie unabhaengig von vf_core.lsp funktioniert).
|
||||
(setq ks-ref
|
||||
(if (and (not (vlax-erased-p sub-obj))
|
||||
(= (vla-get-ObjectName sub-obj) "AcDbBlockReference"))
|
||||
@@ -1873,7 +1873,7 @@
|
||||
;; Bestaetigung - entfaellt, wenn bereits per Dialog-OK bestaetigt (Modus 1)
|
||||
(setq antwort (if dialog-bestaetigt "1" (getstring (ssg-text "gf-prompt-einfuegen"))))
|
||||
(if (not (= antwort "2"))
|
||||
(gefaellestrecke-einfuegen L_stau (fix winkel) startpunkt as-seite es-seite hz-winkel deltaL as-winkel es-winkel
|
||||
(gefaellestrecke-einfuegen L_stau winkel startpunkt as-seite es-seite hz-winkel deltaL as-winkel es-winkel
|
||||
geruest-einzelmodul geruest-typ)
|
||||
(princ (ssg-text "gf-status-abgebrochen"))
|
||||
)
|
||||
@@ -1899,7 +1899,7 @@
|
||||
nil
|
||||
)
|
||||
(gefaellestrecke-einfuegen
|
||||
L_stau (fix winkel) startpunkt as-seite es-seite hz-winkel deltaL as-winkel es-winkel
|
||||
L_stau winkel startpunkt as-seite es-seite hz-winkel deltaL as-winkel es-winkel
|
||||
geruest-einzelmodul geruest-typ)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -499,12 +499,25 @@
|
||||
;; laengemax = Maximale Fahrstreckenlaenge in mm
|
||||
;; --- Quell-Attribute einer Aluprofil-.dwg lesen (mit ID-Feld) ---
|
||||
;; blockname = Profiltyp (z.B. "AP60", "AP110", "APG110")
|
||||
;;
|
||||
;; Seit dem ILS-Flach-Refactor tragen die Quell-Bloecke das Dimensionssuffix
|
||||
;; _2D/_3D und liegen flach unter data/ils/ (z.B. AP60_3D.dwg). Die Aufloesung
|
||||
;; laeuft daher ueber den zentralen Resolver ssg-ils-block-datei (mit
|
||||
;; automatischem 3D-Fallback) statt ueber *block-path* + Name. Nur wenn der
|
||||
;; Resolver nichts findet, wird als Rueckfall der alte Pfad (*block-path* +
|
||||
;; Name ohne Suffix) versucht.
|
||||
;; Rueckgabe: Attribut-Alist (mit angehaengtem leeren "ID"-Feld) oder nil,
|
||||
;; wenn *block-path* fehlt oder die Quell-.dwg keine Attribute hat.
|
||||
(defun omni:read-src-attribs (blockname / srcAttribs)
|
||||
(if (and (boundp '*block-path*) *block-path*)
|
||||
;; wenn keine Quell-.dwg gefunden wird bzw. sie keine Attribute hat.
|
||||
(defun omni:read-src-attribs (blockname / datei srcAttribs)
|
||||
(if (car (atoms-family 1 '("SSG-ILS-BLOCK-DATEI")))
|
||||
(setq datei (ssg-ils-block-datei blockname))
|
||||
)
|
||||
(if (and (null datei) (boundp '*block-path*) *block-path*)
|
||||
(setq datei (strcat *block-path* blockname ".dwg"))
|
||||
)
|
||||
(if datei
|
||||
(progn
|
||||
(setq srcAttribs (ssg-attrib-read-dwg (strcat *block-path* blockname ".dwg")))
|
||||
(setq srcAttribs (ssg-attrib-read-dwg datei))
|
||||
(if (and srcAttribs (not (assoc "ID" srcAttribs)))
|
||||
(setq srcAttribs (append srcAttribs (list (cons "ID" ""))))
|
||||
)
|
||||
|
||||
+48
-9
@@ -89,6 +89,24 @@ Grundfunktionen für Umgebungssicherung, Benutzerinteraktion, Layer, Blöcke, At
|
||||
| `ssg-insert-block layer farbe pfad pt xs ys rot` | Layer anlegen und Block einfügen |
|
||||
| `ssg-make-block pt rotation ss` | Auswahlsatz als Block definieren und gleich einfügen |
|
||||
|
||||
**ILS-Blockdateien laden (2D/3D):**
|
||||
|
||||
| Funktion | Beschreibung |
|
||||
| --- | --- |
|
||||
| `ssg-ils-dim-aktuell` | Gültige Dimension: `*ssg-ils-dim*` → `DXFM_DIM` → `"3D"` |
|
||||
| `ssg-ils-blockname[-dim] roh [dim]` | Effektiver Blockname mit Suffix `_2D`/`_3D` |
|
||||
| `ssg-ils-block-datei[-dim] roh [dim]` | Pfad zu `data/ils/<blockname>.dwg` (3D-Fallback) |
|
||||
| `ssg-ils-block-laden[-dim] roh [dim]` | Blockdefinition sicherstellen; Rückgabe = effektiver Name |
|
||||
| `ssg-block-refresh-reset roh` | Redefine-Sperre lösen (`nil` = alle Blöcke) → DWG wird neu gelesen |
|
||||
|
||||
Jede Block-DWG wird **einmal pro Zeichnung** aus der Datei neu definiert (Redefine);
|
||||
danach greift eine Sperre (`*ssg-block-refreshed*`, siehe `ssg-block-refreshed-p`/
|
||||
`-set`). Ohne sie las jede einzelne Element-Einfügung die DWG erneut von der Platte
|
||||
und regenerierte alle bereits platzierten Referenzen – bei den großen 3D-Blöcken
|
||||
(`AS_Element_90_links_3D` ~52 MB) waren Tests wie `TEST_MUBEA` dadurch minutenlang
|
||||
beschäftigt. Wurde eine Block-DWG während der laufenden Sitzung geändert, hebt
|
||||
`ssg-block-refresh-reset` die Sperre auf.
|
||||
|
||||
**Attribut-Operationen:**
|
||||
|
||||
| Funktion | Beschreibung |
|
||||
@@ -293,13 +311,15 @@ Drei Modi:
|
||||
Gefällebogen-Blöcke ersetzt, Winkel aus ΔH und Geometrie berechnet.
|
||||
|
||||
**Dialog-Hilfsfunktionen:** `gf-dialog-eingabe` (lädt/liest den DCL-Dialog, liefert
|
||||
`(deltaL winkel hz-winkel as-seite es-seite einfuegehoehe as-winkel es-winkel)` oder `nil`
|
||||
bei Abbruch) und `gf-modus12-abschluss` (gemeinsamer Abschluss für Modus 1+2: setzt die
|
||||
Element-Masse per `vf-set-as-masse`/`vf-set-es-masse`, berechnet die Staustreckenlänge,
|
||||
`(deltaL winkel hz-winkel as-seite es-seite einfuegehoehe as-winkel es-winkel dim
|
||||
geruest-einzelmodul geruest-typ)` oder `nil` bei Abbruch) und `gf-modus12-abschluss`
|
||||
(gemeinsamer Abschluss für Modus 1+2: setzt die Element-Masse per
|
||||
`vf-set-as-masse`/`vf-set-es-masse`, berechnet die Staustreckenlänge,
|
||||
zeigt die Zusammenfassung und ruft `gefaellestrecke-einfuegen`).
|
||||
|
||||
Die AUS-/EIN-Element-Varianten (30/90 Grad, links/rechts) liegen als DWG-Blöcke
|
||||
`AS_Element_<30|90>_<links|rechts>` bzw. `ES_Element_…` in `data/ils/2D|3D/`; ihre Maße
|
||||
`AS_Element_<30|90>_<links|rechts>` bzw. `ES_Element_…` flach in `data/ils/` (Dimension
|
||||
im Dateinamen als Suffix `_2D`/`_3D`, aufgelöst über `ssg-ils-block-datei`); ihre Maße
|
||||
werden direkt aus dem Block gemessen (`vf-element-masse`), es gibt dafür keine JSON-Tabelle.
|
||||
|
||||
**Bearbeiten (`c:GEFAELLESTRECKE_EDIT`):** Doppelklick auf einen Gefällestrecken-Block
|
||||
@@ -367,7 +387,16 @@ Verzeichnisstruktur: [`../tests/README.md`](../tests/README.md)):
|
||||
Standardfunktionen direkt in AutoLISP, ohne Zeichnung.
|
||||
2. **Zeichnungsbasierte Integrationstests** (`tests/test_*.lsp` +
|
||||
`tests/test_*.py`) – erzeugen Blöcke in BricsCAD und validieren das
|
||||
Ergebnis anschließend mit pytest/ezdxf.
|
||||
Ergebnis anschließend mit pytest/ezdxf. Module: `test_kreisel`,
|
||||
`test_foerderer`, `test_linienzug`, `test_gefaellestrecke`, `test_omniflo`,
|
||||
`test_omniflo_strecke` und `test_mubea` (Gesamtmodell: Kreisel + Vario +
|
||||
Gefällestrecken + Separatoren aus `tests/testdata/mubea.json` in einer
|
||||
Zeichnung; über `SSG_RUN_ALL_TESTS` bzw. Menü „Tests → Mubea Gesamtmodell").
|
||||
|
||||
Welche JSON-Angaben pro Element-Typ nötig sind (abgeleitet aus den
|
||||
Produktions-Routinen, nicht aus den Test-Wrappern), dokumentiert
|
||||
[`../tests/testdata/object_data.md`](../tests/testdata/object_data.md) –
|
||||
inkl. der Unterscheidung scriptbar vs. nur-interaktiv.
|
||||
|
||||
### LISP-Unit-Tests (`test_unit.lsp`)
|
||||
|
||||
@@ -465,11 +494,21 @@ AutoLISP-Implementierung fuer alle Omniflo-Komponenten: Boegen, Weichen, Verbind
|
||||
|
||||
---
|
||||
|
||||
### `SSG_LIB_Commands.lsp` – Dummy-Befehle und SSG_BLOCKEDIT
|
||||
### `SSG_LIB_Commands.lsp` – Dummy-Befehle, Sensoren, Konfiguration und SSG_BLOCKEDIT
|
||||
|
||||
Platzhalter-Definitionen fuer noch nicht implementierte Menueintraege. Gibt beim Aufruf eine Meldung aus.
|
||||
Alle zugehoerigen Menueintraege sind in `menu/SSG_LIB.mnu` mit `~` ausgegraut (siehe
|
||||
Abschnitt ["Status: noch offene Menueintraege"](#status-noch-offene-menueintraege-im-menue-ausgegraut)).
|
||||
Sammeldatei fuer Menue-Befehle: teils Platzhalter fuer noch nicht implementierte
|
||||
Eintraege, teils bereits **echte** Funktionalitaet (Sensoren, Konfiguration,
|
||||
Doppelklick-Dispatcher). Alle noch offenen Dummy-Menueintraege sind in
|
||||
`menu/SSG_LIB.mnu` mit `~` ausgegraut (siehe Abschnitt
|
||||
["Status: noch offene Menueintraege"](#status-noch-offene-menueintraege-im-menue-ausgegraut)).
|
||||
|
||||
**Sensoren einfuegen** (real, ueber `ils-insert-sensor` → wiederholtes `_.INSERT`
|
||||
mit interaktivem Einfuegepunkt/Rotation, Blockdatei via `ssg-ils-block-datei`):
|
||||
|
||||
| Befehl | Block | Beschreibung |
|
||||
| --- | --- | --- |
|
||||
| `ILS_SCANNER_INSERT` | `Scanner` | Scanner wiederholt einfuegen (ENTER/ESC beendet) |
|
||||
| `ILS_SEPARATOR_INSERT` | `Separator_SP` | Separator wiederholt einfuegen (Menue „Separator einfuegen") |
|
||||
|
||||
Registrierte Dummy-Befehle:
|
||||
|
||||
|
||||
+6
-11
@@ -3,11 +3,9 @@
|
||||
;; Synchronisiert ATTDEF-Attribute in den ILS-Block-DWGs mit den
|
||||
;; Werten aus allocations.json.
|
||||
;;
|
||||
;; Es wird zwischen data/ils/2D und data/ils/3D unterschieden: nach
|
||||
;; Auswahl des Verzeichnisses wird die dortige allocations.json
|
||||
;; gelesen (data/ils/<2D|3D>/allocations.json) und anschliessend
|
||||
;; werden ausschliesslich die DWGs in genau diesem Verzeichnis
|
||||
;; bearbeitet.
|
||||
;; Es wird die allocations.json aus data/ils gelesen
|
||||
;; (data/ils/allocations.json) und anschliessend werden
|
||||
;; ausschliesslich die DWGs in genau diesem Verzeichnis bearbeitet.
|
||||
;;
|
||||
;; Ablauf je JSON-Eintrag "Blockname": {"TAG": "Wert", ...}:
|
||||
;; - <Blockname>.dwg im selben Verzeichnis wie die JSON oeffnen
|
||||
@@ -28,7 +26,7 @@
|
||||
;; Voraussetzung: DXFM_DATA ist gesetzt (siehe bin/setenv.bat).
|
||||
;;
|
||||
;; Aufruf in BricsCAD:
|
||||
;; (load "C:/.../data/ils/2D/addattribute.lisp")
|
||||
;; (load "C:/.../Lisp/addattribute.lsp")
|
||||
;; ILS_ATTR_SYNC
|
||||
;; ============================================================
|
||||
|
||||
@@ -157,7 +155,7 @@
|
||||
;; ------------------------------------------------------------
|
||||
;; Hauptbefehl
|
||||
;; ------------------------------------------------------------
|
||||
(defun c:ILS_ATTR_SYNC ( / data-dir json-pfad dwg-dir dwg-unterverz daten orig-doc anzahl-aktualisiert
|
||||
(defun c:ILS_ATTR_SYNC ( / data-dir json-pfad dwg-dir daten orig-doc anzahl-aktualisiert
|
||||
anzahl-unveraendert anzahl-fehler anzahl-fehlt eintrag blockname attribs
|
||||
dwg-pfad bereits-offen fehler fehlende-liste name)
|
||||
(setq data-dir (getenv "DXFM_DATA"))
|
||||
@@ -169,10 +167,7 @@
|
||||
)
|
||||
(setq data-dir (vl-string-translate "\\" "/" data-dir))
|
||||
|
||||
(initget "2D 3D")
|
||||
(setq dwg-unterverz (getkword "\nDWG-Verzeichnis waehlen [2D/3D] <2D>: "))
|
||||
(if (not dwg-unterverz) (setq dwg-unterverz "2D"))
|
||||
(setq dwg-dir (strcat data-dir "/ils/" dwg-unterverz)
|
||||
(setq dwg-dir (strcat data-dir "/ils")
|
||||
json-pfad (strcat dwg-dir "/allocations.json")
|
||||
)
|
||||
(if (not (findfile json-pfad))
|
||||
|
||||
@@ -6,9 +6,8 @@
|
||||
;; allocations.json (siehe addattribute.lsp):
|
||||
;; {"Blockname": {"TAG1": "Wert1", "TAG2": "Wert2", ...}, ...}
|
||||
;;
|
||||
;; Wird zunaechst fuer data/ils/2D und data/ils/3D ausgefuehrt -
|
||||
;; je Verzeichnis entsteht eine eigene allocations_collected.json,
|
||||
;; direkt im jeweiligen Verzeichnis abgelegt.
|
||||
;; Wird fuer data/ils ausgefuehrt - es entsteht eine
|
||||
;; allocations_collected.json direkt in diesem Verzeichnis.
|
||||
;;
|
||||
;; Voraussetzung: DXFM_DATA ist gesetzt (siehe bin/setenv.bat).
|
||||
;;
|
||||
@@ -215,9 +214,9 @@
|
||||
)
|
||||
|
||||
;; ------------------------------------------------------------
|
||||
;; Hauptbefehl - verarbeitet DXFM_DATA/ils/2D und DXFM_DATA/ils/3D
|
||||
;; Hauptbefehl - verarbeitet DXFM_DATA/ils
|
||||
;; ------------------------------------------------------------
|
||||
(defun c:ILS_ATTR_COLLECT ( / data-dir basis-dir subverz dwg-dir json-pfad)
|
||||
(defun c:ILS_ATTR_COLLECT ( / data-dir dwg-dir json-pfad)
|
||||
(setq data-dir (getenv "DXFM_DATA"))
|
||||
(if (not data-dir)
|
||||
(progn
|
||||
@@ -226,16 +225,10 @@
|
||||
)
|
||||
)
|
||||
(setq data-dir (vl-string-translate "\\" "/" data-dir)
|
||||
basis-dir (strcat data-dir "/ils")
|
||||
)
|
||||
|
||||
(foreach subverz '("2D" "3D")
|
||||
(setq dwg-dir (strcat basis-dir "/" subverz)
|
||||
json-pfad (strcat dwg-dir "/allocations_collected.json")
|
||||
)
|
||||
(princ (strcat "\n[ATTR-COLLECT] === " subverz " ==="))
|
||||
(cac-collect-directory dwg-dir json-pfad)
|
||||
dwg-dir (strcat data-dir "/ils")
|
||||
json-pfad (strcat dwg-dir "/allocations_collected.json")
|
||||
)
|
||||
(cac-collect-directory dwg-dir json-pfad)
|
||||
(princ)
|
||||
)
|
||||
|
||||
|
||||
@@ -384,6 +384,13 @@
|
||||
;; Omniflo Boegen/Weichen = rein numerische Blocknamen (SivasNr)
|
||||
;; Vario* = VarioFoerderer-Bloecke
|
||||
;; GF_* = Gefaellestrecke Compound-Bloecke
|
||||
;; Separator_SP*/S-LP*, Scanner* = eigenstaendige Sensor-Bloecke (siehe
|
||||
;; pattern_separator/pattern_scanner in cfg/export.cfg). Landen in
|
||||
;; export_raw.json fuer BEIDE Exporte (EXPORTCSV/EXPORTSIVAS teilen sich
|
||||
;; diese Sammlung) - export_csv.py gibt ihnen eigene TeileArt-Zeilen,
|
||||
;; export_sivas.py schliesst sie bewusst wieder aus (siehe dort), da ihre
|
||||
;; Anzahl schon ueber ANZAHL_SEPARATOR/ANZAHL_SCANNER an Kreisel/GF/VF
|
||||
;; gezaehlt wird.
|
||||
;; Gibt Auswahlsatz zurueck oder nil.
|
||||
(defun csv:collect-export-blocks ( / ss-all ss-out i ename ed bname)
|
||||
(setq ss-all (ssget "X" (list (cons 0 "INSERT"))))
|
||||
@@ -399,6 +406,8 @@
|
||||
(wcmatch (strcase bname) (export:pattern "pattern_gerade" "AP110*,AP_110*"))
|
||||
(wcmatch bname (export:pattern "pattern_strecke"
|
||||
"Vario*,Staustrecke*,AUS_Element*,EIN_Element*,VF_*,GF_*"))
|
||||
(wcmatch bname (export:pattern "pattern_separator" "Separator_SP*,S-LP*"))
|
||||
(wcmatch bname (export:pattern "pattern_scanner" "Scanner*"))
|
||||
;; Rein numerische Namen = Omniflo SivasNr (Boegen/Weichen)
|
||||
;; Rein LISP-intern (Python klassifiziert Omniflo stattdessen
|
||||
;; ueber exakten Katalog-Match), daher fest im Code statt in
|
||||
|
||||
+78
-41
@@ -370,13 +370,58 @@
|
||||
(defun ssg-ils-block-datei (blockname / )
|
||||
(ssg-ils-block-datei-dim blockname (ssg-ils-dim-aktuell)))
|
||||
|
||||
;; ------------------------------------------------------------
|
||||
;; REDEFINE-SPERRE (eine DWG-Lesung pro Block und Zeichnung)
|
||||
;; ------------------------------------------------------------
|
||||
;; Merkliste der in DIESER Zeichnung schon einmal aus der DWG-Datei neu
|
||||
;; definierten (redefinierten) Blocknamen. Grundlage der Sperre in
|
||||
;; ssg-ils-block-laden-dim. Namen werden in Grossschreibung gehalten, weil
|
||||
;; Blocknamen in CAD case-insensitiv sind. LISP-Variablen sind pro Dokument
|
||||
;; eigenstaendig, die Liste gilt also automatisch je Zeichnung.
|
||||
(if (not (boundp '*ssg-block-refreshed*)) (setq *ssg-block-refreshed* nil))
|
||||
|
||||
(defun ssg-block-refreshed-p (eff / )
|
||||
(and (boundp '*ssg-block-refreshed*)
|
||||
(member (strcase eff) *ssg-block-refreshed*)
|
||||
t))
|
||||
|
||||
(defun ssg-block-refreshed-set (eff / )
|
||||
(if (not (ssg-block-refreshed-p eff))
|
||||
(setq *ssg-block-refreshed* (cons (strcase eff) *ssg-block-refreshed*)))
|
||||
eff)
|
||||
|
||||
;; Sperre aufheben - erzwingt beim naechsten ssg-ils-block-laden(-dim) ein
|
||||
;; erneutes Einlesen der DWG. Argument nil: ALLE Bloecke; ROH- oder effektiver
|
||||
;; Blockname: nur dieser (beide Dimensionen). Noetig, wenn eine Block-DWG
|
||||
;; waehrend der laufenden Sitzung geaendert wurde.
|
||||
(defun ssg-block-refresh-reset (blockname / rest n2 n3 nroh)
|
||||
(if (null blockname)
|
||||
(setq *ssg-block-refreshed* nil)
|
||||
(progn
|
||||
(setq nroh (strcase blockname)
|
||||
n2 (strcase (ssg-ils-blockname-dim blockname "2D"))
|
||||
n3 (strcase (ssg-ils-blockname-dim blockname "3D"))
|
||||
rest '())
|
||||
(foreach n *ssg-block-refreshed*
|
||||
(if (not (or (= n nroh) (= n n2) (= n n3)))
|
||||
(setq rest (cons n rest))))
|
||||
(setq *ssg-block-refreshed* rest)))
|
||||
(princ))
|
||||
|
||||
;; Stellt sicher, dass die Block-DEFINITION zum ROH-Namen 'blockname' in einer
|
||||
;; EXPLIZITEN Dimension geladen ist. Blocknamen tragen das Suffix _2D/_3D
|
||||
;; (siehe ssg-ils-blockname-dim), daher koennen 2D und 3D gleichzeitig existieren.
|
||||
;; WICHTIG: Ein bereits vorhandener gleichnamiger Block wird IMMER neu aus der
|
||||
;; Datei definiert (Redefine), damit sein Inhalt zur aktuellen Datei passt. Sonst
|
||||
;; bliebe eine veraltete Definition (z.B. mit falschem 2D/3D-Inhalt aus einer
|
||||
;; frueheren Sitzung) bestehen und wuerde wiederverwendet.
|
||||
;; Ein bereits vorhandener gleichnamiger Block wird EINMAL PRO ZEICHNUNG neu aus
|
||||
;; der Datei definiert (Redefine), damit eine veraltete Definition aus einer
|
||||
;; frueheren Sitzung (z.B. mit falschem 2D/3D-Inhalt) nicht wiederverwendet wird.
|
||||
;; Jeder WEITERE Aufruf fuer denselben effektiven Blocknamen ueberspringt das
|
||||
;; Neu-Definieren (siehe *ssg-block-refreshed*): Ohne diese Sperre las jede
|
||||
;; einzelne Element-Einfuegung die DWG erneut von der Platte - bei den grossen
|
||||
;; 3D-Bloecken (AS_Element_90_links_3D ~52 MB, ES_Element_90_links_3D ~9 MB)
|
||||
;; und zusaetzlich einer Regeneration aller bereits platzierten Referenzen
|
||||
;; dieses Blocks. Bei Tests mit vielen Strecken (TEST_MUBEA, Gefaellestrecke-
|
||||
;; und Foerderer-Tests) fuehrte das zu minutenlangen Laufzeiten.
|
||||
;; Zum erzwungenen Neu-Einlesen: ssg-block-refresh-reset.
|
||||
;; Rueckgabe: effektiver (suffigierter) Blockname oder nil (Datei nicht gefunden).
|
||||
(defun ssg-ils-block-laden-dim (blockname dim / eff datei base temp-obj osm areq adia)
|
||||
(setq eff (ssg-ils-blockname-dim blockname dim))
|
||||
@@ -385,12 +430,6 @@
|
||||
nil
|
||||
(progn
|
||||
(setq base (vl-filename-base datei))
|
||||
;; --- TEMP-DIAGNOSE (nach Klaerung wieder entfernen) ---
|
||||
(princ (strcat "\n[SSG-DBG] roh=" blockname " dim=" dim
|
||||
" eff=" eff
|
||||
" existiert-vorher=" (if (tblsearch "BLOCK" eff) "JA" "NEIN")
|
||||
" datei=" datei))
|
||||
;; --- ENDE TEMP-DIAGNOSE ---
|
||||
;; Sichtbar machen, wenn die Datei der gewuenschten Dimension fehlt und der
|
||||
;; 3D-Fallback greift (dann traegt der Block den gewuenschten Namen, aber
|
||||
;; den Inhalt der anderen Dimension = potenziell falsche Referenz). Jeder
|
||||
@@ -399,38 +438,36 @@
|
||||
(princ (strcat "\n[SSG] WARNUNG: Blockdatei '" eff
|
||||
".dwg' fehlt - Fallback auf '" base
|
||||
".dwg' (Inhalt evtl. andere Dimension).")))
|
||||
(if (and (not (tblsearch "BLOCK" eff)) (= (strcase base) (strcase eff)))
|
||||
;; Neu UND Dateiname == Blockname -> COM-Weg (kein Prompt).
|
||||
;; In dieser Zeichnung bereits aus der Datei aktualisiert UND noch in der
|
||||
;; Blocktabelle vorhanden -> nichts zu tun, die Definition ist aktuell.
|
||||
;; Die tblsearch-Pruefung faengt ab, dass der Block zwischenzeitlich
|
||||
;; entfernt wurde (z.B. per PURGE) und neu geladen werden muss.
|
||||
(if (and (ssg-block-refreshed-p eff) (tblsearch "BLOCK" eff))
|
||||
eff
|
||||
(progn
|
||||
(setq temp-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0)) datei 1.0 1.0 1.0 0))
|
||||
(vla-Delete temp-obj))
|
||||
;; Sonst (Block existiert bereits ODER Dateiname != Blockname wg.
|
||||
;; 3D-Fallback) -> aus Datei (neu) definieren. "_Y" beantwortet die
|
||||
;; Redefine-Abfrage, falls der Block bereits vorhanden ist; danach die
|
||||
;; laufende Einfuegung sofort abbrechen (Definition ist bereits wirksam).
|
||||
(progn
|
||||
(setq areq (getvar "ATTREQ") adia (getvar "ATTDIA") osm (getvar "OSMODE"))
|
||||
(setvar "ATTREQ" 0)(setvar "ATTDIA" 0)(setvar "OSMODE" 0)
|
||||
(if (tblsearch "BLOCK" eff)
|
||||
(command "_.-INSERT" (strcat eff "=" datei) "_Y") ; Redefine bestehender Block
|
||||
(command "_.-INSERT" (strcat eff "=" datei))) ; neu (kein Redefine-Prompt)
|
||||
(if (> (getvar "CMDACTIVE") 0) (command))
|
||||
(if (> (getvar "CMDACTIVE") 0) (command))
|
||||
(setvar "OSMODE" osm)(setvar "ATTREQ" areq)(setvar "ATTDIA" adia)))
|
||||
;; --- TEMP-DIAGNOSE: verschachtelte Blocknamen in eff auflisten ---
|
||||
(if (tblsearch "BLOCK" eff)
|
||||
(progn
|
||||
(princ (strcat "\n[SSG-DBG] nested in " eff ":"))
|
||||
(vl-catch-all-apply
|
||||
(function (lambda ()
|
||||
(vlax-for e (vla-Item
|
||||
(vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
|
||||
eff)
|
||||
(if (= (vla-get-ObjectName e) "AcDbBlockReference")
|
||||
(princ (strcat " [" (vla-get-Name e) "]")))))))))
|
||||
;; --- ENDE TEMP-DIAGNOSE ---
|
||||
eff)))
|
||||
(if (and (not (tblsearch "BLOCK" eff)) (= (strcase base) (strcase eff)))
|
||||
;; Neu UND Dateiname == Blockname -> COM-Weg (kein Prompt).
|
||||
(progn
|
||||
(setq temp-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0)) datei 1.0 1.0 1.0 0))
|
||||
(vla-Delete temp-obj))
|
||||
;; Sonst (Block existiert bereits ODER Dateiname != Blockname wg.
|
||||
;; 3D-Fallback) -> aus Datei (neu) definieren. "_Y" beantwortet die
|
||||
;; Redefine-Abfrage, falls der Block bereits vorhanden ist; danach die
|
||||
;; laufende Einfuegung sofort abbrechen (Definition ist bereits wirksam).
|
||||
(progn
|
||||
(setq areq (getvar "ATTREQ") adia (getvar "ATTDIA") osm (getvar "OSMODE"))
|
||||
(setvar "ATTREQ" 0)(setvar "ATTDIA" 0)(setvar "OSMODE" 0)
|
||||
(if (tblsearch "BLOCK" eff)
|
||||
(command "_.-INSERT" (strcat eff "=" datei) "_Y") ; Redefine bestehender Block
|
||||
(command "_.-INSERT" (strcat eff "=" datei))) ; neu (kein Redefine-Prompt)
|
||||
(if (> (getvar "CMDACTIVE") 0) (command))
|
||||
(if (> (getvar "CMDACTIVE") 0) (command))
|
||||
(setvar "OSMODE" osm)(setvar "ATTREQ" areq)(setvar "ATTDIA" adia)))
|
||||
;; Nur merken, wenn die Definition danach wirklich vorhanden ist -
|
||||
;; sonst wuerde ein fehlgeschlagener Ladeversuch dauerhaft gesperrt.
|
||||
(if (tblsearch "BLOCK" eff) (ssg-block-refreshed-set eff))
|
||||
eff)))))
|
||||
|
||||
;; Wie ssg-ils-block-laden-dim, aber fuer die AKTUELLE Dimension.
|
||||
(defun ssg-ils-block-laden (blockname / )
|
||||
|
||||
+4
-2
@@ -106,8 +106,10 @@
|
||||
(t nil)))
|
||||
|
||||
;; Normalisiert die verschiedenen KS-Blocknamen auf "KS_EIN"/"KS_AUS".
|
||||
;; Die aelteren Bloecke (AS/ES/Gefaellebogen) verwenden KS_EIN/KS_AUS, die
|
||||
;; Vario_Kurve-Bloecke KSYS_EIN/KSYS_AUS. Rueckgabe nil, wenn kein KS-Block.
|
||||
;; Standard ist KS_EIN/KS_AUS; historische Bestandsbloecke koennen noch
|
||||
;; KSYS_EIN/KSYS_AUS fuehren (Vereinheitlichung via ILS_BLOCK_RENAME in
|
||||
;; block_rename.lsp). Diese Normalisierung bleibt als Sicherheitsnetz fuer
|
||||
;; solche Altzeichnungen. Rueckgabe nil, wenn kein KS-Block.
|
||||
(defun ks-normalize-name (nm)
|
||||
(cond
|
||||
((or (= nm "KS_EIN") (= nm "KSYS_EIN")) "KS_EIN")
|
||||
|
||||
@@ -893,8 +893,9 @@
|
||||
;; Nicht-interaktiver Kern: Vario-Kurve mit gegebenem Winkel/Seite/Variante
|
||||
;; einfuegen. Genutzt von der interaktiven Abfrage UND von den Pfad-Modi
|
||||
;; (Winkel/Seite aus der Geometrie, Variante abgefragt). Rueckgabe: neuer Frame.
|
||||
;; Die Vario_Kurve-Bloecke fuehren KS_EIN/KS_AUS als KSYS_EIN/KSYS_AUS -
|
||||
;; extract-ks-from-block-raw normalisiert das (siehe ks-normalize-name).
|
||||
;; Standard sind KS_EIN/KS_AUS; historische Bestandsbloecke koennen noch
|
||||
;; KSYS_EIN/KSYS_AUS fuehren - extract-ks-from-block-raw normalisiert das
|
||||
;; (siehe ks-normalize-name).
|
||||
(defun vfl-insert-vario-kurve-block (frame kwinkel kseite kvariante /
|
||||
blockname hz flach-frame neuer-frame
|
||||
hz-gemessen hz-gesnappt)
|
||||
@@ -924,8 +925,9 @@
|
||||
)
|
||||
|
||||
;; Vario-Kurve (horizontale Kurve, Neigung bleibt wie im aktuellen Frame).
|
||||
;; Die Vario_Kurve-Bloecke fuehren KS_EIN/KS_AUS als KSYS_EIN/KSYS_AUS -
|
||||
;; extract-ks-from-block-raw normalisiert das (siehe ks-normalize-name).
|
||||
;; Standard sind KS_EIN/KS_AUS; historische Bestandsbloecke koennen noch
|
||||
;; KSYS_EIN/KSYS_AUS fuehren - extract-ks-from-block-raw normalisiert das
|
||||
;; (siehe ks-normalize-name).
|
||||
;; Interaktiv (i18n): Vario-Kurve-Winkel + Seite + Variante abfragen, dann Kern.
|
||||
(defun vfl-insert-vario-kurve (frame / kwinkel kseite kvariante antwort)
|
||||
(princ (ssg-text "vfl-variokurve-winkel-header"))
|
||||
|
||||
Reference in New Issue
Block a user