CADxp: Safearry of long à la place d'un objectId - CADxp

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Safearry of long à la place d'un objectId (comment récuperer une entité avec vla-GetXRecordData)

#1 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 765
  • Inscrit(e) : 04-novembre 05

Posté 15 janvier 2014 - 19:08

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
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#2 L'utilisateur est hors-ligne   Patrick_35 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 6354
  • Inscrit(e) : 06-janvier 03

Posté 16 janvier 2014 - 08:40

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 Patrick
Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.
Joseph Joubert, 1754-1824
0

#3 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 765
  • Inscrit(e) : 04-novembre 05

Posté 16 janvier 2014 - 10:13

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
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#4 L'utilisateur est hors-ligne   Patrick_35 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 6354
  • Inscrit(e) : 06-janvier 03

Posté 16 janvier 2014 - 12:03

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
0

#5 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 765
  • Inscrit(e) : 04-novembre 05

Posté 16 janvier 2014 - 13:51

Voir le messagePatrick_35, le 16 janvier 2014 - 12:03 , dit :

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é
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#6 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 765
  • Inscrit(e) : 04-novembre 05

Posté 16 janvier 2014 - 16:24

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.
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#7 L'utilisateur est hors-ligne   Patrick_35 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 6354
  • Inscrit(e) : 06-janvier 03

Posté 17 janvier 2014 - 08:04

Salut

Je pense que ce sujet sur l'objectid devrait t'intéresser.

@+
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
0

#8 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 765
  • Inscrit(e) : 04-novembre 05

Posté 17 janvier 2014 - 09:44

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
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#9 L'utilisateur est hors-ligne   Patrick_35 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 6354
  • Inscrit(e) : 06-janvier 03

Posté 17 janvier 2014 - 10:01

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
0

#10 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11052
  • Inscrit(e) : 02-septembre 05

Posté 17 janvier 2014 - 22:13

Salut,

Citation

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
Image IPB
0

#11 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 765
  • Inscrit(e) : 04-novembre 05

Posté 20 janvier 2014 - 09:07

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 ?
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)