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

Le problème des SCU

Quand on regarde les propriétés des entités telles quelles sont enregistrées dans la base de donnée du dessin grâce à leur code dxf, on remarque que les points sont noté par rapport au SCG. On va regarder comment faire pour qu'un programme fonctionne quel que soit le Système de Coordonnée Utilisateur... L'occasion de rentrer dans les dxf avec (assoc

Un exemple inutile

Ouvrez ce dwg et grâce au petit programme de l'exercice précédent, on va regarder les propriétés dxf de la diagonale.

Je vous renvoie au guide de référence DXF, pour une ligne, les points de départ et d'arrivée sont respectivement enregistré sous les code 10 et 11.
On remarquera que le point de départ repéré par (10 4.79066 0.880649 0.0) 10 est le code dxf et les 3 réels qui suivent les coordonnées x,y,z
On aurait pus s'attendre à trouver un 0,0,0 au regard du dessin car la ligne commence à l'origine du repère. C'est parce que le dessin à été orienté suivant un système de coordonnée utilisateur (le repère X/Y est du reste diférent de l'icone du SCG) et que dans la base dxf les coordonnées sont enregistrées par rapport au SCG (système de coordonnées général).
Ce petit détail noté, on va essayer de travailler dans ce dessin

Dessiner un cercle avec (entmake

On peu créer des entités depuis un programme. Là encore on va se servir des codes dxf. On va écrire un programme qui trace un cercle dans le coin inférieur du rectangle, c'est à dire au point de départ de la ligne. On va voir pour cela pas mal de concept (comme d'ab, jetez un coup d'oeil dans le guide de ref aux nouvelles commandes notées en gras).

Pour dessiner une entité, on aura besoin de (entmake et il faudra passer à la commande la liste dxf du cercle à créer. Enfin pas la liste complète, si on ne renseigne pas tout, les paramètres courants seront renseigné automatiquement. Par exemple si on ne donne pas le code pour le calque, c'est dans le calque courant que l'entité sera créée.
Le rayon du cercle sera égal à la longueur de la ligne. On aura besoin de (distance et on passera les deux pts nécessaires en les récupérant avec (assoc qui renvoie la liste qui commence par le code passé en argument.
Mais cette liste est de la forme (10 4.79066 0.880649 0.0) hors le point dont on a besoin doit plutôt etre ( 4.79066 0.880649 0.0). Il faut donc retirer le 1er élément de cette liste avec (cdr
Il faut construire une liste, donc (list et (cons vont etre utilisés. Dans cette liste on aura:

(0 . "CIRCLE") qui est le code pour une entité cercle
(40 . réel ) Ou réel est le rayon du cercle
(10 réel réel réel ) qui sera le centre du cercle

Les 2 premiers termes sont des paires pointées. Une paire pointée est une liste un peu particulière c'est ici qu'on aura besoin de (cons . Le 1er terme ne résultera pas d'un calcul, on va le passer tel quel dans la liste. Mais si l'interpréteur rencontre une parenthèse, il va chercher à interpréter une fonction (quote va empêcher ça. Mais (quote est à ma connaissance la seule commande Autolisp qui à un raccourci, et ce raccourci la seule commande qui n'a pas besoin de parenthèse c'est ' .

La liste finie, on crée l'entité avec (entmake

Voila ce que ça donne.... mais normalement, avec toutes les indications, vous devriez vous en sortir... c'est le 3eme programme, vous avez appris à lire, il faudrait commencer à écrire.

Allez pour la route je l'ai appeler dc.lsp on parlera de l'éditeur et du débugage bientôt... mais c'est en codant qu'on devient coderon

Testez le, pas de pb, ça roule...
petit nota,
j'ai filtré le ssget, les filtres de sélection sont pas encore au programme grand débutant on en reparlera...

2 mots des paires pointés
Une fois de plus, un post exaustif de (gile). On peut retenir que la paire est pointé est un peu la liste fondamentale...

Création d'un cercle avec (command ... et début des emmerdement

Dans le programme précédent tout ce passe bien car on travaille directement sur les codes dxf. Maintenant, il y a une autre façon de faire. On peu appeler aussi une commande Autocad depuis un programme. L'appel pour tracer un cercle se fera avec la ligne

(command "_.circle" "_non" cen rad
Alors, (command appelle une commande, "_.circle" est la version internationale de la commande cercle appelée sans boite de dialogue et cent et rad, deux variables qui contiendrons respectivement le centre et le rayon. Le "_non" à pour but de désactiver temporairement l'accrochage aux objets qui perturberait la position du centre

Essayez de modifier dc.lsp en vous servant de pt1 pour le centre et de r pour le rayon....

Toujours la flême d'écrire? bon ça donne ça. dc2.lsp

Harf damned !! ça marche plus !!!

Comment régler ça ?

La commande (trans

La commande (trans est faite pour régler nos petit soucis de SCU. On va l'utiliser pour convertir les coordonnées SCG en coordonnées SCU. Il suffit de convertir pt1 avant son utilisation pour faire le centre du cercle On va rajouter une ligne avant l'appel de (command

(setq pt1 (trans pt1 0 1))

Voila ça marche...(si vous n'avez pas effacer le bon cercle, vous en avez 2 superposés
Le point pt1 à été converti depuis le système de coordonnée générale vers le système de coordonnée courant. (cf le guide de ref )

Conclusion

Quand on à recours à (command, il faut se méfier des SCU et utiliser trans pour convertir les coordonnées. La vie serai belle si on pouvais s'en passé, mais il y a des cas ou on ne peu pas faire autrement.

Exercice.

à titre d'exercice, essayer de faire un programme qui va placer des cercles sur toutes les lignes sélectionnées. Inspirez vous pour ça de l'exercice sur les fonctions en créant une fonction "placecercle" et un programme principal qui parcours la liste de sélection comme dans dxf.lsp La seule diférence, c'est qu'il n'y aura pas besoin de retour, la fonction quand elle aura créer de l'entité aura fini son travail, l'interpréteur reviendra dans le programe principal à l'endroit ou on a appeler la fonction.

 




 

 

 

 

lien vers cadXP