But de l'exercice :
Créer un bloc
Parfois des programmes lisp doivent insérer des blocs dans le dessin au cours de leur exécution et pour que le programme fonctionne il faut que ce bloc existe dans le dessin dans lequel le programme va opérer sinon un message d'erreur précisant que le bloc est introuvable va stopper les opérations et c'est pour le moins désagréable !.
Qu'à cela ne tienne, on ne va pas se laisser faire par une machine, non ?
Alors il va falloir vérifier si le bloc est référencé dans le dessin en cours et s'il ne l'est pas le créer pour pouvoir l'insérer sans que l'utilisateur n'ait à se poser de questions, c'est bien pour ça que la programmation existe : simplifier la vie de l'utilisateur.
Tout d'abord vérifier si le bloc existe :
dans l'exemple je vais lui donner le nom de "bloc-par-lisp"
Pour mémoire : les blocs sont "enregistrés dans une table et pour interroger les tables
c'est la fonction (tblsearch) va être mise à contribution.
Le test est simple et peut se présenter sous cette forme :
1 2 3 4 | (if (not (tblsearch "BLOCK" "bloc-par-lisp")) (setq exist "non") (setq exist "oui") ) |
Ce qui signifie : Si (if) dans la table des blocs il n'y a pas de définition de "bloc-par-lisp" (not) mettre la variable "exist" à OUI, sinon mettre la variable "exist" à NON.
J'enregistre donc le résultat dans la variable "exist" pour des raisons d'explication de la fonction, vous verrez plus tard qu'on se passe de cette variable.
Maintenant on sait si le bloc existe et il est nécessaire de le créer s'il n'existe pas.
Pour l'exercice le bloc nommé "bloc-par-lisp" aura cette apparence : un carré de 1 unité de côté et les deux diagonales tracées.
Je présente deux solutions pour créer ce bloc :
La première
(command)
Dessiner les entités, les inclure dans un jeu de sélection et transformer ce jeu de sélection en bloc, solution qui s'apparente à ce qu'on fait "à la main" dans AutoCAD.
Image du code :- Création de la fonction "make-bloc-01"
- Création d'un jeu de sélection vide
- Dessin de la première ligne depuis le point 0 (zéro)
- Insertion de la dernière entité dans le jeu de sélection
- Dessin de la deuxième ligne etc...
- Lancement de la commande "_-block" qui attend le nom du bloc à créer, le point d'insertion de ce bloc, les entités qui composent le bloc (le jeu de sélection de toutes les lignes créées précédemment)
La seconde
(entmake)
Image du code :
- création de la fonction "Make-Bloc-02"
- création d'une entité "bloc"
- création d'une entité "ligne" (six fois de suite avec des points différents)
- création d'une entité "EndBlk" qui va "fermer" le bloc.
C'est fini, tout est en ordre, dorénavant si un programme doit insérer ce bloc au cours de son exécution, vous ferez le test de savoir s'il existe, si oui on l'insère, si non on le crée et on l'insère...
Libre à vous de choisir une fonction ou l'autre, c'est votre façon d'appréhender la programmation qui fera la différence, la deuxième étant - à mes yeux - plus "programmatiquement correcte".
Voici venu le temps de déposer le code copiable ...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | (if (not (tblsearch "BLOCK" "Bloc-par-Lisp")) (Make-Bloc-02) (alert "Le bloc \"Bloc-par-Lisp\" existe déjà dans le dessin") ) (defun Make-Bloc-01 (/ jeusel) (setq jeusel (ssadd)) (command "_line" '(0 0) '(1 0) "") (setq jeusel (ssadd (entlast) jeusel)) (command "_line" '(1 0) '(1 1) "") (setq jeusel (ssadd (entlast) jeusel)) (command "_line" '(1 1) '(0 1) "") (setq jeusel (ssadd (entlast) jeusel)) (command "_line" '(0 1) '(0 0) "") (setq jeusel (ssadd (entlast) jeusel)) (command "_line" '(0 0) '(1 1) "") (setq jeusel (ssadd (entlast) jeusel)) (command "_line" '(0 1) '(1 0) "") (setq jeusel (ssadd (entlast) jeusel)) (command "_-block" "Bloc-par-Lisp" "0,0" jeusel "") ) (defun Make-Bloc-02 () (entMake '((0 . "BLOCK") (2 . "Bloc-par-Lisp") (70 . 2) (8 . "0") (10 0 0 0) (6 . "ByLayer") (62 . 256))) (entmake (list (cons 0 "LINE") (cons 10 (list 0 0 0)) (cons 11 (list 1 0 0)))) (entmake (list (cons 0 "LINE") (cons 10 (list 1 0 0)) (cons 11 (list 1 1 0)))) (entmake (list (cons 0 "LINE") (cons 10 (list 1 1 0)) (cons 11 (list 0 1 0)))) (entmake (list (cons 0 "LINE") (cons 10 (list 0 1 0)) (cons 11 (list 0 0 0)))) (entmake (list (cons 0 "LINE") (cons 10 (list 0 0 0)) (cons 11 (list 1 1 0)))) (entmake (list (cons 0 "LINE") (cons 10 (list 0 1 0)) (cons 11 (list 1 0 0)))) (entMake '((0 . "EndBlk") (8 . "0"))) ) |
10 mai 2019