maptek.vulcan.layer

The following functions can be used to edit Vulcan layers and manipulate properties.

To download all the example scripts on this page, click Python Layer Example Scripts.


Here is a basic framework for creating a layer. Use this template to create layers with a Python script. In this example, a design database is opened in write mode, a simple point is created, then the layer is saved.

# Filename: layer_framework.py
# Purpose: Show basic steps for creating a layer.
# Returns: Create a new layer in selected dgd.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis"  # design database to access

# 1. open the database in write mode
with vulcan.dgd(dgd_file, "w") as dgd:

    # 2. make a blank layer with nothing in it
    layer = vulcan.layer('NEW_POINT')

    # 3. create an object to put into the new layer
    new_pt = vulcan.polyline([[76500.0, 4500.0, 0.0]])

    # 4. put new object into the layer
    layer.append(new_pt)

    # 5. save layer                        
    dgd.save_layer(layer)

append(layer self, obj object)

Appends an object to the layer.

# Filename: layer_append.py
# Purpose: Append a new object to a layer.
# Returns: None. A new line has been added to the layer.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis"  # design database to access
layer_name = "LINE"  # layer to use

# CREATE THE NEW OBJECT
# create two new points (x,y,z,w,t,name)
pt1 = vulcan.point(75912.0, 3797.0, 0.0, 0.0, 0, "")
pt2 = vulcan.point(76760.0, 4340.0, 0.0, 0.0, 1, "")
# create a new polyline using points
new_object = vulcan.polyline([pt1, pt2]) 
new_object.name = "Line"
new_object.colour = 50

# OPEN LAYER AND APPEND NEW OBJECT
with vulcan.dgd(dgd_file, "w") as dgd: # open up the database in write mode
    if dgd.is_layer(layer_name): # if layer exists, open it
        layer = dgd.get_layer(layer_name)
    else: # if layer does not exist, create it
        layer = vulcan.layer(layer_name)

    layer.append(new_object) # append the new object
    dgd.save_layer(layer) # save layer

clear_objects(layer self)

Deletes all objects from the layer.

# Filename: layer_clear_objects.py
# Purpose: Deletes all objects in a layer.
# Returns: None. Layer is empty.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access
layer_name = "LINES" # layer to clear

with vulcan.dgd(dgd_file, "w") as dgd: # open up the database in write mode
    assert dgd.is_layer(layer_name), 'Error: Layer does not exist.'
    layer = dgd.get_layer(layer_name) # get layer
    layer.clear_objects() # clear all objects from layer
    dgd.save_layer(layer) # save the layer

delete_object(layer self, int index) → bool

Deletes an object by index from the layer.

# Filename: layer_delete_object.py
# Purpose: Delete an object from a layer using its index.
# Returns: Bool.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access
layer_name = "POINTS" # name of layer

with vulcan.dgd(dgd_file, "w") as dgd: # open up the database in write mode
    assert dgd.is_layer(layer_name), 'Error: Layer does not exist.'
    layer = dgd.get_layer(layer_name) # get layer
    index = layer.num_objects()-1 # get the highest indexed object
    assert index > 0, 'Error: No objects in layer.'  
    layer.delete_object(index) # remove the object
    dgd.save_layer(layer) # save the layer

find_object(layer self, std::string name) → VulcanObj

Finds an object by name.

# Filename: layer_find_object.py
# Purpose: Find object in layer by name.
# Returns: Object from layer.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database we want to access
layer_name = "POINTS"  # name of layer
name_of_object = "POLYLINE" # name of object

with vulcan.dgd(dgd_file, "r") as dgd: # open up the database in read mode
    assert dgd.is_layer(layer_name), 'Error: Layer does not exist.'
    layer = dgd.get_layer(layer_name) # get layer
    assert layer.find_object(name_of_object), 'Error: Object does not exist.'
    obj = layer.find_object(name_of_object) # find the object
    
    # do something with object...
    print(obj)

get_name(layer self) → std::string

Gets the layer name.

# Filename: layer_get_name.py
# Purpose: Get the name of a layer.
# Returns: Name of layer as string.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access

with vulcan.dgd(dgd_file, "r") as dgd: # open up the database in read mode
    layer_list = dgd.list_layers() # list layers in database
    list_item = dgd.get_layer(layer_list[0])  # get layer object from database
    layer_name = list_item.get_name() # get the name of the layer
    
    # do something with layer name...
    print(f"layer name: {layer_name}")

