GEGEMATIC Posté(e) le 15 janvier 2014 Posté(e) le 15 janvier 2014 Salut à tous, Je stocke dans un xrecord un pointeur vers une entité.je sais facilement récupérer ce pointeur en tant que ename en utilisant le lisp,dans ce cas je récupère une liste style ((330 . <Nom d'entité: 7ffff6248b0>)) mais j'essaye de le récupérer directement avec les methode activex,dans ce cas je cherche un objectId soit oF mon objetXrecord : (vla-GetXRecordData oF 'mytype 'myval)Commande: !mytype#<safearray...>Commande: (VLAX-SAFEARRAY->LIST mytype)(330) Commande: (setq val (VLAX-SAFEARRAY->LIST myval))(#<variant 8195 ...>) Commande: (setq val (car val))#<variant 8195 ...> Commande: (setq val (vlax-variant-value val))#<safearray...> Commande: (setq val (VLAX-SAFEARRAY->LIST val))(-10336080 -45944163) Voilà avec quoi je me retrouve, au lieu du 8796082686128 attendu j'ai bien essayé de changer le safearray de type, mais rien à faire des idées ? Gérald ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
Patrick_35 Posté(e) le 16 janvier 2014 Posté(e) le 16 janvier 2014 Salut J'avoue ne pas comprendre tes explications.Tu as un exemple concret à mettre à disposition avec la méthode que tu emploies. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
GEGEMATIC Posté(e) le 16 janvier 2014 Auteur Posté(e) le 16 janvier 2014 Salut Patrick,Si tu as la DLL de Gile, DictionaryEditor_17.dllle mieux est de lancer la commande edict,entité,choisir une entitéajouter dictionnaire d'extension,sur ce dictionaire, ajouter Xrecordnom : NA_FILSAjouter une donnée de type "pointeur logiciel" à ce Xrecordsélectionner une entitéà partir de la, tu a un Xrecord qui contient un objectid (entier)Tu peux vérifier que c'est bon en copient la valeur et en l'utilisant avec(vlax-invoke-method pw-acaddocument 'OBJECTIDTOOBJECT objet) Maintenant pour le récupérer en lisp, je fais cette séquence :(setq oExtDicPere (vla-GetExtensionDictionary (vlax-ename->vla-object (car (entsel)))))Choix de l'objet: #<VLA-OBJECT IAcadDictionary 000000003d4a2a18> Commande: (setq oXrcfils (vla-item oExtDicpere "NA_FILS"))#<VLA-OBJECT IAcadXRecord 000000003d4a58c8> Commande: (vla-GetXRecordData oXrcfils 'mytype 'myval)nil Commande: (setq val (VLAX-SAFEARRAY->LIST myval))(#<variant 8195 ...>) Commande: (setq val (car val))#<variant 8195 ...> Commande: (setq val (vlax-variant-value val))#<safearray...> Commande: (VLAX-SAFEARRAY->LIST val)(-10306784 -45396745) je ne sais pas pourquoi j'obtiens cette liste de 2 entiers négatifs au lieu d'un entier positif ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
Patrick_35 Posté(e) le 16 janvier 2014 Posté(e) le 16 janvier 2014 Je viens de tester en suivant ton exemple et j'obtiens bien les valeurs attendues (2128396944 2135070123).Tu ne serais pas en 64 bits et le prog serait en 32 par hasard ? ps : testé avec un A2014 en 32 bits @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
GEGEMATIC Posté(e) le 16 janvier 2014 Auteur Posté(e) le 16 janvier 2014 Tu ne serais pas en 64 bits et le prog serait en 32 par hasard ?ps : testé avec un A2014 en 32 bits@+je suis en 64 avec un A2012 en 64en fait je pense qu'utilisant COM, je retombe sur les écueils de VBA avec A64je trouvais le flot plus limpide en restant purement activeX, et ça m'évitait de faire destratuctions ename->objet->ename,mais etmps pis, je vais repasser en dxf !Gégé ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
GEGEMATIC Posté(e) le 16 janvier 2014 Auteur Posté(e) le 16 janvier 2014 je pense qu'il est possible de retrouver le bon pointeur à partir de cette paireJ'ai vu des sujets là dessus, il y a des mécanisme de conversion d'un long long (nombre > 2E32) en 2 long (< 2e32) par contre je ne suis pas arrivé à comprendre la méthode exacte. ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
Patrick_35 Posté(e) le 17 janvier 2014 Posté(e) le 17 janvier 2014 Salut Je pense que ce sujet sur l'objectid devrait t'intéresser. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
GEGEMATIC Posté(e) le 17 janvier 2014 Auteur Posté(e) le 17 janvier 2014 Salut,J'ai fait un peu le tours de ces sujets hier, je n'avais pas trouvé celui làça confirme le problèmemais je continue de penser que les 2 integer négatifs retournés par COM doivent permettre de recréer l'integer de base ...merciGérald ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
Patrick_35 Posté(e) le 17 janvier 2014 Posté(e) le 17 janvier 2014 Je pense qu'il faut demander à l'auteur (gile) et mettre à jour son prog avec les ObjectId en 64 bits afin d'avoir la bonne valeur.Ce n'est pas une grosse modif à faire mais comme c'est en .net @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 17 janvier 2014 Posté(e) le 17 janvier 2014 Salut, mais je continue de penser que les 2 integer négatifs retournés par COM doivent permettre de recréer l'integer de base ...Il est fort probable que la liste de deux entiers retournée sot généré par un algorithme reversible qui permet de convertir un entier 64 bits en deux entier 32 bits et inversement, mais cet algorithme ne sera pas utilisable en LISP puisque seuls les entiers codés sur 32 bits sont utilisables en LISP. Autrement dit, même si tu trouve l'algo pour convertir deux entier 32 bits en un entier 64 bits, en LISP tu pourrras au mieux par le calcul obtenir un double (réel) de la valeur de l'entier mais qui sera inutilisable avec vla-ObjectIdToObject. Pour ma part, j'ai toujours trouvé qu'il était plus pratique d'utiliser les listes DXF avec les dictionnaires. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
GEGEMATIC Posté(e) le 20 janvier 2014 Auteur Posté(e) le 20 janvier 2014 Salut Gile,merci pour ces explications.De prime abord, j'ai toujours eu tendance à passer par le Dxf,car j'ai commencé le lisp bien avant visual lisp,mais j’essaie de m'habituer à avoir d'autre réflexes. Une question me taraude: pourquoi la même entitélorsque je fait :( vla-get-ObjectId (eobj))Choix de l'objet: 279 et dans mon dictionnaire, lorsque je l'ai stockée comme pointeur logiciel,Edict retourne la valeur : 8796082665520 Pourquoi Autocad utilise 2 objectId différents ? ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant