Code Monkey home page Code Monkey logo

ifc-gen's Introduction

IFC-gen

Build Status

IFC-gen is an IFC code generator for IFC2X3 and IFC4. The code generator uses ANTLR to parse the Express.g4 grammar file and generate a parser. The parser is capable of reading the IFC object model as described in EXPRESS format in IFC4.exp or IFC2X3.exp. In addition, IFC-gen uses the STEP grammar described in STEP.g4 to generate a STEP parser whose generated files are output in the target language directory. The code generator is a dotnet core project containing an interface, ILanguageGenerator, which is implemented by classes which generate code.

Source files for each target language can be found in the directory corresponding to the language's name. For example, the source code for the C# IFC library generator can be found in the /lang/csharp folder. For per-language build instruction, please see the language folder's README.

Motivation

If you work in an architecture or engineering firm writing code, or a software startup that's trying to solve problems in AEC, where do you go to find a library that reads and writes building data in an industry-standard form? Maybe you've looked at the IFC schema and, like many before you, have decided that it's "too complex" or "too heavy" for your needs. Maybe you've even gone and built your own data model to describe building elements.

As more firms build their own data models to solve the same problem, we get further away from the vision of what IFC was supposed to be. By comparison, it would be as if every software company that makes a browser decided that they were going to create their own markup and styling languages such that the website you've designed to work in one, wouldn't work in any of the others. That's crazy. It seems to me that not speaking the same language is an impediment to technological progress in AEC.

IFC-gen was created to make generating IFC-compliant software libraries easy, and to ease the updating and testing of those libraries with new releases of the IFC specification. To achieve this goal, IFC-gen has code generation at its core. What do you want to build? A Python library? An Open API specification? A GraphQL schema? Creating a generator for any of these is as easy as providing a new implementation of ILanguageGenerator.

If IFC-gen isn't exactly what you're looking for, there are a few other great IFC related projects that you might want to check out:

Schemas

IFC-gen supports the IFC2X3 and IFC4 schemas. These are represented by the IFC2X3 and IFC4 branches in this repository. If you are contributing to this repository, your change will need to be applied to both branches, unless it is a change that can only be logically applied to one branch.

Why didn't we just build support for various schemas into one branch? Differences in the schema often require differences in the grammar, which in turn generates different parsers, etc. For consumers of libraries generated by IFC-gen, this will mean different versions of libraries to parse IFC data from different schemas. This is not ideal, but our experience has shown that it is preferrable to having one library that is meant to support every version of the schema ever. Additionally, we can use git tools to do things like diff the schemas to see exactly what has changed:

git diff IFC2X3..IFC4 -- schemas/IFC.exp

Road Map

  • ANTLR grammar for IFC EXPRESS.
  • ExpressListener to generate intermediate type data.
  • CI/CD integration with Travis.
  • Generation in all supported languages of ALL types described by the schema.
  • Common BDD test suite with test implementations in all supported languages.
  • Package generation for all supported languages (i.e. Nuget package for IFC-dotnet).
  • Minimum one local file storage back end and one db back end.
  • Support for reading and writing STEP files per ISO 10303-21.

Prerequisites

  • ANTLR. ANTLR is used to generate parsers from a grammar. Follow the instructions on the ANTLR website to install ANTLR and create aliases to the ANTLR binaries.
  • .NET. Currently, IFC-gen creates a C# executable, IFC-gen.dll, for generating IFC from the EXPRESS schema.

Building

For 'nix

To generate the parsers: make generate To generate language code: make <language>

For Windows

make.bat

Contributing

Check out issues marked help wanted.

Creating a Language Generator

Language generators implement the ILanguageGenerator interface. You can find implementations of ILanguageGenerator in /Generators. To create your own language generator do the following:

  • Place an implementation of ILanguageGenerator in /Generators.
  • Extend the command line options parsing in Program.cs to support your target language.
  • Extend the makefile with a new task for the language.

Debugging the Parser

Due to the size of the IFC schema, debugging the parser can be painful. I recommend creating a debug.exp in the root directory that contains only the entities that you are trying to debug, then using make debug_parser. This make step will generate the parser based on the debug schema, and will run IFC-gen outputting tokens to the console for debugging.

ifc-gen's People

Contributors

ikeough avatar simonmoreau avatar amzuko avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.