le lisp : (defun c:MyFirst ( /) (setq ss (ssadd)) (setq y nil) (if (not (setq ss (ssget "_X" '((8 . "0"))))) (alert "Aucun objet sur le calque zéro") (repeat (setq n (sslength ss)) (setq y (cons (cdr (assoc 0 (entget (ssname ss (setq n (1- n)))))) y ) ) ) ) (setq r nil) (setq l (tblnext "layer" T)) (while (setq l (tblnext "layer")) (setq r (cons (cdr (assoc 2 l)) r)) ) ;|«Visual LISP© Format Options» (120 2 1 2 nil "Ende von " 60 20 1 1 0 nil nil nil T) ;*** NE PAS AJOUTER de texte au-dessous du commentaire! ***|; ;;; permet de sortir du programme proprement (sans générer un message d'erreur) (setq dialogLoaded T dialogShow T ) ; Load the dialog box. Set up error checking to make sure ; the dialog file is loaded before continuing (if (= -1 (setq dcl_id (load_dialog (findfile "MyDialogs.dcl")))) (progn (princ "\nCannot load MyDialogs.dcl") (setq dialogLoaded nil) ) ) (if (and dialogLoaded (not (new_dialog "MyFirst" dcl_id)) ) ; SINON (progn (princ "\nCannot show dialog MyFirst") (setq dialogShow nil) ) ) (if (and dialogLoaded dialogShow) (progn ; Set the initial state of the tiles (start_list "List1") (mapcar 'add_list y) (end_list) (start_list "List2") (mapcar 'add_list r) (end_list) (action_tile "accept" (strcat "(progn (setq NUMDEP (get_tile \"NUMDEP\"))" "(setq PREF (get_tile \"PREF\"))" "(setq SUFIX (get_tile \"SUFIX\"))" "(setq INCRE (get_tile \"INCRE\"))" "(setq VAR_CANCEL nil)" "(done_dialog))" ) ) (action_tile "cancel" "(setq VAR_CANCEL nil)(done_dialog)") (start_dialog) (unload_dialog dcl_id) ) ) (princ) )
le fichier DCL:
//--------------------------------------------------------------------------------------------------------- // MyFirst //--------------------------------------------------------------------------------------------------------- MyFirst : dialog {label="change les objets de calques by Amar - V1.00"; : row { : boxed_column {label = "Liste des objets sur le calque zéro"; : list_box { key = "List1";//Value1$ from lsp file multiple_select = true; height = 20; fixed_height = true; width = 30; fixed_width = true; } spacer; } : boxed_column { label = "Liste des calques"; : list_box { multiple_select = false; key = "List2";//Value2$ from lsp file height = 20; fixed_height = true; width = 30; fixed_width = true; } spacer; } } spacer; : row {label = "Onglets"; : button {key = "choisir"; label = "Choisir les objets"; width = 12; fixed_width = true; } : button {key = "transférer"; label = "transférer dans"; width = 12; fixed_width = true; } : button { key = "calques"; label = "choisir calque"; width = 12; fixed_width = true; } } : spacer { width = 1; } key = "Title"; label = "Autocad Message";//Title$ from lsp file spacer; : text { key = "Text1"; label = "";//Message$ from lsp file width = 20; alignment = centered; } spacer; : row { // définit la rangée des boutons OK et Annuler : spacer { width = 0; } : button { key = "accept"; label = "OK"; is_default = true; fixed_width = true; alignment = centered; } : button { // définit le bouton Annuler label = "Annuler"; is_cancel = true; key = "cancel"; width = 8; fixed_width = true; } : spacer { width = 0; } } }
Je t'explique ce que j'aimerais :
En lançant la commande myfirst, si pas d'objets sur calque zéro, une boite d'alerte s'affiche "Aucun objet sur le calque zéro" si objets sur calque zéro, une boite de dialogue s'affiche avec 2 colonnes : une pour la liste des objets sur le calque zéro et une autre pour la liste des calques dans le dessin. Maintenant, j'aimerais réaliser la chose suivante: 1er étape : récupérer certains éléments que je sélectionne sur la colonne " liste des objets sur le calque zéro " 2ième étape : récupérer l'élément concernant le calque que je sélectionne sur la colonne " liste des calques " (ce calque séléctionné correspond au calque où je veux mettre les éléments précédemment sélectionnées de la liste du calque zéro) 3ième étape: par l'intermédiaire d'un bouton "Transfert" situé sur la boite de dialogue, transférés les éléments sélectionnés dans le calque également sélectionné. Ainsi de suite, jusqu'à ce qu'il n'y ait plus d'objets sur le calque zéro. Puis par un 2nd bouton "Quitter"situé sur la boite de dialogue, quitter. J'espère avoir été clair. Merci Gile.
Salut,
Pas mal de Copier/Coller, il me semble...
Variables locales non déclarées dans le LISP, expressions inutiles dans le LISP et le DCL...
Encore une fois, on n'apprend pas correctement un langage de programmation en assemblant des bouts de codes trouvés ici ou là (sutout si on ne comprend pas complètement ce code).
Si tu veux apprendre le LISP, fixe toi des objectifs moins ambitieux au début (sans DCL) et écrit toi même les codes de A à Z.
Teste les, corrige les erreurs, etc. jusqu'à ce que tu sois satisfait du fonctionnement.
Ceci-dit, pour faire ce que tu veux, il faut définir l'action à exécuter quand l'utilisateur clique sur le bouton "Transférer" dans une expression
(action_tile "transférer" ...)
Dans cette expression, il faut récupérer les éléments sélectionnés dans la list_box List1 et celui sélectionné dans List2.
Pour un contrôle list_box, (get_tile ...) retourne une chaine de caractère contenant les indices des éléments sélectionnés dans la liste. Il faut donc convertir la chaîne en nombre entier pour un choix unique ou en une liste de nombres entiers pour un choix multiple et utiliser ces entiers pour retrouver les éléments dans la liste.
Une fois les éléments récupérés, on peut leur attribuer le calque sélectionné, les supprimer de la liste et re-remplir la list_box avec les éléments restant.
Je peux te donner un code qui fonctionne avec cette boite de dialogue, mais je sur presque sûr que si je le fais, je mets le doigt d'ans l'engrenage des demandes successives d'améliorations/modifications.
Je pense que l'idée même d'une boite de dialogue qui affiche les entités sur le calque "0" n'est pas fiable pour ce que tu veux faire. : si plusieurs entités de même type sont sélectionnées, rien ne te permettra de les différentier dans la boite de dialogue.
Petite mise au point, ceux qui ont été choisis par Autodesk pour le programme Expert Elite l'ont été justement pour l'aide qu'ils apportaient sur les forums.
Je te donnes les codes LISP et DCL qui fonctionnent, à toi de les adaoter à ton besoin.
Le LISP corrigé.
(defun c:MyFirst (/ ss n entLst lay lNames dcl_id stat ind1 ind2 ents elst ind procLst) (if (not (setq ss (ssget "_X" '((8 . "0"))))) (alert "Aucun objet sur le calque zéro") (progn (repeat (setq n (sslength ss)) (setq entLst (cons (ssname ss (setq n (1- n))) entLst ) ) ) (while (setq lay (tblnext "layer" (not lay))) (setq lNames (cons (cdr (assoc 2 lay)) lNames)) ) (setq lNames (cdr (reverse lNames))) (if (minusp (setq dcl_id (load_dialog (findfile "MyDialogs.dcl")))) (princ "\nImpossible de charger MyDialogs.dcl") (progn (setq stat 2) (while (< 1 stat) (if (not (new_dialog "MyFirst" dcl_id)) (progn (princ "\nImpossible d'afficher MyFirst") (setq stat 0) ) (progn (setq ind1 "" ind2 "" ) (start_list "List1") (mapcar '(lambda (e) (add_list (cdr (assoc 0 (entget e))))) entLst) (end_list) (start_list "List2") (mapcar 'add_list lNames) (end_list) (mode_tile "transférer" 1) (action_tile "List1" "(setq ind1 $value) (if (or (= ind1 \"\") (= ind2 \"\")) (mode_tile \"transférer\" 1) (mode_tile \"transférer\" 0) )" ) (action_tile "List2" "(setq ind2 $value) (if (or (= ind1 \"\") (= ind2 \"\")) (mode_tile \"transférer\" 1) (mode_tile \"transférer\" 0) )" ) (action_tile "choisir" "(alert \"Aucune action liée à ce bouton\")") (action_tile "calques" "(alert \"Aucune action liée à ce bouton\")") (action_tile "transférer" "(done_dialog 2)") (action_tile "accept" "(done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") (setq stat (start_dialog)) (cond ((= stat 2) (setq lay (nth (atoi ind2) lNames) ents nil ) (while (/= ind1 "") (setq ind (atoi ind1) ent (nth ind entLst) ents (cons ent ents) ind1 (substr ind1 (+ 2 (strlen (itoa ind)))) ) ) (foreach e ents (setq entLst (vl-remove e entLst))) (setq procLst (cons (cons lay ents) procLst)) ) ((= stat 1) (foreach grp procLst (foreach e (cdr grp) (setq elst (entget e)) (entmod (subst (cons 8 (car grp)) (assoc 8 elst) elst)) ) ) ) ) ) ) ) (unload_dialog dcl_id) ) ) ) ) (princ) )
Le DCL (j'ai juste supprimé quelques trucs inutiles. les boutons 'Choisir les objets' et 'choisir calque' ne servent pas en l'état)
//--------------------------------------------------------------------------------------------------------- // MyFirst //--------------------------------------------------------------------------------------------------------- MyFirst : dialog {label="change les objets de calques by Amar - V1.00"; : row { : boxed_column { label = "Liste des objets sur le calque zéro"; : list_box { key = "List1";//Value1$ from lsp file multiple_select = true; height = 20; fixed_height = true; width = 30; fixed_width = true; } spacer; } : boxed_column { label = "Liste des calques"; : list_box { multiple_select = false; key = "List2";//Value2$ from lsp file height = 20; fixed_height = true; width = 30; fixed_width = true; } spacer; } } spacer; : row {label = "Onglets"; : button {key = "choisir"; label = "Choisir les objets"; width = 12; fixed_width = true; } : button {key = "transférer"; label = "transférer dans"; width = 12; fixed_width = true; } : button { key = "calques"; label = "choisir calque"; width = 12; fixed_width = true; } } spacer; ok_cancel; }
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.