🇬🇧

Documentation

Production Assist Core Integration (v1)#

Overview#

Starting with Production Assist Desktop App v1.14, third-party applications can run Production Assist core calculations by:

  1. Writing a glTF/GLB file (glTF 2.0) enhanced with the PA_model extension.
  2. Launching Production Assist Desktop App via a custom URL scheme and passing:
    • the input file path (file)
    • the output file path (file_back)
  3. Reading the calculation result written as a JSON file to disk.

This is a file-based request/response integration. Production Assist acts as the processor.


Compatibility#

  • Minimum Production Assist Desktop App version: 1.14
  • Input format: .gltf or .glb (glTF 2.0)
  • Output format: .json

1) Invocation API (Custom URL Scheme)#

URL Scheme#

Production Assist Desktop App registers the following URL scheme:

productionassist://production_assist_calculate?file=...&file_back=...

Query Parameters#

NameRequiredTypeDescription
filestringPath to the input .gltf/.glb file on disk.
file_backstringPath where Production Assist will write the output .json result.

Path Rules (Important)#

  • Use absolute paths whenever possible.
  • The parameter values must be URL-encoded (spaces, #, ?, &, non-ASCII, etc.).
  • Prefer forward slashes in URLs. If you must pass Windows paths, ensure proper encoding.

Example (conceptual):

productionassist://production_assist_calculate?file=C%3A%5Ctemp%5CCCP.glb&file_back=C%3A%5Ctemp%5CCCP.json

Processing Workflow#

  1. Your application creates a .gltf or .glb file containing the PA_model extension and saves it to disk.
  2. Your application opens the custom URL above (e.g., via shell open, Process.Start, etc.).
  3. Production Assist Desktop App loads the input file, performs calculations, and writes a JSON result to file_back.
  4. Your application reads the JSON from file_back.

Result File Contract#

Production Assist writes the results to the file_back path as a single JSON object with (at least) the following top-level properties:

  • Errors (object)
  • Loads (array)
  • Results (array)

Your application should treat the output file as the “response”.

Recommendations for robust integration:

  • Wait until the output file exists and its size has stabilized before reading.
  • If atomic write is not guaranteed, use a retry loop when parsing JSON.
  • Implement a timeout in your application in case the desktop app is closed or fails.

2) PA_model glTF 2.0 Extension#

Overview#

The PA_model extension enriches glTF 2.0 assets and nodes with Production Assist structural calculation data.

  • Extension name: PA_model
  • Extension scope: asset and node
  • GUID format: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

glTF Integration Notes#

A typical glTF includes:

  • extensionsUsed: must include "PA_model" when present.
  • extensionsRequired: include "PA_model" only if the file is meaningless without it.

Example:

{
  "asset": {
    "version": "2.0",
    "extensions": {
      "PA_model": {
        "identifier": "00000000-0000-0000-0000-000000000000",
        "layers": []
      }
    }
  },
  "extensionsUsed": ["PA_model"]
}

2.1 Asset Properties (asset.extensions.PA_model)#

Properties without a default value are mandatory.

NameTypeDefaultDescription
identifierstringGUID of the asset.
layersarray[layer][]Design layers.

layer object#

NameTypeDefaultDescription
identifierstringGUID of the layer.
namestringHuman-readable name of the layer.

2.2 Node Properties (nodes[i].extensions.PA_model)#

Properties without a default value are mandatory.

NameTypeDefaultDescription
identifierstringGUID of the node.
layer_identifierstring""GUID of the layer associated with this node (if any).
trusstruss | nullnullPresent only on nodes representing trusses.
slingsling | nullnullPresent only on nodes representing slings/hoists.

If a node represents none of these, omit both truss and sling (or set them to null).


2.3 Domain Objects#

Fixture object (defined for completeness)#

NameTypeDefaultDescription
manufacturerstringFixture manufacturer name.
namestringFixture model name.
weightnumber0Fixture weight.

Truss object#

NameTypeDefaultDescription
manufacturerstringTruss manufacturer name.
seriesstringTruss series name.
namestringTruss model name.
structuretruss_structure | nullnullStructural information.
weightnumber0Truss weight.

Truss structure object#

NameTypeDefaultDescription
center_linesarray[planar_path]One or more planar paths defining truss center lines. The path normal denotes the natural upward rigging orientation.

Planar path object#

