diff --git a/docs/exampleExport.json b/docs/exampleExport.json
new file mode 100644
index 0000000..a17ebfa
--- /dev/null
+++ b/docs/exampleExport.json
@@ -0,0 +1,91 @@
+{
+ "baseModel": true,
+ "modelId": "erlbach",
+ "ports": [
+ {
+ "i": 74,
+ "modelId": "idErlbachPart74",
+ "portId": "portErlbach74"
+ },
+ {
+ "i": 75,
+ "modelId": "idErlbachPart75",
+ "portId": "portErlbach75"
+ },
+ {
+ "i": 76,
+ "modelId": "idErlbachPart76",
+ "portId": "batteriePack"
+ },
+ {
+ "i": 80,
+ "modelId": "idErlbachWheel_LH",
+ "portId": "wheel"
+ },
+ {
+ "i": 81,
+ "modelId": "idErlbachWheel_LV",
+ "portId": "wheel"
+ },
+ {
+ "i": 82,
+ "modelId": "idErlbachWheel_RH",
+ "portId": "wheel"
+ },
+ {
+ "i": 83,
+ "modelId": "idErlbachWheel_RV",
+ "portId": "wheel"
+ },
+ {
+ "i": 84,
+ "modelId": "idErlbachPart84",
+ "portId": "body"
+ },
+ {
+ "i": 85,
+ "modelId": "idErlbachPart85",
+ "portId": "portErlbach85"
+ },
+ {
+ "i": 86,
+ "modelId": "idErlbachPart86",
+ "portId": "portErlbach86"
+ },
+ {
+ "i": 87,
+ "modelId": "idErlbachPart87",
+ "portId": "portErlbach87"
+ },
+ {
+ "i": 88,
+ "modelId": "idErlbachPart88",
+ "portId": "portErlbach88"
+ },
+ {
+ "i": 89,
+ "modelId": "idErlbachPart89",
+ "portId": "portErlbach89"
+ },
+ {
+ "i": 90,
+ "modelId": "idErlbachPart90",
+ "portId": "portErlbach90"
+ },
+ {
+ "i": 91,
+ "modelId": "idErlbachPart91",
+ "portId": "portErlbach91"
+ },
+ {
+ "i": 92,
+ "modelId": "idErlbachPart92",
+ "portId": "portErlbach92"
+ },
+ {
+ "i": 93,
+ "modelId": "idErlbachPart93",
+ "portId": "portErlbach93"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/vr-configurator/Assets/Scenes/SampleScene.unity b/vr-configurator/Assets/Scenes/SampleScene.unity
index fce12e6..f171b86 100644
--- a/vr-configurator/Assets/Scenes/SampleScene.unity
+++ b/vr-configurator/Assets/Scenes/SampleScene.unity
@@ -13502,6 +13502,247 @@ MonoBehaviour:
_offsetAlongNormal: 0.005
_playerHead: {fileID: 0}
_selectObject: {fileID: 1599790582}
+--- !u!1 &1334436250
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1334436260}
+ - component: {fileID: 1334436258}
+ - component: {fileID: 1334436257}
+ - component: {fileID: 1334436256}
+ - component: {fileID: 1334436255}
+ - component: {fileID: 1334436254}
+ - component: {fileID: 1334436253}
+ - component: {fileID: 1334436252}
+ - component: {fileID: 1334436251}
+ m_Layer: 0
+ m_Name: ExportButtong (TODO MERGE WITH RETURNBUTTONG)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &1334436251
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334436250}
+ m_Material: {fileID: 0}
+ m_IncludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_ExcludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_LayerOverridePriority: 0
+ m_IsTrigger: 0
+ m_ProvidesContacts: 0
+ m_Enabled: 1
+ serializedVersion: 3
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!114 &1334436252
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334436250}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1334436253}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1519836175}
+ m_TargetAssemblyTypeName: ModelManager, Assembly-CSharp
+ m_MethodName: Export
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+--- !u!114 &1334436253
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334436250}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.21960786, g: 0.21960786, b: 0.21960786, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1334436254
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334436250}
+ m_CullTransparentMesh: 1
+--- !u!114 &1334436255
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334436250}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 7aaf960227867044282d921171d2d7ac, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ pointer: {fileID: 0}
+ sortOrder: 0
+--- !u!114 &1334436256
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334436250}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &1334436257
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334436250}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 0
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 800, y: 600}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+ m_PresetInfoIsWorld: 1
+--- !u!223 &1334436258
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334436250}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 2
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_VertexColorAlwaysGammaSpace: 0
+ m_AdditionalShaderChannelsFlag: 25
+ m_UpdateRectTransformForStandalone: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &1334436260
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334436250}
+ m_LocalRotation: {x: 0.17298737, y: 0.085831694, z: -0.015134441, w: 0.98106027}
+ m_LocalPosition: {x: 0, y: 0, z: 0.832}
+ m_LocalScale: {x: 0.01, y: 0.01, z: 0.01}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 1542946158}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 20, y: 10, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 1.734, y: -0.488}
+ m_SizeDelta: {x: 180, y: 50}
+ m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &1335548243
GameObject:
m_ObjectHideFlags: 0
@@ -16073,6 +16314,142 @@ Transform:
m_Children: []
m_Father: {fileID: 1337995492}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1542946157
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1542946158}
+ - component: {fileID: 1542946160}
+ - component: {fileID: 1542946159}
+ m_Layer: 0
+ m_Name: ReturnButtonText
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1542946158
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1542946157}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 1334436260}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 200, y: 50}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1542946159
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1542946157}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_text: Export Model
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+ m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 24
+ m_fontSizeBase: 24
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 2
+ m_VerticalAlignment: 512
+ m_textAlignment: 65535
+ m_characterSpacing: 0
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 1
+ m_parseCtrlCharacters: 1
+ m_isOrthographic: 1
+ m_isCullingEnabled: 0
+ m_horizontalMapping: 0
+ m_verticalMapping: 0
+ m_uvLineOffset: 0
+ m_geometrySortingOrder: 0
+ m_IsTextObjectScaleStatic: 0
+ m_VertexBufferAutoSizeReduction: 0
+ m_useMaxVisibleDescender: 1
+ m_pageToDisplay: 1
+ m_margin: {x: 0, y: 0, z: 0, w: 0}
+ m_isUsingLegacyAnimationComponent: 0
+ m_isVolumetricText: 0
+ m_hasFontAssetChanged: 0
+ m_baseMaterial: {fileID: 0}
+ m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!222 &1542946160
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1542946157}
+ m_CullTransparentMesh: 1
--- !u!1 &1546124943
GameObject:
m_ObjectHideFlags: 0
@@ -26644,3 +27021,4 @@ SceneRoots:
- {fileID: 576843183}
- {fileID: 624025130}
- {fileID: 6345901854734501750}
+ - {fileID: 1334436260}
diff --git a/vr-configurator/Assets/Scripts/Models/ModelBehaviour.cs b/vr-configurator/Assets/Scripts/Models/ModelBehaviour.cs
index 18bb33c..567624e 100644
--- a/vr-configurator/Assets/Scripts/Models/ModelBehaviour.cs
+++ b/vr-configurator/Assets/Scripts/Models/ModelBehaviour.cs
@@ -126,4 +126,53 @@ public class ModelBehaviour : MonoBehaviour
}
}
+ ///
+ /// -> see docs/exampleExport.json
+ /// this doesn't include leading+trailing { } or commas, just the content
+ /// this is recursive
+ ///
+ /// Whether all Ports or just the Chooseable ones should be exported
+ /// an unfinished Json of this Model and all its children
+ string ExportJsonBase(bool chooseableOnly = true)
+ {
+ string export = "";
+ if (Model is BaseModel)
+ {
+ export += "\"baseModel\": true,";
+ }
+ export += $"\"modelId\": \"{Model.NameId}\"";
+ if(Model is ChildModel cm)
+ {
+ export += $", \"portId\": \"{cm.Port}\"";
+ }
+ if(!Model.HasPorts())
+ {
+ return export;
+ }
+ export += ", \"ports\": [";
+ for (int i = 0; i < Model.Ports.Count; i++)
+ {
+ if (chooseableOnly && !Model.Ports[i].Chooseable)
+ {
+ continue;
+ }
+ export += "{ \"i\": " + i +", " + _children[i].GetComponent().ExportJsonBase() + "}";
+ if(i != Model.Ports.Count-1) //if not the last
+ {
+ export += ",";
+ }
+ }
+ export += "]";
+ return export;
+ }
+
+ ///
+ /// Exports the current Model as a correct JSON
+ /// -> see docs/exampleExport.json
+ ///
+ /// An 'unformatted' JSON
+ public string ExportJson()
+ {
+ return "{" + ExportJsonBase() + "}";
+ }
}
diff --git a/vr-configurator/Assets/Scripts/Models/ModelManager.cs b/vr-configurator/Assets/Scripts/Models/ModelManager.cs
index 026cb6d..ab0421d 100644
--- a/vr-configurator/Assets/Scripts/Models/ModelManager.cs
+++ b/vr-configurator/Assets/Scripts/Models/ModelManager.cs
@@ -1,5 +1,6 @@
using UnityEngine;
using System.Collections.Generic;
+using System.IO;
using UnityEngine.Serialization;
public class ModelManager : MonoBehaviour
@@ -134,5 +135,23 @@ public class ModelManager : MonoBehaviour
baseModelGO.SetActive(false);
baseModelSelector.Activate();
}
+
+ ///
+ /// The Export function that should be called by the Button. Will get changed later to export to a REST/MQTT Service
+ ///
+ public void Export()
+ {
+ string path = Path.GetDirectoryName(Application.dataPath) + "/export.json";
+ Debug.Log($"Exporting current model to {path}...");
+ if (File.Exists(path))
+ {
+ //this doesn't matter since later the export will get sent to an server anyways
+ Debug.LogWarning($"File {path} already exists. Overwriting...");
+ }
+ var fs = File.Create(path);
+ TextWriter tw = new StreamWriter(fs);
+ tw.Write(BaseModelBehaviour.ExportJson());
+ tw.Close();
+ }
}