Skip to content

Commit 084992d

Browse files
committed
Make IfcParseExamples buildable outside of the main build tree
It's a very verbose version of consuming IfcOpenShell cmake package, but we'll be able to use it as a start point to build upon.
1 parent 39dd08c commit 084992d

File tree

5 files changed

+198
-17
lines changed

5 files changed

+198
-17
lines changed

.github/workflows/ci.yml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,31 @@ jobs:
118118
-DCMAKE_CXX_FLAGS_INIT="-fPIC"
119119
sudo make -j$(nproc) install
120120
121+
# We need zstd and libxml2 just for cmake config files to test the examples build.
122+
# zslibzstd-dev has cmake config only on Ubuntu 24.04+.
123+
- name : Build zstd
124+
run: |
125+
git clone https://github.com/facebook/zstd --depth 1 --branch v1.5.7
126+
cd zstd
127+
# `build` already exists.
128+
mkdir build_ && cd build_
129+
cmake ../build/cmake -DCMAKE_BUILD_TYPE=Release \
130+
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
131+
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
132+
sudo cmake --build . --target install -j $(nproc)
133+
134+
# libxml2-dev doesn't have cmake configs even on Ubuntu 24.04+.
135+
- name: Build libxml2
136+
run: |
137+
git clone https://gitlab.gnome.org/GNOME/libxml2.git --branch v2.13.8 --depth 1
138+
cd libxml2
139+
mkdir build && cd build
140+
cmake .. \
141+
-DCMAKE_BUILD_TYPE=Release \
142+
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
143+
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
144+
sudo cmake --build . --target install -j $(nproc)
145+
121146
# Ubuntu has `swig` package, but we build it to match the version we use in the main build.
122147
# To avoid failing tests when checking stub generation.
123148
- name: build swig
@@ -178,6 +203,14 @@ jobs:
178203
run: |
179204
IfcConvert test/input/acad2010_walls.ifc test/input/acad2010_walls.obj
180205
206+
- name: Build standalone examples to test cmake package
207+
run: |
208+
cd src/examples
209+
mkdir build && cd build
210+
cmake .. -DCMAKE_BUILD_TYPE=Release
211+
cmake --build .
212+
./IfcParseExamples "../IfcParseExamples_test.ifc"
213+
181214
- name: Test ifcopenshell-python
182215
run: |
183216
cd test

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
/_deps-vs*-x*-installed/
55
/_installed-vs*-x*/
66
/build/
7+
/src/examples/build/
78

89
# output directories
910
/cmake/out/

src/examples/CMakeLists.txt

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,31 +17,59 @@
1717
# #
1818
################################################################################
1919

20-
if(SCHEMA_VERSIONS MATCHES "2x3")
21-
ADD_EXECUTABLE(IfcParseExamples IfcParseExamples.cpp)
22-
TARGET_LINK_LIBRARIES(IfcParseExamples IfcParse)
23-
set_target_properties(IfcParseExamples PROPERTIES FOLDER Examples)
24-
target_compile_features(IfcParseExamples PUBLIC cxx_std_17)
20+
# Thils file can also be build standalone, outside of the IfcOpenShell build tree,
21+
# to demonstrate the usage IfcOpenShell as a cmake package.
22+
if(NOT BUILD_EXAMPLES)
23+
set(STANDALONE_PROJECT ON)
24+
endif()
25+
26+
if(STANDALONE_PROJECT)
27+
cmake_minimum_required(VERSION 3.21)
28+
project(IfcOpenShellExamples)
29+
30+
set(Boost_USE_STATIC_LIBS ON)
31+
set(Boost_USE_STATIC_RUNTIME OFF)
32+
set(Boost_USE_MULTITHREADED ON)
33+
set(Boost_COMPONENTS system program_options regex thread date_time iostreams)
34+
find_package(Boost CONFIG REQUIRED COMPONENTS ${Boost_COMPONENTS})
35+
find_package(zstd CONFIG REQUIRED)
36+
find_package(RocksDB CONFIG REQUIRED)
37+
find_package(LibXml2 CONFIG REQUIRED)
38+
find_package(IfcOpenShell CONFIG REQUIRED)
39+
endif()
2540

26-
if(WITH_OPENCASCADE)
41+
if(STANDALONE_PROJECT OR SCHEMA_VERSIONS MATCHES "2x3")
42+
add_executable(IfcParseExamples IfcParseExamples.cpp)
2743

