Add JSON Export (TODO: merge buttons in Scene @Max)

This commit is contained in:
Tim
2025-05-20 15:54:29 +02:00
parent 4da0d1102a
commit 6fdfc6af30
4 changed files with 537 additions and 0 deletions

91
docs/exampleExport.json Normal file
View File

@@ -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"
}
]
}

View File

@@ -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}

View File

@@ -126,4 +126,53 @@ public class ModelBehaviour : MonoBehaviour
}
}
/// <summary>
/// -> see docs/exampleExport.json
/// this doesn't include leading+trailing { } or commas, just the content
/// this is recursive
/// </summary>
/// <param name="chooseableOnly">Whether all Ports or just the Chooseable ones should be exported</param>
/// <returns>an unfinished Json of this Model and all its children</returns>
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<ChildModelBehaviour>().ExportJsonBase() + "}";
if(i != Model.Ports.Count-1) //if not the last
{
export += ",";
}
}
export += "]";
return export;
}
/// <summary>
/// Exports the current Model as a correct JSON
/// -> see docs/exampleExport.json
/// </summary>
/// <returns>An 'unformatted' JSON</returns>
public string ExportJson()
{
return "{" + ExportJsonBase() + "}";
}
}

View File

@@ -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();
}
/// <summary>
/// The Export function that should be called by the Button. Will get changed later to export to a REST/MQTT Service
/// </summary>
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();
}
}