DenisHen Posté(e) le 6 avril 2018 Posté(e) le 6 avril 2018 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)
Patrick_35 Posté(e) le 6 avril 2018 Posté(e) le 6 avril 2018 Salut Oui, c'est tout à fait possible.Tu as cet exemple qui le démontre. C'est pour une ligne, mais le principe reste le même pour une fenêtre. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
DenisHen Posté(e) le 6 avril 2018 Auteur Posté(e) le 6 avril 2018 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)
(gile) Posté(e) le 6 avril 2018 Posté(e) le 6 avril 2018 Salut, On ne peut pas utiliser la fonction entmod pour modifier les fenêtres (viewport). Extrait de l'aide :"You cannot use the entmod function to modify a viewport entity." Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 6 avril 2018 Auteur Posté(e) le 6 avril 2018 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)
(gile) Posté(e) le 6 avril 2018 Posté(e) le 6 avril 2018 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
DenisHen Posté(e) le 6 avril 2018 Auteur Posté(e) le 6 avril 2018 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)
DenisHen Posté(e) le 6 avril 2018 Auteur Posté(e) le 6 avril 2018 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)
(gile) Posté(e) le 6 avril 2018 Posté(e) le 6 avril 2018 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
(gile) Posté(e) le 6 avril 2018 Posté(e) le 6 avril 2018 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
DenisHen Posté(e) le 6 avril 2018 Auteur Posté(e) le 6 avril 2018 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)
DenisHen Posté(e) le 19 mai 2018 Auteur Posté(e) le 19 mai 2018 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)
(gile) Posté(e) le 20 mai 2018 Posté(e) le 20 mai 2018 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
DenisHen Posté(e) le 22 mai 2018 Auteur Posté(e) le 22 mai 2018 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)
Patrick_35 Posté(e) le 23 mai 2018 Posté(e) le 23 mai 2018 Salut Denis. Alors, tu récupères bien tes données maintenant avec les xdatas ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
DenisHen Posté(e) le 23 mai 2018 Auteur Posté(e) le 23 mai 2018 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)
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