About panels and blocks - new elements for FreeCAD

I've more or less recently been working on two new features for the Architecture workbench of FreeCAD: Panels and furniture. None of these is in what we could call a finished state, but I thought it would be interesting to share some of the process here.

Panels are a new type of object, that inherits all the properties of other architectural objects, such as additions and subtractions or nomenclature (description, tag, etc...). They are based on a 2D profile, which can be made with any of the FreeCAD tools (draft, sketch, etc) or imported from a 2D drawing. They are primarily made for panel constructions such as the wikihouse or pop-up house projects. But like the rest of the Arch workbench tools, the idea is to stay very generic, and to offer a general-purpose tool that can be used in any situation where such a flat object based on a 2D contour might be used.

Currently the tool only offers a simple 3D object, but the complete plan is to offer a full workflow, from design to the output of sheets to be fed to the cutting machine. But I'm still unsure of how all all this must click together. What is the best path to work with these objects? Would you take pre-cut pieces from a base sheet, like plastic airplane models or wooden dinosaurs, then mount them in 3D? Or is it best to draw the pieces directly at their location? But wouldn't that require a way too precise knowledge of your available elements dimensions?

Certainly this will require a bit of practice to sort out. Try to work with the tool the way it currently is, see what are the best paths, experiment. If you are interested in helping with that, there is a dedicated thread on the FreeCAD forum, where you are welcome to propose ideas.

I should also of course contact the wikihouse developers, who might have some more ideas over the question. My first idea had been to try to convert their sketchup models automatically, but this will be harder than it seems, since in sketchup the different parts don't carry enough information to easily determine which faces forms the profile of the object. But that question is not closed yet, we might still figure out an efficient way to achieve that.

On the image above, you can see on the right a model imported directly from one of the wikihouse sketchup models (converted to .dae), and the corresponding cut sheets imported as .dxf. The dxf files made available on the wikihouse site seem to have a weird formatting that FreeCAD doesn't read well, so I opened and resaved it in LibreCAD, then FreeCAD opened it correctly. Then, it's just a matter of selecting all the profiles and pressing the Panel button. The profiles that have holes can be done in two different ways: either making a panel, extruding the hole, then subtracting, or, better, first turning both the profile and the hole into a single sketch with the Draft2Sketch tool, then creating the panel. The thick object on the left is a panel made of several layers, which works the same way as walls: you build several panel objects from the same profile, and give each of them a different offset value.

Currently such multilayer objects have few tools supporting them, but the idea in the future is to make them always behave as one.

Furniture is a trickier subject, although of less importance. The big problem we have here is availability. We all agree that the best would be to have nice, solid-based models like you have in Revit or ArchiCAD, that you can for example find on http://www.bimobject.com. The problem is, both use specific file formats (rfa for revit and gdl for archicad) that are hard or impossible to parse and import in FreeCAD. Some of these sites propose IFC versions, but in 99% of the cases, the IFC version is a degraded faceted version of the model, that lost all its solid information. Creating a model with these objects in Revit or ArchiCAD and exporting it to IFC almost always also results in these pieces of furniture being faceted.

There is one solution for revit families, though, that is not very practical but works: Export them as .sat files, then convert them to a format that FreeCAD likes (.stp or even better, .brep) with the cad exchanger application, which is (currently) free for personal use. That app is developed by Roman Lygin, one of the founding developers of OpenCasCade, FreeCAD's geometry kernel.

Objects obtained from that method are pretty nice and behave perfectly when projected in 2D:

There is another problem, which is that pieces of furniture can be really very complex, if they are modelled faithfully. Which adds a lot of weight to your model, for something that is not essential to the building. So I also looked at another solution: meshes. Meshes are lightweight, you can literally stuff your FreeCAD model with hundreds of them, without caring much about the complexity, and without loosing much performance.

If you look on the web, you will find a lot of 3D models of furniture. A really awful lot. In fact, just looking on the sketchup 3d warehouse, probable the biggest one, you will probably find exactly the piece you want. The problem, of course, is that almost all of these models are meshes, and they vary a lot in terms of quality and complexity. This goes to the point that you will rarely find a furniture model that will convert cleanly to a solid-based object. there is also the problem that curves in meshes are faceted, so their aspect is not very good when projected in 2D.

Finally there is the fact that furniture, as well as other kinds of objects in an architectural document, are often best represented symbolically instead of accurately. For example, when you show the plan view of a washing machine, you won't want to represent all the buttons and controls, otherwise your drawing will become pretty complex to read. Some applications, such as ArchiCAD and many others, solve that problem by allowing the user to define custom 2D representations for a 3D object, for example its top view, or its front view. These representations are then used when creating 2D drawings.

This is an interesting idea, and it would allow the best of both worlds: Being able to pick any mesh you like on the net and use it as a piece of furniture in FreeCAD, and also have these objects coherently represented when creating 2D views of your models.

Of course having to draw 2D views of furniture yourself would be a lot of work, so I also came up with a simple method to create those views automatically from meshes. This method is very brutal and slow, but has the advantage to not depend much on the quality of the mesh: It projects all the facets of the mesh on a plane, remove the facets that point to the wrong side, then unions all these facets into one big flat face. This way you easily - although not quickly nor necessarily beautifully - create contour views of your meshes, with the big advantage that these contours are shapes, so they behave very well when your model is projected on a 2D drawing:

In the arch utilities menu, there is a new command that allows to create these 3 views from a selected mesh.

The new arch furniture object currently implemented in FreeCAD (that is called arch equipment, because it is also aimed at making other kinds of standalone objects such as sinks, light fixtures, etc) is therefore a hybrid. It can be a shape or a mesh, depending on the object you base the furniture object upon, and has 3 slots for 3 additional shapes, for XY, XZ or YZ views. It also has a couple of additional non-geometric properties such as model, url, etc that are convenient for this kind of objects. Currently these 2D views must still be added manually to the furniture object (via python).

Of course nothing would prevent you from furnishing your own 2D views instead of these automatic ones. I'm not sure how far that will prove practical on the long run, but we'll see! If ArchiCAD users do it, why not us!

Anyway, I hope this is a good way to start attacking the problem, leaving the maximum of freedom to the user, which is one of the base concepts of the arch module. Currently mesh-based equipment objects are not treated yet when projected on a Drawing sheet, but that will be taken care of next. Like most of the things we're implementing in FreeCAD, it starts rough, then gets refined along the way, in no small part thanks to the interaction and feedback with users. Check the FreeCAD forum if you are interested in helping!