28-
ADD_EXECUTABLE(IfcOpenHouse IfcOpenHouse.cpp)
29-
TARGET_LINK_LIBRARIES(IfcOpenHouse ${IFCOPENSHELL_LIBRARIES} ${OpenCASCADE_LIBRARIES})
44+
if(STANDALONE_PROJECT)
45+
target_include_directories(IfcParseExamples PRIVATE ${Boost_INCLUDE_DIRS})
46+
target_link_libraries(IfcParseExamples ${Boost_LIBRARIES})
47+
target_link_libraries(IfcParseExamples IfcOpenShell::IfcParse)
48+
target_compile_features(IfcParseExamples PRIVATE cxx_std_17)
49+
target_compile_definitions(IfcParseExamples PRIVATE "SCHEMA_SEQ=(2x3)" HAS_SCHEMA_2x3 IFOPSH_WITH_ROCKSDB)
50+
else()
51+
target_link_libraries(IfcParseExamples IfcParse)
52+
set_target_properties(IfcParseExamples PROPERTIES FOLDER Examples)
53+
target_compile_features(IfcParseExamples PRIVATE cxx_std_17)
54+
endif()
55+
56+
if(NOT STANDALONE_PROJECT AND WITH_OPENCASCADE)
57+
add_executable(IfcOpenHouse IfcOpenHouse.cpp)
58+
target_link_libraries(IfcOpenHouse ${IFCOPENSHELL_LIBRARIES} ${OpenCASCADE_LIBRARIES})
3059
set_target_properties(IfcOpenHouse PROPERTIES FOLDER Examples)
3160

32-
ADD_EXECUTABLE(IfcAdvancedHouse IfcAdvancedHouse.cpp)
33-
TARGET_LINK_LIBRARIES(IfcAdvancedHouse ${IFCOPENSHELL_LIBRARIES} ${OpenCASCADE_LIBRARIES})
61+
add_executable(IfcAdvancedHouse IfcAdvancedHouse.cpp)
62+
target_link_libraries(IfcAdvancedHouse ${IFCOPENSHELL_LIBRARIES} ${OpenCASCADE_LIBRARIES})
3463
set_target_properties(IfcAdvancedHouse PROPERTIES FOLDER Examples)
35-
3664
endif()
37-
endif(SCHEMA_VERSIONS MATCHES "2x3")
65+
endif()
3866

39-
if(SCHEMA_VERSIONS MATCHES "4x3_add2")
40-
ADD_EXECUTABLE(IfcAlignment IfcAlignment.cpp)
41-
TARGET_LINK_LIBRARIES(IfcAlignment ${IFCOPENSHELL_LIBRARIES})
67+
if(NOT STANDALONE_PROJECT AND SCHEMA_VERSIONS MATCHES "4x3_add2")
68+
add_executable(IfcAlignment IfcAlignment.cpp)
69+
target_link_libraries(IfcAlignment ${IFCOPENSHELL_LIBRARIES})
4270
set_target_properties(IfcAlignment PROPERTIES FOLDER Examples)
4371

