quinta-feira, 18 de abril de 2013

Exercise - Moineau Rotor - Solution

As promised, we can observe the solution from the previous exercise.

I tried to record a video to show the solution but my recording gear is terrible. I'll search for a good microphone.

From the exercise we can extract all the important variables.

Follow:

  • Rotor Lobes : 7
  • Rotor Length : 5.8 m
  • MAX OD : 6.5 in
  • MIN OD : 5 in
  • Pitch : 1.45 m/rev
One thing we might have to infer while drawing the rotor is the lobe offset. I will show you while performing the drawing.

To make our lives easier we will use all the above values at the end. I'll show you how to fix everything when we finished with the drawing.
  • Rotor Lobes : 7
  • Rotor Length : 2*\pi
  • MAX OD : 14 m
  • MIN OD : 12 m
  • Pitch : 2*\pi m/rev
First, we know that hypocycloid is a set of parametric equations and can be taken at http://en.wikipedia.org/wiki/Hypocycloid

On the following picture you will observe I put the set of parametric equations and the rest of the values. We don't want a whole hypocycloid. We want only a piece of it and from this piece we can provide the rest. For "Min t" I'm using 0.15 \pi/rad because if I put zero I'm going to have a spike (and we don't need that).  "Max t" is going to be \pi divided by the quantity of lobes. In this case, ~0.448799.
New Entity >> Basic >> Curve
Right know comes the "engineering" assumption. A Moineau pump, of course, doesn't have all those cuspids and we need to round them up. To create the lobes we must have a rolling small inner circle inside of a big one. For this case the big circle has a 7 m radius and to have a seven lobes we must have the a small circle with 1 m  radius. So ... we need to create an "insider" tangent circle.

Create the point:
New Entity >> Basic >> Point
Create the circle based on the last point:
New Entity >> Basic >> Circle
Build a wire:
New Entity >> Build >> Wire
Build an edge (you do want to do this because we can extract some values from this edged curve):
New Entity >> Build >> Edge
By now, we should observe the hypocycloid curve is intersecting the small circle. That is when we have the offset. We want this curve to be  as much tangent as possible. I'm using an offset of 1.17 ... it is going to give you a nice tangent figure.
Operations >> Transformation >> Scale Transform

Fuse the results from the scaled up hypocycloid curve and the small circle.
Operations >> Boolean >> Fuse
You must be asking yourself "What are you doing?!!". But this is the idea, to make your life easy. If you have symmetry in your subject you must use it in your favor, otherwise, you would be wasting time. 

We must clean the resultant fuse. Explode the edges and create a curve for only what we need to have. Remember, we are aiming on a lobe design. 
New Entity >> Explode
Choose which edges we need:
In my case I'm going to need edges 3,5 and 6.
Create a wire from the chosen edges:
New Entity >> Build >> Wire
Mirror the resultant curve and fuse both curves. We can see something close to a lobe. 
Operations >> Transformation >> Mirror Image
Explode it into vertexes.
New Entity >> Explode
In my case, I will need the beginning and the of the curves. Vertex 2 and Vertex 3. By having these two vertexes we can create a reverse arc.
New Entity >> Basic >> Arc

We can see a wire from a lobe. We are almost there. Just create a a wire with this arc and the connected curve.
New Entity >> Build >> Wire
Build a face:
New Entity >> Build >> Face
Do you remember that I stated in a Moineau pump the axial section would look like a helix? We need to make two helical curves. One curve is going to give me the helical path and the other curve is going to give the binormal vector. Without this binormal vector the lobe would get flat while rounding up. We don't want that!!! 

