Introducing an open-source, accessible, simple, minimalistic file format for BIM. Built to be easy to read and write.
Created by BIM developers for BIM developers.
An idiot admires complexity, while a genius appreciates simplicity - Terry Davis
Website: https://www.dotbim.net
Quick introduction video here: https://www.youtube.com/watch?v=-bpWEdWcHvw
.bim | .ifc | |
---|---|---|
Is it open? | Yes | Yes |
Is it free? | Yes | Yes |
Type | Text file | Text file |
What it contains | Geometry + data attached | Geometry + data attached in a standardized way |
Types of geometries allowed | Triangulated meshes only | A lot of different types: meshes, extrusions, b-reps etc. |
Pages of documentation | 1 | 100+ |
To see much more extended comparison check out Dion's comparison here: paireks#8
- C# library: you're looking at it right now ;)
- Python library: dotbimpy - https://github.com/paireks/dotbimpy
- Grasshopper plugin: dotbimGH - https://github.com/paireks/dotbimGH
- dotbim-ifc, converts to and from IFC and dotbim: https://github.com/Moult/dotbim-ifc, Author: Dion Moult
- Online 3d Viewer, supports.bim files and converts to other file formats: https://3dviewer.net/, Authors: Viktor Kovacs, Agnes Gaschitz
- dotbim-blender, imports .bim files to Blender https://github.com/paireks/dotbim-blender
If you're building any app that will use .bim - let me know, I'll post it here :)
Let's get this community bigger. Share it with your friends and colleagues that want to see a new BIM format: https://discord.gg/uhvx9sysvW
https://www.nuget.org/packages/dotbim/
File size depends on the level of the deduplication made by exporter. You can reference the same mesh multiple times, which can have huge impact on decreasing the size when there is a lot of duplicate meshes.
Files created are also much more efficient once the user's meshes are being optimized, e.g. removing duplicate vertices or better discretization of geometry highly reduce the file size as well.
- .bim
- License: MIT
- JSON structure
- x, y, z coordinates should be in meters
- Decimal point should be used
- JSON objects and properties should start with lowercase and with underscore as a seperator between words, e.g. schema_version
File contains 4 properties:
schema_version is the version of schema used in this file as string. Current one is "1.0.0".
mesh_id is integer >= 0 to reference this mesh later in element.
It is a big array of all coordinates of a mesh. It is structured in this way:
[X0, Y0, Z0, X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, ..., XN, YN, ZN]
Let's say our mesh is defined by 3 vertices: (0.0, 0.0, 0.0), (10.0, 0.0, 0.0) and (10.0, 5.0, 0.0), then your vertices_coordinates will look like this:
[0.0, 0.0, 0.0, 10.0, 0.0, 0.0, 10.0, 5.0, 0.0]
Later in faces_ids we refer to these vertices by their order.
It is a big array of ids (integers) that define all faces in a mesh. It is structured in this way:
[Face1_Id1, Face1_Id2, Face1_Id3, Face2_Id1, Face2_Id2, Face3_Id3, Face3_Id1, Face3_Id2, Face3_Id3, ..., FaceN_Id1, FaceN_Id2, FaceN_Id3]
If we'd like to create one-face mesh using vertices_coordinates from an example above, then it will look like this:
[0, 1, 2]
Pyramid example:
"coordinates": [
0.0,
0.0,
0.0,
10.0,
0.0,
0.0,
10.0,
10.0,
0.0,
0.0,
10.0,
0.0,
5.0,
5.0,
4.0
],
"indices": [
0,
1,
2,
0,
2,
3,
0,
1,
4,
1,
2,
4,
2,
3,
4,
3,
0,
4
]
guid is a string that can be used for comparison of different elements.
"guid": "76e051c1-1bd7-44fc-8e2e-db2b64055068"
Vector places referenced mesh where it should be placed as an element. It should have 3 properties:
- x (value)
- y (value)
- z (value)
"vector": {
"x": 9.9266016462536122,
"y": 3.3910972817343494,
"z": 52.239445879618685
}
Rotation rotates referenced mesh how it should be rotated as element. It is a quaternion. It should have 4 properties:
- qx (value) - first imaginary coefficient of the quaternion
- qy (value) - second imaginary coefficient of the quaternion
- qz (value) - third imaginary coefficient of the quaternion
- qw (value) - real part of the quaternion
"rotation": {
"qx": 0.63979295771454925,
"qy": 0.10626982147910254,
"qz": -0.12472093047736807,
"qw": -0.7508770776915008
}
color should have 3 properties:
- r (integer between 0-255) - red
- g (integer between 0-255) - green
- b (integer between 0-255) - blue
- a (integer between 0-255) - alpha
"color": {
"r": 255,
"g": 255,
"b": 0,
"a": 255
}
Element type. It is a string that specifies what mesh represents. E.g. "Beam", "Plate".
"type": "Beam"
info is just a dictionary with string as key and value.
"info": {
"Name": "Teapot",
"Price": "2.50$"
}
- Wojciech Radaczyński
- Tom Van Diggelen
- Harry Collin
- Marios Messios