A path consisting of coplanar line segments.

NameTypeDescription
normalnumber[3]Normal vector of the plane/path.
pointsarray[number[3]] (min 2)Points defining the path polyline.

Sling object#

NameTypeDefaultDescription
structurearray[line] (min 1)Lines defining the sling geometry.
weightnumber0Sling weight.

Line object#

A line consisting of two points.

NameTypeDescription
pointsarray[2] of number[3]Start and end point.

Panel object (defined for completeness)#

NameTypeDefaultDescription
manufacturerstringPanel manufacturer name.
namestringPanel model name.
weightnumber0Panel weight.

3) Examples#

3.1 Sling / Hoist Node Example#

{
  "name": "M1",
  "matrix": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1.35057068, 5.99999952, 1.24985063, 1],
  "extensions": {
    "PA_model": {
      "identifier": "6a6dadc8-592c-4a77-8e7c-05261283ef0a",
      "layer_identifier": "6ed3ab5b-7b5e-4e65-9f8e-39b9b20b9d9c",
      "sling": {
        "structure": [
          {
            "points": [
              [0, -1.77299976, 1.1920929e-07],
              [0, 2.00000048, 0]
            ]
          }
        ],
        "weight": 0
      }
    }
  }
}

3.2 Truss Node Example#

{
  "matrix": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -2, 4.11349964, 1.24985075, 1],
  "extensions": {
    "PA_model": {
      "identifier": "3a38e519-ba87-49ef-af16-0c0a9d4f6e7c",
      "layer_identifier": "6ed3ab5b-7e5e-4e65-9f8e-39b9b20b9d9c",
      "truss": {
        "manufacturer": "Prolyte",
        "series": "H30V",
        "name": "H30V 2m",
        "structure": {
          "center_lines": [
            {
              "normal": [0, 1, 0],
              "points": [
                [-1, 0, 0],
                [1, 0, 0]
              ]
            }
          ]
        },
        "weight": 7.84000015
      }
    }
  }
}

4) Integration Checklist#

  • Generate valid glTF 2.0 (.gltf or .glb)
  • Add extensionsUsed: ["PA_model"]
  • Populate asset.extensions.PA_model.identifier
  • Populate node extensions with PA_model.identifier
  • Write file to disk
  • Launch productionassist://production_assist_calculate?...
  • Wait for output file at file_back
  • Parse JSON result (handle errors/warnings via Errors)

5) Output JSON Schema (file_back)#

This section documents the JSON written by Production Assist to the file_back path.

5.1 Top-level object#

Properties without a default value are mandatory.

NameTypeDefaultDescription
Errorsobject<string, error_item[]>Map of error category key to a list of issues.
Loadsarray[0..] of load_item[]Aggregated loads used in the calculation.
Resultsarray[0..] of result_item[]Computed results.

5.2 Common Types#

vec3#

A 3D vector:

NameTypeDescription
XnumberX component
YnumberY component
ZnumberZ component

Example:

{ "X": 0.0, "Y": 0.0, "Z": 0.0 }

quat#

A quaternion (WXYZ):

NameTypeDescription
WnumberW component
XnumberX component
YnumberY component
ZnumberZ component

Example:

{ "W": 1.0, "X": 0.0, "Y": 0.0, "Z": 0.0 }

5.3 Errors#

Errors is an object where each property name is an error category key (e.g., SUPPORT_ERROR) and the value is an array of error_item.

error_item#

Properties without a default value are mandatory.

NameTypeDefaultDescription
MessagestringHuman-readable explanation.
Errorbooleantrue = error (typically blocks valid result), false = warning/info.
Confidencenumber1.0Confidence level (0..1).
HasFixbooleanfalseWhether a fix action is available.
FixCommandstring""Fix operation identifier (if HasFix is true).
FixCommand2string""Optional secondary fix operation identifier.
FixTextstring""Optional UI text for fix action.
FixText2string""Optional UI text for secondary fix action.
ObjectstringPrimary object UUID in braces, e.g. "Ellipsis".
Objectsarray[0..] of string[]Related object UUIDs.
Positionvec3Location of the issue in model coordinates.
QuatquatOrientation at the issue location.
Colorvec3Display color (0..1).
DisplayFormattingdisplay_formattingFormatting hints for overlay / annotation display.
ShowInListbooleantrueWhether it should be shown in a UI list.
DrawHeatmapbooleanfalseWhether heatmap visualization should be enabled.
UseInAutoFixbooleanfalseWhether it can be used by an auto-fix flow.
Lengthnumber0.0Associated length if applicable.
Payloadstring""Reserved for additional data.
Payload2string""Reserved for additional data.
TextStylestring""Reserved for UI styling key.

