The following examples show how to use the CLI_Progress bar.
Simple Progress Bar
Using the default properties, start, update, and finish a progress bar.
cli_progress.initialize
for i = 0, 100 do begin & $
wait, 0.02 & $
cli_progress.update, i & $
endfor
One should see a progress bar appear on the IDL console/terminal and it should fill up to 100%:
100% [########################################]
Setting and Using Properties
Properties should be set in one of two ways: Either through the use of keywords to CLI_Progress.Initialize or through the use of the dot(.) operator. For example:
pro cli_example
LengthOfLoop = 1000
CLI_Progress.Initialize, width = 10, maximum = LengthOfLoop
for i = 0, LengthOfLoop do begin
if i eq LengthOfLoop then begin
CLI_Progress.complete_char = "X"
endif
CLI_Progress.Update, i
wait, 0.002
endfor
end
One should see a progress bar of width 10 appear in the IDL console/terminal and it should fill up to 100%:
Upon reaching 100% all the characters should change to X's
100.0% [XXXXXXXXXX]
Using a Ping Pong Bar
The ping pong bar is a type of marquee loader that bounces the COMPLETE_CHAR string back and forth along the length of the loading bar. For example:
CLI_Progress.Initialize, ping_pong = !true, complete_char = "<IDL>"
for i = 0,114 do begin & $
CLI_Progress.Update & $
wait, 0.02 & $
endfor
The word <IDL> bounces back and forth:
[-----------------------------------<IDL>-----]
For the next example we make the ping pong text reverse direction when it goes back from right to left:
CLI_Progress.Initialize, ping_pong = !true, complete_char = "--+"
cli_Progress.reverse = !true
cli_Progress.incomplete_char = "."
for i = 0,114 do begin & $
CLI_Progress.Update & $
wait, 0.02 & $
endfor
IDL prints:
[...................................--+.....]
Normally, a ping pong bar does not display a percentage since it does not have a maximum. However, if we add a maximum then we can display a percent:
CLI_Progress.Initialize, ping_pong = !true, complete_char = "<IDL>", maximum = 114, /percent
for i = 0,114 do begin & $
CLI_Progress.Update & $
wait, 0.02 & $
endfor
IDL prints:
100.0% [----------------------------------<IDL>------]
Exit Early and Print Messages
Normally, CLI_Progress captures the cursor in order to print the progress bar. If you want to display a message partway through, or you want to abandon the progress bar before its completed, you can use the CLI_Progress::Erase or CLI_Progress::Newline methods.
If we just want to return the Console to its default configuration we will use.CLI_Progress::Newline
pro cli_example_newline
LengthOfLoop = 1000
CLI_Progress.Initialize, width = 10, maximum = LengthOfLoop
for i = 0, LengthOfLoop do begin
if i eq 500 then begin
CLI_Progress.Newline
print, "ERROR!"
break
endif
CLI_Progress.Update, i
wait, 0.002
endfor
end
One should see a progress bar of width 10 appear and it should fill up to 49%. Then IDL will print "ERROR!" on a new line:
49.9% [####------]
ERROR!
If you don’t want to abandon your progress bar but rather want to print above it. One would accomplish this with CLI_Progress::Erase. By doing this you clear the line you are currently on up for normal printing. After you can print normally. Once you are done printing whatever you wish normally CLI_Progress::Update will re-secure your cursor and continue the progress bar.
pro cli_example_erase
LengthOfLoop = 1000
CLI_Progress.Initialize, width = 10, maximum = LengthOfLoop
for i = 0, LengthOfLoop do begin
if i eq 500 then begin
CLI_Progress.Erase
print,"WARNING!"
endif
CLI_Progress.Update, i
wait,.002
endfor
end
You should see your progress bar fill to 49% at which point it will spew a "warning" and then continue the bar. As below.
WARNING
100.0% [##########]
Finish and AUTO_FINISH
By default CLI_Progress will automatically finish when the current update step equals the MAXIMUM property value. Instead, you can turn this feature off and manually finish. For example:
pro cli_example_finish
CLI_Progress.Initialize, preset = "retro", auto_finish = !false
array = [[1:100],1,100,1,100]
foreach element, array do begin
CLI_Progress.Update, element
wait,.1
endforeach
CLI_Progress.Finish
end
You should see the progress bar fill to 100% then flash between
[|] 100% [========================================]
and
[|] 1% [----------------------------------------]
before finishing.
Tip: CLI_Progress::Finish can also be called at any time, even if auto_finish is still turned on. It will just finish your bar wherever it may happen to be.
Using Multiple Characters for the Complete/Incomplete Strings
WIDTH, COMPLETE_CHAR, and INCOMPLETE_CHAR are all unaware of each other: If you change one of these to have multiple characters, you may need to adjust the other properties to match. For example
pro cli_example_multi
CLI_Progress.Initialize
CLI_Progress.complete_char = "+-"
CLI_Progress.incomplete_char = ".."
CLI_Progress.width = 20
for i = 0,100 do begin
CLI_Progress.Update
wait,.02
endfor
CLI_Progress.Initialize, complete_char = "+-", incomplete_char = "..", width = 20
for i = 0,100 do begin
CLI_Progress.Update
wait,.02
endfor
end
The output should look similar to.
100% [+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-]
14% [+-+-....................................]
Using REMAINING
REMAINING allows you to add an estimate of the time until completion.
pro cli_example_remaining
CLI_PROGRESS.INITIALIZE, /REMAINING
store = []
for i = 0,100 do begin
CLI_PROGRESS.UPDATE
wait,.5
endfor
end
The output should look similar to.
15% [######----------------------------------] 42s Remaining
Using OUTPUT
OUTPUT allows you to capture your output instead of printing it. You will need to pass in a named variable.
pro cli_example_output
CLI_Progress.Initialize
store = []
for i = 0,100 do begin
CLI_Progress.Update, output = progressOut
wait,.02
store = [store, progressOut]
endfor
print,store, /implied
end
Complicated Example
Below is a fake loading sequence that shows off several abilities of the CLI_Progress bar tool at once.
pro fakeLoadMapStack
CLI_Progress.Initialize, maximum = 100, width = 30, complete_char = "=-",incomplete_char = "__", $
title = "Loading Modules Please wait...", auto_finish = !false
for i=0,100 do begin
if i gt 30 then cli_progress.title = "Prepping textures..."
cli_Progress.update, i
wait,.03
endfor
CLI_Progress.auto_finish = !True
CLI_Progress.spinner = 4
CLI_Progress.title = "Loading to Map"
for i=0,100 do begin
CLI_Progress.Update, i
if i eq 70 then begin
CLI_Progress.Newline
print, "ERROR: MapStack not initialized"
print, "Aborting and trying secondary image"
print, "Abort successful"
wait,.5
break
endif
wait,.03
endfor
CLI_Progress.initialize, title = "Finalizing", ping_pong = !true, complete_char = "<O>"
for i=0,300 do begin
CLI_Progress.Update, i
wait,.01
endfor
CLI_Progress.finish, text = "[SUCCESS]"
CLI_Progress.initialize, title = "Resolving and installing", auto_finish = !false
for i=0,100 do begin
wait,.03
if i eq 30 then begin
CLI_Progress.Erase
print, "Warning: Non-Standard MapStack"
print, "This might have unintended consequences."
endif
CLI_Progress.Update, i
endfor
CLI_Progress.finish, text = "[SUCCESS]"
end
Version History
See Also
CLI_Progress