## Designing a Surfboard Fin

Post here for help on using FreeCAD's graphical user interface (GUI).
Forum rules

jmaustpc
Posts: 10390
Joined: Tue Jul 26, 2011 6:28 am
Location: Australia

### Re: Designing a Surfboard Fin

woodbuddha wrote:Thanks Mark and Jim. Appreciated you taking the time to help me with this.

I'll have a play around using your suggestions.

TK
One other thing, if using Loft or Sweep, don't forget "ruled" and for Sweep "Frenet" as well.

Ruled means create a "ruled surface", its a maths concept, best to look that up in wikipedia if you don't know what it means.

frenet is to do with how the profile is rotated as it follows a curved path.

Jim
NormandC
Posts: 18534
Joined: Sat Feb 06, 2010 9:52 pm

### Re: Designing a Surfboard Fin

jmaustpc wrote:and for Sweep "Frenet" as well.
If the path is not a helix, Frenet is totally useless.
woodbuddha
Posts: 35
Joined: Mon Jan 06, 2014 2:30 am

### Re: Designing a Surfboard Fin

jmaustpc wrote: This is what I did.
1)I just made one free hand b-spline in Draft WB on the xy plane.
2)then made a second longer Draft B-spline on the xy plane, using draft "snap to end" tool for the start and end points.
2) flipped the long one with the edit menu placement tool in "relative mode"
3) used edit menu Alignment tool to exactly align the start and finish points of the two Draft B-splines
4) then in the Part WB use either "shape builder" to create a face or "Ruled surface" to create a ruled surface.

For anyone reading this, the two results are not identical. A "ruled surface" is a specific mathematical concept, if you don't already know what it means, its best to look up "ruled surface" in Wikipedia where you will get a good explanation.

5) would be to make the other surface, if symmetrical just by using Part Mirror or there are other ways. The bottom surface would then be created by selecting the bottom edges of the two sides.
6)then join them in a shell then convert the shell to a solid both with the Part wb "shape builder".

Jim
Hi Folks,

I thought I would give Jim's method a try to see how it works.

Firstly opened an SVG file from Inkscape where I drew a spitfire wing outline.
I then used the B-Spline tool to copy the outline of the spitfire wing and toggled the visibility to "off" for the original SVG outline. I still haven't worked out how to scale it properly but that's another problem.
Open a half NACA 0012 profile using Mark's macro and sized the chord length to the base length of the spitfire wing outline.
I then used the B-Spline tool to copy the outline of the foil.
Edit - Copy the foil spline and paste it in the wing outline window. Reposition the foil so it's near the base of the wing outline X-Y plane.
Now when I try to snap the ends of the wing outline and the foil it doesn't work.

This is the error meassage:

Unhandled Base::Exception caught in GUIApplication::notify.
The error message is: Face in support shape doesn't exist!
Unhandled Base::Exception caught in GUIApplication::notify.
The error message is: Face in support shape doesn't exist!

What am I doing wrong?

TK

OS: Windows 7
Platform: 32-bit
Version: 0.14.2370 (Git)
Branch: master
Hash: a836759ebd91404954a778ff8885e152611576e1
Python version: 2.6.2
Qt version: 4.5.2
Coin version: 3.1.0
SoQt version: 1.4.1
OCC version: 6.5.1
Attachments
naca0012half.zip
elliptical fin.svg
spitfire wing.FCStd
woodbuddha
Posts: 35
Joined: Mon Jan 06, 2014 2:30 am

### Re: Designing a Surfboard Fin

After much trial and error I managed to model a spitfire wing using Mark's method. I still can't get the wire to b-spline conversion to work properly in my revision of FreeCAD so the lines have flat spots. Hopefully future versions will have this sorted out. I used the the imported airfoils (as per Mark's macro) and this seems to be the easiest way to do it.

For the outline which I used as my guide I drew two ellipses the smaller for the LE and the larger for the TE.

I've also managed to use this same method for a standard surfboard fin outline. I draw the outline first in Inkscape and then import the SVG file, re-scaled it and used it as a guide to scale and measure the foils along the length of the fin.

Some files are attached. Hopefully this saves someone else a whole lotta work.

TK

OS: Windows 7
Platform: 32-bit
Version: 0.14.2370 (Git)
Branch: master
Hash: a836759ebd91404954a778ff8885e152611576e1
Python version: 2.6.2
Qt version: 4.5.2
Coin version: 3.1.0
SoQt version: 1.4.1
OCC version: 6.5.1
Attachments
finlofttest2.FCStd
elliptical fin 4.FCStd
quick61
Posts: 3803
Joined: Sat Aug 24, 2013 2:49 am
Location: u.S.A.

### Re: Designing a Surfboard Fin

Those are looking pretty good. Nice job, and glad to see you stuck with it. Granted, FreeCAD might not be the best or easiest to get these kinds of shapes, but it can get you there.

I should probably put that Airfoil importer up on the Wiki.

Mark
This post made with 0.0% Micro\$oft products - GOT LINUX?
jmaustpc
Posts: 10390
Joined: Tue Jul 26, 2011 6:28 am
Location: Australia

### Re: Designing a Surfboard Fin

Hi TK

I modified your Dwires into Bsplines and it worked perfectly for me here's a picture and the file.
spitwing.png (26.76 KiB) Viewed 1969 times
here is the fcstd file.
elliptical fin 4jmaustpc.FCStd

And I think I have finally worked out why you can't get it to work....you have to Draft wb "upgrade" the aerofoils so that they become Dwires, the convert them to Draft Bsplines, then loft the Draft Bsplines...

The point is that you have to do both the upgrade and Bspline conversion on one item at a time.

For the Draft upgrade operation this is desired behaviour, because if you have two items selected Draft upgrade thinks you want to fuse them ...not do the same operation on each individually.

Similarly Draft Dwire to Bspline...I think...fails with multi selection because it in effect thinks you are asking it to create one Bspline from all the selected Dwires ...as distinct from one Bspline for each of the selected items. I suspect that is by design as well, the idea being you may want to select multiple lines (technically under the surface DLines are actually wires containing one edge, this is so you can add another point to a Dline).

Jim
woodbuddha
Posts: 35
Joined: Mon Jan 06, 2014 2:30 am

### Re: Designing a Surfboard Fin

Hi Jim,

What version of FreeCAD are you running?

I've followed your method and everything works until I try to loft the b-splines. The loft fails and I get this error message.

Geom_BSplineCurve::Poles
bspline loft failed.png (87.16 KiB) Viewed 1950 times
TK

OS: Windows 7
Platform: 32-bit
Version: 0.14.2370 (Git)
Branch: master
Hash: a836759ebd91404954a778ff8885e152611576e1
Python version: 2.6.2
Qt version: 4.5.2
Coin version: 3.1.0
SoQt version: 1.4.1
OCC version: 6.5.1
woodbuddha
Posts: 35
Joined: Mon Jan 06, 2014 2:30 am

### Re: Designing a Surfboard Fin

forgot to attach the file.
Attachments
ellipticalfin5.FCStd
woodbuddha
Posts: 35
Joined: Mon Jan 06, 2014 2:30 am

### Re: Designing a Surfboard Fin

Hi Jim,

FYI when I open your file in my version of FreeCAD, the file opens okay however I get the following errors:

Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>:
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>:
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>: Standard_ConstructionError
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>:
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>:
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>: Standard_ConstructionError
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>:
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>:
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>: Standard_ConstructionError
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>:
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>:
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>:
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>:
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>: Standard_ConstructionError
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>: Standard_ConstructionError
Traceback (most recent call last):
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3461, in onChanged
self.createGeometry(fp)
File "C:\Program Files\FreeCAD0.13\Mod\Draft\Draft.py", line 3472, in createGeometry
spline.interpolate(fp.Points, True)
<type 'exceptions.Exception'>: Standard_ConstructionError

I suspect there is an issue with 14.2370 or the other libraries.

TK

OS: Windows 7
Platform: 32-bit
Version: 0.14.2370 (Git)
Branch: master
Hash: a836759ebd91404954a778ff8885e152611576e1
Python version: 2.6.2
Qt version: 4.5.2
Coin version: 3.1.0
SoQt version: 1.4.1
OCC version: 6.5.1
jmaustpc
Posts: 10390
Joined: Tue Jul 26, 2011 6:28 am
Location: Australia

### Re: Designing a Surfboard Fin

Hi TK

OS: Ubuntu 12.04.4 LTS
Platform: 64-bit
Version: 0.14.3071 (Git)
Branch: master
Hash: 15406d1498e284739fd921d6fdc071905601b34b
Python version: 2.7.3
Qt version: 4.8.2
Coin version: 3.1.3
SoQt version: 1.5.0
OCC version: 6.5.0

It takes a while to generate the shape, a minute or two, but if you wait it works for me.

My version is 701 commits past yours. Why don't you up grade? If you are going to run 0.14dev versions why not the latest? You do have 64bit Windows, or don't you?

I just tried it in 0.13...it crashed.

Then I found an out of date 0.14 build of master on my system and it worked
OS: Ubuntu 12.04.4 LTS
Platform: 64-bit
Version: 0.14.2701 (Git)
Branch: master
Hash: 99673369151fabf8166f1a5c8f2d83e8d84038c2
Python version: 2.7.3
Qt version: 4.8.2
Coin version: 3.1.3
SoQt version: 1.5.0
OCC version: 6.5.0

I found a really old 0.14dev (its still called 0.13) but its 45 commits after 0.13.
OS: Ubuntu 12.04.4 LTS
Platform: 64-bit
Version: 0.13.1875 (Git)
Branch: master
Hash: c08f8abc98ef057628de7865e72b26fae9284988
Python version: 2.7.3
Qt version: 4.8.2
Coin version: 3.1.3
SoQt version: 1.5.0
OCC version: 6.5.4

This one actually produced the wing, but produced a pile of error messages.

Workplane x=Vector (1, 0, 0) y=Vector (0, 1, 0) z=Vector (0, 0, 1)
PropertyPythonObject::Restore: 'module' object has no attribute '_Ellipse'
PropertyPythonObject::Restore: 'module' object has no attribute '_Ellipse'
FeaturePython::onChanged (DWire): Failed to create face from wire
FeaturePython::onChanged (DWire001): Failed to create face from wire
FeaturePython::onChanged (DWire002): Failed to create face from wire
FeaturePython::onChanged (DWire003): Failed to create face from wire
FeaturePython::onChanged (DWire004): Failed to create face from wire
FeaturePython::onChanged (DWire005): Failed to create face from wire
FeaturePython::onChanged (DWire006): Failed to create face from wire
FeaturePython::onChanged (DWire007): Failed to create face from wire
FeaturePython::onChanged (DWire008): Failed to create face from wire
FeaturePython::onChanged (DWire009): Failed to create face from wire
FeaturePython::onChanged (DWire010): Failed to create face from wire
FeaturePython::onChanged (DWire011): Failed to create face from wire
FeaturePython::onChanged (DWire012): Failed to create face from wire
FeaturePython::onChanged (DWire013): Failed to create face from wire
FeaturePython::onChanged (DWire014): Failed to create face from wire
FeaturePython::onChanged (DWire015): Failed to create face from wire
FeaturePython::onChanged (BSpline002):
FeaturePython::onChanged (BSpline003):
FeaturePython::onChanged (BSpline004): Standard_ConstructionError
FeaturePython::onChanged (BSpline005):
FeaturePython::onChanged (BSpline006):
FeaturePython::onChanged (BSpline007): Standard_ConstructionError
FeaturePython::onChanged (BSpline008):
FeaturePython::onChanged (BSpline009):
FeaturePython::onChanged (BSpline010): Standard_ConstructionError
FeaturePython::onChanged (BSpline011):
FeaturePython::onChanged (BSpline012):
FeaturePython::onChanged (BSpline013):
FeaturePython::onChanged (BSpline014):
FeaturePython::onChanged (BSpline015): Standard_ConstructionError
FeaturePython::onChanged (BSpline): Standard_ConstructionError
FeaturePython::onChanged (BSpline001): Standard_ConstructionError
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'
ViewProviderPythonFeature::claimChildren: 'App.FeaturePython' object has no attribute 'Base'

So I think the answer if for you to upgrade FreeCAD and then see if the problem goes away.

Jim