YuCAD3D

IFC (openBIM) exchange

Read and write ISO 16739 IFC files: import a coordination model to see it beside your design, import an alignment natively so it becomes real geometry you can edit, and export your design as IFC 4.3 for the rest of the project team.

IFC support is an optional module. If the IFC entries are missing from the menu, your build was made without it — nothing else in the application changes.

What the versions mean for you

VersionWhat you can do
IFC 2x3 and IFC 4 Import buildings and models as geometry with their properties. These versions have no alignment entities at all — nothing is lost by us, the format simply cannot carry a road or rail alignment.
IFC 4.3 Everything above, plus alignments (horizontal, vertical and cant) that import as native yucad3d geometry — and this is the version we export. natively. Export to 2x3 / IFC 4 also works: every downgrade the older schema forces is listed in the export report, never applied silently.
Measured, not assumed. The import path is verified against a 285-file public corpus (buildingSMART samples + the IfcOpenShell test files): 2x3 and IFC 4 files import with their geometry, GlobalId identity and typed property sets intact — across the corpus every harvested property kept its schema type. The only failures are deliberately malformed fuzz files from the parser test-suite.

Importing

IFC ▸ Import IFC Model reads a file in three passes, and tells you in the message log exactly what each one produced:

Refusals are loud, and that is the point. If a file contains an alignment segment whose exact definition is not published — the Viennese bend, or a vertical clothoid — that alignment is refused BY NAME with the reason, and the rest of the file still imports. yucad3d will not silently approximate one curve type with another: a 4 cm surprise you never asked for is worse than a message you can act on.

Editing IFC as IFC

An imported model keeps a live link to its file. Property values shown for a picked object are editable: changing one writes into the IFC file in memory, and IFC ▸ Save IFC Edits writes it back to disk.

Merging two files

IFC ▸ Merge IFC Files asks for a base file, a file to merge in, and where to write the result. Objects carry a GlobalId, and two files can legitimately contain the same one; the merge never resolves that silently — duplicates are given a fresh GlobalId (the copy IS a new object) and the counts are reported.

Exporting

IFC ▸ Export Alignments (IFC 4.3) writes the document as native IFC 4.3: alignments with their horizontal, vertical and cant layouts, the spatial structure, and imported models as tessellated products that keep their original GlobalId and class.

Exporting to an older version is refused with a loss report listing exactly what that version cannot carry, rather than quietly writing a file that has lost your alignments.

Stationing. IFC 4.3 measures the vertical and cant layouts from the start of the horizontal, not in the project’s kilometrage. An alignment that starts anywhere but 0+000 therefore carries its start station as an IfcReferent (type STATION) with Pset_Stationing.Station, and every layout is written relative to it; the importer reads it back, so a track starting at 12+000 comes back at 12+000 with its profile and cant where they were. Its domain comes back too: an imported alignment is a rail or road alignment according to the facility it positions (IfcRailway, IfcRoad); only a file that states none falls back to “has a cant layout, so it is a track”.

What rail objects become

A rail alignment is an IfcAlignment with its horizontal, vertical and cant layouts — and, since #367, two IfcRail products as well: the left and right running rails at ±gauge/2, at the level the profile gives, the left rail raised and the right lowered by half the cant, each with a solid rail-section body along its whole length. The gauge is the cant profile’s rail-head distance when the file states one and 1.435 m otherwise, and the product’s property set says which (GaugeBasis). A polyline track (the older Rail Track object) gets the same two rails and the same body, but it carries no profile, so its rails sit at z = 0 and its property set says so (LevelBasis) rather than pretending a level.

Only tracks get rails: a designed rail alignment, or a parallel track laid as an Offset of one. The lines Rail Lines and Platform Edge lay beside a track are companion lines (kind Misc): they export as alignments, not as another pair of rails, and the rail design checks do not repeat their track’s issues under their names.

Turnouts and cant have always crossed. So do the two rail objects that are physical things which get built and staked:

Every product with a body also carries BaseQuantities: its GrossVolume, computed exactly from the closed body, and the Length of its axis — so a take-off reads the numbers instead of re-measuring a tessellation. A body wound inside-out would sum negative; that is reported in the loss list rather than written as a number that looks right. The set is named BaseQuantities like the corridor courses’; buildingSMART’s per-class Qto_* names are not in the schema itself and are not guessed.

The body dimensions — rail height and head width, fishplate length, marker height — are the railway’s data and come from the loaded standard when it states them. When it does not, a stated default is used and the product’s property set says so in BodyBasis, so the number never travels without its source.