44-
ADD_EXECUTABLE(IfcSimplifiedAlignment IfcSimplifiedAlignment.cpp)
45-
TARGET_LINK_LIBRARIES(IfcSimplifiedAlignment ${IFCOPENSHELL_LIBRARIES})
72+
add_executable(IfcSimplifiedAlignment IfcSimplifiedAlignment.cpp)
73+
target_link_libraries(IfcSimplifiedAlignment ${IFCOPENSHELL_LIBRARIES})
4674
set_target_properties(IfcSimplifiedAlignment PROPERTIES FOLDER Examples)
4775
endif()
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
ISO-10303-21;
2+
HEADER;
3+
FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1');
4+
FILE_NAME('IfcParseExamples_test.ifc','2025-12-12T13:49:19+05:00',(''),(''),'IfcOpenShell 0.0.0','Bonsai 0.8.5-alpha251212-a47cbc3','Nobody');
5+
FILE_SCHEMA(('IFC2X3'));
6+
ENDSEC;
7+
DATA;
8+
#1=IFCPERSON('HSeldon','Seldon','Hari',$,$,$,$,$);
9+
#2=IFCORGANIZATION('APTR','Aperture Science',$,$,$);
10+
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
11+
#4=IFCACTORROLE(.USERDEFINED.,'CONTRIBUTOR',$);
12+
#5=IFCORGANIZATION('IfcOpenShell','IfcOpenShell','IfcOpenShell is an open source software library that helps users and software developers to work with IFC data.',(#4),(#6));
13+
#6=IFCTELECOMADDRESS(.USERDEFINED.,$,'WEBPAGE',$,$,$,$,'https://ifcopenshell.org');
14+
#7=IFCAPPLICATION(#5,'0.8.5','Bonsai','Bonsai-0.8.5');
15+
#8=IFCOWNERHISTORY(#3,#7,.READWRITE.,.ADDED.,1765520605,#3,#7,1765520605);
16+
#9=IFCPROJECT('3GSSvm5SP5U96O5iar8uYb',#8,'My Project',$,$,$,$,(#22,#34),#17);
17+
#10=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
18+
#11=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
19+
#12=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
20+
#13=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
21+
#14=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
22+
#15=IFCMEASUREWITHUNIT(IFCREAL(0.0174532925199433),#14);
23+
#16=IFCCONVERSIONBASEDUNIT(#13,.PLANEANGLEUNIT.,'degree',#15);
24+
#17=IFCUNITASSIGNMENT((#12,#10,#16,#11));
25+
#18=IFCCARTESIANPOINT((0.,0.,0.));
26+
#19=IFCDIRECTION((0.,0.,1.));
27+
#20=IFCDIRECTION((1.,0.,0.));
28+
#21=IFCAXIS2PLACEMENT3D(#18,#19,#20);
29+
#22=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#21,$);
30+
#23=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#22,$,.MODEL_VIEW.,$);
31+
#24=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis','Model',*,*,*,*,#22,$,.GRAPH_VIEW.,$);
32+
#25=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Box','Model',*,*,*,*,#22,$,.MODEL_VIEW.,$);
33+
#26=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Model',*,*,*,*,#22,$,.SECTION_VIEW.,$);
34+
#27=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Model',*,*,*,*,#22,$,.ELEVATION_VIEW.,$);
35+
#28=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Model',*,*,*,*,#22,$,.MODEL_VIEW.,$);
36+
#29=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Model',*,*,*,*,#22,$,.PLAN_VIEW.,$);
37+
#30=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Profile','Model',*,*,*,*,#22,$,.ELEVATION_VIEW.,$);
38+
#31=IFCCARTESIANPOINT((0.,0.));
39+
#32=IFCDIRECTION((1.,0.));
40+
#33=IFCAXIS2PLACEMENT2D(#31,#32);
41+
#34=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Plan',2,1.E-05,#33,$);
42+
#35=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis','Plan',*,*,*,*,#34,$,.GRAPH_VIEW.,$);
43+
#36=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Plan',*,*,*,*,#34,$,.PLAN_VIEW.,$);
44+
#37=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Plan',*,*,*,*,#34,$,.PLAN_VIEW.,$);
45+
#38=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Plan',*,*,*,*,#34,$,.REFLECTED_PLAN_VIEW.,$);
46+
#39=IFCOWNERHISTORY(#3,#7,.READWRITE.,.MODIFIED.,1765520605,#3,#7,1765520605);
47+
#40=IFCSITE('2Ys4j4OOf3x9UYeALDJ_g3',#39,'My Site',$,$,#66,$,$,.ELEMENT.,$,$,$,$,$);
48+
#46=IFCOWNERHISTORY(#3,#7,.READWRITE.,.MODIFIED.,1765520605,#3,#7,1765520605);
49+
#47=IFCBUILDING('3e580MQFTCD9tCSaZWRPi9',#46,'My Building',$,$,#73,$,$,.ELEMENT.,$,$,$);
50+
#53=IFCOWNERHISTORY(#3,#7,.READWRITE.,.MODIFIED.,1765520605,#3,#7,1765520605);
51+
#54=IFCBUILDINGSTOREY('3XFkAr6KbAsP5wR3gxi3my',#53,'My Storey',$,$,#80,$,$,.ELEMENT.,$);
52+
#60=IFCOWNERHISTORY(#3,#7,.READWRITE.,.ADDED.,1765520605,#3,#7,1765520605);
53+
#61=IFCRELAGGREGATES('2OWfFyDQn0qP0Vd6NWGX7k',#60,$,$,#9,(#40));
54+
#62=IFCCARTESIANPOINT((0.,0.,0.));
55+
#63=IFCDIRECTION((0.,0.,1.));
56+
#64=IFCDIRECTION((1.,0.,0.));
57+
#65=IFCAXIS2PLACEMENT3D(#62,#63,#64);
58+
#66=IFCLOCALPLACEMENT($,#65);
59+
#67=IFCOWNERHISTORY(#3,#7,.READWRITE.,.ADDED.,1765520605,#3,#7,1765520605);
60+
#68=IFCRELAGGREGATES('3_X_vfPpXDaO3NODBJgmSp',#67,$,$,#40,(#47));
61+
#69=IFCCARTESIANPOINT((0.,0.,0.));
62+
#70=IFCDIRECTION((0.,0.,1.));
63+
#71=IFCDIRECTION((1.,0.,0.));
64+
#72=IFCAXIS2PLACEMENT3D(#69,#70,#71);
65+
#73=IFCLOCALPLACEMENT(#66,#72);
66+
#74=IFCOWNERHISTORY(#3,#7,.READWRITE.,.ADDED.,1765520605,#3,#7,1765520605);
67+
#75=IFCRELAGGREGATES('3ScF98CZD3pAa0SW$mhBHF',#74,$,$,#47,(#54));
68+
#76=IFCCARTESIANPOINT((0.,0.,0.));
69+
#77=IFCDIRECTION((0.,0.,1.));
70+
#78=IFCDIRECTION((1.,0.,0.));
71+
#79=IFCAXIS2PLACEMENT3D(#76,#77,#78);
72+
#80=IFCLOCALPLACEMENT(#73,#79);
73+
#110=IFCOWNERHISTORY(#3,#7,.READWRITE.,.MODIFIED.,1765529359,#3,#7,1765520632);
74+
#111=IFCWALL('1lfiJzSCH1a8vjDuSLL4Ii',#110,'Cube',$,$,#203,$,$);
75+
#112=IFCOWNERHISTORY(#3,#7,.READWRITE.,.MODIFIED.,1765520818,#3,#7,1765520632);
76+
#113=IFCRELCONTAINEDINSPATIALSTRUCTURE('2Gqx6vP7jB4x_h65Tawn0f',#112,$,$,(#111,#182,#150),#54);
77+
#149=IFCOWNERHISTORY(#3,#7,.READWRITE.,.MODIFIED.,1765529359,#3,#7,1765520810);
78+
#150=IFCWINDOW('1eE0btB_54tBL59wLXKO1B',#149,'Cube',$,$,#208,$,$,$,$);
79+
#181=IFCOWNERHISTORY(#3,#7,.READWRITE.,.MODIFIED.,1765529359,#3,#7,1765520818);
80+
#182=IFCBUILDINGELEMENTPART('0fmaoBJgz0kPBavO$EJkPn',#181,'Cube',$,$,#198,$,$);
81+
#194=IFCCARTESIANPOINT((-3.82147288322449,-0.987768530845642,1.78445267677307));
82+
#195=IFCDIRECTION((0.,0.,1.));
83+
#196=IFCDIRECTION((1.,0.,0.));
84+
#197=IFCAXIS2PLACEMENT3D(#194,#195,#196);
85+
#198=IFCLOCALPLACEMENT(#80,#197);
86+
#199=IFCCARTESIANPOINT((0.,0.,0.));
87+
#200=IFCDIRECTION((0.,0.,1.));
88+
#201=IFCDIRECTION((1.,0.,0.));
89+
#202=IFCAXIS2PLACEMENT3D(#199,#200,#201);
90+
#203=IFCLOCALPLACEMENT(#80,#202);
91+
#204=IFCCARTESIANPOINT((0.,4.25822639465332,0.));
92+
#205=IFCDIRECTION((0.,0.,1.));
93+
#206=IFCDIRECTION((1.,0.,0.));
94+
#207=IFCAXIS2PLACEMENT3D(#204,#205,#206);
95+
#208=IFCLOCALPLACEMENT(#80,#207);
96+
ENDSEC;
97+
END-ISO-10303-21;

