Aller au contenu

Barre de progression


Elun
 Partager

Messages recommandés

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.

Lien vers le commentaire
Partager sur d’autres sites

  • 7 mois après...

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.

 

Arguments

label: 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 Values

The 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.arx

J'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

Lien vers le commentaire
Partager sur d’autres sites

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 pense

donc 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

Autodesk Architecture 2019 sous windows 10 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Partager

×
×
  • Créer...