Files
Web_FreeCAD_Bitbybit/scripts/freecad-property-area-success.py
wangdequan d11566403d
Some checks failed
real-verification / chrome (push) Has been cancelled
real-verification / freecad-oracle (push) Has been cancelled
real-verification / wasm (push) Has been cancelled
feat: close ordered pairs and property codec batches
2026-08-17 04:58:46 -04:00

112 lines
4.1 KiB
Python

import json
import FreeCAD as App
FREECAD_COMMIT = "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d"
def quantity_snapshot(value):
return {
"raw": str(value),
"numeric": round(float(value.Value), 9),
"unit": str(value.Unit),
}
def object_snapshot(obj):
return {
"name": obj.Name,
"typeId": obj.TypeId,
"state": [str(item) for item in obj.State],
"status": obj.getStatusString(),
}
def element_snapshot(obj, sub_elements):
entries = []
for sub_element in sub_elements:
shape = obj.Shape if not sub_element else obj.getSubObject(sub_element)
entries.append({
"object": obj.Name,
"subElement": sub_element,
"shapeType": shape.ShapeType,
"shapeNull": bool(shape.isNull()),
"shapeValid": bool(shape.isValid()),
"area": round(float(shape.Area), 9),
"faces": len(shape.Faces),
"edges": len(shape.Edges),
"vertices": len(shape.Vertexes),
})
return entries
def run():
document = App.newDocument("PropertyAreaSuccess")
try:
box = document.addObject("Part::Box", "AreaBox")
box.Length = 10
box.Width = 5
box.Height = 2
cylinder = document.addObject("Part::Cylinder", "AreaCylinder")
cylinder.Radius = 3
cylinder.Height = 4
sphere = document.addObject("Part::Sphere", "AreaSphere")
sphere.Radius = 2
measure = document.addObject("Measure::MeasureArea", "AreaProbe")
document.recompute()
cases = []
def capture(case_id, requested):
if requested is not None:
measure.Elements = requested
document.recompute()
references = [] if requested is None else [
(obj, list(sub_elements)) for obj, sub_elements in requested
]
elements = [
entry
for obj, sub_elements in references
for entry in element_snapshot(obj, sub_elements)
]
expected_area = round(sum(entry["area"] for entry in elements), 9)
cases.append({
"id": case_id,
"elements": elements,
"expectedArea": expected_area,
"value": quantity_snapshot(measure.Area),
"propertyStatus": [str(item) for item in measure.getPropertyStatus("Area")],
"editorMode": [str(item) for item in measure.getEditorMode("Area")],
"elementsTypeId": measure.getTypeIdOfProperty("Elements"),
"areaTypeId": measure.getTypeIdOfProperty("Area"),
"object": object_snapshot(measure),
"shape": {"applicable": hasattr(measure, "Shape")},
})
capture("empty-default", None)
capture("planar-face", [(box, ["Face1"])])
capture("cylindrical-face", [(cylinder, ["Face1"])])
capture("surface-face", [(sphere, ["Face1"])])
capture("solid-volume", [(box, [""])])
capture("multi-element-sum", [(box, ["Face1", "Face2"]), (cylinder, ["Face1"])])
return {
"schemaVersion": 1,
"status": "pass",
"baselineId": "freecad-1.1.1-property-area-success",
"freecadVersion": ".".join(str(value) for value in App.Version()[:3]),
"gitCommit": FREECAD_COMMIT,
"object": {"name": measure.Name, "typeId": measure.TypeId},
"property": {"name": "Area", "typeId": measure.getTypeIdOfProperty("Area"), "group": measure.getGroupOfProperty("Area")},
"input": {"name": "Elements", "typeId": measure.getTypeIdOfProperty("Elements"), "group": measure.getGroupOfProperty("Elements")},
"sources": [object_snapshot(source) for source in [box, cylinder, sphere]],
"cases": cases,
"diagnostics": {"exception": None, "documentObjectCount": len(document.Objects)},
}
finally:
App.closeDocument(document.Name)
print("FREECAD_PROPERTY_AREA_SUCCESS_RESULT=" + json.dumps(run(), sort_keys=True))