Aller au contenu

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


DenisHen
 Partager

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 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile).

C'est exactement ce que je cherche...

Mille mercis...

Denis...

Windows 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

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 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

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 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

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 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

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 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

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

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Partager

×
×
  • Créer...