From 57e8e470612ae2bc0acabb65f44b90da3b4febd8 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 19 Sep 2022 13:33:40 +1000 Subject: [PATCH] Minor regression fix --- src/ifcpatch/Makefile | 25 ++ src/ifcpatch/bootstrap.py | 2 - .../ifcpatch/recipes/ExtractElements.py | 4 +- src/ifcpatch/test/__init__.py | 0 src/ifcpatch/test/files/basic.ifc | 241 ++++++++++++++++++ src/ifcpatch/test/test_ExtractElements.py | 30 +++ 6 files changed, 298 insertions(+), 4 deletions(-) create mode 100644 src/ifcpatch/Makefile create mode 100644 src/ifcpatch/test/__init__.py create mode 100644 src/ifcpatch/test/files/basic.ifc create mode 100644 src/ifcpatch/test/test_ExtractElements.py diff --git a/src/ifcpatch/Makefile b/src/ifcpatch/Makefile new file mode 100644 index 0000000000..1909562a75 --- /dev/null +++ b/src/ifcpatch/Makefile @@ -0,0 +1,25 @@ +# BlenderBIM Add-on - OpenBIM Blender Add-on +# Copyright (C) 2022 Dion Moult +# +# This file is part of BlenderBIM Add-on. +# +# BlenderBIM Add-on is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# BlenderBIM Add-on 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with BlenderBIM Add-on. If not, see . + +.PHONY: test +test: + pytest -p no:pytest-blender test + +.PHONY: qa +qa: + black . diff --git a/src/ifcpatch/bootstrap.py b/src/ifcpatch/bootstrap.py index 524482af04..263da876ec 100644 --- a/src/ifcpatch/bootstrap.py +++ b/src/ifcpatch/bootstrap.py @@ -1,4 +1,3 @@ - # IfcPatch - IFC patching utiliy # Copyright (C) 2020, 2021 Dion Moult # @@ -25,4 +24,3 @@ import ifcopenshell.util.element import ifcopenshell.util.schema import ifcpatch.__main__ - diff --git a/src/ifcpatch/ifcpatch/recipes/ExtractElements.py b/src/ifcpatch/ifcpatch/recipes/ExtractElements.py index ac35c43117..b229073417 100644 --- a/src/ifcpatch/ifcpatch/recipes/ExtractElements.py +++ b/src/ifcpatch/ifcpatch/recipes/ExtractElements.py @@ -1,6 +1,5 @@ - # IfcPatch - IFC patching utiliy -# Copyright (C) 2020, 2021 Dion Moult +# Copyright (C) 2020, 2021, 2022 Dion Moult # # This file is part of IfcPatch. # @@ -43,6 +42,7 @@ class Patcher: for owner_history in self.file.by_type("IfcOwnerHistory"): self.owner_history = self.new.add(owner_history) break + self.add_element(self.file.by_type("IfcProject")[0]) selector = ifcopenshell.util.selector.Selector() for element in selector.parse(self.file, self.query): self.add_element(element) diff --git a/src/ifcpatch/test/__init__.py b/src/ifcpatch/test/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ifcpatch/test/files/basic.ifc b/src/ifcpatch/test/files/basic.ifc new file mode 100644 index 0000000000..a6a6a7179d --- /dev/null +++ b/src/ifcpatch/test/files/basic.ifc @@ -0,0 +1,241 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1'); +FILE_NAME('basic.ifc','2021-10-16T11:16:34+11:00',(),(),'IfcOpenShell v0.7.0-6cc7d796','BlenderBIM 0.0.999999','Nobody'); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPERSON('HSeldon','Seldon','Hari',$,$,$,$,$); +#2=IFCORGANIZATION('APTR','Aperture Science',$,$,$); +#3=IFCACTORROLE(.USERDEFINED.,'CONTRIBUTOR',$); +#4=IFCTELECOMADDRESS(.USERDEFINED.,'The main webpage of the software collection.','WEBPAGE',$,$,$,$,'https://ifcopenshell.org',$); +#5=IFCTELECOMADDRESS(.USERDEFINED.,'The BlenderBIM Add-on webpage of the software collection.','WEBPAGE',$,$,$,$,'https://blenderbim.org',$); +#6=IFCTELECOMADDRESS(.USERDEFINED.,'The source code repository of the software collection.','REPOSITORY',$,$,$,$,'https://github.com/IfcOpenShell/IfcOpenShell.git',$); +#7=IFCORGANIZATION($,'IfcOpenShell','IfcOpenShell is an open source (LGPL) software library that helps users and software developers to work with the IFC file format.',(#3),(#4,#5,#6)); +#8=IFCAPPLICATION(#7,'0.0.999999','BlenderBIM Add-on','BlenderBIM'); +#9=IFCPERSONANDORGANIZATION(#1,#2,$); +#10=IFCOWNERHISTORY(#9,#8,.READWRITE.,.ADDED.,1631353388,#9,#8,1631353388); +#11=IFCPROJECT('2xwg5dkcT4T8MlEIX1jLjD',#10,'My Project',$,$,$,$,(#20,#27),#15); +#12=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.); +#13=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); +#14=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.); +#15=IFCUNITASSIGNMENT((#14,#12,#13)); +#16=IFCCARTESIANPOINT((0.,0.,0.)); +#17=IFCDIRECTION((0.,0.,1.)); +#18=IFCDIRECTION((1.,0.,0.)); +#19=IFCAXIS2PLACEMENT3D(#16,#17,#18); +#20=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#19,$); +#21=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#20,$,.MODEL_VIEW.,$); +#22=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Box','Model',*,*,*,*,#20,$,.MODEL_VIEW.,$); +#23=IFCCARTESIANPOINT((0.,0.,0.)); +#24=IFCDIRECTION((0.,0.,1.)); +#25=IFCDIRECTION((1.,0.,0.)); +#26=IFCAXIS2PLACEMENT3D(#23,#24,#25); +#27=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Plan',2,1.E-05,#26,$); +#28=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Plan',*,*,*,*,#27,$,.PLAN_VIEW.,$); +#29=IFCOWNERHISTORY(#9,#8,.READWRITE.,.MODIFIED.,1631353388,#9,#8,1631353388); +#30=IFCSITE('3cz3qtLYbCURHSIUoySdUS',#29,'My Site',$,$,#56,$,$,$,$,$,$,$,$); +#36=IFCOWNERHISTORY(#9,#8,.READWRITE.,.MODIFIED.,1631353388,#9,#8,1631353388); +#37=IFCBUILDING('2dErbdcOP6Nh7ym5xn_$Ec',#36,'My Building',$,$,#63,$,$,$,$,$,$); +#43=IFCOWNERHISTORY(#9,#8,.READWRITE.,.MODIFIED.,1631353388,#9,#8,1631353388); +#44=IFCBUILDINGSTOREY('0MbU9rGEH1LAWUFmJ3gCcg',#43,'Ground Floor',$,$,#70,$,$,$,$); +#50=IFCOWNERHISTORY(#9,#8,.READWRITE.,.ADDED.,1631353388,#9,#8,1631353388); +#51=IFCRELAGGREGATES('1_TFH$83TDGOqH3GdA9HdZ',#50,$,$,#11,(#30)); +#52=IFCCARTESIANPOINT((0.,0.,0.)); +#53=IFCDIRECTION((0.,0.,1.)); +#54=IFCDIRECTION((1.,0.,0.)); +#55=IFCAXIS2PLACEMENT3D(#52,#53,#54); +#56=IFCLOCALPLACEMENT($,#55); +#57=IFCOWNERHISTORY(#9,#8,.READWRITE.,.ADDED.,1631353388,#9,#8,1631353388); +#58=IFCRELAGGREGATES('0rW4qoplT3zBMjr14wc1ok',#57,$,$,#30,(#37)); +#59=IFCCARTESIANPOINT((0.,0.,0.)); +#60=IFCDIRECTION((0.,0.,1.)); +#61=IFCDIRECTION((1.,0.,0.)); +#62=IFCAXIS2PLACEMENT3D(#59,#60,#61); +#63=IFCLOCALPLACEMENT(#56,#62); +#64=IFCOWNERHISTORY(#9,#8,.READWRITE.,.ADDED.,1631353388,#9,#8,1631353388); +#65=IFCRELAGGREGATES('041C6Y06v8$AmAQhXWgREJ',#64,$,$,#37,(#44,#71)); +#66=IFCCARTESIANPOINT((0.,0.,0.)); +#67=IFCDIRECTION((0.,0.,1.)); +#68=IFCDIRECTION((1.,0.,0.)); +#69=IFCAXIS2PLACEMENT3D(#66,#67,#68); +#70=IFCLOCALPLACEMENT(#63,#69); +#71=IFCBUILDINGSTOREY('1Pkxs$2EDD3ApZ07AQn5om',#77,'Level 1',$,$,#152,$,$,$,$); +#72=IFCCARTESIANPOINT((0.,0.,0.)); +#73=IFCDIRECTION((0.,0.,1.)); +#74=IFCDIRECTION((1.,0.,0.)); +#75=IFCAXIS2PLACEMENT3D(#72,#73,#74); +#76=IFCLOCALPLACEMENT(#63,#75); +#77=IFCOWNERHISTORY(#9,#8,.READWRITE.,.MODIFIED.,1631353453,#9,#8,1631353388); +#78=IFCOWNERHISTORY(#9,#8,.READWRITE.,.MODIFIED.,1631353439,#9,#8,1631353439); +#79=IFCSLAB('20Njb8mHv8v9ESSk_1YM2m',#78,'Slab',$,$,#114,#97,$,.BASESLAB.); +#85=IFCINDEXEDPOLYGONALFACE((1,5,7,3)); +#86=IFCINDEXEDPOLYGONALFACE((4,3,7,8)); +#87=IFCINDEXEDPOLYGONALFACE((8,7,5,6)); +#88=IFCINDEXEDPOLYGONALFACE((6,2,4,8)); +#89=IFCINDEXEDPOLYGONALFACE((2,1,3,4)); +#90=IFCINDEXEDPOLYGONALFACE((6,5,1,2)); +#91=IFCCARTESIANPOINTLIST3D(((1.,1.,1.),(1.,1.,-1.),(1.,-1.,1.),(1.,-1.,-1.),(-1.,1.,1.),(-1.,1.,-1.),(-1.,-1.,1.),(-1.,-1.,-1.))); +#92=IFCPOLYGONALFACESET(#91,$,(#85,#86,#87,#88,#89,#90),$); +#93=IFCSHAPEREPRESENTATION(#21,'Body','Tessellation',(#92)); +#94=IFCCARTESIANPOINT((-1.,-1.,-1.)); +#95=IFCBOUNDINGBOX(#94,2.,2.,2.); +#96=IFCSHAPEREPRESENTATION(#22,'Box','BoundingBox',(#95)); +#97=IFCPRODUCTDEFINITIONSHAPE($,$,(#96,#93)); +#98=IFCCOLOURRGB($,0.800000011920929,0.800000011920929,0.800000011920929); +#99=IFCCOLOURRGB($,0.800000011920929,0.800000011920929,0.800000011920929); +#100=IFCSURFACESTYLERENDERING(#98,0.,#99,$,$,$,$,$,.NOTDEFINED.); +#101=IFCSURFACESTYLE('SurfaceStyle',.BOTH.,(#100)); +#102=IFCSTYLEDITEM(#92,(#101),'SurfaceStyle'); +#103=IFCOWNERHISTORY(#9,#8,.READWRITE.,.ADDED.,1631353439,#9,#8,1631353439); +#104=IFCRELCONTAINEDINSPATIALSTRUCTURE('2T4j5EAcn0qQ9vTOZFK9HO',#103,$,$,(#79),#44); +#110=IFCCARTESIANPOINT((0.,0.,0.)); +#111=IFCDIRECTION((0.,0.,1.)); +#112=IFCDIRECTION((1.,0.,0.)); +#113=IFCAXIS2PLACEMENT3D(#110,#111,#112); +#114=IFCLOCALPLACEMENT(#70,#113); +#115=IFCOWNERHISTORY(#9,#8,.READWRITE.,.MODIFIED.,1631353453,#9,#8,1631353443); +#116=IFCWALL('27uW0y7Gr72R8yo2C4vBlV',#115,'Wall',$,$,#157,#134,$,.ELEMENTEDWALL.); +#122=IFCINDEXEDPOLYGONALFACE((1,5,7,3)); +#123=IFCINDEXEDPOLYGONALFACE((4,3,7,8)); +#124=IFCINDEXEDPOLYGONALFACE((8,7,5,6)); +#125=IFCINDEXEDPOLYGONALFACE((6,2,4,8)); +#126=IFCINDEXEDPOLYGONALFACE((2,1,3,4)); +#127=IFCINDEXEDPOLYGONALFACE((6,5,1,2)); +#128=IFCCARTESIANPOINTLIST3D(((1.,1.,1.),(1.,1.,-1.),(1.,-1.,1.),(1.,-1.,-1.),(-1.,1.,1.),(-1.,1.,-1.),(-1.,-1.,1.),(-1.,-1.,-1.))); +#129=IFCPOLYGONALFACESET(#128,$,(#122,#123,#124,#125,#126,#127),$); +#130=IFCSHAPEREPRESENTATION(#21,'Body','Tessellation',(#129)); +#131=IFCCARTESIANPOINT((-1.,-1.,-1.)); +#132=IFCBOUNDINGBOX(#131,2.,2.,2.); +#133=IFCSHAPEREPRESENTATION(#22,'Box','BoundingBox',(#132)); +#134=IFCPRODUCTDEFINITIONSHAPE($,$,(#133,#130)); +#135=IFCSTYLEDITEM(#129,(#101),'SurfaceStyle'); +#136=IFCOWNERHISTORY(#9,#8,.READWRITE.,.MODIFIED.,1631429228,#9,#8,1631353443); +#137=IFCRELCONTAINEDINSPATIALSTRUCTURE('1CgivZt6z1l8IgKaTkZMcT',#136,$,$,(#116,#159),#71); +#148=IFCCARTESIANPOINT((0.,0.,3.)); +#149=IFCDIRECTION((0.,0.,1.)); +#150=IFCDIRECTION((1.,0.,0.)); +#151=IFCAXIS2PLACEMENT3D(#148,#149,#150); +#152=IFCLOCALPLACEMENT(#63,#151); +#153=IFCCARTESIANPOINT((0.,0.,-3.)); +#154=IFCDIRECTION((0.,0.,1.)); +#155=IFCDIRECTION((1.,0.,0.)); +#156=IFCAXIS2PLACEMENT3D(#153,#154,#155); +#157=IFCLOCALPLACEMENT(#152,#156); +#158=IFCOWNERHISTORY(#9,#8,.READWRITE.,.MODIFIED.,1631429175,#9,#8,1631429175); +#159=IFCELEMENTASSEMBLY('122brjtWrFAPe7NkNdFNlG',#158,'Empty',$,$,#174,$,$,$,.ACCESSORY_ASSEMBLY.); +#170=IFCCARTESIANPOINT((0.,0.,0.)); +#171=IFCDIRECTION((0.,0.,1.)); +#172=IFCDIRECTION((1.,0.,0.)); +#173=IFCAXIS2PLACEMENT3D(#170,#171,#172); +#174=IFCLOCALPLACEMENT(#152,#173); +#175=IFCOWNERHISTORY(#9,#8,.READWRITE.,.MODIFIED.,1631429290,#9,#8,1631429215); +#176=IFCBEAM('2f_ancUNT1$Btb3bI4H7gM',#175,'Beam',$,$,#216,#194,$,.BEAM.); +#182=IFCINDEXEDPOLYGONALFACE((1,2,4,3)); +#183=IFCINDEXEDPOLYGONALFACE((3,4,8,7)); +#184=IFCINDEXEDPOLYGONALFACE((7,8,6,5)); +#185=IFCINDEXEDPOLYGONALFACE((5,6,2,1)); +#186=IFCINDEXEDPOLYGONALFACE((3,7,5,1)); +#187=IFCINDEXEDPOLYGONALFACE((8,4,2,6)); +#188=IFCCARTESIANPOINTLIST3D(((-1.,-1.,-1.),(-1.,-1.,1.),(-1.,1.,-1.),(-1.,1.,1.),(1.,-1.,-1.),(1.,-1.,1.),(1.,1.,-1.),(1.,1.,1.))); +#189=IFCPOLYGONALFACESET(#188,$,(#182,#183,#184,#185,#186,#187),$); +#190=IFCSHAPEREPRESENTATION(#21,'Body','Tessellation',(#189)); +#191=IFCCARTESIANPOINT((-1.,-1.,-1.)); +#192=IFCBOUNDINGBOX(#191,2.,2.,2.); +#193=IFCSHAPEREPRESENTATION(#22,'Box','BoundingBox',(#192)); +#194=IFCPRODUCTDEFINITIONSHAPE($,$,(#193,#190)); +#205=IFCOWNERHISTORY(#9,#8,.READWRITE.,.ADDED.,1631429238,#9,#8,1631429238); +#206=IFCRELAGGREGATES('1SGr7ReC13EhuetdWMr2G9',#205,$,$,#159,(#176)); +#212=IFCCARTESIANPOINT((0.,0.,-3.)); +#213=IFCDIRECTION((0.,0.,1.)); +#214=IFCDIRECTION((1.,0.,0.)); +#215=IFCAXIS2PLACEMENT3D(#212,#213,#214); +#216=IFCLOCALPLACEMENT(#174,#215); +#223=IFCCARTESIANPOINT((0.,0.,0.)); +#224=IFCDIRECTION((0.,0.,1.)); +#225=IFCDIRECTION((1.,0.,0.)); +#226=IFCAXIS2PLACEMENT3D(#223,#224,#225); +#227=IFCLOCALPLACEMENT(#70,#226); +#228=IFCINDEXEDPOLYGONALFACE((4,6,5,2)); +#229=IFCINDEXEDPOLYGONALFACE((7,3,1,8)); +#230=IFCINDEXEDPOLYGONALFACE((8,1,2,5)); +#231=IFCINDEXEDPOLYGONALFACE((5,6,7,8)); +#232=IFCINDEXEDPOLYGONALFACE((3,7,6,4)); +#233=IFCINDEXEDPOLYGONALFACE((4,2,1,3)); +#234=IFCCARTESIANPOINTLIST3D(((1.,1.,1.),(1.,-1.,1.),(-1.,1.,1.),(-1.,-1.,1.),(1.,-1.,-1.),(-1.,-1.,-1.),(-1.,1.,-1.),(1.,1.,-1.))); +#235=IFCPOLYGONALFACESET(#234,$,(#228,#229,#230,#231,#232,#233),$); +#236=IFCSHAPEREPRESENTATION(#21,'Body','Tessellation',(#235)); +#237=IFCCARTESIANPOINT((-1.,-1.,-1.)); +#238=IFCBOUNDINGBOX(#237,2.,2.,2.); +#239=IFCSHAPEREPRESENTATION(#22,'Box','BoundingBox',(#238)); +#240=IFCPRODUCTDEFINITIONSHAPE($,$,(#239,#236)); +#241=IFCSTYLEDITEM(#235,(#101),'SurfaceStyle'); +#242=IFCSLABTYPE('3Yf_WvSET99eu_bTvaRiKy',#78,'Slab',$,$,$,(#259,#265),$,$,.BASESLAB.); +#243=IFCINDEXEDPOLYGONALFACE((4,6,5,2)); +#244=IFCINDEXEDPOLYGONALFACE((7,3,1,8)); +#245=IFCINDEXEDPOLYGONALFACE((8,1,2,5)); +#246=IFCINDEXEDPOLYGONALFACE((5,6,7,8)); +#247=IFCINDEXEDPOLYGONALFACE((3,7,6,4)); +#248=IFCINDEXEDPOLYGONALFACE((4,2,1,3)); +#249=IFCCARTESIANPOINTLIST3D(((1.,1.,1.),(1.,-1.,1.),(-1.,1.,1.),(-1.,-1.,1.),(1.,-1.,-1.),(-1.,-1.,-1.),(-1.,1.,-1.),(1.,1.,-1.))); +#250=IFCPOLYGONALFACESET(#249,$,(#243,#244,#245,#246,#247,#248),$); +#251=IFCSHAPEREPRESENTATION(#21,'Body','Tessellation',(#250)); +#252=IFCCARTESIANPOINT((-1.,-1.,-1.)); +#253=IFCBOUNDINGBOX(#252,2.,2.,2.); +#254=IFCSHAPEREPRESENTATION(#22,'Box','BoundingBox',(#253)); +#255=IFCCARTESIANPOINT((0.,0.,0.)); +#256=IFCDIRECTION((1.,0.,0.)); +#257=IFCDIRECTION((0.,0.,1.)); +#258=IFCAXIS2PLACEMENT3D(#255,#257,#256); +#259=IFCREPRESENTATIONMAP(#258,#254); +#260=IFCSTYLEDITEM(#250,(#101),'SurfaceStyle'); +#261=IFCCARTESIANPOINT((0.,0.,0.)); +#262=IFCDIRECTION((1.,0.,0.)); +#263=IFCDIRECTION((0.,0.,1.)); +#264=IFCAXIS2PLACEMENT3D(#261,#263,#262); +#265=IFCREPRESENTATIONMAP(#264,#251); +#272=IFCCARTESIANPOINT((0.,0.,-3.)); +#273=IFCDIRECTION((0.,0.,1.)); +#274=IFCDIRECTION((1.,0.,0.)); +#275=IFCAXIS2PLACEMENT3D(#272,#273,#274); +#276=IFCLOCALPLACEMENT(#152,#275); +#277=IFCINDEXEDPOLYGONALFACE((4,6,5,2)); +#278=IFCINDEXEDPOLYGONALFACE((7,3,1,8)); +#279=IFCINDEXEDPOLYGONALFACE((8,1,2,5)); +#280=IFCINDEXEDPOLYGONALFACE((5,6,7,8)); +#281=IFCINDEXEDPOLYGONALFACE((3,7,6,4)); +#282=IFCINDEXEDPOLYGONALFACE((4,2,1,3)); +#283=IFCCARTESIANPOINTLIST3D(((1.,1.,1.),(1.,-1.,1.),(-1.,1.,1.),(-1.,-1.,1.),(1.,-1.,-1.),(-1.,-1.,-1.),(-1.,1.,-1.),(1.,1.,-1.))); +#284=IFCPOLYGONALFACESET(#283,$,(#277,#278,#279,#280,#281,#282),$); +#285=IFCSHAPEREPRESENTATION(#21,'Body','Tessellation',(#284)); +#286=IFCCARTESIANPOINT((-1.,-1.,-1.)); +#287=IFCBOUNDINGBOX(#286,2.,2.,2.); +#288=IFCSHAPEREPRESENTATION(#22,'Box','BoundingBox',(#287)); +#289=IFCPRODUCTDEFINITIONSHAPE($,$,(#288,#285)); +#290=IFCSTYLEDITEM(#284,(#101),'SurfaceStyle'); +#291=IFCWALLTYPE('3BIuGkv6r8X8juaWvaUCg3',#115,'Wall',$,$,$,(#308,#314),$,$,.ELEMENTEDWALL.); +#292=IFCINDEXEDPOLYGONALFACE((4,6,5,2)); +#293=IFCINDEXEDPOLYGONALFACE((7,3,1,8)); +#294=IFCINDEXEDPOLYGONALFACE((8,1,2,5)); +#295=IFCINDEXEDPOLYGONALFACE((5,6,7,8)); +#296=IFCINDEXEDPOLYGONALFACE((3,7,6,4)); +#297=IFCINDEXEDPOLYGONALFACE((4,2,1,3)); +#298=IFCCARTESIANPOINTLIST3D(((1.,1.,1.),(1.,-1.,1.),(-1.,1.,1.),(-1.,-1.,1.),(1.,-1.,-1.),(-1.,-1.,-1.),(-1.,1.,-1.),(1.,1.,-1.))); +#299=IFCPOLYGONALFACESET(#298,$,(#292,#293,#294,#295,#296,#297),$); +#300=IFCSHAPEREPRESENTATION(#21,'Body','Tessellation',(#299)); +#301=IFCCARTESIANPOINT((-1.,-1.,-1.)); +#302=IFCBOUNDINGBOX(#301,2.,2.,2.); +#303=IFCSHAPEREPRESENTATION(#22,'Box','BoundingBox',(#302)); +#304=IFCCARTESIANPOINT((0.,0.,0.)); +#305=IFCDIRECTION((1.,0.,0.)); +#306=IFCDIRECTION((0.,0.,1.)); +#307=IFCAXIS2PLACEMENT3D(#304,#306,#305); +#308=IFCREPRESENTATIONMAP(#307,#303); +#309=IFCSTYLEDITEM(#299,(#101),'SurfaceStyle'); +#310=IFCCARTESIANPOINT((0.,0.,0.)); +#311=IFCDIRECTION((1.,0.,0.)); +#312=IFCDIRECTION((0.,0.,1.)); +#313=IFCAXIS2PLACEMENT3D(#310,#312,#311); +#314=IFCREPRESENTATIONMAP(#313,#300); +ENDSEC; +END-ISO-10303-21; diff --git a/src/ifcpatch/test/test_ExtractElements.py b/src/ifcpatch/test/test_ExtractElements.py new file mode 100644 index 0000000000..5878a9a32b --- /dev/null +++ b/src/ifcpatch/test/test_ExtractElements.py @@ -0,0 +1,30 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2022 Dion Moult +# +# 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 os +import pytest +import ifcpatch +import ifcopenshell + + +class TestExtractElements: + def test_getting_the_psets_of_a_product_as_a_dictionary(self): + ifc = ifcopenshell.open(os.path.join(os.getcwd(), "test", "files", "basic.ifc")) + output = ifcpatch.execute({"input": ifc, "recipe": "ExtractElements", "arguments": [".IfcWall"]}) + assert output.by_type("IfcWall") + assert not output.by_type("IfcSlab")