Blocs mis à l'échelle
But de l'exercice :
Changer d'échelle les blocs
Dans cet exercice il va être question de sélectionner un bloc, ou plusieurs et de changer le facteur d'échelle globalement (x,y et z)
Une variante avec des échelles différentes sera aisée à réaliser une fois que vous avez compris le fonctionnement de cet exercice.
Le principe va être de trouver la valeur du facteur d'échelle d'insertion et de le modifier par un nouveau par l'intermédiaire de la fonction (subst) (voir cette page) qui permet de modifier des contenus de listes (list).
On part comme toujours des codes DXF pour trouver les valeurs cherchées dans la liste générale de définition de l'entité, les facteurs d'échelle des blocs insérés dans le dessin sont respectivement dans les codes 41, 42 et 43 pour les facteurs d'échelle en X, en Y et en Z.
Le code en image pour vous habituer à taper du code ...
Puisque c'est la fonction defun c: qui a été utilisée il suffira de taper le nom de la nouvelle commande au clavier une fois le lisp chargé (load).
L'image précédente montre le code minimal mais il est conseillé de prévoir de vérifier que l'entité sélectionnée soit bien une entité BLOC et ensuite seulement chercher à modifier les facteurs d'échelle. Comme ceci :
Vous notez que les trois facteurs d'échelle (X,Y et Z) reçoivent à terme la même valeur, comme je vous disais plus haut la variante du programme qui changera différemment les échelles en X, en Y ou en Z est aisée à écrire en demandant trois facteurs et en initialisant trois variables qui seront injectées respectivement dans les codes 41, 42 et 43 pour les facteurs d'échelle en X, en Y et en Z.
Voici le code en texte, copiable...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | (defun c:ech-bl ( / ent-temp ent nouv-facteur) (setq ent (car (entsel "\nChoix du bloc\n"))) (if (= "INSERT" (cdr (assoc 0 (entget ent)))) (progn (setq nouv-facteur (getreal "\nNouveau facteur d'échelle des blocs\n")) (setq ent-temp (entget ent)) (setq ent-temp (subst (cons 41 nouv-facteur)(assoc 41 ent-temp) ent-temp)) (setq ent-temp (subst (cons 42 nouv-facteur)(assoc 42 ent-temp) ent-temp)) (setq ent-temp (subst (cons 43 nouv-facteur)(assoc 43 ent-temp) ent-temp)) (entmod ent-temp) ) (alert "L'entité sélectionnée n'est pas un bloc !") ) (princ) ) |
Et si on voulait multiplier par deux (ou autre) l'échelle d'insertion du bloc ?
Il va falloir mémoriser le contenu des codes 41, 42 et 43 pour les facteurs d'échelle en X, en Y et en Z. et au lieu de demander le nouveau facteur d'échelle multiplier la valeur trouvée dans les codes des échelles.
Comme ceci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | (defun c:ech-bl ( / ent-temp ent nouv-facteur) (setq ent (car (entsel "\nChoix du bloc\n"))) (if (= "INSERT" (cdr (assoc 0 (entget ent)))) (progn (setq nouv-facteur (getreal "\nFacteur multiplicateur d'échelle des blocs\n")) (setq ent-temp (entget ent)) (setq nouv-facteur02 (* nouv-facteur (cdr(assoc 41 ent-temp)))) (setq ent-temp (subst (cons 41 nouv-facteur02)(assoc 41 ent-temp) ent-temp)) (setq ent-temp (subst (cons 42 nouv-facteur02)(assoc 42 ent-temp) ent-temp)) (setq ent-temp (subst (cons 43 nouv-facteur02)(assoc 43 ent-temp) ent-temp)) (entmod ent-temp) ) (alert "L'entité sélectionnée n'est pas un bloc !") ) (princ) ) |
À votre disposition par le formulaire CONTACT
07 septembre 2018