freecad

How to create an arch in FreeCAD for architecture?


I'd like to create an arch in FreeCAD to be used in the architecture module. In OpenSCAD it'd look like this:

Arch in OpenSCAD

Source:

rotate(270, v=[1,0,0]) {difference() {rotate_extrude(fn=500) {translate([750, 0, 0])square([400,400]);};
translate([-2000, 0, 0]) {cube([4000, 1500, 1500]);};
}};

Using the OpenSCAD module is not a solution because I'd like to use the grid snapping features and be able to edit the arch without deleting and recreating it from OpenSCAD source code (which apparently is necessary in FreeCAD).

Searching for solutions with a search engine is impossible because apparently only referring to the architecture module (= Arch) are displayed.


Solution

  • It's possible to create an arch for usage in the architecture module by

    The equivalent FreeCAD scripting code is:

    import Part
    import Sketcher
    import Arch
    
    App.newDocument("Unnamed")
    App.setActiveDocument("Unnamed")
    App.ActiveDocument=App.getDocument("Unnamed")
    Gui.ActiveDocument=Gui.getDocument("Unnamed")
    Gui.activateWorkbench("PartDesignWorkbench")
    App.activeDocument().addObject('Sketcher::SketchObject','Sketch')
    App.activeDocument().Sketch.Placement = App.Placement(App.Vector(0.000000,0.000000,0.000000),App.Rotation(-0.707107,0.000000,0.000000,-0.707107))
    #Gui.activeDocument().activeView().setCamera('#Inventor V2.1 ascii \n OrthographicCamera {\n viewportMapping ADJUST_CAMERA\n  position 0 -87 0 \n  orientation -1 0 0  4.712389\n  nearDistance -112.88701\n  farDistance 287.28702\n  aspectRatio 1\n  focalDistance 87\n  height 143.52005\n\n}')
    Gui.activeDocument().setEdit('Sketch')
    App.ActiveDocument.Sketch.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(0.000000,-0.000000,0),App.Vector(0,0,1),200.000000),0.000000,3.141593))
    App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('Coincident',0,3,-1,1)) 
    App.ActiveDocument.Sketch.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(0.000000,-0.000000,0),App.Vector(0,0,1),300.000000),0.000000,3.141593))
    App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('Coincident',1,3,-1,1)) 
    App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('PointOnObject',1,2,-1)) 
    App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('PointOnObject',1,1,-1)) 
    App.ActiveDocument.Sketch.addGeometry(Part.Line(App.Vector(-300.000000,-0.000000,0),App.Vector(-200.000000,-0.000000,0)))
    App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('Coincident',2,1,1,2)) 
    App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('Coincident',2,2,0,2)) 
    App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('Horizontal',2)) 
    App.ActiveDocument.Sketch.addGeometry(Part.Line(App.Vector(200.000000,-0.000000,0),App.Vector(300.000000,-0.000000,0)))
    App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('Coincident',3,1,0,1)) 
    App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('Coincident',3,2,1,1)) 
    App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('Horizontal',3)) 
    Gui.activeDocument().resetEdit()
    App.ActiveDocument.recompute()
    Gui.activateWorkbench("ArchWorkbench")
    Gui.activeDocument().activeView().viewAxometric()
    Arch.makeStructure(FreeCAD.ActiveDocument.Sketch)
    FreeCAD.getDocument("Unnamed").getObject("Structure").Height = '100 mm'
    Gui.SendMsgToActiveView("ViewFit")
    App.ActiveDocument.recompute()
    Gui.SendMsgToActiveView("ViewFit")