| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: externe Referenz direkt bearbeiten (183 / mal gelesen)
|
Speedy1977 Mitglied Planer Energieversorgung
Beiträge: 7 Registriert: 27.09.2024 AUTOCAD, aktuelle Version, MEP MAP klassisch, notepad++
|
erstellt am: 27. Sep. 2024 10:46 <-- editieren / zitieren --> Unities abgeben:
Hallo Mitstreiter, ich versuche krampfhaft Eigenschaftsdaten aus einer externen Referenz zu ermitteln. Da ich im AutoCAD MAP 2024 arbeite handelt es sich speziel um GIS-Daten. Das AUslesen der Daten würde ich hinbekommen oder besser habe ich schon. Aber dafür muss ich die externe Referenz in die Zeichnung kopieren, was ich nicht möchte. Die Infodatei wird von einer anderen Stelle immer aktualisiert und ich kann beim öffnen meiner Zeichnung immer auf die aktuellen Daten zugreifen. Nun mein Problem. Da ich ca. 150 Objekte in meiner originalen Zeichnung beschriften muss (immer mit aktuellen Werten), nun der Weg über lisp. Für mich ist nur die Frage wie ich die externe Referenz zum Bearbeiten lade, damit ich die ganzen Eigenschaften auslesen kann,... Ich versuche mit Code:
(setq myss (ssget "X")) ... (setq xref (ssname myss i) ... (command "_.refedit" xref)
auf die Referenz zuzugreifen, wobei ich alle INSERT's durchsuche, um die richtige X-Ref zu finden. Code:
(command "_.select" xref)
Markiert mir auch die richtige Referenz nur wie übergebe ich diese? geht ja mit Rechtsklick und "externe Referenz direkt bearbeiten" auch... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Grebe Mitglied
Beiträge: 537 Registriert: 16.12.2002
|
erstellt am: 27. Sep. 2024 11:06 <-- editieren / zitieren --> Unities abgeben: Nur für Speedy1977
Hilft das ? (defun C:XOpen ( / selset n) (if (not (setq selset (ssget "I" '((0 . "INSERT"))))) (progn (princ "\nXref auswählen, die geöffnet werden soll : ") (setq selset (ssget ":S" '((0 . "INSERT")))) )) (if selset (progn (setq n 0) (repeat (sslength selset) (if (eq 4 (logand 4 (cdr (assoc 70 (tblsearch "BLOCK" (cdr (assoc 2 (entget (ssname selset n))))))))) (command "_open" (GetXrefPath (ssname selset n))) (princ (strcat "\nKein Xref: " (cdr (assoc 2 (entget (ssname selset n)))))) ) (setq n (+ 1 n)) ) ) (princ "\nKein XRef gewählt !") ) (princ) ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22291 Registriert: 03.06.2002 Alles
|
erstellt am: 27. Sep. 2024 11:30 <-- editieren / zitieren --> Unities abgeben: Nur für Speedy1977
Hi, bis jemand mit Ahnung kommt: Wie liest du die Daten denn aus? Mit der Antwort würde ich erkennen ob es überhaupt nötig ist irgendeine externe Datei zu öffnen. Zudem gib es mehrere Möglichkeiten an Daten von anderen Dateien zu gelangen, aber nicht mit jeder Möglichkeit kann alles umgesetzt werden, also auch hier ist zu prüfen ob man das auf dem Weg X Y oder Z überhaupt machen kann. (BTW: Herzlich Willkommen) Zeig doch mal her wie du es aktuell machst, wenn du die Daten der Xref in deine Datei kopiert hast/hattest. Im Allgemeinen 3-4 Wege a) Objektdaten -> können direkt ausgelesen werden, kein Import oder Öffnen nötig. b) Not quick but dirty, Kopieren/einfügen, auslesen und die letzten Schritte Rückgängig machen bzw. Objekte Löschen. c) Ganz elegant mit der AutoCAD internen Methode Daten aus anderen Dateien auslesen d) Datei im Hintergrund "richtig" öffnen und auslesen
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Speedy1977 Mitglied Planer Energieversorgung
Beiträge: 7 Registriert: 27.09.2024 AUTOCAD, aktuelle Version, MEP MAP klassisch, notepad++
|
erstellt am: 27. Sep. 2024 12:42 <-- editieren / zitieren --> Unities abgeben:
Danke erst einmal für die schnelle Antwort... dafür schon einmal Daume hoch Den gesamten Code zum Daten-Auslesen wäre hier etwas zu viel: Es sind 3 .lsp Dateien, 1. Datei 200 Zeilen, 2. Datei 60 Zeilen, 3. Datei in Bearbeitung siehe unten und es stehen zu viel Daten drin, die ich ungeändert nicht posten sollte. Soviel zum finden der Daten (nur Code-Teile): Das ist meine Hauptfunktion: Code:
(defun c:getpofobjectandwritein () (setq obj (entsel "Wähle ein Objekt: ")) ;(siehe 1.) (if obj (progn (setq zeropkt (list 0 0)) (setq objType (cdr (assoc 0 (entget (car obj))))) (if (= objType "LWPOLYLINE") (progn (LayerAnlegen "zzz_temp_fpw") (command "_offset" "L" "A" "0.5" (car obj) zeropkt "") ;(siehe 2.) (todoliste (entlast)) ;(siehe 3.) (LayerLoeschen "zzz_temp_fpw") (print "Alle Aufgaben erledigt...") (princ "\n") ) ) ) (princ "\nKeine Auswahl getroffen.") ) (c:getpofobjectandwritein) )
Zur Erklärung: 1. ich wähle eine LWPOLYLINE (diese wäre in der externen Referenz) --> möchte ich über eine Positionsbestimmung ermitteln 2. Hier erstelle ich eine Region um die geschlossene Polyline damit ich die Punkte mit den Information auch definitiv erwische 3. Hier gehts dann zur Sache... mit der übergebenen LWPOLYLINE aus (command "_offset" ...) Soviel zum Code in "todoliste" Code:
(setq myPkt (SelectObjectsInRegion mlo 1)) ;hier hole ich mir mit der funktion ein Selectionset (Points)(if myPkt (progn (setq fwP (FGPandGP myPkt)) ) (progn (print "KGP") (setq fwP nil) ) ) (if fwP (progn (print "GfF-Berechnung...") (setq myFWHAP (SelectObjectsInRegion mlo 2)) ;;--> Siehe unten (if myFWHAP (createObjDataBlock fwP myFWHAP) (print "Kein FH gefunden...") ) ) )
Code:
(defun SelectObjectsInRegion (myregion SetNr) (if myregion (progn (setq points2d (GetPolylinePoints myregion)) (if (= SetNr 1) (setq selectionSet (ssget "_WP" points2d '((0 . "POINT") (8 . "GHZ")))) ) (if (= SetNr 2) (setq selectionSet (ssget "_CP" points2d '((0 . "LWPOLYLINE") (8 . "F_0090")))) ) ) ) selectionSet )
Die in "selectionSet" zurückgegebenen Punkte enthalten die Informationen Zu der funktion (createObjDataBlock fwP myFWHAP) --> hier werden die Punkte mit Daten durchlaufen und ein Block mit den Werten erzeugt. Der Block wird an einer Bestimten Stelle in der Zeichnung auf einen bestimmten Layer eingefügt. Der Teil funktioniert. Die geschlossenen Polylines die ich mit _offset erweitere sind auf einer externen Referenz und die Punkte mit den Daten sind auf einer externen Referenz. Das einzige was übereinstimmt sind die Koordinaten da es sich auf das Gitternetz der Erde aufbaut. in der jetzt 3. .lsp Datei versuche ich nun den Zugriff auf die externen Referenzen zu bekommen: Code:
(defun c:gnb () (setq sss (ssget "X")) (defun gnbi (allss searchtype) (setq myss (ssadd)) (if (or (= searchtype "") (not searchtype)) (setq searchtype (ucase (getstring "\nWelcher Typ soll gesucht werden?:"))) ) (if (> (sslength allss) 0) (setq allsslength (sslength allss)) (setq allsslength 0) ) (if (> allsslength 0) (progn (setq i 0) (setq mysslength 0) (repeat allsslength (if (= searchtype (cdr (assoc 0 (entget (ssname allss i))))) (progn (ssadd (ssname allss i) myss) (setq mysslength (+ 1 mysslength)) ) ) (setq i (+ 1 i)) ) ) ) (princ (strcat "\nEs wird nach " searchtype " gesucht. " "Es gibt insgesamt " (itoa allsslength) " Objekte. " "Davon sind " (itoa mysslength) " vom Typ " searchtype ".\n")) (if (> mysslength 0) (progn (setq i 0) ;(princ myss) (repeat mysslength (progn (princ (strcat "\nDaten des gefundenen Objekt Nr. " (itoa (+ 1 i)) ":\n")) (princ (strcat "\nDer Name des Objektes ist: " (cdr (assoc 2 (entget (ssname myss i)))))) (princ "\nDie interne Objekt-ID ist: ") (princ (cdr (assoc -1 (entget (ssname myss i))))) (princ "\nDie Eigenschaften sind: \n") (princ (entget (ssname myss i))) (setq i (+ 1 i)) ) ) ) ) (if (> mysslength 0) (if (member (ucase (getstring "\nSoll ein Objekt eingelesen werden ja/nein?")) '("j" "ja" "J" "JA")) (progn (setq objnr (- (getint "\nWelches Objekt (Obj-Nr.) soll ausgelesen werden:") 1)) (setq readobj (ssname myss objnr)) (if readobj (progn (princ (strcat "\nObjekt mit dem Namen '" (cdr (assoc 2 (entget readobj))) "' wurde gewählt...\n")) (command "_.-refedit" nil readobj "OK" "A" "N") ) (princ "Falsche Nummer eingegeben...") ) (gnbi newss "") ) ) ) ) (gnbi sss "INSERT") (princ "\nEnde...") (princ) )
... So versuche ich an die Daten zu kommen... Viel Code aber Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Speedy1977 Mitglied Planer Energieversorgung
Beiträge: 7 Registriert: 27.09.2024 AUTOCAD, aktuelle Version, MEP MAP klassisch, notepad++
|
erstellt am: 30. Sep. 2024 10:20 <-- editieren / zitieren --> Unities abgeben:
|
Speedy1977 Mitglied Planer Energieversorgung
Beiträge: 7 Registriert: 27.09.2024 AUTOCAD, aktuelle Version, MEP MAP klassisch, notepad++
|
erstellt am: 30. Sep. 2024 10:40 <-- editieren / zitieren --> Unities abgeben:
|
cadffm Moderator 良い精神
Beiträge: 22291 Registriert: 03.06.2002 Alles
|
erstellt am: 30. Sep. 2024 11:07 <-- editieren / zitieren --> Unities abgeben: Nur für Speedy1977
Der Code ist nicht zwingend falsch (prüfe es aber auch nicht), aber der Befehl erwartet nunmal keinen Objektname. Möchte man RefEdit nutzen, so müßte man die Referenz durch eine Pickwahl angeben, also eine Koordinate übermitteln an welcher Acad nach einem Objekt suchen soll. (Tip: Vergesse nicht die Ansciht entsprechend zu zoomen. Per Hand machst du das auch immer ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1991 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 30. Sep. 2024 11:25 <-- editieren / zitieren --> Unities abgeben: Nur für Speedy1977
|
Speedy1977 Mitglied Planer Energieversorgung
Beiträge: 7 Registriert: 27.09.2024 AUTOCAD, aktuelle Version, MEP MAP klassisch, notepad++
|
erstellt am: 30. Sep. 2024 11:42 <-- editieren / zitieren --> Unities abgeben:
Sorry für die blöde Rückfrage... "vla-copyobject" gibt es bei mir nicht... und wird in der "AutoLISP: Reference" auch nicht angezeigt muss ich da was nachinstallieren oder ist das einfach nur nicht dokumentiert? das andere Teste ich... und melde mich wieder Danke schon mal... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1991 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 30. Sep. 2024 11:56 <-- editieren / zitieren --> Unities abgeben: Nur für Speedy1977
Hier mal etwas zu der copyobjects Thema.... Code:
(defun CopyBlock (DwgName BlkName / blocks dbxDoc) (setq blocks (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)) ) ) (setq dbxDoc (vla-GetInterfaceObject (vlax-get-acad-object) "ObjectDBX.AxDbDocument" ) ) (vla-open dbxDoc DwgName) (vla-CopyObjects dbxDoc (vlax-safearray-fill (vlax-make-safearray vlax-vbObject '(0 . 0) ) (list (vla-item (vla-get-blocks dbxDoc) BlkName ) ) ) blocks ) (vlax-release-object dbxDoc) (vla-item blocks BlkName) ) (if(and(setq obj(car(entsel))) (setq datei (findfile (vla-get-path (vlax-ename->vla-object obj) ) ) ) ) (CopyBlock datei "fenster") )
------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Speedy1977 Mitglied Planer Energieversorgung
Beiträge: 7 Registriert: 27.09.2024 AUTOCAD, aktuelle Version, MEP MAP klassisch, notepad++
|
erstellt am: 30. Sep. 2024 13:30 <-- editieren / zitieren --> Unities abgeben:
So... zu vla-objectcopy: Hier habe ich ein problem mit dem "ObjectDBX.AxDbDocument" ... fehlende "acdb20.dll" oder ich arbeite gerade in der falschen Version von ACAD (AutoCAD MAP 2024) ... da habe ich noch keine richtige Antwort gefunden... Bei Code:
(vla-GetInterfaceObject (vlax-get-acad-object) "ObjectDBX.AxDbDocument")
kommt immer einen Automatisierungsfehler... ABER... cadffm , du hattest die Lösung! vielen, vielen Dank... Meine Hochachtung Der 3D-Point bringt die Lösung
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |