# Working with Geometric Data

the program has the capability to import and define arbitrary geometric data. For instance, CAD data from AutoCAD can be imported from a DXF file. This geometry information can be manipulated after creation, and it can also be used for reference in visualization. There are certain (as yet somewhat limited) commands that allow zones or building blocks to be generated from polygons forming a closed volume. In addition, the data can be used to filter the objects affected by a the program command and to identify objects in certain regions by assigning group names.

This section provides a high-level description of how geometric data can be used in the current version of the program. For details, including all available options, see the documentation of commands related to geometric data in the c geometry commands.

The data files and geometry data used to generate all the images in this section can be found in the project `UsersGuide\\ProblemSolving\\GeometricData\\GeometricData.prj`

in the `datafiles`

folder of the the program distribution.

Note that a discussion of using geometric data to create densified “octree” grids can be found in Grid Generation under Geometry-Based Densification: Octree Meshing.

The data files and geometry data used to generate all the images in this section can be found in the project `Users_Guide\\geometry\\geometry.prj`

in the `datafiles`

folder of the 3DEC distribution.

Note that a discussion of generating block assemblies from geometric surfaces can be found in Generating Block Assemblies. Cutting blocks with geometries is described in Cutting Blocks and finally, using geometric data to create densified “octree” grids is described in in Block Generation: Densify and Octree.

## Geometric Data

the program organizes geometric data into **sets**, which are named collections of polygons, edges, and nodes. The data are topologically connected. Polygons are defined by a series of edges, and edges are defined by two nodes.

The easiest way to create a geometric set is via the `geometry import`

command. For example, the command

```
geometry import 'surface1.stl'
```

will import the data in the file surface1.stl and place it into a geometric set called surface1. Currently available formats are DXF, STL, and an Itasca-defined format that preserves added metadata (e.g., group names, FISH extra variables, etc.). You can also simply go to the menu command (`Ctrl + O`

) and select a geometry file with a recognized extension (STL, DXF, and GEOM) in the ensuing dialog.

Geometric data can also be created via commands. For instance, the `geometry polygon create`

command
can be used to directly add a polygon to a geometric set. For example,

```
geometry polygon create by-positions (0,0,0) (1,0,0) (1,1,0) (0,1,0)
```

will add a simple quadrilateral to the current geometry set.

In addition, all data in all sets are available through FISH (see the topic Geometry FISH Functions for a list of functions). FISH can be used to both modify and create geometric data. For instance, the following is a simple FISH function that creates a geometric set called “FISH Example” and then adds polygons forming a cylinder:

**Example: “fish_cylinder.fis”**

```
model new
fish define fish_cylinder(start,radius,height,segments)
local gset = geom.set.find("FISH Example")
if gset = null then
gset = geom.set.create("FISH Example")
endif
loop local i (1,segments)
local ang1 = float(i-1) * math.pi * 2.0 / float(segments)
local ang2 = float(i) * math.pi * 2.0 / float(segments)
local p1 = start + vector(math.cos(ang1),math.sin(ang1),0.0)
local p2 = start + vector(math.cos(ang2),math.sin(ang2),0.0)
local p3 = vector(p2->x,p2->y,height)
local p4 = vector(p1->x,p1->y,height)
local poly = geom.poly.create(gset)
geom.poly.add.node(gset,poly,p1)
geom.poly.add.node(gset,poly,p2)
geom.poly.add.node(gset,poly,p3)
geom.poly.add.node(gset,poly,p4)
geom.poly.close(gset,poly)
end_loop
end
[fish_cylinder((0,0,0),1.0,4.0,40)]
```

The results are shown below. Following figure has no caption.

## Geometry Visualization

Geometric data can be visualized in a i Plot pane. When the dialog is used, the geometry will be automatically rendered in a new plot.

If the set is added by command at the command prompt, it will need to be added manually to a plot to be seen. To do so:

- Create a plot (
or`Ctrl + Shift + N`

).- Use the
Build Plottool ( ) to get theBuild plotdialog, pick the “Geometry” item from the list in the “User Defined Data” category.- In “Attributes”, make sure that the desired set is selected in the “Sets” control. (Note: With this control, more than one set maybe visualized on the same plot item.)

## Geometry Painting

To help visualize how model variables vary with respect to geometry data, data from the zones can be used to “paint” values on to geometric nodes. These values can then be contoured to visualize how model variables vary in relation to geometric features that might not be explicitly modeled.

