24
$\begingroup$

Pretty new to Blender here and with a pretty specific set of questions.

The situation: I'm a vet looking to operate on a dog's spine. I want to put screws in a very specific location to avoid damaging the spinal cord (the corridor is about 4mm in diameter - I'm going to use 2.7mm screws with a 2mm hole drilled at exactly the right angle).

My strategy: I have a CT of the spine that I have extracted into CT slicer, exported as an .stl file and made a 3D printed model of. I am planning to 3D print guides on the left and right side of the spine that are shaped to snugly fit the spine with holes already placed to guide drilling before the screws are placed. I have imported the .stl of the spine into blender.

My plan (halfway through completion):

  1. Make a new cube (several thereof), size and rotate for the approximate angle, place over the appropriate region of the spine
  2. Add a Boolean (difference) modifier to the cube with the spine as the target
  3. Slice the (now shaped) cube in half to give a left and right side that can be placed on the spine in surgery to fit
  4. Make a new cylinder the right diameter and length for the drill guide. Rotate and place into each guide, add a Boolean (difference) modifier to each guide with the cylinder as a target

My problem:

  • With a complicated 3D shape such as a spine, I need to carve the guides appropriately so that they can be slotted into place onto the spine from either side.
  • I have been doing my carving with Boolean modifiers applied to each guide and extra cubes as needed for targets to shave off appropriate areas
  • Sometimes the carving leaves the external mesh of the guides intact, sometimes it doesn't and I have to make new faces where old ones have been removed (not very straightforward but achievable by tabbing into edit mode, selecting edge loops via multiple vertex selection, using the C button to highlight select vertices then F to make faces where necessary)
  • Overall I'm getting there but this is an incredibly slow process given that I still need to print the shapes and test them for fit on my printed spine before going into surgery.

Surely there is a quicker way to do this? I tried placing each guide on the spine and moving it along the X axis in incremental stages towards the middle (where it is supposed to be), applying Boolean modifiers along the way, but this invariably disrupts the mesh and leaves me with a million faces to recreate (and not confident I'm recreating them in the right places).

Carving as required: enter image description here

Recreating faces when the carving doesn't work: enter image description here

$\endgroup$
  • 6
    $\begingroup$ This is possibly the most interesting question here! Please take pictures of the procedure. I know there are many other blender users that would love to hear about this. (Other blender related medical uses have been featured on blendernation.) $\endgroup$ – David Jan 4 '17 at 23:42
  • 1
    $\begingroup$ In my opinion, the workflow seems appropriate. Booleans can be quite tricky because in order to make them work you should work with "good meshes" (correct normals orientation, watertight, no overlapping faces...), but I think is the right way to follow. Make sure you always work with volumes, never surfaces. When did the meshes start being messed up? $\endgroup$ – Carlo Jan 5 '17 at 0:03
  • 1
    $\begingroup$ how long is there before the surgery? I might just put a bounty on this - but the system is making me wait to post one. (Blender + 3D printing + Dog is an AWESOME combination - especially when you're a vet 3D printing medical devices!) $\endgroup$ – X-27 the fluffy unicorn Jan 5 '17 at 1:47
  • 2
    $\begingroup$ Thanks folks - it's good (and bad) to hear I'm not missing something completely obvious. I'm using 2.78a and the BMesh method for boolean carving and can't seem to pinpoint when carving will work and when it will need to be tweaked. I'm putting the surgery off as long as possible (at least 2 weeks) to try and get this one right - and will definitely take pictures $\endgroup$ – Sambo42 Jan 5 '17 at 2:17
  • 1
    $\begingroup$ @Sambo42 I assume the mesh is quite manifold? If so, I don't suppose it would be possible to upload an example of a troublesome part of the mesh for closer examination? $\endgroup$ – gandalf3 Jan 5 '17 at 2:22
12
$\begingroup$

Hopefully this is captures the problem and a solution.

To create geometry for a fixure which can be lifted off a complex geometry like a spine, you can use a high resolution mesh and the shrinkwrap modifier. The resulting object should be 'water-tight' and able to be 3D printed.

enter image description here

enter image description here


Detailed instructions:

  1. Import the spine geometry. enter image description here
  2. Add a plane which will be the dividing plane between the upper and lower clamps. enter image description here
  3. Select the spine and the plane. Use ctrl-J to join the geometry.
  4. Add a cube for the upper portion of the clamp. Size it so it covers the area to the clamped. Keep it above the spline. This block should NOT intersect the spine geometry. enter image description here
  5. Select the cube and use tab to enter the 'edit mode'. In the edit mode, select the vertices on the bottom of the cube. Use subdivide to create a high resolution mesh on the bottom of the cube. With the bottom of the cube selected, add a vertex group and name it 'bottom'. enter image description here
  6. Use tab to return to object mode.
  7. Add a shinkwrap modified to the cube. Project the shrinkwrap modified in the 'z' direction and only shinkwrap the 'bottom' vertex group. Set the spine as the target. This will project all of the vertices in the bottom group down onto the spine. Because the plane was added earlier, the shrinkwrap will either touch the bone or the separation plane. Since the vertices only project downward, the block can be removed by lifting off the spine. enter image description here
  8. You are done! Some other things to consider are increasing the mesh resolution in areas of interest to better match the scanned geometry and adding offset to the meshes to provide some fitting tolerance for installing and removing the blocks. enter image description here enter image description here

If additional clearance is needed between the scanned spine and the mold, the diplace modifier can be applied to the geometry. This will project the surfaces of the bones outward a little and give additional room. The image below shows the original spine in geometry as a solid and the displaced geometry in the wire mesh.

enter image description here


$\endgroup$
3
$\begingroup$

I am a veterinarian too and upon trying your work flow do not encounter cut geometry problems. Are your block objects dense meshes (subdivided) or are they low poly? I used a fairly dense mesh block for the attached images. vertebrae model

The exterior of the cut block:

hi poly boolean cut block

The interior of the cut block:

inside of cut block

$\endgroup$
2
$\begingroup$

Some feedback - sadly things didn't work out as I planned but going to keep going. So @Ed_Tate your method worked perfectly. Or almost.

The process:

1) Import the segmented dicom spine file (from an .stl initially) and set up the trajectories enter image description here

2) Add a plane at the appropriate angle enter image description here

3) Add a cube, size appropriately, tab into edit mode, subdivide the underneath (I used an 8x subdivide). I worked out that I had to rotate the spine first so that a z-direction projection would approach it from the right way... enter image description here