display_formatting#

Properties without a default value are mandatory.

NameTypeDefaultDescription
ValidbooleanfalseWhether the formatting values are valid.
TextSizenumber12Text size in UI units.
HasLeaderbooleanfalseWhether a leader line should be drawn.
HasRectanglebooleanfalseWhether a rectangle background should be drawn.
BackColorvec3Background color.
TextColorvec3Text color.
RectangleTopLeftvec3Rectangle top-left coordinate.
RectangleBottomRightvec3Rectangle bottom-right coordinate.

5.4 Loads#

Loads is an array of aggregated load items used as inputs to the calculation.

load_item#

Properties without a default value are mandatory.

NameTypeDefaultDescription
NamestringName/label of the load item (e.g., fixture model, truss name, cable load).
CountnumberQuantity. For distributed loads this may reflect discretization.
DistLoadbooleanfalsetrue if the load is distributed.
TotalWeightnumber0Total weight for this load item (units as configured in Production Assist).
ForceStructurenumber0Force contribution applied to structure.
ForceSupportnumber0Force contribution applied to supports.
LayerNamestring""Layer name associated with the item.
LoadGroupNamestring""Logical grouping (e.g., Cable).
Keystring""Reserved / grouping key.
ObjectIDstring""Reserved / internal object id.
SetbooleanfalseWhether the load item was explicitly set/defined (true) or inferred (false).

5.5 Results#

Results is an array of computed results for the system and/or specific objects.

result_item#

Properties without a default value are mandatory.

NameTypeDefaultDescription
NamestringDisplay name of the result (e.g., Stiff Deflection).
Keystring""Result key (e.g., Stiff).
ResultTypestringResult kind identifier (e.g., Workload, D).
LoadCasestringLoad case name used for the computation.
Valuenumber0Result value.
MaxValuenumber0Max value for scaling/visualization.
Workloadnumber0Workload value (if applicable).
NoWorkloadRedbooleanfalseUI hint controlling warning coloring.
SecondWindSpeedbooleanfalseUI/logic flag.
Anglenumber0Angle of evaluation.
TypenumberNumeric type code (enum).
UnitnumberNumeric unit code (enum).
ObjectUuidstringTarget object UUID, or all-zero UUID for system-level results.
ObjectIDstring""Reserved / internal object id.

If you maintain enum lists for Type and Unit, add them here so integrators can render values correctly.


5.6 Example Output#