By switching the “Type” attribute to “Contour”, and switching the “ContourBy” value to “FieldData”, you can select from the list of all zone field variables. This data is used only for plotting, and is not visible to the model state.

The `geometry paint-extra`

command, however, can be used to “paint” zone field data values
from the model to an extra variable stored in geometric nodes. For example, to paint the minimum
principal stress in the model onto the active geometric set, you use the command

```
geometry paint-extra 2 stress quantity minimum
```

which will calculate minimum principal stresses at the location of all nodes in the active set,
and assign that value to extra variable index 2. The complete list of zone field variables
available can be found in the `geometry paint-extra`

command documentation.

The result of painting can be visualized by using the *Geometry* plot item (with attributes
“Type” = “Contour”, “Contour By” = “Node Extra”, and “Index” = “2”). The figure below is an
example of painting the displacement magnitudes on a simple tunnel next to the main excavation.

## Geometric Filtering - Geometry Range Elements

The primary method for selecting objects in FLAC3D is to provide a filter that determines the objects affected by a given command. This is done using the `range`

logic. There are two range elements that exist to filter objects based on their relation to data in geometric sets: geometry-distance and geometry-space.

The geometry-distance range element can be used to select objects that fall within a given distance of data in a geometric set. This includes polygons, free edges and free nodes. The minimum distance from the object centroid to any data in the set determines the distance value.

The extent keyword is valid for the geometry-distance range element, finding the minimum distance to the Cartesian extent of an object. This can be used with a distance value of zero to return an approximation of all objects that actually intersect the geometric set. For example, the following command can be used with the above data to assign group name “Intersect” to all zones blocks that have a Cartesian extent that intersects the geometric set “intcylinder.”

```
zone group "Intersect" range geometry-distance "intcylinder" gap 0.0 extent
```

The result of that operation is shown here.

```
block group 'Intersect' range geometry-distance 'intcylinder' gap 0.0 extent
```

The result of that operation is shown here.

The geometry-space range element selects objects based on how many times a ray starting from the object intersects polygons from the geometric set. If the intersection count matches the number provided, it is considered selected. This can be used to identify objects above or below a geometric surface (e.g., topography).

In the example below, a ray is projected in the positive x-direction and all objects inside of the right-hand cylinder are selected since a ray projected from the centroid only hits the cylinder one time.

As a special case, the keywords odd or even can be substituted in place of a count number in the geometry count range element. If the geometric set *effectively* forms a closed volume, the odd keyword will result in selecting all objects inside, and the even will select all objects outside. No checking is done to make certain the polygons actually form a single closed surface. The results of the command

```
zone group "Count Odd" range geometry-space "intcylinder" ...
count odd direction (1,0,0)
```

```
block group 'Inside' range geometry-space 'intcylinder' ...
count odd direction 1 0 0
```

are shown in in the next figure. Note that the intersecting cylinder geometry set does not form a single closed surface, and therefore, the range element does not select zones in the shared region.

If the geometric set does form a perfect topologically closed volume, then the inside and outside keywords can be used to select objects instead of the count keyword.

## Geometry Data and Group Assignment

There are occasions when you wish to select objects that fall into regions of space delineated by complex geometric data. Sometimes these data are not neatly separated into distinct surfaces that can be assigned to different geometric sets. Sometimes the relation between the data is complex, and manually identifying specific regions (e.g., above this surface, behind that, and ahead of this) is burdensome. The `geometry assign-groups`

command lets you assign group names to objects based on how they relate to all these surfaces at once.

The operation works by first assigning a unique ID number to all polygons that form a single contiguous surface. Specifically, all polygons in a single set that are connected across edges will be given the same ID number. A ray is then passed from the centroid of the object through those polygons, and a group name is generated based on how many times the ray intersects polygons of each ID.

As a simple example, we will use a geometric set consisting of two intersecting cylinders. The
`geometry assign-groups`

command is used to assign group names to objects based on their relation to the
surfaces using the command

```
geometry assign-groups zone projection (1,0,0) set 'intcylinder'
```

```
geometry assign-groups block projection (1,0,0) set 'intcylinder'
```

The figure below shows the group name assigned to zones in a cut-plane through the model. Each letter represents a different intersection region as defined by surface ID and intersection count.

This operation may be performed on virtually any object including zones, gridpoints, user-defined data and structural element objects (elements, nodes, and links).

While the `geometry assign-groups`

command can quickly separate objects into separate geometric regions, it does have limitations. The user has no control over the ID numbers assigned to surfaces, and determining the group names assigned to desired regions has to be done via visual inspection. Often, multiple groups will need to be combined into the actual region of interest.

Geometry data can be used for a variety of zone-generation and zone-configuration purposes, including when:

- you want to carve groups out of an existing FLAC3D model along several surfaces;
- you want, in an existing grid, to assign different groups to zones that will be excavated each year given a number of DXF files representing yearly excavation surfaces;
- you want to assign ubiquitous joint properties to zones that come within 10 m of a set of faults; and,
- you want to refine a FLAC3D model before identifying a group of zones as weak material.

The examples that follow illustrate the methods available for using geometry data to achieve these purposes.

Title | |
---|---|

Example 1 | Assign Group Names Based on Their Relationship to DXF Files |

Example 2 | Ignore Existing Groups – Build New Ones Based on Surfaces |

Example 3 | Partition Existing Groups Based on Surfaces |

Example 4 | Zones below Surfaces become Separate Groups — Outside Groups Remain Unchanged |

Example 5 | Zones above the Surfaces become a New Group — Everything below is Unchanged |

Example 6 | Zones Intersecting Surfaces becomes Separate Groups |

Example 7 | Split Zones below Surfaces |

Example 8 | Split Large Zones Intersecting Surfaces |

Run FLAC3D and call the following data file, which creates 3 groups called “dummy1,” “dummy2” and “dummy3”:

**Example: “Example_1.dat”**

```
;Build a model with 3 groups
model new
zone create brick size (50,50,50) point 0 (2700,-10500,-1000) ...
edge 4000 group 'dummy3'
zone delete range position-z 0 1000000
geometry import 's1.dxf'
zone group 'dummy1' ...
range geometry-space 's1' count 1 direction (0,1,0)
geometry import 's2.dxf'
zone group 'dummy2' ...
range geometry-space 's2' count 1 direction (1,0,0) group 'dummy3'
```

Create a plot (`Ctrl + Shift + N`

) and use the “Build Plot” tool ( ) to add zone group surfaces and geometry to the plot. Select the “Zone Group Default” item in the control panel, then set the “Slot” attribute to “Default.” Select the “Geometry Type” item, open the “Sets” attribute, and check the “s2” set; also check the “transparency” box. Click in the plot window to activate it. Press “i” to obtain an axonometric view of the model (as below).

We will use three surfaces to partition this model into multiple groups, in several different ways. These three surfaces are stored in three separate DXF files called “Y0.dxf,” “Y1.dxf” and “Y2.dxf.” You can think of these surfaces as three excavation surfaces in an open pit mine representing Year0, Year1 and Year2. The next image shows how the model appears when the surfaces are plotted; these DXF files are imported in the next data file example.

Existing groups are renamed “old,” and new groups are created based on surfaces (see image below).

**Example: “Example_2.dat”**

```
;Ignore existing groups. Build new ones based on surfaces
;(SpaceRanger Option 0)
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
zone group 'OLD'
zone group 'NEW_1' range geometry-space 'Y0' count odd
zone group 'NEW_2' range geometry-space 'Y1' count odd
zone group 'NEW_3' range geometry-space 'Y2' count odd
```

Zones outside or above the surfaces maintain their old group number. Zones that are inside or below any of the surfaces are partitioned into new groups along the surfaces (see the figure below).

**Example: “Example 3.dat”**

```
;Partition existing groups based on surfaces
; (SpaceRanger Option 1)
model new
zone create brick size (50,50,50) point 0 (2700,-10500,-1000) ...
edge 4000 group 'dummy3'
zone delete range position-z 0 1000000;
geometry import 's1.dxf'
zone group 'dummy1' range geometry-space 's1' count 1 direction (0,1,0)
geometry import 's2.dxf'
zone group 'dummy2' ...
range geometry-space 's2' count 1 direction (1,0,0) group 'dummy3'
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
zone group 'NEW_1' range geometry-space 'Y0' count odd group 'dummy1'
zone group 'NEW_2' range geometry-space 'Y0' count odd group 'dummy2'
zone group 'NEW_3' range geometry-space 'Y0' count odd group 'dummy3'
zone group 'NEW_4' range geometry-space 'Y1' count odd group 'NEW_1'
zone group 'NEW_5' range geometry-space 'Y1' count odd group 'NEW_2'
zone group 'NEW_6' range geometry-space 'Y1' count odd group 'NEW_3'
zone group 'NEW_7' range geometry-space 'Y2' count odd group 'NEW_4'
zone group 'NEW_8' range geometry-space 'Y2' count odd group 'NEW_5'
zone group 'NEW_9' range geometry-space 'Y2' count odd group 'NEW_6'
```

Everything inside or below the surfaces is partitioned. Everything outside or above remains at its original group number (see image below).

```
;Zones below surfaces become separate groups ...
; outside groups remain unchanged
;(SpaceRanger Option 2)
model new
zone create brick size (50,50,50) point 0 (2700,-10500,-1000) ...
edge 4000 group 'dummy3'
zone delete range position-z 0 1000000
geometry import 's1.dxf'
zone group 'dummy1' range geometry-space 's1' count 1 direction (0,1,0)
geometry import 's2.dxf'
zone group 'dummy2' ...
range geometry-space 's2' count 1 direction (1,0,0) group 'dummy3'
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
zone group 'NEW_1' range geometry-space 'Y0' count odd
zone group 'NEW_2' range geometry-space 'Y1' count odd
zone group 'NEW_3' range geometry-space 'Y2' count odd
```

Zones above all three surfaces become a new group.

```
;Zones above surfaces become a new group,
; everything below is unchanged
;(SpaceRanger option 3)
model new
zone create brick size (50,50,50) point 0 (2700,-10500,-1000) ...
edge 4000 group 'dummy3'
zone delete range position-z 0 1000000
geometry import 's1.dxf'
zone group 'dummy1' range geometry-space 's1' count 1 direction (0,1,0)
geometry import 's2.dxf'
zone group 'dummy2' ...
range geometry-space 's2' count 1 direction (1,0,0) group 'dummy3'
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
zone group 'NEW_1' range geometry-space 'Y0' count odd not ...
geometry-space 'Y1' count odd not ...
geometry-space 'Y1' count odd not
```

Zones that intersect the surfaces or come within 80 m of them are grouped as New 1, New 2 and New 3 (see image below).

```
;Zones intersecting surfaces within 80m become separate groups
;(SpaceRanger option 4)
model new
zone create brick size (50,50,50) point 0 (2700,-10500,-1000) ...
edge 4000 group 'dummy3'
zone delete range position-z 0 1000000
geometry import 's1.dxf'
zone group 'dummy1' range geometry-space 's1' count 1 direction (0,1,0)
geometry import 's2.dxf'
zone group 'dummy2' ...
range geometry-space 's2' count 1 direction (1,0,0) group 'dummy3'
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
zone group 'NEW_1' range geometry-distance 'Y0' gap 80 extent
zone group 'NEW_2' range geometry-distance 'Y1' gap 80 extent
zone group 'NEW_3' range geometry-distance 'Y2' gap 80 extent
```

Zones below Y0 are refined, then those below Y1, and finally those below Y2 (see image below).

```
; Split zones below surfaces
; (better than SpaceRanger option 5)
model new
zone create brick size (50,50,50) point 0 (2700,-10500,-1000) ...
edge 4000 group 'dummy3'
zone delete range position-z 0 1000000
geometry import 's1.dxf'
zone group 'dummy1' range geometry-space 's1' count 1 direction (0,1,0)
geometry import 's2.dxf'
zone group 'dummy2' ...
range geometry-space 's2' count 1 direction (1,0,0) group 'dummy3'
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
zone densify segments 2 range geometry-space 'Y0' count odd
zone densify segments 2 range geometry-space 'Y1' count odd
; The third level of refinement is skipped to keep this model
; small enough to fit in the 32 bit version.
;generate zone densify nsegment 2 range geometry Y2 count odd
```

Zones that come within 80 m of the surfaces are refined, making sure that no zones less than 40 m are created (see image below).

```
; Split large zones intersecting surfaces down to no less than 40m
model new
zone create brick size (50,50,50) point 0 (2700,-10500,-1000) ...
edge 4000 group 'dummy3'
zone delete range position-z 0 1000000
geometry import 's1.dxf'
zone group 'dummy1' range geometry-space 's1' count 1 direction (0,1,0)
geometry import 's2.dxf'
zone group 'dummy2' ...
range geometry-space 's2' count 1 direction (1,0,0) group 'dummy3'
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
zone densify segments 2 edge-limit 50 ...
range geometry-distance 'Y0' gap 80 extent
zone densify segments 2 edge-limit 50 ...
range geometry-distance 'Y1' gap 80 extent
zone densify segments 2 edge-limit 50 ...
range geometry-distance 'Y2' gap 80 extent
```

Geometry data can be used for a variety of block-generation and block-configuration purposes, including when:

- you want to carve groups out of an existing 3DEC model along several surfaces;
- you want, in an existing grid, to assign different groups to blocks that will be excavated each year given a number of DXF files representing yearly excavation surfaces;
- you want to assign ubiquitous joint properties to zones that come within 10 m of a set of faults; and,
- you want to refine a 3DEC model before identifying a group of zones as weak material.

The examples that follow illustrate the methods available for using geometry data to achieve these purposes.

Title | |
---|---|

Example 1 | Assign Group Names Based on Their Relationship to DXF Files |

Example 2 | Ignore Existing Groups – Build New Ones Based on Surfaces |

Example 3 | Partition Existing Groups Based on Surfaces |

Example 4 | Zones below Surfaces become Separate Groups — Outside Groups Remain Unchanged |

Example 5 | Zones above the Surfaces become a New Group — Everything below is Unchanged |

Example 6 | Zones Intersecting Surfaces becomes Separate Groups |

Example 7 | Split Zones below Surfaces |

Example 8 | Split Large Zones Intersecting Surfaces |

Run 3DEC and call the following data file, which creates 3 groups called “dummy1,” “dummy2” and “dummy3”:

**Example: “Example_1.dat”**

```
;Build a model with 3 groups
model new
block create brick 2700 6700 -10500 -6500 -1000 0
block densify segments 50 50 10 hex
block group 'dummy3'
;
geometry import 's1.dxf'
block group 'dummy1' range geometry-space 's1' count 1 direction 0 1 0
geometry import 's2.dxf'
block group 'dummy2' range geometry-space 's2' ...
count 1 direction 1 0 0 group 'dummy3'
```

Create a plot (`Ctrl + Shift + N`

) and use the “Build Plot” tool ( ) to add block group surfaces and geometry to the plot. Select the “Block Group Default” item in the control panel, then set the “Slot” attribute to “Default.” Select the “Geometry Type” item, open the “Sets” attribute, and check the “s2” set; also check the “transparency” box. Click in the plot window to activate it. Press “i” to obtain an axonometric view of the model (as below).

We will use three surfaces to partition this model into multiple groups, in several different ways. These three surfaces are stored in three separate DXF files called “Y0.dxf,” “Y1.dxf” and “Y2.dxf.” You can think of these surfaces as three excavation surfaces in an open pit mine representing Year0, Year1 and Year2. The next image shows how the model appears when the surfaces are plotted; these DXF files are imported in the next data file example.

Existing groups are renamed “old,” and new groups are created based on surfaces (see image below).

**Example: “Example_2.dat”**

```
;Ignore existing groups. Build new ones based on surfaces
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
block group 'OLD'
block group 'NEW_1' range geometry-space 'Y0' count odd
block group 'NEW_2' range geometry-space 'Y1' count odd
block group 'NEW_3' range geometry-space 'Y2' count odd
```

Blocks outside or above the surfaces maintain their old group number. Blocks that are inside or below any of the surfaces are partitioned into new groups along the surfaces (see the figure below).

**Example: “Example 3.dat”**

```
;Partition existing groups based on surfaces
model new
block create brick 2700 6700 -10500 -6500 -1000 0
block densify segments 50 50 10
block group 'dummy3'
geometry import 's1.dxf'
block group 'dummy1' range geometry-space 's1' count 1 direction 0 1 0
geometry import 's2.dxf'
block group 'dummy2' range geometry-space 's2' count 1 direction 1 0 0 group 'dummy3'
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
block group 'NEW_1' range geometry-space 'Y0' count odd group 'dummy1'
block group 'NEW_2' range geometry-space 'Y0' count odd group 'dummy2'
block group 'NEW_3' range geometry-space 'Y0' count odd group 'dummy3'
block group 'NEW_4' range geometry-space 'Y1' count odd group 'NEW_1'
block group 'NEW_5' range geometry-space 'Y1' count odd group 'NEW_2'
block group 'NEW_6' range geometry-space 'Y1' count odd group 'NEW_3'
block group 'NEW_7' range geometry-space 'Y2' count odd group 'NEW_4'
block group 'NEW_8' range geometry-space 'Y2' count odd group 'NEW_5'
block group 'NEW_9' range geometry-space 'Y2' count odd group 'NEW_6'
```

Everything inside or below the surfaces is partitioned. Everything outside or above remains at its original group number (see image below).

```
;Blocks below surfaces become separate groups &
; outside groups remain unchanged
model new
block create brick 2700 6700 -10500 -6500 -1000 0
block densify segments 50 50 10 hex
block group 'dummy3'
geometry import 's1.dxf'
block group 'dummy1' range geometry-space 's1' count 1 direction 0 1 0
geometry import 's2.dxf'
block group 'dummy2' range geometry-space 's2' ...
count 1 direction 1 0 0 group 'dummy3'
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
block group 'NEW_1' range geometry-space 'Y0' count odd
block group 'NEW_2' range geometry-space 'Y1' count odd
block group 'NEW_3' range geometry-space 'Y2' count odd
```

Blocks above all three surfaces become a new group.

```
;Blocks above surfaces become a new group,
; everything below is unchanged
model new
block create brick 2700 6700 -10500 -6500 -1000 0
block densify segments 50 50 10 hex
block group 'dummy3'
geometry import 's1.dxf'
block group 'dummy1' range geometry-space 's1' count 1 direction 0 1 0
geometry import 's2.dxf'
block group 'dummy2' range geometry-space 's2' ...
count 1 direction 1 0 0 group 'dummy3'
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
block group 'NEW_1' range geometry-space 'Y0' count odd not ...
geometry-space 'Y1' count odd not geometry-space 'Y1' count odd not
```

Blocks that intersect the surfaces or come within 80 m of them are grouped as New 1, New 2 and New 3 (see image below).

```
;Blocks intersecting surfaces within 40m become separate groups
model new
block create brick 2700 6700 -10500 -6500 -1000 0
block densify segments 50 50 12 hex
block group 'dummy3'
geometry import 's1.dxf'
block group 'dummy1' range geometry-space 's1' count 1 direction 0 1 0
geometry import 's2.dxf'
block group 'dummy2' range geometry-space 's2' ...
count 1 direction 1 0 0 group 'dummy3'
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
block group 'NEW_1' range geometry-distance 'Y0' gap 40 extent
block group 'NEW_2' range geometry-distance 'Y1' gap 40 extent
block group 'NEW_3' range geometry-distance 'Y2' gap 40 extent
```

Blocks below Y0 are refined, then those below Y1, and finally those below Y2 (see image below).

```
; Split blocks below surfaces
model new
block create brick 2700 6700 -10500 -6500 -1000 0
block densify segments 10 10 2 hex
block group 'dummy3'
geometry import 's1.dxf'
block group 'dummy1' range geometry-space 's1' count 1 direction 0 1 0
geometry import 's2.dxf'
block group 'dummy2' range geometry-space 's2' ...
count 1 direction 1 0 0 group 'dummy3'
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
block densify segments 2 range geometry-space 'Y0' count odd
block densify segments 2 range geometry-space 'Y1' count odd
```

Blocks that come within 80 m of the surfaces are refined, making sure that no blocks less than 40 m are created (see image below).

```
; Split large blocks intersecting surfaces down to no less than 100m
model new
block create brick 2700 6700 -10500 -6500 -1000 0
block densify segments 20 20 4 hex
block group 'dummy3'
geometry import 's1.dxf'
block group 'dummy1' range geometry-space 's1' count 1 direction 0 1 0
geometry import 's2.dxf'
block group 'dummy2' range geometry-space 's2' count 1 direction 1 0 0 group 'dummy3'
geometry import 'Y0.dxf'
geometry import 'Y1.dxf'
geometry import 'Y2.dxf'
;
block densify segments 2 maximum-length 100 repeat ...
range geometry-distance 'Y0' gap 80 extent
block densify segments 2 maximum-length 100 repeat ...
range geometry-distance 'Y1' gap 80 extent
block densify segments 2 maximum-length 100 repeat ...
range geometry-distance 'Y2' gap 80 extent
```

Was this helpful? ... | 3DEC © 2019, Itasca | Updated: Apr 17, 2022 |