4) Create a new vector group from the subdivided surface, tab out of edit mode, add a shrinkwrap modifier specifically to that vector group, project it in the Z direction (important to tick the 'positive' box in the constraints otherwise nothing happens with the joined spine/plane as the target. If you don't restrict the projection to the z direction you get some odd shapes as well... enter image description here

enter image description here

enter image description here

5) Add a difference boolean modifier to the block using the trajectories created in step 1. enter image description here

6) Import the shape into a new file (using the append function), export as an .stl again, check the shape in kisslicer before sending it off for 3D printing (then sterilise prior to surgery) enter image description here

So why didn't it work? I played around with different offsets - 0.5, 1.0 and 2.0mm - I wanted the fit to be close enough that my trajectories would still be accurate but had to be able to get the piece into place. and in the end still couldn't get the guide in place. I think the problem was that the offset (I assume?) only applies in the plane you've projected in (z direction) meaning that there was no clearance around the bone in the x or y planes. And the other issue is that taking the dicom image and exporting it relies on segmenting the CT scan - and it can be remarkably difficult to tell from CT what is bone and what is cartilage.

However - I will keep trying....

$\endgroup$
  • $\begingroup$ A note was added to the original answer to show a way to add room to the fixture using the displace modifier. This added extra space to the mold along the normals to the surface of the spine. $\endgroup$ – Ed Tate Jun 12 '17 at 3:16

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.