From cdd474e1ec405f5b99c644771aebce612504711e Mon Sep 17 00:00:00 2001 From: "NGnius (Graham)" Date: Sat, 6 Jun 2020 11:15:30 -0400 Subject: [PATCH] Add blueprint RC cube functionality (rods-only atm) --- Pixi/Common/BlockJsonInfo.cs | 16 ++ Pixi/Common/ColorSpaceUtility.cs | 219 ++++++++++++++++++++++ Pixi/Common/VoxelObjectNotationUtility.cs | 75 ++++++++ Pixi/Images/ImageCommands.cs | 14 +- Pixi/Images/PixelUtility.cs | 116 +----------- Pixi/Pixi.csproj | 7 +- Pixi/PixiPlugin.cs | 4 + Pixi/Robots/CubeInfo.cs | 4 +- Pixi/Robots/CubeUtility.cs | 70 ++++++- Pixi/Robots/RobotCommands.cs | 72 +++++-- Pixi/blueprints.json | 26 +++ 11 files changed, 492 insertions(+), 131 deletions(-) create mode 100644 Pixi/Common/BlockJsonInfo.cs create mode 100644 Pixi/Common/ColorSpaceUtility.cs create mode 100644 Pixi/Common/VoxelObjectNotationUtility.cs create mode 100644 Pixi/blueprints.json diff --git a/Pixi/Common/BlockJsonInfo.cs b/Pixi/Common/BlockJsonInfo.cs new file mode 100644 index 0000000..38e3fb5 --- /dev/null +++ b/Pixi/Common/BlockJsonInfo.cs @@ -0,0 +1,16 @@ +using System; +namespace Pixi.Common +{ + public struct BlockJsonInfo + { + public string name; + + public float[] position; + + public float[] rotation; + + public float[] color; + + public float[] scale; + } +} diff --git a/Pixi/Common/ColorSpaceUtility.cs b/Pixi/Common/ColorSpaceUtility.cs new file mode 100644 index 0000000..7a2ca5c --- /dev/null +++ b/Pixi/Common/ColorSpaceUtility.cs @@ -0,0 +1,219 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +using UnityEngine; + +using GamecraftModdingAPI.Blocks; +using GamecraftModdingAPI.Utility; + +namespace Pixi.Common +{ + public static class ColorSpaceUtility + { + private const float optimal_delta = 0.2f; + + private static Dictionary colorMap = null; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static BlockColor QuantizeToBlockColor(Color pixel) + { + if (colorMap == null) BuildColorMap(); + float[] closest = new float[3] { 1, 1, 1 }; + BlockColor c = new BlockColor + { + Color = BlockColors.Default, + Darkness = 0, + }; + BlockColor[] keys = colorMap.Keys.ToArray(); + for (int k = 0; k < keys.Length; k++) + { + float[] color = colorMap[keys[k]]; + float[] distance = new float[3] { Math.Abs(pixel.r - color[0]), Math.Abs(pixel.g - color[1]), Math.Abs(pixel.b - color[2]) }; + if ((distance[0] + distance[1] + distance[2]) < (closest[0] + closest[1] + closest[2])) + { + c = keys[k]; + closest = distance; + if ((closest[0] + closest[1] + closest[2]) < optimal_delta) + { + return c; + } + } + } +#if DEBUG + Logging.MetaLog($"Final delta ({closest[0]},{closest[1]},{closest[2]}) t:{closest[0] + closest[1] + closest[2]}"); +#endif + return c; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static BlockColor QuantizeToBlockColor(float[] pixel) + { + return QuantizeToBlockColor(new Color(pixel[0], pixel[1], pixel[2])); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float[] UnquantizeToArray(BlockColor c) + { + if (colorMap == null) BuildColorMap(); + return colorMap[c]; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float[] UnquantizeToArray(BlockColors color, byte darkness = 0) + { + return UnquantizeToArray(new BlockColor + { + Color = color, + Darkness = darkness, + }); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Color UnquantizeToColor(BlockColor c) + { + float[] t = UnquantizeToArray(c); + return new Color(t[0], t[1], t[2]); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Color UnquantizeToColor(BlockColors color, byte darkness = 0) + { + return UnquantizeToColor(new BlockColor + { + Color = color, + Darkness = darkness, + }); + } + + private static void BuildColorMap() + { + colorMap = new Dictionary(); + // TODO create actual color map + foreach (BlockColors c in Enum.GetValues(typeof(BlockColors))) + { + for (byte d = 0; d < 10; d++) + { + BlockColor colorStruct = new BlockColor + { + Color = c, + Darkness = d, + }; + colorMap[colorStruct] = new float[3] { 1f, 0f, 1f }; + } + } + // this was done manually -- never again + // White + colorMap[new BlockColor { Color = BlockColors.White, Darkness = 0 }] = new float[3] { 1f, 1f, 1f}; + colorMap[new BlockColor { Color = BlockColors.White, Darkness = 1 }] = new float[3] { 0.88f, 0.98f, 0.99f }; + colorMap[new BlockColor { Color = BlockColors.White, Darkness = 2 }] = new float[3] { 0.80f, 0.89f, 0.99f }; + colorMap[new BlockColor { Color = BlockColors.White, Darkness = 3 }] = new float[3] { 0.746f, 0.827f, 0.946f }; + colorMap[new BlockColor { Color = BlockColors.White, Darkness = 4 }] = new float[3] { 0.71f, 0.789f, 0.888f }; + colorMap[new BlockColor { Color = BlockColors.White, Darkness = 5 }] = new float[3] { 0.597f, 0.664f, 0.742f }; + colorMap[new BlockColor { Color = BlockColors.White, Darkness = 6 }] = new float[3] { 0.484f, 0.535f, 0.61f }; + colorMap[new BlockColor { Color = BlockColors.White, Darkness = 7 }] = new float[3] { 0.355f, 0.39f, 0.449f }; + colorMap[new BlockColor { Color = BlockColors.White, Darkness = 8 }] = new float[3] { 0f, 0f, 0f }; + colorMap[new BlockColor { Color = BlockColors.White, Darkness = 9 }] = new float[3] { 0.581f, 0.643f, 0.745f }; + // Pink + colorMap[new BlockColor { Color = BlockColors.Pink, Darkness = 0 }] = new float[3] { 1f, 0.657f, 1f }; + colorMap[new BlockColor { Color = BlockColors.Pink, Darkness = 1 }] = new float[3] { 0.912f, 0.98f, 0.993f }; + colorMap[new BlockColor { Color = BlockColors.Pink, Darkness = 2 }] = new float[3] { 0.897f, 0.905f, 0.991f }; + colorMap[new BlockColor { Color = BlockColors.Pink, Darkness = 3 }] = new float[3] { 0.892f, 0.776f, 0.988f }; + colorMap[new BlockColor { Color = BlockColors.Pink, Darkness = 4 }] = new float[3] { 0.898f, 0.698f, 0.992f }; + colorMap[new BlockColor { Color = BlockColors.Pink, Darkness = 5 }] = new float[3] { 0.875f, 0.267f, 0.882f }; + colorMap[new BlockColor { Color = BlockColors.Pink, Darkness = 6 }] = new float[3] { 0.768f, 0.199f, 0.767f }; + colorMap[new BlockColor { Color = BlockColors.Pink, Darkness = 7 }] = new float[3] { 0.628f, 0.15f, 0.637f }; + colorMap[new BlockColor { Color = BlockColors.Pink, Darkness = 8 }] = new float[3] { 0.435f, 0.133f, 0.439f }; + colorMap[new BlockColor { Color = BlockColors.Pink, Darkness = 9 }] = new float[3] { 0.726f, 0.659f, 0.871f }; + // Purple + colorMap[new BlockColor { Color = BlockColors.Purple, Darkness = 0 }] = new float[3] { 0.764f, 0.587f, 1f }; + colorMap[new BlockColor { Color = BlockColors.Purple, Darkness = 1 }] = new float[3] { 0.893f, 0.966f, 0.992f }; + colorMap[new BlockColor { Color = BlockColors.Purple, Darkness = 2 }] = new float[3] { 0.842f, 0.877f, 0.991f }; + colorMap[new BlockColor { Color = BlockColors.Purple, Darkness = 3 }] = new float[3] { 0.794f, 0.747f, 0.99f }; + colorMap[new BlockColor { Color = BlockColors.Purple, Darkness = 4 }] = new float[3] { 0.783f, 0.669f, 0.992f }; + colorMap[new BlockColor { Color = BlockColors.Purple, Darkness = 5 }] = new float[3] { 0.636f, 0.249f, 0.991f }; + colorMap[new BlockColor { Color = BlockColors.Purple, Darkness = 6 }] = new float[3] { 0.548f, 0.18f, 0.896f }; + colorMap[new BlockColor { Color = BlockColors.Purple, Darkness = 7 }] = new float[3] { 0.441f, 0.152f, 0.726f }; + colorMap[new BlockColor { Color = BlockColors.Purple, Darkness = 8 }] = new float[3] { 0.308f, 0.135f, 0.498f }; + colorMap[new BlockColor { Color = BlockColors.Purple, Darkness = 9 }] = new float[3] { 0.659f, 0.646f, 0.909f }; + // Blue + colorMap[new BlockColor { Color = BlockColors.Blue, Darkness = 0 }] = new float[3] { 0.449f, 0.762f, 1f }; + colorMap[new BlockColor { Color = BlockColors.Blue, Darkness = 1 }] = new float[3] { 0.856f, 0.971f, 0.992f }; + colorMap[new BlockColor { Color = BlockColors.Blue, Darkness = 2 }] = new float[3] { 0.767f, 0.907f, 0.989f }; + colorMap[new BlockColor { Color = BlockColors.Blue, Darkness = 3 }] = new float[3] { 0.642f, 0.836f, 0.992f }; + colorMap[new BlockColor { Color = BlockColors.Blue, Darkness = 4 }] = new float[3] { 0.564f, 0.812f, 0.989f }; + colorMap[new BlockColor { Color = BlockColors.Blue, Darkness = 5 }] = new float[3] { 0.211f, 0.621f, 0.989f }; + colorMap[new BlockColor { Color = BlockColors.Blue, Darkness = 6 }] = new float[3] { 0.143f, 0.525f, 0.882f }; + colorMap[new BlockColor { Color = BlockColors.Blue, Darkness = 7 }] = new float[3] { 0.114f, 0.410f, 0.705f }; + colorMap[new BlockColor { Color = BlockColors.Blue, Darkness = 8 }] = new float[3] { 0.116f, 0.289f, 0.481f }; + colorMap[new BlockColor { Color = BlockColors.Blue, Darkness = 9 }] = new float[3] { 0.571f, 0.701f, 0.901f }; + // Aqua + colorMap[new BlockColor { Color = BlockColors.Aqua, Darkness = 0 }] = new float[3] { 0.408f, 0.963f, 1f }; + colorMap[new BlockColor { Color = BlockColors.Aqua, Darkness = 1 }] = new float[3] { 0.838f, 0.976f, 0.990f }; + colorMap[new BlockColor { Color = BlockColors.Aqua, Darkness = 2 }] = new float[3] { 0.747f, 0.961f, 0.994f }; + colorMap[new BlockColor { Color = BlockColors.Aqua, Darkness = 3 }] = new float[3] { 0.605f, 0.948f, 0.990f }; + colorMap[new BlockColor { Color = BlockColors.Aqua, Darkness = 4 }] = new float[3] { 0.534f, 0.954f, 0.993f }; + colorMap[new BlockColor { Color = BlockColors.Aqua, Darkness = 5 }] = new float[3] { 0.179f, 0.841f, 0.991f }; + colorMap[new BlockColor { Color = BlockColors.Aqua, Darkness = 6 }] = new float[3] { 0.121f, 0.719f, 0.868f }; + colorMap[new BlockColor { Color = BlockColors.Aqua, Darkness = 7 }] = new float[3] { 0.117f, 0.574f, 0.687f }; + colorMap[new BlockColor { Color = BlockColors.Aqua, Darkness = 8 }] = new float[3] { 0.116f, 0.399f, 0.478f }; + colorMap[new BlockColor { Color = BlockColors.Aqua, Darkness = 9 }] = new float[3] { 0.556f, 0.768f, 0.901f }; + // Green + colorMap[new BlockColor { Color = BlockColors.Green, Darkness = 0 }] = new float[3] { 0.344f, 1f, 0.579f }; + colorMap[new BlockColor { Color = BlockColors.Green, Darkness = 1 }] = new float[3] { 0.823f, 0.977f, 0.994f }; + colorMap[new BlockColor { Color = BlockColors.Green, Darkness = 2 }] = new float[3] { 0.731f, 0.966f, 0.958f }; + colorMap[new BlockColor { Color = BlockColors.Green, Darkness = 3 }] = new float[3] { 0.643f, 0.964f, 0.873f }; + colorMap[new BlockColor { Color = BlockColors.Green, Darkness = 4 }] = new float[3] { 0.498f, 0.961f, 0.721f }; + colorMap[new BlockColor { Color = BlockColors.Green, Darkness = 5 }] = new float[3] { 0.176f, 0.853f, 0.415f }; + colorMap[new BlockColor { Color = BlockColors.Green, Darkness = 6 }] = new float[3] { 0.120f, 0.728f, 0.350f }; + colorMap[new BlockColor { Color = BlockColors.Green, Darkness = 7 }] = new float[3] { 0.105f, 0.560f, 0.264f }; + colorMap[new BlockColor { Color = BlockColors.Green, Darkness = 8 }] = new float[3] { 0.122f, 0.392f, 0.221f }; + colorMap[new BlockColor { Color = BlockColors.Green, Darkness = 9 }] = new float[3] { 0.542f, 0.771f, 0.717f }; + // Lime + colorMap[new BlockColor { Color = BlockColors.Lime, Darkness = 0 }] = new float[3] { 0.705f, 1f, 0.443f }; + colorMap[new BlockColor { Color = BlockColors.Lime, Darkness = 1 }] = new float[3] { 0.869f, 0.978f, 0.991f }; + colorMap[new BlockColor { Color = BlockColors.Lime, Darkness = 2 }] = new float[3] { 0.815f, 0.967f, 0.932f }; + colorMap[new BlockColor { Color = BlockColors.Lime, Darkness = 3 }] = new float[3] { 0.778f, 0.962f, 0.821f }; + colorMap[new BlockColor { Color = BlockColors.Lime, Darkness = 4 }] = new float[3] { 0.753f, 0.964f, 0.631f }; + colorMap[new BlockColor { Color = BlockColors.Lime, Darkness = 5 }] = new float[3] { 0.599f, 0.855f, 0.268f }; + colorMap[new BlockColor { Color = BlockColors.Lime, Darkness = 6 }] = new float[3] { 0.505f, 0.712f, 0.201f }; + colorMap[new BlockColor { Color = BlockColors.Lime, Darkness = 7 }] = new float[3] { 0.376f, 0.545f, 0.185f }; + colorMap[new BlockColor { Color = BlockColors.Lime, Darkness = 8 }] = new float[3] { 0.268f, 0.379f, 0.172f }; + colorMap[new BlockColor { Color = BlockColors.Lime, Darkness = 9 }] = new float[3] { 0.631f, 0.768f, 0.690f }; + // Yellow + colorMap[new BlockColor { Color = BlockColors.Yellow, Darkness = 0 }] = new float[3] { 0.893f, 1f, 0.457f }; + colorMap[new BlockColor { Color = BlockColors.Yellow, Darkness = 1 }] = new float[3] { 0.887f, 0.981f, 0.995f }; + colorMap[new BlockColor { Color = BlockColors.Yellow, Darkness = 2 }] = new float[3] { 0.878f, 0.971f, 0.920f }; + colorMap[new BlockColor { Color = BlockColors.Yellow, Darkness = 3 }] = new float[3] { 0.874f, 0.964f, 0.802f }; + colorMap[new BlockColor { Color = BlockColors.Yellow, Darkness = 4 }] = new float[3] { 0.875f, 0.964f, 0.619f }; + colorMap[new BlockColor { Color = BlockColors.Yellow, Darkness = 5 }] = new float[3] { 0.771f, 0.846f, 0.246f }; + colorMap[new BlockColor { Color = BlockColors.Yellow, Darkness = 6 }] = new float[3] { 0.638f, 0.703f, 0.192f }; + colorMap[new BlockColor { Color = BlockColors.Yellow, Darkness = 7 }] = new float[3] { 0.477f, 0.522f, 0.142f }; + colorMap[new BlockColor { Color = BlockColors.Yellow, Darkness = 8 }] = new float[3] { 0.330f, 0.363f, 0.151f }; + colorMap[new BlockColor { Color = BlockColors.Yellow, Darkness = 9 }] = new float[3] { 0.693f, 0.763f, 0.678f }; + // Orange + colorMap[new BlockColor { Color = BlockColors.Orange, Darkness = 0 }] = new float[3] { 0.891f, 0.750f, 0.423f }; + colorMap[new BlockColor { Color = BlockColors.Orange, Darkness = 1 }] = new float[3] { 0.883f, 0.948f, 0.992f }; + colorMap[new BlockColor { Color = BlockColors.Orange, Darkness = 2 }] = new float[3] { 0.877f, 0.873f, 0.894f }; + colorMap[new BlockColor { Color = BlockColors.Orange, Darkness = 3 }] = new float[3] { 0.878f, 0.831f, 0.771f }; + colorMap[new BlockColor { Color = BlockColors.Orange, Darkness = 4 }] = new float[3] { 0.886f, 0.801f, 0.595f }; + colorMap[new BlockColor { Color = BlockColors.Orange, Darkness = 5 }] = new float[3] { 0.777f, 0.621f, 0.241f }; + colorMap[new BlockColor { Color = BlockColors.Orange, Darkness = 6 }] = new float[3] { 0.637f, 0.507f, 0.168f }; + colorMap[new BlockColor { Color = BlockColors.Orange, Darkness = 7 }] = new float[3] { 0.466f, 0.364f, 0.123f }; + colorMap[new BlockColor { Color = BlockColors.Orange, Darkness = 8 }] = new float[3] { 0.323f, 0.266f, 0.138f }; + colorMap[new BlockColor { Color = BlockColors.Orange, Darkness = 9 }] = new float[3] { 0.689f, 0.672f, 0.667f }; + // Red + colorMap[new BlockColor { Color = BlockColors.Red, Darkness = 0 }] = new float[3] { 0.890f, 0.323f, 0.359f }; + colorMap[new BlockColor { Color = BlockColors.Red, Darkness = 1 }] = new float[3] { 0.879f, 0.863f, 0.987f }; + colorMap[new BlockColor { Color = BlockColors.Red, Darkness = 2 }] = new float[3] { 0.872f, 0.758f, 0.868f }; + colorMap[new BlockColor { Color = BlockColors.Red, Darkness = 3 }] = new float[3] { 0.887f, 0.663f, 0.756f }; + colorMap[new BlockColor { Color = BlockColors.Red, Darkness = 4 }] = new float[3] { 0.903f, 0.546f, 0.608f }; + colorMap[new BlockColor { Color = BlockColors.Red, Darkness = 5 }] = new float[3] { 0.785f, 0.222f, 0.222f }; + colorMap[new BlockColor { Color = BlockColors.Red, Darkness = 6 }] = new float[3] { 0.641f, 0.155f, 0.152f }; + colorMap[new BlockColor { Color = BlockColors.Red, Darkness = 7 }] = new float[3] { 0.455f, 0.105f, 0.108f }; + colorMap[new BlockColor { Color = BlockColors.Red, Darkness = 8 }] = new float[3] { 0.320f, 0.121f, 0.133f }; + colorMap[new BlockColor { Color = BlockColors.Red, Darkness = 9 }] = new float[3] { 0.687f, 0.571f, 0.661f }; + } + } +} diff --git a/Pixi/Common/VoxelObjectNotationUtility.cs b/Pixi/Common/VoxelObjectNotationUtility.cs new file mode 100644 index 0000000..00b4f0c --- /dev/null +++ b/Pixi/Common/VoxelObjectNotationUtility.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Newtonsoft.Json; + +using GamecraftModdingAPI; +using GamecraftModdingAPI.Blocks; + +namespace Pixi.Common +{ + public static class VoxelObjectNotationUtility + { + private static readonly float[] origin_base = new float[3] { 0, 0, 0 }; + + private static Dictionary enumMap = null; + + public static string SerializeBlocks(Block[] blocks, float[] origin = null) + { + BlockJsonInfo[] blockJsons = new BlockJsonInfo[blocks.Length]; + for (int i = 0; i < blocks.Length; i++) + { + blockJsons[i] = JsonObject(blocks[i], origin); + } + return JsonConvert.SerializeObject(blockJsons); + } + + public static byte[] SerializeBlocksToBytes(Block[] blocks) + { + return Encoding.UTF8.GetBytes(SerializeBlocks(blocks)); + } + + public static BlockJsonInfo[] DeserializeBlocks(byte[] data) + { + return DeserializeBlocks(Encoding.UTF8.GetString(data)); + } + + public static BlockJsonInfo[] DeserializeBlocks(string data) + { + return JsonConvert.DeserializeObject(data); + } + + public static BlockJsonInfo JsonObject(Block block, float[] origin = null) + { + if (origin == null) origin = origin_base; + return new BlockJsonInfo + { + name = block.Type.ToString(), + position = new float[3] { block.Position.x - origin[0], block.Position.y - origin[1], block.Position.z - origin[2]}, + rotation = new float[3] { block.Rotation.x, block.Rotation.y, block.Rotation.z }, + color = ColorSpaceUtility.UnquantizeToArray(block.Color), + scale = new float[3] {block.Scale.x, block.Scale.y, block.Scale.z}, + }; + } + + public static BlockIDs NameToEnum(BlockJsonInfo block) + { + return NameToEnum(block.name); + } + + public static BlockIDs NameToEnum(string name) + { + if (enumMap == null) GenerateEnumMap(); + return enumMap[name]; + } + + private static void GenerateEnumMap() + { + enumMap = new Dictionary(); + foreach(BlockIDs e in Enum.GetValues(typeof(BlockIDs))) + { + enumMap[e.ToString()] = e; + } + } + } +} diff --git a/Pixi/Images/ImageCommands.cs b/Pixi/Images/ImageCommands.cs index 348d29f..1c5d4a2 100644 --- a/Pixi/Images/ImageCommands.cs +++ b/Pixi/Images/ImageCommands.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.IO; using System.Text; using System.Security.Cryptography; @@ -92,6 +93,7 @@ namespace Pixi.Images position.x += 1f; position.y += (float)blockSize; float zero_y = position.y; + Stopwatch timer = Stopwatch.StartNew(); // convert the image to blocks // this groups same-colored pixels in the same column into a single block to reduce the block count // any further pixel-grouping optimisations (eg 2D grouping) risk increasing conversion time higher than O(x*y) @@ -142,8 +144,9 @@ namespace Pixi.Images } //position.y = zero_y; } - Logging.CommandLog($"Placed {img.width}x{img.height} image beside you ({blockCount} blocks total)"); - Logging.MetaLog($"Saved {(img.width * img.height) - blockCount} blocks ({blockCount / (img.width * img.height)}%) while placing {filepath}"); + timer.Stop(); + Logging.CommandLog($"Placed {img.width}x{img.height} image beside you ({blockCount} blocks total, {blockCount * 100 / (img.width * img.height)}%)"); + Logging.MetaLog($"Placed {blockCount} in {timer.ElapsedMilliseconds}ms (saved {(img.width * img.height) - blockCount} blocks -- {blockCount * 100 / (img.width * img.height)}% original size) for {filepath}"); } public static void Pixelate2DFileToTextBlock(string filepath) @@ -166,6 +169,7 @@ namespace Pixi.Images float3 position = new Player(PlayerType.Local).Position; position.x += 1f; position.y += (float)blockSize; + Stopwatch timer = Stopwatch.StartNew(); string text = PixelUtility.TextureToString(img); TextBlock textBlock = TextBlock.PlaceNew(position, scale: new float3(Mathf.Ceil(img.width / 16), 1, Mathf.Ceil(img.height / 16))); textBlock.Text = text; @@ -179,6 +183,9 @@ namespace Pixi.Images textId += textHash[i].ToString("X2"); } textBlock.TextBlockId = textId; + timer.Stop(); + Logging.CommandLog($"Placed {img.width}x{img.height} image in text block named {textId} beside you ({text.Length} characters)"); + Logging.MetaLog($"Completed image text block {textId} synthesis in {timer.ElapsedMilliseconds}ms containing {text.Length} characters for {img.width*img.height} pixels"); } public static void Pixelate2DFileToCommand(string filepath, string textBlockId) @@ -201,6 +208,7 @@ namespace Pixi.Images float3 position = new Player(PlayerType.Local).Position; position.x += 1f; position.y += (float)blockSize; + Stopwatch timer = Stopwatch.StartNew(); float zero_y = position.y; string text = PixelUtility.TextureToString(img); // conversion ConsoleBlock console = ConsoleBlock.PlaceNew(position); @@ -209,6 +217,8 @@ namespace Pixi.Images console.Arg1 = "\"" + textBlockId + "\""; console.Arg2 = "\"" + text + "\""; console.Arg3 = ""; + Logging.CommandLog($"Placed {img.width}x{img.height} image in console block beside you ({text.Length} characters)"); + Logging.MetaLog($"Completed image console block {textBlockId} synthesis in {timer.ElapsedMilliseconds}ms containing {text.Length} characters for {img.width * img.height} pixels"); } } } diff --git a/Pixi/Images/PixelUtility.cs b/Pixi/Images/PixelUtility.cs index d0afdd3..40298ed 100644 --- a/Pixi/Images/PixelUtility.cs +++ b/Pixi/Images/PixelUtility.cs @@ -16,128 +16,20 @@ namespace Pixi.Images [MethodImpl(MethodImplOptions.AggressiveInlining)] public static BlockInfo QuantizePixel(Color pixel) { - BlockColors color = BlockColors.Default; - int darkness = 0; - bool force = false; #if DEBUG Logging.MetaLog($"Color (r:{pixel.r}, g:{pixel.g}, b:{pixel.b})"); #endif - if (Mathf.Abs(pixel.r - pixel.g) <= pixel.r * 0.1f && Mathf.Abs(pixel.r - pixel.b) <= pixel.r * 0.1f) - { - color = BlockColors.White; - darkness = (int)(10 - ((pixel.r + pixel.g + pixel.b) * 3.5)); - //Logging.MetaDebugLog($"Color (r:{pixel.r}, g:{pixel.g}, b:{pixel.b})"); - } - else if (pixel.r >= pixel.g && pixel.r >= pixel.b) - { - // Red is highest - if ((pixel.r - pixel.g) > pixel.r * 0.65 && (pixel.r - pixel.b) > pixel.r * 0.55) - { - // Red is much higher than other pixels - darkness = (int)(9 - (pixel.r * 8.01)); - color = BlockColors.Red; - } - else if ((pixel.g - pixel.b) > pixel.g * 0.25) - { - // Green is much higher than blue - if ((pixel.r - pixel.g) < pixel.r * 0.8) - { - darkness = (int)(10 - ((pixel.r * 2.1 + pixel.g) * 2.1)); - color = BlockColors.Orange; - } - else - { - darkness = (int)(10 - ((pixel.r * 2.1 + pixel.g) * 2.2)); - color = BlockColors.Yellow; - } - - } - else if ((pixel.b - pixel.g) > pixel.b * 0.3) - { - // Blue is much higher than green - darkness = (int)(10 - ((pixel.r + pixel.b) * 5.0)); - color = BlockColors.Purple; - } - else - { - // Green is close strength to blue - darkness = (int)(10 - ((pixel.r * 2.1 + pixel.g + pixel.b) * 2.5)); - color = darkness < 6 ? BlockColors.Pink : BlockColors.Orange; - force = true; - } - } - else if (pixel.g >= pixel.r && pixel.g >= pixel.b) - { - // Green is highest - if ((pixel.g - pixel.r) > pixel.g * 0.6 && (pixel.g - pixel.b) > pixel.g * 0.48) - { - // Green is much higher than other pixels - darkness = (int)(10 - (pixel.g * 10.1)); - color = BlockColors.Green; - } - else if ((pixel.r - pixel.b) > pixel.r * 0.3) - { - // Red is much higher than blue - darkness = (int)(10 - ((pixel.r + pixel.g) * 5.1)); - color = BlockColors.Yellow; - } - else if ((pixel.b - pixel.r) > pixel.b * 0.2) - { - // Blue is much higher than red - darkness = (int)(9 - ((pixel.g + pixel.b) * 5.1)); - color = BlockColors.Aqua; - } - else - { - // Red is close strength to blue - darkness = (int)(10 - ((pixel.r + pixel.g * 2.2 + pixel.b) * 2.9)); - color = BlockColors.Lime; - } - } - else if (pixel.b >= pixel.g && pixel.b >= pixel.r) - { - // Blue is highest - if ((pixel.b - pixel.g) > pixel.b * 0.6 && (pixel.b - pixel.r) > pixel.b * 0.6) - { - // Blue is much higher than other pixels - darkness = (int)(10 - (pixel.b * 10.1)); - color = BlockColors.Blue; - } - else if ((pixel.g - pixel.r) > pixel.g * 0.3) - { - // Green is much higher than red - darkness = (int)(10 - ((pixel.g + pixel.b) * 5.1)); - if (darkness == 4 || darkness == 5) darkness = 0; - else if (darkness < 3) darkness = 4; - color = BlockColors.Aqua; - } - else if ((pixel.r - pixel.g) > pixel.r * 0.3) - { - // Red is much higher than green - darkness = (int)(10 - ((pixel.r + pixel.b) * 5.0)); - color = BlockColors.Purple; - } - else - { - // Green is close strength to red - darkness = (int)(10 - ((pixel.r + pixel.g + pixel.b * 2.2) * 3.0)); - color = BlockColors.Aqua; - } - } - // level 9 is not darker than lvl 8 - if (darkness > 8 && !force) darkness = 8; - // darkness 0 is the most saturated (it's not just the lightest) - if (darkness < 0) darkness = 0; + BlockColor c = ColorSpaceUtility.QuantizeToBlockColor(pixel); BlockInfo result = new BlockInfo { block = pixel.a > 0.75 ? BlockIDs.AluminiumCube : BlockIDs.GlassCube, - color = color, - darkness = (byte)darkness, + color = c.Color, + darkness = c.Darkness, visible = pixel.a > 0.5f, }; #if DEBUG - Logging.MetaLog($"Quantized {color} (b:{result.block} d:{result.darkness} v:{result.visible})"); + Logging.MetaLog($"Quantized {result.color} (b:{result.block} d:{result.darkness} v:{result.visible})"); #endif return result; } diff --git a/Pixi/Pixi.csproj b/Pixi/Pixi.csproj index 733188e..d0b1207 100644 --- a/Pixi/Pixi.csproj +++ b/Pixi/Pixi.csproj @@ -3,7 +3,7 @@ net472 true - 0.3.0 + 0.4.0 NGnius MIT https://git.exmods.org/NGnius/Pixi @@ -807,12 +807,17 @@ ..\..\ref\Plugins\GamecraftModdingAPI.dll + + ..\..\ref\Plugins\GamecraftModdingAPI.dll + + + diff --git a/Pixi/PixiPlugin.cs b/Pixi/PixiPlugin.cs index baa3446..d80a0af 100644 --- a/Pixi/PixiPlugin.cs +++ b/Pixi/PixiPlugin.cs @@ -48,6 +48,10 @@ namespace Pixi // Robot functionality RobotCommands.CreateRobotCRFCommand(); RobotCommands.CreateRobotFileCommand(); +#if DEBUG + // Development functionality + RobotCommands.CreatePartDumpCommand(); +#endif Logging.LogDebug($"{Name} has started up"); } diff --git a/Pixi/Robots/CubeInfo.cs b/Pixi/Robots/CubeInfo.cs index e7a9242..328b3dc 100644 --- a/Pixi/Robots/CubeInfo.cs +++ b/Pixi/Robots/CubeInfo.cs @@ -6,7 +6,7 @@ namespace Pixi.Robots { public struct CubeInfo { - // so you can't inherit from structs in C#... + // you can't inherit from structs in C#... // this is an extension of BlockInfo public BlockIDs block; @@ -24,5 +24,7 @@ namespace Pixi.Robots public float3 scale; public string name; + + public uint cubeId; } } diff --git a/Pixi/Robots/CubeUtility.cs b/Pixi/Robots/CubeUtility.cs index be52614..add4247 100644 --- a/Pixi/Robots/CubeUtility.cs +++ b/Pixi/Robots/CubeUtility.cs @@ -7,9 +7,13 @@ using System.Runtime.CompilerServices; using RobocraftX.Common; using Newtonsoft.Json; using Unity.Mathematics; +using UnityEngine; using GamecraftModdingAPI.Blocks; using GamecraftModdingAPI.Utility; +using GamecraftModdingAPI; + +using Pixi.Common; namespace Pixi.Robots { @@ -17,6 +21,8 @@ namespace Pixi.Robots { private static Dictionary map = null; + private static Dictionary blueprintMap = null; + public static RobotStruct? ParseRobotInfo(string robotInfo) { try @@ -69,7 +75,7 @@ namespace Pixi.Robots public static CubeInfo TranslateSpacialEnumerations(uint cubeId, byte x, byte y, byte z, byte rotation, byte colour, byte colour_x, byte colour_y, byte colour_z) { if (x != colour_x || z != colour_z || y != colour_y) return default; - CubeInfo result = new CubeInfo { visible = true }; + CubeInfo result = new CubeInfo { visible = true, cubeId = cubeId }; TranslateBlockColour(colour, ref result); TranslateBlockPosition(x, y, z, ref result); TranslateBlockRotation(rotation, ref result); @@ -80,7 +86,7 @@ namespace Pixi.Robots return result; } - //[MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void TranslateBlockRotation(byte rotation, ref CubeInfo result) { // face refers to the face of the block connected to the bottom of the current one @@ -414,5 +420,65 @@ namespace Pixi.Robots result.name = cubeName; } } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Block[] BuildBlueprintOrTextBlock(CubeInfo cube, float3 actualPosition, int scale = 3) + { + // actualPosition is the middle of the cube + if (blueprintMap == null) LoadBlueprintMap(); + if (!blueprintMap.ContainsKey(cube.cubeId) || scale != 3) + { +#if DEBUG + Logging.LogWarning($"Missing blueprint for {cube.name} (id:{cube.cubeId}), substituting {cube.block}"); +#endif + return new Block[] { Block.PlaceNew(cube.block, actualPosition, cube.rotation, cube.color, cube.darkness, scale: cube.scale) }; + } +#if DEBUG + Logging.MetaLog($"Found blueprint for {cube.name} (id:{cube.cubeId})"); +#endif + Quaternion cubeQuaternion = Quaternion.Euler(cube.rotation); + BlockJsonInfo[] blueprint = blueprintMap[cube.cubeId]; + float3 correctionVec = new float3((float)(0), (float)(RobotCommands.blockSize), (float)(0)); + Block[] placedBlocks = new Block[blueprint.Length]; + for (int i = 0; i < blueprint.Length; i++) + { + BlockColor blueprintBlockColor = ColorSpaceUtility.QuantizeToBlockColor(blueprint[i].color); + BlockColors blockColor = blueprintBlockColor.Color == BlockColors.White && blueprintBlockColor.Darkness == 0 ? cube.color : blueprintBlockColor.Color; + byte blockDarkness = blueprintBlockColor.Color == BlockColors.White && blueprintBlockColor.Darkness == 0 ? cube.darkness : blueprintBlockColor.Darkness; + float3 bluePos = new float3(blueprint[i].position[0], blueprint[i].position[1], blueprint[i].position[2]); + float3 blueScale = new float3(blueprint[i].scale[0], blueprint[i].scale[1], blueprint[i].scale[2]); + float3 blueRot = new float3(blueprint[i].rotation[0], blueprint[i].rotation[1], blueprint[i].rotation[2]); + float3 physicalLocation = (float3)(cubeQuaternion * bluePos) + actualPosition;// + (blueprintSizeRotated / 2); + //physicalLocation.x += blueprintSize.x / 2; + physicalLocation -= (float3)(cubeQuaternion * correctionVec); + //physicalLocation.y -= (float)(RobotCommands.blockSize * scale / 2); + //float3 physicalScale = (float3)(cubeQuaternion * blueScale); // this actually over-rotates when combined with rotation + float3 physicalScale = blueScale; + float3 physicalRotation = (cubeQuaternion * Quaternion.Euler(blueRot)).eulerAngles; +#if DEBUG + Logging.MetaLog($"Placing blueprint block at {physicalLocation} rot{physicalRotation} scale{physicalScale}"); + Logging.MetaLog($"Location math check original:{bluePos} rotated: {(float3)(cubeQuaternion * bluePos)} actualPos: {actualPosition} result: {physicalLocation}"); + Logging.MetaLog($"Scale math check original:{blueScale} rotation: {(float3)cubeQuaternion.eulerAngles} result: {physicalScale}"); + Logging.MetaLog($"Rotation math check original:{blueRot} rotated: {(cubeQuaternion * Quaternion.Euler(blueRot))} result: {physicalRotation}"); +#endif + placedBlocks[i] = Block.PlaceNew(VoxelObjectNotationUtility.NameToEnum(blueprint[i].name), + physicalLocation, + physicalRotation, + blockColor, + blockDarkness, + scale: physicalScale); + } +#if DEBUG + Logging.MetaLog($"Placed {placedBlocks.Length} blocks for blueprint {cube.name} (id:{cube.cubeId})"); +#endif + return placedBlocks; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void LoadBlueprintMap() + { + StreamReader bluemap = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("Pixi.blueprints.json")); + blueprintMap = JsonConvert.DeserializeObject>(bluemap.ReadToEnd()); + } } } diff --git a/Pixi/Robots/RobotCommands.cs b/Pixi/Robots/RobotCommands.cs index 11ac3db..bfa9e06 100644 --- a/Pixi/Robots/RobotCommands.cs +++ b/Pixi/Robots/RobotCommands.cs @@ -12,11 +12,15 @@ using GamecraftModdingAPI.Commands; using GamecraftModdingAPI.Players; using GamecraftModdingAPI.Utility; +using Pixi.Common; + namespace Pixi.Robots { public static class RobotCommands { - private static double blockSize = 0.2; + internal const double blockSize = 0.2; + + public static int CubeSize = 3; public static void CreateRobotFileCommand() { @@ -36,6 +40,15 @@ namespace Pixi.Robots .Build(); } + public static void CreatePartDumpCommand() + { + CommandBuilder.Builder() + .Name("DumpVON") + .Description("Dump a block structure to a JSON file compatible with Pixi's internal VON format") + .Action(DumpBlockStructure) + .Build(); + } + private static void ImportRobotFile(string filepath) { string file; @@ -58,20 +71,33 @@ namespace Pixi.Robots float3 position = new Player(PlayerType.Local).Position; position.y += (float)blockSize; CubeInfo[] cubes = CubeUtility.ParseCubes(robot.Value); - Block[] blocks = new Block[cubes.Length]; + Block[][] blocks = new Block[cubes.Length][]; for (int c = 0; c < cubes.Length; c++) // sometimes I wish this were C++ { CubeInfo cube = cubes[c]; - float3 realPosition = (cube.position * (float)blockSize) + position; - blocks[c] = Block.PlaceNew(cube.block, realPosition, cube.rotation, cube.color, cube.darkness, scale: cube.scale); + float3 realPosition = (cube.position * (float)blockSize * CubeSize) + position; + if (cube.block == BlockIDs.TextBlock && !string.IsNullOrEmpty(cube.name)) + { + // TextBlock block ID means it's a placeholder + blocks[c] = CubeUtility.BuildBlueprintOrTextBlock(cube, realPosition, CubeSize); + } + else + { + blocks[c] = new Block[] { Block.PlaceNew(cube.block, realPosition, cube.rotation, cube.color, cube.darkness, CubeSize) }; + } } + // build placeholders + // Note: this is a separate loop because everytime a new block is placed, + // a slow Sync() call is required to access it's properties. + // This way, one Sync() call is needed, instead of O(cubes.Length) calls for (int c = 0; c < cubes.Length; c++) { CubeInfo cube = cubes[c]; // the goal is for this to never evaluate to true (ie all cubes are translated correctly) - if (!string.IsNullOrEmpty(cube.name) && cube.block == BlockIDs.TextBlock) + if (!string.IsNullOrEmpty(cube.name) && cube.block == BlockIDs.TextBlock && blocks[c].Length == 1) { - blocks[c].Specialise().Text = cube.name; + //Logging.MetaLog($"Block is {blocks[c][0].Type} and was placed as {cube.block}"); + blocks[c][0].Specialise().Text = cube.name; } } Logging.CommandLog($"Placed {robot.Value.name} by {robot.Value.addedByDisplayName} ({cubes.Length} cubes) beside you"); @@ -102,23 +128,43 @@ namespace Pixi.Robots float3 position = new Player(PlayerType.Local).Position; position.y += (float)blockSize; CubeInfo[] cubes = CubeUtility.ParseCubes(robot); - Block[] blocks = new Block[cubes.Length]; + Block[][] blocks = new Block[cubes.Length][]; for (int c = 0; c < cubes.Length; c++) // sometimes I wish this were C++ { - CubeInfo cube = cubes[c]; - float3 realPosition = (cube.position * (float)blockSize) + position; - blocks[c] = Block.PlaceNew(cube.block, realPosition, cube.rotation, cube.color, cube.darkness, scale: cube.scale); - } + CubeInfo cube = cubes[c]; + float3 realPosition = (cube.position * (float)blockSize * CubeSize) + position; + if (cube.block == BlockIDs.TextBlock && !string.IsNullOrEmpty(cube.name)) + { + // TextBlock block ID means it's a placeholder + blocks[c] = CubeUtility.BuildBlueprintOrTextBlock(cube, realPosition, CubeSize); + } + else + { + blocks[c] = new Block[] { Block.PlaceNew(cube.block, realPosition, cube.rotation, cube.color, cube.darkness, CubeSize) }; + } + } for (int c = 0; c < cubes.Length; c++) { CubeInfo cube = cubes[c]; // the goal is for this to never evaluate to true (ie all cubes are translated correctly) - if (!string.IsNullOrEmpty(cube.name) && cube.block == BlockIDs.TextBlock) + if (!string.IsNullOrEmpty(cube.name) && cube.block == BlockIDs.TextBlock && blocks[c].Length == 1) { - blocks[c].Specialise().Text = cube.name; + //Logging.MetaLog($"Block is {blocks[c][0].Type} and was placed as {cube.block}"); + blocks[c][0].Specialise().Text = cube.name; } } Logging.CommandLog($"Placed {robot.name} by {robot.addedByDisplayName} ({cubes.Length} cubes) beside you"); } + + private static void DumpBlockStructure(string filename) + { + Player local = new Player(PlayerType.Local); + Block baseBlock = local.GetBlockLookedAt(); + Block[] blocks = baseBlock.GetConnectedCubes(); + if (blocks.Length == 0) return; + float3 basePos = baseBlock.Position; + string von = VoxelObjectNotationUtility.SerializeBlocks(blocks, new float[] { basePos.x, basePos.y, basePos.z }); + File.WriteAllText(filename, von); + } } } diff --git a/Pixi/blueprints.json b/Pixi/blueprints.json new file mode 100644 index 0000000..e32ffd8 --- /dev/null +++ b/Pixi/blueprints.json @@ -0,0 +1,26 @@ +{ + "0":[{"name":"t2 rod short"}], + "1312806203":[{"name":"AluminiumCube","position":[0.0,0.0,0.0],"rotation":[-1.19528313E-05,90.00001,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.0,2.98023224E-08,0.200000763],"rotation":[1.36603849E-05,270.0,2.44266586E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199998856,5.96046448E-08,0.200000763],"rotation":[-7.600128E-13,1.00179113E-05,1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.199999809,5.96046448E-08,9.536743E-07],"rotation":[-7.600128E-13,1.00179113E-05,1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199998856,8.940697E-08,-0.199998856],"rotation":[-1.36603849E-05,90.0000153,-2.44266586E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-1.90734863E-06,2.98023224E-08,-0.199998856],"rotation":[-1.36603849E-05,90.0000153,-2.44266586E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.20000267,-2.98023224E-08,-0.1999979],"rotation":[7.600132E-13,180.0,-1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200001717,-2.98023224E-08,1.90734863E-06],"rotation":[7.600132E-13,180.0,-1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.20000267,-2.98023224E-08,0.200001717],"rotation":[1.36603849E-05,270.0,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.0,0.5000001,0.0],"rotation":[1.02452868E-05,1.00179159E-05,1.36603821E-05],"color":[0.0,0.0,0.0],"scale":[1.0,4.0,1.0]},{"name":"AluminiumCube","position":[-1.90734863E-06,1.00000012,1.90734863E-06],"rotation":[2.00051545E-06,1.00179122E-05,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-1.90734863E-06,1.00000024,0.200001717],"rotation":[1.19528313E-05,270.0,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199996948,1.00000012,0.200000763],"rotation":[-1.36603849E-05,90.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.199998856,1.00000012,1.90734863E-06],"rotation":[2.00051545E-06,1.00179122E-05,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199996948,1.00000012,-0.199998856],"rotation":[6.83019152E-06,180.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-1.90734863E-06,1.00000036,-0.199998856],"rotation":[-1.19528313E-05,90.00001,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.20000267,1.00000012,-0.199998856],"rotation":[1.36603849E-05,270.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.20000267,1.00000024,1.90734863E-06],"rotation":[-3.41509258E-06,180.0,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.20000267,1.00000012,0.200000763],"rotation":[-6.83019152E-06,1.00179122E-05,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]}], + "2":[{"name":"t2 rod"}], + "1818686721":[{"name":"AluminiumCube","position":[0.0,0.0,0.0],"rotation":[-4.14323381E-07,1.72624223E-05,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-9.536743E-07,2.98023224E-08,-0.200000763],"rotation":[-1.36603849E-05,90.0000153,-2.44266586E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,-2.98023224E-08,-0.199999809],"rotation":[7.600132E-13,180.0,-1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200000763,-5.96046448E-08,9.536743E-07],"rotation":[7.600132E-13,180.0,-1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,-2.98023224E-08,0.200000763],"rotation":[1.3660383E-05,270.0,2.44266586E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[9.536743E-07,0.0,0.199999809],"rotation":[1.3660383E-05,270.0,4.88533172E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199999809,5.96046448E-08,0.199999809],"rotation":[-7.600128E-13,1.00179113E-05,1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.200000763,5.96046448E-08,-9.536743E-07],"rotation":[-7.600128E-13,1.00179113E-05,1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199999809,5.96046448E-08,-0.200000763],"rotation":[-1.36603849E-05,90.0000153,-2.44266586E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.0,0.8,9.536743E-07],"rotation":[-6.83019152E-06,1.00179095E-05,1.36603821E-05],"color":[0.0,0.0,0.0],"scale":[1.0,7.0,1.0]},{"name":"AluminiumCube","position":[-9.536743E-07,1.6,9.536743E-07],"rotation":[-1.00736706E-05,2.20920938E-05,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-9.536743E-07,1.60000026,0.200000763],"rotation":[1.36603785E-05,270.0,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,1.60000026,0.199999809],"rotation":[-1.70754756E-05,1.00179095E-05,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200001717,1.6,9.536743E-07],"rotation":[6.24425456E-06,180.000015,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,1.6,-0.199999809],"rotation":[1.36603849E-05,270.0,180.000015],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-9.536743E-07,1.60000026,-0.199999809],"rotation":[-1.8783021E-05,90.00001,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.1999979,1.6,-0.199999809],"rotation":[1.70754756E-05,180.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.199999809,1.60000014,9.536743E-07],"rotation":[-1.73181779E-05,1.00179095E-05,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.1999979,1.60000026,0.199999809],"rotation":[-1.36603885E-05,90.0,179.999985],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]}], + "4":[{"name":"t2 rod long"}], + "3489647384":[{"name":"AluminiumCube","position":[0.0,0.0,0.0],"rotation":[-4.14323381E-07,1.72624223E-05,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200000763,-5.96046448E-08,0.0],"rotation":[7.600132E-13,180.0,-1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,-5.96046448E-08,0.199999809],"rotation":[1.3660383E-05,270.0,2.44266586E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[9.536743E-07,0.0,0.199998856],"rotation":[1.3660383E-05,270.0,4.47822075E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199999809,5.96046448E-08,0.199998856],"rotation":[-7.600128E-13,1.00179113E-05,1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.200000763,2.98023224E-08,-9.536743E-07],"rotation":[-7.600128E-13,1.00179113E-05,1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199999809,5.96046448E-08,-0.200000763],"rotation":[-1.36603849E-05,90.0000153,-2.44266586E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-9.536743E-07,0.0,-0.200000763],"rotation":[-1.36603849E-05,90.0000153,-2.44266586E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,-2.98023224E-08,-0.199999809],"rotation":[7.600132E-13,180.0,-1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.0,1.4,0.0],"rotation":[-6.83019152E-06,1.00179095E-05,1.36603821E-05],"color":[0.0,0.0,0.0],"scale":[1.0,13.0,1.0]},{"name":"AluminiumCube","position":[-2.861023E-06,2.80000019,-9.536743E-07],"rotation":[-1.00736706E-05,2.69217653E-05,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.1999979,2.80000019,-9.536743E-07],"rotation":[-2.69775264E-05,1.00179095E-05,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199996,2.8,0.1999979],"rotation":[-1.36603885E-05,90.0,179.999985],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-2.861023E-06,2.80000019,0.199999809],"rotation":[1.36603785E-05,270.0,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200003624,2.8,0.1999979],"rotation":[-1.70754756E-05,1.00179095E-05,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200003624,2.8,-9.536743E-07],"rotation":[6.24425638E-06,180.000015,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200003624,2.80000019,-0.20000124],"rotation":[1.36603849E-05,270.0,180.000015],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-2.861023E-06,2.80000043,-0.20000124],"rotation":[-2.04905682E-05,90.00001,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199996,2.80000019,-0.20000124],"rotation":[1.70754756E-05,180.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]}], + "6":[{"name":"t2 rod plus"}], + "1750720388":[{"name":"AluminiumCube","position":[0.0,0.0,0.0],"rotation":[-1.19528313E-05,90.0,89.99999],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[-9.536743E-07,0.799999952,-2.38418579E-07],"rotation":[1.65554788E-12,1.52542407E-05,4.07111064E-12],"color":[0.0,0.0,0.0],"scale":[1.0,7.0,1.0]},{"name":"AluminiumCube","position":[0.400000572,0.8000001,-4.76837158E-07],"rotation":[89.98022,90.0000153,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,3.0,1.0]},{"name":"AluminiumCube","position":[0.800001144,0.8000002,1.43051147E-06],"rotation":[90.0,2.06698587E-05,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.800001144,1.00000179,-4.76837158E-07],"rotation":[3.41509349E-06,1.12532061E-05,90.00001],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.800001144,1.00000262,-0.200000286],"rotation":[270.0,90.0,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.800001144,0.8000002,-0.199999332],"rotation":[270.0,90.0000153,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.800001144,0.600001335,-0.199999571],"rotation":[-4.415353E-06,180.0,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.8000021,0.6000004,4.76837158E-07],"rotation":[-4.415353E-06,180.0,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.8000002,0.6000013,0.200000286],"rotation":[90.0,270.0,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.800001144,0.800002038,0.200000286],"rotation":[90.0,270.0,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.800001144,1.00000274,0.199999332],"rotation":[3.41509349E-06,1.12532061E-05,90.00001],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[-0.400001526,0.8000001,-2.38418579E-07],"rotation":[90.0,270.0,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,3.0,1.0]},{"name":"AluminiumCube","position":[-0.8000021,0.799999952,-2.14576721E-06],"rotation":[90.0,180.0,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.8000021,0.600000143,-1.43051147E-06],"rotation":[-8.65909E-06,1.17953823E-06,270.000031],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.8000021,0.600001,0.199998617],"rotation":[-8.65909E-06,1.17953823E-06,270.000031],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.800001144,0.799999833,0.199998856],"rotation":[270.0,270.0,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.8000021,1.00000262,0.199999571],"rotation":[270.0,270.0,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.8000021,1.00000167,-2.38418579E-07],"rotation":[1.00736661E-05,180.0,89.99998],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.8000021,1.00000262,-0.200000048],"rotation":[1.00736661E-05,180.0,89.99998],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.8000021,0.80000186,-0.200001],"rotation":[89.98022,90.0000153,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.8000021,0.6000011,-0.20000124],"rotation":[89.98022,90.0000153,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[-2.861023E-06,1.6,-2.38418579E-07],"rotation":[1.00025932E-06,-5.65064875E-06,90.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-9.536743E-07,1.5999999,-0.2000022],"rotation":[2.90008187E-12,270.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200000763,1.59999979,-0.200003147],"rotation":[2.90008187E-12,270.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200001717,1.5999999,-2.38418579E-06],"rotation":[1.65554842E-12,5.008956E-06,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,1.5999999,0.199998856],"rotation":[1.65554842E-12,5.008956E-06,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-1.90734863E-06,1.5999999,0.199999571],"rotation":[-4.00882062E-12,90.00002,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.1999979,1.5999999,0.199998856],"rotation":[-4.00882062E-12,90.00002,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.1999979,1.5999999,-2.38418579E-07],"rotation":[-3.2839933E-12,180.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199998856,1.5999999,-0.200003386],"rotation":[-4.09821439E-12,180.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200000763,-2.98023224E-08,4.76837158E-07],"rotation":[2.8226733E-12,180.0,-1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200000763,-2.98023224E-08,0.200001478],"rotation":[1.366038E-05,270.0,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.0,0.0,0.200000286],"rotation":[1.366038E-05,270.0,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199998856,5.96046448E-08,0.200001478],"rotation":[-3.63689482E-12,1.52542389E-05,1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.1999979,5.96046448E-08,2.14576721E-06],"rotation":[-3.63689482E-12,1.52542389E-05,1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.1999979,8.940697E-08,-0.200000286],"rotation":[-1.366038E-05,90.00001,-1.628444E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-9.536743E-07,0.0,-0.200001],"rotation":[-1.366038E-05,90.00001,-1.628444E-12],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,-2.98023224E-08,-0.200000286],"rotation":[2.8226733E-12,180.0,-1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]}], + "8":[{"name":"t2 rod cross"}], + "4265819694":[{"name":"AluminiumCube","position":[0.0,0.0,0.0],"rotation":[2.7320757E-05,270.0,90.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.199998856,-1.1920929E-07,-2.74181366E-06],"rotation":[-3.415086E-06,180.000015,-1.87830228E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.1999979,-1.1920929E-07,0.199999809],"rotation":[1.87830283E-05,270.0,-3.41509258E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.0,-1.1920929E-07,0.200000763],"rotation":[1.87830283E-05,270.0,-3.41509258E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.200001717,0.0,0.199999809],"rotation":[3.4150853E-06,2.04905682E-05,1.87830246E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.200000763,0.0,-1.1920929E-06],"rotation":[3.4150853E-06,2.04905682E-05,1.87830246E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.200000763,0.0,-0.200001776],"rotation":[-1.87830265E-05,90.0,3.41509167E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-9.536743E-07,0.0,-0.200000942],"rotation":[-1.87830265E-05,90.0,3.41509167E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.199998856,-1.1920929E-07,-0.200001657],"rotation":[-3.415086E-06,180.000015,-1.87830228E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-4.76837158E-07,0.299999952,-2.38418579E-07],"rotation":[-3.41508371E-06,180.000015,-1.87830283E-05],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.300001144,0.300000072,-2.38418579E-07],"rotation":[9.245023E-06,1.586202E-06,270.0],"color":[0.0,0.0,0.0],"scale":[2.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.200000286,0.6,-1.1920929E-07],"rotation":[-3.41508417E-06,180.000015,-1.19528368E-05],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.6000018,0.8000001,-1.06096268E-05],"rotation":[8.244768E-06,2.06386752E-12,1.87830265E-05],"color":[0.0,0.0,0.0],"scale":[3.0,3.0,1.0]},{"name":"AluminiumSlope","position":[1.00000191,0.6,-1.06096268E-05],"rotation":[8.244768E-06,2.06386752E-12,1.87830265E-05],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.9000015,0.3000003,-1.06096268E-05],"rotation":[-5.415607E-06,180.0,269.999969],"color":[0.0,0.0,0.0],"scale":[2.0,2.0,1.0]},{"name":"AluminiumSlope","position":[1.20000219,0.3000003,-1.07288361E-05],"rotation":[-1.02452886E-05,-5.038E-12,1.87830246E-05],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumCube","position":[1.20000315,2.38418579E-07,-1.07288361E-05],"rotation":[6.658575E-06,180.0,89.9999542],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.00000191,2.38418579E-07,-1.07288361E-05],"rotation":[-3.41509212E-06,180.0,-1.87830283E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.00000286,2.38418579E-07,0.199990869],"rotation":[1.87830283E-05,270.0,-3.41509258E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.200005,2.38418579E-07,0.1999898],"rotation":[1.87830283E-05,270.0,-3.41509258E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.40000582,3.57627869E-07,0.1999898],"rotation":[3.41509121E-06,4.579994E-13,1.87830265E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.40000391,3.57627869E-07,-1.1920929E-05],"rotation":[3.41509121E-06,4.579994E-13,1.87830265E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.40000582,3.57627869E-07,-0.200009882],"rotation":[-1.87830265E-05,90.0,3.41509167E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.200005,2.38418579E-07,-0.200009763],"rotation":[-1.87830265E-05,90.0,3.41509167E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.00000286,2.38418579E-07,-0.20000881],"rotation":[-3.41509212E-06,180.0,-1.87830283E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.300003052,1.29999983,3.57627869E-06],"rotation":[-1.74897923E-05,180.0,89.99998],"color":[0.0,0.0,0.0],"scale":[2.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.2000041,1.00000012,3.81469727E-06],"rotation":[1.548927E-05,2.04905718E-05,180.000015],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[2.38418579E-06,1.29999983,3.695488E-06],"rotation":[1.02452723E-05,2.04905718E-05,180.000015],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumCube","position":[1.90734863E-06,1.59999979,3.695488E-06],"rotation":[9.245023E-06,1.586202E-06,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[3.81469727E-06,1.59999955,0.20000267],"rotation":[-1.87830246E-05,90.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.199998856,1.59999931,0.2000016],"rotation":[1.02452723E-05,2.04905718E-05,180.000015],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.199998856,1.59999979,3.93390656E-06],"rotation":[1.02452723E-05,2.04905718E-05,180.000015],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.1999979,1.59999979,-0.199997962],"rotation":[1.87830228E-05,270.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.90734863E-06,1.6,-0.199997008],"rotation":[1.87830228E-05,270.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.200003624,1.6,-0.199997127],"rotation":[-1.02452759E-05,180.000015,179.999985],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.20000267,1.59999979,3.81469727E-06],"rotation":[1.40746934E-05,6.4158753E-06,270.000031],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.200003624,1.59999979,0.20000267],"rotation":[-1.87830246E-05,90.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.00001383,1.00000012,-1.180172E-05],"rotation":[7.07300558E-07,180.000015,179.999985],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.9000144,1.30000007,-1.180172E-05],"rotation":[2.00051113E-06,6.83018743E-06,90.00003],"color":[0.0,0.0,0.0],"scale":[2.0,2.0,1.0]},{"name":"AluminiumSlope","position":[1.20001459,1.30000031,-1.168251E-05],"rotation":[-9.245018E-06,180.000015,179.999985],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumCube","position":[1.20001459,1.6000005,-1.14440918E-05],"rotation":[-3.00077318E-06,180.0,269.999969],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.20001459,1.6,0.1999892],"rotation":[-1.70754865E-05,90.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.40001535,1.60000026,0.199990153],"rotation":[-1.70754865E-05,90.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.40001535,1.60000026,-1.15633011E-05],"rotation":[-3.41508621E-06,180.000015,179.999985],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.40001535,1.60000026,-0.200009525],"rotation":[-3.41508621E-06,180.000015,179.999985],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.20001268,1.6000005,-0.200010836],"rotation":[1.70754847E-05,270.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.00001287,1.60000026,-0.200010836],"rotation":[1.70754847E-05,270.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.00001478,1.60000026,-1.25169754E-05],"rotation":[3.41508735E-06,2.04905718E-05,180.000015],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.00001383,1.6,0.1999892],"rotation":[3.41508735E-06,2.04905718E-05,180.000015],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]}], + "10":[{"name":"t2 rod diagonal 2d short"}], + "1316425218":[{"name":"AluminiumCube","position":[0.0,0.0,0.0],"rotation":[9.659348E-06,-1.24885E-05,90.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.200000763,0.0,0.0],"rotation":[6.830203E-06,-2.04905664E-05,1.36603785E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199999809,0.0,-0.200001717],"rotation":[-1.36603767E-05,89.99999,6.830195E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-9.536743E-07,0.0,-0.200000763],"rotation":[-1.36603767E-05,89.99999,6.830195E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,0.0,-0.200000763],"rotation":[-6.830203E-06,179.999985,-1.36603749E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200000763,-1.1920929E-07,9.536743E-07],"rotation":[-6.830203E-06,179.999985,-1.36603749E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,-1.1920929E-07,0.199998379],"rotation":[1.36603776E-05,270.0,-6.830199E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-2.861023E-06,-1.1920929E-07,0.199998856],"rotation":[1.36603776E-05,270.0,-6.830199E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199999809,0.0,0.1999979],"rotation":[6.830203E-06,-2.04905664E-05,1.36603785E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.0,0.299999952,0.0],"rotation":[-1.06596162E-05,179.999985,-1.36603758E-05],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.3000002,0.300000072,0.0],"rotation":[7.244511E-06,-1.89043712E-05,270.0],"color":[0.0,0.0,0.0],"scale":[2.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.3000002,0.700000048,-4.76837158E-07],"rotation":[-2.14700958E-06,179.999985,-1.36603767E-05],"color":[0.0,0.0,0.0],"scale":[2.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.5999994,0.700000167,0.0],"rotation":[7.244511E-06,-1.89043712E-05,270.0],"color":[0.0,0.0,0.0],"scale":[2.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.599992752,1.00000012,9.536743E-07],"rotation":[-4.829668E-06,-3.097855E-05,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.599992752,1.00000012,-0.199999809],"rotation":[1.36603785E-05,269.999969,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.799994469,1.00000012,-0.200000286],"rotation":[-6.83020153E-06,179.999985,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.7999935,1.00000012,1.90734863E-06],"rotation":[-6.83020153E-06,179.999985,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.799994469,1.00000036,0.199999809],"rotation":[-1.36603758E-05,89.99998,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.5999956,1.00000036,0.199999332],"rotation":[-1.36603758E-05,89.99998,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.399992943,1.00000012,0.199998856],"rotation":[6.83020153E-06,-2.04905664E-05,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.399992,1.00000036,9.536743E-07],"rotation":[6.83020153E-06,-2.04905664E-05,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.399992,1.00000012,-0.200000763],"rotation":[1.36603785E-05,269.999969,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]}], + "12":[{"name":"t2 rod diagonal 2d"}], + "394503911":[{"name":"AluminiumCube","position":[0.0,0.0,0.0],"rotation":[6.03709077E-06,1.89043749E-05,90.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.0,0.299999952,0.0],"rotation":[-2.431999E-05,180.0,-1.36603821E-05],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.300001144,0.3000002,-4.76837158E-07],"rotation":[1.2074147E-06,1.97330137E-05,270.0],"color":[0.0,0.0,0.0],"scale":[2.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.299996376,0.700000167,-1.57356262E-05],"rotation":[1.2074139E-06,2.37340464E-05,90.0000153],"color":[0.0,0.0,0.0],"scale":[2.0,2.0,1.0]},{"name":"AluminiumCube","position":[0.599998,0.8000001,-1.52587891E-05],"rotation":[2.01829016E-06,180.000015,270.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.8999996,0.9000002,-1.57356262E-05],"rotation":[-1.207422E-06,1.73181779E-05,270.0],"color":[0.0,0.0,0.0],"scale":[2.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.599998,0.9999999,-1.52587891E-05],"rotation":[1.2074139E-06,2.37340464E-05,90.0000153],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.8999996,1.30000007,-1.52587891E-05],"rotation":[1.2074139E-06,2.37340464E-05,90.0000153],"color":[0.0,0.0,0.0],"scale":[2.0,2.0,1.0]},{"name":"AluminiumSlope","position":[1.20000124,1.30000031,-1.52587891E-05],"rotation":[-3.829416E-06,180.000015,180.0],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumCube","position":[1.19999981,1.60000026,-1.57356262E-05],"rotation":[-3.96547279E-07,180.000015,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.999999046,1.60000026,-1.52587891E-05],"rotation":[4.43312547E-06,180.000015,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.999998569,1.60000026,0.1999855],"rotation":[3.829412E-06,2.732076E-05,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.19999886,1.60000026,0.1999855],"rotation":[-1.36603849E-05,90.00002,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.39999962,1.60000026,0.199985981],"rotation":[-1.36603849E-05,90.00002,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.40000153,1.60000026,-1.57356262E-05],"rotation":[-3.829416E-06,180.000015,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.39999962,1.60000026,-0.200014114],"rotation":[-3.829416E-06,180.000015,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.1999979,1.60000026,-0.200015068],"rotation":[1.36603849E-05,270.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.9999976,1.60000026,-0.200014591],"rotation":[1.36603849E-05,270.0,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.5999961,0.6,-1.57356262E-05],"rotation":[-1.207422E-06,1.73181779E-05,270.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200000763,0.0,9.536743E-07],"rotation":[-1.06596108E-05,180.0,-1.366038E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,-1.1920929E-07,0.199998856],"rotation":[1.36603849E-05,270.0,-1.06596044E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-2.861023E-06,0.0,0.199998856],"rotation":[1.36603849E-05,270.0,-1.06596044E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199999809,0.0,0.1999979],"rotation":[1.06596117E-05,6.83019152E-06,1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.200000763,0.0,-4.76837158E-07],"rotation":[1.06596117E-05,6.83019152E-06,1.36603821E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199999809,1.1920929E-07,-0.200001717],"rotation":[-1.3660383E-05,90.00002,1.06596026E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-9.536743E-07,1.1920929E-07,-0.200000763],"rotation":[-1.3660383E-05,90.00002,1.06596026E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,0.0,-0.200000763],"rotation":[-1.06596108E-05,180.0,-1.366038E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]}], + "14":[{"name":"t2 rod diagonal 3d"}], + "3705632066":[{"name":"AluminiumCube","position":[0.0,0.0,0.0],"rotation":[-1.57822669E-05,3.66313761E-05,90.00004],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-1.43051147E-06,0.0,-0.200001],"rotation":[-4.09811473E-05,90.00004,-1.36604058E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199999332,2.38418579E-07,-0.200001955],"rotation":[-4.09811473E-05,90.00004,-1.36604058E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.200000286,2.38418579E-07,0.0],"rotation":[-1.36604012E-05,3.05084723E-05,4.09811473E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199999332,2.38418579E-07,0.199997783],"rotation":[-1.36604012E-05,3.05084723E-05,4.09811473E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-2.861023E-06,2.38418579E-07,0.199998975],"rotation":[4.09811546E-05,270.000031,1.36604049E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.2000022,0.0,0.199999332],"rotation":[4.09811546E-05,270.000031,1.36604049E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.20000124,0.0,1.43051147E-06],"rotation":[1.36604012E-05,180.000031,-4.09811473E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.2000022,-2.38418579E-07,-0.200000525],"rotation":[1.36604012E-05,180.000031,-4.09811473E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlicedCube","position":[-4.76837158E-07,0.200000048,2.38418579E-07],"rotation":[4.09811473E-05,270.000031,2.44266569E-11],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCorner","position":[-2.38418579E-06,0.400000334,-1.02519989E-05],"rotation":[270.019775,180.000076,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-2.38418579E-06,0.4000001,-0.200010061],"rotation":[270.0,90.00006,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-2.38418579E-06,0.200000048,-0.200010061],"rotation":[90.0,180.0,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199997425,0.200000286,-0.200010061],"rotation":[1.36604012E-05,180.000031,179.999969],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.199996948,0.4000001,-0.20001018],"rotation":[2.19051744E-05,180.000031,89.99996],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.399996758,0.400000334,-0.20001018],"rotation":[-1.81971027E-05,3.64597545E-05,270.000031],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.399996758,0.6000004,-0.200011253],"rotation":[-5.29339668E-05,90.00002,89.9999847],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.399997234,0.6000004,-0.4000119],"rotation":[2.19051744E-05,180.000031,89.99996],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.3999958,0.8000002,-0.400011063],"rotation":[4.09811364E-05,270.000031,1.36603994E-05],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.3999977,0.8000002,-0.600017667],"rotation":[270.0,90.00008,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.599998,0.800000668,-0.600017667],"rotation":[4.09811364E-05,270.000061,270.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.5999975,0.6000004,-0.600017548],"rotation":[3.0735886E-05,180.000046,179.999969],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.599996567,0.6000006,-0.4000119],"rotation":[-1.81971027E-05,3.64597545E-05,270.000031],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.5999985,0.800000668,-0.400017738],"rotation":[-4.439623E-05,90.00005,89.9999847],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.3999958,0.6000004,-0.6000128],"rotation":[89.98022,180.0,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.599998,0.8000002,-0.800017357],"rotation":[89.98022,180.0,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.79999876,0.8000002,-0.800017357],"rotation":[3.0735886E-05,180.000046,179.999969],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.79999876,0.8000002,-0.600017667],"rotation":[-2.06119348E-05,3.8874583E-05,270.000031],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.79999876,1.00000048,-0.6000178],"rotation":[-3.7566042E-05,90.00004,89.99999],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.5999985,1.00000048,-0.6000178],"rotation":[4.098114E-05,270.000061,3.073589E-05],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.599998,1.00000048,-0.800017953],"rotation":[270.0,90.00007,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.79999876,1.0,-0.800017953],"rotation":[4.439623E-05,270.000061,270.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.7999978,1.0,-1.00001812],"rotation":[90.0,180.0,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.999998569,1.00000048,-1.00001836],"rotation":[3.0735886E-05,180.000046,179.999969],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.9999995,1.00000048,-0.800017953],"rotation":[-2.54416173E-05,4.37042581E-05,270.000031],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.9999995,1.20000076,-0.800018549],"rotation":[-3.7566042E-05,90.00004,89.99999],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.79999876,1.20000029,-0.800018549],"rotation":[4.098114E-05,270.000061,3.073589E-05],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.7999978,1.20000029,-1.00001836],"rotation":[270.0,90.00007,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.999998569,1.20000029,-1.00001836],"rotation":[4.439623E-05,270.000061,270.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.999998569,1.20000029,-1.20001817],"rotation":[90.0,180.0,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCorner","position":[1.19999933,1.20000029,-1.20001817],"rotation":[2.04906E-05,180.000046,179.999969],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlicedCube","position":[1.19999933,1.40000057,-1.20001817],"rotation":[1.36604094E-05,180.000046,179.999969],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.999998569,1.40000057,-1.20001817],"rotation":[270.0,90.00006,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.999998569,1.40000057,-1.00001907],"rotation":[4.098114E-05,270.000061,3.073589E-05],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.19999933,1.40000057,-1.0000186],"rotation":[-4.09811364E-05,90.00005,89.9999847],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.19999933,1.20000076,-1.00001836],"rotation":[-2.54416173E-05,4.37042581E-05,270.000031],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[1.19999933,1.60000038,-1.20001841],"rotation":[9.830983E-06,180.000031,269.999939],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.4000001,1.60000086,-1.20001841],"rotation":[-2.54416173E-05,4.37042581E-05,270.000031],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.39999914,1.60000086,-1.00001812],"rotation":[-4.09811546E-05,90.00004,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.19999838,1.60000038,-1.00001764],"rotation":[-4.09811546E-05,90.00004,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.999996662,1.60000038,-1.00001764],"rotation":[-1.36604131E-05,4.75839443E-05,180.000031],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.999998569,1.60000038,-1.20001936],"rotation":[-1.36604131E-05,4.75839443E-05,180.000031],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.9999976,1.60000038,-1.40001726],"rotation":[4.09811473E-05,270.000031,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.19999647,1.60000038,-1.40001726],"rotation":[4.09811473E-05,270.000031,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.39999914,1.60000038,-1.40001631],"rotation":[1.36604094E-05,180.000046,179.999969],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.399996758,0.400000334,-0.400010824],"rotation":[1.36604012E-05,180.000031,179.999969],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199996948,0.4000001,-0.400010943],"rotation":[89.98022,180.0,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199996,0.6000004,-0.400011063],"rotation":[270.0,90.00006,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199996,0.600000143,-0.200010538],"rotation":[4.09811364E-05,270.000031,1.36603994E-05],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199997425,0.400000334,-9.417534E-06],"rotation":[-5.29339668E-05,90.00002,89.9999847],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199997425,0.200000286,-9.298325E-06],"rotation":[-1.81970936E-05,2.19707326E-05,270.000061],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]}], + "16":[{"name":"t2 rod frame"}], + "651695911":[{"name":"AluminiumCube","position":[0.0,0.0,0.0],"rotation":[3.58584948E-05,270.000031,90.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.200000763,1.1920929E-07,-1.08778477E-06],"rotation":[-9.245026E-06,3.59721744E-05,2.54995321E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.200000763,1.1920929E-07,-0.200001851],"rotation":[-2.54995339E-05,90.00003,-9.245022E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-9.536743E-07,0.0,-0.200000748],"rotation":[-2.54995339E-05,90.00003,-9.245022E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.199998856,-1.1920929E-07,-0.200001583],"rotation":[9.24502547E-06,180.000031,-2.54995284E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.199998856,0.0,-2.60770321E-06],"rotation":[9.24502547E-06,180.000031,-2.54995284E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.1999979,0.0,0.200000182],"rotation":[2.54995321E-05,270.000031,9.245023E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.0,1.1920929E-07,0.200000808],"rotation":[2.54995321E-05,270.000031,9.245023E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.200001717,2.38418579E-07,0.199999943],"rotation":[-9.245026E-06,3.59721744E-05,2.54995321E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.5,0.200000286,-3.874302E-07],"rotation":[-2.54995339E-05,90.00003,-9.245024E-06],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,6.0]},{"name":"AluminiumCube","position":[1.19999886,0.699993849,-1.02967024E-05],"rotation":[6.244258E-06,2.47266416E-05,90.00002],"color":[0.0,0.0,0.0],"scale":[6.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.6999998,1.39999342,-1.001358E-05],"rotation":[2.707808E-06,3.59721853E-05,2.20844358E-05],"color":[0.0,0.0,0.0],"scale":[6.0,1.0,1.0]},{"name":"AluminiumCube","position":[-4.76837158E-07,0.8999934,-9.357929E-06],"rotation":[3.82940971E-06,3.680082E-05,90.00003],"color":[0.0,0.0,0.0],"scale":[6.0,1.0,1.0]},{"name":"AluminiumCube","position":[-0.200001717,1.39999962,-1.89244747E-05],"rotation":[8.53758365E-07,180.0,179.999985],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200001717,1.3999989,0.199981824],"rotation":[270.0,270.0,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,1.59999967,0.199982747],"rotation":[270.0,270.0,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200001717,1.60000038,-1.90138817E-05],"rotation":[4.82966152E-06,180.0,89.99997],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.20000267,1.5999999,-0.200016961],"rotation":[4.82966152E-06,180.0,89.99997],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200001717,1.39999723,-0.200017914],"rotation":[89.98022,90.00002,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,1.19999838,-0.200017914],"rotation":[89.98022,90.00002,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200001717,1.19999909,-1.97887421E-05],"rotation":[-3.415086E-06,1.22381343E-05,270.000031],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.20000124,1.19999814,0.199981943],"rotation":[-3.415086E-06,1.22381343E-05,270.000031],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[1.20000648,1.59999371,-2.002716E-05],"rotation":[9.770664E-12,180.000046,269.999969],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.20000362,1.59999371,-0.200018808],"rotation":[2.20844431E-05,270.000031,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.00000477,1.59999371,-0.200018629],"rotation":[2.20844431E-05,270.000031,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.00000477,1.59999371,-2.07573175E-05],"rotation":[1.00025647E-06,4.280237E-05,180.000015],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.00000477,1.59999371,0.199981168],"rotation":[1.00025647E-06,4.280237E-05,180.000015],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.20000553,1.59999371,0.199981079],"rotation":[-2.20844431E-05,90.00004,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.40000629,1.59999371,0.1999818],"rotation":[-2.20844431E-05,90.00004,180.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.40000725,1.599994,-2.01314688E-05],"rotation":[-1.00025693E-06,180.000046,179.999985],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.40000629,1.599994,-0.200017914],"rotation":[-1.00025693E-06,180.000046,179.999985],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[1.39999962,0.199994087,-1.013279E-05],"rotation":[2.000513E-06,180.000015,-2.20844431E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.39999962,0.199995041,0.199990258],"rotation":[90.0,270.000061,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.39999866,0.3999958,0.199990228],"rotation":[-1.000257E-06,3.197115E-05,90.0000153],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.39999866,0.39999485,-1.0997057E-05],"rotation":[-1.000257E-06,3.197115E-05,90.0000153],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.39999866,0.3999958,-0.200009272],"rotation":[270.0,90.0000458,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.39999962,0.199996948,-0.200009212],"rotation":[270.0,90.0000458,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.39999962,-5.722046E-06,-0.20000802],"rotation":[4.829669E-06,180.000015,269.999969],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.39999962,-6.67572E-06,-1.02221966E-05],"rotation":[4.829669E-06,180.000015,269.999969],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.39999962,-5.722046E-06,0.19999136],"rotation":[90.0,270.000061,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]}], + "18":[{"name":"t2 rod arc"}], + "2454932271":[{"name":"AluminiumCube","position":[0.0,0.0,0.0],"rotation":[1.36603785E-05,90.0000153,89.99998],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.43051147E-06,0.0,0.200000763],"rotation":[-6.708849E-06,270.0,-4.1223816E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200000763,0.0,0.200001955],"rotation":[-6.708849E-06,270.0,-4.1223816E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.20000124,0.0,1.1920929E-06],"rotation":[-4.1223816E-06,180.000015,6.708844E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.20000124,0.0,-0.199999571],"rotation":[-4.1223816E-06,180.000015,6.708844E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-4.76837158E-07,0.0,-0.200000525],"rotation":[6.70884947E-06,90.0000153,4.1223775E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.1999979,0.0,-0.199999571],"rotation":[6.70884947E-06,90.0000153,4.1223775E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.199998856,-1.1920929E-07,2.62260437E-06],"rotation":[4.12238E-06,2.732075E-05,-6.708848E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199999332,0.0,0.200001478],"rotation":[4.12238E-06,2.732075E-05,-6.708848E-06],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumCube","position":[0.0,0.299999952,0.0],"rotation":[1.01239448E-05,90.0000153,4.1223775E-06],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.0,0.6999999,4.76837158E-07],"rotation":[-4.122383E-06,180.0,1.01239384E-05],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.200000763,0.700000167,-2.38418579E-07],"rotation":[-3.536435E-07,1.96723286E-05,270.0],"color":[0.0,0.0,0.0],"scale":[2.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.200000763,1.00000012,-2.38418579E-07],"rotation":[-4.122382E-06,180.000015,5.00130045E-06],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.40000248,0.9999999,-4.76837158E-07],"rotation":[-2.768481E-06,2.20871661E-05,270.0],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.40000248,1.20000017,-4.76837158E-07],"rotation":[-4.12238251E-06,180.000015,3.29374848E-06],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.7000041,1.19999993,-2.38418579E-07],"rotation":[-2.768481E-06,2.20871661E-05,270.0],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.7000041,1.39999974,-7.15255737E-07],"rotation":[-4.12238251E-06,180.000015,3.29374848E-06],"color":[0.0,0.0,0.0],"scale":[2.0,1.0,1.0]},{"name":"AluminiumCube","position":[1.10000467,1.39999974,-1.43051147E-06],"rotation":[90.0,90.00003,0.0],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumCube","position":[1.40000486,1.400004,-5.00679E-06],"rotation":[270.0,180.0,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.40000534,1.40000451,0.199996233],"rotation":[90.0,270.000031,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.40000534,1.60000241,0.199997187],"rotation":[-5.18331626E-06,3.82837352E-05,90.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.40000486,1.60000288,-1.90734863E-06],"rotation":[-5.18331626E-06,3.82837352E-05,90.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.40000486,1.60000193,-0.200004339],"rotation":[270.0,90.0000153,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.40000486,1.400004,-0.2000053],"rotation":[270.0,90.0000153,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.40000486,1.20000231,-0.2000041],"rotation":[1.484266E-05,180.000031,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[1.40000486,1.20000327,-3.57627869E-06],"rotation":[1.484266E-05,180.000031,270.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[1.40000534,1.20000279,0.199997187],"rotation":[90.0,270.000031,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]}], + "20":[{"name":"t2 rod arc short"}], + "3568811832":[{"name":"AluminiumCube","position":[0.0,0.0,0.0],"rotation":[-1.36603785E-05,89.99996,90.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.0,1.1920929E-07,-0.200000763],"rotation":[-1.866933E-05,89.99997,1.70754756E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200001717,0.0,-0.199999809],"rotation":[-1.70754756E-05,179.999985,-1.86693342E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-0.200000763,0.0,9.536743E-07],"rotation":[-1.70754756E-05,179.999985,-1.86693342E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[-0.200000763,-1.1920929E-07,0.200001717],"rotation":[1.86693287E-05,269.999969,-1.707548E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[9.536743E-07,0.0,0.20000124],"rotation":[1.86693287E-05,269.999969,-1.707548E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.199998856,0.0,0.2000022],"rotation":[1.70754738E-05,-2.20844267E-05,1.86693323E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.199998856,1.1920929E-07,3.33786E-06],"rotation":[1.70754738E-05,-2.20844267E-05,1.86693323E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.1999979,1.1920929E-07,-0.199999809],"rotation":[-1.866933E-05,89.99997,1.70754756E-05],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[-4.76837158E-07,0.300000072,4.76837158E-07],"rotation":[-1.70754756E-05,179.999985,-2.54995211E-05],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumSlope","position":[0.199999332,0.300000072,4.76837158E-07],"rotation":[1.08312288E-05,-2.8328679E-05,270.000031],"color":[0.0,0.0,0.0],"scale":[2.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.199999332,0.6,1.90734863E-06],"rotation":[2.04905718E-05,-3.51588678E-05,90.00001],"color":[0.0,0.0,0.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.499998569,0.600000262,1.90734863E-06],"rotation":[-2.04905718E-05,179.999985,179.999985],"color":[0.0,0.0,0.0],"scale":[2.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.499998569,0.8000002,2.38418579E-06],"rotation":[1.80757452E-05,-3.75737072E-05,90.00002],"color":[0.0,0.0,0.0],"scale":[1.0,2.0,1.0]},{"name":"AluminiumCube","position":[0.79999876,0.8000003,2.38418579E-06],"rotation":[1.02452859E-05,-2.89146155E-05,180.000015],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.79999876,0.599999547,3.33786E-06],"rotation":[-9.830969E-06,179.999985,269.999969],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.79999876,0.599998832,0.20000124],"rotation":[90.0,269.999939,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.79999876,0.7999977,0.20000124],"rotation":[90.0,269.999939,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.79999876,1.00000036,0.200000286],"rotation":[3.01499149E-05,-2.54995175E-05,90.00001],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.79999876,1.00000131,2.38418579E-06],"rotation":[3.01499149E-05,-2.54995175E-05,90.00001],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.79999876,1.00000036,-0.199999809],"rotation":[270.0,89.99995,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumSlope","position":[0.79999876,0.7999996,-0.199998379],"rotation":[270.0,89.99995,0.0],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]},{"name":"AluminiumPyramidSegment","position":[0.79999876,0.599998832,-0.199998379],"rotation":[-9.830969E-06,179.999985,269.999969],"color":[1.0,1.0,1.0],"scale":[1.0,1.0,1.0]}], + "22":[{"name":"t2 strut?"}], + "42":[] +}