DenisHen Posté(e) le 18 octobre 2021 Partager Posté(e) le 18 octobre 2021 Bonjour à toutes et à tous. Je cherche à savoir, avant de créer un calque, si un type de ligne existe déjà. Bonne soirée (ou journée)... 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 More sharing options...
(gile) Posté(e) le 18 octobre 2021 Partager Posté(e) le 18 octobre 2021 Salut, Tu peux utiliser la méthode Item sur la table des types de ligne : ThisDrawing.Linetypes.Item(nomDuTypeDeLigne) mais, comme expliqué dans cette réponse, Item génère une erreur si l'entrée n'existe pas dans la table. Une autre façon, est de parcourir la table des types de ligne avec For Each pour comparer les noms de types de ligne. Function HasLinetype (nomDuTypeDeLigne As String) As Boolean For Each lType in ThisDrawing.LineTypes If lType.Name = nomDuTypeDeLigne Then Return True Next Return False Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
DenisHen Posté(e) le 18 octobre 2021 Auteur Partager Posté(e) le 18 octobre 2021 Salut (gile). C'est exactement ce que je cherche... Mille mercis... 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 More sharing options...
(gile) Posté(e) le 18 octobre 2021 Partager Posté(e) le 18 octobre 2021 Si tu veux faire du VBA AutoCAD, la base c'est l'Object Model. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
DenisHen Posté(e) le 19 octobre 2021 Auteur Partager Posté(e) le 19 octobre 2021 Salut (gile). Merci pour ton aide, mais je fais du VBA Excel <> AutoCAD. Mes feuilles Excel servent de base pour gérer les calques dans AutoCAD, je fais donc tous mes VBA dans Excel, et je dirige AutoCAD à "distance". 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 More sharing options...
(gile) Posté(e) le 19 octobre 2021 Partager Posté(e) le 19 octobre 2021 Même "à distance" tu utilises une instance de AcadApplication et donc l'Object Model d'autoCAD. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
DenisHen Posté(e) le 20 octobre 2021 Auteur Partager Posté(e) le 20 octobre 2021 Mille mercis (gile), mais VBA ne comprend pas les deux "Return" (True et False). Maintenant, je cherche à faire la liste des types de lignes existantes. [EDIT] : j'ai trouvé ce que je cherche, la liste des types de ligne... Encore merci... 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 More sharing options...
Luna Posté(e) le 20 octobre 2021 Partager Posté(e) le 20 octobre 2021 Coucou, En lisp j'ai ce programme-ci : (defun vla-collection->list (doc col flag / lst item i) (if (null (vl-catch-all-error-p (setq i 0 col (vl-catch-all-apply 'vlax-get (list (if doc doc (vla-get-activedocument (vlax-get-acad-object))) col))))) (vlax-for item col (setq lst (cons (cons (if (vlax-property-available-p item 'Name) (vla-get-name item) (strcat "Unnamed_" (itoa (setq i (1+ i)))) ) (cond ((= flag 0) (vlax-vla-object->ename item) ) (t item ) ) ) lst ) ) ) ) (reverse lst) ) Donc pour récupérer la liste des types de lignes du dessin actif par exemple, cela s'écrit (vla-collection->list nil 'linetypes 0) ou (vla-collection->list nil 'linetypes 1) L'argument flag est défini ainsi : flag = 0 > Pour chaque paire pointée, la 'key' correspond à la chaîne de caractère correspondant au nom de l'objet (ex. : "Continuous") et la 'value' correspond à l'ename de l'entité (pouvant être obtenu via (tblobjname) par exemple) (ex. : <Nom d'entité: 3b058960>) flag = 1 > Pour chaque paire pointée, la 'key' correspond à la chaîne de caractère correspondant au nom de l'objet (ex. : "Continuous") et la 'value' correspond au VLA-Object de l'entité (ex. : #<VLA-OBJECT IAcadLineType 000001b08be9e4d8>) Donc par exemple : (vla-collection->list nil 'linetypes 0) ;; renvoie (("ByBlock" . <Nom d'entité: 1b8fef76940>) ("ByLayer" . <Nom d'entité: 1b8fef76950>) ("Continuous" . <Nom d'entité: 1b8fef76960>)) ;; et (vla-collection->list nil 'linetypes 1) ;; renvoie (("ByBlock" . #<VLA-OBJECT IAcadLineType 000001b0e08b3328>) ("ByLayer" . #<VLA-OBJECT IAcadLineType 000001b0e08b3568>) ("Continuous" . #<VLA-OBJECT IAcadLineType 000001b0e08b3688>)) Donc comme le programme utilise globalement le Visual LISP pour récupérer ces informations, cela devrait te donner les pistes suffisantes pour y parvenir en VBA 😉 La propriété 'Name' à partir de la collection 'linetypes que tu as déjà parcouru en soit. Bisous, Luna Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 20 octobre 2021 Partager Posté(e) le 20 octobre 2021 il y a 57 minutes, DenisHen a dit : Mille mercis (gile), mais VBA ne comprend pas les deux "Return" (True et False). C'est toi qui est censé connaître le VBA... Peut-être comme ça : Function HasLinetype (nomDuTypeDeLigne As String) As Boolean Dim result As Boolean = False For Each lType in ThisDrawing.LineTypes If lType.Name = nomDuTypeDeLigne Then result = True Exit For Next HasLinetype = result Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
DenisHen Posté(e) le 20 octobre 2021 Auteur Partager Posté(e) le 20 octobre 2021 il y a 21 minutes, (gile) a dit : C'est toi qui est censé connaître le VBA... Oui, je connais un peu 😉 et j'avais déjà corrigé le code. Mais je pensais que tu connaissais une méthode que j'ignorais, ce qui ne m'étonnerait pas... 😉 Encore merci à toi. 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 More sharing options...
VDH-Bruno Posté(e) le 20 octobre 2021 Partager Posté(e) le 20 octobre 2021 Bonjour, Comme Luna un peu hors sujet pour du VBA, pour lister les types de lignes présentes dans un dessin: En vlisp: (vlax-for l (vla-get-LineTypes (vla-get-activedocument (vlax-get-acad-object))) (princ (strcat "\n" (vla-get-Name l))) ) ou comme ceci: (vlax-map-collection (vla-get-LineTypes (vla-get-activedocument (vlax-get-acad-object))) '(lambda (l) (princ (strcat "\n" (vla-get-Name l)))) ) Sinon en AutoLisp: ;;; TBLNEXTLIST VDH-Bruno ;;; Retourne la liste les noms de symboles correspondant aux appels successifs à la fonction tblnext ;;; Argument ;;; n -> Nom de table ("LAYER" "LTYPE" "VIEW" "STYLE" "BLOCK" "UCS" "APPID" "DIMSTYLE" "VPORT") ;;; f -> Si f (flag) est non nil, TBLLIST retourne tous les nom depuis la première entrée (defun tblnextlist (n f) (if (setq f (tblnext n f)) (cons (cdr (assoc 2 f)) (tblnextlist n nil)))) A lancer comme ceci: (tblnextlist "LTYPE" T) Et d'une façon plus général pour avoir à disposition une liste de fonction plus spécifique sur le model de la fonction (layoutlist) ;;; Ensemble de fonctions pour lister les noms de symboles des tables VDH-Bruno ;;; (LAYERLIST) -> Retourne la liste des Noms de calque ;;; (LTYPELIST) -> Retourne la liste des Noms de type de ligne ;;; (VIEWLIST) -> Retourne la liste des Noms de vue ;;; (STYLELIST) -> Retourne la liste des Noms de style de texte ;;; (BLOCKLIST) -> Retourne la liste des Noms de bloc ou nil ;;; (UCSLIST) -> Retourne la liste des Noms de SCU ou nil ;;; (APPIDLIST) -> Retourne la liste des Noms d'application ou nil ;;; (DIMSTYLELIST)-> Retourne la liste des Noms de style de cote ;;; (VPORTLIST) -> Retourne la liste des Noms de fenêtre ou nil (mapcar '(lambda (tbl) (eval (list 'defun (read (strcat tbl "list")) nil (list 'tblnextlist tbl T))) ) '("LAYER" "LTYPE" "VIEW" "STYLE" "BLOCK" "UCS" "APPID" "DIMSTYLE" "VPORT") ) Cdt VDH-Bruno Apprendre => Prendre => Rendre Lien vers le commentaire Partager sur d’autres sites More sharing options...
DenisHen Posté(e) le 20 octobre 2021 Auteur Partager Posté(e) le 20 octobre 2021 Salut Bruno, et merci beaucoup pour ton aide. Mais j'aimerais éviter de mettre du Lisp ou du V-Lisp dans mon VBA, c'est possible (je l'ai déjà fais) mais ça ralenti beaucoup le code et en plus, j'aimerais partager mon fichier Excel avec d'autres personnes (gratuitement bien sur) et je préfèrerais n'avoir que du VBA dans le code, au cas où le futur utilisateur connaisse le VBA et pas le Lisp. En tous cas, merci encore, car je garde ton code précieusement sous le coude... 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 More sharing options...
Curlygoth Posté(e) le 21 octobre 2021 Partager Posté(e) le 21 octobre 2021 Juste pour ouvrir une autre horizon (je ne l'utilise pas mais bon) "ça existe" : Ca donne un truc du genre : Function LIN_EXISTE(nom_type_ligne) On Error Resume Next X = thisdrawing.Linetypes(nom_type_ligne).name If Err Then LIN_EXISTE = False Err.Clear Else LIN_EXISTE = False End If end function Avantage : plus rapide Désavantage : "moins fiable" A débattre 😅 Mon site Web (en cours de construction) : Site DA-CODE de @didier Lien vers le commentaire Partager sur d’autres sites More sharing options...
VDH-Bruno Posté(e) le 21 octobre 2021 Partager Posté(e) le 21 octobre 2021 Il y a 17 heures, DenisHen a dit : Salut Bruno, et merci beaucoup pour ton aide. Mais j'aimerais éviter de mettre du Lisp ou du V-Lisp dans mon VBA, c'est possible (je l'ai déjà fais) mais ça ralenti beaucoup le code et en plus, j'aimerais partager mon fichier Excel avec d'autres personnes (gratuitement bien sur) et je préfèrerais n'avoir que du VBA dans le code, au cas où le futur utilisateur connaisse le VBA et pas le Lisp. En tous cas, merci encore, car je garde ton code précieusement sous le coude... Denis... Bonjour, Oui je comprends pas de soucis, je complète tout de même car à la relecture je me suis aperçu que j'étais hors sujet dans mon hors sujet avec le Lisp en listant la table des type de ligne, car si tu veux seulement tester la présence d'un type de ligne, je rappellerai que AutoLisp est bien outillé pour celà et les fonctions tblobjname, tblsearch sont tes amis, au cas ou tu dois garder quelque chose sous le coude. Pour l'exemple: _$ (tblsearch "LTYPE" "CONTINUOUS") ((0 . "LTYPE") (2 . "CONTINUOUS") (70 . 0) (3 . "Solid line") (72 . 65) (73 . 0) (40 . 0.0)) _$ (tblsearch "LTYPE" "typedeligneinexistant") nil _$ (tblobjname "LTYPE" "CONTINUOUS") <Nom d'entité: -14c360> _$ (tblobjname "LTYPE" "typedeligneinexistant") nil Cdt Apprendre => Prendre => Rendre Lien vers le commentaire Partager sur d’autres sites More sharing options...
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