Note:   Calling the properties instead of using the get_name() function can be an alternative method for achieving the same thing. See the script example below.

# Filename: layer_name_property.py
# Purpose: Get the name of a layer by calling properties.
# Returns: Name of layer as string.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access

with vulcan.dgd(dgd_file, "r") as dgd: # open up the database in read mode
    layer_list = dgd.list_layers() # list layers in database
    list_item = dgd.get_layer(layer_list[0]) # get layer object from database
    layer_name = list_item.name

    # do something with layer name...
    print(f"layer name: {layer_name}")

get_description(layer self) → std::string

Gets the layer description.

# Filename: layer_get_description.py
# Purpose: Get the description of a layer.
# Returns: Description of layer as string.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access

with vulcan.dgd(dgd_file, "r") as dgd: # open up the database in read mode
    layer_list = dgd.list_layers() # list layers in database
    list_item = dgd.get_layer(layer_list[0]) # get layer object from database
    layer_description = list_item.get_description() # get the layer description

    # do something with description string...
    print(f"layer description = {layer_description}")

Note:   Calling the properties instead of using the get_description() function can be an alternative method for achieving the same thing. See the script example below.

# Filename: layer_description_property.py
# Purpose: Get the description of a layer by calling properties.
# Returns: Description of layer as string.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access

with vulcan.dgd(dgd_file, "r") as dgd: # open up the database in read mode
    layer_list = dgd.list_layers() # list layers in database
    list_item = dgd.get_layer(layer_list[0]) # get layer object from database
    layer_descr = list_item.description # get the layer description

    # do something with description string...
    print(f"layer description: {layer_descr}")

get_object(layer self, int index) → VulcanObj

Gets an object from a layer by index.

# Filename: layer_get_object.py
# Purpose: Gets an object from a layer by index.
# Returns: Object from layer.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access
layer_name = "POINTS" # name of layer

with vulcan.dgd(dgd_file, "r") as dgd: # open up the database in read mode
    assert dgd.is_layer(layer_name), 'Error: Layer does not exist.'
    layer = dgd.get_layer(layer_name) # get layer
    assert layer.get_object(index = 1), 'Error: Object does not exist.'
    obj = layer.get_object(index = 1) # find the object

    # do something with object...
    print(obj)

get_objects(types: list)

Gets the objects of a layer by type. This is not suitable for putting objects back into layers with enumerate() since the objects are filtered and indices are unknown. To have indices for modifying objects, use get_objects_enumerate().

List of Object Types
polyline arrow dim_arc
text dim_radius dim_line
text3d dim_angle  
# Filename: layer_get_objects.py
# Purpose: Gets all objects from a layer by type.
# Returns: Objects from layer of requested type.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access
layer_name = "OBJECTS" # name of layer
types = [vulcan.polyline, 
         vulcan.text,
         vulcan.text3d,
         vulcan.arrow,
         vulcan.dim_angle,
         vulcan.dim_arc,
         vulcan.dim_line,
         vulcan.dim_radius]

with vulcan.dgd(dgd_file, "r") as dgd: # open up the database in read mode
    assert dgd.is_layer(layer_name), 'Error: Layer does not exist.'
    layer = dgd.get_layer(layer_name) # get layer

    for obj in layer.get_objects(types): # get objects by type
        # do something with objects...
        print(type(obj))

Note:  Both get_objects() and get_objects_enumerate() (shown immediately below) are helpful when you want to isolate all the objects of certain types and do something with them, eliminating the need to write out functions for each type separately.


get_objects_enumerate(types: list)

Gets objects by type from a layer along with layer indices.

# Filename: layer_get_objects_enumerate.py
# Purpose: Gets objects by type from a layer along with layer indices.
# Returns: List of objects of requested type from layer with layer indices.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access
layer_name = "OBJECTS" # name of layer
types = [vulcan.polyline, 
         vulcan.text,
         vulcan.text3d,
         vulcan.arrow,
         vulcan.dim_angle,
         vulcan.dim_arc,
         vulcan.dim_line,
         vulcan.dim_radius]

with vulcan.dgd(dgd_file, "r") as dgd: # open up the database in read mode
    assert dgd.is_layer(layer_name), 'Error: Layer does not exist.'
    layer = dgd.get_layer(layer_name) # get layer

    for index, obj in layer.get_objects_enumerate(types): # get objects by type
        # do something with objects...
        print(index, type(obj))

