Le Coin des AutoCADiens

Le site de langue française des utilisateurs & développeurs pour AutoCAD

ATA ATA Astuces, Trucs et routines pour AutoCAD

Les trucs et astuces sont classés par ordre d'arrivée.

Mode d'emploi des lisps
Certaines des routines proposées comportent des routines en AutoLISP.
Faites un copier/coller des lignes comprises entre "Début fichier" et "Fin fichier" dans un fichier texte à l'aide, par exemple, du bloc-notes de Window.
Baptisez votre fichier du nom de votre choix, mais obligatoirement avec l'extention .lsp.
Faites la même chose avec les éventuels fichiers dcl. Mais dans ce cas, vous devez respecter le nom de fichier imposé (dans le programme lisp) avec l'extention .dcl.

Chargement des lisps
Placez vos fichiers .lsp et .dcl dans un répertoire accessible par AutoCAD : Par exemple dans un répertoire routines que vous déclarez, après l'avoir créé, en passant (dans AutoCAD) par Outils/Options/ Onglet Fichiers puis Chemin de recherche de fichiers de support puis bouton Ajouter. A défaut vous pouvez placez ces fichiers dans le répertoire Support d'AutoCAD.
Quand vous êtes dans votre dessin, pour charger la routine tapez
	(load "nom_de_fichier_lisp")
y compris les parenthèses et les guillemets. Par exemple, pour l'astuce numero 3, on tapera exactement:
	(load "maille2s")
en minuscules ou majuscules. Il est inutile de taper l'extension .lsp.
Pour lancer le programme, tapez le nom de la commande qui vous est indiqué dans les explications ou au chargement.
Pour un chargement automatique des routines voir la page Charger Applis.

01 - Chrono
Vainqueur 1ère série.

Envoi de Murielle-Charlotte Ogor - Ploumoguer (29) mc.ogor@free.fr

chrono La routine Chrono permet de mesurer, au centième de seconde près, le temps passé pour exécuter une commande AutoCAD.
Lorsque la commande désirée est exécutée, le temps passé est alors affiché dans une boîte de dialogue.
Très utile pour comparer les machines d'un réseau, etc...
Pour toutes versions d'AutoCAD, sauf LT.
; -------------- Début du fichier .lsp ----------------------------------------------
;;; Routine de Murielle-Charlotte Ogor
(defun C:Chrono (/ Cde Temps1 Temps2 T_passe Result) 
  (setq Cde (getstring T "\nCommande AutoCAD à chronométrer : "))
  (setq Temps1 (* 86400 (getvar "tdusrtimer")))
  (command Cde) 
  (setq Temps2 (* 86400 (getvar "tdusrtimer")))
  (setq T_passe (- Temps2 Temps1))   
  (setq Result (strcat (strcase Cde) " - Temps passé : " (rtos T_passe 2 2) " secondes."))
  (alert Result)
  (princ)
) 
(princ "\n\Tapez chrono pour lancer la routine.")
(princ)
; -------------- Fin du fichier .lsp ----------------------------------------------
 
02 - Filtre Calque
Envoi de Philippe CAPDEVILA - St Vallier de Thiey (06) philippe.capdevila@free.fr

filtre calque Une petite fonction très pratique qui permet, après avoir lancé une commande, de sélectionner des entités en fonction de leur calque via une petite boite de dialogue.
Ce filtre marche avec presque toutes les commandes :
Exemples : effacer copier déplacer rotation etc..

Mise en marche
- Écrire cette fonction dans le fichier "acad.lsp" - Créer le fichier "selec.dcl" dans votre répertoire autocad - Après avoir lancé une commande, Taper (sel_pl) pour sectionner les entités ou, vous pouvez ajouter la ligne ci-dessous dans le fichier menu "acad.mns" dans le paragraphe .
***POP0
**SNAP
        [Menu curseur &accrochage aux objets]

        [filtre Calque](sel_pl)
