Create and share views in the BIMViewer

A new feature has beed added to the BIMViewer to allow users to create views of BIM models easily and share them with other users per e-mail.

The views save the state of the model including the camera position and hidden or selected objects, a snapshot of the view also created automatically.

View can be shared easily with other users

Convert IFC models into graph database (Neo4J) based on

We presented at 12.07.2017 in the EG-ICE 2017 conference in Nottingham a workflow for automatic converting of IFC models into Neo4j graph database based on the

The paper can be downloaded here:
Application of graph databases and graph theory concepts for advanced analysing of BIM models based on IFC standard

And the presentation can be downloaded here:

IFC to GraphDB(Neo4j)_EG-ICE_2017

Extract Scheduling Information from IFC Models

This post is related to the following question  by at

Is there any IFC program/viewer that can read(like notepad in windows can) and visualise the:

  • IfcRelAssignTasks
  • IfcTask,
  • IfcScheduletimecontrol,
  • IfcCalenderdate
  • IfcLocactime

When this is possible we can synchronise the (4d) information direct to the IFC model without using other filetypes than IFC, for example to our suppliers: the delivery calenderdates and -time of components on the building site for managing logistics. For Example in this screenshot below we’ve scheduled this wall on 8-3-2017 9:00. After giving this object its date of delivery on construction site we’ve enriched back to the IFC model.


We will use this IFC file: IFC_Schependomlaan_inc_planningsdata.ifc from the open source BIM project at :

Get a list of IFC classes with basic attributes:

  1. Login into demo account ( username: user1 , password: 123)
  2. select the IFC model
  3. select the IFC classes (IfcRelAssignTasks, IfcTask, etc.) & click “GO” button




Write a server script (with 2 simple extensions) for customisation the output format and automate the process:

use "IFC_Schependomlaan_inc_planningsdata.ifc"</code>

def date_time
dateComponent= self.dateComponent.to_obj
timeComponent = self.timeComponent.to_obj
"#{dateComponent.dayComponent}/#{dateComponent.monthComponent}/#{dateComponent.yearComponent} #{timeComponent.hourComponent}:#{timeComponent.minuteComponent}"

def detail
res= {}
res["ActualStart"] = self.actualStart if self.actualStart != "$"
res["EarlyStart"] = self.earlyStart.to_obj.date_time if self.earlyStart != "$"
res["LateStart"] = self.lateStart.to_obj.date_time if self.lateStart != "$"
res["ScheduleStart"] = self.scheduleStart.to_obj.date_time if self.scheduleStart != "$"
res["ActualFinish"] = sef.actualFinish.to_obj.date_time if self.actualFinish != "$"
res["EarlyFinish"] = self.earlyFinish.to_obj.date_time if self.earlyFinish != "$"
res["LateFinish"] =self.lateFinish.to_obj.date_time if self.lateFinish != "$"
res["ScheduleFinish"] =self.scheduleFinish.to_obj.date_time if self.scheduleFinish != "$"
res["ScheduleDuration"] =self.scheduleDuration if self.scheduleDuration != "$"
res["ActualDuration"] =self.actualDuration if self.actualDuration != "$"
res["RemainingTime"] =self.remainingTime if self.remainingTime != "$"
res["FreeFloat"] =self.freeFloat if self.freeFloat != "$"
res["TotalFloat"] =self.totalFloat if self.totalFloat != "$"
res["IsCritical"] =self.isCritical if self.isCritical != "$"
res["StatusTime"] = self.statusTime if self.statusTime != "$"
res["StartFloat"] = self.startFloat.to_s if self.startFloat != "$"
res["FinishFloat"] =self.finishFloat.to_s if self.finishFloat != "$"
res["Completion"] =self.completion.to_s if self.completion != "$"


def saveTimeForTask
self.relatedObjects.toIfcObject.each { |o,id|
$timeForTask[o] = self.timeForTask.to_obj.detail


IFCWORKSCHEDULE.list "name|Ceation Date:creationDate.to_obj.date_time|Start time:startTime.to_obj.date_time"
IFCRELASSIGNSTOPROCESS.list "BIM Element ID:relatedObjects.gsub('#','').split(',').join('')||Time For Task:$timeForTask[relatingProcess.to_obj.line_id]
IFCRELSEQUENCE.list "sequenceType||"
IFCTASK.list "description|isMilestone|name|objectType|priority|status|taskId|workMethod"
IFCRELASSIGNSTASKS.list "|Time for task:timeForTask.to_obj.detail"

The result can be seen at:

This script is just to demonstrate how to extract the information in a simple way.

It can be enhanced to save the information in other formats (XML, CSV, SQL)in order to integrate them with 4D Viewers or Planning Software. can already visualise the construction progress of IFC models exported by Synchro Pro.

Testing IFCWebViewer and BIMViewer on iPad !

Click on the picture bellow to watch the video on Youtub
BIMViewer_iPadTesting WebGL on iPad using Chrome + Jailbreak + webglenabler – iOS 7.0.4

New features:

  • Viewing of multiple models
  • Download the property set of selected object as Excel file

Work in progress:

  • Porting the rest of functionalities of the old viewer (IFCWebViewer) to BIMViewer:
    • Layers
    • select/hide by object tpye/name
    • Color customization
    • Simple sections
  • BIM Collaboration Format support

Script: extract and draw 2D floor plans directly from IFC models

Screenshot 2014-02-02 01.06.04

A draft copy of an IFCWebServer script to extract and draw the floor plans as SVG graphic files.

# This script extratcs the 2D plan of each floor and draw it as SVG graphic
# rooms get at moment random colors and the name of room shows as a tooltip
# It works only when the space footprint is modelled as polyline or prametric profile
use "A-PorterRoad.ifc"
IFCRELAGGREGATES.where("o.relatingObject.to_obj.class == IFCBUILDINGSTOREY","o").each { |relation|
  space_svg = []
  relation.relatedObjects.toIfcObject.each { |k,space|
    next if space.class != IFCSPACE
    space.representation.to_obj.representations.toIfcObject.values.each { |space_geometry|
      space_geometry.items.toIfcObject.values.each { |item|
        $svg_style =" style='stroke:black;stroke-width:25;fill:" + HTML.random_color + ";opacity:0.75' "
        xx << x
        yy << y
        t = "transform='translate(" + x.to_s + "," + y.to_s + ") '"
        space_svg << item.svg(0.05,t).sub("</g>","<title>" + space.longName.gsub("'","") + "</title></g>")}
  puts "<svg version='1.1' xmlns='' viewBox='" + xx.min.to_s + " " + yy.min.to_s
  puts  " " +  (xx.max-xx.min).to_s + " " + (yy.max-yy.min).to_s + "'>"
  puts space_svg.join
  puts "</svg>"

This script uses the following server API functions:

  • use
  • where
  • to_obj
  • toIfcObject
  • svg
  • HTML.random_color

Ruby methods:

  • puts : print something
  • Loop :  x.each { |i|  }
  • next if
  • create array: xx=[]
  • add element to the arry: xx<< x
  • join: convert an array to string