| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: Objekt daten übertragen (2927 mal gelesen)
|
Jourjik Mitglied T. Zeichner
Beiträge: 75 Registriert: 17.08.2006
|
erstellt am: 29. Sep. 2008 11:41 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 29. Sep. 2008 12:51 <-- editieren / zitieren -->
hi, bitte ein wenig mehr info. z.b. hintergrund der aufgabe, welches ziel? 'objektdaten uebertragen' wohin? nach welchen regeln? die fragestellung alleine gibt mir keinen regelansatz dafuer, welcher objektdatensatz von welcher geometrie auf welche andere geometrie zu uebertragen waere? - alfred - |
Jourjik Mitglied T. Zeichner
Beiträge: 75 Registriert: 17.08.2006
|
erstellt am: 29. Sep. 2008 13:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, Danke für die Antwort es geht mir darum, die Attribute eines selektierten Objekts auf ein manuell per Mausklick gewähltes Objekt zu übertragen, z.B. von Punktobjekt zu Punktobjekt oder Plinie zu Plinie. Also kein automatisches Übertragen nach Regeln. Mfg Jourjik Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Sep. 2008 13:53 <-- editieren / zitieren -->
hi, hast du an einem objekt nur einen datensatz und nur daten aus einer objektdatentabelle oder verfuegt das erst-gezeigte element ueber mehr als eine objektdatensatz-/objekttabellen-information. auch um vorweg auszuschliessen: die objektdaten sind nicht aus einer topologiebildung entstanden/abgeleitet? - alfred - |
Jourjik Mitglied T. Zeichner
Beiträge: 75 Registriert: 17.08.2006
|
erstellt am: 29. Sep. 2008 14:23 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 29. Sep. 2008 14:36 <-- editieren / zitieren -->
hi, kleine bitte: a) mit musterzeichnung waere mir geholfen b) angabe von map-version (sonst baue ich in die falsche richtung) c) ein klein wenig geduld, bin grad eingedeckt - alfred - |
Jourjik Mitglied T. Zeichner
Beiträge: 75 Registriert: 17.08.2006
|
erstellt am: 29. Sep. 2008 15:01 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, a) eine musterzeichnung habe ich beifgefügt, einfach die schwarze polylinien haben attributtabelle und die rote Polylinien sollen mit mausklick auch attributwerte bekommen b) wie oben beschrieben wir arbeiten mit ACADMAP 3D Version 2009 ) c) ich bin für jede Hielfe Dankbar und wolte ich kein stress machen MfG Jourjik Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Sep. 2008 16:02 <-- editieren / zitieren -->
hi, nur um sicherzugehen (und unnoetige arbeit zu vermeiden), in den objektdaten (sind mal topologie gewesen, erkenntlich an LPOLY_, ...) stehen felddefinitionen drin wie: FeatID LENGTH wenn ich objektdaten von einem objekt auf das andere kopiere, dann gibt es weder eine eindeutige id noch wird die laenge des zielelements stimmen. egal oder doch nachtraegliche zusatzwuensche? - alfred - |
Jourjik Mitglied T. Zeichner
Beiträge: 75 Registriert: 17.08.2006
|
erstellt am: 29. Sep. 2008 16:16 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, es ist egal ob polylinien länge übertragen wird oder nicht, weil das eine Beispiel war es kann auch Polygone oder Punkte sein wichtig sind andere Werte zB. Hoehen oder Dicke... Danke Jourjik Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Sep. 2008 17:52 <-- editieren / zitieren -->
hi, anbei dvb-file, zur anwendung: zeichnung laden dvb-file von windoes-explorer in den graphikbereich von autocad 'hineinziehen' (drag&drop) dann befehl '_vbarun', im dialog '...MapOdCopy' anklicken, dann auf ausfuehren. rest sollte erklaerend sein. VORSICHT: der code ist NICHT ausreichend GETESTET, d.h. kein arbeiten ohne vorher zu sichern und gerade am anfang bitte auch die ergebnisse pruefen!!!! keine gewaehr!! aber wenn dir fehler auffallen, dann jederzeit gerne eine message mit beschreibung. - alfred - |
Jourjik Mitglied T. Zeichner
Beiträge: 75 Registriert: 17.08.2006
|
erstellt am: 30. Sep. 2008 08:56 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, Viellen dank für die schnelle Antwort, es funktioniert alles wie ich wollte noch eine frage, geht es das die codes die vorhandenen objektdaten überschreiben? oder müssen die zielelemente immer keine daten haben. Danke Jourjik Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 30. Sep. 2008 19:56 <-- editieren / zitieren -->
hi jourjik, freut mich, dass es funktioniert. dass objektdaten ueberschrieben werden koennen, geht schon, war nur nicht so definiert. bitte um verstaendnis, dass fuer ein individuell geschriebenes makro ich nicht alle eventualitaeten hineinprogrammiert sind, sondern auf den verfuegbaren definitionen/musterdaten basierend arbeite. lass mich wissen, bevor ich aendere, ob du noch andere wuensche dazu hast. - alfred - |
Jourjik Mitglied T. Zeichner
Beiträge: 75 Registriert: 17.08.2006
|
erstellt am: 01. Okt. 2008 10:31 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, vielen Dank soweit für alles! Sorry, dass ich Dich ein wenig zu spät über weitere Wünsche informiert habe. Schön wäre es, a) wenn man die Objektdaten überschreiben könnte b) wenn man mehrere Ziel-Elemente manuell auswählen könnte Danke, Jourjik Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Moderator CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2022 (deu/eng) AEC-Collection 2022 (Revit und Zeugs) Wenn sich's nicht vermeiden lässt: D-A-CH Erweiterung (mies' implementierter Schrott)
|
erstellt am: 01. Okt. 2008 11:19 <-- editieren / zitieren --> Unities abgeben: Nur für Jourjik
Zitat: Original erstellt von Jourjik: Hallo an alle Spezialisten, Wie kann ich in ACADMAP 3D 2009 Objektdaten-Inhalte zu anderen Objekten übertragen ? Kennt jemand ein entsprechendes LISP-Skript?
Hallo Jourjik, ich habe zu Map 2007er Zeiten recht viel in der Richtung Objektdatenmanipulation mittels Lisp gemacht. Dabei bin ich natürlich auch auf die hervorragende Lisp Api von Map gestoßen. Generelle Sachen gehen damit schon recht gut... Aber wie immer steckt der Teufel im Detail. Darum habe ich mir also eine ganze Bibliothek rund um die Lisp-Grundfunktionen von Map gebastelt die das ganze ein wenig mehr in Richtung Fire-and-Forget Funktionen bringen. Bei der Analyse dessen, was beim Übertragen von Objektdaten notwendig ist stellt man dann auch relativ schnell fest, was alles so mit den Objektdaten geht. Nachfolgend mal ein Auszug aus meiner Bibliothek. Die hier abgebildete Funktion ist so nicht lauffähig. Interessant sind einzig und allein die Kommentare. HIer ist nämlich ziemlich genau abgebildet, was bei einer Funktion zum Übertragen von Objektdaten alles berücksichtit werden muss: (Kommentar ist immer das was mit 'nem Semikolon anfängt, bzw in die Tags ;| und |; eingeschlossen ist. Am besten Code in den VLisp Editor kopieren, der färbt den Kommentar dann grau.)
Code:
;| Zentrale Funktion zum Anhängen / Ändern von Objektdaten !! Funktion setzt die Objektdaten für ein Objekt gemäß der als Liste übergebenen Daten. Die Datenliste wird auf Gültigkeit der Datentypen bzw. Tabellendefinitionen überprüft und ggf. um ungültige Werte erleichtert -> "DT:MAP-OD-SUB-PURGEDATA". Es werden folgende Operationen vorgenommen: # Daten anhängen, wenn NICHT bereits angehängt. # Records gemäß der übergebenen Liste manipulieren, wenn Daten bereits angehängt. DAS aber in aller Konsequenz, enthält ein Objekt z.B. 10 Records die Liste aber nur 2 Records, werden die letzten acht Records gelöscht!!! Umgekehrt natürlich genauso. Gibt es 2 Records und die Liste enthält aber 10, werden daraus 10 Records. Die REIHENFOLGE der Listeneinträge für die Records ist die gleiche wie die der Records -> nth 0 ist auch RECNUM 0. Dadurch läßt sich z.B. die Reihenfolge der Records relativ einfach umkehren. Daten auslesen, Recordlist umkehren und mit dieser Funktion updaten.# Was für die RECORDS gilt, gilt NICHT für die Tabellen. Enthält die übergebene Liste eine bestimmte Tabelle NICHT die aber mit dem Objekt verbunden ist, wird diese Tabellenbindung NICHT berührt, d.h. sie bleibt in jedem Fall bestehen. Zum LÖSCHEN von Tabellenbindungen gibt es eine extra Funktion. Argumente: ENAME = Lisp-Objectname LSTDATA = Liste mit den anzuhängenden Daten Das Listenformat orientiert sich an dem der von Funktion "DT:MAP-OD-READ2" zurückgegebenem jedoch ohne die SubListe '(INT-RECNUM . REAL-RECID) Die RecordNumber geht aus der Position der Sublisten hervor (nth 0 lst)... DELETESURPLUSTABLES = 'T wenn Tabellenbeziehungen die FÜR EIN OBJEKT BESTEHEN in der LISTE ABER NICHT VORKOMMEN ! GELÖSCHT ! werden sollen. nil wenn überzählige ignoriert werden sollen. DELETESURPLUSFIELDS = 'T wenn überzählige Records gelöscht werden sollen nil wenn überzählige Records ignoriert werden sollen Beispielanwendung: Klonen von Objektdaten (DT:MAP-OD-UPDATE-RECORDS (car (entsel "\nZielobjekt für OData wählen: ")) (DT:MAP-OD-SUB-LISTCONVERT (DT:MAP-OD-READ2 (car (entsel "\nQuell-Objekt MIT OData wählen: "))) ) 'T ;_ Lösche überzählige Tabellen 'T ;_ Lösche überzählige Records )
Aktualisieren des ersten Records einer Tabelle, andere Tabellen ignorieren: (DT:MAP-OD-UPDATE-RECORDS (car (entsel "\nZielobjekt für OData wählen: ")) '(("ASSETNETZKLASSE" ((("BITCODENETZKLASSE" . 10))))) nil ;_ ignoriere andere Tabellen 'T ;_ lösche überzählige Records ) Oder auch zum Anhängen / Updaten des 0-ten Records: (DT:MAP-OD-UPDATE-RECORDS (car (entsel "\nZielobjekt für OData wählen: ")) (DT:MAP-OD-SUB-CONTRUCT-ODLIST "ASSETNETZKLASSE" "BITCODENETZKLASSE" 100) nil nil ) |; (defun DT:MAP-OD-UPDATE-RECORDS (ENAME LSTDATA DELETESURPLUSTABLES DELETESURPLUSFIELDS / FIELDVALUES OBJDATA RECDIFFERENCE RECNUM SUBOBJDATA TABLENAME TMP ) ;; Erstmal die Datenliste auf Richtigkeit prüfen. ;; Wenn da nix bei raus kommt, muß gar nix mehr gemacht werden. (if (setq LSTDATA (DT:MAP-OD-SUB-PURGEDATA LSTDATA)) ;; Test und evtl. auslesen vorhandener Daten des zu manipulieren Objekts= ;; Enthält das zu manipulierende Objekt bereits OData? (if (setq OBJDATA (DT:MAP-OD-READ2 ENAME)) ;; Ja? Dann... (progn ;; Handling für das eventuelle Löschen von überschüssigen Tabellen ;; abhängig von zweierlei: ;; 1. Ist das Flag überhaupt gesetzt? ;; 2. enthält das Objekt überhaupt solche Tabellen? (if DELETESURPLUSTABLES (progn ;; Liste der Tabellennamen die zu setzen sind (setq TMP (mapcar '(lambda (X) (strcase (car X))) LSTDATA)) ;; Liste der Tabellennamen, die übschüssig sind (if (setq TMP (vl-remove-if '(lambda (X) (member X TMP)) (mapcar '(lambda (Y) (strcase (car Y))) OBJDATA) ) ) (progn ;; Löse die Records und damit die Tabelle von dem Objekt (foreach ELEM TMP (DT:MAP-OD-DETACHALLRECORDS-FOR ENAME ELEM) ) ;; ...und lies dann die Daten noch einmal neu ein (setq OBJDATA (DT:MAP-OD-READ2 ENAME)) ) ) ) ) ;; Für jede Tabelle der Argumentliste... (foreach TABLE LSTDATA (setq TABLENAME (car TABLE)) ;; Enthält das zu manipulierende Objekt OData dieser Tabelle? (if (setq SUBOBJDATA (MS-ASSOC TABLENAME OBJDATA)) (progn ;; Nur die RECID extrahieren (setq SUBOBJDATA (mapcar 'cdar (cadr SUBOBJDATA)) RECDIFFERENCE (- (length (cadr TABLE)) (length SUBOBJDATA)) ) (cond ;; ((zerop RECDIFFERENCE) 'NIX) ;; Negativ = mehr Records vorhanden als gesetzt werden sollen ((< RECDIFFERENCE 0) ;; Wenn Deleteflag gesetzt, dann löschen überzähliger Records (if DELETESURPLUSFIELDS (progn (setq RECDIFFERENCE (abs RECDIFFERENCE)) (repeat RECDIFFERENCE ;; Löschen der überzähligen Records von hinten nach vorn (ade_oddelrecord ENAME TABLENAME RECDIFFERENCE) (setq RECDIFFERENCE (1- RECDIFFERENCE)) ) ) ) ) ;; Positiv = Es müssen noch Records erzeugt werden ((> RECDIFFERENCE 0) (setq TMP NIL) (repeat RECDIFFERENCE ;; Erstellt wird 'ne TempListe der neuen RecID's (setq TMP (cons (DT:MAP-OD-SUB-NEWSINGLERECORD ENAME TABLENAME) TMP ) ) ) (setq SUBOBJDATA (append SUBOBJDATA (reverse TMP))) ) ('t NIL) ;_ Mach nix ) ;; Jetzt ist die Anzahl der Records auf jeden Fall >= der Anzahl ;; der zu setzenden Werte (setq FIELDVALUES (cadr TABLE) RECNUM 0 ) (foreach RECORD FIELDVALUES (foreach FIELD RECORD (ade_odsetfield ENAME TABLENAME (car FIELD) RECNUM (cdr FIELD) ) ) (setq RECNUM (1+ RECNUM)) ) ) ;; Keine Daten für Tabelle vorhanden, also frei weg dranlatschen! (DT:MAP-OD-SUB-NEWRECORDS ENAME (list TABLE)) ) ) ) ;; Hängen keine Daten dran, also los alles ranklatschen (DT:MAP-OD-SUB-NEWRECORDS ENAME LSTDATA) ) ) )
...------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 01. Okt. 2008 11:52 <-- editieren / zitieren -->
hi jourjik, anbei modifizierte version. - alfred - |
Jourjik Mitglied T. Zeichner
Beiträge: 75 Registriert: 17.08.2006
|
erstellt am: 01. Okt. 2008 12:40 <-- editieren / zitieren --> Unities abgeben:
|
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2799 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 13. Feb. 2010 18:07 <-- editieren / zitieren --> Unities abgeben: Nur für Jourjik
ACHTUNG! Sie antworten auf einen Beitrag der älter als 1 Jahr ist! Hallo Alfred, das Modul ist Klasse und hat mir viel Arbeit und Nachforschungen erspart, nachdem ich mit Zugriff auf Objektdatentabellen über VBA noch nicht beschäftigen mußte. Aufgabe war: Höhenwerte aus einem Shape dem Polygonen und Linien zuzuweisen, damit diese als Bruchkanten/Höhenlinien im Civil2008-DGM verwendet werden können. 10u4u Viele Grüße, Klaus PS.: Habe mich ja im letztem Jahr hier rar gemacht, da sie mich in die ESRI-Welt abgezogen hatten, aber vielleicht geht's jetzt doch wieder mit Acad weiter ...
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 13. Feb. 2010 18:23 <-- editieren / zitieren -->
Hi Klaus, na Du bist hier aber schon abgegangen, hoffe es geht jetzt in ursprünglich vertrauter Art und Weise wieder weiter mit Deinen tollen Beiträgen! >> Höhenwerte aus einem Shape dem Polygonen und Linien zuzuweisen Nur kleiner Hinweis: mit Civil 3D 2010 + SAP (Subscription-Advantage-Pack) gibt's eine Funktion, die aus Shapes mit attributivem Höhenwert ein DGM bauen kann (ich hab schon Civil3D2008 gelesen, aber ev. hilft es nachfolgenden Lesern). Willkommen zurück! - alfred - ------------------ www.hollaus.at |