First curve must have a radius of 6 m (small circle's center) and the second, 7 m (hypocycloid radius). We want only a full circle that is why we must have 2\pi at "Max t".

Build the first curve and I will let you build the second:
New Entity >> Basic >> Curve
Create an extrusion along a path. Remember we will use a binormal!!
New Entity >> Generation >> Extrusion Along a Path
We have one lobe! Time to make 6 more.

Perform a multi-rotation:
Operations >> Transformation >> Multi-Rotation
We have a nice screw. Time to put everything in corrected values. To do this we need to scale down every axis by the corrected amount. It takes into account unit and size conversion only.
Operations >> Transformation >> Scale Transform
1.45 m Moineau Rotor , if you want the complete 5.8 m just translate a copy and fuse them.
Answer
Any doubt, just ask.

Cheers!!!!

domingo, 14 de abril de 2013

Exercise - Moineau Rotor

My idea is only to take the skills we got from working with stabilizer and apply on another creation. A Moineau Based Design Rotor and for that we have 2 approaches: Salomé Gui or Salomé Python Script.

As you should know this rotor is part of what we call PCP's (Progressive Cavity Pumps) and they are used in several areas in the industry. In my area, oil well drilling, they are part of what we call, drilling motors. Google it!!

The rotor it self has two types of geometries designs:

  1. Cross-sectional 
  2. Axial 
Cross-Sectional 

Its cross-sectional design is ruled by the hypocycloid. If the inner rolling circle has diameter ratio of 6:1 related to the outer circle, the rotor will have 6 lobes.



Example of a hypocycloid taken from http://images.yourdictionary.com/hypocycloid


Axial

Its axial geometry is going to look like a helix and can be solely defined by pitch length.

A Dyna-Drill drilling motor model inside of its stator.

I will take an example from the specs inside the following link: http://www.cougards.com/wp-content/uploads/_pdfs/Motor%20Operations%20Handbook%202012.pdf

Usually the manufacturers are not going to release the amount of rubber coverage is inside of a stator. I've never did a motor maintenance ... so, we must "engineering" assume some of the values. In other words, we must guess.

From the specs, comes the following picture

Some measurements from a drilling motor

We want the value related to the rotor's length. It should be "H"-"F". To have a value we must pick one motor. I choose a 8" 7-8 4.0 drilling motor. The power section's length should be approximately 5.8 m. The rotor's I must "engineering" guess that would be 6.5". From the specs we know the pitch in this power section will be 4.0 divided by 5.8m and the rotor will have 7 lobes. We have all the values right now!!

We can begin.

I'll post the solution on the next post.





Creating a spiral drilling stabilizer with Salomé - Python Script

As I promised, we are going to take a look at the Python script generated by the dump file from the generated stabilizer. But ... to make things clear ... I'm not an expert on Python but I try to make things to be reusable as much as possible. My coding can be very ugly, but I understand them on the first sight.

I would suggest you to visit the following links regarding Salomé's script:

I know this can be boring but that is why I strongly suggest you to have a problem to be solved, a driver ... something to give you a purpose, and if do so learn something from the script, it can save you lots and lots of time.


Time to go.


  1. Open Salomé and load the hdf file you had created. 
  2. Press "Ctrl" + "D" or go to "File >> Dump Study". 
  3. Name your python file the way you would like.
  4. Save it.
The generated file:

  1. # -*- coding: iso-8859-1 -*-

  2. ###
  3. ### This file is generated automatically by SALOME v6.6.0 with dump python functionality
  4. ###

  5. import sys
  6. import salome

  7. salome.salome_init()
  8. theStudy = salome.myStudy

  9. import salome_notebook
  10. notebook = salome_notebook.notebook
  11. sys.path.insert( 0, r'/media/rafael/5e8dda66-24fd-42c8-b0d6-ece1a49fa89d/Projects/CFD/Salome')

  12. ###
  13. ### GEOM component
  14. ###

  15. import GEOM
  16. import geompy
  17. import math
  18. import SALOMEDS


  19. geompy.init_geom(theStudy)

  20. O = geompy.MakeVertex(0, 0, 0)
  21. OX = geompy.MakeVectorDXDYDZ(1, 0, 0)
  22. OY = geompy.MakeVectorDXDYDZ(0, 1, 0)
  23. OZ = geompy.MakeVectorDXDYDZ(0, 0, 1)
  24. OD_max_point = geompy.MakeVertexWithRef(O, 0.10795, 0, 0)
  25. Vertex_1 = geompy.MakeVertexWithRef(OD_max_point, 0, 0.3, 0)
  26. OD_min_point = geompy.MakeVertexWithRef(Vertex_1, -0.0254, 0.043994, 0)
  27. Vertex_2 = geompy.MakeVertexWithRef(OD_min_point, 0, 0.6, 0)
  28. Vertex_3 = geompy.MakeVertex(0, 0.943994, 0)
  29. Line_1 = geompy.MakeLineTwoPnt(Vertex_3, O)
  30. Line_2 = geompy.MakeLineTwoPnt(O, OD_max_point)
  31. Line_3 = geompy.MakeLineTwoPnt(OD_max_point, Vertex_1)
  32. Line_4 = geompy.MakeLineTwoPnt(Vertex_1, OD_min_point)
  33. Line_5 = geompy.MakeLineTwoPnt(OD_min_point, Vertex_2)
  34. Line_1_vertex_2 = geompy.GetSubShape(Line_1, [2])
  35. Line_6 = geompy.MakeLineTwoPnt(Vertex_2, Line_1_vertex_2)
  36. Wire_1 = geompy.MakeWire([Line_1, Line_2, Line_3, Line_4, Line_5, Line_6], 1e-07)
  37. Face_1 = geompy.MakeFaceWires([Wire_1], 1)
  38. Revolution_1 = geompy.MakeRevolution(Face_1, OY, 360*math.pi/180.0)
  39. geomObj_1 = geompy.MakeCurveParametric("0.5*0.2159*cos(t+pi/2)", "t*1.2/pi", "0.5*0.2159*sin(t+pi/2)", 0, 1, 999, geompy.GEOM.Interpolation, True)
  40. [geomObj_2,geomObj_3] = geompy.ExtractShapes(geomObj_1, geompy.ShapeType["VERTEX"], True)
  41. geomObj_4 = geompy.MakeCurveParametric("0.5*0.1651*cos(t+pi/2)", "t*1.2/pi", "0.5*0.1651*sin(t+pi/2)", 0, 1, 999, geompy.GEOM.Interpolation, True)
  42. [geomObj_5,geomObj_6] = geompy.ExtractShapes(geomObj_4, geompy.ShapeType["VERTEX"], True)
  43. geomObj_7 = geompy.MakeEdge(geomObj_2, geomObj_5)
  44. geomObj_8 = geompy.MakeEdge(geomObj_6, geomObj_3)
  45. geomObj_9 = geompy.MakeWire([geomObj_1, geomObj_4, geomObj_7, geomObj_8], 1e-07)
  46. geomObj_10 = geompy.MakeFaceWires([geomObj_9], 0)
  47. geomObj_11 = geompy.MakeRevolution(geomObj_10, OY, 40*math.pi/180.0)
  48. Curve_1 = geompy.MakeCurveParametric("0.6*0.2159*cos(t+pi/2)", "t*1.2/pi", "0.6*0.2159*sin(t+pi/2)", 0, 0.9, 999, geompy.GEOM.Interpolation, True)
  49. [Vertex_4,Vertex_5] = geompy.ExtractShapes(Curve_1, geompy.ShapeType["VERTEX"], True)
  50. Curve_2 = geompy.MakeCurveParametric("0.5*0.1651*cos(t+pi/2)", "t*1.2/pi", "0.5*0.1651*sin(t+pi/2)", 0, 0.9, 999, geompy.GEOM.Interpolation, True)
  51. [Vertex_6,Vertex_7] = geompy.ExtractShapes(Curve_2, geompy.ShapeType["VERTEX"], True)
  52. Edge_1 = geompy.MakeEdge(Vertex_4, Vertex_6)
  53. Edge_2 = geompy.MakeEdge(Vertex_7, Vertex_5)
  54. Wire_2 = geompy.MakeWire([Curve_1, Curve_2, Edge_1, Edge_2], 1e-07)
  55. Face_2 = geompy.MakeFaceWires([Wire_2], 0)
  56. Revolution_2 = geompy.MakeRevolution(Face_2, OY, 80*math.pi/180.0)
  57. Cut_1 = geompy.MakeCut(Revolution_1, Revolution_2)
  58. geompy.Rotate(Cut_1, OY, 120*math.pi/180.0)
  59. Cut_2 = geompy.MakeCut(Cut_1, Revolution_2)
  60. geompy.Rotate(Cut_2, OY, 120*math.pi/180.0)
  61. Cut_3 = geompy.MakeCut(Cut_2, Revolution_2)
  62. Mirror_1 = geompy.MakeMirrorByAxis(Cut_3, OX)
  63. geompy.Rotate(Mirror_1, OY, 20*math.pi/180.0)
  64. Fuse_1 = geompy.MakeFuse(Cut_3, Mirror_1)
  65. geompy.addToStudy( O, 'O' )
  66. geompy.addToStudy( OX, 'OX' )
  67. geompy.addToStudy( OY, 'OY' )
  68. geompy.addToStudy( OZ, 'OZ' )
  69. geompy.addToStudy( OD_max_point, 'OD_max_point' )
  70. geompy.addToStudy( Vertex_1, 'Vertex_1' )
  71. geompy.addToStudy( OD_min_point, 'OD_min_point' )
  72. geompy.addToStudy( Vertex_2, 'Vertex_2' )
  73. geompy.addToStudy( Vertex_3, 'Vertex_3' )
  74. geompy.addToStudy( Line_1, 'Line_1' )
  75. geompy.addToStudy( Line_2, 'Line_2' )
  76. geompy.addToStudy( Line_3, 'Line_3' )
  77. geompy.addToStudy( Line_4, 'Line_4' )
  78. geompy.addToStudy( Line_5, 'Line_5' )
  79. geompy.addToStudyInFather( Line_1, Line_1_vertex_2, 'Line_1:vertex_2' )
  80. geompy.addToStudy( Line_6, 'Line_6' )
  81. geompy.addToStudy( Wire_1, 'Wire_1' )
  82. geompy.addToStudy( Face_1, 'Face_1' )
  83. geompy.addToStudy( Revolution_1, 'Revolution_1' )
  84. geompy.addToStudy( Curve_1, 'Curve_1' )
  85. geompy.addToStudy( Curve_2, 'Curve_2' )
  86. geompy.addToStudyInFather( Curve_1, Vertex_4, 'Vertex_4' )
  87. geompy.addToStudyInFather( Curve_1, Vertex_5, 'Vertex_5' )
  88. geompy.addToStudyInFather( Curve_2, Vertex_6, 'Vertex_6' )
  89. geompy.addToStudyInFather( Curve_2, Vertex_7, 'Vertex_7' )
  90. geompy.addToStudy( Edge_1, 'Edge_1' )
  91. geompy.addToStudy( Edge_2, 'Edge_2' )
  92. geompy.addToStudy( Wire_2, 'Wire_2' )
  93. geompy.addToStudy( Face_2, 'Face_2' )
  94. geompy.addToStudy( Revolution_2, 'Revolution_2' )
  95. geompy.addToStudy( Cut_1, 'Cut_1' )
  96. geompy.addToStudy( Cut_2, 'Cut_2' )
  97. geompy.addToStudy( Mirror_1, 'Mirror_1' )
  98. geompy.addToStudy( Cut_3, 'Cut_3' )
  99. geompy.addToStudy( Fuse_1, 'Fuse_1' )
Just ugly ... I used to get terrified by coding but, as I mentioned ... you'll save time. You can take this time and enjoy in a nerdish way by improving the code, or the tool, I don't know ... just choose something. 

I would like to explain from the line 1 to 28, but I'm here to be practical so, don't touch them. 

Why do we need to take a look on this? Well, mainly because I would like to understand what is happening and also, because, we can draw any type of stabilizer. But, as heads up, If you want to create any sort of STB you probably are going to debug the code or create more code. Why? A Spiral STB is a tortuous tool and it depends on the precision ... sometimes the cutting action over the virgin tool, won't work, that is when you need to debug the code/design.

From now on I'll try to comment the coding.

29 - From the previous Salomé, I believe, we had to create the origin point. Salomé 6.6 takes care of this by creating the O vertex at (0,0,0). That is what this line of code does, calls the geompy package and asks for MakeVertex function.

30-32 - From these lines is possible to observe that it was created the unit vectors by calling the MakeVector function. Again, this a good thing and shouldn't be touched.

33-36 - As we did with the first steps with stabilizer creation. We used a reference to create our vertexes . The MakeVertexWithRef function asks for the Reference point, "x" axis walk, "y" walk and "z" axis walk all related to a reference point. Pay attention on the values we are inputting. Do they mean anything to you?

38-44 - After point creation, what we did? We had created lines to connect all the points. That is what is happening in here. Pay attention on line 43. We can see two inputs: Line_1 and [2]. The function geompy.GetSubShape(Line_1, [2]) takes Line_1 as the source of the SubShapes (it can be a vertex, edge, line, face, etc ...) and wants the "[2]", for this case, [2], is the first variable when you created the Line_1, so, it would be Vertex_3. If you put [3] it is going to return the second variable, O, and [1] would be the line itself.

Uhhhmmm ... I believe I'm made my point here. I don't want to be boring and you can see the rest of the code is pretty much self explanatory.

So ... What do we want? We want to have this code to be reusable and with those numbers ... just can't. Your brain can decode easily names, not numbers. We must put everything on a easy way. This is my code and for sure can be improved.

Cheers!!!


  1. import GEOM
  2. import geompy
  3. import math
  4. import SALOMEDS

  5. OD_max = 8.5 # in
  6. OD_min = 6.5 # in
  7. a = 20 # deg
  8. WaC = 0.6 # m - Wall Contact
  9. SmSpa = (0.5*(OD_max-OD_min)*0.0254)/math.tan(a*math.pi/180) # m 
  10. FN = 0.6 # m - Tem que ser igual ao Body Neck BN
  11. BN = 0.6 # m
  12. Total_Length = WaC + 2*SmSpa + FN + BN
  13. geompy.init_geom(theStudy)

  14. O = geompy.MakeVertex(0, 0, 0)
  15. OX = geompy.MakeVectorDXDYDZ(1, 0, 0)
  16. OY = geompy.MakeVectorDXDYDZ(0, 1, 0)
  17. OZ = geompy.MakeVectorDXDYDZ(0, 0, 1)
  18. Flow = geompy.MakeVectorDXDYDZ(0, 0, 1)

  19. #Creating the points before making the lines and closing the wire
  20. OD_max_point = geompy.MakeVertexWithRef(O, 0, 0.5*OD_max*0.0254, 0)
  21. Half_WaC = geompy.MakeVertexWithRef(OD_max_point, 0,  0 , WaC/2)
  22. OD_min_point = geompy.MakeVertexWithRef(Half_WaC,0, -0.5*(OD_max-OD_min)*0.0254, SmSpa)
  23. FN_point = geompy.MakeVertexWithRef(OD_min_point, 0, 0 , FN)
  24. FN_point_2 = geompy.MakeVertexWithRef(FN_point, 0, -0.5*OD_min*0.0254, 0)
  25. #

  26. #Connecting the points
  27. Line_1 = geompy.MakeLineTwoPnt(O, OD_max_point)
  28. Line_2 = geompy.MakeLineTwoPnt(OD_max_point, Half_WaC)
  29. Line_3 = geompy.MakeLineTwoPnt(Half_WaC, OD_min_point)
  30. Line_4 = geompy.MakeLineTwoPnt(OD_min_point, FN_point)
  31. Line_5 = geompy.MakeLineTwoPnt(FN_point, FN_point_2)
  32. Line_6 = geompy.MakeLineTwoPnt(FN_point_2, O)
  33. #

  34. #Creating the wireframe and the face
  35. Wire_1 = geompy.MakeWire([Line_1, Line_2, Line_3, Line_4, Line_5, Line_6], 1e-07)
  36. Face_1 = geompy.MakeFaceWires([Wire_1], 1)
  37. #

  38. #Creating the solid. The stabilizer basis
  39. Revolution_1 = geompy.MakeRevolution(Face_1, OZ, 360*math.pi/180.0)
  40. #

  41. #Creating the cutting tool
  42. Curve_1 = geompy.MakeCurveParametric("0.55*OD_max*0.0254*cos(t+pi/2)", "0.55*OD_max*0.0254*sin(t+pi/2)", "t*1.2/pi", 0, (0.5*WaC + SmSpa)*math.pi/1.2, 999, geompy.GEOM.Interpolation, True)
  43. [Vertex_1,Vertex_2] = geompy.ExtractShapes(Curve_1, geompy.ShapeType["VERTEX"], True)

  44. Curve_2 = geompy.MakeCurveParametric("0.5*OD_min*0.0254*cos(t+pi/2)", "0.5*OD_min*0.0254*sin(t+pi/2)", "t*1.2/pi", 0, (0.5*WaC + SmSpa)*math.pi/1.2, 999, geompy.GEOM.Interpolation, True)
  45. [Vertex_3,Vertex_4] = geompy.ExtractShapes(Curve_2, geompy.ShapeType["VERTEX"], True)

  46. Edge_1 = geompy.MakeEdge(Vertex_1, Vertex_3)
  47. Edge_2 = geompy.MakeEdge(Vertex_2, Vertex_4)
  48. Wire_2 = geompy.MakeWire([Curve_1, Curve_2, Edge_1, Edge_2], 1e-07)
  49. Face_2 = geompy.MakeFaceWires([Wire_2], 0)
  50. Revolution_2 = geompy.MakeRevolution(Face_2, OZ, 20*math.pi/180.0)
  51. #

  52. #Cutting, Rotating, Mirroring
  53. Cut_1 = geompy.MakeCut(Revolution_1, Revolution_2)
  54. geompy.Rotate(Cut_1, OZ, 120*math.pi/180.0)
  55. Cut_2 = geompy.MakeCut(Cut_1, Revolution_2)
  56. geompy.Rotate(Cut_2, OZ, 120*math.pi/180.0)
  57. Cut_3 = geompy.MakeCut(Cut_2, Revolution_2)
  58. Mirror_1 = geompy.MakeMirrorByAxis(Cut_3, OY)
  59. geompy.Rotate(Mirror_1, OZ, -40*math.pi/180.0)
  60. Stabilizer = geompy.MakeFuse(Cut_3, Mirror_1)

  61. geompy.addToStudy( Stabilizer, 'Stabilizer' )

  62. geompy.addToStudy( Revolution_1, 'Revolution_1' )
  63. geompy.addToStudy( Revolution_2, 'Revolution_2' )

  64. if salome.sg.hasDesktop():
  65.   salome.sg.updateObjBrowser(1)

sexta-feira, 12 de abril de 2013

Creating a spiral drilling stabilizer with Salomé - Drawing

What I usually like to do with Salomé is draw the tool I want and after that, create a dump file so I can "steal" the Python coding and work on it after.

First things first.

The model:
From http://www.thyssendrillingtools.com
This is a "virgin" unfinished stabilizer, so the manufacturer can cut it in any quantity of blades or shapes he may want. We will work over this type of shape. As you can see, it has two main outside diameters (OD max and OD min) and for the problem I want to solve I will set the following values for the lengths and for the OD's:

  • Bottom Neck=0.6 meters
  • Fishing Neck=0.6 meters
  • Wall Contact=0.6 meters
  • OD_max=0.2159 meters
  • OD_min=0.1651 meters
Just to make things easy.

But, we are missing a small space between the Fishing Neck (FN) and Wall Contact (WaC). We will call it Small Space (SmSpa). And this should be calculated taking into account the angle formed between the end of the FN and beginning of the WaC.

Showing the angle a between FN and WaC.

  • a=30 degrees

Salomé

Turn Salomé On and choose Geometry.
Inside the yellow circle.
Go to "New Entity"
New Entity >> Basic >> Point
Here you'll put the values from the measurements we have. At this point we are placing the value of OD_max divided by 2. I'm using radial symmetry that is why we must divide. For this point, and for the subsequent, we will use a reference. So, for this case we are using the reference "O" (origin).
Pay attention on the selection
On the next picture we can see we changed the reference point. This reference point is the same that was created on the previous picture. This action is to make the point to walk 0.3 meters on the "y" axis. This value came from the half of the WaC.
OD_max_point (the one was created) is now our reference.
Now we will take the previous point as reference again and making him walk SmSpa in "y" axis and also walk -0.0254 m  on the "x" axis. 0.0254 is the difference between the OD values. Remember, our point was on the OD_max and by reducing it in 0.0254 we will place the point in OD_min.
Creating the small space and the OD_min_point
Now we have to create the point for the end of the fishing neck.
Creating FN point
Now we changed the point creation approach. It is not referenced anymore. By having the displacement into the "y" axis for the last point creations you will see we placed the last point at (OD_min/2 , SmSpa+Wac/2+FN,0). We only want the value SmSpa+Wac/2+FN because the next point will be (0,SmSpa+Wac/2+FN,0).
The value on the "y" is just SmSpa+Wac/2+FN
Now we must connect all those dots by creating lines. Create the lines by following the dot creation sequence. Remember to using the origin "O", or else you would have an opened figure. We don't want that.
New Entity >> Basic >> Lines
We should have created 6 lines. Press "Ctrl" and select every single created line.
Selecting all the lines
To have a surface we must create a wire from the those selected lines.
New  Entity >> Build >> Wire

From the created wire we must create a face.
New Entity >> Build >> Face
Now is time to see something solid. We will create the solid by rotating the face we just created. This revolution will occur on the "y" axis.
New Entity >> Generation >> Revolution
Now, we have the stabilizer basis from this point we must create a way of cutting the spiral blades. You must be asking: "Why are we not creating the spiral blades on the top of the minor OD?". Mainly, because, by doing this way we can create some areas of undesired edges and when we create a mesh from this subject, the mesh will be faulty.  

To create the blades, I know, from self experience, the spiral will have the following set of parametric equations (0.5*OD*cos(t+pi/2), 0.5*OD*sin(t+pi/2), t*1.2/pi). The OD value can be OD_max or OD_min. For the OD_max I suggest, instead of using 0.5 as the first multiplier, use 0.6. If you do use 0.5 you might find problems later. So ... for OD_max use 0.6.
New Entity >> Basic >> Curve
From the previous picture you will see I shot my feet twice I didn't use the recommendation I gave you. Up their in the front I had issues. The second shot is the value in the Max t (check above picture) this value "t" should be equal to (WaC/2+ SmSpa)*pi/1.2 rounded to the bigger value. If you use a minor value you will have a "shitty" blade.

Now, do this for OD_min as well and you will have two spiral curves!!!

After creating these curves we must proceed as we did before. Create a wire from these 2 curves. To do this we need to explode both curves into vertexes.
New Entity >> Explode. Pay attention to choose Sub-shape as Vertex
We must connect the exploded vertexes with lines. Connect the opposite vertexes so you´ll have a closed shape and then we can create the wire.
Connecting opposite vertexes
We have 2 lines and two curves. "Ctrl" select them and create a wire.
Creating a wire from the selected lines and curves
So ... to create a solid from a wire, we just need two more steps: create a face and revolution it also.
For this case we don't want to create a planar face. "Untoggle" it. 
Construct by revolving the face. We will rotate only 80 degrees. Don't ask. It is based on experience.
Solid cutting tool
We should have 2 solids and we need to cut the last created solid over the first one.
Operations >> Boolean >> Cut
As a result we should see something like this: 
Result
From the back experience I have, it is fail safe to rotate the bigger solid. This is mainly because of the high tortuosity created by the spiral curve. If you rotate the spiral cutting tool, you might have issues when generating the mesh.
Operations >> Transformation >> Rotation
Do this rotation and cut 2 times and you should have as a result the following solid:
Half of stabilizer body
After this whole trouble we are only on the half of the way. F%&$##

Just kidding.

Lets make a mirror image.
Operations >> Transformation >> Mirror Image
You will see the stabilizer is crooked. By my expectations we should need to rotate the mirrored image 20 degrees.
Correction
Now it is time for the super bonder. Fuse both halfs to make a whole.
Operation >> Boolean >> Fuse
I believe we are done.
Useful stabilizer to be used as a mesh basis
If you have any doubt. Feel free to send me an email.

On the next posting I'll evaluate the Python script from this creation.

PS: This is not the easiest way of creating a stabilizer, but it is a fail safe creation for meshes.