num_objects(layer self) → int

Returns the number of objects in the layer.

# Filename: layers_num_objects.py
# Purpose: Find number of objects in a layer.
# Returns: The number of objects in the layer as int.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access
layer_name = "BOUNDARY" # desired layer

with vulcan.dgd(dgd_file, "r") as dgd: # open up the database in read mode
    assert dgd.is_layer(layer_name), 'Error: Layer does not exist.'
    layer = dgd.get_layer(layer_name) # get layer
    n_obj = layer.num_objects() # get the number of objects

    # do something with number of objects...
    print(f"{layer_name} layer has {n_obj} objects")

set_name(layer self, std::string const & name)

Sets the layer name.

# Filename: layer_set_name.py
# Purpose: Sets the name of a layer.
# Returns: None.  Layer name is set.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access
layer_name = "NEW_POINT" # current name of layer
new_layer_name = "COLLAR_LOC" # new layer name

with vulcan.dgd(dgd_file, "w") as dgd: # open up the database in write mode
    assert dgd.is_layer(layer_name), 'Error: Layer does not exist.'
    layer = dgd.get_layer(layer_name)
    current_layer_name = layer.get_name() # get the old name of the layer
    layer.set_name(new_layer_name) # set the new name of the layer
    dgd.delete_layer(layer_name) # removes reference to old layer from dgd
    dgd.save_layer(layer) # save the layer

Note:   Calling the properties instead of using the set_name() function can be an alternative method for achieving the same thing. See the script example below.

# Filename: layer_set_name_property.py
# Purpose: Sets the name of a layer using properties.
# Returns: None.  Layer name is set.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access
layer_name = "NEW_POINT" # current name of layer
new_layer_name = "COLLAR_LOC" # new layer name

with vulcan.dgd(dgd_file, "w") as dgd: # open up the database in write mode
    assert dgd.is_layer(layer_name), 'Error: Layer does not exist.'
    layer = dgd.get_layer(layer_name)
    current_layer_name = layer.get_name() # get the old name of the layer
    layer.name = new_layer_name # set layer name using properties
    dgd.delete_layer(layer_name) # removes reference to old layer from dgd
    dgd.save_layer(layer) # save the layer

set_description(layer self, std::string const & description)

Sets the layer description.

# Filename: layer_set_description.py
# Purpose: Sets the description of a layer.
# Returns: None.  Layer description is set.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access
layer_name = "NEW_POINT" # name of layer
new_layer_desc = "Collar: DH1203" # new layer description

with vulcan.dgd(dgd_file, "w") as dgd: # open up the database in write mode
    assert dgd.is_layer(layer_name), 'Error: Layer does not exist.'
    layer = dgd.get_layer(layer_name) # get layer
    layer.set_description(new_layer_desc) # sets layer description
    dgd.save_layer(layer) # save the layer

Note:   Calling the properties instead of using the set_description() function can be an alternative method for achieving the same thing. See the script example below.

# Filename: layer_set_description.py
# Purpose: Sets the description of a layer using properties.
# Returns: None.  Layer description is set.

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access
layer_name = "NEW_POINT" # name of layer
new_layer_desc = "Collar: DH1203" # new layer description

with vulcan.dgd(dgd_file, "w") as dgd: # open up the database in write mode
    assert dgd.is_layer(layer_name), 'Error: Layer does not exist.'
    layer = dgd.get_layer(layer_name) # get layer
    layer.set_description = new_layer_desc # sets layer description
    dgd.save_layer(layer) # save the layer

set_object(layer self, int index, obj object) → bool

Sets an object by index.

# Filename: layer_set_object.py
# Purpose: Sets an object from a layer by index.
# Returns: Bool. 

from maptek import vulcan

dgd_file = "pydemo.dgd.isis" # design database to access
layer_name = "OBJECTS" # layer to use

with vulcan.dgd(dgd_file, "w") as dgd:  # open up the database in write mode
    assert dgd.is_layer(layer_name), 'Error: Layer does not exist.'
    layer = dgd.get_layer(layer_name) # get layer
    new_obj = vulcan.polyline([vulcan.point(75250.0, 6250.0, 0.0, 0.0, 0, ""),\
                               vulcan.point(76500.0, 6500.0, 0.0, 0.0, 1, "")])
    new_obj.name = "Line"
    new_obj.colour = 50
    return_value = layer.set_object(0, new_obj)  # set object at index 0
    dgd.save_layer(layer) # save layer