Files
Web_FreeCAD_Bitbybit/scripts/freecad-partdesign-failure-oracle.py

98 lines
3.3 KiB
Python

import json
import FreeCAD as App
import Part
import Sketcher
FREECAD_COMMIT = "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d"
TYPE_IDS = [
"PartDesign::Pad",
"PartDesign::Pocket",
"PartDesign::Revolution",
"PartDesign::Groove",
"PartDesign::AdditiveLoft",
"PartDesign::SubtractiveLoft",
"PartDesign::AdditivePipe",
"PartDesign::SubtractivePipe",
"PartDesign::Fillet",
"PartDesign::Chamfer",
"PartDesign::Draft",
"PartDesign::Thickness",
"PartDesign::Mirrored",
"PartDesign::MultiTransform",
"PartDesign::LinearPattern",
"PartDesign::PolarPattern",
"PartDesign::Hole",
]
ACCEPTED_EMPTY_TYPE_IDS = {
"PartDesign::Mirrored",
"PartDesign::MultiTransform",
"PartDesign::LinearPattern",
"PartDesign::PolarPattern",
}
def run_case(type_id):
case_id = "missing-input-" + type_id.split("::", 1)[1].lower()
document = App.newDocument("FailureOracle_" + case_id.replace("-", "_"))
try:
body = document.addObject("PartDesign::Body", "Body")
feature = document.addObject(type_id, "Feature")
body.addObject(feature)
recompute_result = document.recompute()
shape_null = bool(feature.Shape.isNull())
state = [str(value) for value in feature.State]
try:
status_string = str(feature.getStatusString())
except Exception:
status_string = ""
invalid = shape_null and ("Invalid" in state or status_string != "Valid")
observed = "rejected" if invalid else "accepted-empty" if shape_null else "accepted"
expected = "accepted-empty" if type_id in ACCEPTED_EMPTY_TYPE_IDS else "rejected"
return {
"id": case_id,
"typeId": type_id,
"inputClass": "missing-required-input",
"expected": expected,
"observed": observed,
"passed": observed == expected,
"recomputeResult": bool(recompute_result),
"shapeNull": shape_null,
"state": state,
"statusString": status_string,
}
except Exception as error:
expected = "accepted-empty" if type_id in ACCEPTED_EMPTY_TYPE_IDS else "rejected"
return {
"id": case_id,
"typeId": type_id,
"inputClass": "missing-required-input",
"expected": expected,
"observed": "rejected",
"passed": expected == "rejected",
"errorType": type(error).__name__,
"error": str(error),
}
finally:
App.closeDocument(document.Name)
cases = [run_case(type_id) for type_id in TYPE_IDS]
report = {
"schemaVersion": 1,
"baselineId": "freecad-1.1.1-partdesign-failure-oracle",
"freecadVersion": ".".join(App.Version()[0:3]),
"gitCommit": FREECAD_COMMIT,
"status": "pass" if all(case["passed"] for case in cases) else "failed",
"summary": {
"cases": len(cases),
"passed": sum(1 for case in cases if case["passed"]),
"rejected": sum(1 for case in cases if case["observed"] == "rejected"),
"acceptedEmpty": sum(1 for case in cases if case["observed"] == "accepted-empty"),
"accepted": sum(1 for case in cases if case["observed"] == "accepted"),
},
"cases": cases,
}
print("FREECAD_PARTDESIGN_FAILURE_ORACLE_RESULT=" + json.dumps(report, sort_keys=True))