Understanding IFC Alignment and Rail - Beginners guide

Hi all,
I’ll be supporting a Colleague in writing her Master Thesis and it talks about programmatically adding railway elements along the alignment. This is kind of a common task in Most proprietary design software. Nevertheless this information is rarely correctly exported into IFC. Could somebody point me out where can I read about the relationship between geometry and instances in IFC? How do I read/create an IFC-Alignment element?

I would be very grateful if someone could put aside a little bit of time and talk with me for around 30min and point me in the right way to start eating the big Pie of unstructured documentation.

I have good experience Programming, working with alignments, BIM, and modelling. So I’m not afraid to get technical.

Maybe @stefan.markic @Benzcly or @Evandro could provide some guidance/assistance?

Hi Carlos. Good to hear about your interest, and also that you’re not afraid of going technical :wink:
Based on what you write, if I were you I would start from these two concept templates:

And use them as entry point to read about all the involved entities. In particular, the page of the IfcAlignment entity can give you some indications about “relationship with geometry”.

NOTE: the linked documentation is still under construction, some links might be broken or some figures missing. bSI is working on it.

Hope this helps

1 Like

I am not a specialist of rail. But from what I understand from IFC4.2 documentation, there is two ways you can see it, and I would really love to hear from a real specialist :

You don’t want to edit your geometry, and only the information is needed :

  • your alignment should be represented as an IfcAlignment.
  • IfcAlignment is a subclass of IfcProduct, so it can have a representation and it have a placement through .ObjectPlacement relationship, that will give an IfcObjectPlacement (a point + 2 axis in space)
  • your railway should may be exported as IfcRailing (or anyway, as a subclass of IfcProduct).
  • Your railway has a placement, IfcLocalPlacement. Probably, your IfcRaiIing.ObjectPlacement.RelTo should reference your IfcAlignement.LocalPlacement.
  • There should be a IfcRelPositions instance that code relation between your Ifcrailing instance and your IfcAlignment instance.

you want to edit your Ifcalignement curve and expect your railing to follow :
(This is how I see it, but again, I am not an expert)
IfcAlignement instances are instances of IfcLinearPositionningElement. So, they have an Axis attribute, that allows the definition of an IfcCurve. If your IfcCurve is an instance of IfcIndexedPolyCurve, IfcPolyline, you ultimatly have a list of points (IfcIndexedPolycurve.Points per example). So, you can have multiple instances of IfcLocalPlacement, one for each point of your pointlist. your IfcProduct (assuming it’s a line) can then be decomposed on subparts, each part follows a pertinent IfcLocalPlacement.

EDIT : Seeing the documents from Evandro, second case should be handled by creating multiple IfcAlignements, one nesting others.

you can create instance by instance in IfcOpenShell

@OmarZerhouni You should stop referring to the IFC4.2 documentation and stick to IFC4.3. IFC4.2 has been officially withdrawn as a candidate standard. There was a significant amount of rework done to alignment in IFC4.3 that is no longer directly compatible with 4.2 or 4.1.