{
  "Errors": {
    "FrameNoCrossSection": [
      {
        "Color": {
          "X": 0.31273,
          "Y": 0.32902,
          "Z": 0.0
        },
        "Confidence": 1.0,
        "DisplayFormatting": {
          "BackColor": {
            "X": 0.0,
            "Y": 0.0,
            "Z": 0.0
          },
          "HasLeader": false,
          "HasRectangle": false,
          "RectangleBottomRight": {
            "X": 0.0,
            "Y": 0.0,
            "Z": 0.0
          },
          "RectangleTopLeft": {
            "X": 0.0,
            "Y": 0.0,
            "Z": 0.0
          },
          "TextColor": {
            "X": 0.0,
            "Y": 0.0,
            "Z": 0.0
          },
          "TextSize": 12,
          "Valid": false
        },
        "DrawHeatmap": false,
        "Error": false,
        "FixCommand": "",
        "FixCommand2": "",
        "FixText": "",
        "FixText2": "",
        "HasFix": false,
        "Length": 0.0,
        "Message": "Generic has no valid Cross Section",
        "Object": "{6980F4A2-2BB5-4CEF-B4AF-755BC317A600}",
        "Objects": [
          "{E014C249-A7DD-4285-BE50-AE1F43174400}",
          "{13113FCD-8B06-417D-9391-65C76BD11300}"
        ],
        "Payload": "",
        "Payload2": "",
        "Position": {
          "X": -51.038265228271484,
          "Y": 9.781068489189302e-13,
          "Z": 4405.001640319824
        },
        "Quat": {
          "W": 1.0,
          "X": 0.0,
          "Y": 0.0,
          "Z": 0.0
        },
        "ShowInList": true,
        "TextStyle": "",
        "UseInAutoFix": false
      }
    ],
    "SUPPORT_ERROR": [
      {
        "Color": {
          "X": 0.31273,
          "Y": 0.32902,
          "Z": 0.0
        },
        "Confidence": 1.0,
        "DisplayFormatting": {
          "BackColor": {
            "X": 0.0,
            "Y": 0.0,
            "Z": 0.0
          },
          "HasLeader": false,
          "HasRectangle": false,
          "RectangleBottomRight": {
            "X": 0.0,
            "Y": 0.0,
            "Z": 0.0
          },
          "RectangleTopLeft": {
            "X": 0.0,
            "Y": 0.0,
            "Z": 0.0
          },
          "TextColor": {
            "X": 0.0,
            "Y": 0.0,
            "Z": 0.0
          },
          "TextSize": 12,
          "Valid": false
        },
        "DrawHeatmap": false,
        "Error": true,
        "FixCommand": "LR_PlaceHoistsToStructure",
        "FixCommand2": "",
        "FixText": "",
        "FixText2": "",
        "HasFix": true,
        "Length": 0.0,
        "Message": "No Supports on System",
        "Object": "{00000000-0000-0000-0000-000000000000}",
        "Objects": [
          "{6980F4A2-2BB5-4CEF-B4AF-755BC317A600}",
          "{E014C249-A7DD-4285-BE50-AE1F43174400}",
          "{13113FCD-8B06-417D-9391-65C76BD11300}"
        ],
        "Payload": "",
        "Payload2": "",
        "Position": {
          "X": -51.038265228271484,
          "Y": 9.781068489189302e-13,
          "Z": 4405.001640319824
        },
        "Quat": {
          "W": 1.0,
          "X": 0.0,
          "Y": 0.0,
          "Z": 0.0
        },
        "ShowInList": true,
        "TextStyle": "",
        "UseInAutoFix": false
      }
    ]
  },
  "Loads": [
    {
      "Count": 3.0,
      "DistLoad": false,
      "ForceStructure": 0.10790999999999999,
      "ForceSupport": 0.10790999999999999,
      "Key": "",
      "LayerName": "CP.glb",
      "LoadGroupName": "",
      "Name": "Generic Rectangular Section, 2m",
      "ObjectID": "",
      "Set": false,
      "TotalWeight": 11000.0
    },
    {
      "Count": 2.0,
      "DistLoad": false,
      "ForceStructure": 0.250155,
      "ForceSupport": 0.250155,
      "Key": "",
      "LayerName": "CP.glb",
      "LoadGroupName": "",
      "Name": "Robin MMX Spot",
      "ObjectID": "",
      "Set": false,
      "TotalWeight": 25500.0
    },
    {
      "Count": 6000.0,
      "DistLoad": true,
      "ForceStructure": 3.97305e-05,
      "ForceSupport": 2.943e-05,
      "Key": "",
      "LayerName": "",
      "LoadGroupName": "Cable",
      "Name": "Cable Load Truss",
      "ObjectID": "",
      "Set": true,
      "TotalWeight": 3.0
    }
  ],
  "Results": [
    {
      "Angle": 0.0,
      "Key": "Stiff",
      "LoadCase": "Eurocode Ultimate Failure",
      "MaxValue": 1.0,
      "Name": "Stiff Overall Workload ",
      "NoWorkloadRed": false,
      "ObjectID": "",
      "ObjectUuid": "{00000000-0000-0000-0000-000000000000}",
      "ResultType": "Workload",
      "SecondWindSpeed": false,
      "Type": 4,
      "Unit": 24,
      "Value": 0.0,
      "Workload": 0.0
    },
    {
      "Angle": 0.0,
      "Key": "Stiff",
      "LoadCase": "Eurocode Ultimate Failure",
      "MaxValue": 1000.0,
      "Name": "Stiff Deflection ",
      "NoWorkloadRed": false,
      "ObjectID": "",
      "ObjectUuid": "{00000000-0000-0000-0000-000000000000}",
      "ResultType": "D",
      "SecondWindSpeed": false,
      "Type": 4,
      "Unit": 1,
      "Value": 0.0,
      "Workload": 0.0
    }
  ]
}