Changement de calque

Bonjour à tous, bonjour Maxence,comme il faut un premier pour essuyer les plâtres....je me lance.

J'ai 2 LISP's que je voudrais compiler (en rajoutant une "bricole" au passage).

1 ière routine me permettant de tout nettoyer sur mon dessin, sauf des cercles d'un Ø donné.
2 ième routine me permettant de choisir un ordre sur ces cercles.

Sur la 1ière routine je voudrais qu'au moment du "nettoyage", tous les cercles restant soit mis dans un calque UT1. Si le calque UT1 (Trait continu blanc, genre calque 0...) n'existe pas, il sera créé.

Déroulement du programme :
1 - Je clique sur un icône (déja créé lien avec la routine)
2 - Je clique sur 1 cercle (nettoyage + mis sous UT1 (créé si non existant))
3 - Les cliques suivant je choisi l'ordre

Est-il possible de rajouter un message (après avoir cliquer sur l'icône) en haut à gauche de l'écran par exemple, pour suivre les étapes du déroulement. En fait, faire apparaitre ce qui se trouve sur la ligne commande:
"NETTOYAGE + UT1" (arrêt après le clique sur le cercle)
puis "ORDRE" (pendant tout le déroulement de la 2ième routine).

En relisant mon souhait, je me rend compte que j'en demande beaucoup, mais si quelqu'un peut s'y pencher dessus.

1 ière routine :


(defun c:nettoyeur ()
((lambda ( / ent dxf_ent js jsc n)
(while (null (setq ent (entsel "\nDésigner un cercle type: "))))
(setq dxf_ent (entget (car ent)))
(cond
((eq (cdr (assoc 0 dxf_ent)) "CIRCLE")
(setq
js (ssget "_x" (list (assoc 410 dxf_ent) (assoc 67 dxf_ent)))
jsc (ssget "_x" (list (assoc 0 dxf_ent) (assoc 410 dxf_ent) (assoc 67 dxf_ent) (assoc 40 dxf_ent)))
n -1
)
(repeat (sslength jsc)
(ssdel (ssname jsc (setq n (1+ n))) js)
)
(if js (command "_.erase" js ""))
)
)
))
)

2 ième routine :


(defun crdre ( / nw_js js n i l_dxf h)
(setq nw_js (ssadd) i 0)
(while (setq js (ssget"_:S"))
(ssadd (ssname js 0) nw_js)
(setq l_dxf (entget (ssname js 0)))
(setq h (* (cdr (assoc 40 l_dxf)) 0.5) i (1+ i))
(entmake
(list
'(0 . "TEXT")
'(10 0. 0. 0.)
(cons 11 (cdr (assoc 10 l_dxf)))
(cons 40 h)
(cons 1 (itoa i))
'(72 . 1)
'(73 . 2)
)
)
)
(setq js (ssget "_X"))
(cond
(js
(repeat (setq n (sslength js))
(ssadd (ssname js (setq n (1- n))) nw_js)
)
)
)
(cond
(nw_js
(setq n -1)
(repeat (sslength nw_js)
(entmake (setq l_dxf (entget (ssname nw_js (setq n (1+ n))))))
(entdel (cdar l_dxf))
)
)
)
(prin1)
)

Mes remerciements sont sincères.

Bonsoir à tous, bonsoir Maxence. Mon message est imbuvable. Le blabla à la limite, mais une routine sans mise en forme... Ai-je loupé quelque chose ? Merci pour ton aide

Pour que ton message soit correctement formaté, il faut choisir Filtered HTML dans la rubrique format d'entrée.

Tu peux également utiliser la balise <code lang="lisp">...</code> pour mettre en surbrillance ton code AutoLISP.

Merci Maxence !
Une aide suite à mon message...?

Voilà : vite fait et sans garantie !


(defun c:nettoyeur (/ ent dxf_ent js jsc n ename)
(while (null (setq ent (entsel "\nDésigner un cercle type: "))))

;; Création du calque UT1 si il n'existe pas encore
(entmake
'(
(0 . "LAYER") ; Type d'entité
(100 . "AcDbSymbolTableRecord") ; Table des symboles
(100 . "AcDbLayerTableRecord") ; Table des calques
(2 . "UT1") ; Nom du calque
(6 . "CONTINUOUS") ; Type de ligne
(62 . 7) ; Couleur
(70 . 0) ; Etat
(290 . 1) ; Imprimer
(370 . 0) ; Epaisseur de ligne
)
)

(setq dxf_ent (entget (car ent)))
(cond
((eq (cdr (assoc 0 dxf_ent)) "CIRCLE")
(setq
js (ssget "_x" (list (assoc 410 dxf_ent) (assoc 67 dxf_ent))) ; Sélectionne tous les cercles de l'espace courant
jsc (ssget "_x"
(list
(assoc 0 dxf_ent) ; Type d'entité (cercle)
(assoc 410 dxf_ent) ; Présentation
(assoc 67 dxf_ent) ; Espace
(assoc 40 dxf_ent) ; Rayon
)
) ; Sélectionne tous les cercles de l'espace courant ayant le même rayon que le cercle type
n -1
)
(repeat (sslength jsc)
(ssdel (ssname jsc (setq n (1+ n))) js)
)
(if js
(command "_.erase" js "")
)
)
)

;; Passage des cercles dans le calque UT1
(setq n 0)
(while (setq ename (ssname jsc n))
(setq elist (entget ename))
(entmod (subst (cons 8 "UT1") (assoc 8 elist) elist))
(setq n (1+ n))
)

;; Ajout des numéros d'ordre
(setq
nw_js (ssadd)
i 0
)
(while (setq js (ssget "_:S"))
(ssadd (ssname js 0) nw_js)
(setq l_dxf (entget (ssname js 0)))
(setq h (* (cdr (assoc 40 l_dxf)) 0.5)
i (1+ i)
)
(entmake
(list
'(0 . "TEXT")
'(10 0. 0. 0.)
(cons 11 (cdr (assoc 10 l_dxf)))
(cons 40 h)
(cons 1 (itoa i))
'(72 . 1)
'(73 . 2)
)
)
)
(setq js (ssget "_X"))
(cond
(js
(repeat (setq n (sslength js))
(ssadd (ssname js (setq n (1- n))) nw_js)
)
)
)
(cond
(nw_js
(setq n -1)
(repeat (sslength nw_js)
(entmake (setq l_dxf (entget (ssname nw_js (setq n (1+ n))))))
(entdel (cdar l_dxf))
)
)
)
(princ)
)

