| |
| 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: Xdata GC 1011 und VLA-setXdata (1408 mal gelesen)
|
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 22. Mai. 2012 10:29 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe Lispler, Ich hätte da eine frage bezüglich Xdata's und deren "besonderen" GC 1011,1012,1013 usw. Diese werden ja nicht als dottedPairs gespeichert sondern als Listen. Folgendes ist zB. vorhanden [Var = XData]:
Code:
((1001 . "hallo") (1000 . "ich bin Xdata") (1002 . "{") (1070 . 1) (1070 . 2) (1070 . 3) (1070 . 4) (1000 . "mit einem String") (1011 2.0 3.5 4.3) (1000 . "und noch einen") (1002 . "}"))
und soll mittels folgenden Code an ein Objekt geheftet werden:
Code:
(foreach DataItem (reverse XData) (setq Data (cons (cdr DataItem) Data)) (setq DataType (cons (car DataItem) DataType)) ) (vlax-invoke-method obj 'SetXdata (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbInteger (cons 0 (- (length DataType) 1)) ) (cons (car DataType) (cdr DataType)) ) ) (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbVariant (cons 0 (- (length data) 1)) ) (cons (car data) (cdr data)) ) ) )
Conclusio: funktioniert nicht -> "vlax-safearray-fill failed. Invalid initialization list. #<safearray...> Wo liegt denn der Fehler? Also, auftreten tut er nur wegen GC 1011 und dessen "UN-dotted"-Charakter, ansonsten funktioniert das so tadellos. Hoffend auf eure Hilfe lg reltro [Diese Nachricht wurde von reltro am 22. Mai. 2012 editiert.] [Diese Nachricht wurde von reltro am 22. Mai. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13529 Registriert: 30.11.2003 .
|
erstellt am: 22. Mai. 2012 10:49 <-- editieren / zitieren --> Unities abgeben: Nur für reltro
|
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 22. Mai. 2012 10:56 <-- editieren / zitieren --> Unities abgeben:
Hallo Cadmium, ähm, verstehe ich nicht. (1001 . "hallo") wäre in diesem Fall ja der ApplicationName. ob da 1000 oder 1001 als GC steht; beides sollte ein String sein. Dürfte also kein Unterschied machen, außer dass es ohne 1001 kein ApplicationName gibt und so die Xdata's was auch immer sind (???) geht das überhaupt? ohne AppName? lg reltro Ps.: wie sieht denn deine Funtkion aus?
[Diese Nachricht wurde von reltro am 22. Mai. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13529 Registriert: 30.11.2003 .
|
erstellt am: 22. Mai. 2012 11:04 <-- editieren / zitieren --> Unities abgeben: Nur für reltro
ach so ..der appli-Name .. den übergeb ich extra .... haste vielleicht (regapp "hallo")vergessen ? Die Funktionen sind Bestandteil einer Bibo, die außeinanderzuklamüsern würde hier zu weit führen, ..die Bibo zu posten aber auch.
Aber ein GC-Lisp daraus kann ich dir zur Verfügung stellen: (defun DT:XDATA-PUT-GC (OBJ NEWXDATA / XDATA DATA) (if(and(=(type OBJ)'ENAME) (=(type NEWXDATA)'LIST) (=(type(car NEWXDATA))'STR) (vl-every '(lambda(X) (and (listp X) (=(type(car X))'INT) (<= 1000 (car X)) ) ) (cdr NEWXDATA) ) ) (progn (setq XDATA (assoc -3 (entget OBJ '("*")))) (regapp (car NEWXDATA)) (if(setq DATA(assoc (car NEWXDATA) (cdr XDATA))) (setq XDATA(subst NEWXDATA DATA (cdr XDATA) ) ) (setq XDATA(cons -3 (append (cdr XDATA) (list NEWXDATA) ) ) ) ) (entmod(append (entget OBJ) (list XDATA))) ) ) ) Aufruf dann (DT:XDATA-PUT (car(entsel)) '("hallo" (1000 . "ich bin Xdata") (1002 . "{") (1070 . 1) (1070 . 2) (1070 . 3) (1070 . 4) (1000 . "mit einem String") (1011 2.0 3.5 4.3) (1000 . "und noch einen") (1002 . "}"))) ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 22. Mai. 2012 11:08 <-- editieren / zitieren --> Unities abgeben:
Aso aso, hab ich mir eigentlich schon gedacht... mja, auch bei mir, teil einer bib... Wie ich sehe machst du das ganze mit "(entmod)" Wollte das ganze mit VLA-setXdata machen. Warum? Weil ich mir nicht zur Gänze sicher bin ob das in Reaktoren funktioniert, mit "(entmod)" funktioniert es denn? bzw. kannst du mir vielleicht eine Hilfe geben mit VLA (wenn es mit entmod in rekatoren nicht funktioniert) und zwecks (regapp "hallo") -> hab mal gelesen das ganze sollte eh automatisch passieren wenn die App noch nicht registriert ist? lg reltro [Diese Nachricht wurde von reltro am 22. Mai. 2012 editiert.] 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: 22. Mai. 2012 11:09 <-- editieren / zitieren --> Unities abgeben: Nur für reltro
Hallo Reltro, auch ich habe mich probiert, ohne Erfolg. Meine Alternative dazu ist glaube ich daß gleiche in Grün, was CADmium eben schon aus seiner Bibo gepostet hat: Code:
(defun c:test (/ APPNAME OBJ XDATA) (setq obj(car (entsel)) AppName "hallo" XData '((1000 . "ich bin Xdata") (1002 . "{") (1070 . 1) (1070 . 2) (1070 . 3) (1070 . 4) (1000 . "mit einem String") (1011 2.0 3.5 4.3) (1000 . "und noch einen") (1002 . "}"))) (entmod (append (entget obj) (list (list -3 (cons AppName XData))))))
------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13529 Registriert: 30.11.2003 .
|
erstellt am: 22. Mai. 2012 11:12 <-- editieren / zitieren --> Unities abgeben: Nur für reltro
|
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 22. Mai. 2012 11:14 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn, danke für deine anteilnahme... Das Problem liegt nicht beim AppName oder sonstigen GC. Der fehler tritt nur auf wenn es sich wie bei GC 1011 um eine Liste handelt, und nicht wie bei anderen um dotted-pairs. Wenn ein solcher GC vermieden wird, funktioniert das so einwandfrei lg reltro Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 22. Mai. 2012 11:19 <-- editieren / zitieren --> Unities abgeben:
|
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 22. Mai. 2012 17:02 <-- editieren / zitieren --> Unities abgeben: Nur für reltro
hallo reltro, dein denkfehler liegt an der subliste. diese muss du natuerlich auch umwandeln. fuer eine koord-liste, wie in deinem beispiel, hier eine moeglichkeit der umsetzung: Code: (foreach DataItem (reverse XData) (setq Data (cons (cdr DataItem) Data)) (setq DataType (cons (car DataItem) DataType)) )(setq sa (vlax-make-safearray vlax-vbVariant (cons 0 (- (length data) 1))) i -1) (repeat (length data) (setq i (1+ i)) (if (= (type (nth i data)) 'LIST) (vlax-safearray-put-element sa i (vlax-3d-point (nth i data))) (vlax-safearray-put-element sa i (nth i data)) ) ) (vlax-invoke-method obj 'SetXdata (vlax-safearray-fill (vlax-make-safearray vlax-vbInteger (cons 0 (- (length DataType) 1))) DataType ) sa )
entmod, entdel ... funktionieren ueblicherweise in reaktoren (mir selber ist nichts gegenteiliges bekannt).
gruss marco ------------------ Marco Heuer www.arc-aachen.de Airport Office Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 22. Mai. 2012 18:02 <-- editieren / zitieren --> Unities abgeben:
|