commit7fb4cdaa16Author: Gorgious <nathan.hild@gmail.com> Date: Mon Oct 31 09:35:06 2022 +0100 Fix #2546 : Editing a material now automatically ends the edition of its material set item if necessary commit427411e758Author: Dion Moult <dion@thinkmoult.com> Date: Mon Oct 31 19:04:57 2022 +1100 You can now edit arbitrary profiles in the profile manager commitcc056d5d53Author: Gorgious <nathan.hild@gmail.com> Date: Mon Oct 31 08:52:11 2022 +0100 Fix #2553 : Right click documentation is now only available for Blender 3.3+ Also fix an error in the console when right clicking a button commit31600033bfAuthor: ArturTomczak <artomczak@gmail.com> Date: Sun Oct 30 23:16:08 2022 +0100 add BCF reporter to IDS (#2552) * grammar * reason not always a list * extend readme with instruction * remove microseconds from date * add BCF reporter commit0338825175Author: Dion Moult <dion@thinkmoult.com> Date: Sun Oct 30 23:26:59 2022 +1100 You can now add new profile definitions in the profile manager commitd9f8aa4e7bAuthor: Andrej730 <azhilenkov@gmail.com> Date: Sun Oct 30 11:29:42 2022 +0600 Added ifc types schema for Ifc2x3 and Ifc4 Types schema located in separate json file, it's structure: { ifc_type_name: {"description": type_description, "spec_url": type_spec_url} } I've also added new API function to get type data - `get_type_doc(version, ifc_type)` commit6803788676Author: Dion Moult <dion@thinkmoult.com> Date: Sun Oct 30 11:02:18 2022 +1100 Load thumbnails in a paginated manner to allow to scale to larger models commitd421cc0bbbAuthor: Massimo Fabbro <79401028+maxfb87@users.noreply.github.com> Date: Sun Oct 30 00:07:56 2022 +0200 No mapped quantities in qto calculator has None value (#2549) commitbf57c8b1bfAuthor: Dion Moult <dion@thinkmoult.com> Date: Sat Oct 29 23:45:04 2022 +1100 Refactor profile module to use data class commit9a25db6584Author: Andrej730 <azhilenkov@gmail.com> Date: Sat Oct 29 18:31:40 2022 +0600 get_attribute_doc get_entity_doc now use recursive method by default commit17ccd0adf7Author: Andrej730 <azhilenkov@gmail.com> Date: Sat Oct 29 18:27:51 2022 +0600 Simplified getting entity parent information for schema api Removed unnecssary parent information from json schema - now API is getting it from ifcopenshell schema. commit937f39c898Author: Andrej730 <azhilenkov@gmail.com> Date: Sat Oct 29 17:35:43 2022 +0600 Added information about parent entity to schema Added information about parent entity to schema (it's located in "parent_entity" entity parameter inside schema), both for Ifc2x3 and Ifc4. Modified get_entity_doc and get_attribute_doc - now you can use additional optional parameter `recursive=True` with those functions - then parent entities attributes will be included to the list of entity's attributes. For example IfcWindow will also have attributes from IfcBuildingElement, IfcElement, IfcProduct etc... commit0b5ccd88a5Author: Andrej730 <azhilenkov@gmail.com> Date: Sat Oct 29 16:31:54 2022 +0600 Added descriptions for psets and qsets to ifc2x3, ifc4 schema Example of getting pset description: `get_property_set_doc("IFC4", "Pset_ZoneCommon")['description']` commitebf3cd8909Author: Andrej730 <azhilenkov@gmail.com> Date: Sat Oct 29 10:32:26 2022 +0600 Added IFC libraries for AU and EU profiles Also added script that was used to generate those libraries (the script is using data from https://github.com/boltsparts/BOLTS). Types of steel profiles included: I profiles, Z profiles, C profiles (known as U profiles in IFC), L profiles (both equal and unequal), hollow profiles (circle, square and rectangular). commit08afec3461Author: Dion Moult <dion@thinkmoult.com> Date: Fri Oct 28 22:32:15 2022 +1100 Support material layer set usage negative direction sense for parametric walls commit4408a23873Author: Dion Moult <dion@thinkmoult.com> Date: Fri Oct 28 22:30:43 2022 +1100 Merge duplicate types IfcPatch recipe can now merge based on any attribute
IfcOpenShell
IfcOpenShell is an open source (LGPL) software library for working with the Industry Foundation Classes (IFC) file format. Extensive geometric support is implemented for the IFC releases IFC2x3 TC1 and IFC4 Add2 TC1. Support for parsing is provided for IFC4x1, IFC4x2, and the IFC4x3 release candidates. Extending with support for arbitrary IFC schemas is possible at compile-time when using C++ and at run-time when using Python.
For more information, see
| Service | Status |
|---|---|
| Anaconda Daily Build | |
| Anaconda v0.7.0 Stable | |
| PyPi Daily Build | |
| ArchLinux AUR Package | |
| BlenderBIM Add-on Chocolatey (under moderation) | |
| Sponsor development on OpenCollective | |
| Docker hub |
Prerequisites
- Git
- CMake (3.1.3 or newer)
- Windows: Visual Studio 2008 to 2019 (2022 not yet supported by dependency CMake) with C++ toolset (or Visual C++ Build Tools) or MSYS2 + MinGW
- *nix: GCC 4.7 or newer, or Clang (any version)
Dependencies
- Boost
- Open Cascade - optional, but required for building IfcGeom
(official, "OCCT", or community edition, "OCE")
For converting IFC representation items into BRep solids and tessellated meshes - OpenCOLLADA - optional
For IfcConvert to be able to write tessellated Collada (.dae) files - SWIG and Python - optional
For building the IfcOpenShell Python interface and the Blender add-on - 3ds Max SDK - optional
For building the 3ds Max plug-in. All recent versions of 3ds Max (2014 and newer) are 64-bit only, so a 64-bit installation is assumed.
Building IfcOpenShell
Note 1: The path where the source code is cloned to can contain spaces but non-ASCII characters are very likely to cause problems with the build.
Note 2: If you had not used git clone --recursive https://github.com/IfcOpenShell/IfcOpenshell.git, update the submodules by running git submodule init & git submodule update.
Note 3: Be careful with special characters is the path when using the nix or win build scripts, because the OpenCASCADE build will fail on paths containing ++ and likely other situations.
Compiling on Windows
The preferred way to fetch and build this project's dependencies is to use the build scripts in win/ folder. See win/readme.md for more information.
Using Visual Studio
Instructions in a nutshell (assuming Visual Studio 2015 x64 environment variables set):
> cd IfcOpenShell\win
> build-deps.cmd
> run-cmake.bat
NB: build-deps.cmd need to be ran from the directory containing it, i.e. the ./win folder.
You can now open and build the solution file in Visual Studio:
> ..\build-vs2015-x64\IfcOpenShell.sln
As the scripts default to using the RelWithDebInfo configuration, and a freshly created solution by CMake defaults
to Debug, make sure to switch the used build configuration. Build the INSTALL project (right-click -> Project
Only) to deploy the headers and binaries into a single location if wanted/needed.
Alternatively, one can use the utility batch file(s) to build and install the project easily from the command-line (installing a project will build it also, if required):
> install-ifcopenshell.bat
Using MSYS2 + MinGW
Start the MSYS2 Shell and then:
$ cd IfcOpenShell/win
$ ./build-deps.sh
$ ./run-cmake.sh
$ ./install-ifcopenshell.sh
Using Bash on Ubuntu on Windows
Start Bash on Ubuntu on Windows and follow the instructions below. Compiling on Ubuntu 14.04.4 LTS using GCC 4.8.4 or Clang 3.5 has been confirmed to work.
Compiling on *nix
The following instructions are for Ubuntu, modify as required for other operating systems. nix/build-all.py script can be experimented with and studied for pointers for other operating systems, but note that this script is not currently meant to be used for a typical IfcOpenShell workspace setup.
Note 1: It is recommended to use OCCT for IfcOpenShell. You could use OCE as well, but sometimes it may lag behind OCCT and therefore not compile with the latest IfcOpenShell.
Note 2: where make -j is written, add a number roughly equal to the amount of CPU cores + 1.
1) Install most of the prerequisites and dependencies:
$ sudo apt-get install git cmake gcc g++ libboost-all-dev libcgal-dev
2a) Either use an OCCT package from your operating system's software repository
$ sudo apt-get install libocct-data-exchange-dev libocct-draw-dev libocct-foundation-dev libocct-modeling-algorithms-dev libocct-modeling-data-dev libocct-ocaf-dev libocct-visualization-dev
2b) or, if OCCT is not available or the latest code is wanted, obtain and compile OCCT from https://dev.opencascade.org/release
2c) or, if you'd like to try using OCE, use the package from your operating system's software repository
$ sudo apt-get install liboce-foundation-dev liboce-modeling-dev liboce-ocaf-dev liboce-visualization-dev liboce-ocaf-lite-dev
2d) or if OCE is not available, or the latest code is wanted, compile OCE yourself (note that the build takes a long time)
$ sudo apt-get install libftgl-dev libtbb2 libtbb-dev libgl1-mesa-dev libfreetype6-dev
$ git clone https://github.com/tpaviot/oce.git
$ cd oce
$ mkdir build && cd build
$ cmake ..
$ make -j
$ sudo make install
3) For building IfcConvert with COLLADA (.dae) support (on by default), OpenCOLLADA is needed:
$ sudo apt-get install libpcre3-dev libxml2-dev
$ git clone https://github.com/KhronosGroup/OpenCOLLADA.git
$ cd OpenCOLLADA
Using a known good revision, but HEAD should work too:
$ git checkout 064a60b65c2c31b94f013820856bc84fb1937cc6
$ mkdir build && cd build
$ cmake ..
$ make -j
$ sudo make install
4) For building the IfcPython wrapper (on by default), SWIG and Python development are needed, if not already available:
$ sudo apt-get install python-all-dev swig
5) To build IfcOpenShell please take the following steps. Alternatively use environment variables for setting the
dependencies' paths. OCC_INCLUDE_DIR might be needed to set also. OPENCOLLADA_INCLUDE_DIR and OPENCOLLADA_LIBRARY_DIR
(and potentially PCRE_LIBRARY_DIR) are needed if building with COLLADA support. (-DCOLLADA_SUPPORT=0 disables it).
$ cd /path/to/IfcOpenShell
$ mkdir build && cd build
$ cmake ../cmake -DOCC_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu/ \
-DOPENCOLLADA_INCLUDE_DIR="/usr/local/include/opencollada" \
-DOPENCOLLADA_LIBRARY_DIR="/usr/local/lib/opencollada" \
-DPCRE_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu/ \
-DCGAL_INCLUDE_DIR=/usr/include \
-DGMP_INCLUDE_DIR=/usr/include \
-DMPFR_INCLUDE_DIR=/usr/include \
-DGMP_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu \
-DMPFR_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu \
-DHDF5_SUPPORT=Off
$ make -j
If all worked out correctly you can now use IfcOpenShell. See the examples below.
6) Install the project if wanted:
$ sudo make install
Installing on MacOS Using Homebrew
1) Install all dependencies using Homebrew
$ brew install boost cmake python3 cgal ftgl gmp libaec opencascade swig hdf5 zlib
# homebrew automatically links most libraries, except some keg-only ones
$ brew link zlib --force
2) Clone the git repo and its submodules
$ git clone --recurse-submodules https://github.com/IfcOpenShell/IfcOpenShell.git
3) Build IfcOpenShell with flags for Homebrew dependencies: (/usr/local/) for Intel machines with x84_64 architecture,
(/opt/homebrew/) for Apple Silicon processors with arm64 architecture.
$ cd /path/to/IfcOpenShell
$ mkdir build && cd build
# set library flags
$ export LDFLAGS="$LDFLAGS -Wl,-flat_namespace,-undefined,suppress"
$ cmake ../cmake
-DPYTHON_EXECUTABLE=/opt/homebrew/bin/python3.10 \
-DPYTHON_LIBRARY=/opt/homebrew/opt/python@3.10/Frameworks/Python.framework/Versions/3.10/lib/libpython3.10.dylib \
-DPYTHON_INCLUDE_DIR=/opt/homebrew/opt/python@3.10/Frameworks/Python.framework/Versions/3.10/include/python3.10/ \
-DOCC_LIBRARY_DIR=/opt/homebrew/lib/ \
-DOCC_INCLUDE_DIR=/opt/homebrew/include/opencascade/ \
-DCGAL_INCLUDE_DIR=/opt/homebrew/include/ \
-DGMP_LIBRARY_DIR=/opt/homebrew/lib/ \
-DMPFR_LIBRARY_DIR=/opt/homebrew/lib/ \
-DHDF5_LIBRARY_DIR=/opt/homebrew/lib/ \
-DHDF5_INCLUDE_DIR=/opt/homebrew/include/ \
-DCOLLADA_SUPPORT=0
# `sysctl -n hw.ncpu` returns the number of cpu cores on macOS
$ make -j$(sysctl -n hw.ncpu)
Note: Make sure to compile using the XCode provided Apple Clang compiler, installed with xcode-select --install , rather than a brew installed C/C++ compiler.
Installing IfcOpenShell with Conda
Another option for building and installing IfcOpenShell is to use the popular Anaconda Python Distribution. The requirements are spread across a number of channels. You can add these channels to your configuration, or specify them all on the command line:
$ conda install -c conda-forge -c oce -c dlr-sc -c ifcopenshell ifcopenshell
Usage examples
Invoking IfcConvert from the command line
$ wget -O duplex.zip https://portal.nibs.org/files/wl/\?id=4DsTgHFQAcOXzFetxbpRCECPbbfUqpgo
$ unzip duplex.zip
$ ./IfcConvert Duplex_A_20110907_optimized.ifc
$ less Duplex_A_20110907_optimized.obj
Using the IfcOpenShell Python interface
$ wget -O duplex.zip https://portal.nibs.org/files/wl/\?id=4DsTgHFQAcOXzFetxbpRCECPbbfUqpgo
$ unzip duplex.zip
$ python
>>> import ifcopenshell
>>> f = ifcopenshell.open("Duplex_A_20110907_optimized.ifc")
>>>
>>> # Accessing entity instances by type:
>>> f.by_type("ifcwall")[:2]
[#91=IfcWallStandardCase('2O2Fr$t4X7Zf8NOew3FL9r',#1,'Basic Wall:Interior - Partition (92mm Stud):144586',$,'Basic Wall:Interior - Partition (92mm Stud):128360',#5198,#18806,'144586'), #92=IfcWallStandardCase('2O2Fr$t4X7Zf8NOew3FLIE',#1,'Basic Wall:Interior - Partition (92mm Stud):143921',$,'Basic Wall:Interior - Partition (92mm Stud):128360',#5206,#18805,'143921')]
>>> wall = _[0]
>>> len(wall) # number of EXPRESS attributes
8
>>>
>>> # Accessing EXPRESS attributes by name:
>>> wall.GlobalId
'2O2Fr$t4X7Zf8NOew3FL9r'
>>> wall.Name = "My wall"
>>> wall.NonExistingAttr
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File ".\ifcopenshell.py", line 14, in __getattr__
except: raise AttributeError("entity instance of type '%s' has no attribute'%s'"%(self.wrapped_data.is_a(), name)) from None
AttributeError: entity instance of type 'IfcWallStandardCase' has no attribute 'NonExistingAttr'
>>> wall.GlobalId = 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File ".\ifcopenshell.py", line 26, in __setattr__
self[self.wrapped_data.get_argument_index(key)] = value
File ".\ifcopenshell.py", line 30, in __setitem__
self.wrapped_data.set_argument(idx, entity_instance.map_value(value))
File ".\ifc_wrapper.py", line 118, in <lambda>
set_argument = lambda self,x,y: self._set_argument(x) if y is None else self
._set_argument(x,y)
File ".\ifc_wrapper.py", line 114, in _set_argument
def _set_argument(self, *args): return _ifc_wrapper.entity_instance__set_argument(self, *args)
RuntimeError: INT is not a valid type for 'GlobalId'
>>> # Creating new entity instances
>>> f.createIfcCartesianPoint(Coordinates=(1.0,1.5,2.0))
#27530=IfcCartesianPoint((1.,1.5,2.))
>>>
>>> # Working with GlobalId attributes:
>>> import uuid
>>> ifcopenshell.guid.compress(uuid.uuid1().hex)
'3x4C8Q_6qHuv$P$FYkANRX'
>>> new_guid = _
>>> owner_hist = f.by_type("IfcOwnerHistory")[0]
>>> new_wall = f.createIfcWallStandardCase(new_guid, owner_hist, None, None, Tag='my_tag')
>>> new_wall.ObjectType = ''
>>> new_wall.ObjectPlacement = new_wall.Representation = None
>>>
>>> # Accessing entity instances by instance id or GlobalId:
>>> f[92]
#92=IfcWallStandardCase('2O2Fr$t4X7Zf8NOew3FLIE',#1,'Basic Wall:Interior - Partition (92mm Stud):143921',$,'Basic Wall:Interior - Partition (92mm Stud):128360',#5206,#18805,'143921')
>>> f['2O2Fr$t4X7Zf8NOew3FLIE']
#92=IfcWallStandardCase('2O2Fr$t4X7Zf8NOew3FLIE',#1,'Basic Wall:Interior - Partition (92mm Stud):143921',$,'Basic Wall:Interior - Partition (92mm Stud):128360',#5206,#18805,'143921')
>>>
>>> # Writing IFC-SPF files to disk:
>>> f.write("out.ifc")
Extra tools
Also available are a series of utilities that are based on or related to IfcOpenShell.
Those marked with an asterisk are part of IfcOpenShell.
| Name | License |
|---|---|
| bcf | LGPL-3.0-or-later |
| blenderbim | GPL-3.0-or-later |
| bsdd | LGPL-3.0-or-later |
| ifc2ca | LGPL-3.0-or-later |
| ifc4d | LGPL-3.0-or-later |
| ifc5d | LGPL-3.0-or-later |
| ifcbimtester | LGPL-3.0-or-later |
| ifcblender | LGPL-3.0-or-later* |
| ifccityjson | LGPL-3.0-or-later |
| ifcclash | LGPL-3.0-or-later |
| ifccobie | LGPL-3.0-or-later |
| ifcconvert | LGPL-3.0-or-later* |
| ifccsv | LGPL-3.0-or-later |
| ifcdiff | LGPL-3.0-or-later |
| ifcfm | LGPL-3.0-or-later |
| ifcgeom | LGPL-3.0-or-later* |
| ifcgeom_schema_agnostic | LGPL-3.0-or-later* |
| ifcgeomserver | LGPL-3.0-or-later* |
| ifcjni | LGPL-3.0-or-later* |
| ifcmax | LGPL-3.0-or-later* |
| ifcopenshell-python | LGPL-3.0-or-later* |
| ifcparse | LGPL-3.0-or-later* |
| ifcpatch | LGPL-3.0-or-later |
| ifcsverchok | GPL-3.0-or-later |
| ifcwrap | LGPL-3.0-or-later* |
| qtviewer | LGPL-3.0-or-later* |
| serializers | LGPL-3.0-or-later* |