Qqs trucs sur Autocad et d'autres logiciels DAO...
Accueil Initiation Méthodologie Variables Comment faire ? Lisps Sommaire
Soft & liens Revit 2020 CVC sur autocad Linux CloudCompare Initiation à Autolisp Blog

Attribut des blocs dynamiques

 

L'exemple précédent est un amélioration des blocs présenté sur cette page. Mais pour améliorer le comportement dans les SCU, on a perdu le coté dynamique des blocs. En fait, les blocs propriété dynamiques ne sont pas accessible en Autolisp. Il va falloir regarder du coté de Visuallisp qui est une extension de l'Autolisp avec des fonctions très proche de VBA (visual basic application). On peu télécharger l'équivalent des guide de ref sur Visual Lisp ici (post à lire depuis le début!)  

 

Présentation du Vlisp

Voici un autre dessin avec des bloc similaires à ceux destiné à être utilisé avec Ascu0.lsp, mais cette fois, le bloc niv-SCU est un bloc dynamique. On va avoir besoin d'une propriété VBA pour y accéder, car par exemple le nom des instances de bloc dynamique est caché par un nom générique type (2 . *U15) contrairement à celui de (2 . ref-scu) d'un bloc "normal" dans sa liste dxf

Je ne suis pas fortiche en auto lisp, mais le VBA c'est encore autre chose. Regarder ce post où encore (gile) nous donne les fonctions pour initialiser les document pour une utilisation de VBA et comment on accède à l'EffectiveName. Grâce à lui, j'ai modifié la fonction du lisp dxf déjà créer. Qui apporte cette fois une vrai valeur ajoutée insérant le nom EffectiveName en tête de la liste dxf retournée si le bloc est dynamique à télécharger ici
De plus, sur un autre post il donne les fonctions générique pour modifier les propriétés et attribut des blocs dynamiques. Mais j'ai rien compris... ou pas grand chose..

Bref, je ne vais pas vous en apprendre beaucoup dans cette page. L'algorithme est rigoureusement le même que pour l'autre exercice, à part les fonctions ont été modifiées pour utiliser les propriétés VBA des objets. Vous pouvez donc vous servir de cet exemple pour récupérer ces 2 fonctions assez généraliste pour lire et modifier un attribut y compris sur les blocs dynamique.

Je tiens à remercier Patrick_35 un autre éminent membre de CadXp qui m'a considérablement aider à pondre ces 2 minables fonctions
Pour rappel, voici l' algorithme du 1er exercice et celui des 2 nouvelles fonctions:

Algorithme

Fonction principale

Demander à l'utilisateur de faire un jeux de sélection,
boucle 1 de parcours du sélection set et création de la liste de travail avec uniquement les blocs soit niv-scu soit ref-scu : ( (cond les autres blocs, s'i, y en a; seront ignoré car ils ne seront pas dans les conditions)
Ajout des NIV à la liste de travail
Récupérer la valeur de la Ref et son handle, passer les compteurs de 1

avertir si y a plus d'une ref et pas de Niv (sortir)
grâce au handle de la ref on récupère le point d'insertion de ref

boucle 2 de parcours de la liste de travail
Calculer pour chaque niveau : récupérer sa position, calculer en fonction de la position du bloc/Ref, La valeur actuelle de l'attribut, faire un (subst pour modifier la liste dxf de l'attribut et un (entmod pour le modifier

Fonction pour chercher la valeur d'un attribut

Pour tous les attributs du bloc dont le nom est passé en argument
Et dont le nom d'attributs est égal à celui recherché
prendre la valeur de l'attribut, et la retourner

(comme logiquement le nom d'attribut est unique pour un bloc, la valeur retournée est donc celle de "nomatt")

Fonction pour modifier un attribut

Pour tous les attributs du bloc dont le nom est passé en argument
Et dont le nom d'attributs est égal à celui recherché
Modifier la valeur de l'attribut

(comme logiquement le nom d'attribut est unique pour un bloc, une seule valeur est donc modifiée celle de "nomatt")

Fonction dxf améliorée

créer la liste dxf normale
chercher l'effectiveName
l'ajouter à la liste

Version graphique

  • Toujours trop grand pour être lisible sur une image. je vous propose plutot un PDF ou le DWG
  • pour celui la j'ai fini par faire des blocs dynamiques
 

 

 

Que doit on changer à cause du VBA ?

En premier lieux, il faut initialiser le programme pour qu'il ait accès au fonctions du document actif. Cela doit etre fait dans le programme principal pour ne le faire qu'une seule fois. On pourrait mettre ces lignes dans la fonction, mais elles serai lors évaluée à chaque appel, ce qui n'est pas nécessaire
Ce sont les lignes:

(vl-load-com) ; charger les fonctions VBA
(setq doc (vla-get-activedocument (vlax-get-acad-object))) ; pointer le document actif

Pour le reste, si comme moi, vous n'avez jamais fait de VBA, lisez et relisez la prose de (gille) et de Patrick_35, c'est sans toute assimilable, mais fait appel à pas mal de notions issue de la programmation orienté objet qui est plus complexe que l'Autolisp dans sa syntaxe. On peu néant moins constater que les 2 fonctions sont considérablement simplifiées par rapport au version pure Autolisp, pas de parcours de liste dxf, pas de (subst (entmod... on fait la modification directement.

Lisp

Voici donc le lisp, et les blocs pour coter vos façades quelque soit le SCU

 

 

 

 

 

 

lien vers cadXP