
Starting with Production Assist Desktop App v1.14, third-party applications can run Production Assist core calculations by:
PA_model extension.file)file_back)This is a file-based request/response integration. Production Assist acts as the processor.
.gltf or .glb (glTF 2.0).jsonProduction Assist Desktop App registers the following URL scheme:
productionassist://production_assist_calculate?file=...&file_back=...
| Name | Required | Type | Description |
|---|---|---|---|
file | ✅ | string | Path to the input .gltf/.glb file on disk. |
file_back | ✅ | string | Path where Production Assist will write the output .json result. |
#, ?, &, non-ASCII, etc.).Example (conceptual):
productionassist://production_assist_calculate?file=C%3A%5Ctemp%5CCCP.glb&file_back=C%3A%5Ctemp%5CCCP.json
.gltf or .glb file containing the PA_model extension and saves it to disk.shell open, Process.Start, etc.).file_back.file_back.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:
PA_model glTF 2.0 Extension#The PA_model extension enriches glTF 2.0 assets and nodes with Production Assist structural calculation data.
PA_modelasset and node"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"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"]
}
asset.extensions.PA_model)#Properties without a default value are mandatory.
| Name | Type | Default | Description |
|---|---|---|---|
identifier | string | — | GUID of the asset. |
layers | array[layer] | [] | Design layers. |
layer object#| Name | Type | Default | Description |
|---|---|---|---|
identifier | string | — | GUID of the layer. |
name | string | — | Human-readable name of the layer. |
nodes[i].extensions.PA_model)#Properties without a default value are mandatory.
| Name | Type | Default | Description |
|---|---|---|---|
identifier | string | — | GUID of the node. |
layer_identifier | string | "" | GUID of the layer associated with this node (if any). |
truss | truss | null | null | Present only on nodes representing trusses. |
sling | sling | null | null | Present only on nodes representing slings/hoists. |
If a node represents none of these, omit both
trussandsling(or set them tonull).
| Name | Type | Default | Description |
|---|---|---|---|
manufacturer | string | — | Fixture manufacturer name. |
name | string | — | Fixture model name. |
weight | number | 0 | Fixture weight. |
| Name | Type | Default | Description |
|---|---|---|---|
manufacturer | string | — | Truss manufacturer name. |
series | string | — | Truss series name. |
name | string | — | Truss model name. |
structure | truss_structure | null | null | Structural information. |
weight | number | 0 | Truss weight. |
| Name | Type | Default | Description |
|---|---|---|---|
center_lines | array[planar_path] | — | One or more planar paths defining truss center lines. The path normal denotes the natural upward rigging orientation. |
A path consisting of coplanar line segments.
| Name | Type | Description |
|---|---|---|
normal | number[3] | Normal vector of the plane/path. |
points | array[number[3]] (min 2) | Points defining the path polyline. |
| Name | Type | Default | Description |
|---|---|---|---|
structure | array[line] (min 1) | — | Lines defining the sling geometry. |
weight | number | 0 | Sling weight. |
A line consisting of two points.
| Name | Type | Description |
|---|---|---|
points | array[2] of number[3] | Start and end point. |
| Name | Type | Default | Description |
|---|---|---|---|
manufacturer | string | — | Panel manufacturer name. |
name | string | — | Panel model name. |
weight | number | 0 | Panel weight. |
{
"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
}
}
}
}
{
"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
}
}
}
}
.gltf or .glb)extensionsUsed: ["PA_model"]asset.extensions.PA_model.identifierPA_model.identifierproductionassist://production_assist_calculate?...file_backErrors)file_back)#This section documents the JSON written by Production Assist to the file_back path.
Properties without a default value are mandatory.
| Name | Type | Default | Description |
|---|---|---|---|
Errors | object<string, error_item[]> | — | Map of error category key to a list of issues. |
Loads | array[0..] of load_item | [] | Aggregated loads used in the calculation. |
Results | array[0..] of result_item | [] | Computed results. |
vec3#A 3D vector:
| Name | Type | Description |
|---|---|---|
X | number | X component |
Y | number | Y component |
Z | number | Z component |
Example:
{ "X": 0.0, "Y": 0.0, "Z": 0.0 }
quat#A quaternion (WXYZ):
| Name | Type | Description |
|---|---|---|
W | number | W component |
X | number | X component |
Y | number | Y component |
Z | number | Z component |
Example:
{ "W": 1.0, "X": 0.0, "Y": 0.0, "Z": 0.0 }
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.
| Name | Type | Default | Description |
|---|---|---|---|
Message | string | — | Human-readable explanation. |
Error | boolean | — | true = error (typically blocks valid result), false = warning/info. |
Confidence | number | 1.0 | Confidence level (0..1). |
HasFix | boolean | false | Whether a fix action is available. |
FixCommand | string | "" | Fix operation identifier (if HasFix is true). |
FixCommand2 | string | "" | Optional secondary fix operation identifier. |
FixText | string | "" | Optional UI text for fix action. |
FixText2 | string | "" | Optional UI text for secondary fix action. |
Object | string | — | Primary object UUID in braces, e.g. "Ellipsis". |
Objects | array[0..] of string | [] | Related object UUIDs. |
Position | vec3 | — | Location of the issue in model coordinates. |
Quat | quat | — | Orientation at the issue location. |
Color | vec3 | — | Display color (0..1). |
DisplayFormatting | display_formatting | — | Formatting hints for overlay / annotation display. |
ShowInList | boolean | true | Whether it should be shown in a UI list. |
DrawHeatmap | boolean | false | Whether heatmap visualization should be enabled. |
UseInAutoFix | boolean | false | Whether it can be used by an auto-fix flow. |
Length | number | 0.0 | Associated length if applicable. |
Payload | string | "" | Reserved for additional data. |
Payload2 | string | "" | Reserved for additional data. |
TextStyle | string | "" | Reserved for UI styling key. |
display_formatting#Properties without a default value are mandatory.
| Name | Type | Default | Description |
|---|---|---|---|
Valid | boolean | false | Whether the formatting values are valid. |
TextSize | number | 12 | Text size in UI units. |
HasLeader | boolean | false | Whether a leader line should be drawn. |
HasRectangle | boolean | false | Whether a rectangle background should be drawn. |
BackColor | vec3 | — | Background color. |
TextColor | vec3 | — | Text color. |
RectangleTopLeft | vec3 | — | Rectangle top-left coordinate. |
RectangleBottomRight | vec3 | — | Rectangle bottom-right coordinate. |
Loads#Loads is an array of aggregated load items used as inputs to the calculation.
load_item#Properties without a default value are mandatory.
| Name | Type | Default | Description |
|---|---|---|---|
Name | string | — | Name/label of the load item (e.g., fixture model, truss name, cable load). |
Count | number | — | Quantity. For distributed loads this may reflect discretization. |
DistLoad | boolean | false | true if the load is distributed. |
TotalWeight | number | 0 | Total weight for this load item (units as configured in Production Assist). |
ForceStructure | number | 0 | Force contribution applied to structure. |
ForceSupport | number | 0 | Force contribution applied to supports. |
LayerName | string | "" | Layer name associated with the item. |
LoadGroupName | string | "" | Logical grouping (e.g., Cable). |
Key | string | "" | Reserved / grouping key. |
ObjectID | string | "" | Reserved / internal object id. |
Set | boolean | false | Whether the load item was explicitly set/defined (true) or inferred (false). |
Results#Results is an array of computed results for the system and/or specific objects.
result_item#Properties without a default value are mandatory.
| Name | Type | Default | Description |
|---|---|---|---|
Name | string | — | Display name of the result (e.g., Stiff Deflection). |
Key | string | "" | Result key (e.g., Stiff). |
ResultType | string | — | Result kind identifier (e.g., Workload, D). |
LoadCase | string | — | Load case name used for the computation. |
Value | number | 0 | Result value. |
MaxValue | number | 0 | Max value for scaling/visualization. |
Workload | number | 0 | Workload value (if applicable). |
NoWorkloadRed | boolean | false | UI hint controlling warning coloring. |
SecondWindSpeed | boolean | false | UI/logic flag. |
Angle | number | 0 | Angle of evaluation. |
Type | number | — | Numeric type code (enum). |
Unit | number | — | Numeric unit code (enum). |
ObjectUuid | string | — | Target object UUID, or all-zero UUID for system-level results. |
ObjectID | string | "" | Reserved / internal object id. |
If you maintain enum lists for
TypeandUnit, add them here so integrators can render values correctly.
{
"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
}
]
}