mapteksdk.data.blocks module

Module containing classes for interaction with block models.

There are several different kinds of block models, though only DenseBlockModels and Subblocked block models are currently supported by the SDK.

exception mapteksdk.data.blocks.InvalidBlockCentroidError

Bases: ValueError

Error raised for block centroids which lie outside of the block model.

exception mapteksdk.data.blocks.InvalidBlockSizeError

Bases: ValueError

Error raised for invalid block sizes.

class mapteksdk.data.blocks.DenseBlockModel(object_id=None, lock_type=<LockType.READWRITE: 2>, x_res=1, y_res=1, z_res=1, x_count=1, y_count=1, z_count=1)

Bases: mapteksdk.data.base.Topology, mapteksdk.data.primitives.block_properties.BlockProperties

A dense block model consists of blocks which are the same size arranged in a three dimensional grid structure. The block model is dense because it does not allow ‘holes’ in the model - every region in the grid must contain a block.

For example, a dense block model with an x_res of 1, a y_res of 2 and a z_res of 3 means all of the blocks in the model are 1 by 2 by 3 units in size. If the dense block model’s x_count was 10, the y_count was 15 and the z_count was 5 then the model would consist of 10 * 15 * 5 = 750 blocks each of which was 1x2x3 units. These blocks would be arranged in a grid with 10 rows, 15 columns and 5 slices with no gaps.

The blocks of a dense block model are defined at creation and cannot be changed.

Parameters
  • x_res (float) – The x resolution. Must be greater than zero. Default 1.

  • y_res (float) – The y resolution. Must be greater than zero. Default 1.

  • z_res (float) – The z resolution. Must be greater than zero. Default 1.

  • x_count (int) – The number of columns in the block model. Must be greater than zero. Default 1.

  • y_count (int) – The number of rows in the block model. Must be greater than zero. Default 1.

  • z_count (int) – The number of slices in the block model. Must be greater than zero. Default 1.

Notes

Parameters should only be passed for new block models.

Raises
  • ValueError – If x_res, y_res, z_res, x_count, y_count or z_count is less than or equal to zero.

  • TypeError – If x_res, y_res, z_res, x_count, y_count or z_count is not numeric.

  • TypeError – If x_count, y_count or z_count are numeric but not integers.

Examples

Create a block model as described above and make every second block invisible.

