Bohemian SysML ViewerΒΆ

![Bohemian Logo](/images/bohemian/BohemianDomainDiagram.png) **The Open-Source SysML Model Viewer & IDL Code Generator** *Bridge the gap between model-based systems engineering and real-time distributed systems* [Get Started](#quick-start) | [Features](#key-features) | [Download](#installation) | [Documentation](../guides/bohemian.md)

Transform Your SysML Models into Production CodeΒΆ

Bohemian is a powerful, cross-platform SysML model viewer designed specifically for defence and military vehicle systems. Built with Qt6 and C++17, it provides seamless integration with IBM Rational Rhapsody projects and generates production-ready OMG IDL files for DDS-based communication systems.

Why Bohemian?ΒΆ

Challenge Bohemian Solution
πŸ”’ Expensive Rhapsody Licenses View and export models without a Rhapsody license
⚑ Manual IDL Translation Automatic code generation following GVA standards
πŸ”„ Complex CI/CD Integration Headless mode for automated build pipelines
πŸ“Š Model Validation Visual inspection of class diagrams, state charts, and interactions
πŸ€– Domain Design Complexity AI agent assists with creating new domains and integrations

Key FeaturesΒΆ

πŸ—‚οΈ Rhapsody Project SupportΒΆ

  • Native .rpyx parsing - Open IBM Rhapsody projects directly
  • SBSX file support - Load individual model files from directories
  • Cross-reference resolution - Automatic GUID-based element linking
  • Rich metadata extraction - Stereotypes, tagged values, descriptions

πŸ€– AI-Powered Domain CreationΒΆ

  • Intelligent assistant - Create new LDM domains with AI guidance
  • Convention awareness - Automatically applies LDM naming conventions
  • Standards knowledge - Understands MIL-STD, STANAG, and NATO formats
  • Protocol translation - Convert JSON, XML, and binary formats to LDM types

πŸ“ SysML Diagram VisualizationΒΆ

Explore your models with interactive, zoomable diagrams:

Class DiagramsΒΆ

View blocks with attributes, operations, and relationships:

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#012141', 'primaryTextColor': '#00FFFF', 'primaryBorderColor': '#0072FF', 'lineColor': '#0072FF', 'secondaryColor': '#0a3a5c', 'tertiaryColor': '#012141', 'textColor': '#00FFFF', 'classText': '#00FFFF'}}}%% classDiagram class C_Actuator { <> +uint32 A_actuatorId +string A_name +T_ActuatorState A_state +T_Position A_position +activate() +deactivate() +getStatus() T_Status } class C_Solenoid { <> +uint32 A_solenoidId +bool A_energized +float A_current +energize() +deenergize() } class C_Motor { <> +uint32 A_motorId +float A_rpm +float A_torque +T_MotorType A_type +start() +stop() +setSpeed(float) } class T_ActuatorState { <> eIdle eActive eFault eDisabled } C_Actuator <|-- C_Solenoid : extends C_Actuator <|-- C_Motor : extends C_Actuator --> T_ActuatorState : uses

Interaction DiagramsΒΆ

Visualize sequence diagrams and message flows:

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#012141', 'primaryTextColor': '#00FFFF', 'primaryBorderColor': '#0072FF', 'lineColor': '#0072FF', 'signalColor': '#00FFFF', 'signalTextColor': '#012141', 'actorBkg': '#012141', 'actorBorder': '#0072FF', 'actorTextColor': '#00FFFF', 'activationBorderColor': '#00FFFF', 'activationBkgColor': '#0a3a5c', 'sequenceNumberColor': '#00FFFF', 'noteBkgColor': '#0a3a5c', 'noteTextColor': '#00FFFF', 'noteBorderColor': '#0072FF'}}}%% sequenceDiagram participant HMI as HMI Desktop participant Registry as GVA Registry participant Alarms as Alarm Manager participant Subsystem as Vehicle Subsystem HMI->>Registry: RegisterComponent(componentInfo) Registry-->>HMI: RegistrationAck(componentId) Subsystem->>Alarms: RaiseAlarm(alarmData) Alarms->>Registry: LookupSubscribers("alarms") Registry-->>Alarms: SubscriberList[HMI] Alarms->>HMI: PublishAlarm(alarmNotification) HMI-->>Alarms: AlarmAcknowledged(alarmId) Note over HMI,Subsystem: DDS Publish/Subscribe Pattern

State ChartsΒΆ

Explore state machines and transitions:

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#0072FF', 'primaryTextColor': '#ffffff', 'primaryBorderColor': '#00FFFF', 'lineColor': '#0072FF', 'secondaryColor': '#0a3a5c', 'tertiaryColor': '#012141', 'stateBkg': '#012141', 'stateBorder': '#0072FF', 'stateLabelColor': '#00FFFF', 'transitionColor': '#0072FF', 'transitionLabelColor': '#00FFFF', 'compositeBackground': '#0a3a5c', 'compositeBorder': '#0072FF', 'compositeTitleBackground': '#012141', 'errorBkgColor': '#ff3366', 'errorTextColor': '#ffffff'}}}%% stateDiagram-v2 [*] --> Idle : Initialize Idle --> Starting : start() Starting --> Running : startup_complete Starting --> Fault : startup_failed Running --> Stopping : stop() Running --> Fault : error_detected Stopping --> Idle : shutdown_complete Fault --> Idle : reset() Fault --> [*] : critical_failure state Running { [*] --> Normal Normal --> HighLoad : load > 80% HighLoad --> Normal : load < 60% HighLoad --> Throttling : load > 95% Throttling --> HighLoad : load < 90% } note right of Fault System enters fault state on any unrecoverable error end note

Domain ModelsΒΆ

Navigate package hierarchies and dependencies:

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#012141', 'primaryTextColor': '#00FFFF', 'primaryBorderColor': '#0072FF', 'lineColor': '#0072FF', 'secondaryColor': '#0a3a5c', 'tertiaryColor': '#012141', 'clusterBkg': '#0a3a5c', 'clusterBorder': '#0072FF', 'nodeTextColor': '#00FFFF'}}}%% graph TB subgraph LDM["πŸ“¦ Land Data Model"] subgraph Sensors["πŸ” P_Sensors"] GPS["C_GPS"] INS["C_INS"] Compass["C_Compass"] end subgraph Actuators["βš™οΈ P_Actuators"] Motor["C_Motor"] Solenoid["C_Solenoid"] Servo["C_Servo"] end subgraph Alarms["🚨 P_Alarms"] Alarm["C_Alarm"] AlarmMgr["C_AlarmManager"] end subgraph Common["πŸ“š P_Common"] Position["T_Position"] Timestamp["T_Timestamp"] Status["T_Status"] end end GPS --> Position INS --> Position Motor --> Status Alarm --> Timestamp AlarmMgr --> Alarm style LDM fill:#012141,stroke:#00FFFF,color:#00FFFF style Sensors fill:#0a3a5c,stroke:#0072FF,color:#00FFFF style Actuators fill:#0a3a5c,stroke:#00ff88,color:#00ff88 style Alarms fill:#0a3a5c,stroke:#ff3366,color:#ff3366 style Common fill:#0a3a5c,stroke:#ffaa00,color:#ffaa00

βš™οΈ IDL Code GenerationΒΆ

Generate standards-compliant OMG IDL with a single click:

// Auto-generated by Bohemian SysML Viewer
module P_Alarms_PSM {
    const string KC_Alarm_TopicName = "gva/alarms/alarm";

    @appendable
    struct C_Alarm {
        @key uint32 A_alarmId;
        string<256> A_description;
        T_AlarmSeverity A_severity;
        T_Timestamp A_timestamp;
    };
};

Supported Mappings:

SysML Element IDL Output
Package IDL module (P_<PackageName>)
Class IDL struct (C_<ClassName>)
Enumeration IDL enum (T_<TypeName>)
Structure Type IDL struct (T_<TypeName>)
Attribute Struct member (A_<AttributeName>)
Operation Command struct with parameters

Development WorkflowΒΆ

Bohemian seamlessly integrates into your model-driven development process:

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#012141', 'primaryTextColor': '#00FFFF', 'primaryBorderColor': '#0072FF', 'lineColor': '#0072FF', 'secondaryColor': '#0a3a5c', 'tertiaryColor': '#012141', 'clusterBkg': '#0a3a5c', 'clusterBorder': '#0072FF'}}}%% flowchart LR subgraph Design["🎨 Design Phase"] A[("IBM Rhapsody
SysML Model")] B["Export
.rpyx Project"] end subgraph Bohemian["πŸ”§ Bohemian"] C["Parse &
Validate Model"] D["Generate
OMG IDL"] end subgraph Build["πŸ—οΈ Build Phase"] E["IDL Compiler"] F["C++ Types &
DDS Topics"] G["Qt Wrappers"] end subgraph Deploy["πŸš€ Deployment"] H["GVA Vehicle
Subsystems"] end A --> B B --> C C --> D D --> E E --> F F --> G G --> H style A fill:#0072FF,stroke:#00FFFF,color:#fff style D fill:#00ff88,stroke:#00FFFF,color:#012141 style H fill:#ffaa00,stroke:#00FFFF,color:#012141 style Design fill:#012141,stroke:#0072FF,color:#00FFFF style Bohemian fill:#012141,stroke:#00ff88,color:#00FFFF style Build fill:#012141,stroke:#0072FF,color:#00FFFF style Deploy fill:#012141,stroke:#ffaa00,color:#00FFFF

Complete Model-to-Code PipelineΒΆ

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#012141', 'primaryTextColor': '#00FFFF', 'primaryBorderColor': '#0072FF', 'lineColor': '#0072FF', 'secondaryColor': '#0a3a5c', 'tertiaryColor': '#012141', 'clusterBkg': '#0a3a5c', 'clusterBorder': '#0072FF'}}}%% flowchart TB subgraph Input["πŸ“₯ Input Sources"] direction LR rpyx["πŸ“ .rpyx Project"] sbsx["πŸ“ .sbsx Files"] dir["πŸ“‚ Model Directory"] end subgraph Bohemian["⚑ Bohemian Processing"] direction TB parse["πŸ” XML Parser
Extract Elements"] validate["βœ… Validate
Relationships"] detect["🎯 LDM Pattern
Detection"] export["πŸ“€ IDL Export
Engine"] end subgraph Output["πŸ“€ Generated Output"] direction LR idl["πŸ“„ OMG IDL Files"] docs["πŸ“– Documentation"] end subgraph Integration["πŸ”— LDM SDK Integration"] direction TB cmake["πŸ”§ CMake Build"] cpp["πŸ’» C++ Types"] qt["🎨 Qt Wrappers"] dds["πŸ“‘ DDS Topics"] end rpyx --> parse sbsx --> parse dir --> parse parse --> validate validate --> detect detect --> export export --> idl export --> docs idl --> cmake cmake --> cpp cmake --> qt cmake --> dds style Input fill:#012141,stroke:#0072FF,color:#00FFFF style Bohemian fill:#012141,stroke:#00ff88,color:#00FFFF style Output fill:#012141,stroke:#00FFFF,color:#00FFFF style Integration fill:#012141,stroke:#ffaa00,color:#00FFFF style parse fill:#0072FF,stroke:#00FFFF,color:#fff style export fill:#00ff88,stroke:#00FFFF,color:#012141 style dds fill:#ffaa00,stroke:#00FFFF,color:#012141

CI/CD IntegrationΒΆ

Automated IDL GenerationΒΆ

Bohemian's headless mode enables seamless integration with your build pipeline:

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#012141', 'primaryTextColor': '#00FFFF', 'primaryBorderColor': '#0072FF', 'lineColor': '#0072FF', 'secondaryColor': '#0a3a5c', 'tertiaryColor': '#012141', 'clusterBkg': '#0a3a5c', 'clusterBorder': '#0072FF'}}}%% flowchart LR subgraph VCS["πŸ“¦ Version Control"] repo["Git Repository
SysML Models"] end subgraph CI["πŸ”„ CI/CD Pipeline"] trigger["Commit Trigger"] bohemian["Bohemian
--export-idl"] build["CMake Build"] test["Unit Tests"] end subgraph Deploy["πŸš€ Artifacts"] deb["πŸ“¦ .deb Package"] docker["🐳 Container"] end repo --> trigger trigger --> bohemian bohemian --> build build --> test test --> deb test --> docker style VCS fill:#012141,stroke:#0072FF,color:#00FFFF style CI fill:#012141,stroke:#00ff88,color:#00FFFF style Deploy fill:#012141,stroke:#ffaa00,color:#00FFFF style bohemian fill:#0072FF,stroke:#00FFFF,color:#fff style deb fill:#00ff88,stroke:#00FFFF,color:#012141

Pipeline Command:

# Headless IDL export for CI/CD
./bohemian --export-idl ./generated/idl /path/to/project.rpyx

# Or from a directory of model files
./bohemian --export-idl ./generated/idl /path/to/model/directory

Quick StartΒΆ

InstallationΒΆ

=== "Debian/Ubuntu"

```bash
# Download the latest release
wget https://github.com/AstuteSystems/ldm/releases/latest/download/bohemian_latest_amd64.deb

# Install the package
sudo dpkg -i bohemian_latest_amd64.deb
sudo apt-get install -f  # Resolve dependencies
```

=== "Build from Source"

```bash
# Clone the LDM SDK repository
git clone https://github.com/AstuteSystems/ldm.git
cd ldm

# Build Bohemian
mkdir -p build && cd build
cmake -DBUILD_EXAMPLES=ON ..
make external -j$(nproc)
cmake ..
make bohemian -j$(nproc)

# Run
./bin/bohemian
```

RequirementsΒΆ

Component Version
Qt 6.5.0+
CMake 3.16+
C++ Compiler C++17 support
OS Linux (Ubuntu 22.04+, Fedora 38+)

ArchitectureΒΆ

Bohemian is built on a clean, modular architecture:

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#012141', 'primaryTextColor': '#00FFFF', 'primaryBorderColor': '#0072FF', 'lineColor': '#0072FF', 'secondaryColor': '#0a3a5c', 'tertiaryColor': '#012141', 'clusterBkg': '#0a3a5c', 'clusterBorder': '#0072FF'}}}%% graph TB subgraph UI["πŸ–₯️ User Interface Layer"] MainWindow["Main Window"] TreeView["Model Tree View"] DiagramView["Diagram Canvas"] Properties["Properties Panel"] end subgraph View["πŸ‘οΈ View Layer"] TreeModel["Rhapsody Tree Model"] DiagramScene["Diagram Scene"] DiagramItems["Block/Association Items"] end subgraph Model["πŸ“Š Model Layer"] Project["Rhapsody Project"] Subsystem["Subsystems/Packages"] Classes["Classes & Types"] Elements["Attributes & Ops"] Patterns["LDM Pattern Detector"] end subgraph Parser["πŸ” Parser Layer"] XMLParser["XML Parser"] GuidIndex["GUID Index"] Loader["Project Loader"] end subgraph Export["πŸ“€ Export Layer"] IdlExporter["IDL Exporter"] IdlWriter["IDL File Writer"] end MainWindow --> TreeView MainWindow --> DiagramView MainWindow --> Properties TreeView --> TreeModel DiagramView --> DiagramScene DiagramScene --> DiagramItems TreeModel --> Project DiagramItems --> Classes Loader --> XMLParser XMLParser --> GuidIndex Loader --> Project Project --> Subsystem Subsystem --> Classes Classes --> Elements Subsystem --> Patterns IdlExporter --> Subsystem IdlExporter --> IdlWriter style UI fill:#012141,stroke:#00FFFF,color:#00FFFF style View fill:#012141,stroke:#0072FF,color:#00FFFF style Model fill:#012141,stroke:#ffaa00,color:#00FFFF style Parser fill:#012141,stroke:#0072FF,color:#00FFFF style Export fill:#012141,stroke:#00ff88,color:#00FFFF style MainWindow fill:#0072FF,stroke:#00FFFF,color:#fff style IdlExporter fill:#00ff88,stroke:#00FFFF,color:#012141 style Project fill:#ffaa00,stroke:#00FFFF,color:#012141

Keyboard ShortcutsΒΆ

Shortcut Action
Ctrl+O Open project
Ctrl+E Export IDL
Ctrl++ Zoom in
Ctrl+- Zoom out
Ctrl+0 Reset zoom
Ctrl+F Fit to window
Ctrl+Q Quit

GVA Land Data Model SupportΒΆ

Bohemian includes built-in support for the UK Generic Vehicle Architecture (GVA) Land Data Model:

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#012141', 'primaryTextColor': '#00FFFF', 'primaryBorderColor': '#0072FF', 'lineColor': '#0072FF', 'secondaryColor': '#0a3a5c', 'tertiaryColor': '#012141', 'clusterBkg': '#0a3a5c', 'clusterBorder': '#0072FF'}}}%% graph LR subgraph GVA["πŸŽ–οΈ GVA Standards"] PIM["Platform
Independent Model"] PSM["Platform
Specific Model"] IDL["OMG IDL
Interface"] end subgraph Domains["πŸ“¦ LDM Domains"] Sensors["Sensors"] Actuators["Actuators"] Alarms["Alarms"] Navigation["Navigation"] Weapons["Weapons"] Power["Power"] end subgraph Output["πŸ”— DDS Integration"] Topics["DDS Topics"] PubSub["Publish/Subscribe"] QoS["QoS Policies"] end PIM --> PSM PSM --> IDL Sensors --> IDL Actuators --> IDL Alarms --> IDL Navigation --> IDL Weapons --> IDL Power --> IDL IDL --> Topics Topics --> PubSub PubSub --> QoS style GVA fill:#012141,stroke:#00FFFF,color:#00FFFF style Domains fill:#012141,stroke:#0072FF,color:#00FFFF style Output fill:#012141,stroke:#ffaa00,color:#00FFFF style PIM fill:#0072FF,stroke:#00FFFF,color:#fff style IDL fill:#00ff88,stroke:#00FFFF,color:#012141 style Topics fill:#ffaa00,stroke:#00FFFF,color:#012141

Automatic Pattern DetectionΒΆ

Bohemian automatically identifies GVA patterns in your models:

  • Domain packages - Core system domains (sensors, actuators, etc.)
  • Common types - Shared primitives and enumerations
  • PIM/PSM layers - Model transformation artifacts
  • Command patterns - Operation-based interfaces

AI-Powered Domain CreationΒΆ

Bohemian includes an integrated AI agent that assists with creating new LDM domains. The AI agent understands LDM modelling conventions and can help you design, validate, and generate IDL code for new domains.

Setting Up the Claude API KeyΒΆ

The AI agent uses Anthropic's Claude API. You'll need to configure your API key before using the agent:

  1. Get an API Key: Visit console.anthropic.com to create an account and generate an API key
  2. Open Settings: In Bohemian, go to Edit > Preferences or press Ctrl+,
  3. Navigate to AI Settings: Select the AI Agent tab in the settings dialog
  4. Enter Your API Key: Paste your Claude API key in the API Key field
  5. Select Model: Choose your preferred Claude model (claude-sonnet-4-20250514 recommended)
  6. Click OK: Your settings are saved automatically

Claude API Key Setup

API Key Security

Your API key is stored locally in your user settings and is never transmitted except to Anthropic's API servers. The key is obfuscated in the settings file but treat it as sensitive data.

Usage Costs

Claude API usage is billed based on tokens processed. Creating a typical domain uses approximately 10,000-50,000 tokens. Monitor your usage at console.anthropic.com.

Getting Started with the AI AgentΒΆ

  1. Open Bohemian and navigate to View > AI Agent or press Ctrl+Shift+A
  2. The AI agent panel appears on the right side of the window
  3. Type your question or describe the domain you want to create
  4. The agent will guide you through the modelling process step-by-step

Example: Creating an ATAK Cursor-on-Target DomainΒΆ

The AI agent excels at helping you create new domains for external systems integration. Here's an example of creating a domain for ATAK (Android Team Awareness Kit) Cursor-on-Target (CoT) messaging:

Creating a New Domain for ATAK Cursor-on-Target

Example Prompts:

Create a new LDM domain for ATAK Cursor-on-Target (CoT) messaging.
Include support for:
- Position reports (PLI - Position Location Information)
- Contact reports (enemy, friendly, neutral)
- Sensor point of interest (SPI)
- Chat messages
- Alerts and warnings

The AI agent will:

  1. Research the ATAK CoT message format and identify key data structures
  2. Design LDM-compliant classes following naming conventions (C_CoTEvent, C_CoTPoint, etc.)
  3. Generate OMG IDL code with proper DDS annotations
  4. Validate the design against LDM patterns

Understanding Battlespace ObjectsΒΆ

The AI agent can explain complex military domain concepts and help you model them correctly:

AI Agent Explaining Battlespace Objects

Example Prompts:

Explain the difference between a contact and a track in battlespace management.
How should I model sensor detections vs confirmed tracks in LDM?
What data elements are needed for a STANAG 4586 UAV control interface?
Create the LDM structures for vehicle telemetry and waypoint commands.

Suggested Domain Creation WorkflowsΒΆ

Domain Type Example Prompt
Sensor Integration "Create an LDM domain for integrating a thermal imaging camera with automatic target detection"
Protocol Bridge "Design a domain to bridge NMEA 0183 GPS messages to LDM navigation types"
External System "Create types for bidirectional Blue Force Tracker integration"
C2 Interface "Model a command and control interface for artillery fire missions following MIL-STD-6016"
Vehicle Subsystem "Design an LDM domain for electric vehicle battery management with cell monitoring"

AI Agent CapabilitiesΒΆ

The AI agent understands:

  • LDM Naming Conventions - Automatically applies P_, C_, T_, A_, L_, KC_ prefixes
  • DDS Annotations - Adds @key, @appendable, @optional where appropriate
  • GVA Patterns - Follows GVA Translator Guide mapping rules
  • Military Standards - Familiar with STANAG, MIL-STD, and NATO standards
  • Protocol Formats - Can translate JSON, XML, and binary protocols to LDM types

Tips for Effective AI PromptsΒΆ

  1. Be specific about the system or protocol you're integrating
  2. Mention data flows - which direction does data flow, what triggers messages?
  3. Include constraints - bandwidth limits, update rates, reliability requirements
  4. Reference standards - if there's a relevant MIL-STD or STANAG, mention it
  5. Describe use cases - how will the data be used in the vehicle system?

Comparison with AlternativesΒΆ

Feature Bohemian IBM Rhapsody MagicDraw Enterprise Architect
License Cost πŸ†“ Free πŸ’° High πŸ’° High πŸ’° Medium
Rhapsody .rpyx Support βœ… Native βœ… Native ⚠️ Import ⚠️ Import
IDL Generation βœ… GVA-compliant ⚠️ Plugin ⚠️ Plugin ❌ None
Headless Mode βœ… Full ⚠️ Limited ⚠️ Limited ❌ None
DDS Integration βœ… Built-in ❌ None ❌ None ❌ None
Open Source βœ… Yes ❌ No ❌ No ❌ No

Use CasesΒΆ

πŸŽ–οΈ Defence Systems IntegrationΒΆ

Integrate SysML models from prime contractors into your DDS-based vehicle systems without expensive Rhapsody licenses.

πŸ”„ Automated Code GenerationΒΆ

Include Bohemian in your CI/CD pipeline to regenerate IDL files whenever models change, ensuring code always matches design.

βœ… Model ValidationΒΆ

Use Bohemian's visualization tools to verify model structure before committing to code generation, catching errors early.

πŸ“š Documentation GenerationΒΆ

Generate consistent interface documentation directly from SysML models for system integration teams.


Get InvolvedΒΆ


AboutΒΆ

Bohemian is developed by Astute Systems PTY LTD as part of the LDM SDK project.

Copyright Β© 2026 Astute Systems PTY LTD

Licensed under the terms of the project license. See the repository for details.


*"Bridging the gap between systems engineering and software delivery"* **[Download Now](#installation)** | **[View Source](https://github.com/AstuteSystems/ldm)**