From 77acfd70698f8439230387df47a3559de8aece25 Mon Sep 17 00:00:00 2001 From: krande Date: Thu, 28 Aug 2025 13:16:07 +0200 Subject: [PATCH] Refactor tests: update input path resolution, optimize imports, and enhance `load_ifc_occ_shape`. Simplify path definitions in `test_write.py` and `test_open.py`. Replace `typing` with `collections.abc` for `Sequence` usage in `test_sweeps.py` and adjust type hints to use Python's generic collections. Add optional verbosity to `load_ifc_occ_shape` and refine geometry test assertions. Update `simple_sweep_2.ifc` fixtures for consistency with test expectations. --- .../test/fixtures/geom/simple_sweep_2.ifc | 36 +++++++++---------- .../test/geom/test_sweeps.py | 17 ++++----- src/ifcopenshell-python/test/test_open.py | 2 +- src/ifcopenshell-python/test/test_write.py | 2 +- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/ifcopenshell-python/test/fixtures/geom/simple_sweep_2.ifc b/src/ifcopenshell-python/test/fixtures/geom/simple_sweep_2.ifc index 7181f44337..b7c2eaf2e2 100644 --- a/src/ifcopenshell-python/test/fixtures/geom/simple_sweep_2.ifc +++ b/src/ifcopenshell-python/test/fixtures/geom/simple_sweep_2.ifc @@ -1,16 +1,16 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1'); -FILE_NAME('/dev/null','2025-08-27T15:03:01+02:00',('AdaUser'),('AdaOrg'),'IfcOpenShell 0.8.2','IfcOpenShell 0.8.2','Nobody'); +FILE_NAME('/dev/null','2025-08-28T09:45:32+02:00',('AdaUser'),('AdaOrg'),'IfcOpenShell 0.8.2','IfcOpenShell 0.8.2','Nobody'); FILE_SCHEMA(('IFC4X3_ADD2')); ENDSEC; DATA; -#1=IFCPROJECT('1tjHZhewf3AROX1xjpvefY',$,'AdaProject',$,$,$,$,(#11),#6); +#1=IFCPROJECT('3kk2KcD29DrxlrjJ23wiG2',$,'AdaProject',$,$,$,$,(#11),#6); #2=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.); #3=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); #4=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.); #5=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.); -#6=IFCUNITASSIGNMENT((#5,#4,#2,#3)); +#6=IFCUNITASSIGNMENT((#3,#5,#4,#2)); #7=IFCCARTESIANPOINT((0.,0.,0.)); #8=IFCDIRECTION((0.,0.,1.)); #9=IFCDIRECTION((1.,0.,0.)); @@ -24,18 +24,18 @@ DATA; #17=IFCORGANIZATION('ADA','Assembly For Design and Analysis',$,$,$); #18=IFCPERSONANDORGANIZATION(#16,#17,$); #19=IFCAPPLICATION(#17,'XXX','ADA','ADA'); -#20=IFCOWNERHISTORY(#18,#19,.READWRITE.,$,$,#18,#19,1756299781); +#20=IFCOWNERHISTORY(#18,#19,.READWRITE.,$,$,#18,#19,1756367132); #21=IFCDIRECTION((0.,0.,1.)); #22=IFCDIRECTION((1.,0.,0.)); #23=IFCCARTESIANPOINT((0.,0.,0.)); #24=IFCAXIS2PLACEMENT3D(#23,#21,#22); #25=IFCLOCALPLACEMENT($,#24); -#26=IFCSITE('1$h1D7pKLBhQ2roRvKz9Kq',#20,'Ada',$,$,#25,$,$,.ELEMENT.,$,$,$,$,$); -#27=IFCRELAGGREGATES('1cbS0eMMz5482GelhPUH3D',#20,'Project Container',$,#1,(#26)); +#26=IFCSITE('3192LLwf9Et9NYY6Dp1HMI',#20,'Ada',$,$,#25,$,$,.ELEMENT.,$,$,$,$,$); +#27=IFCRELAGGREGATES('3sB8i$7If0y9iXdBJx7Et7',#20,'Project Container',$,#1,(#26)); #28=IFCPROPERTYSINGLEVALUE('project',$,IFCTEXT('AdaProject'),$); #29=IFCPROPERTYSINGLEVALUE('schema',$,IFCTEXT('IFC4X3_add2'),$); -#30=IFCPROPERTYSET('2Jj1ZXLcTFjxFj$8jn9r9Z',#20,'Properties',$,(#28,#29)); -#31=IFCRELDEFINESBYPROPERTIES('30tu3wf014T9Gbje7aeoNI',#20,'Properties',$,(#26),#30); +#30=IFCPROPERTYSET('16zSs_zL5FTQaH0f6iQohK',#20,'Properties',$,(#28,#29)); +#31=IFCRELDEFINESBYPROPERTIES('2hQUoEcor7uf16HkCAa06h',#20,'Properties',$,(#26),#30); #32=IFCMATERIAL('S355',$,'Steel'); #33=IFCPROPERTYSINGLEVALUE('Grade',$,IFCTEXT('S355'),$); #34=IFCPROPERTYSINGLEVALUE('YieldStress',$,IFCPRESSUREMEASURE(355000000.),$); @@ -45,21 +45,21 @@ DATA; #38=IFCPROPERTYSINGLEVALUE('SpecificHeatCapacity',$,IFCSPECIFICHEATCAPACITYMEASURE(0.03),$); #39=IFCPROPERTYSINGLEVALUE('MassDensity',$,IFCMASSDENSITYMEASURE(7850.),$); #40=IFCMATERIALPROPERTIES('MaterialMechanical','A Material property description',(#33,#34,#35,#36,#37,#38,#39),#32); -#41=IFCRELASSOCIATESMATERIAL('1kAam6k_5CO9mOkVDyk7FN',#20,'S355','Objects related to S355',(#64),#32); +#41=IFCRELASSOCIATESMATERIAL('3GCQxFEKjCmPtz21j5vEC_',#20,'S355','Objects related to S355',(#64),#32); #42=IFCDIRECTION((0.,0.,1.)); #43=IFCDIRECTION((1.,0.,0.)); #44=IFCCARTESIANPOINT((0.,0.,0.)); #45=IFCAXIS2PLACEMENT3D(#44,#42,#43); #46=IFCLOCALPLACEMENT(#25,#45); -#47=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.1,0.),(0.1,0.05)),$); -#48=IFCINDEXEDPOLYCURVE(#47,(IFCLINEINDEX((3,1)),IFCLINEINDEX((1,2)),IFCLINEINDEX((2,3))),$); +#47=IFCCARTESIANPOINTLIST2D(((0.1,0.05),(0.,0.),(0.1,0.),(0.1,0.05)),$); +#48=IFCINDEXEDPOLYCURVE(#47,$,$); #49=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#48); -#50=IFCCARTESIANPOINTLIST3D(((100.,50.,-200.389146),(100.,50.,-200.),(100.025071208213,50.0003133895072,-200.486102587622),(100.093998658131,50.001174980994,-200.558749),(100.650041416131,50.0081255269446,-200.906275838506),(100.759324133751,50.0392280068626,-201.012218627291),(100.799999960608,50.1196282582437,-201.138769890994),(100.799999960608,50.6140303261248,-201.764595294385),(100.887867797756,50.7455308473077,-201.931051650581),(101.099999960608,50.7999999361248,-201.999999864385),(101.7,50.8000000827328,-202.000000049965)),$); -#51=IFCINDEXEDPOLYCURVE(#50,(IFCLINEINDEX((2,1)),IFCARCINDEX((1,3,4)),IFCLINEINDEX((4,5)),IFCARCINDEX((5,6,7)),IFCLINEINDEX((7,8)),IFCARCINDEX((8,9,10)),IFCLINEINDEX((10,11))),$); -#52=IFCDIRECTION((1.,-0.,0.)); +#50=IFCCARTESIANPOINTLIST3D(((50.,100.,200.),(50.,100.,200.389146),(50.0003133895072,100.025071208213,200.486102587622),(50.001174980994,100.093998658131,200.558749),(50.0086491903016,100.691934415524,200.932458971772),(50.0310627108963,100.770687414196,201.008805063266),(50.089001837944,100.800000190195,201.100002410475),(50.6760204909973,100.800000000803,201.843063903121),(50.7636872882004,100.858578730855,201.954034522829),(50.7999999397009,101.700000021708,201.999999960467),(50.8000002509973,100.999999960803,202.000000303121)),$); +#51=IFCINDEXEDPOLYCURVE(#50,(IFCLINEINDEX((1,2)),IFCARCINDEX((2,3,4)),IFCLINEINDEX((4,5)),IFCARCINDEX((5,6,7)),IFCLINEINDEX((7,8)),IFCARCINDEX((8,9,11)),IFCLINEINDEX((11,10))),$); +#52=IFCDIRECTION((1.,0.,0.)); #53=IFCCARTESIANPOINT((0.,0.,0.)); -#54=IFCDIRECTION((0.,0.,-1.)); -#55=IFCDIRECTION((0.,1.,0.)); +#54=IFCDIRECTION((0.,0.,1.)); +#55=IFCDIRECTION((1.,0.,0.)); #56=IFCAXIS2PLACEMENT3D(#53,#54,#55); #57=IFCFIXEDREFERENCESWEPTAREASOLID(#49,#56,#51,$,$,#52); #58=IFCSHAPEREPRESENTATION(#12,'Body','AdvancedSweptSolid',(#57)); @@ -68,7 +68,7 @@ DATA; #61=IFCSURFACESTYLESHADING(#60,0.); #62=IFCSURFACESTYLE('Color1',.BOTH.,(#61)); #63=IFCSTYLEDITEM(#57,(#62),'Color1'); -#64=IFCBUILDINGELEMENTPROXY('34gqNt7M58Z972x$etr9V2',#20,'sweep2',$,$,#46,#59,$,$); -#65=IFCRELCONTAINEDINSPATIALSTRUCTURE('1kbNj7znLCygBdHO9SJygX',#20,'Physical model',$,(#64),#26); +#64=IFCBUILDINGELEMENTPROXY('0Yr8J8fnj47xCNdvnijjk4',#20,'sweep2',$,$,#46,#59,$,$); +#65=IFCRELCONTAINEDINSPATIALSTRUCTURE('1Bl6up0hb69elL9bAj0Yd6',#20,'Physical model',$,(#64),#26); ENDSEC; END-ISO-10303-21; diff --git a/src/ifcopenshell-python/test/geom/test_sweeps.py b/src/ifcopenshell-python/test/geom/test_sweeps.py index 6f0ea5b1a8..e5b93ad6d0 100644 --- a/src/ifcopenshell-python/test/geom/test_sweeps.py +++ b/src/ifcopenshell-python/test/geom/test_sweeps.py @@ -1,12 +1,12 @@ import pathlib -from typing import List, Sequence, Tuple +from collections.abc import Sequence import ifcopenshell import pytest from OCC.Core.TopoDS import TopoDS_Shape, TopoDS_Compound -def _bbox_from_vertices(verts: List[Tuple[float, float, float]]): +def _bbox_from_vertices(verts: list[tuple[float, float, float]]): if not verts: return (0, 0, 0), (0, 0, 0) xs = [v[0] for v in verts] @@ -21,11 +21,11 @@ def _size_from_bbox(mn, mx): return (mx[0] - mn[0], mx[1] - mn[1], mx[2] - mn[2]) -def _triples(flat: Sequence[float]) -> List[Tuple[float, float, float]]: +def _triples(flat: Sequence[float]) -> list[tuple[float, float, float]]: return [(float(flat[i]), float(flat[i + 1]), float(flat[i + 2])) for i in range(0, len(flat), 3)] -def load_ifc_occ_shape(ifc_path: str) -> TopoDS_Shape: +def load_ifc_occ_shape(ifc_path: str, verbose=False) -> TopoDS_Shape: try: import ifcopenshell.geom as geom except Exception as e: @@ -62,7 +62,8 @@ def load_ifc_occ_shape(ifc_path: str) -> TopoDS_Shape: occ_shape = shape_result.geometry if isinstance(occ_shape, TopoDS_Compound): json_data = occ_shape.DumpJson() - print(json_data) + if verbose: + print(json_data) else: raise NotImplemented(f"Unsupported shape type: {type(occ_shape)}") @@ -123,9 +124,9 @@ def test_simple_sweep_2(geom_dir): ifc_mn, ifc_mx, ifc_sz = load_ifc_mesh_bbox(ifc_file_path) occ_shape = load_ifc_occ_shape(ifc_file_path) assert occ_shape is not None - assert ifc_sz == pytest.approx((0.8764374444355525, 1.800000587893038, 2.095849252263605)) - assert ifc_mn == pytest.approx((50.0, 99.9, 200.0)) - assert ifc_mx == pytest.approx((50.87643744443555, 101.70000058789304, 202.0958492522636)) + assert ifc_mn == pytest.approx((50.0, 100.0, 200.0)) + assert ifc_mx == pytest.approx((50.89584911299009, 101.70000025609394, 202.0000003710634)) + assert ifc_sz == pytest.approx((0.8958491129900921, 1.7000002560939436, 2.0000003710634076)) def test_pipe_12d(geom_dir): diff --git a/src/ifcopenshell-python/test/test_open.py b/src/ifcopenshell-python/test/test_open.py index fd8864e584..99f312c76e 100644 --- a/src/ifcopenshell-python/test/test_open.py +++ b/src/ifcopenshell-python/test/test_open.py @@ -21,7 +21,7 @@ import pytest import ifcopenshell -TEST_FILE_DIR = Path("../../test/input/") +TEST_FILE_DIR = Path(__file__).parent / "../../../test/input/" class TestOpen: diff --git a/src/ifcopenshell-python/test/test_write.py b/src/ifcopenshell-python/test/test_write.py index 356f46c6fc..352aea2538 100644 --- a/src/ifcopenshell-python/test/test_write.py +++ b/src/ifcopenshell-python/test/test_write.py @@ -22,7 +22,7 @@ import pytest import ifcopenshell -TEST_FILE_DIR = Path("../../test/input/") +TEST_FILE_DIR = Path(__file__).parent / "../../../test/input/" class TestWrite: