Elun Posté(e) le 10 septembre 2019 Posté(e) le 10 septembre 2019 Bonjour, J'ai un programme qui est long en terme d'exécution et je souhaiterais savoir si quelqu'un a déjà étudié/recherché la création d'une barre de progression (ou chargement). Ce qu'il se passe c'est que j'ai un incrément qui augmente de 1 à chaque passage de la boucle donc j'avais commencé par chercher avec ceci, me permettant de remplir une image via un pourcentage (par rapport à un maximum définissant l'arrêt de la boucle) : Code LISP pour remplir l'image à chaque appel de la fonction (Progress) avec TimeCount la variable servant de compteur et TimeOut étant la valeur maximum de la boucle.(defun Progress () (start_image "ProgBar") (fill_image 0 0 (/ (* TimeCount fill_X) TimeOut) fill_Y 92) (end_image) (set_tile "Error" (strcat (itoa TimeCount) " / " (itoa TimeOut))) ) Code DCL correspondant à la BDL qui doit simplement afficher la barre au lancement du programme et disparaître lorsque la barre arrive à 100%.MAJCALQUE_ProgressBar: dialog { fixed_width = true ; label = "Barre de progression - commande MAJCALQUE" ; key = "ProgressBar" ; : text { label = "La commande MAJCALQUE est en cours d'exécution, veuillez patienter SVP." ; alignment = centered ; } : image { key = "ProgBar" ; fixed_width = 100 ; height = 2 ; } : row { : errtile { key = "Error" ; label = "" ; width = 30 ; alignment = centered ; } } : row { : button { key = "OK" ; label = "OK" ; } : button { key = "Cancel" ; label = "Annuler" ; is_cancel = true ; } } }Le problème de l'utilisation du langage DCL est qu'une boîte de dialogue possède obligatoirement un bouton OK Cancel (pas possible d'avoir une fenêtre simple sans boutons et uniquement une image). Or le but de la manoeuvre c'est que l'utilisateur n'est pas besoin d'appuyer sur un bouton pour lancer la barre de progression (je fais apparaître cette fenêtre normalement 5 fois au cours du programme). Je me souviens avoir chercher également du côté de la barre de commande mais je n'ai plus les bout de codes que j'avais testé. Donc si vous avez une idée de la manière dont on pourrait s'y prendre pour afficher une barre de progression sous autocad sans intervention de l'utilisateur, je vous en serait très reconnaissant.
Luna Posté(e) le 6 mai 2020 Posté(e) le 6 mai 2020 Salut, Je viens de trouver une solution avec la fonction (acet-ui-progress) qui semble fonctionner à peu près normalement. Il s'agit de la même barre qu'AutoCAD utilise lorsqu'il affiche une progression. Elle est située en bas à droite. Elle est assez particulière sur l'utilisation. (acet-ui-progress "Working" n) ;Retourne T (setq i 0) (repeat n (acet-ui-progress (setq i (1+ i))) ;Retourne i ) (acet-ui-progress) ;Retourne nil Voici l'aide associée que j'ai pu trouver :(acet-ui-progress [label [max]])(acet-ui-progress current) Display progress meter. Argumentslabel: If provided, a text string that will appear as a label for the progress meter. max: If provided, the maximum value in the range to be displayed (starting with 0). current: If provided, gives the current value, which should be less than max; positive values are absolute while negative values increment the current position. If no parameters are provided, the progress meter is removed. Return ValuesThe return value depends on the action performed: Initialize: returns T if successful, otherwise NIL. Update: returns current. Restore: returns NIL. Example: ;; init meter (acet-ui-progress "Working:" (length theList)) ;; process each item (foreach item theList ;; perform action (doSomethingTo item) ;; update meter by one item (acet-ui-progress -1) ) ;; kill meter (acet-ui-progress) Library: acetutil.arxJ'ai testé la version (acet-ui-progress -1) une fois la fonction initiée mais cela n'a pas fonctionné (la barre de progression était à 100% à chaque passage dans la boucle). Du coup pour la gestion des erreurs car il est préférable de supprimer la barre de chargement lorsqu'une erreur survient j'ai testé ceci (j'ai tout de même réussi à avoir une erreur random qui n'a pas activée la fonction *error*) : (defun try (n txt / i *error* msg acet) (defun *error* (msg) (if acet (acet-ui-progress)) (princ msg) ) (setq acet (acet-ui-progress txt n)) (setq i 0) (repeat n (acet-ui-progress (setq i (1+ i))) ) (setq acet (acet-ui-progress)) ) Je n'ai pas encore eu le temps de la tester correctement, mais par exemple dans cette utilisation, la barre de progression n'est pas update : (defun test (/ *error* msg acet i layer-list layer) (defun *error* (msg) (if acet (acet-ui-progress)) (princ msg) ) (setq layer-list '("Calque1" "Calque2" "Calque3" "Calque4" "Calque5" "Calque6" "Calque7" "Calque8" "Calque9") i 0 acet (acet-ui-progress "Working" (length layer-list)) ) (command "-SUPCALQUE") (foreach layer layer-list (acet-ui-progress (setq i (1+ i))) (command "N" layer) ) (command "" "O") (setq acet (acet-ui-progress)) ) Elle est vide à l'initialisation, AutoCAD exécute la commande et une fois la commande exécutée, il supprime la barre de progression... Bisous,Luna
(gile) Posté(e) le 6 mai 2020 Posté(e) le 6 mai 2020 Salut, Juste un petite mise en garde, les fonction acet-* font parti des ExpressTools, il faut donc que ceux-ci soient installés (ce qui n'est pas le cas lors de l'installation par défaut d'AutoCAD). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
PHILPHIL Posté(e) le 7 mai 2020 Posté(e) le 7 mai 2020 hello voici un exemple en lisp dans une boucle "while" ca doit marcher avec un "foreach" en incrémentant un compteur : (setq compt (1+ compt)et un comparateur : (setq com (sslength entites)) il y a quelque soucis des fois avec la barre d'état d'autocad, car la barre de défilement prend la place de la barre d'état je pensedonc suivant la régénération avec la carte graphique ca pose un probleme de visibilité (defun c:change_echelle_du_type_ligne_de_selection () (setvar "cmdecho" 0) (setvar "dimzin" 0) (setvar "osmode" 0) (setq echeltypeligne (atof (getcfg "APPDATA/echeltypeligne"))) (initget 4) (setq tmp (getdist (strcat "\nENTRER LA VALEUR DE L'ECHELLE DU TYPE D'OBJET < " (rtos echeltypeligne 2 8) " >: ") ) ) (if tmp (setq echeltypeligne tmp) ) (setcfg "APPDATA/echeltypeligne" (rtos echeltypeligne 2 8)) (prompt "\nCLIQUER SUR LES OBJETS A MODIFIER :") (setq entites nil) (setq entites (ssget '((-4 . "<NOT") (-4 . "<OR") (8 . "H_ISOLATION") (8 . "H_ISOLATION 1") (8 . "H_ISOLATION 2") (0 . "AEC_MVBLOCK_REF") (0 . "AEC_POLYGON") (-4 . "OR>") (-4 . "NOT>") ) ) ) (setq compt 0) (setq com (sslength entites)) (acet-ui-progress-init "AVANCEMENT" com) (while (< compt com) (progn (vla-put-linetypescale (vlax-ename->vla-object (cdr (assoc -1 (entget (ssname entites compt))))) echeltypeligne ) (acet-ui-progress-init (strcat "AVANCEMENT " (rtos (/ (* compt 100) (float com)) 2 2) " %") com) (acet-ui-progress-safe compt) (setq compt (1+ compt)) ) ) (acet-ui-progress-done) ) a+Phil FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant