feat: establish reproducible FreeCAD web compatibility baseline
This commit is contained in:
113
scripts/freecad-partdesign-dressup-oracle.py
Normal file
113
scripts/freecad-partdesign-dressup-oracle.py
Normal file
@@ -0,0 +1,113 @@
|
||||
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=(",", ":")))
|
||||
Reference in New Issue
Block a user