DGD Reading & Writing
Layers and objects in a DGD (design database) can be manipulated without Vulcan being opened. The following examples illustrate how to do this.
Topics:
Modules to import
Import the following libraries:
from maptek import vulcan import numpy as np import pandas as pd
Create a DGD
Creates a dgd, adds a layer called DEMO and then adds a single point at location 0,0,0. The colour of the object can be changed using the set_colour() method with an integer. The integer represents the colour number in the Vulcan scd colour palette.
from maptek import vulcan with vulcan.dgd('pydemo.dgd.isis', 'create') as dgd: layer = vulcan.layer('DEMO') # create a new layer called DEMO obj = vulcan.polyline([0,0,0]) # add a single point obj.name = 'POINT' # change the name of the point to "POINT" obj.set_colour(1) # change the colour to colour 1 layer.append(obj) # add to the layer dgd.append(layer) # add the layer to the dgd
Open existing DGD and add data
This example opens the dgd and layer created previously and adds a line. The line consists of two points with a line between them created using the set_connected() method.
from maptek import vulcan # open dgd in write mode with vulcan.dgd('pydemo.dgd.isis','w') as dgd: layer = dgd.get_layer('DEMO') # get the "DEMO" layer # create a diagonal line obj = vulcan.polyline([[5,5,5],[10,10,10]]) obj.name = 'LINE' obj.set_colour(3) # set the line as connected so it appears as a line obj.set_connected() layer.append(obj) dgd.save_layer(layer) # save the modified layer
Create a closed polygon
Open an existing dgd and layer and add a closed polygon in the shape of a square. This example illustrates the use of the set_closed() method to close a polygon.
from maptek import vulcan with vulcan.dgd('pydemo.dgd.isis','w') as dgd: layer = dgd.get_layer('DEMO') # get the "DEMO" layer obj = vulcan.polyline([[5,0],[7,0],[7,2],[5,2]]) obj.name = 'SQUARE' obj.set_colour(5) obj.set_connected() obj.set_closed() layer.append(obj) dgd.save_layer(layer)
Get object details
This example illustrates how to get details for each object in a layer.
from maptek import vulcan with vulcan.dgd('pydemo.dgd.isis','r') as dgd: layer = dgd.get_layer('DEMO') print('Layer Objects: {0}'.format(layer.num_objects())) # in this example only vulcan.polyline types will # have information printed. for obj in layer.get_objects([vulcan.polyline]): name = obj.get_name() desc = obj.description closed = obj.closed print(name, desc, closed)
Reading from a DGD
from maptek import vulcan #Open the dgd for read access and print all the layers and all of the objects in it. with vulcan.dgd('pydemo.dgd.isis', 'r') as dgd: for layer in dgd: print (layer.name) for obj in layer: print (obj)
Editing objects in a DGD
from maptek import vulcan # Open the dgd for write access with vulcan.dgd('pydemo.dgd.isis','w') as dgd: my_layer = None # Find the layer we want lyr_name = "TEMP" # If it exists, modify an object in it if dgd.is_layer(lyr_name): my_layer = dgd.get_layer(lyr_name) idx = len(my_layer)-1 print(idx) if idx >= 0: obj = my_layer[idx] obj.name = "LastObject" my_layer[idx] = obj dgd.save_layer(my_layer) # If the layer doesn't exist, make one and add it. else: my_layer = vulcan.layer(lyr_name) obj = vulcan.polyline([0,0,0]) obj.name = "Origin point" my_layer.append(obj) dgd.append(my_layer)
2D Text Manipulation
from maptek import vulcan # Text can be initialized with input data or not text = vulcan.text("Single line") text.origin = [78000,6000,0] text.framed = True text.angle = 55 text.scale = "1:15000" text.font = "Arial" text.height = 0.5 text.width = 0.5 print (text) print (list(text)) text.append("Second line") text.append("Third line") print (list(text)) del(text[1]) print (list(text))
3D Text Manipulation
from maptek import vulcan # Text can be initialized with input data or not text = vulcan.text3d("Single line") text.direction = [0.5,0.5,0.5] text.normal = [0.5,0.5,0] text.origin = [0.5,-0.5,0] text.framed = True text.angle = 55 text.scale = "1:500" text.font = "Arial" text.height = 0.5 text.width = 0.5 text.italic = True text.mirrored_vertical = True text.mirrored_horizontal = True text.horizontal_align = "LEFT" text.vertical_align = "CENTRE" print (text)
Polyline Manipulation
from maptek import vulcan origin = (0 ,0) size = 10 square_points = ([origin[0] , origin[1] ], [origin[0]+size, origin[1] ], [origin[0]+size, origin[1]+size], [origin[0] , origin[1]+size]) poly = vulcan.polyline(square_points) poly.set_connected() poly.closed = True poly.group = "PLOT_MARKERS" poly.feature = "SQUARE" poly.colour = 5 print (poly) print(poly.centroid()) ### Attributes attr = poly.attributes attr["template"] = { "attrib" : "value" } print (poly.attributes) ### Metadata print (poly.metadata) poly.metadata['NewMeta'] = "Value" print (poly.metadata) ### Section widths poly.section_widths.front_width = 10 poly.section_widths.back_width = 10 poly.section_widths.enable = True print (poly.section_widths)
Arrow manipulation
from maptek import vulcan arrow = vulcan.arrow() # Default type is 3D, Type can be changed by: arrow.arrow_type = "2D" arrow.start = [10,10,0] arrow.end = [100,75,0] arrow.filled = True arrow.num_facets = 20 # Head length/width defaults to relative # Override by doing the following: # arrow.head_length = 1 # arrow.head width = 0.5 arrow.relative_head_length = 20 # Percent arrow.relative_head_width = 10 # Percent print (arrow)