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

Manipuler les blocs

 

Les blocs sont parmi les outils les plus puissants d'Autocad. Quand on regarde un peu la littérature sur ces objets dans les ref Dxf, les blocs sont qualifiés d'entités complexes. Il ne faut pas avoir peur de ce terme. Cela signifie seulement que l'entité Bloc contient des sous entités qui sont les éléments qui le compostent. On va dans ce chapitre apprendre à les parcourir et à les modifier.  

 

Étude ce cas

Comme à mon habitude, je préfère prendre un exemple à un long discours. Nous avons déjà pratiquement vu tous les éléments dont nous allons avoir besoin. Il va nous falloir faire un jeu de sélection, parcourir des liste dxf, les modifier... Rien de bien sorcier si vous avez suivi jusque là.
Les nouvelles fonction à potasser dans le guide de ref sont:
(entnext. Cette fonction retourne la prochaine entité dans l'ordre de la data base qui est en fait l'ordre de création des objets. Mais si on passe à (entnext un bloc en argument, (entnext retourne les éléments qui compose ce bloc successivement un peu comme un (cdr ou on à accès au 2eme élément en supprimant le 1er. Si on le place dans une boucle, on va pouvoir parcourir le bloc facilement.
(entmod qui sert à modifier une entité
On va également utiliser les handle des blocs qui sont stockés dans le dxf code 5 des blocs cela permettra de récupérer facilement un bloc sans re parcourir la liste. Pour appeler un bloc dont on connaît le handle, c'est (handent

Cotation altimétrique le retour

Le but de ce programme, sera de mettre à jour des attributs dans un jeu de bloc, pour retrouver un comportement similaire de cotation altimétrique à ceux qui fonctionnent avec les champs. L'avantage de notre programme et des nouveaux blocs qu'on va mettre à jour, c'est que l'utilisation sera possible quelque soit le SCU contrairement à ceux qui utilise les champs Regardez cette page, et testez les blocs proposés dans diférents SCU pour voir ou le bas blesse.

Chaque jeu de sélection à mettre à jour devra comporter une référence et un ou des niveaux. L'attribut Niv sera mis à jour en fonction du décalage en Y suivant le SCU courant, de plus on peu donner une cote altimétrique à la référence à ajouter à ce décalage. Les blocs sont déjà dessinés ici.

Algorithme

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 en Y de NIV / REF, La valeur actuelle de l'attribut, faire un (subst pour modifier la liste dxf de l'attribut et un (entmod pour le modifier

Diviser pour mieux régner

On a vu dés le 1er TP les fonctions, On va réutiliser la fonction Fdxf déjà crée, J'avais dis que cette fonction n'avait pas de valeur ajoutée, mais dans un 2eme temps on verra les avantages de son utilisation pour modifier et adapter ce programme

Dans cet algorithme, on a besoin de lire la liste dxf d'un attribut plusieurs fois. On va donc créer aussi cette fonction. On y passera 2 arguments le "entname" ou le handle du bloc dans le quel on va chercher l'attribut, et le nom de cet attribut. Et retournera la liste dxf de l'attribut . On sait que le nom d'un attribut doit etre unique dans un bloc on va pouvoir décomposer notre fonction comme ça:

Tant que la liste dxf est égale à nil:
affecter ENT à l'entité suivante du bloc, tester si ENT est un attribut ET si c'est l'attribut cherché
Si oui créer sa liste DXF (et donc sortir du (While )
fin (While
retourner la liste dxf de l'attribut

Petite subtilité 1
dans le test de cette boucle. C'est le ET. En listp ça se dit (and .

Pour faciliter la modification d'un bloc, on va faire une 2eme fonction qui modifiera un attribut. Les valeurs à passer à cette fonctions seront le handle du bloc, le nom de l'attribut à modifier, et la nouvelle valeur de celui ci (un string pour que la fonction soit réutilisable pour d'autre programme). Voici une solution pour cette fonction.

Récupérer la valeur actuelle de l'attribut (avec la fonction précédente)
Créer la paire de la val leur initiale de l'attribut ( code dxf 1 de la liste d'attribut)
Créer la paire pointée pour la nouvelle valeur de l'attribut
Substituer la nouvelle paire d'avec l'ancien
Modifier la liste avec Entmod

Version graphique

  • On commence à étre un peu juste pour étre lisible sur une image. je vous propose plutot un PDF ou le DWG
  • On voit bien q'il y a un programme principal et 2 fonctions (les trapèzes)
    une avec un retour
    et l'autre pas
 

 

Le code finalement ne présente pas trop de difficulté, même s'il est un peu plus long; Il me semble que le lisp qui fait la somme des longueurs est un poil plus difficile à comprendre.
Voici donc un code en correction, mais essayer d'aller au bout tout seul

Conclusions

Pour être complexe, les blocs ne sont finalement composés que d'entités simples qu'on peut modifier. J'ai ajouté un contrôle sur la validité du niveau de référence qui doit etre un entier ou un réel. Au fur et a mesure de vos développements il va falloir de plus en plus inclure de code pour la gestion des erreurs. je ferai peut etre un truc dessus, mais il existe des fonctions plus spécifique pour la gestion d'erreur, voir page 33 de l'introduction de (gille).

 

 

 

 

 

 

lien vers cadXP