Aller au contenu

Remplir une list_box dans une DCL


Messages recommandés

Posté(e)

Bonjour à tous,

 

Je souhaite remplir une list_box sur plusieurs lignes.

Mais je ne sais pas comment ?

 

J'aimerai y insérer une liste de plans et ensuite faire une sélection dans la boite de dialogue pour faire un traitement par la suite.

 

Avez-vous des exemples ?

 

Merci d'avance.

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

Posté(e)

Salut,

 

Regarde le petit LISP GetName (dans ce message), il contient une list_box.

 

Dans le DCL :

 

:list_box{

key="pop";

width=25;

}

 

Dans le LISP, pour remplir la liste (lst) :

 

(start_list "pop")

(mapcar 'add_list lst)

(end_list)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci encore Gile pour ta réactivité.

 

Je regarde ça et je te dirais si ça fonctionne.

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

Posté(e)

Excuse-moi Gile mais c'est pas super claire pour moi...

 

En fait ça marche pas comme je l'ai interprété.

Je te donne donc plus de données.

 

Je souhaite faire une boite de dialogue pour imprimer une liste de plans.

 

J'ai déjà une liste qui se nomme : latt400

Elle contient : (("09 - 1/1" "SYNOPTIQUE DES AERIENS") ("08 - 1/1" "PLAN ENERGIE UNIFILAIRE") ("07 - 1/1" "PLAN DES RESEAUX") ("06 - 1/1" "PLAN DU LOCAL TECHNIQUE") ("05 - 1/1" "PLAN D'ELEVATION PROJETE") ("04 - 1/1" "PLAN D'ELEVATION EXISTANT") ("03 - 1/1" "PLAN DE MASSE PROJETE"))

 

Et j'ai une DCL qui contient :

 

: list_box {key = "present"; height = 20; width = 20; multiple_select = true;}

 

Le tout est de mettre "latt400" dans "present" et ensuite une exploitation de la liste sera effectuée pour imprimer les éléments sélectionnés

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

Posté(e)

Salut,

 

Je pense qu'il faut tout d'abord remanier ta liste avant de la passer à add_list.

La liste doit être une liste de chaînes, en l'état, la tienne esr une liste de listes de chaînes.

 

Donc, soit tu ne gardes que le deuxième élément de chaque sous liste :

 

(start_list "present")

(mapcar '(lambda (x) (add_list (cadr x))) latt400)

(end_list)

 

soit tu concatènes les deux éléments (avec un espace entre, par exemple) :

 

(start_list "present")

(mapcar '(lambda (x) (add_list (strcat (car x) " " (cadr x)))) latt400)

(end_list)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Une fois de plus tu as raison.

 

C'est nickel, il faut juste que je trouve le moyen de remettre à zéro la liste car à chaque fois que je relance le lisp ça s'aditionne. Mais ça ne doit pas être compliqué.

 

Par contre plus dure maintenant,

Comment fait-on pour exploiter les sélections que je fais dans la liste qui s'affiche dans la DCL ?

En effet, je choisi dans la liste les plans que je souhaite imprimer, il faut donc un "action_tile" non ?

 

Merci pour ton aide c'est super sympa.

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

Posté(e)

Après avoir sélectionné plusieurs présentations dans la liste, un (get-tile "présent") retourne une chaîne contenant les index des éléments de la liste séparés par des espaces (ex : "0 2 3" pour les premier, troisième et quatrième éléments)

 

La routine str2lst permet de transformer cette chaîne en liste : (str2lst "0 2 3" " ") -> ("0" "2" "3") et donc de récupérer les élément concernés dans la liste.

 

Un petit exemple, le fichier DCL est créé temporairement, puis supprimé.

 

(defun test (/ latt400 tmp file dcl_id ret)
 (setq	latt400	'(("09 - 1/1" "SYNOPTIQUE DES AERIENS")
	  ("08 - 1/1" "PLAN ENERGIE UNIFILAIRE")
	  ("07 - 1/1" "PLAN DES RESEAUX")
	  ("06 - 1/1" "PLAN DU LOCAL TECHNIQUE")
	  ("05 - 1/1" "PLAN D'ELEVATION PROJETE")
	  ("04 - 1/1" "PLAN D'ELEVATION EXISTANT")
	  ("03 - 1/1" "PLAN DE MASSE PROJETE")
	 )
 )

 ;; créer un DCL temporaire
 (setq	tmp  (vl-filename-mktemp "Tmp.dcl")
file (open tmp "w")
 )
 (write-line
   "test:dialog{label=Test;
     :list_box{key =\"present\"; height=20;width=30; multiple_select=true;}
     ok_cancel;}"
   file
 )
 (close file)

 ;; charger de la boite de dialogue
 (setq dcl_id (load_dialog tmp))
 (if (not (new_dialog "test" dcl_id))
   (exit)
 )

 ;; remplir la liste
 (start_list "present")
 (mapcar '(lambda (x) (add_list (cadr x))) latt400)
 (end_list)

 ;; recupérer les index des présentations sélectionnées
 (action_tile
   "accept"
   "(setq ret (get_tile \"present\")) (done_dialog)"
 )
 (start_dialog)
 (unload_dialog dcl_id)

 ;; supprimer le fichier temporaire
 (vl-file-delete tmp)

 ;; reconstituer la liste des présentations sélectionnées
 (mapcar (function (lambda (x) (nth (atoi x) latt400)))
  (str2lst ret " ")
 )
)


;; str2lst
;; Transforme un chaine avec séparateur en liste de chaines
;;
;; Arguments
;; str : la chaine à transformer en liste
;; sep : le séparateur
;;
;; Exemples
;; (str2lst "a b c" " ") -> ("a" "b" "c")
;; (str2lst "1,2,3" ",") -> ("1" "2" "3")
;; (mapcar 'read (str2lst "1,2,3" ",")) -> (1 2 3)

(defun str2lst (str sep / pos)
 (if (setq pos (vl-string-position (ascii sep) str))
   (cons (substr str 1 pos)
  (str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )
   (list str)
 )
) 

 

 

[Edité le 3/11/2007 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Super cool,

 

Merci de ton aide.

J'aime bien ton système de DCL temporaire, j'avais pensé le faire me tu m'as devancé.

 

Je vais tester tout ça.

A+.

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité