About me

My name is Ian, I'm currently a software engineer in in Dunedin, New Zealand. Over the last year or so, I've had periods with a fair bit of free time to contribute to FreeCAD.


I like making things, and have occasionally been in situations where a decent 3D CAD program would be nice to have for drawing up plans or ideally running finite-element simulations (mainly for thermal models, but mechanical or electromagnetic would be great too). Especially with the proliferation of 3D printers, I imagine that an open source 3D CAD program could be quite useful, so I think the audience for a program like FreeCAD is rapidly growing.

Relevant experience

Non-computer experience is mainly with manual machine tools, but some homebrew and commercial CNC. I like bikes (mainly without motors) a lot, can TIG weld to a degree, and have some interest in renewable energy. I am interested in design; in the sense of making computer interfaces work well with people, and in presenting information as meaningfully as possible. Design of Everyday Things and The Visual Display of Quantitative Information are two great books that might explain my taste in design.

Computer experience is fairly wide-ranging, but not terribly deep in any particular area. I like Python and sometimes like C++, and have written a fair bit of code in both. Have worked in a range of roles from designing power electronics up through systems administrator roles. I'm currently employed working on embedded "bare metal" and Linux firmware, mainly in C for a VoIP company. My personal machine is a Mac laptop running OS X, and I've spent more time than I care to admit fixing Windows problems.

How I use git

This is intended to eventually either become it's own page or get merged into an existing page. I'm learning git as I go, so there's a good chance that this stuff is only very vaguely correct. It works for me, except when it doesn't.

Initial Setup

  • Clone the FreeCAD repository to your computer
  • Make a github account, setup SSH access to it
  • Setup git to pull master branch from the FreeCAD repo, but push to your github one.

Scenario: Want to try a branch that someone has shared via the forum

Link is of a format like https://github.com/someuser/somerepository/tree/somebranch , and may or may not point directly to the branch of interest. If not, it'll hopefully be clear from the forum post. Go to that github page, and you'll see a link on the right side with a header like "HTTPS clone URL". Click the SSH link below that to turn the link protocol into SSH, copy the address.

Now, in your local command line, cd to your FreeCAD source directory. We're going to check out the master branch, add that user's github repository to your local git repository as a "remote", fetch a list of their branches, then check out a local copy of the interesting branch.

 freecad-src-dir $ git checkout master
   (probably not necessary, but I do this as a habit to remind myself that any changes in the working directory need to be committed)
 freecad-src-dir $ git remote add your_nickname_for_remote_repo <paste SSH link here, eg git@github.com:someuser/somerepository.git>
   (I tend to use the author's username as the local repository name)
 freecad-src-dir $ git fetch your_nickname_for_remote_repo
   (at this point, a "git branch" will show your local branches, "git branch -a" will show all available remote branches too!)
 freecad-src-dir $ git checkout remotes/your_nickname_for_remote_repo/branch_name
   (you'll hopefully get a message about being in 'detached HEAD' - see stackexchange if this concerns you)
 freecad-src-dir $ git checkout -b todays_date_forum_test_N
   (reattach your head, not strictly necessary, but can be handy to have a proper branch)

At this point, you've hopefully not run into any real problems, and have a FreeCAD source tree that's functionally identical to the one shared on the forum! When you're done, a "git checkout master" should get back to the last master you've fetched into your local repository.

Scenario: Haven't discovered "git rebase -i"

Discover it. Don't modify history of a repository that has been shared with others, except with their understanding and consent.

Tinkering space

This is just a scratch space - don't take anything here too seriously.

FreeCAD Design (in the sense of art) Guide

Anti-aliasing should be at least supported everywhere, and enabled by default.

Visible controls that toggle between two states should be indicated in a way that shows their current state. Eg, rather than a button "Toggle axis cross", a checkbox for "show axis cross" is much better.

Tools that are relevant to several workspaces (eg the measurement tool) should be pushed up into a set of general tools. This way, we'll have less work in implementing new workspaces and in updating tools, and we'll create more uniformity in the user interface across different workspaces.

Adding menu items - see Stack Overflow

FreeCAD Design (in the sense of source code) Guide

There needs to be more uniformity in which libraries get used for what. Eg: there seem to be at least 4 types of strings in common use. I'd propose sticking with QStrings, and Qt's signal-slot (rather than Boost's) as the default.

Personally, I don't think new code should be merged until it includes Doxygen-formatted comments!

We should come up with a FreeCAD style guide for each language in use, especially C++. google's might be a good starting point?

There's a good start to a "FreeCAD Architecture" wiki page, in a forum post by Werner at [1] .

A summary of the FreeCAD Unit test framework: [2] .

Currently, the FCStd opening process is a bit finicky and fragile, I've put some more thoughts at [3] and some code that may, or may not, be useful at [4] . Short version is to re-work Base::Reader into something that holds onto a file handle and doles out istreams to specific files, rather than the current approach where it just holds one particular istream.

To use precompiled headers in FreeCAD: at the top of .cpp files (NOT HEADERS) include #include"PreCompiled.h" , then an #ifndef _PreComp_ block with header files that need to be included, but are not part of FreeCAD. Also make sure each precompiled header exists at least once in the PreCompiled.h within the same directory as the cpp file.

Features I'd like to see

  • I've made a separate page for an idea to make error dialogues more informative and helpful to both end-users and developers, for now it's called Helki
  • Have some ideas of a slicer (as in 3D printer slicer) wrapper/workbench, such that hints could be given to the slicer for things like volumes where loose filler is OK, where might need to be stronger, etc. and the slicer could maybe even give a nice 3D preview.
  • The new Assembly and Path, and the recent work on FEM are all quite exciting!
  • Qt5! Lots of good changes will come from this.
  • Multi-threading.
  • A more comprehensive gear tool - for making 3D gears mainly, and I'd like to see a cycloidal profile generator (only relevant for academic interest - mechanical clocks, etc). Note that simply extruding + twisting an involute spur gear profile does not result in a good helical or spur gear design. Being able to draw hypoids would be cool too :).
  • Have been considering gerber PCB design import, with an eye towards FEM but could also be useful for CAM. Would want it to allow for different stackup parameters, for varying amounts of etching undercut (there's probably a better word - the trapezoidal cross section of traces), etc.

"Gotchas" in working on FreeCAD

If, while adding Qt slots, "public slots:" gives you a bunch of errors: remember that in FreeCAD land, we use "public Q_SLOTS:" instead.