| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: mehrfachen GC unter XDATA herausfischen (1203 mal gelesen)
|
SebZ Mitglied Bauingenieur Tiefbau
Beiträge: 189 Registriert: 17.10.2004 AutoCAD 2010 Civil 3D DACH WinXP Professional 2002 SP3 MS Office 2007 Intel Core2Duo 2.80 GHz, 3.00 GB RAM
|
erstellt am: 30. Jan. 2009 18:43 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum, Um unter der Vielzahl der mit einer von mir verwendeten externen Applikation erzeugten Elemente deren jeweilige Kategorie zu bestimmen, wird in den XDATA dieser App ein fünfstelliger Eintrag unter GC 1071 verwendet. Es gibt aber pro Element mehrere Einträge mit dem GC 1071. Relevant ist in meinem Fall der zuerst auftretende fünfstellige Wert. Leider ist dieser in der Regel nicht der erste GC 1071 überhaupt, und vor allem habe ich noch keine Regel herausgefunden, wie viele 1071-GCs vor dem gesuchten stehen können (die Anzahl ist also variabel). Hier ein Beispiel für die Elementdaten: Code: (-1 . <Objektname: 40262cf8>) (0 . "INSERT") (330 . <Objektname: 400f9cf8>) (5 . "507D7") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "TESTLAYER") (100 . "AcDbBlockReference") ; das Element kann auch eine Polylinie, ; ein Text oder alles mögliche sein... (2 . "SYM_BLOCK-123") (10 4.40082e+006 5.78344e+006 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.243783) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0) "TESTAPP" (1071 . 1) (1071 . 101) (1071 . 511) ;>> bis hierhin ist die Anzahl der 1071-GCs mit ;kleiner als fünfstelligen Einträgen variabel (1071 . 11100) ;**** dieser Wert ist der gesuchte, weil es der erste ;**** fünfstellige ist! (1071 . 1) (1071 . 0) (1071 . 11110) ;die nachfolgenden fünfstelligen Werte beziehen sich ;auf abhängige Elemente und werden nicht gesucht. (1005 . "35FAF") (1071 . 11113) (1005 . "507C3") (1071 . 11111) (1005 . "507C4") (1071 . 1001) (1005 . "507E1") (1071 . 1002) (1005 . "509B9")
Mit folgendem Codeschnipsel finde ich leider immer nur den ersten Eintrag unter GC 1071 und sonst nix. Mein Ziel ist, am Ende einen Auswahlsatz zu erzeugen, der alle diejenigen Elemente der gesamten Zeichnung umfasst, die einen vorgegebenen Wert (= definierte Elementkategorie) besitzen, und zwar unter der Bedingung, dass der gesuchte Wert zuerst in der Folge aller fünfstelligen Werte auftritt. Allgemein gesprochen, könnte die Bedingung natürlich auch anders lauten. Gibt es eine Möglichkeit, die Abfrage zu erweitern, dass ich genau den gesuchten Wert herausfinde?
Code: (cdr (assoc 1071 (cdr (cadr (assoc -3 (entget (setq te (car (entsel))) '("TESTAPP")) ) ) ) ) )
Der Rückgabewert in diesem Fall wäre 1. Hat jemand einen Tip? Vielen Dank und allen ein schönes Wochenende.
------------------ Gruß SebZ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
andi2050 Mitglied
Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 30. Jan. 2009 20:59 <-- editieren / zitieren --> Unities abgeben: Nur für SebZ
|
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 30. Jan. 2009 21:11 <-- editieren / zitieren --> Unities abgeben: Nur für SebZ
hi, mal ne idee auf die schnelle (mapcar '(lambda (x) (if (eq (car x) 1071);sternchen (list (cdr x)) ))elist);dein entityliste (nicht getestet) --> ergibt ne subliste die du auswerten kannst oder setzt beim sternchen ein und testest den Wert direkt mit type auf integer... oder/und mit strlen auf fünstelligen String oder ne mischung aus substr+type oder na da wird dir schon was einfallen mfg heiko Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SebZ Mitglied Bauingenieur Tiefbau
Beiträge: 189 Registriert: 17.10.2004 AutoCAD 2010 Civil 3D DACH WinXP Professional 2002 SP3 MS Office 2007 Intel Core2Duo 2.80 GHz, 3.00 GB RAM
|
erstellt am: 03. Feb. 2009 11:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Andi und Heiko, euch beiden vielen Dank, genau das wars! Beide Lösungen sind ja vom Grundgedanken her fast gleich. In diesem Fall habe ich allerdings der Lösung von Heiko den Vorzug gegeben, weil ich dann ohne VL auskomme, aber das ist davon losgelöst. Bei mir sieht die Funktion jetzt so aus: Code: (defun C:EKAT ( / ElemtData) (setq ElemtData (entget (car (entsel)) '("TESTAPP"))) (get-kategorie ElemtData) )(defun get-kategorie (EData / flag Kategorie) (mapcar '(lambda (x) (if (eq (car x) 1071) ; Test auf GC ; nur das erste Auftreten >= 10000 auswählen: (if (and (>= (cdr x) 10000) (not flag)) (setq flag 1 Kategorie (cdr x)) ) ; end if 10000 ) ; end if 1071 ) ; end lambda (cdadr (assoc -3 Edata )) ;XDATA der Applikation ) ; end mapcar (eval Kategorie) ; Rückgabewert bereitstellen ) ; end defun get-kategorie
Wenn das ausgewählte Element XData von TESTAPP besitzt und ein passender Wert in den XData tatsächlich gefunden wird, wird der gesuchte Wert zurückgegeben, ansonsten NIL.
------------------ Gruß SebZ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
andi2050 Mitglied
Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 03. Feb. 2009 18:06 <-- editieren / zitieren --> Unities abgeben: Nur für SebZ
Schön, daß es funktionert und Du Dein Ergebnis postest ! Ich möchte mich nur ein bissl wichtig machen... Das geschachtelte if-Konstrukt im lambda-Ausdruck kann man sich sparen. Ein einfacher and-Ausdruck reicht (ohne if). 'and' bricht nämlich seine Evaluierung ab, sobald ein ein Argument 'nil ergibt. Die darauf folgenden Argumente werden dann nicht mehr Evaluiert ! Das (setq kategorie) wird nur ausgeführt, wenn die vorherigen Argumente <> nil. Code: '(lambda (x) (and (not kategorie) (eq (car x) 1071) (>= (cdr x) 10000) (setq kategorie (cdr x)) ) )
Außerdem kann man das (eval kategorie) einfach durch kateegorie (ohne Klammern) schreiben. Grüße Andi
[Diese Nachricht wurde von andi2050 am 03. Feb. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SebZ Mitglied Bauingenieur Tiefbau
Beiträge: 189 Registriert: 17.10.2004 AutoCAD 2010 Civil 3D DACH WinXP Professional 2002 SP3 MS Office 2007 Intel Core2Duo 2.80 GHz, 3.00 GB RAM
|
erstellt am: 03. Feb. 2009 19:45 <-- editieren / zitieren --> Unities abgeben:
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1766 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 03. Feb. 2009 21:35 <-- editieren / zitieren --> Unities abgeben: Nur für SebZ
Hallo, auch wenn vl-Geschichten hier nicht gefragt sind, ich würde ein vl-sort mit reinbringen: Code:
(defun get-kategorie (EData /) (cdr (car (vl-sort (vl-remove-if-not '(lambda (A) (and (= (car A) 1071) (>= (cdr A) 10000))) EData) '(lambda (e1 e2) (< (cdr e1) (cdr e2))) ) ) ) )
PS: sitze hier gerade im Hotel und vertreib mir die Zeit, die Frage war ja eh schon beantwortet ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SebZ Mitglied Bauingenieur Tiefbau
Beiträge: 189 Registriert: 17.10.2004 AutoCAD 2010 Civil 3D DACH WinXP Professional 2002 SP3 MS Office 2007 Intel Core2Duo 2.80 GHz, 3.00 GB RAM
|
erstellt am: 11. Feb. 2009 16:15 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn, ich hatte mich jetzt zwar ein paar Tage nicht weiter drum gekümmert, aber auch wenn ich deine Lösung bisher nicht ausprobiert habe, dennoch vielen Dank dafür! Eigentlich habe ich gar nichts prinzipielles gegen vl-funktionen, muss mich halt nur damit befassen. So long ------------------ Gruß SebZ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1766 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 11. Feb. 2009 16:21 <-- editieren / zitieren --> Unities abgeben: Nur für SebZ
|