Graphical User Interface

The following examples illustrate how to interact with or generate native Vulcan user interface elements to interact with users.

Topics:

Picking points on screen

from maptek import vulcan_gui
from pprint import pprint

pt = vulcan_gui.pick_point()
pts = pt.pick("Pick some points!")
pprint (pts, depth=1)

 

Getting a layer from the GUI

from maptek import vulcan_gui

layer_name = "NOT_A_LAYER"

if layer_name in vulcan_gui.globals()["layers"]:
    layer = vulcan_gui.get_layer(layer_name)
    print ("Layer '{}' has {} objects in it.".format(layer.name, len(layer)))
else:
    print ("Layer '{}' is not in the gui".format(layer_name))

 

Adding a layer to the GUI

from maptek import vulcan, vulcan_gui

# Create an empty layer
layer = vulcan.layer("NEW_LAYER")

# Put data into the layer
center = vulcan.point(0,0,0,0,1,"")
shift = vulcan.point(5,2,0)

for i in range(5):
    pol = vulcan.polyline()
    pol.coordinates = [center, center+shift, center+(shift*2)]
    center.x += 5
    layer.append(pol)

# Store the layer to the gui, clearing out any old one
vulcan_gui.add_layer(layer, "CLEAR_IF_EXISTS")

 

Creating a panel

# >>> [Indicates sample output.]

from maptek import vulcan_gui
spec_name = "panel_example_spec.abc"
pan = vulcan_gui.panel("My Data Input Panel")
pan.load_spec(spec_name)
pan.statictext("Enter values below", bold=True)
pan.editbox("edit_val", "Enter some text")
pan.editbox("num_val", "Enter a number")
pan.combobox("combo", "Pick a letter", options=['a','b','c','d'])

pan.display()
pan.save_spec(spec_name)
print (pan.values)

# >>> {'combo': 'a', 'num_val': '12345', 'edit_val': 'Hello'}

 

Process messaging

from maptek import vulcan_gui
from time import sleep

vulcan_gui.start_busy_message("Processing data")
sleep(2)
vulcan_gui.end_busy_message()

 

Selecting objects on screen

from maptek import vulcan_gui

sel = vulcan_gui.selection("data to print")
sel.criteria = ["LINE", "POLYGON"]
sel.display_mode = "SHADOW"

for obj in sel:
    print (obj)

 

Basic Gpan panel

from maptek import vulcan_gui
from os import environ, remove
import subprocess
from pathlib import Path

gpan_string = '''
panel example
{
    borders = 10;
    title = "Pick an input file";
    block foo
    {
        drawbox = true;
        fileselector file
        {
            width = 50;
            label = "Input file";
            filter = "__filelist("",*.bmf)";
            wildcard = "Block Model (*.bmf)|*.bmf";
        }
    }
    button ok
    {
        label = "Ok";
    }
    button cancel
    {
        label = "Cancel";
    }
}
'''

# Compile the gpan file into a cgp file
gpan_file = "example.gpan"
cgp_file = "example.cgp"

with open(gpan_file, "w") as out:
    out.write(gpan_string)

gpan_compiler = Path(environ["VULCAN_EXE"], "pc.exe")
subprocess.run([str(gpan_compiler), gpan_file], check=True)

# Display the panel
pan = vulcan_gui.gpan()
pan.display(cgp_file, "example")
print (pan.values)

# Remove the generated gpan files
remove(gpan_file)
remove(cgp_file)

 

Gpan with callbacks

from maptek import vulcan_gui
from os import environ, remove
import subprocess
from pathlib import Path

gpan_string = '''
panel example
{
    borders = 10;
    block foo
    {
        drawbox = true;
        editbox input
        {
            label = "Input";
            width = 10;
            quiet_update = true;
            on_change = ["user_input", "$(example)"];
            forward_callback = "example";
        }
        editbox output
        {
            label = "Output";
            width = 10;
            readonly = true;
        }
        button clear
        {
            label = "Clear";
            user_button = ["clear", "$(example)"];
            forward_callback = "example";
        }
    }
    button ok
    {
        label = "Ok";
    }
    button cancel
    {
        label = "Cancel";
    }
}
'''

# Compile the gpan file into a cgp file
gpan_file = "example.gpan"
cgp_file = "example.cgp"
with open(gpan_file, "w") as out:
    out.write(gpan_string)

gpan_compiler = Path(environ["VULCAN_EXE"], "pc.exe")
subprocess.run([str(gpan_compiler), gpan_file], check=True)

# Callback function
# Changes output to match the input or clears the data
def Callback(data):
    tag = data[0]
    vals = data[1]
    if tag == "user_input":
        vals["output"] = vals["input"]
    elif tag == "clear":
        vals["input"] = ""
        vals["output"] = ""
    return vals

# Display the gpan file and assign the callbacks
pan = vulcan_gui.gpan()
pan.display(cgp_file, 
            "example", 
            on_change=Callback,
            user_button=Callback)

print (pan.values)

# Remove the generated gpan files
remove(gpan_file)
remove(cgp_file)