Bonjour Maxence, bonjour à tous.
Pour info, je viens de commander le livre "Programmer AUTOCAD" chez eyrolles, mon ignorance ne sera peut-être qu'un vieux souvenir......?!

Voila ce que j'avais de mon côté:


(defun c:nettoyeur ( / ent dxf_ent js jsc n)
(while (null (setq ent (entsel "\nDésigner un cercle type: "))))
(setq dxf_ent (entget (car ent)))
(cond
((eq (cdr (assoc 0 dxf_ent)) "CIRCLE")
(setq
js (ssget "_x" (list (assoc 410 dxf_ent) (assoc 67 dxf_ent)))
jsc (ssget "_x" (list (assoc 0 dxf_ent) (assoc 410 dxf_ent) (assoc 67 dxf_ent) (assoc 40 dxf_ent)))
n -1
)
(repeat (sslength jsc)
(ssdel (ssname jsc (setq n (1+ n))) js)
)
(if (not (tblsearch "LAYER" "UT1"))
(entmake '((0 . "LAYER")
(100 . "AcDbSymbolTableRecord")
(100 . "AcDbLayerTableRecord")
(2 . "UT1")
(70 . 0)
(62 . 7)
(6 . "Continuous")
(290 . 1)
(370 . -3)
)
)
)
(if js
(repeat (setq n (sslength js))
(entdel (ssname js (setq n (1- n))))
)
)
(if jsc
(repeat (setq n (sslength jsc))
(entmod (subst '(8 . "UT1") (assoc 8 (setq dxf_ent (entget (ssname jsc (setq n (1- n)))))) dxf_ent))
)
)
)
)
(setq nw_js (ssadd) i 0)
(while (setq js (ssget"_:S"))
(ssadd (ssname js 0) nw_js)
(setq l_dxf (entget (ssname js 0)))
(setq h (* (cdr (assoc 40 l_dxf)) 0.5) i (1+ i))
(entmake
(list
'(0 . "TEXT")
'(10 0. 0. 0.)
(cons 11 (cdr (assoc 10 l_dxf)))
(cons 40 h)
(cons 1 (itoa i))
'(72 . 1)
'(73 . 2)
)
)
)
(setq js (ssget "_X"))
(cond
(js
(repeat (setq n (sslength js))
(ssadd (ssname js (setq n (1- n))) nw_js)
)
)
)
(cond
(nw_js
(setq n -1)
(repeat (sslength nw_js)
(entmake (setq l_dxf (entget (ssname nw_js (setq n (1+ n))))))
(entdel (cdar l_dxf))
)
)
)
(prin1)
)

Au moment du "click" sur le 1ier cercle (après "nettoyage") pourrait-on avoir:
- le déplacement du centre du cercle N°1 sur le SCU général (0,0)
- un zoom étendu.

Bonjour à tous, bonjour Maxence
pour le zoom étendu, j'ai juste inséré:

[geshifilter-code lang="lisp"](command "zoom" "et") [/geshifilter-code]

par contre pour recentrer le scu sur le 1ier cercle "cliqué",
j'ai:

[geshifilter-code lang="lisp"] (setq p1 (cdr (assoc 10 (entget ent))))
(command "scu" "déplacer" P1 "") [/geshifilter-code]

mais tu as fait ceci :

[geshifilter-code lang="lisp"](while (null (setq ent (entsel "\nDésigner un cercle type: "))) [/geshifilter-code]

et je n'arrive pas à faire cohabiter les 2 ?!

Merci pour ton aide

Voila, s'est fait.

Problème:
Si je relance une deuxième fois la routine sur le même dessin (par exemple erreur de saisie la 1ière fois),le SCU ne se recentre pas sur P1.

Autre Question :
Lors du 1ier clik sur le cercle type, peut-on démarrer le choix de l'ordre (en fait le SCU se recentre sur le tube N°1 - un deuxième click n'est pas nécessaire, le 2ième click indiquera le 2ième tube.....)


(defun c:nettoyeur ( / ent dxf_ent js jsc n nw_js i l_dxf h)
(command "zoom" "et")
(while (null (setq ent (entsel "\nDésigner un cercle type: "))))
(setq dxf_ent (entget (car ent)))
(setq p1 (cdr (assoc 10 (entget (car ent)))))
(command "scu" "déplacer" p1 "")
(cond
((eq (cdr (assoc 0 dxf_ent)) "CIRCLE")
(setq
js (ssget "_x" (list (assoc 410 dxf_ent) (assoc 67 dxf_ent)))
jsc (ssget "_x" (list (assoc 0 dxf_ent) (assoc 410 dxf_ent) (assoc 67 dxf_ent) (assoc 40 dxf_ent)))
n -1
)
(repeat (sslength jsc)
(ssdel (ssname jsc (setq n (1+ n))) js)
)
(if (not (tblsearch "LAYER" "UT1"))
(entmake '((0 . "LAYER")
(100 . "AcDbSymbolTableRecord")
(100 . "AcDbLayerTableRecord")
(2 . "UT1")
(70 . 0)
(62 . 7)
(6 . "Continuous")
(290 . 1)
(370 . -3)
)
)
)
(if js
(repeat (setq n (sslength js))
(entdel (ssname js (setq n (1- n))))
)
)
(if jsc
(repeat (setq n (sslength jsc))
(entmod (subst '(8 . "UT1") (assoc 8 (setq dxf_ent (entget (ssname jsc (setq n (1- n)))))) dxf_ent))
)
)
)
)
(command "zoom" "et")
(setq nw_js (ssadd) i 0)
(while (setq js (ssget"_:S"))
(ssadd (ssname js 0) nw_js)
(setq l_dxf (entget (ssname js 0)))
(setq h (* (cdr (assoc 40 l_dxf)) 0.5) i (1+ i))
(entmake
(list
'(0 . "TEXT")
'(10 0. 0. 0.)
(cons 11 (cdr (assoc 10 l_dxf)))
(cons 40 h)
(cons 1 (itoa i))
'(72 . 1)
'(73 . 2)
)
)
)
(setq js (ssget "_X"))
(cond
(js
(repeat (setq n (sslength js))
(ssadd (ssname js (setq n (1- n))) nw_js)
)
)
)
(cond
(nw_js
(setq n -1)
(repeat (sslength nw_js)
(entmake (setq l_dxf (entget (ssname nw_js (setq n (1+ n))))))
(entdel (cdar l_dxf))
)
)
)
(prin1)
)

Merci pour ton aide

Bonjour Maxence, bonjour à tous

Si je lance la routine une 2ième fois, le SCU ne se recentre pas sur P1 ?


(setq p1 (cdr (assoc 10 (entget (car ent)))))
(command "scu" "déplacer" p1 "")

Une réponse à mon Mail précédent...?

Merci pour ton aide

C'est normal, les commandes AutoCAD fonctionnent avec le SCU, alors que ton point p1 est exprimé en SCG. Quand tu lances ta routine la deuxième fois, le SCU est déporté par rapport au SCG et les décalages d'additionnent. Il faut passer ton point p1 du SCG au SCU avec la fonction trans :


(command "scu" "déplacer" (trans p1 0 1) "")

Merci pour ton aide.

Add new comment