>>> from mapteksdk.project import Project
>>> from mapteksdk.data import DenseBlockModel
>>> project = Project()
>>> with project.new("blockmodels/model", DenseBlockModel(
>>>         x_res=1, y_res=2, z_res=3, x_count=10, y_count=15, z_count=5
>>>         )) as new_model:
>>>     new_model.block_visibility = [True, False] * ((10 * 15 * 5) // 2)
classmethod static_type()

Return the type of dense block model as stored in a Project.

This can be used for determining if the type of an object is a dense block model.

property block_count

The count of blocks in the model.

property block_visibility_3d

A view of the block visibility reshaped into 3 dimensions. block_visibility_3d[slice, row, column] gives the visibility for the specified slice, row and column.

Examples

Make a 10x10x10 block model and make every block in the 4th row invisible, excluding blocks in the 0th slice.

>>> from mapteksdk.project import Project
>>> from mapteksdk.data import DenseBlockModel
>>> project = Project()
>>> with project.new("blockmodels/visibility_3d", DenseBlockModel(
...         x_count=10, y_count=10, z_count=10, x_res=1, y_res=1, z_res=0.5
...         )) as new_blocks:
...     new_blocks.block_visibility_3d[:, 5, :] = False
...     new_blocks.block_visibility_3d[0, :, :] = True
property block_selection_3d

A view of the block selection reshaped into 3 dimensions. block_selection_3d[slice, row, column] gives the visibility for the block in the specified slice, row and column.

save()

Save the changes made to the object.

Generally a user does not need to call this function because it is called automatically at the end of a with block using Project.new() or Project.edit().

class mapteksdk.data.blocks.SubblockedBlockModel(object_id=None, lock_type=<LockType.READWRITE: 2>, x_res=1, y_res=1, z_res=1, x_count=1, y_count=1, z_count=1)

Bases: mapteksdk.data.base.Topology, mapteksdk.data.primitives.block_properties.BlockProperties

A dense subblocked block model. Each primary block can contain subblocks allowing for the model to hold greater detail in areas of greater interest and less detail in areas of less interest.

Block attributes, such as block_visibility and block_colour, have one value per subblock. A subblocked block model is empty when created and contains no blocks. Use the add_subblocks function to add additional subblocks to the model.

Note that it is possible for a subblocked block model to include invalid subblocks. For example, subblocks which are outside of the extents of the block model. These blocks will not be displayed in the viewer.

If interoperability with Vulcan is desired, the subblock sizes should always be a multiple of the primary block sizes (the resolution defined on construction) and you should be careful to ensure subblocks do not intersect each other.

Parameters
  • x_res (float) – The x resolution. Must be greater than zero. Default 1.

  • y_res (float) – The y resolution. Must be greater than zero. Default 1.

  • z_res (float) – The z resolution. Must be greater than zero. Default 1.

  • x_count (int) – The number of columns in the block model. Must be greater than zero. Default 1.

  • y_count (int) – The number of rows in the block model. Must be greater than zero. Default 1.

  • z_count (int) – The number of slices in the block model. Must be greater than zero. Default 1.

Notes

Parameters should only be passed for new block models.

Raises
  • ValueError – If x_res, y_res, z_res, x_count, y_count or z_count is less than or equal to zero.

  • TypeError – If x_res, y_res, z_res, x_count, y_count or z_count is not numeric.

  • TypeError – If x_count, y_count or z_count are numeric but not integers.

Examples

Creating a subblocked block model with two parent blocks, one of which is completely filled by a single subblock and another which is split into three subblocks. Each subblock is made invisible individually. Though the block model has two primary blocks, it has four subblocks so four values are required for the visibility.

>>> from mapteksdk.project import Project
>>> from mapteksdk.data import SubblockedBlockModel
>>> centroids = [[0, 0, 0], [-1, 3, 0], [1, 3, 0], [0, 5, 0]]
>>> sizes = [[4, 4, 4], [2, 2, 4], [2, 2, 4], [4, 2, 4]]
>>> visibility = [True, True, False, False]
>>> project = Project()
>>> with project.new("blockmodels/subblocked_model", SubblockedBlockModel(
...         x_count=1, y_count=2, z_count=1, x_res=4, y_res=4, z_res=4
...         )) as new_blocks:
...     new_blocks.add_subblocks(centroids, sizes)
...     new_blocks.block_visibility = visibility
classmethod static_type()

Return the type of subblocked block model as stored in a Project.

This can be used for determining if the type of an object is a subblocked block model.

property block_count

The count of blocks in the model.

add_subblocks(block_centroids, block_sizes, use_block_coordinates=True)

Adds an array of subblocks to the subblocked block model.

By default the block_centroids should be in block model coordinates rather than world coordinates. See convert_to_world_coordinates() for more information.

Parameters
  • block_centroid (array_like) – An array of block centroids of the new blocks. This is of the form: [x, y, z].

  • block_sizes (array_like) – An array of block sizes of the new blocks, each containing three floats. This is of the form: [x_size, y_size, z_size].

  • use_block_coordinates (bool) – If True (default) then the coordinates of the block centroids will be interpreted as block model coordinates (They will be passed through convert_to_world_coordinates()). If False, then the coordinates of the block centroids will be interpreted as world coordinates.

Raises
  • InvalidBlockSizeError – If any block_size is less than zero or greater than the primary block size.

  • InvalidBlockCentroidError – If any block_centroid is not within the block model.

  • RuntimeError – If called when in read-only mode.

Notes

Calling this function in a loop is very slow. You should calculate all of the subblocks and pass them to this function in a single call.

Examples

The block centroids are specified in block model coordinates relative to the bottom left hand corner of the block model. In the below example, the block model is rotated around all three axes and translated away from the origin. By specifying the centroids in block model coordinates, the centroids remain simple. The output shows the resulting block centroids of the model. To get the same model with use_block_coordinates=False these are the centroids which would be required. As you can see they are significantly more complicated.

>>> import math
>>> from mapteksdk.project import Project
>>> from mapteksdk.data import SubblockedBlockModel, Axis
>>> centroids = [[-1.5, -1, -1], [-0.5, -1, -1], [-1, 1, -1],
...              [-1.5, -1, 1], [-0.5, -1, 1], [-1, 1, 1],
...              [-1.5, -1, 3], [-0.5, -1, 3], [-1, 1, 3]]
>>> sizes = [[1, 2, 2], [1, 2, 2], [2, 2, 2],
...          [1, 2, 2], [1, 2, 2], [2, 2, 2],
...          [1, 2, 2], [1, 2, 2], [2, 2, 2]]
>>> project = Project()
>>> with project.new("blockmodels/transformed", SubblockedBlockModel(
...         x_count=1, y_count=2, z_count=3, x_res=4, y_res=4, z_res=4
...         )) as new_blocks:
...     new_blocks.origin = [94, -16, 12]
...     new_blocks.rotate(math.pi / 3, Axis.X)
...     new_blocks.rotate(-math.pi / 4, Axis.Y)
...     new_blocks.rotate(math.pi * 0.75, Axis.Z)
...     new_blocks.add_subblocks(centroids, sizes)
...     print(new_blocks.block_centroids)
[[ 95.95710678 -16.64693601  11.96526039]
 [ 95.45710678 -15.86036992  12.32763283]
 [ 94.70710678 -16.09473435  10.42170174]
 [ 94.54289322 -17.87168089  12.67236717]
 [ 94.04289322 -17.08511479  13.03473961]
 [ 93.29289322 -17.31947922  11.12880852]
 [ 93.12867966 -19.09642576  13.37947395]
 [ 92.62867966 -18.30985966  13.74184639]
 [ 91.87867966 -18.54422409  11.8359153 ]]

Specifying the block centroids in world coordinates is useful when the centroids are already available in world coordinates. This example shows copying the blocks from the model created in the previous example into a new model. Notice that the origin and rotations are the same for the copy. If this were not the case the centroids would likely lie outside of the block model and would not appear in the viewer.

>>> import math
>>> from mapteksdk.project import Project
>>> from mapteksdk.data import SubblockedBlockModel, Axis
>>> project = Project()
>>> with project.new("blockmodels/transformed_copy", SubblockedBlockModel(
...         x_count=1, y_count=2, z_count=3, x_res=4, y_res=4, z_res=4
...         )) as new_blocks:
...     new_blocks.origin = [94, -16, 12]
...     new_blocks.rotate(math.pi / 3, Axis.X)
...     new_blocks.rotate(-math.pi / 4, Axis.Y)
...     new_blocks.rotate(math.pi * 0.75, Axis.Z)
...     with project.read("blockmodels/transformed") as read_blocks:
...         new_blocks.add_subblocks(read_blocks.block_centroids,
...                                  read_blocks.block_sizes,
...                                  use_block_coordinates=False)
remove_block(index)

Deletes the block at the specified index.

This operation is performed directly on the project to ensure that all properties (such as block_visibility and block_attributes) for the deleted block are deleted as well.

Does nothing if requesting to delete a nonexistent block.

Parameters

index (int) – Index of the block to the delete.

Warning

Any unsaved changes to the object when this function is called are discarded before the block is deleted. If you wish to keep these changes, call save() before calling this function.

save()

Save the changes made to the object.

Generally a user does not need to call this function because it is called automatically at the end of a with block using Project.new() or Project.edit().