;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Höhenanalysedaten abgekürzt HAYDN von DGMs übertragen ;;; ;;; Udo Hübner - für Civil 3D 2007-2009 ;;; ;;; nicht unterstützt, wegen API Einschränkungen werden Civil/MAP 2005-2006;; ;;; Neu 13.07.07 - V0.9 ;;; ;;; Update 26.07.07 - V1.0 Schreibfehler verbessert, sowie DWGPREFIX als ;;; ;;; Pfadvorschlag hinzugefügt ;;; ;;; Update 02.08.07. connecttocivil überarbeitet ;;; ;;; V1.1 - Auslieferungsstand zu Civil 3D 2009 ;;; ;;; Update 30.02.08 Anpassung an Civil 2009 ;;; ;;; V1.2 ;;; ;;; Update 30.10.08 Fehler bei ElevationRegions bei flachen DGM abgef. ;;; ;;; Update 04.11.08 Fehler bei tri. Mengen DGMS durch vorgeschaltete ;;; ;;; Iteration durch die DGM Collection behoben ;;; ;;; Update 08.11.08 Unterstützung von Raster DGMs ;;; ;;; Update 09.03.09 Anpassung an Civil 2010 ;;; ;;; Update 23.09.21 Anpassung an Civil 2022 Udo Hübner ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Routine zum Übertragen von Höhenanalysedaten ;;; ;;; Exportieren von Höhenanalysedaten in eine Textdatei (Tab-delimited) ;;; ;;; Importieren und Zuweisen von Höhenanalysedaten aus einer Textdatei ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; getestet mit Civil 3D 2007, 2008 und 2009, 2010-2022 ;;; ;;; Aufruf: HAYDNTRANS Höhenanalysedaten übertragen ;;; ;;; HAYDNEXPORT HöhenAnalysedatenexportieren und ;;; ;;; HAYDNIMPORT HöhenAnalysedatenimportieren ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Hinweis: True Color und Farbbuchfarben werden durch eine Indexfarbe ;;; ;;; ersetzt. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Unterstützung der Namen aus dem DACH Country Kit 2007-2009 (DEFUN C:HöhenAnalysedatenimportieren () (C:HAYDNIMPORT)(princ) ) (DEFUN C:HöhenAnalysedatenexportieren () (C:HAYDNEXPORT)(princ) ) (DEFUN C:HöhenAnalysedatenübertragen () (C:HAYDNTRANS)(princ) ) (vl-load-com) (defun connecttocivil (/ AeccObj aecstring) (setq aecstring (cond ;((= (atof (getvar "acadver")) 16.2) "AeccXUiLand.AeccApplication.3.0"); MAP/Civil 2006 ((= (atof (getvar "acadver")) 17.0) "AeccXUiLand.AeccApplication.4.0"); Civil 2007 ((= (atof (getvar "acadver")) 17.1) "AeccXUiLand.AeccApplication.5.0"); Civil 2008 ((= (atof (getvar "acadver")) 17.2) "AeccXUiLand.AeccApplication.6.0"); Civil 2009 ((= (atof (getvar "acadver")) 18.0) "AeccXUiLand.AeccApplication.7.0"); Civil 2010 ((= (atof (getvar "acadver")) 18.1) "AeccXUiLand.AeccApplication.8.0"); Civil 2011 ((= (atof (getvar "acadver")) 18.2) "AeccXUiLand.AeccApplication.9.0"); Civil 2012 ((= (atof (getvar "acadver")) 19.0) "AeccXUiLand.AeccApplication.10.0"); Civil 2013 ((= (atof (getvar "acadver")) 19.1) "AeccXUiLand.AeccApplication.10.3"); Civil 2014 ((= (atof (getvar "acadver")) 20.0) "AeccXUiLand.AeccApplication.10.4"); Civil 2015 ((= (atof (getvar "acadver")) 20.1) "AeccXUiLand.AeccApplication.10.5"); Civil 2016 ((= (atof (getvar "acadver")) 21.0) "AeccXUiLand.AeccApplication.11.0"); Civil 2017 ((= (atof (getvar "acadver")) 22.0) "AeccXUiLand.AeccApplication.12.0"); Civil 2018 ((= (atof (getvar "acadver")) 23.0) "AeccXUiLand.AeccApplication.13.0"); Civil 2019 ((= (atof (getvar "acadver")) 23.1) "AeccXUiLand.AeccApplication.13.2"); Civil 2020 ((= (atof (getvar "acadver")) 24.0) "AeccXUiLand.AeccApplication.13.3"); Civil 2021 ((= (atof (getvar "acadver")) 24.1) "AeccXUiLand.AeccApplication.13.4"); Civil 2022 ;('T "AeccXUiLand.AeccApplication") ; Civil ) ) (if (vl-catch-all-error-p (setq AeccObj (vl-catch-all-apply 'vla-getinterfaceobject (list (vlax-get-acad-object) aecstring) ; connect to Civil 200x ) ) ) NIL AeccObj ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun C:HAYDNTRANS ( / ALLREGIONS AECCOBJ CNT TinEntity SSDGMS ) (Prompt "\nDGM-Analysedaten übertragen V1.3 - www.CAD-Huebner.de") (if (not (setq AeccObj (connecttocivil))) (progn (prompt "\nCivil 3D steht nicht zur Verfügung - Programm abgebrochen!") (exit) ) ) ;;; wegen BUG in Civil 2009 die Analysefunktionen einmal initialisieren (if (not *HAYDNalreadyinUse*)(progn (getTinTypes)(setq *HAYDNalreadyinUse* 'T))) (If (and (setq TinEntity (car (entsel "\nQuell-DGM wählen:"))) (member (cdr (assoc 0 (entget TinEntity))) '("AECC_TIN_SURFACE" "AECC_GRID_SURFACE")) ) (if (Setq AllRegions (GETTINDATA TinEntity)) (progn (prompt "Ziel-DGMs wählen:") (if (setq ssDGMS (SSGET (list (cons 0 "AECC_*_SURFACE")))) (progn (setq cnt (sslength ssDGMS)) (while (>= (setq cnt (1- cnt)) 0) (PutTINDATA (ssname ssDGMs cnt) AllRegions) ) ) ) ) ;else (Prompt "\nDGM enthält keine übertragbaren Analysedaten.") ) (Prompt "\nKein DGM gewählt.") ) (prin1) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; EXPORT VON HÖHENANALYSEDATEN IN TAB GETRENNTE TEXTDATEI ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun C:HAYDNEXPORT ( / allRegions cnt datei dimz file region regiondata TinEntity ) (Prompt "\nDGM-Analysedaten exportieren V1.3 - www.CAD-Huebner.de") ;;; wegen BUG in Civil 2009 die Analysefunktionen einmal initialisieren (if (not *HAYDNalreadyinUse*)(progn (getTinTypes)(setq *HAYDNalreadyinUse* 'T))) (if (and (setq TinEntity (car (entsel "\nQuell-DGM wählen:"))) (member (cdr (assoc 0 (entget TinEntity))) '("AECC_TIN_SURFACE" "AECC_GRID_SURFACE")) (setq datei (getfiled "Exportdatei für DGM-Analysedaten angeben:" (strcat (getvar "dwgprefix")(getvar "dwgname")) "txt" 1 ) ) ) (progn (setq file (open datei "w")) (Write-line "Farbnummer\tMin. Höhe\tMax. Höhe" file) ; Daten müssen mit Nachkommastellen exportiert werden (setq dimz (getvar "dimzin")) (setvar "dimzin" 2) (foreach region (setq regiondata (GETTINDATA TinEntity)) (write-line (strcat (itoa (car region)) "\t" ; Color (rtos (cadr region) 2 3) "\t" ; MinimumElevation (rtos (caddr region) 2 3) ; MaximumElevation ) file ) ) (setvar "dimzin" dimz) (close file) (if (not regiondata) (prompt "\ndas DGM enthält keine Analysedaten!") (prompt "Ausgabe beendet.") ) ) (Prompt "\nKein DGM gewählt.") ) (prin1) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; IMPORT VON HÖHENANALYSEDATEN AUS TAB GETRENNTER TEXTDATEI ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun C:HAYDNIMPORT ( / AeccObj allRegions cnt Datei File Region Zeile TinEntity ) (Prompt "\nDGM-Analysedaten importieren und zuweisen V1.3 - www.CAD-Huebner.de") (if (not (Setq AeccObj (connecttoCivil))) (progn (prompt "Civil 3D 20XX nicht verfügbar, Programm abgebrochen!") (exit) ) ) ;;; wegen BUG in Civil 2009 die Analysefunktionen einmal initialisieren (if (not *HAYDNalreadyinUse*) (progn (getTinTypes) (setq *HAYDNalreadyinUse* 'T) ) ) (if (and (setq TinEntity (car (entsel "\nZiel-DGM wählen:"))) (member (cdr (assoc 0 (entget TinEntity))) '("AECC_TIN_SURFACE" "AECC_GRID_SURFACE")) (setq datei (getfiled "Importdatei für DGM-Analysedaten angeben:" (strcat (getvar "dwgprefix")(getvar "dwgname")) "txt" 0 ) ) ) (progn (setq file (open datei "r")) (read-line file) (while (setq zeile (read-line file)) (setq region (read (strcat "(" zeile ")")) allRegions (cons region allRegions) ) ) (close file) (if (RegionDataok? (reverse AllRegions)) (PutTINDATA TinEntity (reverse AllRegions)) (alert "Datei enthält ungültige Datensätze!\nImport fehlgeschlagen.") ) (prompt "fertig.") ) (Prompt "\nKein DGM gewählt.") ) (prin1) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; PRÜFUNG, OB BEREICHSTABELLEN IN TEXTDATEI DEN BEDINGUNGEN DER ;;; ;;; ElevationRegions ENTSPRECHEN, MINIMUM MUSS KLEINER GLEICH MAXIMUM ;;; ;;; UND DIE HÖHENBEREICHE DÜRFEN SICH NICHT ÜBERSCHNEIDEN ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun RegionDataok? (AllRegions / cnt ok ) ; einfache Validierung der Regionenwerte aus der Textdatei (setq cnt 0 ok 'T ) (repeat (length allRegions) (if (> (cadr (nth cnt allRegions)) (caddr (nth cnt allRegions))) (progn (Prompt (strcat "\nProblem: Datensatz in Zeile " (itoa (1+ cnt)) " ungültig! Min > Max.")) (setq ok nil) ) ) (Cond ((= cnt 0) 'T) ((= (cadr (nth cnt allRegions)) (caddr (nth (1- cnt) allRegions))) 'T) ((> (cadr (nth cnt allRegions)) (caddr (nth (1- cnt) allRegions))) (Prompt (strcat "\nHinweis: Lücke bei Datensatz in Zeile " (itoa (1+ cnt)) " Max < Min Folgezeile.")) ) ((< (cadr (nth cnt allRegions)) (caddr (nth (1- cnt) allRegions))) (Prompt (strcat "\nProblem: Überschneidung bei Datensatz in Zeile " (itoa (1+ cnt)) " Max > Min Folgezeile.")) (setq ok nil) ) ('T 'T) ) (Setq cnt (1+ cnt)) ) (if (not allRegions) nil ok); leere Liste verursacht Fehler, ansonsten Rückgabewert ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; GETTINDATA - GIBT DIE HÖHENANALYSEDATEN ALS LISTE ZURÜCK ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun GETTINDATA (TinEntity / AllRegions DGMOBJECT ELEVATIONREGIONS REGIONLIST SURFACEANALYSIS SURFACEANALYSISELEVATION ) (setq DGMObject (vlax-ename->vla-object TinEntity) SurfaceAnalysis (vlax-get-property DGMObject "SurfaceAnalysis") SurfaceAnalysisElevation (vlax-get-property SurfaceAnalysis "ElevationAnalysis") ElevationRegions (vlax-get-property SurfaceAnalysisElevation "ElevationRegions") ) (vlax-for Region ElevationRegions (setq Regionlist (list (vlax-get-property Region "Color") (vlax-get-property Region "MinimumElevation") (vlax-get-property Region "MaximumElevation") ) AllRegions (cons Regionlist AllRegions) ) ; example / Beispiel ; Color = 26 ; MaximumElevation = 80.0 ; MinimumElevation = 60.0 ) (reverse allRegions) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; PUTTINDATA - SCHREIBT DIE ALS LISTE ÜBERGEBENEN HÖHENANALYSEDATEN AN ;;; ;;; DAS AUSGEWÄHLTE DGM ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun PUTTINDATA (TinEntity Regions / cntrecreatedRegions dgmObject elevationregions SurfaceAnalysis Surfaceanalysiselevation RegionObjlist tempmax ) (setq DGMObject (vlax-ename->vla-object TinEntity) SurfaceAnalysis (vlax-get-property DGMObject "SurfaceAnalysis") SurfaceAnalysisElevation (vlax-get-property SurfaceAnalysis "ElevationAnalysis") ) ; die Methode verursacht mitunter "unbekannte Fehler", deshalb Fehler abfangen (if (vl-catch-all-error-p (setq ElevationRegions (vl-catch-all-apply 'vlax-invoke-method (list SurfaceAnalysisElevation "CalculateElevationRegions" (length Regions) :vlax-true ; Skalierung nach Farbschema ) ) ) ) (Prompt "\nDaten konnten nicht zugwiesen werden!") ; Problem könnte z.B. ein nicht verfügbares Farbschema sein. (progn ;;; da die Bereiche sich nicht überlagern dürfen, werden Sie temporär ;;; mit werten ausßerhalb des Zielbereichs neu belegt, ;;; dann erst mit den endgültigen Realwerten belegt. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Aufgrund eines BUGs bei flachen DGMs hier noch mal prüfen, ob ;;; die Anzahl der Regionen mit (length Regions) übereinstimmt (setq cntrecreatedRegions 0) ;;; zuerst eine Objektliste erzeugen (vlax-for Region ElevationRegions (setq regionobjlist (cons Region Regionobjlist) cntrecreatedRegions (1+ cntrecreatedRegions) ) ) (if (/= cntrecreatedRegions (length Regions)) (Prompt (Strcat "\nAnzahl erzeugter Regionen <" (itoa cntrecreatedRegions) ">, Soll war <" (itoa (length Regions)) ">. ")) ) (if (> cntrecreatedRegions 0) (progn (Setq tempmax (+ (last (last Regions)) (vlax-get-property (car regionobjlist) "MaximumElevation" ) (length Regions) ) ) (foreach Region regionobjlist (vlax-put-property Region "MaximumElevation" tempmax) (vlax-put-property Region "MinimumElevation" (setq Tempmax (1- tempmax))) ) (foreach Region (reverse regionobjlist) (if (caar Regions) (progn (vlax-put-property Region "Color" (caar Regions)) (vlax-put-property Region "MinimumElevation" (cadar Regions)) (vlax-put-property Region "MaximumElevation" (caddar Regions)) (setq Regions (cdr Regions)) ) ) ) ) ) ) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; LISTE DER 4 DGM-Typen zurückgeben (TIN, MENGEN TIN, ;;; ;;; RASTER und MENGEN RASTER) ;;; ;;; Durch einmaligen Zugriff wird der BUG beim Zugriff auf die ;;; ;;; Analysedaten bei Mengen TINs behoben ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (DEFUN getTinTypes ( / AeccApp AeccDoc AeccSurfaces cnt dgm Tinlist) ;;; Auflisten der DGM Typen ;;; durch den ActiveX Zugriff auf alle DGMs werden Probleme beim Zugriff ;;; auf Analysedaten bei triangulierten Mengenmodellen vermieden. (if (setq aeccApp (connecttocivil)) (progn (setq aeccDoc (vlax-get aeccApp "activedocument")) (setq aeccSurfaces (vlax-get-property aeccDoc "Surfaces")) (setq cnt (vlax-get-property aeccSurfaces "count")) (while (>= (setq cnt (1- cnt)) 0) (setq TinList (cons (list (vlax-get-property (setq dgm (vlax-get-property aeccSurfaces "item" cnt)) "name") (vlax-get-property (setq dgm (vlax-get-property aeccSurfaces "item" cnt)) "Type") ) tinList ) ) ;; Typ 4 = Tin Volumen (trianguliertes Mengenmodell) ;; ((= 4 (vlax-get-property (setq dgm (vlax-get-property aeccSurfaces 'item cnt)) "Type")) ;; (setq stat (vlax-get-property dgm 'Statistics)) ;; (Print (vlax-get-property (vlax-get-property stat 'BottomSurface) 'name)) ;; (Print (vlax-get-property (vlax-get-property stat 'TopSurface) 'name)) ) ) ; else NIL ; Civil/Map 3D nicht verfügbar - Programmausführung nicht möglich. ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (prompt (strcat "HAYDN.lsp geladen. Befehle\n" "HAYDNTRANS Höhenanalysedaten übertragen\n" "HAYDNEXPORT Höhenanalysedaten exportieren und\n" "HAYDNIMPORT Höhenanalysedaten importieren stehen zur Verfügung.")) (princ)