Aller au contenu

[Résolu] Peut-on attacher des Xdata à une fenêtre ?


DenisHen

Messages recommandés

Bonjour à tous.

 

Voilà, j'essai d'attribuer des Xdata à une fenêtre de l'espace papier, mais je n'y arrive pas.

 

Est-ce possible ou je me trompe ?

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut Patrick_35, et merci pour ta réponse.

 

Maître (gile) a écrit ça :

;; GetXdataForApplication
;; Retourne la liste des données étendues pour l'application
;;
;; Arguments
;; ename   : nom d'entité de l'objet auquel les données sont attachées
;; appName : nom de l'application enregistrée
(defun GetXdataForApplication (ename appName)
 (cdadr (assoc -3 (entget ename (list appName))))
)
;; SetXdataForApplication
;; Affecte à l'objet la liste des données étendues pour l'application
;;
;; Arguments
;; ename   : nom d'entité de l'objet auquel les données sont attachées
;; appName : nom de l'application enregistrée
;; data    : liste de paires pointées contenant les données
(defun SetXdataForApplication (ename appName data)
 (or (tblsearch "APPID" appName) (regapp appName))
 (entmod (append (entget ename) (list (list -3 (cons appName data)))))
)

 

Et je l'utilise tout le temps.

 

Maintenant, j'ai écris ce petit test :

(defun c:AttVue ()
 (SetXdataForApplication
   (car (entsel "\nSélectionner la fenêtre :"))
   "NomVue"
   (list (cons 1000 "Site"))
 ) ;_ Fin de SetXdataForApplication
) ;_ Fin de defun

 

Ca fonctionne sur plein d'entités, mais pas sur les fenêtres...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile) et merci de me répondre.

 

Aïe... Alors je vais devoir utiliser le lisp de l'exemple que m'a donné Patrick_35 ?

 

J’hésite, car je ne comprend pas tellement ce code, je vais donc avoir un peu de mal à l'adapter à mes besoins... Mais je vais essayer...

 

Ancore merci à vous...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Tu vas devoir utiliser les fonctions vla-*

 

Tu peux utiliser les routines ci dessous, extraites de AutomationHelpers.lsp en bas de cette page qui te permettront d'écrire simplement :

 

(gc:SetXdata (vlax-ename->vla-object vp) '((1001 . "Nom_App") (1002 . "{") (1000 . "chaîne") (1070 . 1) (1002 . "}")))

ou

(gc:GetXdata (vlax-ename->vla-object vp) "Nom_App")

qui retournera :

((1001 . "Nom_App") (1002 . "{") (1000 . "chaîne") (1070 . 1) (1002 . "}"))

 

 

;; gc:VariantToLispData
;; Convertit un variant ou un safearray en donnée LISP
;;
;; Argument
;; var : variant ou safearray

(defun gc:VariantToLispData (var)
 (cond
   ((= (type var) 'variant)
    (gc:VariantToLispData (vlax-variant-value var)))
   ((= (type var) 'safearray)
    (if (< -1 (vlax-safearray-get-u-bound var 1))
      (mapcar 'gc:VariantToLispData (vlax-safearray->list var))
    )
   )
   (T var)
 )
)

;; gc:VariantsToDxfList
;; Retourne une liste d'association (type liste DXF)
;;
;; Arguments
;; xtyp : variant (array d'entiers)
;; xval : variant (array de variants)

(defun gc:VariantsToDxfList (xtyp xval)
 (mapcar 'cons (gc:VariantToLispData xtyp) (gc:VariantToLispData xval))
)

;; gc:GetXdata
;; Retourne la liste DXF des données étendues de l'objet
;;
;; Arguments
;; obj : (vla-object) l'objet auquel sont liées les données étendues
;; app : (string) le nom de l'application enregistrée ("" pour toutes les applications)

(defun gc:GetXdata (obj app / xtyp xval)
 (vla-GetXdata obj app 'xtyp 'xval)
 (gc:VariantsToDxfList xtyp xval)
)

;; gc:DxfListToVariants
;; Définit 2 variables et affecte un variant à chacune
;;
;; Arguments
;; lst : une liste DXF
;; typeSymbol : un symbole quoté
;; valueSymbol : un symbole quoté

(defun gc:DxfListToVariants (lst typeSymbol valueSymbol)
 (set typeSymbol
      (vlax-make-variant
        (vlax-safearray-fill
          (vlax-make-safearray
            vlax-vbInteger
            (cons 0 (1- (length lst)))
          )
          (mapcar 'car lst)
        )
      )
 )
 (set valueSymbol
      (vlax-make-variant
        (vlax-safearray-fill
          (vlax-make-safearray
            vlax-vbVariant
            (cons 0 (1- (length lst)))
          )
          (mapcar '(lambda (x)
                     (if (listp (setq x (cdr x)))
                       (vlax-3d-point x)
                       (vlax-make-variant x)
                     )
                   )
                  lst
          )
        )
      )
 )
)


;; gc:SetXdata
;; Attribue des données étendues à un objet
;;
;; Arguments
;; obj : (vla-object) l'objet auquel sont liées les données
;; lst : (liste DXF) les données sous la forme :
;; '((1001 . "Nom_App") (1002 . "{") (1000 . "chaîne") (1070 . 1) (1002 . "}"))

(defun gc:SetXdata (obj lst / xtyp xval)
 (gc:DxfListToVariants lst 'xtyp 'xval)
 (vla-SetXdata obj xtyp xval)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Tu vas devoir utiliser les fonctions vla-*

 

Re Aïe... J'avoue être largué... Pourquoi des accolades en 1002 ?

 

En plus, c'est pour l'utilisser que deux fois, pour différencier deux fenêtres dans un espace papier : fenêtre "plan de situation" ("site") et "plan de détail" ("Détail")...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Bon, c'était couru d'avance, je n'y arrive pas.

 

J'ai tenté ça :

(defun c:Example_SetXData (/)
 (setq Select (car (entsel "\nSélectionner la fenêtre 'situation':")))

 (setq DataType (vlax-make-safearray vlax-vbInteger '(0 . 9)))
 (setq Data (vlax-make-safearray vlax-vbVariant '(0 . 9)))

 (vlax-safearray-put-element DataType 0 1001)
 (vlax-safearray-put-element Data 0 "Site")

 ;; Attach the xdata to the line
 (vla-SetXData Select DataType Data)
)

 

Mais j'ai ça comme retour :

Sélectionner la fenêtre :type d'argument incorrect: VLA-OBJECT <Nom d'entité: 25116496860>

 

Mais je ne suis pas étonné, j'entrave quedal... :huh:

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Les accolades (1002) servent à faire des groupements quand on a de longues liste de données pour faciliter les recherches en lecture. Elle ne sont pas obligatoires

 

Il me semble t'avoir déjà vu utiliser les fonctions vlax-ldata*, tu peux le faire aussi pour des objets (graphiques ou non) à la manière des dictionnaires d'extension.

 

(vlax-ldata-put vp "DenisHen" "site")

 

(vlax-ldata-get vp "DenisHen")

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bon, c'était couru d'avance, je n'y arrive pas.

 

J'ai tenté ça :

(defun c:Example_SetXData (/)
 (setq Select (car (entsel "\nSélectionner la fenêtre 'situation':")))

 (setq DataType (vlax-make-safearray vlax-vbInteger '(0 . 9)))
 (setq Data (vlax-make-safearray vlax-vbVariant '(0 . 9)))

 (vlax-safearray-put-element DataType 0 1001)
 (vlax-safearray-put-element Data 0 "Site")

 ;; Attach the xdata to the line
 (vla-SetXData Select DataType Data)
)

 

Mais j'ai ça comme retour :

 

Mais je ne suis pas étonné, j'entrave quedal... :huh:

 

Tu fais simplement :

(setq Select (car (entsel "\nSélectionner la fenêtre 'situation':")))
(gc:SetXdata (vlax-ename->vla-object select) '((1001 . "NomVue") (1000 . "site")))

où le groupe 1001 correspond au nom de l'application enregistrée ("NomVue").

 

Les routines contenues dans AutomationHelpers.lsp permettent précisément d'éviter d'avoir à coder le traitement des variants et safearrays et donc d'écrire de façon plus "AutoLISP" avec des listes et des paires pointées.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Il me semble t'avoir déjà vu utiliser les fonctions vlax-ldata*, tu peux le faire aussi pour des objets (graphiques ou non) à la manière des dictionnaires d'extension.

 

Oui, tu as bien vu, mais je ne savais pas qu'on pouvait les attacher à des entités...

 

Mille mercis pour votre aide...

 

EDIT : ça fonctionne nickel...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Salut à tous.

 

je reviens à la charge... J'ai attribué des (vlax-ldata* à des fenêtres de présentation "gabarit", mais le problème est que, après importation de la présentation de ce gabarit (avec Steal de Lee Mac ou un code de Patrick_35), ces vlax-ldata* ne sont pas conservés.

 

Je me suis donc tourné vers les Xdata, mais là, j'avoue, je nage en plein océan... à plus de mille mile des cotes les plus proches...

 

J'ai juste besoin d'attribuer seulement DEUX données à deux fenêtres (FMULT), une chacune... Et de les récupérer une fois importées dans un autre dessin via un ssget...

 

Aurais-tu un "truc" plus simple à utiliser, car je t'avoue que les "variant" et les "safearray". :o

 

Un peu comme les (vlax-ldata* :

  (setq Select (car (entsel "\nSélectionner la fenêtre du plan de détails")))
 (vlax-ldata-put Select "TetraCAD" "Details" )

 

C'est juste pour retrouver la nature de mes deux fenêtres une fois importées dans un dessin pour savoir à laquelle appliquer, le zoom "Site" pour la fenêtre du plan de site, et le zoom "Detail" pour la fenêtre du plan de détail...

 

Sinon, je vais devoir recréer les fenêtres dans l'EP et j'aimerais l'éviter, pour garder à l'utilisateur l'option de modifier la présentation d'origine...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Pour faciliter l'utilisation des fonctions vla- qui utilisent des types variant et safearray, j'avais écrit une petite bibliothèque (gc_AutomationHelpers.lsp en bas de cette page).

Cette bibliothèque fournit des fonctions qui permettent d'utiliser l'API COM avec des types de données AutoLISP classique.

 

Par exemple, dans ton cas,

pour affecter des données étendues à une entité viewport :

(setq Select (car (entsel "\nSélectionner la fenêtre du plan de détails")))
(gc:SetXdata (vlax-ename->vla-object select) '((1001 . "TetraCAD") (1000 . "Details")))

Pour lire les données étendues d'une entité pour l'application spécifiée :

(setq Select (car (entsel "\nSélectionner la fenêtre du plan de détails")))
(gc:GetXdata (vlax-ename->vla-object select) "TetraCAD")

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous.

 

Mille mercis Ô (gile), ça fonctionne nickel... :)

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut Patrick_35.

 

Oui, les Xdata sont bien conservés lors de l'importation avec Steal de Lee Mac... Même comportement avec DesignCenter.

 

Mais pas les (vlax-ldata...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

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é