Aller au contenu

Comment savoir si un type de ligne existe dans le dessin courant ?


DenisHen

Messages recommandés

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

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

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

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

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

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

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

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

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

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

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 😅

Lien vers le commentaire
Partager sur d’autres sites

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

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é