; Ce fichier lisp contient toutes les fonctions utiles pour ; CHOISIR LES ECHELLES DES FENETRES CONTENUES DANS LES PRESENTATIONS ; ; la commande à utiliser est : ; - cefp pour : Choisir Echelle Fenêtre Présentation ; ; BLAES Sébastien ; version du 28/07/2009 ; ; les variables écrites en majuscules, sont des variables globales (vl-load-com) ;----------------------------------------; ; nom: get_liste_fen_pre ; ; role: retourne sous forme de liste de ; ; les fenêtres existantes dans la ; ; présentation pre ; ; param: pre => string, nom d'une présen-; ; tation ; ; retour: liste d'objets vla ; ; nil si erreur ; ; date: 28/07/2009 ; ; Sébastien BLAES ; ;----------------------------------------; (defun get_liste_fen_pre( pre / res select ent) (setq res nil) (cond ; on teste le paramètre ((/= (type pre) 'STR) (princ (strcat "\nLe paramètre pre n'est pas un string")) ) ; on cherche les fenêtres contenues dans la présentation pre mais sans la présentation elle-même ((= (setq select (ssget "X" (list '(0 . "VIEWPORT") (cons 410 pre)'(-4 . "")))) nil) (princ (strcat "\nIl n'y a pas de fenêtres dans la présentation " pre".")) ) (t ; on va boucler sur la sélection, afin de stocker les infos (while (/= (setq ent (ssname select 0)) nil) (setq res (cons (vlax-ename->vla-object ent) res)) ; on retire ent de la sélection (ssdel ent select) ) ; while ) ) ; cond res ) ; get_liste_fen_pre ;---------------------------------------; ; nom: get_all_fen ; ; role: retourne sous forme de liste de ; ; listes, toutes les fenêtres pour; ; chaque présentation ; ; param: aucun ; ; retour: liste de listes : ; ; '((pre1 (fen1_1 fen1_2...)) ; ; ... ; ; (preN (fenN_1 fenN_2...))); ; nil si erreur ; ; date: 28/07/2009 ; ; Sébastien BLAES ; ;---------------------------------------; (defun get_all_fen( / res vla_doc vla_pre tmp) (setq res nil vla_doc (vla-get-activedocument (vlax-get-acad-object)) vla_pre (vla-get-Layouts vla_doc) tmp nil ) ; setq ; on boucle sur les présentations pour avoir leur nom et leur position (vlax-for lay vla_pre ; on ne prend pas l'espace objet (setq tmp (cons (list (vla-get-Name lay) (vla-get-taborder lay)) tmp)) ) ; vlax-for (setq tmp (vl-remove (assoc "Model" tmp) tmp)) (cond ((= tmp nil) (princ (strcat "\nIl n'y a pas de présentation")) ) (t (setq ; on va trier le résultat suivant la position de la présentation tmp (vl-sort tmp (function (lambda (e1 e2) (< (cadr e1) (cadr e2))))) ) ; setq ; on boucle sur tmp afin de cherche les fenêtres de chaque présentation (mapcar '(lambda (pre_tmp) (cond ((= (setq lst_pre (get_liste_fen_pre (car pre_tmp))) nil) ) (t (setq res (cons (cons (car pre_tmp) (list lst_pre)) res)) ) ); cond ) tmp ) ; mapcar ) ) ; cond (reverse res) ) ; get_all_fen ;-------------------------------------------; ; nom: choisir_echelle_fenetre_presentation ; ; role: ouvre une dcl pour choisir l'échelle; ; personnalisée des fenêtres contenues; ; dans les présentations ; ; param: aucun ; ; retour: t si tout c'est bien passé ; ; nil si erreur ; ; date: 28/07/2009 ; ; Sébastien BLAES ; ;-------------------------------------------; (defun choisir_echelle_fenetre_presentation( / res liste_pre_fen tmp_dcl desc_tmp_dcl) (setq res nil) (cond ; on récupère les présentations et leur fenêtres ((= (setq liste_pre_fen (get_all_fen)) nil) (princ (strcat "\nIl y a eu une erreur de recherche des fenêtres dans les présentations")) ) ; on va créer un fichier temporaire pour la dcl ((= (setq tmp_dcl (vl-filename-mktemp "tmp.dcl")) nil) ) ; on va l'ouvrir ((= (setq desc_tmp_dcl (open tmp_dcl "w")) nil) ) (t ;;;;;;;;;;;;;;;;; ; FICHIER DCL ; ;;;;;;;;;;;;;;;;; ; on va écrire dans le fichier temporaire ; on déclare la boite de dialogue (write-line (strcat "cefp_dialog: dialog{label=\"CEFP - BSEB67\";") desc_tmp_dcl) (write-line ":row{" desc_tmp_dcl) ; LISTE DES PRESENTATIONS (write-line ":column{" desc_tmp_dcl) (write-line (strcat ":text {label=\"Liste des présentations: " (itoa (length liste_pre_fen)) "\";}") desc_tmp_dcl) (write-line ":list_box {key=\"k_liste_pre\";height=15;}" desc_tmp_dcl) (write-line "}" desc_tmp_dcl) ; LISTE DES FENETRES DE LA PRESENTATION (write-line ":column{" desc_tmp_dcl) (write-line (strcat ":text {key=\"k_nb_fen\"; label=\"Liste des fenêtres: " "\";}") desc_tmp_dcl) (write-line ":list_box {key=\"k_liste_fen\";height=15;}" desc_tmp_dcl) (write-line "}" desc_tmp_dcl) ; ECHELLE PERSONNALISEE (write-line ":column{" desc_tmp_dcl) (write-line ":row{" desc_tmp_dcl) (write-line ":edit_box{key=\"k_ech_perso\";}" desc_tmp_dcl) (write-line ":button{key=\"k_apply_ech_perso\";label=\"Appliquer échelle\";}" desc_tmp_dcl) (write-line "}" desc_tmp_dcl) (write-line "}" desc_tmp_dcl) (write-line "}" desc_tmp_dcl) (write-line ":spacer {height=2;}" desc_tmp_dcl) ; BOUTON OK (write-line ":row{" desc_tmp_dcl) (write-line ":spacer {width=2;}" desc_tmp_dcl) (write-line ":button{key=\"k_ok\";label=\"Ok\";is_default=true;}" desc_tmp_dcl) (write-line ":spacer {width=2;}" desc_tmp_dcl) (write-line "}" desc_tmp_dcl) ; on ferme la boite de dialogue (write-line "}" desc_tmp_dcl) ; on ferme le fichier (close desc_tmp_dcl) ;;;;;;;;;;;;;;;;; ;FIN FICHIER DCL; ;;;;;;;;;;;;;;;;; (cond ((= (setq dcl_id (load_dialog tmp_dcl)) nil) ) ((= (new_dialog "cefp_dialog" dcl_id) nil) ) (t ; on définit les fonctions utiles sur la dcl (defun fill_liste_pre( lst) (start_list "k_liste_pre") (mapcar '(lambda (elem) (add_list (car elem))) lst) (end_list) ) ; fill_liste_pre (defun fill_liste_fen( lst) (set_tile "k_nb_fen" (strcat "Liste des fenêtres: " (itoa (length lst)))) (start_list "k_liste_fen") (mapcar '(lambda (elem) (add_list (cdr (assoc 5 (entget (vlax-vla-object->ename elem)))))) lst) (end_list) ) ; fill_liste_fen (defun k_liste_pre_clic( lst) (setq VAR_CEFP_PRE_SELECT (nth (atoi (get_tile "k_liste_pre")) lst) VAR_CEFP_FEN_SELECT nil ) ; setq (fill_liste_fen (cadr VAR_CEFP_PRE_SELECT)) (set_tile "k_ech_perso" "") ) ; k_liste_pre_clic (defun k_liste_fen_clic( lst) (setq VAR_CEFP_FEN_SELECT (nth (atoi (get_tile "k_liste_fen")) lst)) (set_tile "k_ech_perso" (rtos (vla-get-CustomScale VAR_CEFP_FEN_SELECT))) ) ; k_liste_fen_clic (defun k_apply_ech_perso_clic( / cus_scale) (cond ((= VAR_CEFP_FEN_SELECT nil) ) ((or (= (type (setq cus_scale (read (get_tile "k_ech_perso")))) 'INT) (= (type cus_scale) 'REAL)) (vla-put-CustomScale VAR_CEFP_FEN_SELECT cus_scale) (set_tile "k_ech_perso" (rtos (vla-get-CustomScale VAR_CEFP_FEN_SELECT))) ) (t (princ "\nValeur saisie incorrecte") (princ) (set_tile "k_ech_perso" (rtos (vla-get-CustomScale VAR_CEFP_FEN_SELECT))) ) ) ; cond ) ; k_apply_ech_perso_clic ; on définit les actions sur la dcl (action_tile "k_ok" "(setq ok t)(done_dialog)") (action_tile "k_liste_pre" "(k_liste_pre_clic liste_pre_fen)") (action_tile "k_liste_fen" "(k_liste_fen_clic (cadr VAR_CEFP_PRE_SELECT))") (action_tile "k_apply_ech_perso" "(k_apply_ech_perso_clic)") ; on remplit la liste des présentations (fill_liste_pre liste_pre_fen) ; on lance la dcl (start_dialog) (unload_dialog dcl_id) ; on a quitter la dcl (cond ((= ok t) ) ) ; cond ) ) ; cond ) ) ; cond ; on supprime le fichier temporaire (vl-file-delete tmp_dcl) (princ "\n") res ) ; choisir_echelle_fenetre_presentation (defun c:cefp() (choisir_echelle_fenetre_presentation) ) ; c:cefp (princ)