import json import FreeCAD as App def version_text(): return ".".join(str(value) for value in App.Version()[:3]) def box_document(name): document = App.newDocument(name) body = document.addObject("PartDesign::Body", "Body") box = body.newObject("PartDesign::AdditiveBox", "Box") box.Length = 10 box.Width = 10 box.Height = 10 document.recompute() return document, body, box def shape_result(case_id, document, feature): document.recompute() shape = feature.Shape return { "id": case_id, "typeId": feature.TypeId, "passed": not shape.isNull() and shape.isValid() and len(shape.Solids) == 1, "status": feature.getStatusString(), "solids": len(shape.Solids) if not shape.isNull() else 0, "faces": len(shape.Faces) if not shape.isNull() else 0, "edges": len(shape.Edges) if not shape.isNull() else 0, "volume": float(shape.Volume) if not shape.isNull() else 0.0, } def selected_fillet(): document, body, box = box_document("FilletOracle") feature = body.newObject("PartDesign::Fillet", "Fillet") feature.Base = (box, ["Edge1"]) feature.Radius = 1 result = shape_result("fillet-selected-edge", document, feature) result["selection"] = ["Edge1"] App.closeDocument(document.Name) return result def selected_chamfer(): document, body, box = box_document("ChamferOracle") feature = body.newObject("PartDesign::Chamfer", "Chamfer") feature.Base = (box, ["Edge1"]) feature.Size = 1 result = shape_result("chamfer-selected-edge", document, feature) result["selection"] = ["Edge1"] App.closeDocument(document.Name) return result def selected_draft(): document, body, box = box_document("DraftOracle") datum_plane = body.newObject("PartDesign::Plane", "DatumPlane") datum_plane.AttachmentSupport = [(document.YZ_Plane, "")] datum_plane.MapMode = "FlatFace" datum_line = body.newObject("PartDesign::Line", "DatumLine") datum_line.AttachmentSupport = [(document.X_Axis, "")] datum_line.MapMode = "TwoPointLine" document.recompute() faces = box.Shape.Faces candidates = [index for index, face in enumerate(faces) if face.Surface.Axis == App.Vector(0, 0, 1)] top_face = max(candidates, key=lambda index: faces[index].CenterOfMass.z) feature = body.newObject("PartDesign::Draft", "Draft") feature.Base = (box, ["Face{}".format(top_face + 1)]) feature.NeutralPlane = (datum_plane, [""]) feature.PullDirection = (datum_line, [""]) feature.Angle = 45 feature.Reversed = True document.recompute() if "Invalid" in feature.State: feature.Reversed = False result = shape_result("draft-selected-face", document, feature) result["selection"] = ["Face{}".format(top_face + 1)] result["reversed"] = bool(feature.Reversed) App.closeDocument(document.Name) return result def selected_thickness(): document, body, box = box_document("ThicknessOracle") feature = body.newObject("PartDesign::Thickness", "Thickness") feature.Base = (box, ["Face1"]) feature.Value = 1 feature.Reversed = True feature.Mode = 0 feature.Join = 0 result = shape_result("thickness-selected-face", document, feature) result["selection"] = ["Face1"] result["reversed"] = bool(feature.Reversed) result["elementMapSize"] = int(feature.Shape.ElementMapSize) App.closeDocument(document.Name) return result cases = [selected_fillet(), selected_chamfer(), selected_draft(), selected_thickness()] report = { "schemaVersion": 1, "baselineId": "freecad-1.1.1-partdesign-dressup-oracle", "freecadVersion": version_text(), "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", "status": "pass" if all(case["passed"] for case in cases) else "failed", "tolerance": 1e-7, "cases": cases, "summary": {"cases": len(cases), "passed": sum(1 for case in cases if case["passed"])}, } print("FREECAD_PARTDESIGN_DRESSUP_RESULT=" + json.dumps(report, sort_keys=True, separators=(",", ":")))