The clearance envelope and the turnout level plan are deliberately not exported, and their loss lines say so. They are analysis, not products: IFC has no honest class for a swept envelope or a level table, and sending them as proxies would put noise in the model and imply a status they do not have. Re-run them on the receiving side, where the sources are.

The predefined types have been checked against the IFC 4.3 schema rather than assumed. An expansion device is written as EXPANSION_JOINT_DEVICE and a fouling point as MARKER, both of which the schema names. A weld, a fishplated joint and an insulated joint have no item of their own, so those three keep USERDEFINED with the kind spelled out in ObjectType — the schema’s own idiom for that case, and what it requires there. That is now a checked decision rather than an uncertain one: less specific than an enum item, never wrong, and only used where the schema genuinely offers nothing better.

Both classes are IFC 4.3 additions. Exporting to IFC4 or IFC2X3 writes them as proxies carrying the class in ObjectType, and says so in the loss report — the same treatment track itself gets there.

The property sets yucad3d publishes

Every property yucad3d writes lives in a YuPset_* set, and since #362 the file describes those sets itself: each family gets an IfcPropertySetTemplate naming its fields, the type each value is written in and the product classes it applies to, and every instance is bound to it. A receiving system reads the schema from the file rather than from this page. What the fields mean is here:

SetOnFields (type)
YuPset_RailTrackIfcRail Gauge (IfcReal, m), SleeperSpacing (IfcReal, m)
YuPset_TurnoutIfcTrackElement FrogNumber (IfcReal, 1:N), RadiusM (IfcReal, m), FromStation (IfcReal, m on the through track), DivergeRight (IfcBoolean)
YuPset_RailJointIfcDiscreteAccessory Track (IfcLabel, the track’s name — the reference the import binds by), Station (IfcReal, m), Rail (IfcLabel, Left/Right), Kind (IfcLabel, Welded / Fishplated / Insulated / Expansion device), BodyBasis (IfcLabel, where the body’s dimensions came from)
YuPset_FoulingPointIfcSign Route (IfcLabel, which track of the pair), Station (IfcReal, m), Spacing (IfcReal, m centre-to-centre at the point), Basis (IfcLabel, the rule that decided the spacing), BodyBasis (IfcLabel)
YuPset_BridgeIfcSlab DeckWidth (IfcReal, m), SlabThickness (IfcReal, m)
YuPset_Tunnelproxy (IfcTunnel is 4.3 — class in ObjectType) Section (IfcLabel), Lining (IfcLabel), LiningThickness (IfcReal, m), InnerRadius (IfcReal, m)
YuPset_Towerproxy (IfcTower) Height (IfcReal, m), GroundZ (IfcReal, m)
YuPset_ConductorIfcCableSegment Type (IfcLabel), VoltagekV (IfcReal, kV)
YuPset_Substationproxy VoltagekV (IfcReal, kV), BusType (IfcLabel), PMW (IfcReal, MW)
YuPset_UtilityPipeIfcPipeSegment Diameter (IfcReal, m), Material (IfcLabel), InvertA / InvertB (IfcReal, m — invert level at each end)
YuPset_UtilityStructureIfcDistributionChamberElement (manhole MANHOLE, catch basin INSPECTIONCHAMBER, pull pit INSPECTIONPIT), IfcValve (ISOLATING), IfcFireSuppressionTerminal (FIREHYDRANT), IfcPipeFitting (BEND / JUNCTION / TRANSITION / EXIT), IfcTank (STORAGE) — each structure exports as the class it is, with the same body the 3D view draws, and every network is one IfcDistributionSystem (WATERSUPPLY / SEWAGE / STORMWATER / …) its products are assigned to RimLevel, InvertLevel, Sump (IfcReal, m)

Templates are written by the IFC 4.3 export. An IFC4 file carries the same property sets without templates and the loss report says so; IFC2X3 has no such entity. bSI’s own Pset_* sets need no template from us, and a set carried through from an imported model is not ours to describe.

Validation

Exports are checked against the official buildingSMART Validation Service — STEP syntax, IFC schema and normative rules all pass. Two advisories remain by choice: we do not invent station referents, and we do not invent a coordinate reference system. Both are real data the file simply does not have; fabricating them would make the file look better and BE worse.

Practical notes

SituationWhat happens
File with Turkish (or any non-ASCII) characters in its path Works. Paths are handled as UTF-8 end to end.
Corrupt or non-IFC file Reported as a failed import; the application keeps running.
Large model Products import as one display mesh grouped by object, so a building with thousands of parts does not flood the Object Browser.
Round-tripping your own export Re-importing an exported alignment reproduces the geometry to within a micrometre — the export and import share one definition of the maths.