twin-import

Convert IFC/BIM models to GLB with GlobalId-keyed property sidecars for Godot digital-twin viewers.

Updated Jul 8, 2026
One-click install
npx skills add https://github.com/arthur0n/xenodot-twin --skill twin-import-arthur0n
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: twin-import
Source: https://github.com/arthur0n/xenodot-twin/tree/main/plugin/skills/twin-import
Command: npx skills add https://github.com/arthur0n/xenodot-twin --skill twin-import-arthur0n

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill requires ifcopenshell.

What problem does it solve? Bringing a real IFC/BIM building model into a Godot digital-twin viewer fails in predictable ways: ifcopenshell has no wheel for newer Python versions, canonical sample-model URLs are dead or serve HTML, GLB node names lose the IFC GlobalIds needed to join live data, and editor-based imports break headless runtime loading. This Skill encodes the proven pipeline that avoids every one of those traps. ## Core Features & Use Cases - IFC to GLB conversion with GlobalId preservation: Runs ifcopenshell 0.8.5 in a pinned Python 3.12 venv with use-element-guids enabled so GLB node names carry the IFC GlobalId, plus a sidecar JSON of psets and quantities keyed by the same GlobalId. - Runtime GLB loading in Godot: Loads the GLB with GLTFDocument at runtime (no editor import, works headless), keeping models as data rather than baked-in assets. - Headless join verification: A SceneTree script joins mesh nodes to sidecar keys, handles Godot name-deduplication via the 22-character GlobalId prefix rule, and writes machine-readable metrics for the assets panel. - Use Case: You receive a 62 MB IFC2X3 building model and need it in your twin viewer. The Skill fetches and checksum-verifies the model, converts it in about a second, loads it at runtime, and gates on a near-100% GlobalId join before any data binding begins. ## Quick Start Convert my IFC model at models/building.ifc into a GLB plus property sidecar, load it at runtime in Godot, and verify the GlobalId join is near 100%.

Frequently Asked Questions about twin-import

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I convert an IFC file to GLB for Godot?

Use ifcopenshell's converter with serializer_settings use-element-guids set to true so GLB node names carry IFC GlobalIds, then load the GLB at runtime with GLTFDocument.append_from_file. Also emit a sidecar JSON of psets and quantities keyed by the same GlobalIds.

Why does pip install ifcopenshell fail with no matching distribution?

ifcopenshell ships no wheel for Python 3.14, the current macOS system Python. Create a virtual environment pinned to Python 3.12 and install ifcopenshell 0.8.5, which is the proven working version for this pipeline.

Why do GLB node names not match my IFC property sidecar keys?

The GLB was converted without use-element-guids on the serializer settings, so nodes got display names instead of GlobalIds. Godot also uniquifies duplicate sibling names, so match on the first 22 characters, which is the exact GlobalId length.

Can I import IFC models through the Godot editor instead of runtime loading?

No, this pipeline's contract is runtime loading with GLTFDocument, which works headless and treats models as data rather than baked assets. Editor imports create .import files and break the headless verification workflow.

How do I validate a downloaded IFC sample model before converting?

Check that the first 13 bytes read ISO-10303-21;, since dead buildingSMART URLs often serve HTML error pages instead of STEP files. Also verify the sha256 digest, because GitHub LFS URLs can serve a small text pointer instead of the real model.

Does IFC2X3 support IfcPump, IfcTank, and IfcValve classes?

No, those equipment classes are IFC4-only. In IFC2X3 they appear as generic IfcFlowStorageDevice, IfcFlowMovingDevice, or IfcFlowController with an ObjectType discriminator, so inspect Name and ObjectType rather than the entity class.