src/examples/README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
Example of building IfcParseExamples outside of the IfcOpenShell build tree.
3+
4+
```powershell
5+
$IFCOPENSHELL_ROOT="L:\Projects\Github\IfcOpenShell"
6+
$PREFIX_PATH="$IFCOPENSHELL_ROOT\_deps\boost_1_86_0\stage\vs2022-x64"
7+
$PREFIX_PATH+=";$IFCOPENSHELL_ROOT\_installed-vs2022-x64"
8+
$PREFIX_PATH+=";$IFCOPENSHELL_ROOT\_deps-vs2022-x64-installed\rocksdb"
9+
$PREFIX_PATH+=";$IFCOPENSHELL_ROOT\_deps-vs2022-x64-installed\zstd"
10+
$PREFIX_PATH+=";L:\Software\usr\libxml2"
11+
12+
cmake .. -G Ninja -DCMAKE_PREFIX_PATH="$PREFIX_PATH" -DCMAKE_BUILD_TYPE=Release
13+
ninja -v
14+
./IfcParseExamples.exe "../IfcParseExamples_test.ifc"
15+
# Scanning file...
16+
# Done scanning file
17+
# Done resolving references
18+
# Found 3 elements in ..\IfcParseExamples_test.ifc:
19+
# #182=IfcBuildingElementPart('0fmaoBJgz0kPBavO$EJkPn',#181,'Cube',$,$,#193,#183,$)
20+
# #111=IfcWall('1lfiJzSCH1a8vjDuSLL4Ii',#110,'Cube',$,$,#119,#114,$)
21+
# #150=IfcWindow('1eE0btB_54tBL59wLXKO1B',#149,'Cube',$,$,#188,#151,$,$,$)
22+
```

0 commit comments

Comments
 (0)