mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-26 18:21:59 +00:00
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.
This commit is contained in:
+18
-18
@@ -1,16 +1,16 @@
|
|||||||
ISO-10303-21;
|
ISO-10303-21;
|
||||||
HEADER;
|
HEADER;
|
||||||
FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1');
|
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'));
|
FILE_SCHEMA(('IFC4X3_ADD2'));
|
||||||
ENDSEC;
|
ENDSEC;
|
||||||
DATA;
|
DATA;
|
||||||
#1=IFCPROJECT('1tjHZhewf3AROX1xjpvefY',$,'AdaProject',$,$,$,$,(#11),#6);
|
#1=IFCPROJECT('3kk2KcD29DrxlrjJ23wiG2',$,'AdaProject',$,$,$,$,(#11),#6);
|
||||||
#2=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
|
#2=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
|
||||||
#3=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
|
#3=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
|
||||||
#4=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
|
#4=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
|
||||||
#5=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
|
#5=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
|
||||||
#6=IFCUNITASSIGNMENT((#5,#4,#2,#3));
|
#6=IFCUNITASSIGNMENT((#3,#5,#4,#2));
|
||||||
#7=IFCCARTESIANPOINT((0.,0.,0.));
|
#7=IFCCARTESIANPOINT((0.,0.,0.));
|
||||||
#8=IFCDIRECTION((0.,0.,1.));
|
#8=IFCDIRECTION((0.,0.,1.));
|
||||||
#9=IFCDIRECTION((1.,0.,0.));
|
#9=IFCDIRECTION((1.,0.,0.));
|
||||||
@@ -24,18 +24,18 @@ DATA;
|
|||||||
#17=IFCORGANIZATION('ADA','Assembly For Design and Analysis',$,$,$);
|
#17=IFCORGANIZATION('ADA','Assembly For Design and Analysis',$,$,$);
|
||||||
#18=IFCPERSONANDORGANIZATION(#16,#17,$);
|
#18=IFCPERSONANDORGANIZATION(#16,#17,$);
|
||||||
#19=IFCAPPLICATION(#17,'XXX','ADA','ADA');
|
#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.));
|
#21=IFCDIRECTION((0.,0.,1.));
|
||||||
#22=IFCDIRECTION((1.,0.,0.));
|
#22=IFCDIRECTION((1.,0.,0.));
|
||||||
#23=IFCCARTESIANPOINT((0.,0.,0.));
|
#23=IFCCARTESIANPOINT((0.,0.,0.));
|
||||||
#24=IFCAXIS2PLACEMENT3D(#23,#21,#22);
|
#24=IFCAXIS2PLACEMENT3D(#23,#21,#22);
|
||||||
#25=IFCLOCALPLACEMENT($,#24);
|
#25=IFCLOCALPLACEMENT($,#24);
|
||||||
#26=IFCSITE('1$h1D7pKLBhQ2roRvKz9Kq',#20,'Ada',$,$,#25,$,$,.ELEMENT.,$,$,$,$,$);
|
#26=IFCSITE('3192LLwf9Et9NYY6Dp1HMI',#20,'Ada',$,$,#25,$,$,.ELEMENT.,$,$,$,$,$);
|
||||||
#27=IFCRELAGGREGATES('1cbS0eMMz5482GelhPUH3D',#20,'Project Container',$,#1,(#26));
|
#27=IFCRELAGGREGATES('3sB8i$7If0y9iXdBJx7Et7',#20,'Project Container',$,#1,(#26));
|
||||||
#28=IFCPROPERTYSINGLEVALUE('project',$,IFCTEXT('AdaProject'),$);
|
#28=IFCPROPERTYSINGLEVALUE('project',$,IFCTEXT('AdaProject'),$);
|
||||||
#29=IFCPROPERTYSINGLEVALUE('schema',$,IFCTEXT('IFC4X3_add2'),$);
|
#29=IFCPROPERTYSINGLEVALUE('schema',$,IFCTEXT('IFC4X3_add2'),$);
|
||||||
#30=IFCPROPERTYSET('2Jj1ZXLcTFjxFj$8jn9r9Z',#20,'Properties',$,(#28,#29));
|
#30=IFCPROPERTYSET('16zSs_zL5FTQaH0f6iQohK',#20,'Properties',$,(#28,#29));
|
||||||
#31=IFCRELDEFINESBYPROPERTIES('30tu3wf014T9Gbje7aeoNI',#20,'Properties',$,(#26),#30);
|
#31=IFCRELDEFINESBYPROPERTIES('2hQUoEcor7uf16HkCAa06h',#20,'Properties',$,(#26),#30);
|
||||||
#32=IFCMATERIAL('S355',$,'Steel');
|
#32=IFCMATERIAL('S355',$,'Steel');
|
||||||
#33=IFCPROPERTYSINGLEVALUE('Grade',$,IFCTEXT('S355'),$);
|
#33=IFCPROPERTYSINGLEVALUE('Grade',$,IFCTEXT('S355'),$);
|
||||||
#34=IFCPROPERTYSINGLEVALUE('YieldStress',$,IFCPRESSUREMEASURE(355000000.),$);
|
#34=IFCPROPERTYSINGLEVALUE('YieldStress',$,IFCPRESSUREMEASURE(355000000.),$);
|
||||||
@@ -45,21 +45,21 @@ DATA;
|
|||||||
#38=IFCPROPERTYSINGLEVALUE('SpecificHeatCapacity',$,IFCSPECIFICHEATCAPACITYMEASURE(0.03),$);
|
#38=IFCPROPERTYSINGLEVALUE('SpecificHeatCapacity',$,IFCSPECIFICHEATCAPACITYMEASURE(0.03),$);
|
||||||
#39=IFCPROPERTYSINGLEVALUE('MassDensity',$,IFCMASSDENSITYMEASURE(7850.),$);
|
#39=IFCPROPERTYSINGLEVALUE('MassDensity',$,IFCMASSDENSITYMEASURE(7850.),$);
|
||||||
#40=IFCMATERIALPROPERTIES('MaterialMechanical','A Material property description',(#33,#34,#35,#36,#37,#38,#39),#32);
|
#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.));
|
#42=IFCDIRECTION((0.,0.,1.));
|
||||||
#43=IFCDIRECTION((1.,0.,0.));
|
#43=IFCDIRECTION((1.,0.,0.));
|
||||||
#44=IFCCARTESIANPOINT((0.,0.,0.));
|
#44=IFCCARTESIANPOINT((0.,0.,0.));
|
||||||
#45=IFCAXIS2PLACEMENT3D(#44,#42,#43);
|
#45=IFCAXIS2PLACEMENT3D(#44,#42,#43);
|
||||||
#46=IFCLOCALPLACEMENT(#25,#45);
|
#46=IFCLOCALPLACEMENT(#25,#45);
|
||||||
#47=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.1,0.),(0.1,0.05)),$);
|
#47=IFCCARTESIANPOINTLIST2D(((0.1,0.05),(0.,0.),(0.1,0.),(0.1,0.05)),$);
|
||||||
#48=IFCINDEXEDPOLYCURVE(#47,(IFCLINEINDEX((3,1)),IFCLINEINDEX((1,2)),IFCLINEINDEX((2,3))),$);
|
#48=IFCINDEXEDPOLYCURVE(#47,$,$);
|
||||||
#49=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#48);
|
#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)),$);
|
#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((2,1)),IFCARCINDEX((1,3,4)),IFCLINEINDEX((4,5)),IFCARCINDEX((5,6,7)),IFCLINEINDEX((7,8)),IFCARCINDEX((8,9,10)),IFCLINEINDEX((10,11))),$);
|
#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.));
|
#52=IFCDIRECTION((1.,0.,0.));
|
||||||
#53=IFCCARTESIANPOINT((0.,0.,0.));
|
#53=IFCCARTESIANPOINT((0.,0.,0.));
|
||||||
#54=IFCDIRECTION((0.,0.,-1.));
|
#54=IFCDIRECTION((0.,0.,1.));
|
||||||
#55=IFCDIRECTION((0.,1.,0.));
|
#55=IFCDIRECTION((1.,0.,0.));
|
||||||
#56=IFCAXIS2PLACEMENT3D(#53,#54,#55);
|
#56=IFCAXIS2PLACEMENT3D(#53,#54,#55);
|
||||||
#57=IFCFIXEDREFERENCESWEPTAREASOLID(#49,#56,#51,$,$,#52);
|
#57=IFCFIXEDREFERENCESWEPTAREASOLID(#49,#56,#51,$,$,#52);
|
||||||
#58=IFCSHAPEREPRESENTATION(#12,'Body','AdvancedSweptSolid',(#57));
|
#58=IFCSHAPEREPRESENTATION(#12,'Body','AdvancedSweptSolid',(#57));
|
||||||
@@ -68,7 +68,7 @@ DATA;
|
|||||||
#61=IFCSURFACESTYLESHADING(#60,0.);
|
#61=IFCSURFACESTYLESHADING(#60,0.);
|
||||||
#62=IFCSURFACESTYLE('Color1',.BOTH.,(#61));
|
#62=IFCSURFACESTYLE('Color1',.BOTH.,(#61));
|
||||||
#63=IFCSTYLEDITEM(#57,(#62),'Color1');
|
#63=IFCSTYLEDITEM(#57,(#62),'Color1');
|
||||||
#64=IFCBUILDINGELEMENTPROXY('34gqNt7M58Z972x$etr9V2',#20,'sweep2',$,$,#46,#59,$,$);
|
#64=IFCBUILDINGELEMENTPROXY('0Yr8J8fnj47xCNdvnijjk4',#20,'sweep2',$,$,#46,#59,$,$);
|
||||||
#65=IFCRELCONTAINEDINSPATIALSTRUCTURE('1kbNj7znLCygBdHO9SJygX',#20,'Physical model',$,(#64),#26);
|
#65=IFCRELCONTAINEDINSPATIALSTRUCTURE('1Bl6up0hb69elL9bAj0Yd6',#20,'Physical model',$,(#64),#26);
|
||||||
ENDSEC;
|
ENDSEC;
|
||||||
END-ISO-10303-21;
|
END-ISO-10303-21;
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import pathlib
|
import pathlib
|
||||||
from typing import List, Sequence, Tuple
|
from collections.abc import Sequence
|
||||||
|
|
||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
import pytest
|
import pytest
|
||||||
from OCC.Core.TopoDS import TopoDS_Shape, TopoDS_Compound
|
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:
|
if not verts:
|
||||||
return (0, 0, 0), (0, 0, 0)
|
return (0, 0, 0), (0, 0, 0)
|
||||||
xs = [v[0] for v in verts]
|
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])
|
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)]
|
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:
|
try:
|
||||||
import ifcopenshell.geom as geom
|
import ifcopenshell.geom as geom
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -62,7 +62,8 @@ def load_ifc_occ_shape(ifc_path: str) -> TopoDS_Shape:
|
|||||||
occ_shape = shape_result.geometry
|
occ_shape = shape_result.geometry
|
||||||
if isinstance(occ_shape, TopoDS_Compound):
|
if isinstance(occ_shape, TopoDS_Compound):
|
||||||
json_data = occ_shape.DumpJson()
|
json_data = occ_shape.DumpJson()
|
||||||
print(json_data)
|
if verbose:
|
||||||
|
print(json_data)
|
||||||
else:
|
else:
|
||||||
raise NotImplemented(f"Unsupported shape type: {type(occ_shape)}")
|
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)
|
ifc_mn, ifc_mx, ifc_sz = load_ifc_mesh_bbox(ifc_file_path)
|
||||||
occ_shape = load_ifc_occ_shape(ifc_file_path)
|
occ_shape = load_ifc_occ_shape(ifc_file_path)
|
||||||
assert occ_shape is not None
|
assert occ_shape is not None
|
||||||
assert ifc_sz == pytest.approx((0.8764374444355525, 1.800000587893038, 2.095849252263605))
|
assert ifc_mn == pytest.approx((50.0, 100.0, 200.0))
|
||||||
assert ifc_mn == pytest.approx((50.0, 99.9, 200.0))
|
assert ifc_mx == pytest.approx((50.89584911299009, 101.70000025609394, 202.0000003710634))
|
||||||
assert ifc_mx == pytest.approx((50.87643744443555, 101.70000058789304, 202.0958492522636))
|
assert ifc_sz == pytest.approx((0.8958491129900921, 1.7000002560939436, 2.0000003710634076))
|
||||||
|
|
||||||
|
|
||||||
def test_pipe_12d(geom_dir):
|
def test_pipe_12d(geom_dir):
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import pytest
|
|||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
|
|
||||||
|
|
||||||
TEST_FILE_DIR = Path("../../test/input/")
|
TEST_FILE_DIR = Path(__file__).parent / "../../../test/input/"
|
||||||
|
|
||||||
|
|
||||||
class TestOpen:
|
class TestOpen:
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import pytest
|
|||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
|
|
||||||
|
|
||||||
TEST_FILE_DIR = Path("../../test/input/")
|
TEST_FILE_DIR = Path(__file__).parent / "../../../test/input/"
|
||||||
|
|
||||||
|
|
||||||
class TestWrite:
|
class TestWrite:
|
||||||
|
|||||||
Reference in New Issue
Block a user