Introducing an open-source and minimalist 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: https://www.youtube.com/watch?v=RSV-0-UrzhQ
.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
If you're a developer, check out this document: https://github.com/paireks/dotbim/blob/master/DeveloperTips.md
Name | Purpose | Link | Author |
---|---|---|---|
dotbim | C# library | you're looking at it right now ;) | |
dotbimpy | Python library | https://github.com/paireks/dotbimpy | |
dotbimGH | Grasshopper plugin | https://github.com/paireks/dotbimGH | |
dotbim-ifc | Converts to and from IFC and dotbim | https://github.com/Moult/dotbim-ifc | Dion Moult |
Online 3d Viewer | 3d viewer in your browser, it can also convert to and from other file formats | https://3dviewer.net/ | Viktor Kovacs, Agnes Gaschitz |
dotbim-blender | Blender addon | https://github.com/paireks/dotbim-blender | Nathan Hild |
dotbim-io-dxf | Converts to and from 3d DXF and dotbim | https://github.com/Gorgious56/dotbim_io_dxf | Nathan Hild |
dotbim-ts | Typescript library | https://github.com/baid-group/dotbim-ts | Maciej Lutostański |
dotbim-archicad | Archicad addon | https://github.com/kovacsv/dotbim-archicad | Viktor Kovacs |
os4bim/dotbim | Converts Revit's detailed MEP to schematic 3d model | https://github.com/os4bim/dotbim | Yoann Obry |
import_dotbim | SketchUp addon | https://github.com/MattiaBressanelli/import_dotbim | Mattia Bressanelli |
dotbim.three.js | Three.js addon | https://github.com/ricaun/dotbim.three.js | Luiz Henrique Cassettari |
ICEBridge | Blender plugin to send BIM data to IDA ICE | https://github.com/maxtillberg/ICEBridge | Max Tillberg |
three.model.bim | 3d modelling in browser | https://github.com/RyugaRyuzaki/three.model.bim | Ryuga Ryuzaki |
If you're building any app that will use .bim - let me know, I'll post it here :)
https://www.nuget.org/packages/dotbim/
It may require importing another nuget for Newtonsoft.Json library.
- .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
}
From schema_version 1.1.0 if face_colors tag is applied, then we color element using face_colors, if there is no face_colors - we use color tag to color an element.
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
}
To color single element with multiple colors add "face_colors" tag inside an element. "face_colors" is a simple list of integers (integers should be between 0-255) organised in that way:
[r1, g1, b1, a1, r2, g2, b2, a2, r3, g3, b3, a3, ... rn, gn, bn, an]
It should match each face of the mesh.
So let's say you have 3 faces inside one mesh, and wanted to color first face (triangle) as red (255,0,0,255), second as skyblue (135,206,235,255), third as white (255,255,255,255). Then you will have:
"face_colors" : [ 255, 0, 0, 255, 135, 206, 235, 255, 255, 255, 255, 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$"
}
.bim file format encourages users to link their data by attaching URLs inside properties of file or specific elements. E.g.:
"info": {
"Name": "Metal sheet roofing",
"Catalogue": "https://pruszynski.com.pl/t-20-roof,prod,99,2294.php"
}
Such functionality allows also to link one model with another as well. If you're interested in this kind of linking, check this separate document about it: https://github.com/paireks/dotbim/blob/master/LinkingData.md
If you'd like to read more details about this project, a bit background + line-by-line explanation, you might find this article on BIM Corner interesting: https://bimcorner.com/a-new-bim-file-format/
- Wojciech Radaczyński
- Viktor Kovacs
- Tom Van Diggelen
- Harry Collin
- Marios Messios