Very nice work! Thanks for sharing! I wrote a quick BoardCAD script (jython) based on your code that produces a nurbs surface from the naca profiles. The fin outline is hard coded in the script, but it would be very nice to add something like your fin designer in future versions of BoardCAD. Let me know if you’re interested in helping out with this. That way you can easily get 3D visualization of the fins as well as support for exporting the fins on various CAD/CAM formats.
/Jonas
------- Jython script ------------
import boardcad.BoardCAD
import math
def naca(thickness, x):
“”" generate the 4-digit naca airfoil profile “”"
a1 = 0.2969 * math.sqrt(x)
b1 = -0.1260 * (x)
c1 = -0.3516 * (x)**2
d1 = 0.2843 * (x)**3
e1 = -0.1015 * (x)**4
profile = thickness/0.2 * (a1+b1+c1+d1+e1) # * chordlength
return profile
get nurbs surfaces
boardhandler=boardcad.BoardCAD.getInstance().getBoardHandler()
board=boardhandler.getActiveBoard()
boardhandler.set_nr_of_segments(4)
boardhandler.set_nr_of_points(0)
deck=board.getDeck()
bottom=board.getBottom()
basethickness=0.5
height=4.3
set leading edge
deck.set_control_point(0,0, boardcad.myPoint(0.0, 0.0, 0.4))
deck.set_control_point(1,0, boardcad.myPoint(0.0, 0.0, 0.4))
deck.set_control_point(2,0, boardcad.myPoint(0.0, 0.0, 0.4))
deck.set_control_point(3,0, boardcad.myPoint(0.5, 0.0, 0.55))
deck.set_control_point(4,0, boardcad.myPoint(1.0, 0.0, 0.8))
deck.set_control_point(5,0, boardcad.myPoint(2.0, 0.0, 1.4))
deck.set_control_point(6,0, boardcad.myPoint(3.0, 0.0, 2.2))
deck.set_control_point(7,0, boardcad.myPoint(3.7, 0.0, 2.9))
deck.set_control_point(8,0, boardcad.myPoint(4.3, 0.0, 3.7))
deck.set_control_point(9,0, boardcad.myPoint(4.3, 0.0, 4.3))
deck.set_control_point(10,0, boardcad.myPoint(4.3, 0.0, 4.3))
deck.set_control_point(11,0, boardcad.myPoint(4.3, 0.0, 4.3))
set trailing edge
deck.set_control_point(0,deck.get_nr_of_points()-1, boardcad.myPoint(0.0, 0.0, 4.0))
deck.set_control_point(1,deck.get_nr_of_points()-1, boardcad.myPoint(0.0, 0.0, 4.0))
deck.set_control_point(2,deck.get_nr_of_points()-1, boardcad.myPoint(0.0, 0.0, 4.0))
deck.set_control_point(3,deck.get_nr_of_points()-1, boardcad.myPoint(0.5, 0.0, 3.9))
deck.set_control_point(4,deck.get_nr_of_points()-1, boardcad.myPoint(1.0, 0.0, 3.8))
deck.set_control_point(5,deck.get_nr_of_points()-1, boardcad.myPoint(2.0, 0.0, 3.9))
deck.set_control_point(6,deck.get_nr_of_points()-1, boardcad.myPoint(3.0, 0.0, 4.3))
deck.set_control_point(7,deck.get_nr_of_points()-1, boardcad.myPoint(3.7, 0.0, 4.6))
deck.set_control_point(8,deck.get_nr_of_points()-1, boardcad.myPoint(4.3, 0.0, 4.5))
deck.set_control_point(9,deck.get_nr_of_points()-1, boardcad.myPoint(4.3, 0.0, 4.3))
deck.set_control_point(10,deck.get_nr_of_points()-1, boardcad.myPoint(4.3, 0.0, 4.3))
deck.set_control_point(11,deck.get_nr_of_points()-1, boardcad.myPoint(4.3, 0.0, 4.3))
set naca profile
zval=[.01, .05, .15, .3, .5, .7, .9]
for j in range(deck.get_nr_of_segments()):
front=deck.get_control_point(j,0)
back=deck.get_control_point(j,deck.get_nr_of_points()-1)
a1 = -basethickness/(height2)
y=front.x
thickness = a1 * y2 + basethickness
deck.set_control_point(j,0,boardcad.myPoint(front.x, front.y, front.z))
deck.set_control_point(j,1,boardcad.myPoint(front.x, front.y, front.z))
deck.set_control_point(j,2,boardcad.myPoint(front.x, front.y, front.z))
for i in range(7):
z=zval[i]
profile=naca(thickness, z)
deck.set_control_point(j,i+3,boardcad.myPoint(front.x,profile,front.z+z*(back.z-front.z)))
deck.set_control_point(j,10,boardcad.myPoint(back.x, back.y, back.z))
deck.set_control_point(j,11,boardcad.myPoint(back.x, back.y, back.z))
deck.set_control_point(j,12,boardcad.myPoint(back.x, back.y, back.z))
for j in range(deck.get_nr_of_segments()):
for i in range(deck.get_nr_of_points()):
p=deck.get_control_point(j,i)
bottom.set_control_point(j,bottom.get_nr_of_points()-1-i,boardcad.myPoint(p.x,-p.y,p.z))
deck.evaluate_surface()
bottom.evaluate_surface()
Executing the script in BoardCAD:

Fin exported to Rhino using STEP:
