Compare commits

..

23 Commits

Author SHA1 Message Date
Björn Steinhagen f319e0dc1d Merge pull request #861 from specklesystems/dev
.NET Build and Publish / build-windows (push) Has been cancelled
.NET Build and Publish / build-linux (push) Has been cancelled
.NET Build and Publish / deploy-installers (push) Has been cancelled
Dev -> Main for 3.2.2
2025-05-22 15:46:55 +02:00
Claire Kuang bdd1e61b6d adds logo to gh converter (#858)
Co-authored-by: Björn Steinhagen <steinhagen.bjoern@gmail.com>
2025-05-22 13:28:39 +00:00
Björn Steinhagen c8ceeab2d9 fix: reverting setting render material appearance (#859) 2025-05-22 15:16:11 +02:00
KatKatKateryna 81f2ed0a75 Kateryna/cnx 1615 hatch loop conversion failed (#824)
* handle hatch segments that are not a Polyline

* send elliptical curves

* support line segments

* support sending nurb curves

* send approximated Hatch with nurb2d segment

* send nurb loops for hatches

* optimize

* comment

* comments

* cut down Nurbs converter

* simplify hatch conversion

* fix nurb3d

* optimize

* rearrange

* fix ellipse bug on send

* fix rhino curves on receive

* fix single>multi conversion issue on receive

* shorten nurbs converter on send

* shorten statement

* explain 'count' var

* return multiple line segments without constructing a polyline

* comment

* refactor(autocad): refactors hatch and region conversion and fixes some bugs (#856)

* refactors hatch to speckle converter, and also fixes elevation bug

* refactors region converter

* removes excessive nurb converter

* Update Speckle.Converters.AutocadShared.projitems

---------

Co-authored-by: Claire Kuang <kuang.claire@gmail.com>
2025-05-22 13:03:21 +00:00
Claire Kuang 2232227a8b updates sample files to rhino 7 only components (#842) 2025-05-22 11:27:32 +00:00
Björn Steinhagen 871359738c feat: use render appearance (#827)
Co-authored-by: Claire Kuang <kuang.claire@gmail.com>
2025-05-22 10:47:56 +01:00
Claire Kuang ea2cb90b2e feat(grasshopper): deconstruct and create empty props (#853)
* adds ability to deconstruct speckle props, and also to create empty props

* by default add an input parameter

---------

Co-authored-by: Björn Steinhagen <steinhagen.bjoern@gmail.com>
2025-05-22 09:30:21 +00:00
Björn Steinhagen 248c96d9c2 fix: sketchup to revit colors (#857) 2025-05-22 09:18:46 +02:00
KatKatKateryna a71a9ef32c Kateryna/cnx 1570 gh send text (#841)
* add text converter to GH

* Get the first matching Property named Value

* adjust parameter description (debatable)

* add text converter to GH

* Get the first matching Property named Value

* adjust parameter description (debatable)

* add text converter to GH

* Get the first matching Property named Value

* adjust parameter description (debatable)

* fake commit

* Revert "fake commit"

This reverts commit 702fbce8d5.

* adjusts comments and factors in text scale in rhino

---------

Co-authored-by: Claire Kuang <kuang.claire@gmail.com>
2025-05-21 15:18:28 +00:00
Jedd Morgan ed7b6abe72 Merge pull request #854 from specklesystems/dev
.NET Build and Publish / build-windows (push) Has been cancelled
.NET Build and Publish / build-linux (push) Has been cancelled
.NET Build and Publish / deploy-installers (push) Has been cancelled
Dev -> Main
2025-05-21 11:59:51 +01:00
Jedd Morgan c7e439b9a4 Merge pull request #855 from specklesystems/jrm/main-dev2
Update dev with changes from main
2025-05-21 11:46:14 +01:00
Jedd Morgan 817a8c0910 Merge remote-tracking branch 'origin/dev' 2025-05-21 11:36:55 +01:00
Björn Steinhagen 6f5456e082 chore(grasshopper): change button behavior from right-click to left-click (#851)
* fix: left-click enabled for `SpeckleSelectModelComponent`

* fix: left-click instead of right-click

- `RespondToMouseDown` to disable component selection when clicking the button
- `RespondToMouseUp` to respond to left-click and not right-click

* refactor: left-click instead of right-click description

---------

Co-authored-by: Claire Kuang <kuang.claire@gmail.com>
2025-05-21 09:26:38 +01:00
Jedd Morgan 46a5243b2b Fix(deployment): Fixed issue with Autocad Civil3D depolyment (#849)
* Fixed .NET8 versions of AutoCAD/Civil3d

* Supress cef warnings that are bugging me

* Test installers

* Back to main
2025-05-20 13:28:11 +00:00
Björn Steinhagen f35ddfa7af fix(revit): walls sweeps published duplicated (#850)
* fix: wall sweeps duplicate publish

* docs: reporting on findings

* fix: wall sweeps published duplicated

* fix: same thing for linked models
2025-05-20 14:30:19 +02:00
Claire Kuang 5a43e8c165 adds pressure pipe base curve, display value, and partdata (#844)
Co-authored-by: Björn Steinhagen <steinhagen.bjoern@gmail.com>
2025-05-20 10:25:55 +01:00
Björn Steinhagen 0b136663e4 feat: direct shape name (#846) 2025-05-20 10:24:48 +02:00
Jedd Morgan 47ac752065 Rhino align guid between 8 and 7 (#847) 2025-05-19 17:05:28 +01:00
KatKatKateryna 84f6f3fbe6 Kateryna/cnx 1498 rhino mesh conversion problem on some geometries (#836)
* move geometry to origin before meshing

* reorder stuff

* move what's relevalt to MeshExtractor

* add minEdgeLength

* comments

* add minEdge setting

* adjust variables

* fix the matrix

* move all injections outside the method (except converter)

* add methods to Extrusion and Hatches. SubD doesn't seem to be affected

* typo

* restructure

* typos

* move methods

* get min edge length

* make function available for mesh

* add method to mesh conversions

* add logic to subd

* unnecessary change; spaces

* typo

* comments

* move FarFromOrigin to extension

* remove duplicate code; adjust MeshConverter logic

* reduce threshold to 1e5

* comment

---------

Co-authored-by: Claire Kuang <kuang.claire@gmail.com>
2025-05-19 15:59:47 +01:00
Björn Steinhagen 05c84c92f2 feat(tekla): model dialog with suggested model name (#845)
* feat: model dialog with suggested model name

* fix: nullability
2025-05-19 14:03:00 +02:00
kekesidavid ac85dc652d fix (Revit) :Hermite Spline conversion when NURBS conversion failing (#843)
* falling back to displayvalue when nurbsspline createcurve throws an argument exception

* comment update
2025-05-16 13:48:48 +02:00
Jedd Morgan b6f18b72fa Deep clean no longer builds (#840) 2025-05-15 14:39:41 +01:00
Adam Hathcock 5080d2878c Generate HostApp specific sln and slnx (#798)
* add slnx and generate from it (but got errors)

* can generate slnx

* Can generate hostapp specific slnx

* use slnx for build and clean up

* Revert as we're still on 8 SDK

* really not use slnx for builds

* Make the code generate SLNs too

* use existing consts

* add grasshopper

* Don't generate old slns for slugs

* add SLNX info to the readme

* forgot revit 26
2025-05-15 09:53:09 +01:00
71 changed files with 2498 additions and 1061 deletions
+1
View File
@@ -10,6 +10,7 @@
<PackageReference Include="Bullseye" />
<PackageReference Include="Glob" />
<PackageReference Include="Microsoft.Build" />
<PackageReference Include="Microsoft.VisualStudio.SolutionPersistence" />
<PackageReference Include="Semver" />
<PackageReference Include="SimpleExec" />
</ItemGroup>
+9 -13
View File
@@ -15,6 +15,7 @@ const string ZIP = "zip";
const string RESTORE_TOOLS = "restore-tools";
const string CLEAN_LOCKS = "clean-locks";
const string CHECK_SOLUTIONS = "check-solutions";
const string GEN_SOLUTIONS = "generate-solutions";
const string DEEP_CLEAN = "deep-clean";
const string DEEP_CLEAN_LOCAL = "deep-clean-local";
const string DETECT_AFFECTED = "detect-affected";
@@ -27,14 +28,7 @@ if (args.Length > 1)
args = new[] { arguments.First() };
//arguments = arguments.Skip(1).ToList();
}*/
void Build(string solution, string configuration)
{
Console.WriteLine();
Console.WriteLine();
Console.WriteLine($"Building solution '{solution}' as '{configuration}'");
Console.WriteLine();
Run("dotnet", $"build \".\\{solution}\" --configuration {configuration} --no-restore");
}
void Restore(string solution)
{
Console.WriteLine();
@@ -71,23 +65,24 @@ void CleanSolution(string solution, string configuration)
DeleteDirectories("**/obj");
DeleteFiles("**/*.lock.json");
Restore(solution);
Build(solution, configuration);
}
Target(
CLEAN_LOCKS,
() =>
Consts.Solutions,
s =>
{
DeleteFiles("**/*.lock.json");
Restore("Speckle.Connectors.sln");
Restore(s);
}
);
Target(
DEEP_CLEAN,
() =>
Consts.Solutions,
s =>
{
CleanSolution("Speckle.Connectors.sln", "debug");
CleanSolution(s, "debug");
}
);
Target(
@@ -183,6 +178,7 @@ Target(
);
Target(CHECK_SOLUTIONS, Solutions.CompareConnectorsToLocal);
Target(GEN_SOLUTIONS, Solutions.GenerateSolutions);
Target(
TEST,
+51
View File
@@ -1,4 +1,6 @@
using Microsoft.Build.Construction;
using Microsoft.VisualStudio.SolutionPersistence.Model;
using Microsoft.VisualStudio.SolutionPersistence.Serializer;
namespace Build;
@@ -53,4 +55,53 @@ public static class Solutions
);
}
}
public static async Task GenerateSolutions()
{
await GenerateLocalSlnx();
foreach (var group in Consts.ProjectGroups)
{
var path = group.Projects[0].ProjectPath.Split('/');
var folder = $"/{path[0]}/{path[1]}/";
await GenerateConnector(group.HostAppSlug, folder);
}
}
public static async Task GenerateLocalSlnx()
{
var connectors = await GetFullSlnx();
connectors.AddProject("..\\speckle-sharp-sdk\\src\\Speckle.Objects\\Speckle.Objects.csproj");
connectors.AddProject("..\\speckle-sharp-sdk\\src\\Speckle.Sdk\\Speckle.Sdk.csproj");
connectors.AddProject("..\\speckle-sharp-sdk\\src\\Speckle.Sdk.Dependencies\\Speckle.Sdk.Dependencies.csproj");
var sln = Path.Combine("C:\\Users\\adam\\Git\\speckle-sharp-connectors", "Local.slnx");
await SolutionSerializers.SlnXml.SaveAsync(sln, connectors, default);
sln = Path.Combine("C:\\Users\\adam\\Git\\speckle-sharp-connectors", "Local.sln");
await SolutionSerializers.SlnFileV12.SaveAsync(sln, connectors, default);
}
public static async Task GenerateConnector(string slug, string folder)
{
slug = string.Concat(slug[0].ToString().ToUpper(), slug.AsSpan(1));
var connectors = await GetFullSlnx();
var foldersToRemove = connectors
.SolutionFolders.Where(x =>
//need base folder
!x.Path.Equals("/Connectors/")
//don't grab all
&& (x.Path.StartsWith("/Connectors/") && !x.Path.StartsWith(folder))
)
.ToList();
foreach (var folderToRemove in foldersToRemove)
{
connectors.RemoveFolder(folderToRemove);
}
var sln = Path.Combine("C:\\Users\\adam\\Git\\speckle-sharp-connectors", $"Speckle.{slug}.slnx");
await SolutionSerializers.SlnXml.SaveAsync(sln, connectors, default);
}
public static async Task<SolutionModel> GetFullSlnx()
{
var connectorsSln = Path.Combine("C:\\Users\\adam\\Git\\speckle-sharp-connectors", "Speckle.Connectors.slnx");
return await SolutionSerializers.SlnXml.OpenAsync(connectorsSln, default);
}
}
+6
View File
@@ -47,6 +47,12 @@
"Microsoft.SourceLink.Common": "8.0.0"
}
},
"Microsoft.VisualStudio.SolutionPersistence": {
"type": "Direct",
"requested": "[1.0.52, )",
"resolved": "1.0.52",
"contentHash": "oNv2JtYXhpdJrX63nibx1JT3uCESOBQ1LAk7Dtz/sr0+laW0KRM6eKp4CZ3MHDR2siIkKsY8MmUkeP5DKkQQ5w=="
},
"PolySharp": {
"type": "Direct",
"requested": "[1.14.1, )",
@@ -25,12 +25,10 @@
</Target>
<PropertyGroup Condition="'$(AutoCADVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true'">
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<StartAction>Program</StartAction>
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(AutoCADVersion)\acad.exe</StartProgram>
</PropertyGroup>
<PropertyGroup Condition="'$(Civil3DVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true'">
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<StartAction>Program</StartAction>
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(Civil3DVersion)\acad.exe</StartProgram>
<StartArguments>/product C3D</StartArguments>
@@ -4,7 +4,13 @@
<AutoCADVersion>2025</AutoCADVersion>
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2025;AUTOCAD2022_OR_GREATER;AUTOCAD2023_OR_GREATER;AUTOCAD2024_OR_GREATER;AUTOCAD2025_OR_GREATER</DefineConstants>
<Configurations>Debug;Release;Local</Configurations>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
</PropertyGroup>
<PropertyGroup>
<!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!--This is needed for managed dependencies-->
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!--This is needed for the rest-->
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath> <!--This is needed just to keep folder paths the same as the netframework versions of autocad/civil-->
</PropertyGroup>
<ItemGroup>
@@ -3,8 +3,14 @@
<TargetFramework>net8.0-windows</TargetFramework>
<AutoCADVersion>2026</AutoCADVersion>
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2026;AUTOCAD2022_OR_GREATER;AUTOCAD2023_OR_GREATER;AUTOCAD2024_OR_GREATER;AUTOCAD2025_OR_GREATER;AUTOCAD2026_OR_GREATER</DefineConstants>
<Configurations>Debug;Release;Local</Configurations>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
<Configurations>Debug;Release;Local</Configurations>
</PropertyGroup>
<PropertyGroup>
<!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!--This is needed for managed dependencies-->
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!--This is needed for the rest-->
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath> <!--This is needed just to keep folder paths the same as the netframework versions of autocad/civil-->
</PropertyGroup>
<ItemGroup>
@@ -4,7 +4,13 @@
<Civil3DVersion>2025</Civil3DVersion>
<DefineConstants>$(DefineConstants);CIVIL3D2025;CIVIL3D;CIVIL3D2022_OR_GREATER;CIVIL3D2023_OR_GREATER;CIVIL3D2024_OR_GREATER;CIVIL3D2025_OR_GREATER</DefineConstants>
<Configurations>Debug;Release;Local</Configurations>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
</PropertyGroup>
<PropertyGroup>
<!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!--This is needed for managed dependencies-->
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!--This is needed for the rest-->
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath> <!--This is needed just to keep folder paths the same as the netframework versions of autocad/civil-->
</PropertyGroup>
<ItemGroup>
@@ -4,7 +4,13 @@
<Civil3DVersion>2026</Civil3DVersion>
<DefineConstants>$(DefineConstants);CIVIL3D2026;CIVIL3D;CIVIL3D2022_OR_GREATER;CIVIL3D2023_OR_GREATER;CIVIL3D2024_OR_GREATER;CIVIL3D2025_OR_GREATER;CIVIL3D2026_OR_GREATER</DefineConstants>
<Configurations>Debug;Release;Local</Configurations>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
</PropertyGroup>
<PropertyGroup>
<!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!--This is needed for managed dependencies-->
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!--This is needed for the rest-->
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath> <!--This is needed just to keep folder paths the same as the netframework versions of autocad/civil-->
</PropertyGroup>
<ItemGroup>
@@ -4,11 +4,19 @@
<UseWpf>true</UseWpf>
<RevitVersion>2022</RevitVersion>
<DefineConstants>$(DefineConstants);REVIT2022;REVIT2022_OR_GREATER</DefineConstants>
<CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>
<Prefer32bit>false</Prefer32bit>
<Configurations>Debug;Release;Local</Configurations>
</PropertyGroup>
<PropertyGroup Label="Things needed to get ancient cef buildling with modern msbuild">
<!--There is a weird bug or misconfiguration in cef 65.0.1 nuget that makes it pick x86 dlls if asked to build x64.-->
<!--Asking it to build AnyCPU appaers to work, but generates MSB3270 warnings, which we are ignoring here-->
<!--Official docs suggest setting the entire solution to x64, which we can't do, and we don't want to create a new SLN just for Revit 2022-->
<CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>
<Prefer32bit>false</Prefer32bit>
<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
</PropertyGroup>
<Import Project="..\Speckle.Connectors.RevitShared\Speckle.Connectors.RevitShared.projitems" Label="Shared" />
<Import Project="..\Speckle.Connectors.RevitShared.Cef\Speckle.Connectors.RevitShared.Cef.projitems" Label="Shared" />
@@ -63,7 +63,9 @@ public class LinkedModelHandler
viewFilter.GetView().NotNull().Id,
linkInstance.Id
);
return viewCollector.WhereElementIsNotElementType().ToElements().ToList();
// NOTE: related to [CNX-1482](https://linear.app/speckle/issue/CNX-1482/wall-sweeps-published-duplicated). See RevitViewsFilter.cs
return viewCollector.WhereElementIsNotElementType().Where(e => !string.IsNullOrEmpty(e.Name)).ToList();
#else
// 🚨 LIMITATION: in Revit 2023 and below, we can only check if the entire linked model is visible,
// not individual elements within it. If the linked model is visible, all its elements will be included.
@@ -126,10 +126,9 @@ public class RevitMaterialBaker
string materialId = speckleRenderMaterial.applicationId ?? speckleRenderMaterial.id.NotNull();
string matName = _revitUtils.RemoveInvalidChars($"{speckleRenderMaterial.name}-({materialId})-{baseLayerName}");
var newMaterialId = Autodesk.Revit.DB.Material.Create(_converterSettings.Current.Document, matName);
var revitMaterial = (Autodesk.Revit.DB.Material)_converterSettings.Current.Document.GetElement(newMaterialId);
var newMaterialId = Material.Create(_converterSettings.Current.Document, matName);
var revitMaterial = (Material)_converterSettings.Current.Document.GetElement(newMaterialId);
revitMaterial.Color = new Color(diffuse.R, diffuse.G, diffuse.B);
revitMaterial.Transparency = (int)(transparency * 100);
revitMaterial.Shininess = (int)(speckleRenderMaterial.metalness * 128);
revitMaterial.Smoothness = (int)(smoothness * 128);
@@ -156,7 +155,7 @@ public class RevitMaterialBaker
using (var collector = new FilteredElementCollector(document))
{
var materialIds = collector
.OfClass(typeof(Autodesk.Revit.DB.Material))
.OfClass(typeof(Material))
.Where(m => m.Name.Contains(validBaseGroupName))
.Select(m => m.Id)
.ToList();
@@ -101,7 +101,68 @@ public sealed class RevitHostObjectBuilder(
unpackedRoot.ObjectsToConvert.ToList()
);
// 2 - Bake materials
// NOTE: below is 💩... https://github.com/specklesystems/speckle-sharp-connectors/pull/813 broke sketchup to revit workflow
// ids were modified to fix receiving instances [CNX-1707](https://linear.app/speckle/issue/CNX-1707/revit-curves-and-meshes-in-blocks-come-as-duplicated)
// but we then broke sketchup to revit because applicationIds in proxies didn't match modified application ids which cam from #813 hack
// given urgency to get sketchup to revit workflow back up and running, temp fix involves setting modified ids before material baking, mapping original app ids to modified ids and using those
// this way, CNX-1707 fix stays in tact and we fix sketchup to revit
// TODO: TransformTo and material baking needs to be fixed in Revit!!
// create a mapping from original to modified IDs <- so that we can actually map ids in the proxies to the objects
Dictionary<string, string> originalToModifiedIds = new();
// modify application IDs BEFORE material baking
foreach (LocalToGlobalMap localToGlobalMap in localToGlobalMaps)
{
if (
localToGlobalMap.AtomicObject is ITransformable transformable
&& localToGlobalMap.Matrix.Count > 0
&& localToGlobalMap.AtomicObject["units"] is string units
)
{
var id = localToGlobalMap.AtomicObject.id;
var originalAppId = localToGlobalMap.AtomicObject.applicationId ?? id;
// Apply transformations...
ITransformable? newTransformable = null;
foreach (var mat in localToGlobalMap.Matrix)
{
transformable.TransformTo(new Transform() { matrix = mat, units = units }, out newTransformable);
transformable = newTransformable;
}
localToGlobalMap.AtomicObject = (newTransformable as Base)!;
localToGlobalMap.AtomicObject.id = id;
// create modified ID and store mapping <- fixes CNX-1707 but causes us material mapping headache!!!
string modifiedAppId = $"{originalAppId}_{Guid.NewGuid().ToString("N")[..8]}";
if (originalAppId != null)
{
originalToModifiedIds[originalAppId] = modifiedAppId;
}
localToGlobalMap.AtomicObject.applicationId = modifiedAppId;
localToGlobalMap.Matrix = new HashSet<Matrix4x4>();
}
}
// Update the RenderMaterialProxies with the "new" (aka hacked) application IDs
if (unpackedRoot.RenderMaterialProxies != null)
{
foreach (var proxy in unpackedRoot.RenderMaterialProxies)
{
var updatedObjects = new List<string>();
foreach (var objectId in proxy.objects)
{
// Use the modified ID if it exists, otherwise keep the original <- this SUCKS and we need to change
string idToUse = originalToModifiedIds.TryGetValue(objectId, out var modifiedId) ? modifiedId : objectId;
updatedObjects.Add(idToUse);
}
proxy.objects = updatedObjects;
}
}
// 2 - Bake materials (now with the updated IDs)
if (unpackedRoot.RenderMaterialProxies != null)
{
transactionManager.StartTransaction(true, "Baking materials");
@@ -178,35 +239,6 @@ public sealed class RevitHostObjectBuilder(
{
using var activity = activityFactory.Start("BakeObject");
// POC hack of the ages: try to pre transform curves, points and meshes before baking
// we need to bypass the local to global converter as there we don't have access to what we want. that service will/should stop existing.
if (
localToGlobalMap.AtomicObject is ITransformable transformable // and ICurve
&& localToGlobalMap.Matrix.Count > 0
&& localToGlobalMap.AtomicObject["units"] is string units
)
{
//TODO TransformTo will be deprecated as it's dangerous and requires ID transposing which is wrong!
//ID needs to be copied to the new instance
var id = localToGlobalMap.AtomicObject.id;
var originalAppId = localToGlobalMap.AtomicObject.applicationId;
ITransformable? newTransformable = null;
foreach (var mat in localToGlobalMap.Matrix)
{
transformable.TransformTo(new Transform() { matrix = mat, units = units }, out newTransformable);
transformable = newTransformable;
}
localToGlobalMap.AtomicObject = (newTransformable as Base)!;
localToGlobalMap.AtomicObject.id = id;
// Make applicationId unique by appending a short GUID
// This prevents DirectShapeLibrary from using the same definition for multiple instances
localToGlobalMap.AtomicObject.applicationId = $"{originalAppId ?? id}_{Guid.NewGuid().ToString("N")[..8]}"; // hack of all of the ages. related to CNX-1707
localToGlobalMap.Matrix = new HashSet<Matrix4x4>(); // flush out the list, as we've applied the transforms already
}
// actual conversion happens here!
var result = converter.Convert(localToGlobalMap.AtomicObject);
onOperationProgressed.Report(new("Converting", (double)++count / localToGlobalMaps.Count));
@@ -72,12 +72,17 @@ public class RevitViewsFilter : DiscriminatedObject, ISendFilter, IRevitSendFilt
if (view is null)
{
//this used to throw an exception but we don't want to fail loudly if the view is not found
//this used to throw an exception, but we don't want to fail loudly if the view is not found
return [];
}
using var viewCollector = new FilteredElementCollector(_doc, view.Id);
var elementsInView = viewCollector.ToElements();
var objectIds = elementsInView.Select(e => e.UniqueId).ToList();
// NOTE: FilteredElementCollector() includes sweeps and reveals from a wall family's definition and includes them as additional objects
// on this return. displayValue for Wall already includes these, therefore we end up with duplicate elements on wall sweeps
// related to [CNX-1482](https://linear.app/speckle/issue/CNX-1482/wall-sweeps-published-duplicated)
// i (björn) noticed that all these elements have an empty string as Name parameter, hence below exclusion. tested as much as possible, seems like legit fix
var objectIds = elementsInView.Where(e => !string.IsNullOrEmpty(e.Name)).Select(e => e.UniqueId).ToList();
SelectedObjectIds = objectIds;
return objectIds;
}
+7 -2
View File
@@ -1,7 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<Target AfterTargets="Clean" Name="CleanAddinRhino" Condition="'$(RhinoVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true'">
<RemoveDir Directories="$(AppData)\McNeel\Rhinoceros\$(RhinoVersion).0\Plug-ins\Speckle.Connectors.Rhino$(RhinoVersion) (8dd5f30b-a13d-4a24-abdc-3e05c8c87144)" />
<ItemGroup>
<PublicReleasePath Include="$(AppData)\McNeel\Rhinoceros\$(RhinoVersion).0\Plug-ins\Speckle.Connectors.Rhino$(RhinoVersion) (2153799A-0CEC-40DE-BC3A-01E5055222FF)" />
</ItemGroup>
<Target AfterTargets="Build" Name="WarnIfPublicReleaseVersionInstalled" Condition="'$(RhinoVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true'">
<Warning
Text="Conflicting Rhino plugin detected - Do you have a public release installed?"
Condition="Exists(@(PublicReleasePath))" />
</Target>
<Target AfterTargets="Build" Name="AfterBuildRhino" Condition="'$(RhinoVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true'">
@@ -31,7 +31,7 @@ public class DeconstructSpeckleParam : GH_Component, IGH_VariableParameterCompon
pManager.AddGenericParameter(
"Speckle Param",
"SP",
"Speckle param to deconstruct. Expects Collections, Objects, or Materials",
"Speckle param to deconstruct. Expects Collections, Objects, Materials, or Properties",
GH_ParamAccess.item
);
}
@@ -61,6 +61,14 @@ public class DeconstructSpeckleParam : GH_Component, IGH_VariableParameterCompon
Name = string.IsNullOrEmpty(matGoo.Value.Name) ? matGoo.Value.Material.speckle_type : matGoo.Value.Name;
outputParams = CreateOutputParamsFromBase(matGoo.Value.Base);
break;
case SpecklePropertyGroupGoo propGoo:
Name = $"properties ({propGoo.Value.Count})";
outputParams = new();
foreach (var key in propGoo.Value.Keys)
{
outputParams.Add(CreateOutputParamByKeyValue(key, propGoo.Value[key].Value, GH_ParamAccess.item));
}
break;
default:
return;
}
@@ -25,15 +25,35 @@ public class GhContextMenuButtonAttributes(GhContextMenuButton owner) : GH_Attri
button1.Render(graphics, Parent.Selected, false, false);
}
public override GH_ObjectResponse RespondToMouseUp(GH_Canvas sender, GH_CanvasMouseEvent e)
public override GH_ObjectResponse RespondToMouseDown(GH_Canvas sender, GH_CanvasMouseEvent e)
{
if (!Owner.Enabled && e.Button == MouseButtons.Right)
if (Bounds.Contains(e.CanvasLocation) && e.Button == MouseButtons.Left)
{
// handle the mouse down to prevent component selection
return GH_ObjectResponse.Handled;
}
return base.RespondToMouseDown(sender, e);
}
public override GH_ObjectResponse RespondToMouseUp(GH_Canvas sender, GH_CanvasMouseEvent e)
{
// detect left-clicks on enabled buttons
if (Owner.Enabled && e.Button == MouseButtons.Left && Bounds.Contains(e.CanvasLocation))
{
// show menu
ToolStripDropDown menu = new();
Owner.AppendMenuItems(menu);
menu.Show(sender, sender.PointToClient(Cursor.Position));
return GH_ObjectResponse.Handled;
}
// block right-clicks to prevent the default context menu
if (e.Button == MouseButtons.Right && Bounds.Contains(e.CanvasLocation))
{
// Prevents canvas from triggering the right-click behaviour, and showing the context menu.
return GH_ObjectResponse.Handled;
}
// Allowing event to bubble up to canvas will handle the event and show the context menu.
return base.RespondToMouseUp(sender, e);
}
}
@@ -28,12 +28,17 @@ public class CreateSpeckleObject : GH_Component
pManager.AddGenericParameter(
"Object",
"O",
"Input Object. Speckle objects, Model Objects, and geometry are accepted.",
"Input Object. Speckle Objects, Model Objects, and geometry are accepted.",
GH_ParamAccess.item
);
Params.Input[0].Optional = true;
pManager.AddGenericParameter("Geometry", "G", "The geometry of the Speckle Object", GH_ParamAccess.item);
pManager.AddGenericParameter(
"Geometry",
"G",
"Geometry of the Speckle Object. GeometryBase in Grasshopper includes text entities.",
GH_ParamAccess.item
);
Params.Input[1].Optional = true;
pManager.AddTextParameter("Name", "N", "Name of the Speckle Object", GH_ParamAccess.item);
@@ -73,7 +78,12 @@ public class CreateSpeckleObject : GH_Component
{
pManager.AddParameter(new SpeckleObjectParam(), "Object", "O", "Speckle Object", GH_ParamAccess.item);
pManager.AddGenericParameter("Geometry", "G", "The geometry of the Speckle Object", GH_ParamAccess.item);
pManager.AddGenericParameter(
"Geometry",
"G",
"Geometry of the Speckle Object. GeometryBase in Grasshopper includes text entities.",
GH_ParamAccess.item
);
pManager.AddTextParameter("Name", "N", "Name of the Speckle Object", GH_ParamAccess.item);
@@ -23,6 +23,8 @@ public class CreateSpeckleProperties : GH_Component, IGH_VariableParameterCompon
protected override Bitmap Icon => Resources.speckle_properties_create;
public bool CreateEmptyProperties { get; set; }
private readonly DebounceDispatcher _debounceDispatcher = new();
protected override void RegisterInputParams(GH_InputParamManager pManager)
@@ -39,7 +41,6 @@ public class CreateSpeckleProperties : GH_Component, IGH_VariableParameterCompon
protected override void SolveInstance(IGH_DataAccess da)
{
// Create a data tree to store output
Dictionary<string, object?> properties = new();
// Check for structure of all inputs to see matching branches
@@ -60,8 +61,18 @@ public class CreateSpeckleProperties : GH_Component, IGH_VariableParameterCompon
{
object? value = null;
var success = da.GetData(i, ref value);
if (!success)
{
AddRuntimeMessage(
GH_RuntimeMessageLevel.Warning,
$"Parameter {Params.Input[i].NickName} does not have any values."
);
return;
}
var actualValue = value?.GetType().GetProperty("Value").GetValue(value); // note: unsure if reflection here hurts our performance
if (!success || value == null || actualValue == null)
if (value == null || actualValue == null)
{
AddRuntimeMessage(
GH_RuntimeMessageLevel.Warning,
@@ -80,7 +91,7 @@ public class CreateSpeckleProperties : GH_Component, IGH_VariableParameterCompon
public bool CanInsertParameter(GH_ParameterSide side, int index)
{
return side == GH_ParameterSide.Input;
return side == GH_ParameterSide.Input && !CreateEmptyProperties;
}
public bool CanRemoveParameter(GH_ParameterSide side, int index)
@@ -137,4 +148,34 @@ public class CreateSpeckleProperties : GH_Component, IGH_VariableParameterCompon
}
};
}
public override void AppendAdditionalMenuItems(ToolStripDropDown menu)
{
base.AppendAdditionalMenuItems(menu);
Menu_AppendSeparator(menu);
ToolStripMenuItem emptyPropsMenuItem = Menu_AppendItem(
menu,
"Create empty Properties",
(s, e) =>
{
CreateEmptyProperties = !CreateEmptyProperties;
if (CreateEmptyProperties)
{
Params.Input.Clear();
ClearData();
}
else if (Params.Input.Count == 0)
{
var p = CreateParameter(GH_ParameterSide.Input, 0);
Params.RegisterInputParam(p);
}
ExpireSolution(true);
},
true,
CreateEmptyProperties
);
emptyPropsMenuItem.ToolTipText =
"Toggle creating empty Properties. If set, the output Properties will be empty. Use for removing properties from objects.";
}
}
@@ -29,7 +29,7 @@ public class ModelMenuHandler
ModelContextMenuButton = new GhContextMenuButton(
"Select Model",
"Select Model",
"Right-click to select a model",
"Left-click to select a model",
PopulateMenu
);
}
@@ -46,7 +46,7 @@ public class ModelMenuHandler
public void RedrawMenuButton(Model? model)
{
var suffix = ModelContextMenuButton.Enabled
? "Right-click to select another model."
? "Left-click to select another model."
: "Selection is disabled due to component input.";
if (model != null)
{
@@ -58,7 +58,7 @@ public class ModelMenuHandler
{
ModelContextMenuButton.Name = "Select Model";
ModelContextMenuButton.NickName = "Model";
ModelContextMenuButton.Description = "Right-click to select model";
ModelContextMenuButton.Description = "Left-click to select model";
}
}
@@ -29,7 +29,7 @@ public class ProjectMenuHandler
ProjectContextMenuButton = new GhContextMenuButton(
"Select Project",
"Select Project",
"Right-click to select project",
"Left-click to select project",
PopulateMenu
);
}
@@ -46,7 +46,7 @@ public class ProjectMenuHandler
public void RedrawMenuButton(Project? project)
{
var suffix = ProjectContextMenuButton.Enabled
? "Right-click to select another project."
? "Left-click to select another project."
: "Selection is disabled due to component input.";
if (project != null)
{
@@ -58,7 +58,7 @@ public class ProjectMenuHandler
{
ProjectContextMenuButton.Name = "Select Project";
ProjectContextMenuButton.NickName = "Project";
ProjectContextMenuButton.Description = "Right-click to select project";
ProjectContextMenuButton.Description = "Left-click to select project";
}
}
@@ -27,7 +27,7 @@ public class VersionMenuHandler
VersionContextMenuButton = new GhContextMenuButton(
"Select Version",
"Select Project",
"Right-click to select a version",
"Left-click to select a version",
PopulateMenu
);
}
@@ -125,7 +125,7 @@ public class VersionMenuHandler
public void RedrawMenuButton(Version? version)
{
var suffix = VersionContextMenuButton.Enabled
? "Right-click to select another version."
? "Left-click to select another version."
: "Selection is disabled due to component input.";
if (version != null)
{
@@ -143,7 +143,7 @@ public class VersionMenuHandler
{
VersionContextMenuButton.Name = "Select Version";
VersionContextMenuButton.NickName = "Version";
VersionContextMenuButton.Description = "Right-click to select version";
VersionContextMenuButton.Description = "Left-click to select version";
}
}
@@ -33,7 +33,7 @@ public class WorkspaceMenuHandler
WorkspaceContextMenuButton = new GhContextMenuButton(
"Select Workspace",
"Select Workspace",
"Right-click to select a workspace",
"Left-click to select a workspace",
PopulateMenu
);
}
@@ -114,7 +114,7 @@ public class WorkspaceMenuHandler
public void RedrawMenuButton(Workspace? workspace)
{
var suffix = WorkspaceContextMenuButton.Enabled
? "Right-click to select another workspace."
? "Left-click to select another workspace."
: "Selection is disabled due to component input.";
if (workspace != null && !IsPersonalProjects)
{
@@ -136,7 +136,7 @@ public class WorkspaceMenuHandler
WorkspaceContextMenuButton.SetIconOverride(null);
WorkspaceContextMenuButton.Name = "Select Workspace";
WorkspaceContextMenuButton.NickName = "Workspace";
WorkspaceContextMenuButton.Description = "Right-click to select workspace";
WorkspaceContextMenuButton.Description = "Left-click to select workspace";
}
}
@@ -104,7 +104,8 @@ public static class GrasshopperHelpers
/// <exception cref="SpeckleException">If it fails to cast</exception>
public static GeometryBase GeometricGooToGeometryBase(this IGH_GeometricGoo geoGeo)
{
var value = geoGeo.GetType().GetProperty("Value")?.GetValue(geoGeo);
// note: some objects (like text entities) can have multiple properties of name "Value"
var value = geoGeo.GetType().GetProperties().FirstOrDefault(x => x.Name == "Value")?.GetValue(geoGeo);
switch (value)
{
case GeometryBase gb:
@@ -1,4 +1,4 @@
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
@@ -59,6 +59,16 @@ namespace Speckle.Connectors.GrasshopperShared.Properties {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
public static System.Drawing.Bitmap speckle_logo {
get {
object obj = ResourceManager.GetObject("logo", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
@@ -118,6 +118,9 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="logo" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\logo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="speckle_collections_create" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\speckle_collections_create.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -1,3 +1,4 @@
using Grasshopper;
using Grasshopper.Kernel;
using Microsoft.Extensions.DependencyInjection;
using Speckle.Connectors.Common;
@@ -6,9 +7,11 @@ using Speckle.Connectors.Common.Builders;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.Common.Operations.Receive;
using Speckle.Connectors.Common.Threading;
using Speckle.Connectors.GrasshopperShared.Components;
using Speckle.Connectors.GrasshopperShared.Operations.Receive;
using Speckle.Connectors.GrasshopperShared.Operations.Send;
using Speckle.Connectors.GrasshopperShared.Parameters;
using Speckle.Connectors.GrasshopperShared.Properties;
using Speckle.Converters.Rhino;
using Speckle.Sdk;
using Speckle.Sdk.Credentials;
@@ -23,6 +26,9 @@ public class PriorityLoader : GH_AssemblyPriority
public override GH_LoadingInstruction PriorityLoad()
{
Instances.ComponentServer.AddCategoryIcon(ComponentCategories.PRIMARY_RIBBON, Resources.speckle_logo);
Instances.ComponentServer.AddCategorySymbolName(ComponentCategories.PRIMARY_RIBBON, 'S');
try
{
var services = new ServiceCollection();
Binary file not shown.

After

Width:  |  Height:  |  Size: 682 B

@@ -91,4 +91,7 @@
<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)Resources\speckle_objects_object.png" />
</ItemGroup>
<ItemGroup>
<Content Include="$(MSBuildThisFileDirectory)Resources\logo.png" />
</ItemGroup>
</Project>
@@ -16,8 +16,8 @@ using Rhino.PlugIns;
// Icons should be Windows .ico files and contain 32-bit images in the following sizes: 16, 24, 32, 48, and 256.
[assembly: PlugInDescription(DescriptionType.Icon, "Speckle.Connectors.Rhino8.Resources.speckle32.ico")]
// The following GUID is for the ID of the typelib if this project is exposed to COM
// The following GUID is for the ID of the typelib if this pro ject is exposed to COM
// This will also be the Guid of the Rhino plug-in
[assembly: Guid("40f6defd-3677-42b6-9d19-3cd604a0a288")]
[assembly: Guid("2153799A-0CEC-40DE-BC3A-01E5055222FF")]
[assembly: NeutralResourcesLanguage("en")]
@@ -50,7 +50,8 @@ public class TeklaBasicConnectorBinding : IBasicConnectorBinding
public string GetConnectorVersion() => _speckleApplication.SpeckleVersion;
public DocumentInfo? GetDocumentInfo() => new DocumentInfo("Test", "Test", "Test");
public DocumentInfo GetDocumentInfo() =>
new(_model.GetInfo().ModelPath, _model.GetInfo().ModelName, _model.GetInfo().GetHashCode().ToString());
public DocumentModelStore GetDocumentState() => _store;
@@ -5,7 +5,7 @@
<DefineConstants>$(DefineConstants);AUTOCAD2026;AUTOCAD</DefineConstants>
<Configurations>Debug;Release;Local</Configurations>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2026.0.0" />
</ItemGroup>
@@ -86,4 +86,4 @@
<Compile Include="$(MSBuildThisFileDirectory)ToSpeckle\Raw\DBSplineToSpeckleRawConverter.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ToSpeckle\Raw\VectorToSpeckleRawConverter.cs" />
</ItemGroup>
</Project>
</Project>
@@ -62,9 +62,15 @@ public class CurveToHostRawConverter : ITypedConverter<SOG.Curve, AG.NurbCurve3d
: new AG.DoubleCollection(weightsList.ToArray());
AG.NurbCurve3d curve = new(target.degree, knots, pointCollection, weights, target.periodic);
if (target.closed)
if (target.closed && pointCollection[0].DistanceTo(pointCollection[^1]) > 0.001)
{
curve.MakeClosed();
// method curve.MakeClosed() is unreliable: after TopLevelConverter uses ADB.Curve.CreateFromGeCurve to convert it to Spline, sometimes the spline.Closed=false
pointCollection.Add(pointCollection[0]);
if (weights.Count > 0)
{
weights.Add(weights[0]);
}
curve = new(target.degree, knots, pointCollection, weights, target.periodic);
}
curve.SetInterval(_intervalConverter.Convert(target.domain));
@@ -63,7 +63,8 @@ public class RegionHatchToHostRawConverter : ITypedConverter<SOG.Region, ADB.Hat
CheckForNonPlanarLoops(convertedCurve);
var dbCurve = (ADB.Curve)convertedCurve[0].Item1;
// If Spline, turn into segmented polyline - this is how AutoCAD imports Hatches with Curve boundaries from Rhino
// If Spline, turn into segmented polyline - this is how AutoCAD best imports Hatches with Curve boundaries from Rhino
// Splines from AutoCAD don't need to be segmented (shape is fully preserved), but we don't have a way to distinguish them
if (dbCurve is ADB.Spline spline)
{
if (spline.NurbsData.Degree == 1)
@@ -21,21 +21,21 @@ public class RegionToHostRawConverter : ITypedConverter<SOG.Region, ADB.Region>
// Converted boundary
List<(ADB.Entity, Base)> convertedBoundary = _curveConverter.Convert(target.boundary);
ADB.Curve nativeBoundary = ValidateCurve(convertedBoundary);
List<ADB.Entity> nativeBoundary = convertedBoundary.Select(x => x.Item1).ToList();
// Converted loops
var nativeLoops = new List<ADB.Curve>();
List<List<ADB.Entity>> nativeLoops = new();
foreach (var loop in target.innerLoops)
{
List<(ADB.Entity, Base)> convertedLoop = _curveConverter.Convert(loop);
nativeLoops.Add(ValidateCurve(convertedLoop));
nativeLoops.Add(convertedLoop.Select(x => x.Item1).ToList());
}
// Add boundary to the ADB.DBObjectCollection
// Calculate the outer region, method should return an array with 1 region
// https://help.autodesk.com/view/OARX/2025/ENU/?guid=GUID-684E602E-3555-4370-BCDC-1CE594676C43
ADB.DBObjectCollection boundaryDBObjColl = new();
boundaryDBObjColl.Add(nativeBoundary);
nativeBoundary.ForEach(x => boundaryDBObjColl.Add(x));
using (ADB.DBObjectCollection outerRegionColl = ADB.Region.CreateFromCurves(boundaryDBObjColl))
{
if (outerRegionColl.Count != 1)
@@ -52,7 +52,7 @@ public class RegionToHostRawConverter : ITypedConverter<SOG.Region, ADB.Region>
// Same as above: Add loop segments to the ADB.DBObjectCollection
// Calculate the inner region, method should return an array with 1 region
ADB.DBObjectCollection loopDBObjColl = new();
loopDBObjColl.Add(nativeLoop);
nativeLoop.ForEach(x => loopDBObjColl.Add(x));
using (ADB.DBObjectCollection innerRegionColl = ADB.Region.CreateFromCurves(loopDBObjColl))
{
if (innerRegionColl.Count != 1)
@@ -76,14 +76,4 @@ public class RegionToHostRawConverter : ITypedConverter<SOG.Region, ADB.Region>
throw new ConversionException($"Region conversion failed: {target}");
}
private ADB.Curve ValidateCurve(List<(ADB.Entity, Base)> convertedResult)
{
if (convertedResult.Count != 1)
{
// this will only be the case if it was a non-planar Polycurve: throw error
throw new ConversionException($"Non-planar Polycurve cannot be used as a Region loop: {convertedResult}");
}
return (ADB.Curve)convertedResult[0].Item1;
}
}
@@ -17,19 +17,25 @@ public class HatchToSpeckleConverter : IToSpeckleTopLevelConverter, ITypedConver
public Base Convert(object target) => Convert((ADB.Hatch)target);
/// <summary>
/// Converting AutoCAD Hatch to Speckle Region.
/// This method first converts Hatch to AutoCAD Region, and then uses RegionToSpeckle converter.
/// AutoCAD Region is a much simpler class than Hatch, and converting to region allows us to handle a bunch of unsupported conditions in Hatches.
/// </summary>
/// <param name="target">AutoCAD Hatch object</param>
/// <returns>Speckle Region with property 'hasHatchPattern' as 'true'</returns>
public SOG.Region Convert(ADB.Hatch target)
{
ADB.Region? regionToConvert = null;
for (int i = 0; i < target.NumberOfLoops; i++)
{
// Create 3d polyline from the HatchLoop
// Convert HatchLoop into DBObjectCollection for the subsequent construction of the Region (.CreateFromCurves())
ADB.HatchLoop loop = target.GetLoopAt(i);
ADB.Curve polyline = PolylineFromLoop(loop);
List<ADB.Curve> polyline = ConvertHatchLoopToCurveEntityList(loop);
ADB.DBObjectCollection objCollection = new();
objCollection.Add(polyline);
polyline.ForEach(x => objCollection.Add(x));
// Convert polyline into an individual Region
// Convert a loop (represented by DBObjectCollection) into an individual Region
using (ADB.DBObjectCollection regionCollection = ADB.Region.CreateFromCurves(objCollection))
{
if (regionCollection.Count != 1)
@@ -38,6 +44,7 @@ public class HatchToSpeckleConverter : IToSpeckleTopLevelConverter, ITypedConver
$"Hatch conversion failed {target}: unexpected number of regions generated from 1 hatch loop"
);
}
ADB.Region loopRegion = (ADB.Region)regionCollection[0];
// Assign first loop as the main Region, other Regions will be subtracted from it
@@ -51,6 +58,7 @@ public class HatchToSpeckleConverter : IToSpeckleTopLevelConverter, ITypedConver
{
throw new ConversionException($"Hatch conversion failed: {target}");
}
// subtract region from Boundary region
double areaBefore = regionToConvert.Area;
regionToConvert.BooleanOperation(ADB.BooleanOperationType.BoolSubtract, loopRegion);
@@ -69,6 +77,10 @@ public class HatchToSpeckleConverter : IToSpeckleTopLevelConverter, ITypedConver
throw new ConversionException($"Hatch conversion failed: {target}");
}
// move this region to the target elevation
// POC: I've tried passing this elevation to ConvertHatchLoopToCurveEntityList() for direct assignment when converting 2d to 3d points, but this results in non-planarity in splines for some reason.
regionToConvert.TransformBy(AG.Matrix3d.Displacement(new AG.Vector3d(0, 0, target.Elevation)));
// convert and store Regions
SOG.Region convertedRegion = _regionConverter.Convert(regionToConvert);
convertedRegion.hasHatchPattern = true;
@@ -76,44 +88,105 @@ public class HatchToSpeckleConverter : IToSpeckleTopLevelConverter, ITypedConver
return convertedRegion;
}
private ADB.Curve PolylineFromLoop(ADB.HatchLoop loop)
/// <summary>
/// Converts Hatchloops to database-resident curve entities.
/// Curve entities are required by the Region create method.
/// </summary>
private List<ADB.Curve> ConvertHatchLoopToCurveEntityList(ADB.HatchLoop loop)
{
List<ADB.Curve> curveList = new();
// 1 - handle the case of a polyline first
if (loop.IsPolyline)
{
// disposable object, wrapping into "using"
using (AG.Point3dCollection vertices = new())
// create a polyline from the loop.Polyline BulgeVertexCollection
ADB.Polyline polyline = new() { Closed = true };
for (int i = 0; i < loop.Polyline.Count; i++)
{
// collect vertices and construct a polyline simultaneously, it will be clear what to use after iterating
ADB.Polyline polyline = new() { Closed = true };
var vertex = loop.Polyline[i];
int count = 0;
foreach (ADB.BulgeVertex bVertex in loop.Polyline)
// check if this is the last point, the closed property is already set and duplicated endpoints will result in an invalid polyline
if (i == loop.Polyline.Count - 1 && vertex.Vertex.GetDistanceTo(loop.Polyline[0].Vertex) < 0.001)
{
// don't add the end point that's the same as the start point
AG.Point3d newPt = new(bVertex.Vertex.X, bVertex.Vertex.Y, 0);
if (count == 0 || vertices[0].DistanceTo(newPt) > 0.00001)
{
vertices.Add(newPt);
polyline.AddVertexAt(count, bVertex.Vertex, bVertex.Bulge, 0, 0);
count++;
}
continue;
}
// if only 2 points, that's a circle
if (vertices.Count == 2)
{
AG.Point3d centerPt =
new(
vertices[0].X + (vertices[1].X - vertices[0].X) / 2,
vertices[0].Y + (vertices[1].Y - vertices[0].Y) / 2,
0
);
return new ADB.Circle(centerPt, AG.Vector3d.ZAxis, vertices[0].DistanceTo(vertices[1]) / 2);
}
return polyline;
polyline.AddVertexAt(i, vertex.Vertex, vertex.Bulge, 0, 0);
}
curveList.Add(polyline);
return curveList;
}
throw new ConversionException("Hatch loop conversion failed.");
// 2 - if the loop is not a polyline, handle the loop curves
// Notes: empirically, it seems that whenever the curve count is 1, it is a closed curve type like circle, ellipse, etc
// and when the curve count is > 1, they are line segments that will comprise of a closed area
// We'll process curves accordingly
if (loop.Curves.Count == 0)
{
throw new ConversionException($"Hatch loop doesn't contain any segments.");
}
foreach (AG.Curve2d curve in loop.Curves)
{
ADB.Curve? curveEntity = null;
switch (curve)
{
case AG.LineSegment2d l:
curveEntity = new ADB.Line(
new AG.Point3d(l.StartPoint.X, l.StartPoint.Y, 0),
new AG.Point3d(l.EndPoint.X, l.EndPoint.Y, 0)
);
break;
case AG.CircularArc2d c:
AG.Point3d cCenter = new(c.Center.X, c.Center.Y, 0);
curveEntity =
c.EndPoint == c.StartPoint
? new ADB.Circle(cCenter, AG.Vector3d.ZAxis, c.Radius)
: new ADB.Arc(cCenter, c.Radius, c.StartAngle, c.EndAngle);
break;
case AG.EllipticalArc2d e:
curveEntity = new ADB.Ellipse(
new AG.Point3d(e.Center.X, e.Center.Y, 0),
AG.Vector3d.ZAxis,
new AG.Vector3d(e.MajorAxis.X, e.MajorAxis.Y, 0),
e.MinorRadius / e.MajorRadius,
e.StartAngle,
e.EndAngle
);
break;
case AG.NurbCurve2d n: // need to convert to spline, ew
AG.Point3dCollection controlPoints = new();
AG.DoubleCollection knots = new();
n.Knots.Cast<double>().ToList().ForEach(x => knots.Add(x));
n.DefinitionData.ControlPoints.Cast<AG.Point2d>()
.ToList()
.ForEach(x => controlPoints.Add(new AG.Point3d(x.X, x.Y, 0)));
curveEntity = new ADB.Spline(
n.Degree,
n.IsRational,
n.IsClosed(),
n.IsPeriodic(out _),
controlPoints,
knots,
n.DefinitionData.Weights,
0,
0
);
break;
default:
throw new ConversionException($"Segments of type {curve.GetType()} are not supported");
}
curveList.Add(curveEntity);
}
return curveList;
}
}
@@ -12,21 +12,27 @@ public class RegionToSpeckleConverter : IToSpeckleTopLevelConverter, ITypedConve
private readonly ITypedConverter<ABR.Brep, SOG.Mesh> _brepConverter;
private readonly ITypedConverter<AG.LineSegment3d, SOG.Line> _lineConverter;
private readonly ITypedConverter<AG.CircularArc3d, SOG.Arc> _arcConverter;
private readonly ITypedConverter<ADB.Curve, ICurve> _nurbConverter;
private readonly ITypedConverter<ADB.Circle, SOG.Circle> _circleConverter;
private readonly ITypedConverter<ADB.Ellipse, SOG.Ellipse> _ellipseConverter;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public RegionToSpeckleConverter(
ITypedConverter<ABR.Brep, SOG.Mesh> brepConverter,
ITypedConverter<AG.LineSegment3d, SOG.Line> lineConverter,
ITypedConverter<AG.CircularArc3d, SOG.Arc> arcConverter,
ITypedConverter<ADB.Curve, ICurve> nurbConverter,
ITypedConverter<ADB.Circle, SOG.Circle> circleConverter,
ITypedConverter<ADB.Ellipse, SOG.Ellipse> ellipseConverter,
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_brepConverter = brepConverter;
_lineConverter = lineConverter;
_arcConverter = arcConverter;
_nurbConverter = nurbConverter;
_circleConverter = circleConverter;
_ellipseConverter = ellipseConverter;
_settingsStore = settingsStore;
}
@@ -51,12 +57,15 @@ public class RegionToSpeckleConverter : IToSpeckleTopLevelConverter, ITypedConve
.SelectMany(face => face.Loops);
// Get and convert boundary and inner loops
var boundary = GetConvertedLoops(brepLoops, true)[0];
var innerLoops = GetConvertedLoops(brepLoops, false);
List<ICurve> innerLoops = ParseAndConvertBrepLoops(brepLoops, out ICurve? outerLoop);
if (outerLoop is null)
{
throw new ConversionException("Could not convert outer region loop from brep.");
}
return new SOG.Region()
{
boundary = boundary,
boundary = outerLoop,
innerLoops = innerLoops,
hasHatchPattern = false,
displayValue = [mesh],
@@ -64,82 +73,87 @@ public class RegionToSpeckleConverter : IToSpeckleTopLevelConverter, ITypedConve
};
}
private List<ICurve> GetConvertedLoops(IEnumerable<ABR.BoundaryLoop> brepLoops, bool getOuterLoop)
// Iterates through a list of brep boundary loops, converting them to Speckle and parsing between inner and outer loops
private List<ICurve> ParseAndConvertBrepLoops(IEnumerable<ABR.BoundaryLoop> brepLoops, out ICurve? outerLoop)
{
var loops = new List<ICurve>();
List<ICurve> innerLoops = new();
outerLoop = null;
foreach (var loop in brepLoops)
{
bool outer = loop.LoopType == ABR.LoopType.LoopExterior;
// continue only if the loop type is as requester (outer or inner)
if ((outer && getOuterLoop) || (!outer && !getOuterLoop))
List<AG.Curve3d> segments = new();
foreach (ABR.Edge edge in loop.Edges)
{
// create segment collection for the current loop
var segments = new List<AG.Curve3d>();
foreach (var edge in loop.Edges)
if (edge.Curve is AG.ExternalCurve3d xCurve && xCurve.IsNativeCurve)
{
var curve = edge.Curve;
if (curve is AG.ExternalCurve3d xCurve && xCurve.IsNativeCurve)
{
segments.Add(xCurve.NativeCurve);
}
else
{
throw new ConversionException("Unsupported curve type for Region conversion");
}
segments.Add(xCurve.NativeCurve);
}
// reverse segment collection with arcs in case end-start points of subsequent segments don't match
if (segments.Count > 1 && Math.Abs(segments[0].EndPoint.DistanceTo(segments[1].StartPoint)) > 0.00001)
else
{
segments.Reverse();
throw new ConversionException("Unsupported curve type for Region conversion");
}
}
// convert segments to Speckle Polycurve or Circle
var convertedLoop = ConvertSegmentsToICurve(segments);
loops.Add(convertedLoop);
ICurve convertedLoop =
segments.Count == 1 ? ConvertSegmentToICurve(segments.First()) : ConvertSegmentsToICurve(segments);
// sort inner or outer loop
if (loop.LoopType == ABR.LoopType.LoopExterior)
{
outerLoop = convertedLoop;
}
else
{
innerLoops.Add(convertedLoop);
}
}
return loops;
return innerLoops;
}
private ICurve ConvertSegmentToICurve(AG.Curve3d segment)
{
switch (segment)
{
case AG.CircularArc3d arc: // expected to be closed
return arc.StartPoint == arc.EndPoint
? _circleConverter.Convert(new ADB.Circle(arc.Center, arc.Normal, arc.Radius))
: _arcConverter.Convert(arc);
case AG.EllipticalArc3d ellipse:
return _ellipseConverter.Convert(
new ADB.Ellipse(
ellipse.Center,
ellipse.Normal,
ellipse.MajorRadius * ellipse.MajorAxis,
ellipse.MinorRadius / ellipse.MajorRadius,
ellipse.StartAngle,
ellipse.EndAngle
)
);
case AG.NurbCurve3d nurbs:
return _nurbConverter.Convert(ADB.Curve.CreateFromGeCurve(nurbs));
default:
throw new ConversionException($"Unsupported curve type for Region conversion: {segment}");
}
}
private ICurve ConvertSegmentsToICurve(List<AG.Curve3d> segments)
{
ICurve convertedLoop;
// Handle edge case: if the segment is a closed Arc, then use Circle conversion to create a valid shape.
// Also, closed arcs cause errors when receiving in other host apps, like Rhino.
if (segments.Count == 1 && segments[0] is AG.CircularArc3d arc && arc.StartAngle + arc.EndAngle == 0)
return new SOG.Polycurve()
{
convertedLoop = _circleConverter.Convert(
new ADB.Circle(arc.GetPlane().PointOnPlane, arc.GetPlane().Normal, arc.Radius)
);
}
// otherwise, just construct a Polycurve from subsequent segments
else
{
// Maybe we need to convert to AutoCAD Polycurve
convertedLoop = new SOG.Polycurve()
{
segments = segments.Select(x => ConvertSegment(x)).ToList(),
closed = true,
units = _settingsStore.Current.SpeckleUnits
};
}
return convertedLoop;
segments = segments.Select(x => ConvertSegment(x)).ToList(),
closed = true,
units = _settingsStore.Current.SpeckleUnits
};
}
private ICurve ConvertSegment(AG.Curve3d curve)
{
switch (curve)
return curve switch
{
case AG.LineSegment3d line:
return _lineConverter.Convert(line);
case AG.CircularArc3d arc:
return _arcConverter.Convert(arc);
}
throw new ConversionException($"Unsupported curve type for Region conversion: {curve}");
AG.LineSegment3d line => _lineConverter.Convert(line),
AG.CircularArc3d arc => _arcConverter.Convert(arc),
AG.NurbCurve3d nurb => _nurbConverter.Convert(ADB.Curve.CreateFromGeCurve(nurb)),
_ => throw new ConversionException($"Unsupported curve type for Region conversion: {curve}")
};
}
}
@@ -3,12 +3,12 @@ using Speckle.Converters.Common.Objects;
namespace Speckle.Converters.Autocad.ToSpeckle.Raw;
public class CircularArc2dToSpeckleConverter : ITypedConverter<AG.CircularArc2d, SOG.Arc>
public class CircularArc2dToSpeckleRawConverter : ITypedConverter<AG.CircularArc2d, SOG.Arc>
{
private readonly ITypedConverter<AG.Plane, SOG.Plane> _planeConverter;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public CircularArc2dToSpeckleConverter(
public CircularArc2dToSpeckleRawConverter(
ITypedConverter<AG.Plane, SOG.Plane> planeConverter,
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
@@ -3,13 +3,13 @@ using Speckle.Converters.Common.Objects;
namespace Speckle.Converters.Autocad.ToSpeckle.Raw;
public class CircularArc3dToSpeckleConverter : ITypedConverter<AG.CircularArc3d, SOG.Arc>
public class CircularArc3dToSpeckleRawConverter : ITypedConverter<AG.CircularArc3d, SOG.Arc>
{
private readonly ITypedConverter<AG.Point3d, SOG.Point> _pointConverter;
private readonly ITypedConverter<AG.Plane, SOG.Plane> _planeConverter;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public CircularArc3dToSpeckleConverter(
public CircularArc3dToSpeckleRawConverter(
ITypedConverter<AG.Point3d, SOG.Point> pointConverter,
ITypedConverter<AG.Plane, SOG.Plane> planeConverter,
IConverterSettingsStore<AutocadConversionSettings> settingsStore
@@ -44,9 +44,14 @@ public sealed class BaseCurveExtractor
switch (entity)
{
// rant: if this is a pipe, the BaseCurve prop is fake news && will return a DB.line with start and endpoints set to [0,0,0] & [0,0,1]
// pressurepipes also tend to have null basecurves
// do not use basecurve for pipes 😡
case CDB.Pipe pipe:
return GetPipeBaseCurves(pipe);
#if CIVIL3D2024_OR_GREATER
case CDB.PressurePipe pressurePipe:
return GetPipeBaseCurves(pressurePipe);
#endif
case CDB.Alignment alignment:
return GetAlignmentBaseCurves(alignment);
@@ -77,6 +82,15 @@ public sealed class BaseCurveExtractor
}
}
#if CIVIL3D2024_OR_GREATER
private List<Speckle.Objects.ICurve> GetPipeBaseCurves(CDB.PressurePipe pipe)
{
return pipe.IsCurve
? new() { _arcConverter.Convert(pipe.CurveGeometry.GetArc2d()) }
: new() { _lineConverter.Convert(new AG.LineSegment3d(pipe.StartPoint, pipe.EndPoint)) };
}
#endif
private List<Speckle.Objects.ICurve> GetAlignmentBaseCurves(CDB.Alignment alignment)
{
// get the alignment subentity curves
@@ -53,6 +53,11 @@ public sealed class DisplayValueExtractor
SOG.Mesh partMesh = _solidConverter.Convert(part.Solid3dBody);
yield return partMesh;
break;
// pressure pipe networks: https://help.autodesk.com/view/CIV3D/2025/ENU/?guid=f1361ca3-4195-3b06-8a66-ecd31f5208b0
case CDB.PressurePart pressurePart:
SOG.Mesh pressurePartMesh = _solidConverter.Convert(pressurePart.Get3dBody());
yield return pressurePartMesh;
break;
// surfaces: https://help.autodesk.com/view/CIV3D/2025/ENU/?guid=d741aa49-e7da-9513-6b0b-226ebe3fa43f
// POC: volume surfaces not supported
@@ -16,12 +16,31 @@ public class PartDataExtractor
/// <returns></returns>
public Dictionary<string, object?>? GetPartData(CDB.Entity entity)
{
if (entity is CDB.Part part)
return entity switch
{
return ParsePartData(part.PartData);
CDB.Part part => ParsePartData(part.PartData),
CDB.PressurePart pressurePart => ParsePartData(pressurePart.PartData),
_ => null
};
}
private Dictionary<string, object?> ParsePartData(CDB.PressureNetworkPartData partData)
{
var result = new Dictionary<string, object?>();
foreach (CDB.PressurePartProperty prop in partData)
{
if (!prop.HasValue)
{
continue; // don't send null props
}
if (!result.ContainsKey(prop.DisplayName))
{
result.Add(prop.DisplayName, prop.Value);
}
}
return null;
return result;
}
private Dictionary<string, object?> ParsePartData(CDB.PartDataRecord partData)
@@ -6,10 +6,15 @@ namespace Speckle.Converters.RevitShared.ToSpeckle;
public class CurveConverterToHost : ITypedConverter<SOG.Curve, DB.Curve>
{
private readonly ITypedConverter<SOG.Point, DB.XYZ> _pointConverter;
private readonly ITypedConverter<SOG.Polyline, DB.CurveArray> _polylineConverter;
public CurveConverterToHost(ITypedConverter<SOG.Point, DB.XYZ> pointConverter)
public CurveConverterToHost(
ITypedConverter<SOG.Point, DB.XYZ> pointConverter,
ITypedConverter<SOG.Polyline, DB.CurveArray> polylineConverter
)
{
_pointConverter = pointConverter;
_polylineConverter = polylineConverter;
}
public DB.Curve Convert(SOG.Curve target)
@@ -33,9 +38,35 @@ public class CurveConverterToHost : ITypedConverter<SOG.Curve, DB.Curve>
speckleKnots.Add(speckleKnots[^1]);
}
//var knots = speckleKnots.GetRange(0, pts.Count + speckleCurve.degree + 1);
var curve = DB.NurbSpline.CreateCurve(target.degree, speckleKnots, pts, weights);
return curve;
try
{
//var knots = speckleKnots.GetRange(0, pts.Count + speckleCurve.degree + 1);
var curve = DB.NurbSpline.CreateCurve(target.degree, speckleKnots, pts, weights);
return curve;
}
// An exception was thrown by NurbSpline.CreateCurve
// because Revit is stricter than Rhino regarding the input parameters for NURBS curves.
// this case is encountered for semicircles that are converted as NURBS
// Exception message:
// "The multiplicities of other interior knots must be at most degree - 2."
// The solution below falls back to using displayValue.
catch (Autodesk.Revit.Exceptions.ArgumentException)
{
var curveArray = _polylineConverter.Convert(target.displayValue);
List<DB.XYZ> points = new List<DB.XYZ>();
if (curveArray.Size > 0)
{
points.Add(curveArray.get_Item(0).GetEndPoint(0));
foreach (DB.Curve curve in curveArray)
{
points.Add(curve.GetEndPoint(1));
}
}
return DB.HermiteSpline.Create(points, false);
}
}
else
{
@@ -5,6 +5,7 @@ using Speckle.DoubleNumerics;
using Speckle.Objects.Data;
using Speckle.Sdk.Common;
using Speckle.Sdk.Models;
using Speckle.Sdk.Models.Extensions;
namespace Speckle.Converters.RevitShared.ToSpeckle;
@@ -59,6 +60,15 @@ public class LocalToGlobalToDirectShapeConverter
// 2 - init DirectShape
var result = DB.DirectShape.CreateElement(_converterSettings.Current.Document, new DB.ElementId(dsCategory));
// NOTE: this should technically be in a property extraction class / helper method
// This change is localised to [CNX-1825](https://linear.app/speckle/issue/CNX-1825/set-directshape-name)
// TODO: Property extraction is a greater conversation which needs to be had: [CNX-1830](https://linear.app/speckle/issue/CNX-1830/data-exchange-investigations)
var name = target.atomicObject.TryGetName();
if (name is not null)
{
result.SetName(name);
}
// If there is no transforms to be applied, use the simple way of creating direct shapes
if (target.matrix.Count == 0)
{
@@ -0,0 +1,24 @@
namespace Speckle.Converters.Rhino.Extensions;
public static class GeometryBaseExtensions
{
/// <summary>
/// Getting translation vector from origin to the Geometry bbox Center (if geometry is far from origin and translation needed)
/// This is needed for some objects, because of Rhino using single precision numbers for Mesh vertices: https://wiki.mcneel.com/rhino/farfromorigin
/// </summary>
/// <returns>
/// Vector from origin to Geometry bbox center (if translation needed), otherwise zero-length vector.
/// </returns>
public static bool IsFarFromOrigin(this RG.GeometryBase geometry, out RG.Vector3d vectorToGeometry)
{
var geometryBbox = geometry.GetBoundingBox(false); // 'false' for 'accurate' parameter to accelerate bbox calculation
if (geometryBbox.Min.DistanceTo(RG.Point3d.Origin) > 1e5 || geometryBbox.Max.DistanceTo(RG.Point3d.Origin) > 1e5)
{
vectorToGeometry = new RG.Vector3d(geometryBbox.Center);
return true;
}
vectorToGeometry = new RG.Vector3d();
return false;
}
}
@@ -2,4 +2,7 @@
namespace Speckle.Converters.Rhino;
public record RhinoConversionSettings(RhinoDoc Document, string SpeckleUnits);
/// <summary>
/// Represents the settings used for Rhino and Grasshopper conversions.
/// </summary>
public record RhinoConversionSettings(RhinoDoc Document, string SpeckleUnits, bool ModelFarFromOrigin);
@@ -13,5 +13,19 @@ public class RhinoConversionSettingsFactory(
public RhinoConversionSettings Current => settingsStore.Current;
public RhinoConversionSettings Create(RhinoDoc document) =>
new(document, unitsConverter.ConvertOrThrow(RhinoDoc.ActiveDoc.ModelUnitSystem));
new(document, unitsConverter.ConvertOrThrow(RhinoDoc.ActiveDoc.ModelUnitSystem), ModelFarFromOrigin());
/// <summary>
/// Quick check whether any of the objects in the scene might be located too far from origin and cause precision issues during meshing.
/// It prevents 'normal' Rhino models (not too far from origin) from unnecessary Bbox calculations on every object on Send.
/// </summary>
private bool ModelFarFromOrigin()
{
RG.BoundingBox bbox = RhinoDoc.ActiveDoc.Objects.BoundingBox;
if (bbox.Min.DistanceTo(RG.Point3d.Origin) > 1e5 || bbox.Max.DistanceTo(RG.Point3d.Origin) > 1e5)
{
return true;
}
return false;
}
}
@@ -16,6 +16,7 @@ public class GeometryBaseConverter : IToSpeckleTopLevelConverter
private readonly ITypedConverter<RG.PointCloud, SOG.Pointcloud> _pointcloudConverter;
private readonly ITypedConverter<RG.PolyCurve, SOG.Polycurve> _polycurveConverter;
private readonly ITypedConverter<RG.Polyline, SOG.Polyline> _polylineConverter;
private readonly ITypedConverter<RG.TextEntity, SA.Text> _textConverter;
private readonly ITypedConverter<RG.Mesh, SOG.Mesh> _meshConverter;
private readonly ITypedConverter<RG.Extrusion, SOG.ExtrusionX> _extrusionConverter;
private readonly ITypedConverter<RG.SubD, SOG.SubDX> _subdConverter;
@@ -30,6 +31,7 @@ public class GeometryBaseConverter : IToSpeckleTopLevelConverter
ITypedConverter<RG.PointCloud, SOG.Pointcloud> pointcloudConverter,
ITypedConverter<RG.PolyCurve, SOG.Polycurve> polycurveConverter,
ITypedConverter<RG.Polyline, SOG.Polyline> polylineConverter,
ITypedConverter<RG.TextEntity, SA.Text> textConverter,
ITypedConverter<RG.Mesh, SOG.Mesh> meshConverter,
ITypedConverter<RG.Brep, SOG.BrepX> brepConverter,
ITypedConverter<RG.Extrusion, SOG.ExtrusionX> extrusionConverter,
@@ -44,6 +46,7 @@ public class GeometryBaseConverter : IToSpeckleTopLevelConverter
_pointcloudConverter = pointcloudConverter;
_polycurveConverter = polycurveConverter;
_polylineConverter = polylineConverter;
_textConverter = textConverter;
_meshConverter = meshConverter;
_brepConverter = brepConverter;
_extrusionConverter = extrusionConverter;
@@ -63,6 +66,7 @@ public class GeometryBaseConverter : IToSpeckleTopLevelConverter
RG.PolyCurve polyCurve => _polycurveConverter.Convert(polyCurve),
RG.Polyline polyline => _polylineConverter.Convert(polyline),
RG.PolylineCurve polylineCurve => _polylineConverter.Convert(polylineCurve.ToPolyline()),
RG.TextEntity text => _textConverter.Convert(text),
RG.Mesh mesh => _meshConverter.Convert(mesh),
RG.Brep brep => _brepConverter.Convert(brep),
RG.Extrusion ext => _extrusionConverter.Convert(ext),
@@ -1,4 +1,7 @@
using Rhino.DocObjects;
using Speckle.Converters.Common.Objects;
using Speckle.Converters.Rhino.Extensions;
using Speckle.DoubleNumerics;
using Speckle.Sdk.Common.Exceptions;
namespace Speckle.Converters.Rhino.ToSpeckle.Meshing;
@@ -43,8 +46,13 @@ public static class DisplayMeshExtractor
return joinedMesh;
}
public static RG.Mesh? GetGeometryDisplayMesh(RG.GeometryBase geometry)
/// <summary>
/// Extracting Rhino Mesh from Rhino GeometryBase using specified MeshingParameters settings, e.g. minimumEdgeLength.
/// </summary>
public static RG.Mesh GetGeometryDisplayMesh(RG.GeometryBase geometry, bool highPrecision = false)
{
double minEdgeLength = highPrecision ? GetAccurateMinEdgeLegth(geometry) : 0.05;
// declare "renderMeshes" as a separate var, because it needs to be checked for null after each Mesh.Create method
RG.Mesh[] renderMeshes;
var joinedMesh = new RG.Mesh();
@@ -52,7 +60,7 @@ public static class DisplayMeshExtractor
switch (geometry)
{
case RG.Brep brep:
renderMeshes = RG.Mesh.CreateFromBrep(brep, new(0.05, 0.05));
renderMeshes = RG.Mesh.CreateFromBrep(brep, new(0.05, minEdgeLength));
break;
case RG.SubD subd:
#pragma warning disable CA2000
@@ -61,7 +69,7 @@ public static class DisplayMeshExtractor
renderMeshes = [subdMesh];
break;
case RG.Extrusion extrusion:
renderMeshes = RG.Mesh.CreateFromBrep(extrusion.ToBrep(), new(0.05, 0.05));
renderMeshes = RG.Mesh.CreateFromBrep(extrusion.ToBrep(), new(0.05, minEdgeLength));
break;
default:
throw new ConversionException($"Unsupported object for display mesh generation {geometry.GetType().FullName}");
@@ -76,4 +84,63 @@ public static class DisplayMeshExtractor
joinedMesh.Append(renderMeshes);
return joinedMesh;
}
/// <summary>
/// Calculating optimal meshing parameter 'minimumEdgeLength' for the given geometry.
/// </summary>
private static double GetAccurateMinEdgeLegth(RG.GeometryBase geometry)
{
// adjust meshing parameters if Brep edges are too close to the document tolerance
double minEdgeLength = 0.05;
if (geometry is RG.Brep brep && brep.Edges.Any(x => x.GetLength() < minEdgeLength))
{
return 0;
}
return minEdgeLength;
}
/// <summary>
/// Extracting Rhino Mesh and converting to Speckle with the most suitable settings (e.g. moving to origin first, if needed)
/// This is needed because of Rhino using single precision numbers for Mesh vertices: https://wiki.mcneel.com/rhino/farfromorigin
/// </summary>
/// <returns>List of converted Speckle meshes</returns>
public static List<SOG.Mesh> GetSpeckleMeshes(
RG.GeometryBase geometry,
bool modelFarFromOrigin,
string units,
ITypedConverter<RG.Mesh, SOG.Mesh> meshConverter
)
{
RG.GeometryBase geometryToMesh = geometry;
RG.Vector3d? vector = null;
// 1.1. If needed, move geometry to origin
if (modelFarFromOrigin && geometry.IsFarFromOrigin(out RG.Vector3d vectorToGeometry))
{
geometryToMesh = geometry.Duplicate();
geometryToMesh.Transform(RG.Transform.Translation(-vectorToGeometry));
vector = vectorToGeometry;
}
// 1.2. Extract Rhino Mesh
RG.Mesh movedDisplayMesh = GetGeometryDisplayMesh(geometryToMesh, true);
// 2. Convert extracted Mesh to Speckle. We don't move geometry back yet, because 'far from origin' geometry is causing Speckle conversion issues too
List<SOG.Mesh> displayValue = new() { meshConverter.Convert(movedDisplayMesh) };
// 3. Move Speckle geometry back from origin, if translation was applied
MoveSpeckleMeshes(displayValue, vector, units);
return displayValue;
}
public static void MoveSpeckleMeshes(List<SOG.Mesh> displayValue, RG.Vector3d? vectorToGeometry, string units)
{
if (vectorToGeometry is RG.Vector3d vector)
{
Matrix4x4 matrix = new(1, 0, 0, vector.X, 0, 1, 0, vector.Y, 0, 0, 1, vector.Z, 0, 0, 0, 1);
SO.Transform transform = new() { matrix = matrix, units = units };
displayValue.ForEach(x => x.Transform(transform));
}
}
}
@@ -28,8 +28,12 @@ public class BrepToSpeckleConverter : ITypedConverter<RG.Brep, SOG.BrepX>
{
var brepEncoding = RawEncodingCreator.Encode(target, _settingsStore.Current.Document);
var displayMesh = DisplayMeshExtractor.GetGeometryDisplayMesh(target);
List<SOG.Mesh> displayValue = displayMesh is null ? new() : new() { _meshConverter.Convert(displayMesh) };
List<SOG.Mesh> displayValue = DisplayMeshExtractor.GetSpeckleMeshes(
target,
_settingsStore.Current.ModelFarFromOrigin,
_settingsStore.Current.SpeckleUnits,
_meshConverter
);
var bx = new SOG.BrepX()
{
@@ -28,8 +28,12 @@ public class ExtrusionToSpeckleConverter : ITypedConverter<RG.Extrusion, SOG.Ext
{
var extrusionEncoding = RawEncodingCreator.Encode(target, _settingsStore.Current.Document);
var displayMesh = DisplayMeshExtractor.GetGeometryDisplayMesh(target);
List<SOG.Mesh> displayValue = displayMesh is null ? new() : new() { _meshConverter.Convert(displayMesh) };
List<SOG.Mesh> displayValue = DisplayMeshExtractor.GetSpeckleMeshes(
target,
_settingsStore.Current.ModelFarFromOrigin,
_settingsStore.Current.SpeckleUnits,
_meshConverter
);
var bx = new SOG.ExtrusionX()
{
@@ -38,8 +38,13 @@ public class HatchToSpeckleConverter : ITypedConverter<RG.Hatch, SOG.Region>
// create display mesh from region by converting to brep first
var brep = RG.Brep.TryConvertBrep(target);
var displayMesh = DisplayMeshExtractor.GetGeometryDisplayMesh(brep);
List<SOG.Mesh> displayValue = displayMesh is null ? new() : new() { _meshConverter.Convert(displayMesh) };
List<SOG.Mesh> displayValue = DisplayMeshExtractor.GetSpeckleMeshes(
brep,
_settingsStore.Current.ModelFarFromOrigin,
_settingsStore.Current.SpeckleUnits,
_meshConverter
);
return new SOG.Region
{
@@ -1,5 +1,7 @@
using Speckle.Converters.Common;
using Speckle.Converters.Common.Objects;
using Speckle.Converters.Rhino.Extensions;
using Speckle.Converters.Rhino.ToSpeckle.Meshing;
using Speckle.Sdk.Common.Exceptions;
namespace Speckle.Converters.Rhino.ToSpeckle.Raw;
@@ -31,6 +33,30 @@ public class MeshToSpeckleConverter : ITypedConverter<RG.Mesh, SOG.Mesh>
{
throw new ValidationException("Cannot convert a mesh with 0 vertices/faces");
}
// Extracting Rhino Mesh and converting to Speckle with the most suitable settings (e.g. moving to origin first, if needed)
// This is needed because of Rhino using single precision numbers for Mesh vertices: https://wiki.mcneel.com/rhino/farfromorigin
RG.Mesh meshToConvert = target;
RG.Vector3d? vector = null;
// 1. If needed, move geometry to origin
if (_settingsStore.Current.ModelFarFromOrigin && target.IsFarFromOrigin(out RG.Vector3d vectorToGeometry))
{
meshToConvert = (RG.Mesh)target.Duplicate();
meshToConvert.Transform(RG.Transform.Translation(-vectorToGeometry));
vector = vectorToGeometry;
}
// 2. Convert extracted Mesh to Speckle. We don't move geometry back yet, because 'far from origin' geometry is causing Speckle conversion issues too
SOG.Mesh convertedMesh = ConvertMesh(meshToConvert);
// 3. Move Speckle geometry back from origin, if translation was applied
DisplayMeshExtractor.MoveSpeckleMeshes([convertedMesh], vector, _settingsStore.Current.SpeckleUnits);
return convertedMesh;
}
private SOG.Mesh ConvertMesh(RG.Mesh target)
{
var vertexCoordinates = new double[target.Vertices.Count * 3];
var x = 0;
for (int i = 0; i < target.Vertices.Count; i++)
@@ -28,8 +28,12 @@ public class SubDToSpeckleConverter : ITypedConverter<RG.SubD, SOG.SubDX>
{
var subdEncoding = RawEncodingCreator.Encode(target, _settingsStore.Current.Document);
var displayMesh = DisplayMeshExtractor.GetGeometryDisplayMesh(target);
List<SOG.Mesh> displayValue = displayMesh is null ? new() : new() { _meshConverter.Convert(displayMesh) };
List<SOG.Mesh> displayValue = DisplayMeshExtractor.GetSpeckleMeshes(
target,
_settingsStore.Current.ModelFarFromOrigin,
_settingsStore.Current.SpeckleUnits,
_meshConverter
);
var bx = new SOG.SubDX()
{
@@ -1,4 +1,4 @@
using Rhino.DocObjects;
using Rhino.DocObjects;
using Speckle.Converters.Common;
using Speckle.Converters.Common.Objects;
@@ -30,7 +30,7 @@ public class TextEntityToSpeckleConverter : ITypedConverter<RG.TextEntity, SA.Te
new()
{
value = target.PlainText,
height = target.TextHeight,
height = target.TextHeight * target.DimensionScale,
maxWidth = target.FormatWidth == 0 ? null : target.FormatWidth,
origin = _pointConverter.Convert(target.Plane.Origin),
plane = GetTextPlane(target),
+4 -2
View File
@@ -13,6 +13,7 @@
<PackageVersion Include="ILRepack.FullAuto" Version="1.6.0" />
<PackageVersion Include="JetBrains.Profiler.SelfApi" Version="2.5.12" />
<PackageVersion Include="LibTessDotNet" Version="1.1.15" />
<PackageVersion Include="Microsoft.VisualStudio.SolutionPersistence" Version="1.0.52" />
<PackageVersion Include="Moq" Version="4.20.70" />
<PackageVersion Include="Microsoft.Build" Version="17.11.4" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
@@ -54,6 +55,7 @@
<GlobalPackageReference Include="PolySharp" Version="1.14.1" />
<GlobalPackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
<GlobalPackageReference Include="Speckle.InterfaceGenerator" Version="0.9.6" />
<GlobalPackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" /> <!-- allows for non-windows platforms to target net48 without error -->
<GlobalPackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" />
<!-- allows for non-windows platforms to target net48 without error -->
</ItemGroup>
</Project>
</Project>
+775 -833
View File
File diff suppressed because it is too large Load Diff
+201
View File
@@ -0,0 +1,201 @@
<Solution>
<Configurations>
<BuildType Name="Debug" />
<BuildType Name="Local" />
<BuildType Name="Release" />
</Configurations>
<Folder Name="/Build/">
<Project Path="Build/Build.csproj" />
<File Path=".github/workflows/pr.yml" />
<File Path=".github/workflows/release.yml" />
</Folder>
<Folder Name="/Config/">
<File Path=".csharpierrc.yaml" />
<File Path=".editorconfig" />
<File Path="codecov.yml" />
<File Path="CodeMetricsConfig.txt" />
<File Path="Directory.Build.props" />
<File Path="Directory.Packages.props" />
<File Path=".config/dotnet-tools.json" />
<File Path="global.json" />
<File Path="README.md" />
</Folder>
<Folder Name="/Connectors/" />
<Folder Name="/Connectors/ArcGIS/">
<Project Path="Connectors/ArcGIS/Speckle.Connectors.ArcGIS3/Speckle.Connectors.ArcGIS3.csproj" />
<Project Path="Converters/ArcGIS/Speckle.Converters.ArcGIS3/Speckle.Converters.ArcGIS3.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/">
<File Path="Connectors/Autocad/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Autocad/2022/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2022/Speckle.Connectors.Autocad2022.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2022/Speckle.Connectors.Civil3d2022.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2022/Speckle.Converters.Autocad2022.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2022/Speckle.Converters.Civil3d2022.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2023/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2023/Speckle.Connectors.Autocad2023.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2023/Speckle.Connectors.Civil3d2023.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2023/Speckle.Converters.Autocad2023.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2023/Speckle.Converters.Civil3d2023.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2024/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2024/Speckle.Connectors.Autocad2024.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2024/Speckle.Connectors.Civil3d2024.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2024/Speckle.Converters.Autocad2024.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2024/Speckle.Converters.Civil3d2024.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2025/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2025/Speckle.Connectors.Autocad2025.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2025/Speckle.Connectors.Civil3d2025.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2025/Speckle.Converters.Autocad2025.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2025/Speckle.Converters.Civil3d2025.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2026/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2026/Speckle.Connectors.Autocad2026.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2026/Speckle.Connectors.Civil3d2026.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2026/Speckle.Converters.Autocad2026.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2026/Speckle.Converters.Civil3d2026.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/Shared/">
<Project Path="Connectors/Autocad/Speckle.Connectors.AutocadShared/Speckle.Connectors.AutocadShared.shproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3dShared/Speckle.Connectors.Civil3dShared.shproj" />
<Project Path="Converters/Autocad/Speckle.Converters.AutocadShared/Speckle.Converters.AutocadShared.shproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3dShared/Speckle.Converters.Civil3dShared.shproj" />
</Folder>
<Folder Name="/Connectors/CSi/" />
<Folder Name="/Connectors/CSi/ETABS21/">
<Project Path="Connectors/CSi/Speckle.Connectors.ETABS21/Speckle.Connectors.ETABS21.csproj" />
<Project Path="Converters/CSi/Speckle.Converters.ETABS21/Speckle.Converters.ETABS21.csproj" />
</Folder>
<Folder Name="/Connectors/CSi/ETABS22/">
<Project Path="Connectors/CSi/Speckle.Connectors.ETABS22/Speckle.Connectors.ETABS22.csproj" />
<Project Path="Converters/CSi/Speckle.Converters.ETABS22/Speckle.Converters.ETABS22.csproj" />
</Folder>
<Folder Name="/Connectors/CSi/Shared/">
<Project Path="Connectors/CSi/Speckle.Connectors.CSiShared/Speckle.Connectors.CSiShared.shproj" />
<Project Path="Connectors/CSi/Speckle.Connectors.ETABSShared/Speckle.Connectors.ETABSShared.shproj" />
<Project Path="Converters/CSi/Speckle.Converters.CSiShared/Speckle.Converters.CSiShared.shproj" />
<Project Path="Converters/CSi/Speckle.Converters.ETABSShared/Speckle.Converters.ETABSShared.shproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/">
<File Path="Connectors/Navisworks/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Navisworks/2020/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2020/Speckle.Connectors.Navisworks2020.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2020/Speckle.Converters.Navisworks2020.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2021/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2021/Speckle.Connectors.Navisworks2021.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2021/Speckle.Converters.Navisworks2021.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2022/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2022/Speckle.Connectors.Navisworks2022.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2022/Speckle.Converters.Navisworks2022.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2023/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2023/Speckle.Connectors.Navisworks2023.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2023/Speckle.Converters.Navisworks2023.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2024/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2024/Speckle.Connectors.Navisworks2024.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2024/Speckle.Converters.Navisworks2024.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2025/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2025/Speckle.Connectors.Navisworks2025.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2025/Speckle.Converters.Navisworks2025.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2026/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2026/Speckle.Connectors.Navisworks2026.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2026/Speckle.Converters.Navisworks2026.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/Shared/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Speckle.Connectors.NavisworksShared.shproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.NavisworksShared/Speckle.Converters.NavisworksShared.shproj" />
</Folder>
<Folder Name="/Connectors/Revit/">
<File Path="Connectors/Revit/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Revit/2022/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2022/Speckle.Connectors.Revit2022.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2022/Speckle.Converters.Revit2022.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/2023/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2023/Speckle.Connectors.Revit2023.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2023/Speckle.Converters.Revit2023.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/2024/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2024/Speckle.Connectors.Revit2024.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2024/Speckle.Converters.Revit2024.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/2025/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2025/Speckle.Connectors.Revit2025.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2025/Speckle.Converters.Revit2025.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/2026/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2026/Speckle.Connectors.Revit2026.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2026/Speckle.Converters.Revit2026.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/Shared/">
<Project Path="Connectors/Revit/Speckle.Connectors.RevitShared.Cef/Speckle.Connectors.RevitShared.Cef.shproj" />
<Project Path="Connectors/Revit/Speckle.Connectors.RevitShared/Speckle.Connectors.RevitShared.shproj" />
<Project Path="Converters/Revit/Speckle.Converters.RevitShared.Tests/Speckle.Converters.RevitShared.Tests.shproj" />
<Project Path="Converters/Revit/Speckle.Converters.RevitShared/Speckle.Converters.RevitShared.shproj" />
</Folder>
<Folder Name="/Connectors/Rhino/">
<File Path="Connectors/Rhino/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Rhino/7/">
<Project Path="Connectors/Rhino/Speckle.Connectors.Grasshopper7/Speckle.Connectors.Grasshopper7.csproj" />
<Project Path="Connectors/Rhino/Speckle.Connectors.Rhino7/Speckle.Connectors.Rhino7.csproj" />
<Project Path="Converters/Rhino/Speckle.Converters.Rhino7/Speckle.Converters.Rhino7.csproj" />
</Folder>
<Folder Name="/Connectors/Rhino/8/">
<Project Path="Connectors/Rhino/Speckle.Connectors.Grasshopper8/Speckle.Connectors.Grasshopper8.csproj" />
<Project Path="Connectors/Rhino/Speckle.Connectors.Rhino8/Speckle.Connectors.Rhino8.csproj" />
<Project Path="Converters/Rhino/Speckle.Converters.Rhino8/Speckle.Converters.Rhino8.csproj" />
</Folder>
<Folder Name="/Connectors/Rhino/Shared/">
<Project Path="Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Speckle.Connectors.GrasshopperShared.shproj" />
<Project Path="Connectors/Rhino/Speckle.Connectors.RhinoShared/Speckle.Connectors.RhinoShared.shproj" />
<Project Path="Converters/Rhino/Speckle.Converters.RhinoShared/Speckle.Converters.RhinoShared.shproj" />
</Folder>
<Folder Name="/Connectors/Tekla/">
<File Path="Connectors/Tekla/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Tekla/2023/">
<Project Path="Connectors/Tekla/Speckle.Connector.Tekla2023/Speckle.Connector.Tekla2023.csproj" />
<Project Path="Converters/Tekla/Speckle.Converter.Tekla2023/Speckle.Converter.Tekla2023.csproj" />
</Folder>
<Folder Name="/Connectors/Tekla/2024/">
<Project Path="Connectors/Tekla/Speckle.Connector.Tekla2024/Speckle.Connector.Tekla2024.csproj" />
<Project Path="Converters/Tekla/Speckle.Converter.Tekla2024/Speckle.Converter.Tekla2024.csproj" />
</Folder>
<Folder Name="/Connectors/Tekla/Shared/">
<Project Path="Connectors/Tekla/Speckle.Connector.TeklaShared/Speckle.Connectors.TeklaShared.shproj" />
<Project Path="Converters/Tekla/Speckle.Converters.TeklaShared/Speckle.Converters.TeklaShared.shproj" />
</Folder>
<Folder Name="/Importers/" />
<Folder Name="/Importers/Ifc/">
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester/Speckle.Importers.Ifc.Tester.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester2/Speckle.Importers.Ifc.Tester2.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc/Speckle.Importers.Ifc.csproj" />
</Folder>
<Folder Name="/Sdk/">
<Project Path="DUI3/Speckle.Connectors.DUI.Tests/Speckle.Connectors.DUI.Tests.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI.WebView/Speckle.Connectors.DUI.WebView.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI/Speckle.Connectors.DUI.csproj" />
<Project Path="Sdk/Speckle.Common.MeshTriangulation/Speckle.Common.MeshTriangulation.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common.Tests/Speckle.Connectors.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common/Speckle.Connectors.Common.csproj" />
<Project Path="Sdk/Speckle.Connectors.Logging/Speckle.Connectors.Logging.csproj" />
<Project Path="Sdk/Speckle.Converters.Common.Tests/Speckle.Converters.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Converters.Common/Speckle.Converters.Common.csproj" />
<Project Path="Sdk/Speckle.Performance/Speckle.Performance.csproj" />
<Project Path="Sdk/Speckle.Testing/Speckle.Testing.csproj" />
</Folder>
<Project Path="../speckle-sharp-sdk/src/Speckle.Objects/Speckle.Objects.csproj" />
<Project Path="../speckle-sharp-sdk/src/Speckle.Sdk.Dependencies/Speckle.Sdk.Dependencies.csproj" />
<Project Path="../speckle-sharp-sdk/src/Speckle.Sdk/Speckle.Sdk.csproj" />
</Solution>
+8
View File
@@ -58,6 +58,14 @@ Issues or questions? We encourage everyone interested to debug / hack / contribu
For good development experience and environment setup, run the commands below as needed.
### Switching to SLNX
SLNX was introduced with .NET 9 (in May 2024), Visual Studio 17.13 and Rider 2024.3. The older SLNs being used remain for now but will be removed when .NET 10 is introduced to the repo. SLNXs specific to certain host apps are being generated from the main SLN to allow for faster developmenet.
[https://devblogs.microsoft.com/dotnet/introducing-slnx-support-dotnet-cli/](https://devblogs.microsoft.com/dotnet/introducing-slnx-support-dotnet-cli/)
[https://devblogs.microsoft.com/visualstudio/new-simpler-solution-file-format/](https://devblogs.microsoft.com/visualstudio/new-simpler-solution-file-format/)
### Formatting
We're using [CSharpier](https://github.com/belav/csharpier) to format our code. You can install Csharpier in a few ways:
- Install CSharpier as a local tool and reformat from CLI
+47
View File
@@ -0,0 +1,47 @@
<Solution>
<Configurations>
<BuildType Name="Debug" />
<BuildType Name="Local" />
<BuildType Name="Release" />
</Configurations>
<Folder Name="/Build/">
<Project Path="Build/Build.csproj" />
<File Path=".github/workflows/pr.yml" />
<File Path=".github/workflows/release.yml" />
</Folder>
<Folder Name="/Config/">
<File Path=".csharpierrc.yaml" />
<File Path=".editorconfig" />
<File Path="codecov.yml" />
<File Path="CodeMetricsConfig.txt" />
<File Path="Directory.Build.props" />
<File Path="Directory.Packages.props" />
<File Path=".config/dotnet-tools.json" />
<File Path="global.json" />
<File Path="README.md" />
</Folder>
<Folder Name="/Connectors/" />
<Folder Name="/Connectors/ArcGIS/">
<Project Path="Connectors/ArcGIS/Speckle.Connectors.ArcGIS3/Speckle.Connectors.ArcGIS3.csproj" />
<Project Path="Converters/ArcGIS/Speckle.Converters.ArcGIS3/Speckle.Converters.ArcGIS3.csproj" />
</Folder>
<Folder Name="/Importers/" />
<Folder Name="/Importers/Ifc/">
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester/Speckle.Importers.Ifc.Tester.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester2/Speckle.Importers.Ifc.Tester2.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc/Speckle.Importers.Ifc.csproj" />
</Folder>
<Folder Name="/Sdk/">
<Project Path="DUI3/Speckle.Connectors.DUI.Tests/Speckle.Connectors.DUI.Tests.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI.WebView/Speckle.Connectors.DUI.WebView.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI/Speckle.Connectors.DUI.csproj" />
<Project Path="Sdk/Speckle.Common.MeshTriangulation/Speckle.Common.MeshTriangulation.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common.Tests/Speckle.Connectors.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common/Speckle.Connectors.Common.csproj" />
<Project Path="Sdk/Speckle.Connectors.Logging/Speckle.Connectors.Logging.csproj" />
<Project Path="Sdk/Speckle.Converters.Common.Tests/Speckle.Converters.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Converters.Common/Speckle.Converters.Common.csproj" />
<Project Path="Sdk/Speckle.Performance/Speckle.Performance.csproj" />
<Project Path="Sdk/Speckle.Testing/Speckle.Testing.csproj" />
</Folder>
</Solution>
+82
View File
@@ -0,0 +1,82 @@
<Solution>
<Configurations>
<BuildType Name="Debug" />
<BuildType Name="Local" />
<BuildType Name="Release" />
</Configurations>
<Folder Name="/Build/">
<Project Path="Build/Build.csproj" />
<File Path=".github/workflows/pr.yml" />
<File Path=".github/workflows/release.yml" />
</Folder>
<Folder Name="/Config/">
<File Path=".csharpierrc.yaml" />
<File Path=".editorconfig" />
<File Path="codecov.yml" />
<File Path="CodeMetricsConfig.txt" />
<File Path="Directory.Build.props" />
<File Path="Directory.Packages.props" />
<File Path=".config/dotnet-tools.json" />
<File Path="global.json" />
<File Path="README.md" />
</Folder>
<Folder Name="/Connectors/" />
<Folder Name="/Connectors/Autocad/">
<File Path="Connectors/Autocad/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Autocad/2022/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2022/Speckle.Connectors.Autocad2022.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2022/Speckle.Connectors.Civil3d2022.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2022/Speckle.Converters.Autocad2022.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2022/Speckle.Converters.Civil3d2022.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2023/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2023/Speckle.Connectors.Autocad2023.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2023/Speckle.Connectors.Civil3d2023.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2023/Speckle.Converters.Autocad2023.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2023/Speckle.Converters.Civil3d2023.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2024/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2024/Speckle.Connectors.Autocad2024.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2024/Speckle.Connectors.Civil3d2024.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2024/Speckle.Converters.Autocad2024.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2024/Speckle.Converters.Civil3d2024.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2025/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2025/Speckle.Connectors.Autocad2025.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2025/Speckle.Connectors.Civil3d2025.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2025/Speckle.Converters.Autocad2025.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2025/Speckle.Converters.Civil3d2025.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2026/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2026/Speckle.Connectors.Autocad2026.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2026/Speckle.Connectors.Civil3d2026.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2026/Speckle.Converters.Autocad2026.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2026/Speckle.Converters.Civil3d2026.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/Shared/">
<Project Path="Connectors/Autocad/Speckle.Connectors.AutocadShared/Speckle.Connectors.AutocadShared.shproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3dShared/Speckle.Connectors.Civil3dShared.shproj" />
<Project Path="Converters/Autocad/Speckle.Converters.AutocadShared/Speckle.Converters.AutocadShared.shproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3dShared/Speckle.Converters.Civil3dShared.shproj" />
</Folder>
<Folder Name="/Importers/" />
<Folder Name="/Importers/Ifc/">
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester/Speckle.Importers.Ifc.Tester.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester2/Speckle.Importers.Ifc.Tester2.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc/Speckle.Importers.Ifc.csproj" />
</Folder>
<Folder Name="/Sdk/">
<Project Path="DUI3/Speckle.Connectors.DUI.Tests/Speckle.Connectors.DUI.Tests.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI.WebView/Speckle.Connectors.DUI.WebView.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI/Speckle.Connectors.DUI.csproj" />
<Project Path="Sdk/Speckle.Common.MeshTriangulation/Speckle.Common.MeshTriangulation.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common.Tests/Speckle.Connectors.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common/Speckle.Connectors.Common.csproj" />
<Project Path="Sdk/Speckle.Connectors.Logging/Speckle.Connectors.Logging.csproj" />
<Project Path="Sdk/Speckle.Converters.Common.Tests/Speckle.Converters.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Converters.Common/Speckle.Converters.Common.csproj" />
<Project Path="Sdk/Speckle.Performance/Speckle.Performance.csproj" />
<Project Path="Sdk/Speckle.Testing/Speckle.Testing.csproj" />
</Folder>
</Solution>
+82
View File
@@ -0,0 +1,82 @@
<Solution>
<Configurations>
<BuildType Name="Debug" />
<BuildType Name="Local" />
<BuildType Name="Release" />
</Configurations>
<Folder Name="/Build/">
<Project Path="Build/Build.csproj" />
<File Path=".github/workflows/pr.yml" />
<File Path=".github/workflows/release.yml" />
</Folder>
<Folder Name="/Config/">
<File Path=".csharpierrc.yaml" />
<File Path=".editorconfig" />
<File Path="codecov.yml" />
<File Path="CodeMetricsConfig.txt" />
<File Path="Directory.Build.props" />
<File Path="Directory.Packages.props" />
<File Path=".config/dotnet-tools.json" />
<File Path="global.json" />
<File Path="README.md" />
</Folder>
<Folder Name="/Connectors/" />
<Folder Name="/Connectors/Autocad/">
<File Path="Connectors/Autocad/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Autocad/2022/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2022/Speckle.Connectors.Autocad2022.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2022/Speckle.Connectors.Civil3d2022.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2022/Speckle.Converters.Autocad2022.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2022/Speckle.Converters.Civil3d2022.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2023/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2023/Speckle.Connectors.Autocad2023.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2023/Speckle.Connectors.Civil3d2023.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2023/Speckle.Converters.Autocad2023.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2023/Speckle.Converters.Civil3d2023.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2024/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2024/Speckle.Connectors.Autocad2024.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2024/Speckle.Connectors.Civil3d2024.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2024/Speckle.Converters.Autocad2024.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2024/Speckle.Converters.Civil3d2024.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2025/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2025/Speckle.Connectors.Autocad2025.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2025/Speckle.Connectors.Civil3d2025.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2025/Speckle.Converters.Autocad2025.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2025/Speckle.Converters.Civil3d2025.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2026/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2026/Speckle.Connectors.Autocad2026.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2026/Speckle.Connectors.Civil3d2026.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2026/Speckle.Converters.Autocad2026.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2026/Speckle.Converters.Civil3d2026.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/Shared/">
<Project Path="Connectors/Autocad/Speckle.Connectors.AutocadShared/Speckle.Connectors.AutocadShared.shproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3dShared/Speckle.Connectors.Civil3dShared.shproj" />
<Project Path="Converters/Autocad/Speckle.Converters.AutocadShared/Speckle.Converters.AutocadShared.shproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3dShared/Speckle.Converters.Civil3dShared.shproj" />
</Folder>
<Folder Name="/Importers/" />
<Folder Name="/Importers/Ifc/">
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester/Speckle.Importers.Ifc.Tester.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester2/Speckle.Importers.Ifc.Tester2.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc/Speckle.Importers.Ifc.csproj" />
</Folder>
<Folder Name="/Sdk/">
<Project Path="DUI3/Speckle.Connectors.DUI.Tests/Speckle.Connectors.DUI.Tests.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI.WebView/Speckle.Connectors.DUI.WebView.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI/Speckle.Connectors.DUI.csproj" />
<Project Path="Sdk/Speckle.Common.MeshTriangulation/Speckle.Common.MeshTriangulation.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common.Tests/Speckle.Connectors.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common/Speckle.Connectors.Common.csproj" />
<Project Path="Sdk/Speckle.Connectors.Logging/Speckle.Connectors.Logging.csproj" />
<Project Path="Sdk/Speckle.Converters.Common.Tests/Speckle.Converters.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Converters.Common/Speckle.Converters.Common.csproj" />
<Project Path="Sdk/Speckle.Performance/Speckle.Performance.csproj" />
<Project Path="Sdk/Speckle.Testing/Speckle.Testing.csproj" />
</Folder>
</Solution>
+198
View File
@@ -0,0 +1,198 @@
<Solution>
<Configurations>
<BuildType Name="Debug" />
<BuildType Name="Local" />
<BuildType Name="Release" />
</Configurations>
<Folder Name="/Build/">
<Project Path="Build/Build.csproj" />
<File Path=".github/workflows/pr.yml" />
<File Path=".github/workflows/release.yml" />
</Folder>
<Folder Name="/Config/">
<File Path=".csharpierrc.yaml" />
<File Path=".editorconfig" />
<File Path="codecov.yml" />
<File Path="CodeMetricsConfig.txt" />
<File Path="Directory.Build.props" />
<File Path="Directory.Packages.props" />
<File Path=".config/dotnet-tools.json" />
<File Path="global.json" />
<File Path="README.md" />
</Folder>
<Folder Name="/Connectors/" />
<Folder Name="/Connectors/ArcGIS/">
<Project Path="Connectors/ArcGIS/Speckle.Connectors.ArcGIS3/Speckle.Connectors.ArcGIS3.csproj" />
<Project Path="Converters/ArcGIS/Speckle.Converters.ArcGIS3/Speckle.Converters.ArcGIS3.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/">
<File Path="Connectors/Autocad/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Autocad/2022/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2022/Speckle.Connectors.Autocad2022.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2022/Speckle.Connectors.Civil3d2022.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2022/Speckle.Converters.Autocad2022.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2022/Speckle.Converters.Civil3d2022.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2023/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2023/Speckle.Connectors.Autocad2023.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2023/Speckle.Connectors.Civil3d2023.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2023/Speckle.Converters.Autocad2023.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2023/Speckle.Converters.Civil3d2023.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2024/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2024/Speckle.Connectors.Autocad2024.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2024/Speckle.Connectors.Civil3d2024.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2024/Speckle.Converters.Autocad2024.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2024/Speckle.Converters.Civil3d2024.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2025/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2025/Speckle.Connectors.Autocad2025.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2025/Speckle.Connectors.Civil3d2025.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2025/Speckle.Converters.Autocad2025.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2025/Speckle.Converters.Civil3d2025.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/2026/">
<Project Path="Connectors/Autocad/Speckle.Connectors.Autocad2026/Speckle.Connectors.Autocad2026.csproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3d2026/Speckle.Connectors.Civil3d2026.csproj" />
<Project Path="Converters/Autocad/Speckle.Converters.Autocad2026/Speckle.Converters.Autocad2026.csproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3d2026/Speckle.Converters.Civil3d2026.csproj" />
</Folder>
<Folder Name="/Connectors/Autocad/Shared/">
<Project Path="Connectors/Autocad/Speckle.Connectors.AutocadShared/Speckle.Connectors.AutocadShared.shproj" />
<Project Path="Connectors/Autocad/Speckle.Connectors.Civil3dShared/Speckle.Connectors.Civil3dShared.shproj" />
<Project Path="Converters/Autocad/Speckle.Converters.AutocadShared/Speckle.Converters.AutocadShared.shproj" />
<Project Path="Converters/Civil3d/Speckle.Converters.Civil3dShared/Speckle.Converters.Civil3dShared.shproj" />
</Folder>
<Folder Name="/Connectors/CSi/" />
<Folder Name="/Connectors/CSi/ETABS21/">
<Project Path="Connectors/CSi/Speckle.Connectors.ETABS21/Speckle.Connectors.ETABS21.csproj" />
<Project Path="Converters/CSi/Speckle.Converters.ETABS21/Speckle.Converters.ETABS21.csproj" />
</Folder>
<Folder Name="/Connectors/CSi/ETABS22/">
<Project Path="Connectors/CSi/Speckle.Connectors.ETABS22/Speckle.Connectors.ETABS22.csproj" />
<Project Path="Converters/CSi/Speckle.Converters.ETABS22/Speckle.Converters.ETABS22.csproj" />
</Folder>
<Folder Name="/Connectors/CSi/Shared/">
<Project Path="Connectors/CSi/Speckle.Connectors.CSiShared/Speckle.Connectors.CSiShared.shproj" />
<Project Path="Connectors/CSi/Speckle.Connectors.ETABSShared/Speckle.Connectors.ETABSShared.shproj" />
<Project Path="Converters/CSi/Speckle.Converters.CSiShared/Speckle.Converters.CSiShared.shproj" />
<Project Path="Converters/CSi/Speckle.Converters.ETABSShared/Speckle.Converters.ETABSShared.shproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/">
<File Path="Connectors/Navisworks/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Navisworks/2020/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2020/Speckle.Connectors.Navisworks2020.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2020/Speckle.Converters.Navisworks2020.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2021/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2021/Speckle.Connectors.Navisworks2021.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2021/Speckle.Converters.Navisworks2021.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2022/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2022/Speckle.Connectors.Navisworks2022.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2022/Speckle.Converters.Navisworks2022.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2023/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2023/Speckle.Connectors.Navisworks2023.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2023/Speckle.Converters.Navisworks2023.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2024/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2024/Speckle.Connectors.Navisworks2024.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2024/Speckle.Converters.Navisworks2024.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2025/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2025/Speckle.Connectors.Navisworks2025.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2025/Speckle.Converters.Navisworks2025.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2026/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2026/Speckle.Connectors.Navisworks2026.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2026/Speckle.Converters.Navisworks2026.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/Shared/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Speckle.Connectors.NavisworksShared.shproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.NavisworksShared/Speckle.Converters.NavisworksShared.shproj" />
</Folder>
<Folder Name="/Connectors/Revit/">
<File Path="Connectors/Revit/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Revit/2022/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2022/Speckle.Connectors.Revit2022.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2022/Speckle.Converters.Revit2022.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/2023/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2023/Speckle.Connectors.Revit2023.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2023/Speckle.Converters.Revit2023.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/2024/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2024/Speckle.Connectors.Revit2024.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2024/Speckle.Converters.Revit2024.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/2025/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2025/Speckle.Connectors.Revit2025.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2025/Speckle.Converters.Revit2025.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/2026/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2026/Speckle.Connectors.Revit2026.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2026/Speckle.Converters.Revit2026.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/Shared/">
<Project Path="Connectors/Revit/Speckle.Connectors.RevitShared.Cef/Speckle.Connectors.RevitShared.Cef.shproj" />
<Project Path="Connectors/Revit/Speckle.Connectors.RevitShared/Speckle.Connectors.RevitShared.shproj" />
<Project Path="Converters/Revit/Speckle.Converters.RevitShared.Tests/Speckle.Converters.RevitShared.Tests.shproj" />
<Project Path="Converters/Revit/Speckle.Converters.RevitShared/Speckle.Converters.RevitShared.shproj" />
</Folder>
<Folder Name="/Connectors/Rhino/">
<File Path="Connectors/Rhino/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Rhino/7/">
<Project Path="Connectors/Rhino/Speckle.Connectors.Grasshopper7/Speckle.Connectors.Grasshopper7.csproj" />
<Project Path="Connectors/Rhino/Speckle.Connectors.Rhino7/Speckle.Connectors.Rhino7.csproj" />
<Project Path="Converters/Rhino/Speckle.Converters.Rhino7/Speckle.Converters.Rhino7.csproj" />
</Folder>
<Folder Name="/Connectors/Rhino/8/">
<Project Path="Connectors/Rhino/Speckle.Connectors.Grasshopper8/Speckle.Connectors.Grasshopper8.csproj" />
<Project Path="Connectors/Rhino/Speckle.Connectors.Rhino8/Speckle.Connectors.Rhino8.csproj" />
<Project Path="Converters/Rhino/Speckle.Converters.Rhino8/Speckle.Converters.Rhino8.csproj" />
</Folder>
<Folder Name="/Connectors/Rhino/Shared/">
<Project Path="Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Speckle.Connectors.GrasshopperShared.shproj" />
<Project Path="Connectors/Rhino/Speckle.Connectors.RhinoShared/Speckle.Connectors.RhinoShared.shproj" />
<Project Path="Converters/Rhino/Speckle.Converters.RhinoShared/Speckle.Converters.RhinoShared.shproj" />
</Folder>
<Folder Name="/Connectors/Tekla/">
<File Path="Connectors/Tekla/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Tekla/2023/">
<Project Path="Connectors/Tekla/Speckle.Connector.Tekla2023/Speckle.Connector.Tekla2023.csproj" />
<Project Path="Converters/Tekla/Speckle.Converter.Tekla2023/Speckle.Converter.Tekla2023.csproj" />
</Folder>
<Folder Name="/Connectors/Tekla/2024/">
<Project Path="Connectors/Tekla/Speckle.Connector.Tekla2024/Speckle.Connector.Tekla2024.csproj" />
<Project Path="Converters/Tekla/Speckle.Converter.Tekla2024/Speckle.Converter.Tekla2024.csproj" />
</Folder>
<Folder Name="/Connectors/Tekla/Shared/">
<Project Path="Connectors/Tekla/Speckle.Connector.TeklaShared/Speckle.Connectors.TeklaShared.shproj" />
<Project Path="Converters/Tekla/Speckle.Converters.TeklaShared/Speckle.Converters.TeklaShared.shproj" />
</Folder>
<Folder Name="/Importers/" />
<Folder Name="/Importers/Ifc/">
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester/Speckle.Importers.Ifc.Tester.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester2/Speckle.Importers.Ifc.Tester2.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc/Speckle.Importers.Ifc.csproj" />
</Folder>
<Folder Name="/Sdk/">
<Project Path="DUI3/Speckle.Connectors.DUI.Tests/Speckle.Connectors.DUI.Tests.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI.WebView/Speckle.Connectors.DUI.WebView.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI/Speckle.Connectors.DUI.csproj" />
<Project Path="Sdk/Speckle.Common.MeshTriangulation/Speckle.Common.MeshTriangulation.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common.Tests/Speckle.Connectors.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common/Speckle.Connectors.Common.csproj" />
<Project Path="Sdk/Speckle.Connectors.Logging/Speckle.Connectors.Logging.csproj" />
<Project Path="Sdk/Speckle.Converters.Common.Tests/Speckle.Converters.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Converters.Common/Speckle.Converters.Common.csproj" />
<Project Path="Sdk/Speckle.Performance/Speckle.Performance.csproj" />
<Project Path="Sdk/Speckle.Testing/Speckle.Testing.csproj" />
</Folder>
</Solution>
+58
View File
@@ -0,0 +1,58 @@
<Solution>
<Configurations>
<BuildType Name="Debug" />
<BuildType Name="Local" />
<BuildType Name="Release" />
</Configurations>
<Folder Name="/Build/">
<Project Path="Build/Build.csproj" />
<File Path=".github/workflows/pr.yml" />
<File Path=".github/workflows/release.yml" />
</Folder>
<Folder Name="/Config/">
<File Path=".csharpierrc.yaml" />
<File Path=".editorconfig" />
<File Path="codecov.yml" />
<File Path="CodeMetricsConfig.txt" />
<File Path="Directory.Build.props" />
<File Path="Directory.Packages.props" />
<File Path=".config/dotnet-tools.json" />
<File Path="global.json" />
<File Path="README.md" />
</Folder>
<Folder Name="/Connectors/" />
<Folder Name="/Connectors/CSi/" />
<Folder Name="/Connectors/CSi/ETABS21/">
<Project Path="Connectors/CSi/Speckle.Connectors.ETABS21/Speckle.Connectors.ETABS21.csproj" />
<Project Path="Converters/CSi/Speckle.Converters.ETABS21/Speckle.Converters.ETABS21.csproj" />
</Folder>
<Folder Name="/Connectors/CSi/ETABS22/">
<Project Path="Connectors/CSi/Speckle.Connectors.ETABS22/Speckle.Connectors.ETABS22.csproj" />
<Project Path="Converters/CSi/Speckle.Converters.ETABS22/Speckle.Converters.ETABS22.csproj" />
</Folder>
<Folder Name="/Connectors/CSi/Shared/">
<Project Path="Connectors/CSi/Speckle.Connectors.CSiShared/Speckle.Connectors.CSiShared.shproj" />
<Project Path="Connectors/CSi/Speckle.Connectors.ETABSShared/Speckle.Connectors.ETABSShared.shproj" />
<Project Path="Converters/CSi/Speckle.Converters.CSiShared/Speckle.Converters.CSiShared.shproj" />
<Project Path="Converters/CSi/Speckle.Converters.ETABSShared/Speckle.Converters.ETABSShared.shproj" />
</Folder>
<Folder Name="/Importers/" />
<Folder Name="/Importers/Ifc/">
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester/Speckle.Importers.Ifc.Tester.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester2/Speckle.Importers.Ifc.Tester2.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc/Speckle.Importers.Ifc.csproj" />
</Folder>
<Folder Name="/Sdk/">
<Project Path="DUI3/Speckle.Connectors.DUI.Tests/Speckle.Connectors.DUI.Tests.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI.WebView/Speckle.Connectors.DUI.WebView.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI/Speckle.Connectors.DUI.csproj" />
<Project Path="Sdk/Speckle.Common.MeshTriangulation/Speckle.Common.MeshTriangulation.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common.Tests/Speckle.Connectors.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common/Speckle.Connectors.Common.csproj" />
<Project Path="Sdk/Speckle.Connectors.Logging/Speckle.Connectors.Logging.csproj" />
<Project Path="Sdk/Speckle.Converters.Common.Tests/Speckle.Converters.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Converters.Common/Speckle.Converters.Common.csproj" />
<Project Path="Sdk/Speckle.Performance/Speckle.Performance.csproj" />
<Project Path="Sdk/Speckle.Testing/Speckle.Testing.csproj" />
</Folder>
</Solution>
+78
View File
@@ -0,0 +1,78 @@
<Solution>
<Configurations>
<BuildType Name="Debug" />
<BuildType Name="Local" />
<BuildType Name="Release" />
</Configurations>
<Folder Name="/Build/">
<Project Path="Build/Build.csproj" />
<File Path=".github/workflows/pr.yml" />
<File Path=".github/workflows/release.yml" />
</Folder>
<Folder Name="/Config/">
<File Path=".csharpierrc.yaml" />
<File Path=".editorconfig" />
<File Path="codecov.yml" />
<File Path="CodeMetricsConfig.txt" />
<File Path="Directory.Build.props" />
<File Path="Directory.Packages.props" />
<File Path=".config/dotnet-tools.json" />
<File Path="global.json" />
<File Path="README.md" />
</Folder>
<Folder Name="/Connectors/" />
<Folder Name="/Connectors/Navisworks/">
<File Path="Connectors/Navisworks/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Navisworks/2020/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2020/Speckle.Connectors.Navisworks2020.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2020/Speckle.Converters.Navisworks2020.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2021/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2021/Speckle.Connectors.Navisworks2021.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2021/Speckle.Converters.Navisworks2021.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2022/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2022/Speckle.Connectors.Navisworks2022.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2022/Speckle.Converters.Navisworks2022.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2023/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2023/Speckle.Connectors.Navisworks2023.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2023/Speckle.Converters.Navisworks2023.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2024/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2024/Speckle.Connectors.Navisworks2024.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2024/Speckle.Converters.Navisworks2024.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2025/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2025/Speckle.Connectors.Navisworks2025.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2025/Speckle.Converters.Navisworks2025.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/2026/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.Navisworks2026/Speckle.Connectors.Navisworks2026.csproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.Navisworks2026/Speckle.Converters.Navisworks2026.csproj" />
</Folder>
<Folder Name="/Connectors/Navisworks/Shared/">
<Project Path="Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Speckle.Connectors.NavisworksShared.shproj" />
<Project Path="Converters/Navisworks/Speckle.Converters.NavisworksShared/Speckle.Converters.NavisworksShared.shproj" />
</Folder>
<Folder Name="/Importers/" />
<Folder Name="/Importers/Ifc/">
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester/Speckle.Importers.Ifc.Tester.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester2/Speckle.Importers.Ifc.Tester2.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc/Speckle.Importers.Ifc.csproj" />
</Folder>
<Folder Name="/Sdk/">
<Project Path="DUI3/Speckle.Connectors.DUI.Tests/Speckle.Connectors.DUI.Tests.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI.WebView/Speckle.Connectors.DUI.WebView.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI/Speckle.Connectors.DUI.csproj" />
<Project Path="Sdk/Speckle.Common.MeshTriangulation/Speckle.Common.MeshTriangulation.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common.Tests/Speckle.Connectors.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common/Speckle.Connectors.Common.csproj" />
<Project Path="Sdk/Speckle.Connectors.Logging/Speckle.Connectors.Logging.csproj" />
<Project Path="Sdk/Speckle.Converters.Common.Tests/Speckle.Converters.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Converters.Common/Speckle.Converters.Common.csproj" />
<Project Path="Sdk/Speckle.Performance/Speckle.Performance.csproj" />
<Project Path="Sdk/Speckle.Testing/Speckle.Testing.csproj" />
</Folder>
</Solution>
+72
View File
@@ -0,0 +1,72 @@
<Solution>
<Configurations>
<BuildType Name="Debug" />
<BuildType Name="Local" />
<BuildType Name="Release" />
</Configurations>
<Folder Name="/Build/">
<Project Path="Build/Build.csproj" />
<File Path=".github/workflows/pr.yml" />
<File Path=".github/workflows/release.yml" />
</Folder>
<Folder Name="/Config/">
<File Path=".csharpierrc.yaml" />
<File Path=".editorconfig" />
<File Path="codecov.yml" />
<File Path="CodeMetricsConfig.txt" />
<File Path="Directory.Build.props" />
<File Path="Directory.Packages.props" />
<File Path=".config/dotnet-tools.json" />
<File Path="global.json" />
<File Path="README.md" />
</Folder>
<Folder Name="/Connectors/" />
<Folder Name="/Connectors/Revit/">
<File Path="Connectors/Revit/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Revit/2022/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2022/Speckle.Connectors.Revit2022.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2022/Speckle.Converters.Revit2022.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/2023/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2023/Speckle.Connectors.Revit2023.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2023/Speckle.Converters.Revit2023.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/2024/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2024/Speckle.Connectors.Revit2024.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2024/Speckle.Converters.Revit2024.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/2025/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2025/Speckle.Connectors.Revit2025.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2025/Speckle.Converters.Revit2025.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/2026/">
<Project Path="Connectors/Revit/Speckle.Connectors.Revit2026/Speckle.Connectors.Revit2026.csproj" />
<Project Path="Converters/Revit/Speckle.Converters.Revit2026/Speckle.Converters.Revit2026.csproj" />
</Folder>
<Folder Name="/Connectors/Revit/Shared/">
<Project Path="Connectors/Revit/Speckle.Connectors.RevitShared.Cef/Speckle.Connectors.RevitShared.Cef.shproj" />
<Project Path="Connectors/Revit/Speckle.Connectors.RevitShared/Speckle.Connectors.RevitShared.shproj" />
<Project Path="Converters/Revit/Speckle.Converters.RevitShared.Tests/Speckle.Converters.RevitShared.Tests.shproj" />
<Project Path="Converters/Revit/Speckle.Converters.RevitShared/Speckle.Converters.RevitShared.shproj" />
</Folder>
<Folder Name="/Importers/" />
<Folder Name="/Importers/Ifc/">
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester/Speckle.Importers.Ifc.Tester.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester2/Speckle.Importers.Ifc.Tester2.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc/Speckle.Importers.Ifc.csproj" />
</Folder>
<Folder Name="/Sdk/">
<Project Path="DUI3/Speckle.Connectors.DUI.Tests/Speckle.Connectors.DUI.Tests.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI.WebView/Speckle.Connectors.DUI.WebView.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI/Speckle.Connectors.DUI.csproj" />
<Project Path="Sdk/Speckle.Common.MeshTriangulation/Speckle.Common.MeshTriangulation.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common.Tests/Speckle.Connectors.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common/Speckle.Connectors.Common.csproj" />
<Project Path="Sdk/Speckle.Connectors.Logging/Speckle.Connectors.Logging.csproj" />
<Project Path="Sdk/Speckle.Converters.Common.Tests/Speckle.Converters.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Converters.Common/Speckle.Converters.Common.csproj" />
<Project Path="Sdk/Speckle.Performance/Speckle.Performance.csproj" />
<Project Path="Sdk/Speckle.Testing/Speckle.Testing.csproj" />
</Folder>
</Solution>
+61
View File
@@ -0,0 +1,61 @@
<Solution>
<Configurations>
<BuildType Name="Debug" />
<BuildType Name="Local" />
<BuildType Name="Release" />
</Configurations>
<Folder Name="/Build/">
<Project Path="Build/Build.csproj" />
<File Path=".github/workflows/pr.yml" />
<File Path=".github/workflows/release.yml" />
</Folder>
<Folder Name="/Config/">
<File Path=".csharpierrc.yaml" />
<File Path=".editorconfig" />
<File Path="codecov.yml" />
<File Path="CodeMetricsConfig.txt" />
<File Path="Directory.Build.props" />
<File Path="Directory.Packages.props" />
<File Path=".config/dotnet-tools.json" />
<File Path="global.json" />
<File Path="README.md" />
</Folder>
<Folder Name="/Connectors/" />
<Folder Name="/Connectors/Rhino/">
<File Path="Connectors/Rhino/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Rhino/7/">
<Project Path="Connectors/Rhino/Speckle.Connectors.Grasshopper7/Speckle.Connectors.Grasshopper7.csproj" />
<Project Path="Connectors/Rhino/Speckle.Connectors.Rhino7/Speckle.Connectors.Rhino7.csproj" />
<Project Path="Converters/Rhino/Speckle.Converters.Rhino7/Speckle.Converters.Rhino7.csproj" />
</Folder>
<Folder Name="/Connectors/Rhino/8/">
<Project Path="Connectors/Rhino/Speckle.Connectors.Grasshopper8/Speckle.Connectors.Grasshopper8.csproj" />
<Project Path="Connectors/Rhino/Speckle.Connectors.Rhino8/Speckle.Connectors.Rhino8.csproj" />
<Project Path="Converters/Rhino/Speckle.Converters.Rhino8/Speckle.Converters.Rhino8.csproj" />
</Folder>
<Folder Name="/Connectors/Rhino/Shared/">
<Project Path="Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Speckle.Connectors.GrasshopperShared.shproj" />
<Project Path="Connectors/Rhino/Speckle.Connectors.RhinoShared/Speckle.Connectors.RhinoShared.shproj" />
<Project Path="Converters/Rhino/Speckle.Converters.RhinoShared/Speckle.Converters.RhinoShared.shproj" />
</Folder>
<Folder Name="/Importers/" />
<Folder Name="/Importers/Ifc/">
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester/Speckle.Importers.Ifc.Tester.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester2/Speckle.Importers.Ifc.Tester2.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc/Speckle.Importers.Ifc.csproj" />
</Folder>
<Folder Name="/Sdk/">
<Project Path="DUI3/Speckle.Connectors.DUI.Tests/Speckle.Connectors.DUI.Tests.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI.WebView/Speckle.Connectors.DUI.WebView.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI/Speckle.Connectors.DUI.csproj" />
<Project Path="Sdk/Speckle.Common.MeshTriangulation/Speckle.Common.MeshTriangulation.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common.Tests/Speckle.Connectors.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common/Speckle.Connectors.Common.csproj" />
<Project Path="Sdk/Speckle.Connectors.Logging/Speckle.Connectors.Logging.csproj" />
<Project Path="Sdk/Speckle.Converters.Common.Tests/Speckle.Converters.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Converters.Common/Speckle.Converters.Common.csproj" />
<Project Path="Sdk/Speckle.Performance/Speckle.Performance.csproj" />
<Project Path="Sdk/Speckle.Testing/Speckle.Testing.csproj" />
</Folder>
</Solution>
+58
View File
@@ -0,0 +1,58 @@
<Solution>
<Configurations>
<BuildType Name="Debug" />
<BuildType Name="Local" />
<BuildType Name="Release" />
</Configurations>
<Folder Name="/Build/">
<Project Path="Build/Build.csproj" />
<File Path=".github/workflows/pr.yml" />
<File Path=".github/workflows/release.yml" />
</Folder>
<Folder Name="/Config/">
<File Path=".csharpierrc.yaml" />
<File Path=".editorconfig" />
<File Path="codecov.yml" />
<File Path="CodeMetricsConfig.txt" />
<File Path="Directory.Build.props" />
<File Path="Directory.Packages.props" />
<File Path=".config/dotnet-tools.json" />
<File Path="global.json" />
<File Path="README.md" />
</Folder>
<Folder Name="/Connectors/" />
<Folder Name="/Connectors/Tekla/">
<File Path="Connectors/Tekla/Directory.Build.targets" />
</Folder>
<Folder Name="/Connectors/Tekla/2023/">
<Project Path="Connectors/Tekla/Speckle.Connector.Tekla2023/Speckle.Connector.Tekla2023.csproj" />
<Project Path="Converters/Tekla/Speckle.Converter.Tekla2023/Speckle.Converter.Tekla2023.csproj" />
</Folder>
<Folder Name="/Connectors/Tekla/2024/">
<Project Path="Connectors/Tekla/Speckle.Connector.Tekla2024/Speckle.Connector.Tekla2024.csproj" />
<Project Path="Converters/Tekla/Speckle.Converter.Tekla2024/Speckle.Converter.Tekla2024.csproj" />
</Folder>
<Folder Name="/Connectors/Tekla/Shared/">
<Project Path="Connectors/Tekla/Speckle.Connector.TeklaShared/Speckle.Connectors.TeklaShared.shproj" />
<Project Path="Converters/Tekla/Speckle.Converters.TeklaShared/Speckle.Converters.TeklaShared.shproj" />
</Folder>
<Folder Name="/Importers/" />
<Folder Name="/Importers/Ifc/">
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester/Speckle.Importers.Ifc.Tester.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc.Tester2/Speckle.Importers.Ifc.Tester2.csproj" />
<Project Path="Importers/Ifc/Speckle.Importers.Ifc/Speckle.Importers.Ifc.csproj" />
</Folder>
<Folder Name="/Sdk/">
<Project Path="DUI3/Speckle.Connectors.DUI.Tests/Speckle.Connectors.DUI.Tests.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI.WebView/Speckle.Connectors.DUI.WebView.csproj" />
<Project Path="DUI3/Speckle.Connectors.DUI/Speckle.Connectors.DUI.csproj" />
<Project Path="Sdk/Speckle.Common.MeshTriangulation/Speckle.Common.MeshTriangulation.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common.Tests/Speckle.Connectors.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Connectors.Common/Speckle.Connectors.Common.csproj" />
<Project Path="Sdk/Speckle.Connectors.Logging/Speckle.Connectors.Logging.csproj" />
<Project Path="Sdk/Speckle.Converters.Common.Tests/Speckle.Converters.Common.Tests.csproj" />
<Project Path="Sdk/Speckle.Converters.Common/Speckle.Converters.Common.csproj" />
<Project Path="Sdk/Speckle.Performance/Speckle.Performance.csproj" />
<Project Path="Sdk/Speckle.Testing/Speckle.Testing.csproj" />
</Folder>
</Solution>