diff --git a/src/Speckle.Objects/BuiltElements/GridLine.cs b/src/Speckle.Objects/BuiltElements/GridLine.cs deleted file mode 100644 index 52576177..00000000 --- a/src/Speckle.Objects/BuiltElements/GridLine.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Speckle.Sdk.Models; - -namespace Speckle.Objects.BuiltElements; - -[SpeckleType("Objects.BuiltElements.GridLine")] -public class GridLine : Base, IDisplayValue> -{ - public required ICurve baseLine { get; set; } - public string label { get; set; } - public string units { get; set; } - - [DetachProperty] - public List displayValue { get; set; } -} diff --git a/src/Speckle.Objects/BuiltElements/Revit/DirectShape.cs b/src/Speckle.Objects/BuiltElements/Revit/DirectShape.cs deleted file mode 100644 index 97f1a2f5..00000000 --- a/src/Speckle.Objects/BuiltElements/Revit/DirectShape.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Speckle.Objects.Geometry; -using Speckle.Sdk.Models; - -namespace Speckle.Objects.BuiltElements.Revit; - -[SpeckleType("Objects.BuiltElements.Revit.DirectShape")] -public class DirectShape : Base, IDisplayValue> -{ - public required string name { get; set; } - public RevitCategory category { get; set; } - public Base? parameters { get; set; } - public string elementId { get; set; } - - [DetachProperty] - public List baseGeometries { get; set; } = new(); - - public string units { get; set; } - - [DetachProperty] - public List displayValue { get; set; } - - public bool IsValidObject(Base @base) - { - return @base is Point || @base is ICurve || @base is Mesh || @base is Brep; - } -} diff --git a/src/Speckle.Objects/BuiltElements/Revit/Enums.cs b/src/Speckle.Objects/BuiltElements/Revit/Enums.cs deleted file mode 100644 index 5ae7fa48..00000000 --- a/src/Speckle.Objects/BuiltElements/Revit/Enums.cs +++ /dev/null @@ -1,180 +0,0 @@ -namespace Speckle.Objects.BuiltElements.Revit; - -//This is an enum so that we can easily create a dropdown in GH for schema builder -//NOTE: if edited the list in Objects.Converter.Revit.Categories should be updated too -public enum RevitCategory -{ - AbutmentFoundations = 0, - AbutmentPiles = 1, - AbutmentWalls = 2, - DuctTerminal = 4, - BridgeAbutments = 3, - Alignments = 5, - StructConnectionAnchors = 6, - ApproachSlabs = 7, - BridgeArches = 8, - AudioVisualDevices = 9, - StairsRailingBaluster = 10, - BridgeBearings = 11, - StructConnectionBolts = 12, - BridgeCables = 13, - BridgeDecks = 14, - BridgeFraming = 15, - CableTrayFitting = 16, - CableTrayRun = 17, - CableTray = 18, - Casework = 19, - Ceilings = 20, - Columns = 21, - CommunicationDevices = 22, - ConduitFitting = 23, - Conduit = 24, - Coordination_Model = 25, - BridgeFramingCrossBracing = 26, - CurtainWallPanels = 27, - CurtaSystem = 28, - CurtainWallMullions = 29, - DataDevices = 30, - BridgeFramingDiaphragms = 31, - Doors = 32, - DuctAccessory = 33, - DuctFitting = 34, - PlaceHolderDucts = 35, - DuctSystem = 36, - DuctCurves = 37, - ElectricalEquipment = 38, - ElectricalFixtures = 39, - Entourage = 40, - ExpansionJoints = 41, - FireAlarmDevices = 42, - FireProtection = 43, - Floors = 44, - FoodServiceEquipment = 45, - Furniture = 46, - FurnitureSystems = 47, - GenericAnnotation = 48, - GenericModel = 49, - BridgeGirders = 50, - Hardscape = 51, - LightingDevices = 52, - LightingFixtures = 53, - Lines = 54, - Mass = 55, - MechanicalEquipment = 56, - MedicalEquipment = 57, - NurseCallDevices = 58, - Parking = 59, - Parts = 60, - PierCaps = 61, - PierColumns = 62, - BridgeFoundations = 63, - PierPiles = 64, - BridgeTowers = 65, - PierWalls = 66, - BridgePiers = 67, - PipeAccessory = 68, - PipeFitting = 69, - PlaceHolderPipes = 70, - PipeSegments = 71, - PipeCurves = 72, - PipingSystem = 73, - Planting = 74, - StructConnectionPlates = 75, - PlumbingFixtures = 76, - StructConnectionProfiles = 77, - StairsRailing = 78, - Ramps = 79, - Roads = 80, - Roofs = 81, - SecurityDevices = 82, - StructConnectionShearStuds = 83, - Signage = 84, - Site = 85, - SpecialityEquipment = 86, - Sprinklers = 87, - Stairs = 88, - StructuralFramingSystem = 89, - StructuralColumns = 90, - StructConnections = 91, - FabricAreas = 92, - StructuralFoundation = 93, - StructuralFraming = 94, - Rebar = 95, - Coupler = 96, - StructuralStiffener = 97, - StructuralTendons = 98, - StructuralTruss = 99, - TemporaryStructure = 100, - Topography = 101, - BridgeFramingTrusses = 102, - VerticalCirculation = 103, - VibrationDampers = 104, - VibrationIsolators = 105, - VibrationManagement = 106, - Walls = 107, - StructConnectionWelds = 108, - Windows = 109, - Railings = 110, -} - -/// -/// FamilyDocuments can only be assigned these categories -/// This is a subset of the list above which was manually retrieved from Revit's UI -/// -public enum RevitFamilyCategory -{ - AudioVisualDevices = 9, - CableTrayFitting = 16, - Casework = 19, - Columns = 21, - CommunicationDevices = 22, - ConduitFitting = 23, - DataDevices = 30, - Doors = 32, - DuctAccessory = 33, - DuctFitting = 34, - ElectricalEquipment = 38, - ElectricalFixtures = 39, - Entourage = 40, - FireAlarmDevices = 42, - FireProtection = 43, - FoodServiceEquipment = 45, - Furniture = 46, - FurnitureSystems = 47, - GenericModel = 49, - Hardscape = 51, - LightingDevices = 52, - LightingFixtures = 53, - Mass = 55, - MechanicalEquipment = 56, - MedicalEquipment = 57, - NurseCallDevices = 58, - Parking = 59, - PipeAccessory = 68, - PipeFitting = 69, - Planting = 74, - PlumbingFixtures = 76, - Roads = 80, - SecurityDevices = 82, - Signage = 84, - Site = 85, - SpecialityEquipment = 86, - Sprinklers = 87, - StructuralFramingSystem = 89, - StructuralColumns = 90, - StructConnections = 91, - StructuralFoundation = 93, - StructuralFraming = 94, - StructuralStiffener = 97, - TemporaryStructure = 100, - VerticalCirculation = 103, - Windows = 109, - Railings = 110, -} - -public enum LocationLine -{ - Centerline, - Exterior, - Interior, -} diff --git a/src/Speckle.Objects/Data/ArcgisObject.cs b/src/Speckle.Objects/Data/ArcgisObject.cs new file mode 100644 index 00000000..abe87aea --- /dev/null +++ b/src/Speckle.Objects/Data/ArcgisObject.cs @@ -0,0 +1,22 @@ +using Speckle.Sdk.Models; + +namespace Speckle.Objects.Data; + +/// +/// Represents a ArcGIS.Core.CoreObjectsBase object in ArcGIS +/// +[SpeckleType("Objects.Data.ArcgisObject")] +public class ArcgisObject : Base, IGisObject +{ + public required string name { get; set; } + public required string type { get; set; } + + [DetachProperty] + public required List displayValue { get; set; } + + public required Dictionary properties { get; set; } + + public required string units { get; set; } + + IReadOnlyList IDisplayValue>.displayValue => displayValue; +} diff --git a/src/Speckle.Objects/Data/CivilObject.cs b/src/Speckle.Objects/Data/Civil3dObject.cs similarity index 62% rename from src/Speckle.Objects/Data/CivilObject.cs rename to src/Speckle.Objects/Data/Civil3dObject.cs index f9785e5a..cad3e2fe 100644 --- a/src/Speckle.Objects/Data/CivilObject.cs +++ b/src/Speckle.Objects/Data/Civil3dObject.cs @@ -5,8 +5,8 @@ namespace Speckle.Objects.Data; /// /// Represents an Autodesk.Civil.DatabaseServices.Entity object in Civil3d /// -[SpeckleType("Objects.Data.CivilObject")] -public class CivilObject : Base, ICivilObject +[SpeckleType("Objects.Data.Civil3dObject")] +public class Civil3dObject : Base, ICivilObject { public required string name { get; set; } public required string type { get; set; } @@ -20,13 +20,16 @@ public class CivilObject : Base, ICivilObject /// Children objects, eg profiles, this civil entity may contain. /// [DetachProperty] - public required List elements { get; set; } + public required List elements { get; set; } + [DetachProperty] public required List displayValue { get; set; } + public required Dictionary properties { get; set; } + public required string units { get; set; } - IReadOnlyList ICivilObject.elements => elements; + IReadOnlyList ICivilObject.elements => elements; - IReadOnlyList IDataObject.displayValue => displayValue; + IReadOnlyList IDisplayValue>.displayValue => displayValue; } diff --git a/src/Speckle.Objects/Data/DataObject.cs b/src/Speckle.Objects/Data/DataObject.cs index 98ca4d68..baefdb03 100644 --- a/src/Speckle.Objects/Data/DataObject.cs +++ b/src/Speckle.Objects/Data/DataObject.cs @@ -10,5 +10,7 @@ public class DataObject : Base, IDataObject [DetachProperty] public required List displayValue { get; set; } - IReadOnlyList IDataObject.displayValue => displayValue; + public required Dictionary properties { get; set; } + + IReadOnlyList IDisplayValue>.displayValue => displayValue; } diff --git a/src/Speckle.Objects/Data/EtabsObject.cs b/src/Speckle.Objects/Data/EtabsObject.cs new file mode 100644 index 00000000..fa11940f --- /dev/null +++ b/src/Speckle.Objects/Data/EtabsObject.cs @@ -0,0 +1,30 @@ +using Speckle.Sdk.Models; + +namespace Speckle.Objects.Data; + +/// +/// Represents a wrapper object in ETABS +/// +[SpeckleType("Objects.Data.EtabsObject")] +public class EtabsObject : Base, ICsiObject +{ + public required string name { get; set; } + public required string type { get; set; } + + /// + /// Children objects, eg joints, this etabs object may contain. + /// + [DetachProperty] + public required List elements { get; set; } + + [DetachProperty] + public required List displayValue { get; set; } + + public required Dictionary properties { get; set; } + + public required string units { get; set; } + + IReadOnlyList ICsiObject.elements => elements; + + IReadOnlyList IDisplayValue>.displayValue => displayValue; +} diff --git a/src/Speckle.Objects/Data/NavisworksObject.cs b/src/Speckle.Objects/Data/NavisworksObject.cs new file mode 100644 index 00000000..571cc286 --- /dev/null +++ b/src/Speckle.Objects/Data/NavisworksObject.cs @@ -0,0 +1,21 @@ +using Speckle.Sdk.Models; + +namespace Speckle.Objects.Data; + +/// +/// Represents a "first selectable ancestor" Navisworks.ModelItem object in Navisworks +/// +[SpeckleType("Objects.Data.NavisworksObject")] +public class NavisworksObject : Base, INavisworksObject +{ + public required string name { get; set; } + + [DetachProperty] + public required List displayValue { get; set; } + + public required Dictionary properties { get; set; } + + public required string units { get; set; } + + IReadOnlyList IDisplayValue>.displayValue => displayValue; +} diff --git a/src/Speckle.Objects/Data/RevitObject.cs b/src/Speckle.Objects/Data/RevitObject.cs index d958ace9..20238bee 100644 --- a/src/Speckle.Objects/Data/RevitObject.cs +++ b/src/Speckle.Objects/Data/RevitObject.cs @@ -25,11 +25,14 @@ public class RevitObject : Base, IRevitObject [DetachProperty] public required List elements { get; set; } + [DetachProperty] public required List displayValue { get; set; } + public required Dictionary properties { get; set; } + public required string units { get; set; } IReadOnlyList IRevitObject.elements => elements; - IReadOnlyList IDataObject.displayValue => displayValue; + IReadOnlyList IDisplayValue>.displayValue => displayValue; } diff --git a/src/Speckle.Objects/Data/TeklaObject.cs b/src/Speckle.Objects/Data/TeklaObject.cs index dae831ca..737dbb55 100644 --- a/src/Speckle.Objects/Data/TeklaObject.cs +++ b/src/Speckle.Objects/Data/TeklaObject.cs @@ -17,11 +17,14 @@ public class TeklaObject : Base, ITeklaObject [DetachProperty] public required List elements { get; set; } + [DetachProperty] public required List displayValue { get; set; } + public required Dictionary properties { get; set; } + public required string units { get; set; } IReadOnlyList ITeklaObject.elements => elements; - IReadOnlyList IDataObject.displayValue => displayValue; + IReadOnlyList IDisplayValue>.displayValue => displayValue; } diff --git a/src/Speckle.Objects/Deprecated/LegacyV2.cs b/src/Speckle.Objects/Deprecated/LegacyV2.cs index cac72d0b..9ec73a99 100644 --- a/src/Speckle.Objects/Deprecated/LegacyV2.cs +++ b/src/Speckle.Objects/Deprecated/LegacyV2.cs @@ -6,6 +6,7 @@ namespace Speckle.Objects.Deprecated; [DeprecatedSpeckleType("Objects.Other.BlockInstance")] [DeprecatedSpeckleType("Objects.Other.Revit.RevitInstance")] [DeprecatedSpeckleType("Objects.BuiltElements.View")] +[DeprecatedSpeckleType("Objects.BuiltElements.GridLine")] [DeprecatedSpeckleType("Objects.Other.BlockDefinition")] [DeprecatedSpeckleType("Objects.Other.DisplayStyle")] [DeprecatedSpeckleType("Objects.Other.Material")] @@ -13,4 +14,5 @@ namespace Speckle.Objects.Deprecated; [DeprecatedSpeckleType("Objects.Other.Revit.RevitMaterial")] [DeprecatedSpeckleType("Objects.BuiltElements.Revit.Parameter")] [DeprecatedSpeckleType("Objects.BuiltElements.Revit.Curve.ModelCurve")] +[DeprecatedSpeckleType("Objects.BuiltElements.Revit.DirectShape")] public class LegacyV2 : Base { } diff --git a/src/Speckle.Objects/Interfaces.cs b/src/Speckle.Objects/Interfaces.cs index f22af6fc..2e9ac929 100644 --- a/src/Speckle.Objects/Interfaces.cs +++ b/src/Speckle.Objects/Interfaces.cs @@ -83,6 +83,29 @@ public interface ITransformable : ISpeckleObject bool TransformTo(Transform transform, out ITransformable transformed); } +/// +/// Specifies displayable simple geometries to be used as a fallback +/// if a displayable form cannot be converted. +/// +/// +/// objects that represent conceptual / abstract / mathematically derived geometry +/// can use to be used in case the object lacks a natively displayable form. +/// (e.g ) +/// +/// +/// Type of display value. +/// Expected to be either a type or a of s, +/// Should be constrained to types of , , or . +/// +public interface IDisplayValue : ISpeckleObject +{ + /// + /// (s) will be used to display this + /// if a native displayable object cannot be converted. + /// + T displayValue { get; } +} + #endregion #region GIS @@ -96,36 +119,19 @@ public interface IGisFeature : ISpeckleObject #region Data objects /// -/// Specifies displayable value(s) to be used as a fallback -/// if a displayable form cannot be converted. +/// Specifies properties on objects to be used for data-based workflows /// -/// -/// objects that represent conceptual / abstract / mathematically derived geometry -/// can use to be used in case the object lacks a natively displayable form. -/// (e.g ) -/// -/// -/// Type of display value. -/// Expected to be either a type or a of s, -/// most likely or . -/// -public interface IDisplayValue : ISpeckleObject +public interface IProperties : ISpeckleObject { - /// - /// (s) will be used to display this - /// if a native displayable object cannot be converted. - /// - T displayValue { get; } + Dictionary properties { get; } } -public interface IDataObject : ISpeckleObject +public interface IDataObject : ISpeckleObject, IProperties, IDisplayValue> { + /// + /// The name of the object, primarily used to decorate the object for consumption in frontend and other apps + /// string name { get; } - - [DetachProperty] - IReadOnlyList displayValue { get; } - - // POC: we should add "properties" field here once we formalize the struct } public interface IRevitObject : IDataObject @@ -138,7 +144,6 @@ public interface IRevitObject : IDataObject Base? location { get; } - [DetachProperty] IReadOnlyList elements { get; } } @@ -148,15 +153,29 @@ public interface ICivilObject : IDataObject List? baseCurves { get; } - [DetachProperty] - IReadOnlyList elements { get; } + IReadOnlyList elements { get; } } public interface ITeklaObject : IDataObject { string type { get; } - [DetachProperty] IReadOnlyList elements { get; } } + +public interface ICsiObject : IDataObject +{ + string type { get; } + + IReadOnlyList elements { get; } +} + +public interface IGisObject : IDataObject +{ + string type { get; } +} + +public interface INavisworksObject : IDataObject { } + + #endregion diff --git a/tests/Speckle.Objects.Tests.Unit/Utils/ShallowCopyTests.cs b/tests/Speckle.Objects.Tests.Unit/Utils/ShallowCopyTests.cs index 59abfbca..47ea8580 100644 --- a/tests/Speckle.Objects.Tests.Unit/Utils/ShallowCopyTests.cs +++ b/tests/Speckle.Objects.Tests.Unit/Utils/ShallowCopyTests.cs @@ -1,6 +1,6 @@ using System.Collections; using NUnit.Framework; -using Speckle.Objects.BuiltElements.Revit; +using Speckle.Objects.Data; using Speckle.Objects.Geometry; using Speckle.Sdk.Common; using Speckle.Sdk.Models; @@ -14,10 +14,9 @@ public class ShallowCopyTests public void CanShallowCopy_Wall() { const string UNITS = Units.Meters; - var ds = new DirectShape() + var ds = new DataObject() { name = "directShape", - units = UNITS, displayValue = new List { new Mesh @@ -33,6 +32,7 @@ public class ShallowCopyTests units = UNITS, }, }, + properties = new Dictionary(), }; var shallow = ds.ShallowCopy(); diff --git a/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs b/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs index 3ccf593a..386e9b51 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs @@ -5,7 +5,7 @@ using NUnit.Framework; using Shouldly; using Speckle.Newtonsoft.Json; using Speckle.Newtonsoft.Json.Linq; -using Speckle.Objects.BuiltElements; +using Speckle.Objects.Data; using Speckle.Sdk.Common; using Speckle.Sdk.Host; using Speckle.Sdk.Models; @@ -41,7 +41,7 @@ public class SerializationTests public void Setup() { TypeLoader.Reset(); - TypeLoader.Initialize(typeof(Base).Assembly, typeof(GridLine).Assembly, _assembly); + TypeLoader.Initialize(typeof(Base).Assembly, typeof(DataObject).Assembly, _assembly); } private async Task ReadJson(string fullName)