diff --git a/src/ifcopenshell-python/test/fixtures/ColumnPSetsOfSets.ifc b/src/ifcopenshell-python/test/fixtures/ColumnPSetsOfSets.ifc new file mode 100644 index 0000000000..26394a29b3 --- /dev/null +++ b/src/ifcopenshell-python/test/fixtures/ColumnPSetsOfSets.ifc @@ -0,0 +1,145 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]','RevitIdentifiers [ContentGUID: a0df3484-2dab-42c5-b806-8c10d313bee0, VersionGUID: 658c1394-f3a4-43d1-9b3c-eee44a0cd67a, NumberOfSaves: 2]','CoordinateReference [CoordinateBase: Shared Coordinates]'),'2;1'); +FILE_NAME('Column_4x3.ifc','2025-03-12T13:53:30+00:00',(''),(''),'ODA SDAI 24.12','Autodesk Revit 25.4.0.32 (ENG) - IFC 25.4.0.32',''); +FILE_SCHEMA(('IFC4X3_ADD2')); +ENDSEC; +DATA; +#1=IFCORGANIZATION($,'Autodesk Revit 2025 (ENG)',$,$,$); +#2=IFCAPPLICATION(#1,'2025','Autodesk Revit 2025 (ENG)','Revit'); +#3=IFCCARTESIANPOINT((0.,0.,0.)); +#4=IFCCARTESIANPOINT((0.,0.)); +#5=IFCDIRECTION((1.,0.,0.)); +#6=IFCDIRECTION((-1.,0.,0.)); +#7=IFCDIRECTION((0.,1.,0.)); +#8=IFCDIRECTION((0.,-1.,0.)); +#9=IFCDIRECTION((0.,0.,1.)); +#10=IFCDIRECTION((0.,0.,-1.)); +#11=IFCDIRECTION((1.,0.)); +#12=IFCDIRECTION((-1.,0.)); +#13=IFCDIRECTION((0.,1.)); +#14=IFCDIRECTION((0.,-1.)); +#15=IFCPERSON($,'','sfriston',$,$,$,$,$); +#16=IFCORGANIZATION($,'','',$,$); +#17=IFCPERSONANDORGANIZATION(#15,#16,$); +#18=IFCOWNERHISTORY(#17,#2,$,.NOCHANGE.,$,$,$,1741776819); +#19=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#20=IFCAXIS2PLACEMENT3D(#3,$,$); +#21=IFCDIRECTION((6.12323399573677E-17,1.)); +#22=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0.01,#20,#21); +#23=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis','Model',*,*,*,*,#22,$,.GRAPH_VIEW.,$); +#24=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#22,$,.MODEL_VIEW.,$); +#25=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Box','Model',*,*,*,*,#22,$,.MODEL_VIEW.,$); +#26=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('FootPrint','Model',*,*,*,*,#22,$,.MODEL_VIEW.,$); +#27=IFCPROJECT('2WtpI4BQj2nRW6Z10ix44G',#18,'Project Number',$,$,'Project Name','Project Status',(#22),#134); +#28=IFCCLASSIFICATION('CSI (Construction Specifications Institute)','1998',$,'Uniformat','UniFormat Classification','https://www.csiresources.org/standards/uniformat',$); +#29=IFCAXIS2PLACEMENT3D(#3,$,$); +#30=IFCLOCALPLACEMENT(#41,#29); +#31=IFCPOSTALADDRESS($,$,$,$,('Enter address here'),$,'London','London','','United Kingdom'); +#32=IFCBUILDING('2WtpI4BQj2nRW6Z10ix44H',#18,'',$,$,#30,$,'',.ELEMENT.,$,$,#31); +#33=IFCAXIS2PLACEMENT3D(#3,$,$); +#34=IFCLOCALPLACEMENT(#30,#33); +#35=IFCBUILDINGSTOREY('3Zu5Bv0LOHrPC10026FoQQ',#18,'Level 0',$,'Level:Circle Head - Project Datum',#34,$,'Level 0',.ELEMENT.,0.); +#36=IFCCARTESIANPOINT((0.,0.,4000.)); +#37=IFCAXIS2PLACEMENT3D(#36,$,$); +#38=IFCLOCALPLACEMENT(#30,#37); +#39=IFCBUILDINGSTOREY('15Z0v90RiHrPC20026FoKR',#18,'Level 1',$,'Level:Circle Head - Project Datum',#38,$,'Level 1',.ELEMENT.,4000.); +#40=IFCAXIS2PLACEMENT3D(#3,$,$); +#41=IFCLOCALPLACEMENT($,#40); +#42=IFCSITE('2WtpI4BQj2nRW6Z10ix44I',#18,'Default',$,$,#41,$,$,.ELEMENT.,(51,30,23,112487),(0,-7,-37,-956022),0.,$,$); +#43=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('Project Information'),$); +#44=IFCPROPERTYSET('2eqIbmOAscNen5$6huR8Xq',#18,'Pset_SiteCommon',$,(#43)); +#45=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#46=IFCPROPERTYSET('23aMNsN69_fPNNwy7k03QC',#18,'Pset_SpaceCommon',$,(#43,#45)); +#47=IFCRELDEFINESBYPROPERTIES('3Y58BrwSEMG4WuDkCGbgWd',#18,$,$,(#42),#44); +#48=IFCRELDEFINESBYPROPERTIES('0HzXjYMsQZ24nGDtNrqPeG',#18,$,$,(#42),#46); +#51=IFCAXIS2PLACEMENT3D(#3,$,$); +#53=IFCCARTESIANPOINT((0.,0.)); +#54=IFCAXIS2PLACEMENT2D(#53,#11); +#55=IFCISHAPEPROFILEDEF(.AREA.,'UC305x305x97',#54,305.3,307.9,9.90000000000002,15.4,15.2,$,$); +#56=IFCCARTESIANPOINT((-0.,0.,-2500.)); +#57=IFCAXIS2PLACEMENT3D(#56,#9,#6); +#58=IFCEXTRUDEDAREASOLID(#55,#57,#9,2500.); +#59=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.); +#60=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0); +#61=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.0174532925199433),#59); +#62=IFCCONVERSIONBASEDUNIT(#60,.PLANEANGLEUNIT.,'DEGREE',#61); +#63=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); +#64=IFCCOLOURRGB($,0.968627450980392,0.968627450980392,0.968627450980392); +#65=IFCSURFACESTYLERENDERING(#64,0.,$,$,$,$,IFCNORMALISEDRATIOMEASURE(0.5),IFCSPECULAREXPONENT(128.),.NOTDEFINED.); +#66=IFCSURFACESTYLE('Metal - Steel 43-275',.BOTH.,(#65)); +#67=IFCSTYLEDITEM(#58,(#66),$); +#68=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#58)); +#69=IFCAXIS2PLACEMENT3D(#3,$,$); +#70=IFCREPRESENTATIONMAP(#69,#68); +#71=IFCCOLUMNTYPE('1xkS0AgRTExwh4MNwOgZlD',#18,'UC-Universal Columns-Column:UC305x305x97',$,$,(#104),(#70),'12190',$,.COLUMN.); +#72=IFCMATERIAL('Metal - Steel 43-275',$,'Metal'); +#73=IFCCOLOURRGB($,0.,0.,0.); +#74=IFCDRAUGHTINGPREDEFINEDCURVEFONT('continuous'); +#75=IFCCURVESTYLE($,#74,$,#73,$); +#76=IFCFILLAREASTYLEHATCHING(#75,IFCPOSITIVELENGTHMEASURE(355.6),$,#4,45.); +#77=IFCCURVESTYLE($,#74,$,#73,$); +#78=IFCCARTESIANPOINT((0.,381.)); +#79=IFCFILLAREASTYLEHATCHING(#77,IFCPOSITIVELENGTHMEASURE(355.6),$,#78,45.); +#80=IFCFILLAREASTYLE('Steel',(#76,#79),$); +#81=IFCSTYLEDITEM($,(#66,#80),$); +#82=IFCSTYLEDREPRESENTATION(#22,'Style','Material and Cut Pattern',(#81)); +#83=IFCMATERIALDEFINITIONREPRESENTATION($,$,(#82),#72); +#84=IFCMATERIALPROFILE('UC305x305x97',$,#72,#55,$,$); +#85=IFCMATERIALPROFILESET('UC305x305x97',$,(#84),$); +#86=IFCCARTESIANTRANSFORMATIONOPERATOR3D($,$,#3,1.,$); +#87=IFCMAPPEDITEM(#70,#86); +#88=IFCSHAPEREPRESENTATION(#24,'Body','MappedRepresentation',(#87)); +#89=IFCPRODUCTDEFINITIONSHAPE($,$,(#88)); +#90=IFCCARTESIANPOINT((-384.581868533682,-142.731561117908,0.)); +#91=IFCAXIS2PLACEMENT3D(#90,$,$); +#92=IFCLOCALPLACEMENT(#34,#91); +#93=IFCCOLUMN('1xkS0AgRTExwh4MNwOgZlF',#18,'UC-Universal Columns-Column:UC305x305x97:323405',$,'UC-Universal Columns-Column:UC305x305x97',#92,#89,'323405',.COLUMN.); +#94=IFCMATERIALPROFILESETUSAGE(#85,$,$); +#95=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('UC305x305x97'),$); +#96=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#97=IFCPROPERTYSET('2Kyssv$kPduAY5HpYkdCrw',#18,'Pset_ColumnCommon',$,(#45,#95,#96)); +#98=IFCPROPERTYSET('2E7Xcrf_DiKNFkQbRhLvWM',#18,'Pset_EnvironmentalImpactIndicators',$,(#95)); +#99=IFCPROPERTYSINGLEVALUE('Reference',$,IFCLABEL('UC305x305x97'),$); +#100=IFCPROPERTYSET('1sLpijh_wqTpS_F_2QKBAo',#18,'Pset_ReinforcementBarPitchOfColumn',$,(#99)); +#101=IFCRELDEFINESBYPROPERTIES('3_kOamSQVXh_EoGxsxage3',#18,$,$,(#93),#97); +#102=IFCRELDEFINESBYPROPERTIES('15Go3bkBxe46jug3ptPJu$',#18,$,$,(#93),#98); +#103=IFCRELDEFINESBYPROPERTIES('1pHUPkPxgww0bggyxncELu',#18,$,$,(#93),#100); +#104=IFCPROPERTYSET('0AQD0eY0wih1QOXNiuj$Qc',#18,'Pset_ColumnCommon',$,(#96)); +#105=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('Circle Head - Project Datum'),$); +#106=IFCPROPERTYSINGLEVALUE('AboveGround',$,IFCLOGICAL(.F.),$); +#107=IFCPROPERTYSET('2QFFSloDKLdASEirlNrsWG',#18,'Pset_BuildingStoreyCommon',$,(#105,#106)); +#108=IFCPROPERTYSET('2khPkDg4bBoX9QFSHYxSac',#18,'Pset_SpaceCommon',$,(#45,#105)); +#109=IFCRELDEFINESBYPROPERTIES('24vWbHxUvnwTMhwrnGQFQP',#18,$,$,(#35),#107); +#110=IFCRELDEFINESBYPROPERTIES('2H1toi6agC_mYxUZT$TnC9',#18,$,$,(#35),#108); +#111=IFCRELCONTAINEDINSPATIALSTRUCTURE('3Zu5Bv0LOHrPC10066FoQQ',#18,$,$,(#93),#35); +#112=IFCPROPERTYSET('2y6jqut2mGsxPM5c1zUPr2',#18,'Pset_BuildingStoreyCommon',$,(#105,#106)); +#113=IFCPROPERTYSET('0gGGxtUVcimZNbYugu0sB_',#18,'Pset_SpaceCommon',$,(#45,#105)); +#114=IFCRELDEFINESBYPROPERTIES('03h9WtlPXy$ENv9AiS5UZC',#18,$,$,(#39),#112); +#115=IFCRELDEFINESBYPROPERTIES('2TN3LdVu1OLnLXbjiOXGUP',#18,$,$,(#39),#113); +#116=IFCRELAGGREGATES('2PcN$ItYEMyBNCqPOl6HsC',#18,$,$,#27,(#42)); +#117=IFCRELAGGREGATES('25zzFe0MOSV8bFW$lLhYMm',#18,$,$,#42,(#32)); +#118=IFCRELAGGREGATES('2$1LAsj$T3CPRLiPj39tWH',#18,$,$,#32,(#35,#39)); +#119=IFCPROPERTYSINGLEVALUE('NumberOfStoreys',$,IFCCOUNTMEASURE(1),$); +#120=IFCPROPERTYSINGLEVALUE('IsLandmarked',$,IFCLOGICAL(.F.),$); +#121=IFCPROPERTYSET('3U5dlTKgNpdXvGG_h1UB1e',#18,'Pset_BuildingCommon',$,(#43,#119,#120)); +#122=IFCPROPERTYSET('0qtiToowyEn_jqyPw36bkp',#18,'Pset_BuildingElementProxyCommon',$,(#43,#45)); +#123=IFCPROPERTYSET('2Xe4e_z6nyyQBfJ9yOJXYv',#18,'Pset_BuildingStoreyCommon',$,(#43,#106)); +#124=IFCPROPERTYSET('07mSmCWmizAULxEjtjvEjg',#18,'Pset_BuildingSystemCommon',$,(#43)); +#125=IFCPROPERTYSET('1GCWRxA7BU8FaVCiUcq6nY',#18,'Pset_SpaceCommon',$,(#43,#45)); +#126=IFCRELDEFINESBYPROPERTIES('3xYjKs1Tlm5uUJZprkLSk8',#18,$,$,(#32),#121); +#127=IFCRELDEFINESBYPROPERTIES('1Wd03xjOnSPTtTqMwLi2Lg',#18,$,$,(#32),#122); +#128=IFCRELDEFINESBYPROPERTIES('3j$dTd3Sjcf3$gHpCvuLB7',#18,$,$,(#32),#123); +#129=IFCRELDEFINESBYPROPERTIES('09MeCIXvuVClu2P8lIqAgG',#18,$,$,(#32),#124); +#130=IFCRELDEFINESBYPROPERTIES('2HoHooQ7$oNZlOP_3ex_aK',#18,$,$,(#32),#125); +#131=IFCRELASSOCIATESMATERIAL('2n2HQdKqzYK7QnaOEEelx_',#18,$,$,(#71),#85); +#132=IFCRELDEFINESBYTYPE('11G_CSisKD8eybmW1Vx0bN',#18,$,$,(#93),#71); +#133=IFCPRESENTATIONLAYERASSIGNMENT('S-280-M_COLUMN',$,(#68,#88),$); +#134=IFCUNITASSIGNMENT((#19,#62,#63)); +#135=IFCPROPERTYSINGLEVALUE('Label',$,IFCLABEL('Pset 1'),$); +#136=IFCPROPERTYSET('2n2HQdKqzYK7QnaOEEelxy',$,'PSet_1',$,(#135)); +#137=IFCPROPERTYSINGLEVALUE('Label',$,IFCLABEL('Pset 2'),$); +#138=IFCPROPERTYSET('2n2HQdKqzYK7QnaOEEelxz',$,'PSet_2',$,(#137)); +#139=IFCRELDEFINESBYPROPERTIES('2n2HQdKqzYK7QnaOEEelzz',$,$,$,(#93),IFCPROPERTYSETDEFINITIONSET((#136,#138))); +ENDSEC; +END-ISO-10303-21; diff --git a/src/ifcopenshell-python/test/test_streaming_rocksdb_and_simpletyperefs.py b/src/ifcopenshell-python/test/test_streaming_rocksdb_and_simpletyperefs.py new file mode 100644 index 0000000000..5cb3fccf85 --- /dev/null +++ b/src/ifcopenshell-python/test/test_streaming_rocksdb_and_simpletyperefs.py @@ -0,0 +1,63 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Thomas Krijnen +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import gc +import os +import struct +import pytest +import ifcopenshell +import tempfile + +fn = os.path.join(os.path.dirname(__file__), "fixtures/ColumnPSetsOfSets.ifc") + + +def test_stream(): + assert next(filter(lambda d: d.get("id") == 139, ifcopenshell.stream2(fn)))["RelatingPropertyDefinition"] == { + "type": "IfcPropertySetDefinitionSet", + "value": ({"ref": 136}, {"ref": 138}), + } + + +def test_file(): + f = ifcopenshell.open(fn) + assert f[139].RelatingPropertyDefinition.is_a("IfcPropertySetDefinitionSet") + assert {x.id() for x in f[139].RelatingPropertyDefinition[0]} == {136, 138} + + +def test_rocks(): + with tempfile.TemporaryDirectory() as d: + rfn = os.path.join(d, os.path.basename(fn)) + ifcopenshell.convert_path_to_rocksdb(fn, rfn) + + assert os.path.exists(rfn) + + f = ifcopenshell.open(rfn) + assert f[139].RelatingPropertyDefinition.is_a("IfcPropertySetDefinitionSet") + assert {x.id() for x in f[139].RelatingPropertyDefinition[0]} == {136, 138} + + b = f.wrapped_data.key_value_store_query("i|139|5")[2:] + iden = struct.unpack("Q", b)[0] + b = f.wrapped_data.key_value_store_query(f"t|{iden}|0")[1:] + assert set(struct.unpack("Q", b[i : i + 8])[0] for i in range(1, len(b), 9)) == {136, 138} + + del f + gc.collect() + + +if __name__ == "__main__": + pytest.main(["-sx", __file__])