Aller au contenu

Safearry of long à la place d'un objectId


GEGEMATIC

Messages recommandés

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.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Salut Patrick,

Si tu as la DLL de Gile, DictionaryEditor_17.dll

le mieux est de lancer la commande edict,

entité,

choisir une entité

ajouter dictionnaire d'extension,

sur ce dictionaire, ajouter Xrecord

nom : NA_FILS

Ajouter une donnée de type "pointeur logiciel" à ce Xrecord

sé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.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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 64

en fait je pense qu'utilisant COM, je retombe sur les écueils de VBA avec A64

je trouvais le flot plus limpide en restant purement activeX, et ça m'évitait de faire des

tratuctions ename->objet->ename,

mais etmps pis, je vais repasser en dxf !

Gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

je pense qu'il est possible de retrouver le bon pointeur à partir de cette paire

J'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.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Salut,

J'ai fait un peu le tours de ces sujets hier, je n'avais pas trouvé celui là

ça confirme le problème

mais je continue de penser que les 2 integer négatifs retournés par COM doivent permettre de recréer l'integer de base ...

merci

Gérald

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité