Creating top (HW) and bottom (FW) surfaces from a wireframe solid

stuart masters 4 years ago in Geology updated by mark gabbitus 4 years ago 12

Hi all,

Is there an easy way to generate a top (Hangingwall) and bottom (Footwall) surface from a solid wireframe?

Note that I don't have the Seam Modelling module.

Any advice much appreciated.



Hello, Stuart! What is your final purpose of HW and FW surfaces? For dinamiс anisotropy?

Hi there, yes - mainly as an input into Modelling\Block Model Tools\Unfold (Manual)\Strings ... but also would like to know how to do it in general. I could try the Modelling\Block Model Tools\Unfold (Manual)\Wireframes\Centre-line Surface option but I'm not sure how to create a centre-line surface either :)


I think you need something I have often wished for, alas I am not aware of a single tool in Micromine to do this (sigh).  The approach I have taken in the past is to slice the wireframe on sections and digitize in both HW and FW.  This is tedious.  I have however thought of a better method that I think will solve the problem.

I tested this on a vein striking 50 degrees (E of N) dipping -70 to the NW.  The aim being to define a set of points that defined the center plane of the vein and were coded with information to define the vein thickness.  This should allow points defining the HW and FW to be generated as the center plane + / - 0.5 vein thickness. 

My approach was to make two blank block models, one with blocks sizes 1m in east, 10m in north and 5m in RL, rotated 50 degrees about the Z axis, do not set a minimum sub-block size. (Model1).  The second model (Model 2) had blocks 1500m in east, 10m in north and 5m in RL.  This second model deliberately has East block dimensions much wider than the wireframe and is needed to allow the first model to be indexed on East values. (You need a row type index, ie all blocks along the same row and an RL Index later in the process).  

Once the two models are generated, assign the wireframe to Model1, with 10 sub blocks in east but only 1 sub-block in North and RL, code the model with the wireframe name and delete blocks outside the wireframe.    This will preserve the 10 x 5 block spacing in North and RL but resolve blocks across the wireframe to +/- 0.1m.

Next update Model2 by adding a field East_IDX (Character, 8) then used the Calculate function At Change Increment to add increasing values starting at 1 each time the East value in the model changes.  The use the replicate option (^R) to write the values to all rows in the model. The East_IDX then defines the rows Mode2.  Next use Modelling | Block Model Tools | Assign

To write the East_IDX values from Model2 to Model1.

An RL Index (RL_IDX) is also needed.  You cant sort Model1 (or any rotated Block model) by coordinates so I generated a file with a List of RL values (ie every 5m and appropriate Index values then used File | Merge | Micromine to write them to Model1.

Because rotated block models can not be sorted by coordinates you now need to persuade MM that Model1 is not a rotated block model.  I generated a file with fields East, North, RL EastT, East_IDX, RL_IDX. and then merged the relevant fields from Model1 to this file (Ie _East becomes EastT.  You can then sort the file by East_IDX and RL_IDX and then use File |Fields |Extract to generate a points file which as points defining the center plane of the vein and the vein thickness.

Hope that makes sense


Hi Keith, thanks for this.


Yes, it makes sense - I'll try it out on the w/e and will let you know how I go.




Hi Stuart

The answer is "it depends". If you would like to send me the solid (to paul@micromine.com ) I will suggest a process suited to the data, but here are a couple of options to consider:

  1. Create a grid of points that cover the XY extents of the wireframe (create a grid, convert to a MM file or create an empty single layer block model or create a string, insert points and then replicated the string as many times as required). Add two fields (say HW_Z and FW_Z).  Now run the DTM | Generate Z Values functions twice.  The first time choose the BOTTOM side of the DMT and FW_Z output field, and then run again with the TOP side and HW_Z.  Now you effectively have 2 point files that can be used to create a grid or DTM of both the HW and FW surface.
  2. Create a grid of points that will become a collar file and create a DHDB with collar azimuth and dip to intersect the solid at approximately right angles.  Use the Wireframe | Calculations | Pierce Points function the generate XYZ values for entry and exit.  Once again there are effectively have 2 point files that can be used to create a grid or DTM of both the HW and FW surface.

In the next release we will have some functionality that should allow you to "separate" the surfaces interactively.  There will be two new ways to select connected triangles, Similar and Region.  Here is a brief description

For Similar selection, the (face) dip value of all neighbouring triangles are compared to dip value of the triangle originally selected. If it is within tolerance, then this triangle is selected. The process continues, in all directions, until there is no triangle neighbour matching the tolerance criteria.

For Region selection, the (face) dip value of all neighbouring triangles are compared to dip value of the triangle neighbour. If it is within tolerance, then this triangle is selected. The process continues, in all directions, until there are no triangle neighbours matching the tolerance criteria.

When there are multiple triangles selected, at the start of the process, than the Similar selection will consider all triangles selected at the time the process was invoked, when checking the tolerance criteria. So, if you repeat the Similar selection process, it is very possible that the number of selected triangles will increase each time. However if you repeat the Region selection, there will be no change to the selected triangles.

Note that with either selection tool, you could start the process with several (non-neighbouring) triangles selected.

You can imagine that you might use either selection method to select all the HW triangles, and then save these triangles as a new wireframe (repeat for FW).  Alternatively you might try to select all the triangles connecting the HW to the FW.  These could then be deleted to create 2 unconnected surfaces.

Thanks a lot Paul,

Option 1, worked a treat.




Don't know if this is useful or not, but by having separate HW and FW wireframes you can plug them into the Wireframe | Calculations | Compare Wireframes function, name the Distance attribute "Thickness" and run.  Now you can display the "Wireframe to Compare" using Thickness as the 3D Colour Coding Attribute to visualize the vein thickness.


Thanks Paul, that's very useful to know.


Hi Stuart, further to Paul's comments on the new selection feature in MM2020 here are some screen shots that show you will be able to do.

Starting solid of a vein:

select a single triangle and use the new selection feature with a sensible angle tolerance:

the result of this selection can be saved to a new wireframe:

repeat for the other side:

HW and FW surfaces made in 20 seconds :-)




Thanks Mark,

Looks good.



That looks great. In MM 2020, which is not available. This option does not exist in the current MM 2018 SP6.

Hi Dmitry

that is correct, this is a new feature in MM2020 due in November this year