20 Commits

Author SHA1 Message Date
Jedd Morgan cf7e72aa7d Merge pull request #115 from specklesystems/JR-Morgan-patch-1
Update README.md
2024-03-19 18:44:21 +00:00
Jedd Morgan 695a25af51 Update README.md 2024-03-19 18:44:09 +00:00
Jedd Morgan 63d83d0044 Merge pull request #114 from specklesystems/JR-Morgan-patch-1
2.18.1.json
2024-03-19 18:43:04 +00:00
Jedd Morgan db88d0dc41 2.18.1.json 2024-03-19 18:42:52 +00:00
Jedd Morgan 5359731dce Merge pull request #111 from specklesystems/dev
* 2.18 Update

* fixed bug with selection not correctly restoring after deserializing

* Bump core to 2.18.0-rc

* FE2 terms (#112)

* FE2 terms

* SendComponent

* Removed terminology switching

* Bumped core version (#113)
2024-03-14 10:53:50 +00:00
Jedd Morgan 790e5d8294 Bumped core version (#113) 2024-03-14 10:51:39 +00:00
Jedd Morgan 00c4a43c3a FE2 terms (#112)
* FE2 terms

* SendComponent

* Removed terminology switching
2024-03-14 10:41:07 +00:00
Jedd Morgan 8e32a0214e Bump core to 2.18.0-rc 2024-02-29 11:25:45 +00:00
Jedd Morgan ab5d4c2fba fixed bug with selection not correctly restoring after deserializing 2024-02-28 14:05:18 +00:00
Jedd Morgan 1b2eeed3eb 2.18 Update 2024-02-22 18:31:09 +00:00
Jedd Morgan edeec70993 2.17.1 (#110)
* Bump core to 2.17.0-rc

* feat!(selection): selection now indexes based on ID (#107)

* bump package version (#108)

* Bumped core to 2.17.1

* Account id to include hash of server info
2024-02-08 23:01:21 +00:00
Jedd Morgan ce33e7c454 Merge pull request #105 from specklesystems/jrm/core/2.16.0
Updated core and objects to 2.16.0
2023-10-31 12:18:13 +00:00
Jedd Morgan fb1e458970 Bumped version connector package semver 2023-10-31 12:17:15 +00:00
Jedd Morgan 2755a9abd7 Fix compiler errors for 2.16 core/objects bump 2023-10-31 12:15:13 +00:00
Jedd Morgan ee9795e39f Bump Core + Objects 2023-10-31 11:52:47 +00:00
Jedd Morgan 999e6ae4ea Merge pull request #103 from specklesystems/jrm/update-docs
Updated SpeckleReceiver.cs
2023-09-26 22:46:37 +01:00
Jedd Morgan 8df96eeca4 Updated SpeckleReceiver.cs 2023-09-26 22:45:44 +01:00
Jedd Morgan 6aa92d4c57 Merge pull request #102 from specklesystems/doc-comments
Update SpeckleReceiver.cs
2023-09-26 22:18:41 +01:00
Jedd Morgan 030cb277b8 Update SpeckleReceiver.cs 2023-09-26 22:18:28 +01:00
Jedd Morgan 5ee498afce Update SpeckleReceiver.cs 2023-09-26 22:17:28 +01:00
45 changed files with 1756 additions and 1143 deletions
@@ -23,7 +23,7 @@ public class AttachSpecklePropertiesExample : MonoBehaviour
public virtual void Start()
{
Client speckleClient = new(AccountManager.GetDefaultAccount());
Client speckleClient = new(AccountManager.GetDefaultAccount()!);
StartCoroutine(AttachSpeckleProperties(speckleClient, streamId, objectId));
}
+23 -27
View File
@@ -1,10 +1,10 @@
using System;
using System.Collections;
using System.Threading.Tasks;
using Speckle.ConnectorUnity;
using Speckle.ConnectorUnity.Components;
using Speckle.Core.Api;
using Speckle.Core.Credentials;
using Speckle.Core.Models;
using Speckle.Core.Transports;
using UnityEngine;
@@ -12,60 +12,56 @@ using UnityEngine;
[RequireComponent(typeof(RecursiveConverter))]
public class ManualReceive : MonoBehaviour
{
public string authToken;
public string serverUrl;
public string streamId, objectId;
private RecursiveConverter receiver;
public string streamId,
objectId;
private RecursiveConverter receiver;
void Awake()
{
receiver = GetComponent<RecursiveConverter>();
}
IEnumerator Start()
{
Debug.developerConsoleVisible = true;
if(Time.timeSinceLevelLoad > 20) yield return null;
if (Time.timeSinceLevelLoad > 20)
yield return null;
Receive();
}
[ContextMenu(nameof(Receive))]
public void Receive()
{
var account = new Account()
{
token = authToken,
serverInfo = new ServerInfo() {url = serverUrl},
serverInfo = new ServerInfo() { url = serverUrl },
};
Task.Run(async () =>
{
var transport = new ServerTransport(account, streamId);
var localTransport = new MemoryTransport();
var @base = await Operations.Receive(
using ServerTransport transport = new(account, streamId);
MemoryTransport localTransport = new();
Base speckleObject = await Operations.Receive(
objectId,
remoteTransport: transport,
localTransport: localTransport,
onErrorAction: (m, e) => Debug.LogError(m + e),
disposeTransports: true
localTransport: localTransport
);
if (@base == null) throw new Exception("received data was null!");
Dispatcher.Instance().Enqueue(() =>
{
var parentObject = new GameObject(name);
receiver.RecursivelyConvertToNative_Sync(@base, parentObject.transform);
Debug.Log($"Receive {objectId} completed");
});
Dispatcher
.Instance()
.Enqueue(() =>
{
var parentObject = new GameObject(name);
receiver.RecursivelyConvertToNative_Sync(speckleObject, parentObject.transform);
Debug.Log($"Receive {objectId} completed");
});
});
}
}
+22 -17
View File
@@ -2,6 +2,7 @@ using System.Threading;
using System.Threading.Tasks;
using Speckle.ConnectorUnity.Components;
using Speckle.Core.Api;
using Speckle.Core.Credentials;
using Speckle.Core.Models;
using Speckle.Core.Transports;
using UnityEngine;
@@ -18,24 +19,25 @@ namespace Extra
{
[Range(0, 100)]
public int numberOfIterations = 10;
public Vector3 translation = Vector3.forward * 100;
public GameObject objectToSend;
private SpeckleSender sender;
private void Awake()
{
sender = GetComponent<SpeckleSender>();
}
public async Task SendIterations()
{
GameObject go = new GameObject();
for (int i = 0; i < numberOfIterations; i++)
{
Instantiate(objectToSend, translation * i, Quaternion.identity, go.transform);
Base b = sender.Converter.RecursivelyConvertToSpeckle(go, _ => true);
await Send(b, $"{i}");
}
@@ -44,20 +46,23 @@ namespace Extra
private async Task<string> Send(Base data, string branchName)
{
var client = sender.Account.Client;
var stream = sender.Stream.Selected;
ServerTransport transport = new ServerTransport(sender.Account.Selected, stream!.id);
await client.BranchCreate(new BranchCreateInput(){streamId = stream.id, name = branchName});
return await SpeckleSender.SendDataAsync(CancellationToken.None,
Client client = sender.Account.Client!;
Stream stream = sender.Stream.Selected;
Account selectedAccount = sender.Account.Selected!;
using ServerTransport transport = new(selectedAccount, stream!.id);
string branchId = await client.BranchCreate(
new BranchCreateInput() { streamId = stream.id, name = branchName }
);
return await SpeckleSender.SendDataAsync(
remoteTransport: transport,
data: data,
client: client!,
branchName: branchName,
createCommit: true,
onProgressAction: null,
onErrorAction: (m, e) => throw e);
data,
client,
branchId,
true
);
}
}
@@ -68,7 +73,7 @@ namespace Extra
public override async void OnInspectorGUI()
{
DrawDefaultInspector();
if (GUILayout.Button("Create and send"))
{
await ((PerformanceTestSender)target).SendIterations();
-1
View File
@@ -3,7 +3,6 @@ using System.Collections.Generic;
using UnityEngine;
using Speckle.Core.Credentials;
using System.Linq;
using UnityEngine.Events;
using UnityEngine.UI;
using Stream = Speckle.Core.Api.Stream;
+34 -34
View File
@@ -902,18 +902,18 @@ MonoBehaviour:
- rid: 1485638386691080198
type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers}
data:
selectedIndex: 1
selectedId:
- rid: 1485638386691080199
type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers}
data:
selectedIndex: 0
selectedId:
<StreamsLimit>k__BackingField: 50
<AccountSelection>k__BackingField:
rid: 1485638386691080198
- rid: 1485638386691080200
type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers}
data:
selectedIndex: 0
selectedId:
<BranchesLimit>k__BackingField: 100
<CommitsLimit>k__BackingField: 0
<StreamSelection>k__BackingField:
@@ -972,18 +972,18 @@ MonoBehaviour:
- rid: 1485638386691080194
type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers}
data:
selectedIndex: 0
selectedId:
- rid: 1485638386691080195
type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers}
data:
selectedIndex: 0
selectedId:
<StreamsLimit>k__BackingField: 50
<AccountSelection>k__BackingField:
rid: 1485638386691080194
- rid: 1485638386691080196
type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers}
data:
selectedIndex: 0
selectedId:
<BranchesLimit>k__BackingField: 100
<CommitsLimit>k__BackingField: 25
<StreamSelection>k__BackingField:
@@ -991,7 +991,7 @@ MonoBehaviour:
- rid: 1485638386691080197
type: {class: CommitSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers}
data:
selectedIndex: 0
selectedId:
<BranchSelection>k__BackingField:
rid: 1485638386691080196
--- !u!114 &161249246
@@ -1162,6 +1162,18 @@ Transform:
m_Father: {fileID: 0}
m_RootOrder: 4
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &300223686
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b3354e8208862c341940152f5340d41a, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &310693430
GameObject:
m_ObjectHideFlags: 0
@@ -1770,18 +1782,6 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 641375517}
m_CullTransparentMesh: 1
--- !u!114 &701880765
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b3354e8208862c341940152f5340d41a, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &712628247
GameObject:
m_ObjectHideFlags: 0
@@ -2643,6 +2643,19 @@ Rigidbody:
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
--- !u!114 &1242741158
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2a4a29c776298714c88f406ad39c6095, type: 3}
m_Name:
m_EditorClassIdentifier:
matchByName: 1
--- !u!1 &1279250012
GameObject:
m_ObjectHideFlags: 0
@@ -3059,8 +3072,8 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
nativeCaches:
- {fileID: 1923150226}
- {fileID: 701880765}
- {fileID: 1242741158}
- {fileID: 300223686}
--- !u!1 &1464556211
GameObject:
m_ObjectHideFlags: 0
@@ -4057,19 +4070,6 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1903798475}
m_CullTransparentMesh: 1
--- !u!114 &1923150226
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2a4a29c776298714c88f406ad39c6095, type: 3}
m_Name:
m_EditorClassIdentifier:
matchByName: 1
--- !u!1 &2014586909
GameObject:
m_ObjectHideFlags: 0
+7 -11
View File
@@ -1,5 +1,3 @@
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using NUnit.Framework;
@@ -9,7 +7,6 @@ using Speckle.ConnectorUnity.Wrappers;
using Speckle.Core.Api;
using Speckle.Core.Models;
using UnityEngine;
using UnityEngine.TestTools;
namespace Speckle.ConnectorUnity.Tests
{
@@ -25,7 +22,7 @@ namespace Speckle.ConnectorUnity.Tests
{
return Task.Run(async () => await Helpers.Receive(stream)).Result;
}
[Test, TestCaseSource(nameof(TestCases))]
public void ToNative_Passes(string stream)
{
@@ -37,14 +34,13 @@ namespace Speckle.ConnectorUnity.Tests
Assert.That(results, HasSomeComponent<SpeckleProperties>());
}
private static Constraint HasSomeComponent<T>() where T : Component
private static Constraint HasSomeComponent<T>()
where T : Component
{
return Has.Some.Matches<ConversionResult>(
x =>
{
return x.WasSuccessful(out var success, out _)
&& success.GetComponent<T>();
});
return Has.Some.Matches<ConversionResult>(x =>
{
return x.WasSuccessful(out var success, out _) && success.GetComponent<T>();
});
}
}
}
+2 -2
View File
@@ -1,14 +1,14 @@
{
"dependencies": {
"com.unity.2d.sprite": "1.0.0",
"com.unity.collab-proxy": "2.0.5",
"com.unity.collab-proxy": "2.0.7",
"com.unity.ide.rider": "3.0.24",
"com.unity.ide.visualstudio": "2.0.18",
"com.unity.ide.vscode": "1.2.5",
"com.unity.test-framework": "1.1.33",
"com.unity.textmeshpro": "3.0.6",
"com.unity.timeline": "1.6.5",
"com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.2",
"com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.4",
"com.unity.ugui": "1.0.0",
"com.unity.modules.ai": "1.0.0",
"com.unity.modules.androidjni": "1.0.0",
+7 -7
View File
@@ -7,7 +7,7 @@
"dependencies": {}
},
"com.unity.collab-proxy": {
"version": "2.0.5",
"version": "2.0.7",
"depth": 0,
"source": "registry",
"dependencies": {},
@@ -46,18 +46,18 @@
"url": "https://packages.unity.com"
},
"com.unity.sysroot": {
"version": "2.0.3",
"version": "2.0.5",
"depth": 1,
"source": "registry",
"dependencies": {},
"url": "https://packages.unity.com"
},
"com.unity.sysroot.linux-x86_64": {
"version": "2.0.2",
"version": "2.0.4",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.sysroot": "2.0.3"
"com.unity.sysroot": "2.0.5"
},
"url": "https://packages.unity.com"
},
@@ -94,12 +94,12 @@
"url": "https://packages.unity.com"
},
"com.unity.toolchain.win-x86_64-linux-x86_64": {
"version": "2.0.2",
"version": "2.0.4",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.sysroot": "2.0.3",
"com.unity.sysroot.linux-x86_64": "2.0.2"
"com.unity.sysroot": "2.0.5",
"com.unity.sysroot.linux-x86_64": "2.0.4"
},
"url": "https://packages.unity.com"
},
@@ -1,4 +1,3 @@
#nullable enable
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
@@ -13,7 +12,13 @@ namespace Speckle.ConnectorUnity.Components.Editor
[CustomEditor(typeof(SpeckleReceiver))]
public class SpeckleReceiverEditor : UnityEditor.Editor
{
private static bool _generateAssets = false;
private SerializedProperty _accountSelection;
private SerializedProperty _streamSelection;
private SerializedProperty _branchSelection;
private SerializedProperty _commitSelection;
#nullable enable
private static bool _generateAssets;
private bool _foldOutStatus = true;
private Texture2D? _previewImage;
@@ -21,7 +26,11 @@ namespace Speckle.ConnectorUnity.Components.Editor
{
var speckleReceiver = (SpeckleReceiver)target;
DrawDefaultInspector();
//Selection
EditorGUILayout.PropertyField(_accountSelection);
EditorGUILayout.PropertyField(_streamSelection, new GUIContent("Project"));
EditorGUILayout.PropertyField(_branchSelection, new GUIContent("Model"));
EditorGUILayout.PropertyField(_commitSelection, new GUIContent("Version"));
//Preview image
{
@@ -64,8 +73,8 @@ namespace Speckle.ConnectorUnity.Components.Editor
else if (userRequestedReceive)
{
var id = Progress.Start(
"Receiving Speckle data",
"Fetching commit data",
"Receiving Speckle Model",
"Fetching data from Speckle",
Progress.Options.Sticky
);
Progress.ShowDetails();
@@ -96,6 +105,19 @@ namespace Speckle.ConnectorUnity.Components.Editor
public void OnEnable()
{
Init();
_accountSelection = serializedObject.FindProperty(
$"<{nameof(SpeckleReceiver.Account)}>k__BackingField"
);
_streamSelection = serializedObject.FindProperty(
$"<{nameof(SpeckleReceiver.Stream)}>k__BackingField"
);
_branchSelection = serializedObject.FindProperty(
$"<{nameof(SpeckleReceiver.Branch)}>k__BackingField"
);
_commitSelection = serializedObject.FindProperty(
$"<{nameof(SpeckleReceiver.Commit)}>k__BackingField"
);
}
public void Reset()
@@ -163,7 +185,7 @@ namespace Speckle.ConnectorUnity.Components.Editor
bool BeforeConvert(TraversalContext context)
{
Base b = context.current;
Base b = context.Current;
//NOTE: progress wont reach 100% because not all objects are convertable
float progress = (childrenConverted + childrenFailed) / totalChildrenFloat;
@@ -1,3 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Immutable;
@@ -9,7 +10,6 @@ using UnityEngine;
using UnityEngine.SceneManagement;
using Component = UnityEngine.Component;
#nullable enable
namespace Speckle.ConnectorUnity.Components.Editor
{
public enum SelectionFilter
@@ -35,12 +35,32 @@ namespace Speckle.ConnectorUnity.Components.Editor
[CanEditMultipleObjects]
public class SpeckleSendEditor : UnityEditor.Editor
{
private SerializedProperty _accountSelection;
private SerializedProperty _streamSelection;
private SerializedProperty _branchSelection;
#nullable enable
private SelectionFilter _selectedFilter = SelectionFilter.Children;
public void OnEnable()
{
_accountSelection = serializedObject.FindProperty(
$"<{nameof(SpeckleSender.Account)}>k__BackingField"
);
_streamSelection = serializedObject.FindProperty(
$"<{nameof(SpeckleSender.Stream)}>k__BackingField"
);
_branchSelection = serializedObject.FindProperty(
$"<{nameof(SpeckleSender.Branch)}>k__BackingField"
);
}
public override async void OnInspectorGUI()
{
//Draw events in a collapsed region
DrawDefaultInspector();
//Selection
EditorGUILayout.PropertyField(_accountSelection);
EditorGUILayout.PropertyField(_streamSelection, new GUIContent("Project"));
EditorGUILayout.PropertyField(_branchSelection, new GUIContent("Model"));
bool shouldSend = GUILayout.Button("Send!");
_selectedFilter = (SelectionFilter)
@@ -77,10 +97,9 @@ namespace Speckle.ConnectorUnity.Components.Editor
),
};
//TODO onError action?
if (data["@objects"] is IList l && l.Count == 0)
{
Debug.LogWarning($"Nothing to send", speckleSender);
Debug.LogWarning("Nothing to send", speckleSender);
return null;
}
@@ -79,12 +79,6 @@ namespace Speckle.ConnectorUnity.NativeCache.Editor
return _readCache.TrySaveObject(speckleObject, nativeObject);
}
public override void BeginWrite()
{
base.BeginWrite();
//AssetDatabase.StartAssetEditing();
}
public override void FinishWrite()
{
if (!isWriting)
@@ -1,6 +1,7 @@
#nullable enable
using System;
using System.Collections.Generic;
using System.Globalization;
using Speckle.Core.Api;
using Speckle.Core.Credentials;
using UnityEditor;
@@ -45,12 +46,12 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection.Editor
details = new (string, Func<Stream, string>)[]
{
("Stream id", s => s.id),
("Project id", s => s.id),
("Description", s => s.description),
("Is Public", s => s.isPublic.ToString()),
("Role", s => s.role),
("Created at", s => s.createdAt.ToString()),
("Updated at", s => s.updatedAt.ToString()),
("Created at", s => s.createdAt.ToString(CultureInfo.InvariantCulture)),
("Updated at", s => s.updatedAt.ToString(CultureInfo.InvariantCulture)),
};
}
}
@@ -70,7 +71,11 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection.Editor
$"<{nameof(BranchSelection.CommitsLimit)}>k__BackingField",
};
details = new (string, Func<Branch, string>)[] { ("Description", s => s.description), };
details = new (string, Func<Branch, string>)[]
{
("Model Id", s => s.id),
("Description", s => s.description),
};
}
}
@@ -83,9 +88,9 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection.Editor
{
details = new (string, Func<Commit, string>)[]
{
("Commit Id", s => s.id),
("Version Id", s => s.id),
("Author Name", s => s.authorName),
("Created At", s => s.createdAt.ToString()),
("Created At", s => s.createdAt.ToString(CultureInfo.InvariantCulture)),
("Source Application", s => s.sourceApplication),
("Reference Object Id", s => s.referencedObject),
};
@@ -108,9 +113,9 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection.Editor
protected (string, Func<TOption, string>)[] details = { };
private string[] GetFormattedOptions(TOption[] options)
private string[] GetFormattedOptions(IReadOnlyList<TOption> options)
{
int optionsCount = options.Length;
int optionsCount = options.Count;
string[] choices = new string[optionsCount];
for (int i = 0; i < optionsCount; i++)
{
@@ -182,10 +187,10 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection.Editor
var provider = ScriptableObject.CreateInstance<StringListSearchProvider>();
provider.Title = typeof(TOption).Name;
provider.listItems = GetFormattedOptions(t.Options);
;
provider.onSetIndexCallback = o =>
{
t.SelectedIndex = o;
t.Selected = t.Options[o];
};
SearchWindow.Open(new SearchWindowContext(windowPos), provider);
}
@@ -260,7 +265,7 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection.Editor
public List<SearchTreeEntry> CreateSearchTree(SearchWindowContext context)
{
List<SearchTreeEntry> searchList =
new(listItems.Length + 1) { new SearchTreeGroupEntry(new GUIContent(Title), 0) };
new(listItems.Length + 1) { new SearchTreeGroupEntry(new GUIContent(Title)) };
for (int i = 0; i < listItems.Length; i++)
{
@@ -275,9 +280,9 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection.Editor
return searchList;
}
public bool OnSelectEntry(SearchTreeEntry SearchTreeEntry, SearchWindowContext context)
public bool OnSelectEntry(SearchTreeEntry searchTreeEntry, SearchWindowContext context)
{
onSetIndexCallback?.Invoke((int)SearchTreeEntry.userData);
onSetIndexCallback?.Invoke((int)searchTreeEntry.userData);
return true;
}
@@ -18,25 +18,26 @@ namespace Speckle.ConnectorUnity.Wrappers.Editor
{
private static readonly string[] SpeckleTypeOptionStrings;
private static readonly Type[] SpeckleTypeOptions;
private static HashSet<string> ArrayFoldoutState = new();
private static bool instancePropFoldoutState = true;
private static bool dynamicPropFoldoutState = true;
private static bool isEditMode = false;
private static bool isEditMode;
static SpecklePropertiesEditor()
{
var options = typeof(Mesh).Assembly
.GetTypes()
.Where(x => x.IsSubclassOf(typeof(Base)) && !x.IsAbstract).ToList();
.Where(x => x.IsSubclassOf(typeof(Base)) && !x.IsAbstract)
.ToList();
var strings = options
.Where(x => x.FullName != null)
.Select(x => x.FullName!.Replace('.', '/'));
var manualTypes = new [] { typeof(Base), typeof(Collection)};
var manualStrings = new []{ nameof(Base), nameof(Collection)};
var manualTypes = new[] { typeof(Base), typeof(Collection) };
var manualStrings = new[] { nameof(Base), nameof(Collection) };
//Manually Add `Base`
SpeckleTypeOptions = options.Concat(manualTypes).ToArray();
SpeckleTypeOptionStrings = strings.Concat(manualStrings).ToArray();
@@ -45,64 +46,82 @@ namespace Speckle.ConnectorUnity.Wrappers.Editor
}
private static GUILayoutOption[] propLayoutOptions = { GUILayout.ExpandWidth(true) };
public override void OnInspectorGUI()
{
SpeckleProperties properties = (SpeckleProperties)target;
//Edit Mode
isEditMode = EditorGUILayout.ToggleLeft("Enable Inspector Edit Mode (experimental)", isEditMode);
isEditMode = EditorGUILayout.ToggleLeft(
"Enable Inspector Edit Mode (experimental)",
isEditMode
);
if (isEditMode)
{
GUILayout.Label(
"Modifying properties through the inspector is experimental and can lead to invalid objects, proceed at your own risk!",
EditorStyles.helpBox);
EditorStyles.helpBox
);
GUILayout.Space(10);
}
GUI.enabled = isEditMode;
// SpeckleType
GUILayout.Label("Speckle Type: ", EditorStyles.boldLabel );
GUILayout.Label("Speckle Type: ", EditorStyles.boldLabel);
var oldIndex = Array.IndexOf(SpeckleTypeOptions, properties.SpeckleType);
var speckleTypeSelectedIndex = EditorGUILayout.Popup(oldIndex, SpeckleTypeOptionStrings);
if(oldIndex != speckleTypeSelectedIndex && speckleTypeSelectedIndex >= 0)
var speckleTypeSelectedIndex = EditorGUILayout.Popup(
oldIndex,
SpeckleTypeOptionStrings
);
if (oldIndex != speckleTypeSelectedIndex && speckleTypeSelectedIndex >= 0)
{
properties.SpeckleType = SpeckleTypeOptions[speckleTypeSelectedIndex];
}
// Instance Properties
var InstancePropertyNames = DynamicBase.GetInstanceMembersNames(properties.SpeckleType);
instancePropFoldoutState = EditorGUILayout.Foldout(instancePropFoldoutState, "Instance Properties: ", EditorStyles.foldoutHeader);
var instancePropertyNames =
(IReadOnlyCollection<string>)
DynamicBase.GetInstanceMembersNames(properties.SpeckleType);
instancePropFoldoutState = EditorGUILayout.Foldout(
instancePropFoldoutState,
"Instance Properties: ",
EditorStyles.foldoutHeader
);
if (instancePropFoldoutState)
{
foreach (var propName in InstancePropertyNames)
foreach (var propName in instancePropertyNames)
{
if (!properties.Data.TryGetValue(propName, out object? existingValue)) continue;
if (!properties.Data.TryGetValue(propName, out object? existingValue))
continue;
var newValue = CreateField(existingValue, propName, propLayoutOptions);
if(newValue != existingValue)
if (newValue != existingValue)
properties.Data[propName] = newValue;
}
}
GUILayout.Space(10);
dynamicPropFoldoutState = EditorGUILayout.Foldout(dynamicPropFoldoutState, "Dynamic Properties:", EditorStyles.foldoutHeader);
dynamicPropFoldoutState = EditorGUILayout.Foldout(
dynamicPropFoldoutState,
"Dynamic Properties:",
EditorStyles.foldoutHeader
);
if (dynamicPropFoldoutState)
{
var ignoreSet = InstancePropertyNames.ToImmutableHashSet();
var ignoreSet = instancePropertyNames.ToImmutableHashSet();
foreach (var kvp in properties.Data)
{
if (ignoreSet.Contains(kvp.Key)) continue;
if (ignoreSet.Contains(kvp.Key))
continue;
var existingValue = kvp.Value;
var newValue = CreateField(existingValue, kvp.Key, propLayoutOptions);
if(newValue != existingValue)
if (newValue != existingValue)
properties.Data[kvp.Key] = newValue;
GUILayout.Space(10);
}
}
@@ -118,13 +137,18 @@ namespace Speckle.ConnectorUnity.Wrappers.Editor
_ => CreateFieldPrimitive(v, propName, options),
};
if (ret != null) return ret;
EditorGUILayout.TextField(propName, v == null? "NULL" : v.ToString());
if (ret != null)
return ret;
EditorGUILayout.TextField(propName, v == null ? "NULL" : v.ToString());
return v;
}
private static object? CreateFieldPrimitive(object? v, string propName, params GUILayoutOption[] options)
private static object? CreateFieldPrimitive(
object? v,
string propName,
params GUILayoutOption[] options
)
{
return v switch
{
@@ -135,11 +159,19 @@ namespace Speckle.ConnectorUnity.Wrappers.Editor
string s => EditorGUILayout.TextField(propName, s, options),
bool b => EditorGUILayout.Toggle(propName, b, options),
Enum e => EditorGUILayout.EnumPopup(propName, e, options),
Point p => PointToVector3(EditorGUILayout.Vector3Field(propName, new Vector3((float)p.x, (float)p.z, (float)p.z), options), p),
Point p
=> PointToVector3(
EditorGUILayout.Vector3Field(
propName,
new Vector3((float)p.x, (float)p.z, (float)p.z),
options
),
p
),
_ => null,
};
}
private static Point PointToVector3(Vector3 vector, Point p)
{
p.x = vector.x;
@@ -147,10 +179,13 @@ namespace Speckle.ConnectorUnity.Wrappers.Editor
p.z = vector.z;
return p;
}
private IList ArrayField(string propName, IList list, params GUILayoutOption[] options)
{
bool isExpanded = EditorGUILayout.Foldout(ArrayFoldoutState.Contains(propName), propName);
bool isExpanded = EditorGUILayout.Foldout(
ArrayFoldoutState.Contains(propName),
propName
);
if (isExpanded)
{
ArrayFoldoutState.Add(propName);
@@ -158,10 +193,13 @@ namespace Speckle.ConnectorUnity.Wrappers.Editor
{
object? item = list[i];
var r = CreateFieldPrimitive(item, i.ToString(), options);
if (r == null)
{
EditorGUILayout.TextField(i.ToString(), item == null? "NULL" : item.ToString());
EditorGUILayout.TextField(
i.ToString(),
item == null ? "NULL" : item.ToString()
);
continue;
}
//Update list item
@@ -175,6 +213,5 @@ namespace Speckle.ConnectorUnity.Wrappers.Editor
return list;
}
}
}
@@ -64,7 +64,7 @@ namespace Speckle.ConnectorUnity
cancellationTokenSource = new CancellationTokenSource();
var client = new Client(account ?? AccountManager.GetDefaultAccount());
var client = new Client(account ?? AccountManager.GetDefaultAccount()!);
transport = new ServerTransport(client.Account, streamId);
transport.CancellationToken = cancellationTokenSource.Token;
@@ -49,7 +49,8 @@ namespace Speckle.ConnectorUnity.Components
);
var accountTask = new Utils.Utils.WaitForTask<Account>(
async () => await GetAccount(sw)
async () => await GetAccount(sw),
_tokenSource.Token
);
yield return accountTask;
@@ -57,8 +58,10 @@ namespace Speckle.ConnectorUnity.Components
using Client c = new(accountTask.Result);
var objectIdTask = new Utils.Utils.WaitForTask<(string, Commit?)>(
async () => await GetObjectID(sw, c)
async () => await GetObjectID(sw, c),
_tokenSource.Token
);
yield return objectIdTask;
(string objectId, Commit? commit) = objectIdTask.Result;
@@ -72,7 +75,8 @@ namespace Speckle.ConnectorUnity.Components
objectId,
commit,
cancellationToken: _tokenSource.Token
)
),
_tokenSource.Token
);
yield return receiveTask;
@@ -92,7 +92,7 @@ namespace Speckle.ConnectorUnity.Components
public bool WasSuccessful() => this.exception == null;
public Base SpeckleObject => traversalContext.current;
public Base SpeckleObject => traversalContext.Current;
}
public partial class RecursiveConverter
@@ -143,7 +143,7 @@ namespace Speckle.ConnectorUnity.Components
var objectsToConvert = traversalFunc
.Traverse(rootObject)
.Where(x => ConverterInstance.CanConvertToNative(x.current))
.Where(x => ConverterInstance.CanConvertToNative(x.Current))
.Where(x => userPredicate(x));
Dictionary<Base, GameObject?> created = new();
@@ -186,9 +186,9 @@ namespace Speckle.ConnectorUnity.Components
{
Transform? currentParent = GetParent(tc, outCreatedObjects) ?? parent;
var converted = ConvertToNative(tc.current, currentParent);
var converted = ConvertToNative(tc.Current, currentParent);
result = new ConversionResult(tc, converted);
outCreatedObjects.TryAdd(tc.current, result.converted);
outCreatedObjects.TryAdd(tc.Current, result.converted);
}
catch (Exception ex)
{
@@ -209,11 +209,11 @@ namespace Speckle.ConnectorUnity.Components
if (tc == null)
return null; //We've reached the root object, and still not found a converted parent
if (createdObjects.TryGetValue(tc.current, out GameObject? p) && p != null)
if (createdObjects.TryGetValue(tc.Current, out GameObject? p) && p != null)
return p.transform;
//Go one level up, and repeat!
return GetParent(tc.parent, createdObjects);
return GetParent(tc.Parent, createdObjects);
}
protected GameObject ConvertToNative(Base speckleObject, Transform? parentTransform)
@@ -327,7 +327,18 @@ namespace Speckle.ConnectorUnity.Components
{
object? converted = null;
if (predicate(baseObject))
converted = ConverterInstance.ConvertToNative(baseObject);
{
try
{
converted = ConverterInstance.ConvertToNative(baseObject);
}
catch (Exception ex) when (!ex.IsFatal())
{
Debug.LogWarning(
$"Failed to convert {baseObject.speckle_type} - {baseObject.id}\n{ex}"
);
}
}
// Handle new GameObjects
Transform? nextParent = parent;
@@ -77,16 +77,13 @@ namespace Speckle.ConnectorUnity.Components
return true;
}
/// <summary>
/// Receive the selected <see cref="Commit"/> object, and converts ToNative as children of <paramref name="parent"/>
/// </summary>
/// <param name="parent">Optional parent <see cref="Transform"/> for the created root <see cref="GameObject"/>s</param>
/// <param name="predicate">A filter function to allow for selectively excluding certain objects from being converted</param>
/// <remarks>function does not throw, instead calls <see cref="OnErrorAction"/>, and calls <see cref="OnComplete"/> upon completion</remarks>
/// <seealso cref="ReceiveAsync(System.Threading.CancellationToken)"/>
/// <seealso cref="RecursiveConverter.RecursivelyConvertToNative_Enumerable"/>
/// <inheritdoc cref="ReceiveAndConvert_Async"/>
/// <example>
/// This function is designed to run as a coroutine i.e.
/// <c>StartCoroutine(mySpeckleReceiver.ReceiveAndConvert_Routine());</c>
/// </example>
public IEnumerator ReceiveAndConvert_Routine(
Transform? parent,
Transform? parent = null,
Predicate<TraversalContext>? predicate = null
)
{
@@ -130,9 +127,16 @@ namespace Speckle.ConnectorUnity.Components
FinishOperation();
}
/// <inheritdoc cref="ReceiveAndConvert_Routine"/>
/// <summary>
/// Receive the selected <see cref="Commit"/> object, and converts ToNative as children of <paramref name="parent"/>
/// </summary>
/// <param name="parent">Optional parent <see cref="Transform"/> for the created root <see cref="GameObject"/>s</param>
/// <param name="predicate">A filter function to allow for selectively excluding certain objects from being converted</param>
/// <remarks>function does not throw, instead calls <see cref="OnErrorAction"/>, and calls <see cref="OnComplete"/> upon completion</remarks>
/// <seealso cref="ReceiveAsync(System.Threading.CancellationToken)"/>
/// <seealso cref="RecursiveConverter.RecursivelyConvertToNative_Enumerable"/>
public async void ReceiveAndConvert_Async(
Transform? parent,
Transform? parent = null,
Predicate<TraversalContext>? predicate = null
)
{
@@ -196,15 +200,15 @@ namespace Speckle.ConnectorUnity.Components
{
Client? selectedClient = Account.Client;
client =
selectedClient ?? throw new InvalidOperationException("Invalid account selection");
selectedClient ?? throw new InvalidOperationException("Invalid Speckle account selection");
Stream? selectedStream = Stream.Selected;
stream =
selectedStream ?? throw new InvalidOperationException("Invalid stream selection");
selectedStream ?? throw new InvalidOperationException("Invalid Speckle project selection");
Commit? selectedCommit = Commit.Selected;
commit =
selectedCommit ?? throw new InvalidOperationException("Invalid commit selection");
selectedCommit ?? throw new InvalidOperationException("Invalid Speckle version selection");
}
/// <summary>
@@ -255,42 +259,20 @@ namespace Speckle.ConnectorUnity.Components
CancellationToken cancellationToken = default
)
{
using var transport = new ServerTransportV2(client.Account, streamId);
using var transport = new ServerTransport(client.Account, streamId);
transport.CancellationToken = cancellationToken;
cancellationToken.ThrowIfCancellationRequested();
Base? requestedObject = await Operations
Base requestedObject = await Operations
.Receive(
objectId: objectId,
cancellationToken: cancellationToken,
remoteTransport: transport,
onProgressAction: onProgressAction,
onErrorAction: (s, ex) =>
{
//Don't wrap cancellation exceptions!
if (ex is OperationCanceledException)
throw ex;
//HACK: Sometimes, the task was cancelled, and Operations.Receive doesn't fail in a reliable way. In this case, the exception is often simply a symptom of a cancel.
if (cancellationToken.IsCancellationRequested)
{
SpeckleLog.Logger.Warning(
ex,
"A task was cancelled, ignoring potentially symptomatic exception"
);
cancellationToken.ThrowIfCancellationRequested();
}
//Treat all operation errors as fatal
throw new SpeckleException(
$"Failed to receive requested object {objectId} from server: {s}",
ex
);
},
onTotalChildrenCountKnown: onTotalChildrenCountKnown,
disposeTransports: false
objectId,
transport,
null,
onProgressAction,
onTotalChildrenCountKnown,
cancellationToken
)
.ConfigureAwait(false);
@@ -313,9 +295,6 @@ namespace Speckle.ConnectorUnity.Components
}
);
if (requestedObject == null)
throw new SpeckleException($"Operation {nameof(Operations.Receive)} returned null");
cancellationToken.ThrowIfCancellationRequested();
//Read receipt
@@ -323,7 +302,6 @@ namespace Speckle.ConnectorUnity.Components
{
await client
.CommitReceived(
cancellationToken,
new CommitReceivedInput
{
streamId = streamId,
@@ -332,14 +310,15 @@ namespace Speckle.ConnectorUnity.Components
sourceApplication = HostApplications.Unity.GetVersion(
CoreUtils.GetHostAppVersion()
)
}
},
cancellationToken
)
.ConfigureAwait(false);
}
catch (Exception e)
catch (Exception ex)
{
// Do nothing!
Debug.LogWarning($"Failed to send read receipt\n{e}");
Debug.LogWarning($"Failed to send read receipt\n{ex}");
}
return requestedObject;
@@ -443,12 +422,9 @@ namespace Speckle.ConnectorUnity.Components
/// <summary>
/// Fetches the commit preview for the currently selected commit
/// </summary>
/// <param name="allAngles">when <see langword="true"/>, will fetch 360 degree preview image</param>
/// <param name="callback">Callback function to be called when the web request completes</param>
/// <returns>The executing <see cref="Coroutine"/> or <see langword="null"/> if <see cref="Account"/>, <see cref="Stream"/>, or <see cref="Commit"/> was <see langword="null"/></returns>
public Coroutine? GetPreviewImage( /*bool allAngles,*/
Action<Texture2D?> callback
)
public Coroutine? GetPreviewImage(Action<Texture2D?> callback)
{
Account? account = Account.Selected;
if (account == null)
@@ -469,28 +445,28 @@ namespace Speckle.ConnectorUnity.Components
}
#if UNITY_EDITOR
[ContextMenu("Open Speckle Stream in Browser")]
[ContextMenu("Open Speckle Model in Browser")]
protected void OpenUrlInBrowser()
{
string url = GetSelectedUrl();
Application.OpenURL(url);
Uri url = GetSelectedUrl();
Application.OpenURL(url.ToString());
}
#endif
public string GetSelectedUrl()
public Uri GetSelectedUrl()
{
string serverUrl = Account.Selected!.serverInfo.url;
string? streamId = Stream.Selected?.id;
string? branchName = Branch.Selected?.name;
string? commitId = Commit.Selected?.id;
Account selectedAccount = Account.Selected!;
StreamWrapper sw =
new()
{
ServerUrl = selectedAccount.serverInfo.url,
StreamId = Stream.Selected!.id,
BranchName = Branch.Selected?.id,
CommitId = Commit.Selected?.id
};
sw.SetAccount(selectedAccount);
if (string.IsNullOrEmpty(streamId))
return serverUrl;
if (!string.IsNullOrEmpty(commitId))
return $"{serverUrl}/streams/{streamId}/commits/{commitId}";
if (!string.IsNullOrEmpty(branchName))
return $"{serverUrl}/streams/{streamId}/branches/{branchName}";
return $"{serverUrl}/streams/{streamId}";
return sw.ToServerUri();
}
public void Awake()
@@ -510,7 +486,7 @@ namespace Speckle.ConnectorUnity.Components
Branch.Initialise();
Commit.Initialise();
Commit.OnSelectionChange = () => OnCommitSelectionChange?.Invoke(Commit.Selected);
if (Account.Options is not { Length: > 0 } || forceRefresh)
if (Account.Options is not { Count: > 0 } || forceRefresh)
Account.RefreshOptions();
}
@@ -536,7 +512,7 @@ namespace Speckle.ConnectorUnity.Components
#region Deprecated members
[Obsolete("use " + nameof(ReceiveAndConvertRoutine), true)]
[Obsolete("use " + nameof(ReceiveAndConvert_Routine), true)]
public IEnumerator ReceiveAndConvertRoutine(
SpeckleReceiver speckleReceiver,
string rootObjectName,
@@ -36,6 +36,7 @@ namespace Speckle.ConnectorUnity.Components
[HideInInspector]
public BranchSelectionEvent OnBranchSelectionChange;
[Obsolete("No longer used")]
[HideInInspector]
public ErrorActionEvent OnErrorAction;
@@ -61,40 +62,44 @@ namespace Speckle.ConnectorUnity.Components
)
throw new SpeckleException(error);
ServerTransport transport = new ServerTransport(client.Account, stream.id);
using ServerTransport transport = new(client.Account, stream.id);
transport.CancellationToken = CancellationTokenSource.Token;
return await SendDataAsync(
CancellationTokenSource.Token,
remoteTransport: transport,
data: data,
client: client,
branchName: branch.name,
createCommit: createCommit,
onProgressAction: dict => OnSendProgressAction.Invoke(dict),
onErrorAction: (m, e) => OnErrorAction.Invoke(m, e)
data,
client,
branch.id,
createCommit,
dict => OnSendProgressAction.Invoke(dict),
CancellationTokenSource.Token
);
}
/// <param name="remoteTransport">The transport to send to</param>
/// <param name="data">The data to send</param>
/// <param name="client">An authenticated Speckle Client</param>
/// <param name="branchId">The branch name or id</param>
/// <param name="createCommit">when <see langword="true"/> will call <see cref="Client.CommitCreate"/>, otherwise only the object data is sent</param>
/// <param name="onProgressAction">Called every progress tick of the <see cref="Operations.Send"/></param>
/// <param name="cancellationToken">Optional cancellation token</param>
/// <returns>The id (hash) of the object sent</returns>
public static async Task<string> SendDataAsync(
CancellationToken cancellationToken,
ServerTransport remoteTransport,
Base data,
Client client,
string branchName,
string branchId,
bool createCommit,
Action<ConcurrentDictionary<string, int>>? onProgressAction = null,
Action<string, Exception>? onErrorAction = null
CancellationToken cancellationToken = default
)
{
string res = await Operations.Send(
data,
cancellationToken: cancellationToken,
new List<ITransport> { remoteTransport },
useDefaultCache: true,
disposeTransports: true,
onProgressAction: onProgressAction,
onErrorAction: onErrorAction
remoteTransport,
true,
onProgressAction,
cancellationToken
);
Analytics.TrackEvent(
@@ -115,15 +120,26 @@ namespace Speckle.ConnectorUnity.Components
string commitMessage = $"Sent {data.totalChildrenCount} objects from {unityVer}";
string commitId = await CreateCommit(
cancellationToken,
data,
client,
streamId,
branchName,
branchId,
res,
commitMessage
commitMessage,
cancellationToken
);
string url = $"{client.ServerUrl}/streams/{streamId}/commits/{commitId}";
StreamWrapper sw =
new()
{
ServerUrl = client.ServerUrl,
StreamId = streamId,
BranchName = branchId,
CommitId = commitId,
};
sw.SetAccount(client.Account);
string url = sw.ToServerUri().GetLeftPart(UriPartial.Path);
Debug.Log($"Data successfully sent to <a href=\"{url}\">{url}</a>");
}
@@ -131,17 +147,16 @@ namespace Speckle.ConnectorUnity.Components
}
public static async Task<string> CreateCommit(
CancellationToken cancellationToken,
Base data,
Client client,
string streamId,
string branchName,
string objectId,
string message
string message,
CancellationToken cancellationToken
)
{
string commitId = await client.CommitCreate(
cancellationToken,
new CommitCreateInput
{
streamId = streamId,
@@ -152,7 +167,8 @@ namespace Speckle.ConnectorUnity.Components
CoreUtils.GetHostAppVersion()
),
totalChildrenCount = (int)data.totalChildrenCount,
}
},
cancellationToken
);
return commitId;
@@ -230,7 +246,7 @@ namespace Speckle.ConnectorUnity.Components
Stream.Initialise();
Branch.Initialise();
Branch.OnSelectionChange = () => OnBranchSelectionChange?.Invoke(Branch.Selected);
if (Account.Options is not { Length: > 0 } || forceRefresh)
if (Account.Options is not { Count: > 0 } || forceRefresh)
Account.RefreshOptions();
}
@@ -249,5 +265,28 @@ namespace Speckle.ConnectorUnity.Components
{
Initialise();
}
[Obsolete("use other overload")]
public static async Task<string> SendDataAsync(
CancellationToken cancellationToken,
ServerTransport remoteTransport,
Base data,
Client client,
string branchName,
bool createCommit,
Action<ConcurrentDictionary<string, int>>? onProgressAction = null,
Action<string, Exception>? onErrorAction = null
)
{
return await SendDataAsync(
remoteTransport,
data,
client,
branchName,
createCommit,
onProgressAction,
cancellationToken
);
}
}
}
@@ -47,21 +47,27 @@ namespace Objects.Converter.Unity
public Vector3 VectorFromPoint(Point p) => VectorByCoordinates(p.x, p.y, p.z, p.units);
/// <summary>
///
/// </summary>
/// <param name="arr"></param>
/// <param name="arr">flat list of x,y,z values</param>
/// <param name="units"></param>
/// <returns></returns>
public Vector3[] ArrayToPoints(IList<double> arr, string units)
/// <exception cref="ArgumentException">Length of <paramref name="arr"/> must be a multiple of 3</exception>
public Vector3[] ArrayToPoints(IReadOnlyList<double> arr, string units)
{
if (arr.Count % 3 != 0)
throw new Exception("Array malformed: length not a multiple of 3");
{
throw new ArgumentException(
"Array malformed: length not a multiple of 3",
nameof(arr)
);
}
Vector3[] points = new Vector3[arr.Count / 3];
var f = GetConversionFactor(units);
double f = GetConversionFactor(units);
for (int i = 2, k = 0; i < arr.Count; i += 3)
{
points[k++] = VectorByCoordinates(arr[i - 2], arr[i - 1], arr[i], f);
}
return points;
}
@@ -70,13 +76,7 @@ namespace Objects.Converter.Unity
#region ToSpeckle
//TODO: more of these
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
[Obsolete("", true)]
public virtual Point PointToSpeckle(Vector3 p)
{
//switch y and z
@@ -117,7 +117,7 @@ namespace Objects.Converter.Unity
{
Vector3 newPt = VectorByCoordinates(point.x, point.y, point.z, point.units);
var go = NewPointBasedGameObject(new Vector3[] { newPt, newPt }, point.speckle_type);
var go = NewPointBasedGameObject(new[] { newPt, newPt }, point.speckle_type);
return go;
}
@@ -352,30 +352,30 @@ namespace Objects.Converter.Unity
public Matrix4x4 TransformToNativeMatrix(STransform speckleTransform)
{
var sf = GetConversionFactor(speckleTransform.units);
var smatrix = speckleTransform.matrix;
var sMatrix = speckleTransform.matrix;
return new Matrix4x4
{
// Left (X -> X)
[0, 0] = smatrix.M11,
[2, 0] = smatrix.M21,
[1, 0] = smatrix.M31,
[3, 0] = smatrix.M41,
[0, 0] = (float)sMatrix.M11,
[2, 0] = (float)sMatrix.M21,
[1, 0] = (float)sMatrix.M31,
[3, 0] = (float)sMatrix.M41,
//Up (Z -> Y)
[0, 2] = smatrix.M12,
[2, 2] = smatrix.M22,
[1, 2] = smatrix.M32,
[3, 2] = smatrix.M42,
[0, 2] = (float)sMatrix.M12,
[2, 2] = (float)sMatrix.M22,
[1, 2] = (float)sMatrix.M32,
[3, 2] = (float)sMatrix.M42,
//Forwards (Y -> Z)
[0, 1] = smatrix.M13,
[2, 1] = smatrix.M23,
[1, 1] = smatrix.M33,
[3, 1] = smatrix.M43,
[0, 1] = (float)sMatrix.M13,
[2, 1] = (float)sMatrix.M23,
[1, 1] = (float)sMatrix.M33,
[3, 1] = (float)sMatrix.M43,
//Translation
[0, 3] = (float)(smatrix.M14 * sf),
[2, 3] = (float)(smatrix.M24 * sf),
[1, 3] = (float)(smatrix.M34 * sf),
[3, 3] = smatrix.M44,
[0, 3] = (float)(sMatrix.M14 * sf),
[2, 3] = (float)(sMatrix.M24 * sf),
[1, 3] = (float)(sMatrix.M34 * sf),
[3, 3] = (float)sMatrix.M44,
};
}
@@ -10,9 +10,7 @@ using UnityEngine.Rendering;
using Material = UnityEngine.Material;
using Mesh = UnityEngine.Mesh;
using SMesh = Objects.Geometry.Mesh;
using SColor = System.Drawing.Color;
using Transform = UnityEngine.Transform;
using STransform = Objects.Other.Transform;
#nullable enable
namespace Objects.Converter.Unity
@@ -8,7 +8,6 @@ using UnityEngine;
using Material = UnityEngine.Material;
using SMesh = Objects.Geometry.Mesh;
using SColor = System.Drawing.Color;
using STransform = Objects.Other.Transform;
namespace Objects.Converter.Unity
{
@@ -76,7 +75,7 @@ namespace Objects.Converter.Unity
// 3. Otherwise, convert fresh!
string name = CoreUtils.GenerateObjectName(renderMaterial);
Color diffuse = renderMaterial.diffuse.ToUnityColor();
bool isOpaque = Math.Abs(renderMaterial.opacity - 1d) < Constants.Eps;
bool isOpaque = Math.Abs(renderMaterial.opacity - 1d) < Constants.EPS;
Color color = new(diffuse.r, diffuse.g, diffuse.b, (float)renderMaterial.opacity);
float metalic = (float)renderMaterial.metalness;
float gloss = 1f - (float)renderMaterial.roughness;
@@ -202,6 +202,18 @@ namespace Objects.Converter.Unity
return objects.Select(x => ConvertToNative(x)).ToList();
}
public object ConvertToNativeDisplayable(Base @object)
{
throw new NotImplementedException(
$"{nameof(ConvertToNativeDisplayable)} is not implemented by this converter, use {nameof(ConvertToNative)} instead"
);
}
public bool CanConvertToNativeDisplayable(Base @object)
{
throw new NotImplementedException();
}
public bool CanConvertToSpeckle(object @object)
{
switch (@object)
@@ -25,7 +25,8 @@
"Serilog.Sinks.Console": "4.1.0",
"Serilog.Sinks.Seq": "5.2.2",
"SerilogTimings": "3.0.1",
"Speckle.Newtonsoft.Json": "13.0.2"
"Speckle.Newtonsoft.Json": "13.0.2",
"System.DoubleNumerics": "3.1.3"
},
"runtime": {
"SpeckleCore2.dll": {}
@@ -444,6 +445,17 @@
}
}
},
"System.DoubleNumerics/3.1.3": {
"dependencies": {
"NETStandard.Library": "2.0.3"
},
"runtime": {
"lib/netstandard1.3/System.DoubleNumerics.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"System.Memory/4.5.4": {
"dependencies": {
"System.Buffers": "4.5.1",
@@ -863,6 +875,13 @@
"path": "system.collections.immutable/5.0.0",
"hashPath": "system.collections.immutable.5.0.0.nupkg.sha512"
},
"System.DoubleNumerics/3.1.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KRKEM/L3KBodjA9VOg3EifFVWUY6EOqaMB05UvPEDm7Zeby/kZW+4kdWUEPzW6xtkwf46p661L9NrbeeQhtLzw==",
"path": "system.doublenumerics/3.1.3",
"hashPath": "system.doublenumerics.3.1.3.nupkg.sha512"
},
"System.Memory/4.5.4": {
"type": "package",
"serviceable": true,
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: a85708f21043b0c458a3a77c0e09e4b8
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 1
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:
@@ -98,7 +98,7 @@ namespace Speckle.ConnectorUnity
yield return null;
}
private static Dispatcher _instance = null;
private static Dispatcher _instance;
public static bool Exists()
{
@@ -14,7 +14,7 @@ namespace Speckle.ConnectorUnity.NativeCache
[ExecuteAlways]
public abstract class AbstractNativeCache : ScriptableObject
{
protected bool isWriting = false;
protected bool isWriting;
public abstract bool TryGetObject<T>(
Base speckleObject,
[NotNullWhen(true)] out T? nativeObject
@@ -429,6 +429,17 @@
}
}
},
"System.DoubleNumerics/3.1.3": {
"dependencies": {
"NETStandard.Library": "2.0.3"
},
"runtime": {
"lib/netstandard1.3/System.DoubleNumerics.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"System.Memory/4.5.4": {
"dependencies": {
"System.Buffers": "4.5.1",
@@ -848,6 +859,13 @@
"path": "system.collections.immutable/5.0.0",
"hashPath": "system.collections.immutable.5.0.0.nupkg.sha512"
},
"System.DoubleNumerics/3.1.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KRKEM/L3KBodjA9VOg3EifFVWUY6EOqaMB05UvPEDm7Zeby/kZW+4kdWUEPzW6xtkwf46p661L9NrbeeQhtLzw==",
"path": "system.doublenumerics/3.1.3",
"hashPath": "system.doublenumerics.3.1.3.nupkg.sha512"
},
"System.Memory/4.5.4": {
"type": "package",
"serviceable": true,
@@ -14,6 +14,32 @@
Station equation direction for the corresponding station equation should be true for increasing or false for decreasing
</summary>
</member>
<member name="M:Objects.BuiltElements.Archicad.ComponentProperties.ToBase(System.Collections.Generic.List{Objects.BuiltElements.Archicad.ComponentProperties})">
<summary>
Turns a List of ComponentProperties into a Base so that it can be used with the Speckle properties prop
</summary>
<param name="componentPropertiesList"></param>
<returns></returns>
</member>
<member name="M:Objects.BuiltElements.Archicad.Property.ToBase(System.Collections.Generic.List{Objects.BuiltElements.Archicad.Property})">
<summary>
Turns a List of Property into a Base so that it can be used with the Speckle properties prop
</summary>
<param name="properties"></param>
<returns></returns>
</member>
<member name="M:Objects.BuiltElements.Archicad.PropertyGroup.ToBase(System.Collections.Generic.List{Objects.BuiltElements.Archicad.PropertyGroup})">
<summary>
Turns a List of PropertyGroup into a Base so that it can be used with the Speckle properties prop
</summary>
<param name="propertyGroups"></param>
<returns></returns>
</member>
<member name="M:Objects.BuiltElements.Area.#ctor(System.String,System.String,Objects.BuiltElements.Level,Objects.Geometry.Point)">
<summary>
SchemaBuilder constructor for an Area
</summary>
</member>
<member name="P:Objects.BuiltElements.Civil.CivilAlignment.parent">
<summary>
Name of parent alignment if this is an offset alignment
@@ -29,11 +55,238 @@
Name of parent profile if this is an offset profile
</summary>
</member>
<member name="M:Objects.BuiltElements.Area.#ctor(System.String,System.String,Objects.BuiltElements.Level,Objects.Geometry.Point)">
<member name="M:Objects.BuiltElements.Duct.#ctor(Objects.Geometry.Line,System.Double,System.Double,System.Double,System.Double)">
<summary>
SchemaBuilder constructor for a Room
SchemaBuilder constructor for a Speckle duct
</summary>
<param name="baseLine"></param>
<param name="width"></param>
<param name="height"></param>
<param name="diameter"></param>
<param name="velocity"></param>
<remarks>Assign units when using this constructor due to <paramref name="width"/>, <paramref name="height"/>, and <paramref name="diameter"/> params</remarks>
</member>
<member name="M:Objects.BuiltElements.Duct.#ctor(Objects.ICurve,System.Double,System.Double,System.Double,System.Double)">
<summary>
SchemaBuilder constructor for a Speckle duct
</summary>
<param name="baseCurve"></param>
<param name="width"></param>
<param name="height"></param>
<param name="diameter"></param>
<param name="velocity"></param>
<remarks>Assign units when using this constructor due to <paramref name="width"/>, <paramref name="height"/>, and <paramref name="diameter"/> params</remarks>
</member>
<member name="P:Objects.BuiltElements.Featureline.curve">
<summary>
The base curve of the featureline
</summary>
</member>
<member name="P:Objects.BuiltElements.Featureline.points">
<summary>
The points constructing the Featureline
</summary>
<remarks>
Can include both intersection and elevation points
</remarks>
</member>
<member name="P:Objects.BuiltElements.Featureline.displayValue">
<summary>
The 3D curves generated from the curve and points of the featureline
</summary>
</member>
<member name="M:Objects.BuiltElements.Level.#ctor(System.String,System.Double)">
<summary>
SchemaBuilder constructor for a Speckle level
</summary>
<param name="name"></param>
<param name="elevation"></param>
<remarks>Assign units when using this constructor due to <paramref name="elevation"/> param</remarks>
</member>
<member name="T:Objects.BuiltElements.Network">
<summary>
Represents graph connections between built elements objects
</summary>
<remarks>
Network <see cref="P:Objects.BuiltElements.Network.elements"/> may need to be created first in native applications before they are linked.
</remarks>
</member>
<member name="P:Objects.BuiltElements.Network.elements">
<summary>
The elements contained in the network
</summary>
</member>
<member name="P:Objects.BuiltElements.Network.links">
<summary>
The connections between <see cref="P:Objects.BuiltElements.Network.elements"/>
</summary>
</member>
<member name="P:Objects.BuiltElements.NetworkElement.elements">
<summary>
The Base object representing the element in the network (eg Pipe, Duct, etc)
</summary>
<remarks>
Currently named "elements" to assist with receiving in connector flatten method.
</remarks>
</member>
<member name="P:Objects.BuiltElements.NetworkElement.linkIndices">
<summary>
The index of the links in <see cref="P:Objects.BuiltElements.NetworkElement.network"/> that are connected to this element
</summary>
</member>
<member name="P:Objects.BuiltElements.NetworkElement.links">
<summary>
Retrieves the links for this element
</summary>
</member>
<member name="P:Objects.BuiltElements.NetworkLink.elementIndices">
<summary>
The index of the elements in <see cref="P:Objects.BuiltElements.NetworkLink.network"/> that are connected by this link
</summary>
</member>
<member name="P:Objects.BuiltElements.NetworkLink.elements">
<summary>
Retrieves the elements for this link
</summary>
</member>
<member name="T:Objects.BuiltElements.RebarGroup`1">
<summary>
A reinforcement bar group comprised of reinforcing bars of the same type and shape.
</summary>
<remarks>
This class is not suitable for freeform rebar, which can have multiple shapes.
</remarks>
</member>
<member name="P:Objects.BuiltElements.RebarGroup`1.shape">
<summary>
The shape of the rebar group
</summary>
</member>
<member name="P:Objects.BuiltElements.RebarGroup`1.number">
<summary>
The number of rebars in the rebar group
</summary>
<remarks>
Excluded end bars are not included in the count
</remarks>
</member>
<member name="P:Objects.BuiltElements.RebarGroup`1.hasFirstBar">
<summary>
Indicates if rebar set includes the first bar
</summary>
<remarks>
Only applicable to stirrup (transverse) rebar
</remarks>
</member>
<member name="P:Objects.BuiltElements.RebarGroup`1.hasLastBar">
<summary>
Indicates if rebar set includes the last bar
</summary>
<remarks>
Only applicable to stirrup (transverse) rebar
</remarks>
</member>
<member name="P:Objects.BuiltElements.RebarGroup`1.startHook">
<summary>
The start hook of bars in the rebar group
</summary>
<remarks>
Null indicates no start hook
</remarks>
</member>
<member name="P:Objects.BuiltElements.RebarGroup`1.endHook">
<summary>
The end hook of bars in the rebar group
</summary>
<remarks>
Null indicates no end hook
</remarks>
</member>
<member name="P:Objects.BuiltElements.RebarGroup`1.displayValue">
<summary>
The display representation of the rebar group as centerline curves
</summary>
</member>
<member name="P:Objects.BuiltElements.RebarGroup`1.volume">
<summary>
The total volume of the rebar group.
</summary>
</member>
<member name="T:Objects.BuiltElements.RebarShape">
<summary>
The shape describing the geometry and geometry parameters of a reinforcing bar
</summary>
</member>
<member name="P:Objects.BuiltElements.RebarShape.name">
<summary>
The name of the rebar shape
</summary>
</member>
<member name="P:Objects.BuiltElements.RebarShape.rebarType">
<summary>
The type of the rebar shape
</summary>
</member>
<member name="P:Objects.BuiltElements.RebarShape.curves">
<summary>
The curves of the rebar shape
</summary>
<remarks>
Typically suppresses hooks and bend radius
</remarks>
</member>
<member name="P:Objects.BuiltElements.RebarShape.barDiameter">
<summary>
The diameter of the rebar bar
</summary>
</member>
<member name="P:Objects.BuiltElements.RebarHook.angle">
<summary>
The angle of the hook in radians.
</summary>
</member>
<member name="P:Objects.BuiltElements.RebarHook.length">
<summary>
The length of the hook.
</summary>
</member>
<member name="P:Objects.BuiltElements.RebarHook.radius">
<summary>
The radius of the bend of the hook.
</summary>
</member>
<member name="M:Objects.BuiltElements.Revit.DirectShape.#ctor(System.String,Objects.BuiltElements.Revit.RevitCategory,System.Collections.Generic.List{Speckle.Core.Models.Base},System.Collections.Generic.List{Objects.BuiltElements.Revit.Parameter})">
<summary>
Constructs a new <see cref="T:Objects.BuiltElements.Revit.DirectShape"/> instance given a list of <see cref="T:Speckle.Core.Models.Base"/> objects.
</summary>
<param name="name">The name of the <see cref="T:Objects.BuiltElements.Revit.DirectShape"/></param>
<param name="category">The <see cref="T:Objects.BuiltElements.Revit.RevitCategory"/> of this instance.</param>
<param name="baseGeometries">A list of base classes to represent the direct shape (only mesh and brep are allowed, anything else will be ignored.)</param>
<param name="parameters">Optional Parameters for this instance.</param>
</member>
<member name="T:Objects.BuiltElements.Revit.RevitFamilyCategory">
<summary>
FamilyDocuments can only be assigned these categories
This is a subset of the list above which was manually retrieved from Revit's UI
</summary>
</member>
<member name="P:Objects.BuiltElements.Revit.FreeformElement.baseGeometry">
<summary>
DEPRECATED. Sets the geometry contained in the FreeformElement. This field has been deprecated in favor of `baseGeometries`
to align with Revit's API. It remains as a setter-only property for backwards compatibility.
It will set the first item on the baseGeometries list, and instantiate a list if necessary.
</summary>
</member>
<member name="P:Objects.BuiltElements.Revit.Parameter.isShared">
<summary>
If True it's a Shared Parameter, in which case the ApplicationId field will contain this parameter GUID,
otherwise it will store its BuiltInParameter name
</summary>
</member>
<member name="P:Objects.BuiltElements.Revit.Parameter.isTypeParameter">
<summary>
True = Type Parameter, False = Instance Parameter
</summary>
<remarks>Assign units when using this constructor due to <paramref name="height"/> param</remarks>
</member>
<member name="M:Objects.BuiltElements.Revit.RevitColumn.#ctor(System.String,System.String,Objects.ICurve,Objects.BuiltElements.Level,Objects.BuiltElements.Level,System.Double,System.Double,System.Boolean,System.Double,System.Collections.Generic.List{Objects.BuiltElements.Revit.Parameter})">
<summary>
@@ -102,6 +355,27 @@
<param name="parameters"></param>
<remarks>Assign units when using this constructor due to <paramref name="width"/>, <paramref name="height"/>, and <paramref name="diameter"/> params</remarks>
</member>
<member name="T:Objects.BuiltElements.Revit.RevitElement">
<summary>
A generic Revit element for which we don't have direct conversions
</summary>
</member>
<member name="T:Objects.BuiltElements.Revit.RevitSymbolElementType">
<summary>
Represents the FamilySymbol subclass of ElementType in Revit
</summary>
</member>
<member name="P:Objects.BuiltElements.Revit.RevitSymbolElementType.placementType">
<summary>
The type of placement for this family symbol
</summary>
<remarks> See https://www.revitapidocs.com/2023/2abb8627-1da3-4069-05c9-19e4be5e02ad.htm </remarks>
</member>
<member name="P:Objects.BuiltElements.Revit.RevitSymbolElementType.elements">
<summary>
Subcomponents found in this family symbol
</summary>
</member>
<member name="M:Objects.BuiltElements.Revit.RevitLevel.#ctor(System.String,System.Double,System.Boolean,System.Collections.Generic.List{Objects.BuiltElements.Revit.Parameter})">
<summary>
SchemaBuilder constructor for a Revit level
@@ -171,54 +445,6 @@
<param name="topLevel"></param>
<param name="parameters"></param>
</member>
<member name="M:Objects.BuiltElements.Revit.DirectShape.#ctor(System.String,Objects.BuiltElements.Revit.RevitCategory,System.Collections.Generic.List{Speckle.Core.Models.Base},System.Collections.Generic.List{Objects.BuiltElements.Revit.Parameter})">
<summary>
Constructs a new <see cref="T:Objects.BuiltElements.Revit.DirectShape"/> instance given a list of <see cref="T:Speckle.Core.Models.Base"/> objects.
</summary>
<param name="name">The name of the <see cref="T:Objects.BuiltElements.Revit.DirectShape"/></param>
<param name="category">The <see cref="T:Objects.BuiltElements.Revit.RevitCategory"/> of this instance.</param>
<param name="baseGeometries">A list of base classes to represent the direct shape (only mesh and brep are allowed, anything else will be ignored.)</param>
<param name="parameters">Optional Parameters for this instance.</param>
</member>
<member name="P:Objects.BuiltElements.Revit.FreeformElement.baseGeometry">
<summary>
DEPRECATED. Sets the geometry contained in the FreeformElement. This field has been deprecated in favor of `baseGeometries`
to align with Revit's API. It remains as a setter-only property for backwards compatibility.
It will set the first item on the baseGeometries list, and instantiate a list if necessary.
</summary>
</member>
<member name="P:Objects.BuiltElements.Revit.Parameter.isShared">
<summary>
If True it's a Shared Parameter, in which case the ApplicationId field will contain this parameter GUID,
otherwise it will store its BuiltInParameter name
</summary>
</member>
<member name="P:Objects.BuiltElements.Revit.Parameter.isTypeParameter">
<summary>
True = Type Parameter, False = Instance Parameter
</summary>
</member>
<member name="T:Objects.BuiltElements.Revit.RevitElement">
<summary>
A generic Revit element for which we don't have direct conversions
</summary>
</member>
<member name="T:Objects.BuiltElements.Revit.RevitSymbolElementType">
<summary>
Represents the FamilySymbol subclass of ElementType in Revit
</summary>
</member>
<member name="P:Objects.BuiltElements.Revit.RevitSymbolElementType.placementType">
<summary>
The type of placement for this family symbol
</summary>
<remarks> See https://www.revitapidocs.com/2023/2abb8627-1da3-4069-05c9-19e4be5e02ad.htm </remarks>
</member>
<member name="P:Objects.BuiltElements.Revit.RevitSymbolElementType.elements">
<summary>
Subcomponents found in this family symbol
</summary>
</member>
<member name="M:Objects.BuiltElements.Revit.RevitRoof.RevitExtrusionRoof.#ctor(System.String,System.String,System.Double,System.Double,Objects.Geometry.Line,Objects.BuiltElements.Level,System.Collections.Generic.List{Speckle.Core.Models.Base},System.Collections.Generic.List{Objects.BuiltElements.Revit.Parameter})">
<summary>
SchemaBuilder constructor for a Revit extrusion roof
@@ -267,103 +493,17 @@
<param name="parameters"></param>
<remarks>Assign units when using this constructor due to <paramref name="height"/>, <paramref name="baseOffset"/>, and <paramref name="topOffset"/> params</remarks>
</member>
<member name="M:Objects.BuiltElements.Duct.#ctor(Objects.Geometry.Line,System.Double,System.Double,System.Double,System.Double)">
<summary>
SchemaBuilder constructor for a Speckle duct
</summary>
<param name="baseLine"></param>
<param name="width"></param>
<param name="height"></param>
<param name="diameter"></param>
<param name="velocity"></param>
<remarks>Assign units when using this constructor due to <paramref name="width"/>, <paramref name="height"/>, and <paramref name="diameter"/> params</remarks>
</member>
<member name="M:Objects.BuiltElements.Duct.#ctor(Objects.ICurve,System.Double,System.Double,System.Double,System.Double)">
<summary>
SchemaBuilder constructor for a Speckle duct
</summary>
<param name="baseCurve"></param>
<param name="width"></param>
<param name="height"></param>
<param name="diameter"></param>
<param name="velocity"></param>
<remarks>Assign units when using this constructor due to <paramref name="width"/>, <paramref name="height"/>, and <paramref name="diameter"/> params</remarks>
</member>
<member name="P:Objects.BuiltElements.Featureline.curve">
<summary>
The base curve of the featureline
</summary>
</member>
<member name="P:Objects.BuiltElements.Featureline.points">
<summary>
The points constructing the Featureline
</summary>
<remarks>
Can include both intersection and elevation points
</remarks>
</member>
<member name="P:Objects.BuiltElements.Featureline.displayValue">
<summary>
The 3D curves generated from the curve and points of the featureline
</summary>
</member>
<member name="M:Objects.BuiltElements.Level.#ctor(System.String,System.Double)">
<summary>
SchemaBuilder constructor for a Speckle level
</summary>
<param name="name"></param>
<param name="elevation"></param>
<remarks>Assign units when using this constructor due to <paramref name="elevation"/> param</remarks>
</member>
<member name="T:Objects.BuiltElements.Network">
<summary>
Represents graph connections between built elements objects
</summary>
<remarks>
Network <see cref="P:Objects.BuiltElements.Network.elements"/> may need to be created first in native applications before they are linked.
</remarks>
</member>
<member name="P:Objects.BuiltElements.Network.elements">
<summary>
The elements contained in the network
</summary>
</member>
<member name="P:Objects.BuiltElements.Network.links">
<summary>
The connections between <see cref="P:Objects.BuiltElements.Network.elements"/>
</summary>
</member>
<member name="P:Objects.BuiltElements.NetworkElement.linkIndices">
<summary>
The index of the links in <see cref="P:Objects.BuiltElements.NetworkElement.network"/> that are connected to this element
</summary>
</member>
<member name="P:Objects.BuiltElements.NetworkElement.links">
<summary>
Retrieves the links for this element
</summary>
</member>
<member name="P:Objects.BuiltElements.NetworkLink.elementIndices">
<summary>
The index of the elements in <see cref="P:Objects.BuiltElements.NetworkLink.network"/> that are connected by this link
</summary>
</member>
<member name="P:Objects.BuiltElements.NetworkLink.elements">
<summary>
Retrieves the elements for this link
</summary>
</member>
<member name="M:Objects.BuiltElements.Room.#ctor(System.String,System.String,Objects.BuiltElements.Level,Objects.Geometry.Point)">
<summary>
SchemaBuilder constructor for a Room
</summary>
<remarks>Assign units when using this constructor due to <paramref name="height"/> param</remarks>
<remarks>Assign units when using this constructor due to <see cref="P:Objects.BuiltElements.Room.height"/> prop</remarks>
</member>
<member name="M:Objects.BuiltElements.Room.#ctor(System.String,System.String,Objects.BuiltElements.Level,Objects.Geometry.Point,System.Collections.Generic.List{Objects.BuiltElements.Revit.Parameter})">
<summary>
SchemaBuilder constructor for a Room
</summary>
<remarks>Assign units when using this constructor due to <paramref name="height"/> param</remarks>
<remarks>Assign units when using this constructor due to <see cref="P:Objects.BuiltElements.Room.height"/> prop</remarks>
</member>
<member name="M:Objects.BuiltElements.Wall.#ctor(System.Double,Objects.ICurve,System.Collections.Generic.List{Speckle.Core.Models.Base})">
<summary>
@@ -827,7 +967,6 @@
<member name="P:Objects.Geometry.ControlPoint.value">
<summary>
OBSOLETE - This is just here for backwards compatibility.
You should not use this for anything. Access coordinates using X,Y,Z and weight fields.
</summary>
</member>
<member name="M:Objects.Geometry.Curve.#ctor">
@@ -890,7 +1029,7 @@
</member>
<member name="M:Objects.Geometry.Curve.ToList">
<summary>
Returns the vales of this <see cref="T:Objects.Geometry.Curve"/> as a list of numbers
Returns the values of this <see cref="T:Objects.Geometry.Curve"/> as a list of numbers
</summary>
<returns>A list of values representing the <see cref="T:Objects.Geometry.Curve"/></returns>
</member>
@@ -1019,10 +1158,10 @@
</member>
<member name="M:Objects.Geometry.Mesh.GetTextureCoordinate(System.Int32)">
<summary>
Gets a texture coordinate as a <see cref="!:(T1, T2)"/> by <paramref name="index"/>
Gets a texture coordinate as a <see cref="T:System.ValueTuple`2"/> by <paramref name="index"/>
</summary>
<param name="index">The index of the texture coordinate</param>
<returns>Texture coordinate as a <see cref="!:(T1, T2)"/></returns>
<returns>Texture coordinate as a <see cref="T:System.ValueTuple`2"/></returns>
</member>
<member name="M:Objects.Geometry.Mesh.AlignVerticesWithTexCoordsByIndex">
<summary>
@@ -1123,7 +1262,7 @@
<param name="x">The x coordinate</param>
<param name="y">The y coordinate</param>
<param name="z">The z coordinate</param>
<param name="units">The units the point's coordinates are in.</param>
<param name="units">The units of the point's coordinates. Defaults to Meters. </param>
<param name="applicationId">The object's unique application ID</param>
</member>
<member name="M:Objects.Geometry.Point.#ctor(Objects.Geometry.Vector)">
@@ -1154,13 +1293,10 @@
</member>
<member name="P:Objects.Geometry.Point.units">
<summary>
The unit's this <see cref="T:Objects.Geometry.Vector"/> is in.
The units this <see cref="T:Objects.Geometry.Point"/> is in.
This should be one of the units specified in <see cref="T:Speckle.Core.Kits.Units"/>
</summary>
</member>
<member name="P:Objects.Geometry.Point.bbox">
<inheritdoc/>
</member>
<member name="M:Objects.Geometry.Point.TransformTo(Objects.Other.Transform,Objects.Geometry.Point@)">
<inheritdoc/>
</member>
@@ -1581,7 +1717,7 @@
Sets the control points of this <see cref="T:Objects.Geometry.Surface"/>.
</summary>
<param name="value">A 2-dimensional array of <see cref="T:Objects.Geometry.ControlPoint"/> instances.</param>
<remarks>The <see cref="!:value"/> must be ordered following directions "[u][v]"</remarks>
<remarks>The <paramref name="value"/> must be ordered following directions "[u][v]"</remarks>
</member>
<member name="M:Objects.Geometry.Surface.ToList">
<summary>
@@ -1876,7 +2012,7 @@
</member>
<member name="T:Objects.Organization.ModelInfo">
<summary>
Basic model info class to be attached to the <see cref="!:Model.info"/> field on a <see cref="!:Model"/> object.
Basic model info class
It contains general information about the model and can be extended or subclassed to include more application-specific
information.
</summary>
@@ -1893,8 +2029,7 @@
</member>
<member name="T:Objects.Organization.BIMModelInfo">
<summary>
Extended <see cref="T:Objects.Organization.ModelInfo"/> to be attached to the <see cref="!:Model.info"/> field on a <see cref="!:Model"/> object.
This contains additional properties applicable to AEC projects.
Extended <see cref="T:Objects.Organization.ModelInfo"/> to contain additional properties applicable to AEC projects.
</summary>
</member>
<member name="P:Objects.Organization.BIMModelInfo.clientName">
@@ -2091,18 +2226,6 @@
<remarks>This method will skip scaling. If you need scaling, we recommend using the transform instead.</remarks>
<returns>A Plane on the insertion point of this Block Instance, with the correct 3-axis rotations.</returns>
</member>
<member name="M:Objects.Other.Revit.RevitInstance.GetInsertionPlane">
<summary>
Returns a plane representing the insertion point and orientation of this revit instance.
</summary>
<remarks>This method will skip scaling. If you need scaling, we recommend using the transform instead.</remarks>
<returns>A Plane on the insertion point of this Block Instance, with the correct 3-axis rotations.</returns>
</member>
<member name="T:Objects.Other.Revit.RevitMaterial">
<summary>
Material in Revit defininf all revit properties from Autodesk.Revit.DB.Material
</summary>
</member>
<member name="T:Objects.Other.Material">
<summary>
Generic class for materials containing generic parameters
@@ -2128,6 +2251,18 @@
And: https://blogs.unity3d.com/2014/10/29/physically-based-shading-in-unity-5-a-primer/
</summary>
</member>
<member name="M:Objects.Other.Revit.RevitInstance.GetInsertionPlane">
<summary>
Returns a plane representing the insertion point and orientation of this revit instance.
</summary>
<remarks>This method will skip scaling. If you need scaling, we recommend using the transform instead.</remarks>
<returns>A Plane on the insertion point of this Block Instance, with the correct 3-axis rotations.</returns>
</member>
<member name="T:Objects.Other.Revit.RevitMaterial">
<summary>
Material in Revit defininf all revit properties from Autodesk.Revit.DB.Material
</summary>
</member>
<member name="T:Objects.Other.Text">
<summary>
Text class for Rhino and AutoCAD
@@ -2154,7 +2289,7 @@
<param name="units"></param>
<exception cref="T:Speckle.Core.Logging.SpeckleException"></exception>
</member>
<member name="M:Objects.Other.Transform.#ctor(System.Numerics.Matrix4x4,System.String)">
<member name="M:Objects.Other.Transform.#ctor(System.DoubleNumerics.Matrix4x4,System.String)">
<summary>
Construct a transform from a 4x4 matrix and translation units
</summary>
@@ -2184,7 +2319,7 @@
Units for translation
</summary>
</member>
<member name="M:Objects.Other.Transform.Decompose(System.Numerics.Vector3@,System.Numerics.Quaternion@,System.Numerics.Vector4@)">
<member name="M:Objects.Other.Transform.Decompose(System.DoubleNumerics.Vector3@,System.DoubleNumerics.Quaternion@,System.DoubleNumerics.Vector4@)">
<summary>
Decomposes matrix into its scaling, rotation, and translation components
</summary>
@@ -2255,7 +2390,6 @@
<summary>
SchemaBuilder constructor for a structural model object
</summary>
<param name="modelInfo"></param>
<param name="nodes"></param>
<param name="elements"></param>
<param name="loads"></param>
@@ -2323,18 +2457,6 @@
<param name="orientationNode"></param>
<param name="orientationAngle"></param>
</member>
<member name="M:Objects.Structural.GSA.Geometry.GSANode.#ctor(System.Int32,Objects.Geometry.Point,Objects.Structural.Geometry.Restraint,Objects.Structural.Geometry.Axis,Objects.Structural.Properties.PropertySpring,Objects.Structural.Properties.PropertyMass,Objects.Structural.Properties.PropertyDamper,System.Double,System.String)">
<summary>
SchemaBuilder constructor for a GSA node
</summary>
<param name="basePoint"></param>
<param name="restraint"></param>
<param name="constraintAxis"></param>
<param name="springProperty"></param>
<param name="massProperty"></param>
<param name="damperProperty"></param>
<param name="localElementSize"></param>
</member>
<member name="M:Objects.Structural.Geometry.Element1D.#ctor(Objects.Geometry.Line,Objects.Structural.Properties.Property1D,Objects.Structural.Geometry.ElementType1D,System.String,Objects.Structural.Geometry.Restraint,Objects.Structural.Geometry.Restraint,Objects.Geometry.Vector,Objects.Geometry.Vector,Objects.Geometry.Plane)">
<summary>
SchemaBuilder constructor for structural 1D element (based on local axis)
@@ -2371,6 +2493,18 @@
<param name="name">The name of the storey</param>
<param name="elevation">The elevation of the storey (along the global z-axis, ie. storey exists in the global XY plane)</param>
</member>
<member name="M:Objects.Structural.GSA.Geometry.GSANode.#ctor(System.Int32,Objects.Geometry.Point,Objects.Structural.Geometry.Restraint,Objects.Structural.Geometry.Axis,Objects.Structural.Properties.PropertySpring,Objects.Structural.Properties.PropertyMass,Objects.Structural.Properties.PropertyDamper,System.Double,System.String)">
<summary>
SchemaBuilder constructor for a GSA node
</summary>
<param name="basePoint"></param>
<param name="restraint"></param>
<param name="constraintAxis"></param>
<param name="springProperty"></param>
<param name="massProperty"></param>
<param name="damperProperty"></param>
<param name="localElementSize"></param>
</member>
<member name="M:Objects.Structural.Loading.Load.#ctor(System.String,Objects.Structural.Loading.LoadCase)">
<summary>
A generalised structural load, described by a name and load case
@@ -2508,7 +2642,7 @@
</member>
<member name="M:Objects.Utils.MeshTriangulationHelper.TriangulateMesh(Objects.Geometry.Mesh,System.Boolean)">
<summary>
Triangulates all faces in <paramref name="Mesh"/>.
Triangulates all faces in <paramref name="mesh"/>.
</summary>
<param name="mesh">The mesh to triangulate.</param>
<param name="preserveQuads">If <see langword="true"/>, will not triangulate quad faces.</param>
@@ -2519,13 +2653,13 @@
</member>
<member name="M:Objects.Utils.MeshTriangulationHelper.TriangulateFace(System.Int32,System.Collections.Generic.IReadOnlyList{System.Int32},System.Collections.Generic.IReadOnlyList{System.Double},System.Boolean)">
<summary>
Calculates the triangulation of the face at <paramref name="faceIndex"/> in <paramref name="mesh"/>.
Calculates the triangulation of the face at <paramref name="faceIndex"/> in <paramref name="faces"/> list.
</summary>
<remarks>
This implementation is based the ear clipping method
Proposed by "Christer Ericson (2005) <i>Real-Time Collision Detection</i>".
</remarks>
<param name="faceIndex">The index of the face's cardinality indicator <c>n</c> in <paramref name="mesh"/>.<see cref="P:Objects.Geometry.Mesh.faces"/></param>.
<param name="faceIndex">The index of the face's cardinality indicator <c>n</c> in <paramref name="faces"/> list</param>.
<param name="faces"></param>
<param name="vertices"></param>
<param name="includeIndicators">if <see langword="true"/>, the returned list will include cardinality indicators for each triangle
@@ -1,10 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using Speckle.Core.Api;
using Speckle.Core.Credentials;
using Speckle.Core.Logging;
namespace Speckle.ConnectorUnity
{
@@ -1,6 +1,7 @@
#nullable enable
using System;
using System.Collections;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
@@ -111,9 +112,9 @@ namespace Speckle.ConnectorUnity.Utils
public readonly Task Task;
public override bool keepWaiting => !Task.IsCompleted;
public WaitForTask(Func<Task> function)
public WaitForTask(Func<Task> function, CancellationToken cancellationToken = default)
{
Task = Task.Run(function);
Task = Task.Run(function, cancellationToken);
}
}
@@ -124,9 +125,12 @@ namespace Speckle.ConnectorUnity.Utils
public TResult Result => Task.Result;
public override bool keepWaiting => !Task.IsCompleted;
public WaitForTask(Func<Task<TResult>> function)
public WaitForTask(
Func<Task<TResult>> function,
CancellationToken cancellationToken = default
)
{
this.Task = System.Threading.Tasks.Task.Run(function);
this.Task = System.Threading.Tasks.Task.Run(function, cancellationToken);
}
}
}
@@ -2,6 +2,7 @@ using System;
using System.Linq;
using Speckle.Core.Api;
using Speckle.Core.Credentials;
using Speckle.Core.Helpers;
using UnityEngine;
#nullable enable
@@ -24,7 +25,13 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection
}
}
protected override string? KeyFunction(Account? value) => value?.id;
protected override string? KeyFunction(Account? value)
{
if (value is null)
return null;
return value.id + Crypt.Md5(value.serverInfo.url ?? "", "X2");
}
public override void RefreshOptions()
{
@@ -9,8 +9,12 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection
[Serializable]
public sealed class BranchSelection : OptionSelection<Branch>
{
[field: SerializeField, Range(1, 100), Tooltip("Number of branches to request")]
public int BranchesLimit { get; set; } = 100;
[field:
SerializeField,
Range(1, ServerLimits.BRANCH_GET_LIMIT),
Tooltip("Number of branches to request")
]
public int BranchesLimit { get; set; } = ServerLimits.OLD_BRANCH_GET_LIMIT;
[field: SerializeField, Range(1, 100), Tooltip("Number of commits to request")]
public int CommitsLimit { get; set; } = 25;
@@ -30,14 +34,14 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection
StreamSelection.OnSelectionChange = RefreshOptions;
}
protected override string? KeyFunction(Branch? value) => value?.name;
protected override string? KeyFunction(Branch? value) => value?.id;
public override void RefreshOptions()
{
Stream? stream = StreamSelection.Selected;
if (stream == null)
return;
IList<Branch> branches;
IReadOnlyList<Branch> branches;
try
{
branches = Client!
@@ -29,7 +29,7 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection
public override void RefreshOptions()
{
Branch? branch = BranchSelection!.Selected;
Branch? branch = BranchSelection.Selected;
if (branch == null)
return;
List<Commit> commits = branch.commits.items;
@@ -10,7 +10,7 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection
/// <summary>
/// Reusable <see langword="abstract"/> serializable type that abstracts
/// the fetching of <typeparamref name="TOption"/> objects.
/// And exposes an <see cref="Array"/> of <see cref="Options"/>
/// And exposes an list of <see cref="Options"/>
/// with serialised selection.
/// </summary>
/// <typeparam name="TOption"></typeparam>
@@ -18,32 +18,42 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection
public abstract class OptionSelection<TOption>
where TOption : class
{
[SerializeField]
private int selectedIndex = -1;
public IReadOnlyList<TOption> Options { get; protected set; } = Array.Empty<TOption>();
public int SelectedIndex
{
get => selectedIndex;
set
{
selectedIndex = value;
OnSelectionChange?.Invoke();
}
}
private Dictionary<string, int>? _indexMap;
[SerializeField]
private string? selectedId;
public TOption? Selected
{
get
{
if (Options is null)
if (selectedId == null)
return null;
if (SelectedIndex < 0 || SelectedIndex >= Options.Length)
return null;
return Options[SelectedIndex];
TryGetOption(selectedId, out var value);
return value;
}
set
{
selectedId = KeyFunction(value);
OnSelectionChange?.Invoke();
}
}
public TOption[] Options { get; protected set; } = Array.Empty<TOption>();
public bool TryGetOption(string key, [NotNullWhen(true)] out TOption? value)
{
if (_indexMap is not null && _indexMap.TryGetValue(key, out int index))
{
value = Options[index];
return true;
}
value = null;
return false;
}
public Action? OnSelectionChange { get; set; }
public abstract Client? Client { get; }
@@ -53,36 +63,38 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection
public abstract void RefreshOptions();
protected void GenerateOptions(IList<TOption> source, Func<TOption, int, bool> isDefault)
protected void GenerateOptions(
IReadOnlyCollection<TOption?> source,
Func<TOption, int, bool> isDefault
)
{
List<TOption> optionsToAdd = new(source.Count);
int defaultOption = -1;
Dictionary<string, int> indexMap = new(source.Count);
string? defaultOption = null;
int index = 0;
foreach (TOption? a in source)
{
if (a == null)
continue;
var key = KeyFunction(a);
optionsToAdd.Add(a);
indexMap.Add(key, index);
if (isDefault(a, index))
defaultOption = index;
defaultOption = key;
index++;
}
TOption? currentSelected = Selected;
bool selectionOutOfRange = SelectedIndex < 0 || SelectedIndex >= optionsToAdd.Count;
if (
selectionOutOfRange
|| (
currentSelected != null
&& KeyFunction(currentSelected) != KeyFunction(optionsToAdd[SelectedIndex])
)
)
string? currentSelected = selectedId;
if (currentSelected is null || !indexMap.ContainsKey(currentSelected))
{
selectedIndex = defaultOption;
selectedId = defaultOption;
}
Options = optionsToAdd.ToArray();
//Debug.Log($"{this.GetType()} updated");
Options = optionsToAdd;
_indexMap = indexMap;
OnSelectionChange?.Invoke();
}
}
@@ -36,7 +36,7 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection
{
if (Client == null)
return;
IList<Stream> streams;
IReadOnlyList<Stream> streams;
try
{
streams = Client.StreamsGet(StreamsLimit).GetAwaiter().GetResult();
@@ -5,7 +5,6 @@ using System.Collections.Specialized;
using Speckle.Core.Api;
using Speckle.Core.Models;
using Speckle.Core.Serialisation;
using Speckle.Newtonsoft.Json;
using UnityEngine;
namespace Speckle.ConnectorUnity.Wrappers
@@ -1,6 +1,6 @@
{
"name": "systems.speckle.speckle-unity",
"version": "2.15.3",
"version": "2.18.1",
"displayName": "Speckle Unity Connector",
"description": "AEC Interoperability for Unity through Speckle",
"unity": "2021.1",
+2 -2
View File
@@ -1,2 +1,2 @@
m_EditorVersion: 2021.3.22f1
m_EditorVersionWithRevision: 2021.3.22f1 (b6c551784ba3)
m_EditorVersion: 2021.3.30f1
m_EditorVersionWithRevision: 2021.3.30f1 (b4360d7cdac4)
+1 -1
View File
@@ -64,7 +64,7 @@ We encourage everyone interested to hack / contribute / debug / give feedback to
### Requirements
- Unity 2021 or greater
- Have created an account on [speckle.xyz](https://speckle.xyz) (or your own server)
- Have created an account on [app.speckle.systems](https://app.speckle.systems) (or your own server)
- Installed [Speckle Manager](https://speckle.guide/user/manager.html) (recommended, otherwise you'll need to implement your own authentication system in Unity)
### Dependencies