Après avoir relancé autocad, vous aurez accès à cette fonction avec Ctrl+bouton droit de la sourie
; -------------- Début du fichier .lsp ----------------------------------------------
(defun sel_pl()
     (setq lb (list))
     (setq lb (cons (cdr(assoc 2 (tblnext "LAYER" T))) lb))
     (while
          (setq X (cdr (assoc 2 (tblnext "LAYER"))))
          (setq lb (cons X lb))
     )
     (setq lb (acad_strlsort lb))
     (setq ll (length lb))

     (setq id_dcl (load_dialog "selec.dcl"))
     (if(not(new_dialog "SELEC" id_dcl))
          (exit)
     )

     (start_list "plselec" )
     (mapcar 'add_list lb )
     (end_list)
     (action_tile "plselec" "(setq pl (nth (atoi $value) lb))")
     (start_dialog)
     (unload_dialog id_dcl)

     (setq sel (ssget (list(cons 8 pl))))

)
;fin du programme
; -------------- Fin du fichier .lsp ----------------------------------------------

Ecrire dans le fichier "selec.dcl" ce qui suit
// -------------- Début du fichier selec.dcl ----------------------------------------------
SELEC:dialog { label="FILTRES";
		:list_box { label = "Liste des Calques"; key = "plselec";
					width = 18;  list = lb;
			  }
	        ok_cancel;
	     }
// -------------- Fin du fichier selec.dcl ----------------------------------------------
03 - Raccord Carré - Cercle en solide
Envoi de Eric Giffard - Clermond Ferrand (63) eric.g@nextmedia.fr http://www.nextmedia.fr

carrerond Comment tranformer un carré en rond ?
  Avec AutoCAD, je joins un un lisp pour le faire.

Comment j'ai fait ?
J'ai dessiné un carré 35x35
Au dessus (40 en Z) un arc en demi-cercle.
Le carré est coupé en 2 points par les milieux opposés, ce qui fait 1 polyligne en U.
J'ai fait 2 lignes : Des extrémités (à la coupure) jusqu'aux extrémités de l'arc.
En tout j'ai donc 1 arc, 1 polyligne et 2 lignes
J'ai fait une surface gauche entre l'arc, les 2 lignes et la polyligne.
Penser à SURFTAB1 et SURFTAB2 : nombre de mailles en M et en N.
Ne pas mettre une valeur trop grande , pour de pas mettre la mémoire à genoux.
Lancement du lisp joint : il génère des solides ACIS à partir de surfaces gauches
Il faut taper la commande M2S, sélectionner la surface et donner l'épaisseur désirée.
Faire un mirroir de l'objet et après avec la commande union, tout devient facile.

Fichier lisp maille2s.lsp
04 - Echelle et cotes
Envoi de Pierre Louiset - DDE du Calvados pierre.louiset@i-carre.net

chrono Voici un autoéxecutable zip qui contient un petit programme que je me suis fait. Cette routine permet la création d'un style de cote en choisissant l'échelle de sortie.
On peut ainsi avoir des échelles de sortie (multi fenêtrages) en conservant l'homogénéïté des cotes du dessin.
Il suffit de créer un calque par style de cote et ensuite de coter les différentes vues aux échelles de sortie voulues.
Les styles de cotes créés sont faits pour des dessins réalisés en mètre et une cotation faite en Espace Objet.
Il faut juste mettre toujours la même valeur dans "Hauteur du texte voulue en sortie en mm".
Il faut indiquer dans le programme echelle.lsp, ligne 21, le chemin où ce situe le fichier Echelle.txt

Nouvelle version du 03/01/01
Fichier zip contenant Echelle.lsp, Echelle.dcl, Echelle.txt
05 - Symbole Diamètre
Envoi de Philippe CAPDEVILA - St Vallier de Thiey (06) philippe.capdevila@free.fr

Symbole Dia Cette commande permet de mettre, automatiquement, le symbole "diamètre" sur une ou plusieurs cotations que l'utilisateur choisit, sans passer par l'éditeur.
; -------------- Début du fichier .lsp ----------------------------------------------
(defun c:diam()

     (setq x 0 )               ; mise à zero du compteur
     (setq sel (ssget '((0 . "DIMENSION"))))  ; selection avec filtre sur les cotations
     (repeat (sslength sel)   ; boucle sur l'ensemble de la selection
          (setq ent (entget(ssname sel x)))  ; nom de l'entité
          (setq a (cdr(assoc 1 ent)))  ; récupération du texte de cotation
          (if (= a "") 		; Ecriture du symbole diamêtre selon les cas
               (setq txt  (strcat "%%c" "<>") )
               (setq txt  (strcat "%%c"(cdr(assoc 1 ent)) ) ) 
          )
          (entmod (subst (cons 1 txt) (assoc 1 ent) ent)) ; mise à jour de l'entité
          (setq x (+ x 1))   ; incrémentation du compteur
     )
)
; -------------- Fin du fichier .lsp ----------------------------------------------
06 - Ajouter des tolérances
Envoi de Philippe CAPDEVILA - St Vallier de Thiey (06) philippe.capdevila@free.fr

Tolérances Cette commande permet de créer une tolérance mécanique sur une cotation sans passer par l'éditeur ni par un style de cotation.
Idéal pour la mécanique.
Le résultat dépend de votre style cote surtout de la variable  "DIMTXT".
Cette commande fonctionne avec l'éditeur de texte interne.
; -------------- Début du fichier .lsp ----------------------------------------------
(defun c:tole()
  (setq sel nil fact 0.6)  	; la variable fact determine la hauteur du
				; texte de tolérance par rapport la cotation
  (setvar "cmdecho" 0)
  (setq ent (entget(car(entsel "\nSelection d'une cotation :" ))))
  (if (= "DIMENSION" (cdr(assoc 0 ent)))
    (progn
      (setq style_cot (cdr (assoc 3 ent)))  	; style de cotation
      (setq txt (cdr(assoc 1 ent)))  		; valeur de la cotation
      (if (= "" txt)(setq txt "<>"))
      (command "cot" "res" style_cot "sor") ; activation du style corespondant
      (setq ech_global (getvar "DIMSCALE")) ; échelle globale de la cotation
      (setq h_txt (getvar "DIMTXT"))  	     ; hauteur du texte de cotation
      (setq tol1 (getstring "\nTolérance supérieure : "))
      (setq tol2 (getstring (strcat "\nTolérance inférieure <" tol1"> :")))
      (if (or (= tol1 tol2)(=  "" tol2))
        (setq tex (strcat  txt "%%P" tol1))
        (setq tex (strcat  txt "\\H" (rtos(* h_txt ech_global fact) 2 2) 
			       ";\\S" tol1 "^" tol2 ";"))
      )
      (entmod (subst (cons 1 tex)(assoc 1 ent) ent))      ; Màj cotation
      (princ)
    )
    (princ (strcat "\nEntité et une " (cdr(assoc 0 ent))))
  )
  (princ)
)
; -------------- Fin du fichier .lsp ----------------------------------------------
07 - Des hachures qui retrouvent leur association
Envoi de Eric Giffard - Clermond Ferrand (63) eric.g@nextmedia.fr http://www.nextmedia.fr

carrerond Un hachurage complexe. On gèle le calque de hachures.
On modifie le contour et on libère les hachures. Bbien sûr, elles n'ont pas suivi.
Comment les récupérer sans les refaire ?

  • Sélectionner la hachure,
  • Clic droit sur Propriétés,
  • Modifier une propriété : l'angle par exemple (et valider)
  • Remettre la propriété comme elle était.
et les hachures sont refaites...
Celà ne fonctionne pas en utilisant l'outil d'édition des hachures.
Testé en AutoCAD 2000 et AutoCAD LT2000.
08 - La sélection rapide sélectionne les entités gelées
Envoi de Eric Giffard - Clermond Ferrand (63) eric.g@nextmedia.fr http://www.nextmedia.fr

C'est plutôt un bug à mon avis ...
Des polylignes et cercles dans un calque gelé.
D'autres polylignes et cercles dans un calque NON gelé.
Propriétés puis cliquez sur Sélection rapide.
Sélectionnez les polylignes par les champs de la boîte de dialogue.
Modifiez l'épaisseur
Vous pourrez remarquer que les polylignes du calque gelé ont aussi été modifiées.
Pour pourrez faire aussi le test en sélectionnant les cercles et en modifiant le rayon par exemple.
La seule protection que l'on peut apporter aux calques dans ce cas est le verrouillage.
09 - Copie d'attributs
Envoi de Patrick Dewevre - patrick_dewevre@spie-trindel.fr

Patrick nous propose, sans plus d'explications, une routine pour copier les attributs vers d'autres blocs.
En fait, c'est tout simple :
Chargez le programme,
Tapez CAT,
Cliquez sur le bloc qui contient les bons attributs,
Sélectionnez les blocs auquels vous désirez copier les attributs.

Fichier lisp cat.lsp
201 - Rotation de textes
Envoi de Vincent LUX - Strasbourg - v.lux@mosaiques.fr http://www.mosaiques.fr

Rotation Cette commande permet d'effectuer une rotation des éléments de type TEXT et MTEXT par rapport à leur point d'insertion suivant un angle donné par l'utilisateur.
; -------------- Début du fichier .lsp ----------------------------------------------
; PROGRAMME AUTOLisp : RTEXT.LSP
; VERSION : 08/01/00
;
;------------------------------------------------------------------------------


(defun c:rtext (/ OldOS SS AA SSL I E A PINS)
  (setq OldOS (getvar "OSMODE"))		; sauvegarde l'état de l'accrochage aux objets
  (setvar "OSMODE" 0)				; plus d'accrochage aux objets automatique

  (setq SS (ssget '((-4 . "<OR")		; crée un jeu de sélection en ne filtrant 
                      (0 . "TEXT") (0 . "MTEXT")	; que les textes
                     (-4 . "OR>"))))
  (if SS					; si l'utilisateur a sélectionné quelque chose
    (progn						  ; alors
      (setq AA (getstring "\nAngle de rotation : "))	    ; entrer l'angle de rotation
      (setq SSL (sslength SS))			   ; déterminer le nombre d'élément du jeu 			
      (setq I 0)				   ; initialiser le compteur I à 0
      (while (< I SSL)				   ; Répéter tant que le compteur I est inférieur 
						     ;	au nombre d'élément du jeu de sélection
        (setq E (ssname SS I))			     ; Récupérer l'adresse du Ième élément du jeu 
        (setq A (entget E))			     ; Récupérer les informations de l'objet 
						     ; à l'adresse ci-dessus
        (setq PINS (cdr (assoc 10 A)))		     ; Extraire le point d'insertion (code 10). 
						     ;	Ce point est stocké en SCU général.
        (setq PINS (trans PINS 0 1))		     ; Il faut donc le transposer dans le SCU local
        (command "_ROTATE" E "" PINS AA)	     ; lancer la cde ROTATION pour le Ième élément, 
					; par rapport au point d'insertion PINS, suivant un angle AA
        (setq I (+ I 1))			     ; Incrémenter le compteur I
      ) ; fin du while				  ; fin répéter
    )						; fin alors
    (alert "Rien n'a été sélectionné !!!")	; sinon afficher un message d'erreur
  )						; fin si
  (setvar "OSMODE" OldOS)	; remettre l'accrochage aux objets comme on l'a trouvé au début
)
; -------------- Fin du fichier .lsp ----------------------------------------------
202 - DELIMIMAGE amélioré
Vainqueur 2ème série.

Envoi de Vincent LUX - Strasbourg - v.lux@mosaiques.fr http://www.mosaiques.fr

A propos de la commande DELIMIMAGE d'Autocad
2 problèmes se posent :
  1. Delimimage ne permet pas de délimiter une image par rapport à un objet.
  2. Lorsqu'on lance la commande DELIMIMAGE, elle passe l'image en avant-plan. Du coup, les objets susceptibles de servir de base à la nouvelle délimitation d'image sont invisibles pour l'opérateur. Donc, pas évident de faire un DELIMIMAGE en se basant sur des objets existants à moins d'être devin.
Rotation Pour rendre la commande DELIMIMAGE un peu plus sympa, le lisp DELIM.LSP qui :
  1. Sélectionne une image tramée
  2. Demande un point intérieur pour créer une polyligne de contour (avec BPOLY) à partir d'objets existants
  3. Extrait les sommets de la polyligne créée
  4. Lance la commande DELIMIMAGE en lui donnant les sommets extraits.
Pour télécharger un exemple complet illustré. Attention 2 280 Ko

; -------------- Début du fichier .lsp ----------------------------------------------
; PROGRAMME AUTOLisp : DELIM.LSP
; OBJET : rendre la commande DELIMIMAGE un peu plus perfomante
;
; VERSION : 27/02/00
;
;------------------------------------------------------------------------------
(defun c:delim ()
  (setq I (entsel "\nSélectionnez une image tramée :"))
  (if I
    (progn
      (setq J  (entget (car I)))
      (setq TYPENT (cdr (assoc 0 J)))
      (if (= TYPENT "IMAGE")
        (progn
          (setq PTemp (getpoint "\nPoint intérieur : "))
          (setq E (bpoly PTemp))
          (if E
            (progn
              (setq A (entget E))
              (setq LL (length A))
              (setq LSOM nil)
              (repeat LL
                (setq ELEM (car A))
                (setq A (cdr A))
                (if (= (car ELEM) 10)
                  (setq LSOM (append LSOM (list (trans (cdr ELEM) 0 1))))
                )
              )
              (command "_DELIMIMAGE" i "_N" "_P")
              (foreach SOM LSOM
                (command SOM)
              )
              (command "")
              (command "_erase" e "")
            )
          )
        )
      )
    )
  )  
)


; -------------- Fin du fichier .lsp ----------------------------------------------
203 - Déplacement rapide (mais approximatif)
Envoi de François Wolanski - reponse.expo.tech@wanadoo.fr

Sélectionnez un objet puis cliquez dessus (mais pas sur la poignée) avec le bouton gauche de la souris en laissant le doigt appuyé pour déplacer l'objet en déplaçant la souris.

204 - D'autres sélections
Envoi de Gérald Lemoine - g-eaux@wanadoo.fr http://www.power-clic.com

Gérald nous offre trois routines d'un coup ! Comme elles concernent un même sujet, je les ai conservées groupées.
Là encore, il n'est pas possible de les illustrer. Essayez-les !
RR


Ah Zut ! j'ai tout mis sur le mauvais calque après avoir, je me le rappelle, dessiné ce détail ... Je ne sais plus qu'est-ce que j'ai fait en premier ou j'ai copié des trucs d'un calque inactif et je ne m'en suis pas rendu compte ou j'avais plus d'entités selectionnées que je croyais, je savais pas où je m'étais arrêté ...

; -------------- Début du fichier .lsp ----------------------------------------------

;;*************************************************************************
;; crée un jeu de selection des entités créées après une entité sélectionnée
(defun c:selafter ( / sel ent )
(setq ent (car (entsel "\nEntité limite")))
(setq sel (ssadd))
 (while (/= nil (setq ent (entnext ent)))
  (setq sel (ssadd ent sel))
 )
 (sssetfirst sel )
)
;;*************************************************************************
;; selectionne les entités créées avant une entité sélectionnée
;
(defun c:selbefore ( / dep sel ent )
 (setq dep (car (entsel "\nEntité limite")))
 (setq sel (ssadd (setq ent (entnext)))) 
 (while (and (/= nil (setq ent (entnext ent)))(not (eq ent dep)))
  (setq sel (ssadd ent sel))
 )
 (sssetfirst sel )
)
;;*************************************************************************
;; montre quelle est la dernière entité créée 
;
(defun c:showlast ( / sel)
 (setq sel (ssadd (entlast)))
 (sssetfirst sel)
)

; -------------- Fin du fichier .lsp ----------------------------------------------
205 - Dessin d'escalier
Envoi de Nicolas Codol - ncodol@mail.pf

Rotation Cette commande permet de dessiner des marches d'escalier.
; -------------- Début du fichier .lsp ----------------------------------------------
; PROGRAMME AUTOLisp : ESCA.LSP
; VERSION : 16/05/01
;
;------------------------------------------------------------------------------


(defun c:esca (/)

	(setq nb (getreal "Nombre de marches :"))
	(setq gir (getreal "Dimension du giron :"))
	(setq htm (getreal "Hauteur d'une marche :"))
	(setq p3 (getpoint "Point d'origine :"))
	(setq test 1)
	(setq nb (+ nb 1))
	(while (<= test nb)
		(setq test (+ test 1))
		(setq p1 p3)
		(setq p2 (list (car p1) (+ (cadr p1) htm)))
		(setq p3 (list (+ (car p2) gir) (cadr p2)))
		(command "_pline" p1 p2 p3 "")
	)
)
; -------------- Fin du fichier .lsp ----------------------------------------------
301 - Entrée de fractions
Envoi de Laurent Campedel - nodal@wanadoo.fr

Pour AutoCad, 1/3 est plus précis que 0.333333333

Ce truc évite d'entrer des valeurs approximatives.

Dans toute commande demandant une entrée numérique, AutoCad accepte une entrée sous forme de fraction.
Un exemple :
  • Décaler une ligne à un tiers d'unité dans une direction.
  • Passer la commande décaler
  • Répondre 1/3 à l'invite « par »
  • Indiquer la ligne, puis le coté de décalage.
Cela ne fonctionne qu'avec une fraction de nombre entier. Si la valeur voulue est 2.5/3, il faut donner 25/30, etc.
Cela fonctionne aussi bien avec les fonctions de dessin qu'avec les fonctions d'édition ou autres.

Note de RR : De la même manière, n'oubliez pas que l'on peut taper directement une opération, au format AUTOLISP, en utilisant des parenthèses.
Exemple : Tapez (* 36 4) au lieu de 144, ou (/ 100.0 7) au lieu de 14.285...

A

Google