Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

Gile - g réussi à insérer les codes (voir ce que j'aimerais à la fin)

6 RÉPONSES 6
Répondre
Message 1 sur 7
amartaif
308 Visites, 6 Réponses

Gile - g réussi à insérer les codes (voir ce que j'aimerais à la fin)

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. 

 

 

6 RÉPONSES 6
Message 2 sur 7
_gile
en réponse à: amartaif

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.



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 3 sur 7
amartaif
en réponse à: _gile

Bonjour Gile, Tes remarques sont pertinentes. Je sais qu'il faut commencer petit pour arriver à faire du lisp et le comprendre au final. Mais, je dois mettre souvent les plans à la chartre graphique et j'aimerais donc automatiser cette tâche pour m'éviter un travail fastidieux. C'est pour cela que je compte sur toi pour finir ce lisp au + vite (car je t'avoue que ça m'envahit un peu, j'y pense souvent). Je peux pas t'expliquer Gile, tant que ce lisp n'est pas terminé, je n'arrive pas à passer à autre chose. Une fois terminé, je me consacrerais à faire des choses simples et les tester pour apprendre réellement le lisp. Si tu pouvais m'aider à enfin le terminer,ça m'aiderait énormément dans mon quotidien au travail. Merci par avance Gile.
Message 4 sur 7
_gile
en réponse à: amartaif

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.



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 5 sur 7
amartaif
en réponse à: _gile

Bonjour Gile, merci de prendre du temps pour me répondre. en plus d'être un expert elite, tu es également voyant. Je plaisante bien sûr. Je ne te cache que j'aimerais bien voir ce lisp terminé et fonctionné, mais c vrai que sans, ton aide, ca va être dur même très dur. Tu as encore raison concernant la fiabilité, si tu as une idée pour rendre cette étape plus fiable, je suis preneur. On peut faire ce lisp étape par étape, je suis patient. A l'heure actuelle, j'aimerais connaitre la ou les fonction(s) qui permet(tent) de récupérer les éléments que je sélectionne sur la liste des objets du calque zéro dans la boite de dialogue. Tu sais Gile s'il y a des Experts Elite, c'est qu'il y a également des novices. « Savoir partager son temps, c'est savoir jouir de la vie. » de Baltasar Gracian y Morales Alors merci aux experts. merci pour ton aide.
Message 6 sur 7
_gile
en réponse à: amartaif

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;
}

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 7 sur 7
amartaif
en réponse à: _gile

Salut Gile, une petite question, non je rigole bien sûr. Merci infiniment pour les codes. je suis tellement content que j'ai préféré de suite te remercier que de le tester. merci encore Gile. Je vais me mettre sérieusement sur la programmation lisp. Si je ne comprends le fonctionnement d'une fonction, pourrrais je te demander de me l'expliquer. Merci infiment Gile.

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums