diff --git a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/ToHost/Raw/FeatureClassToHostConverter.cs b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/ToHost/Raw/FeatureClassToHostConverter.cs index d491ca2a1..8d753461c 100644 --- a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/ToHost/Raw/FeatureClassToHostConverter.cs +++ b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/ToHost/Raw/FeatureClassToHostConverter.cs @@ -74,7 +74,7 @@ private List RecoverOutdatedGisFeatures(VectorLayer target) public FeatureClass Convert(VectorLayer target) { - ACG.GeometryType geomType = _featureClassUtils.GetLayerGeometryType(target); + ACG.GeometryType geomType = GISLayerGeometryType.GetNativeLayerGeometryType(target); FileGeodatabaseConnectionPath fileGeodatabaseConnectionPath = new(_contextStack.Current.Document.SpeckleDatabasePath); @@ -85,7 +85,7 @@ public FeatureClass Convert(VectorLayer target) string wktString = string.Empty; if (target.crs is not null && target.crs.wkt is not null) { - wktString = target.crs.wkt.ToString(); + wktString = target.crs.wkt; } ACG.SpatialReference spatialRef = ACG.SpatialReferenceBuilder.CreateSpatialReference(wktString); diff --git a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/ToHost/TopLevel/VectorLayerToHostConverter.cs b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/ToHost/TopLevel/VectorLayerToHostConverter.cs index 5c7dd8c9e..36a45fa25 100644 --- a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/ToHost/TopLevel/VectorLayerToHostConverter.cs +++ b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/ToHost/TopLevel/VectorLayerToHostConverter.cs @@ -14,19 +14,16 @@ public class VectorLayerToHostConverter : IToHostTopLevelConverter, ITypedConver private readonly ITypedConverter _featureClassConverter; private readonly ITypedConverter _tableConverter; private readonly ITypedConverter _pointcloudLayerConverter; - private readonly IFeatureClassUtils _featureClassUtils; public VectorLayerToHostConverter( ITypedConverter featureClassConverter, ITypedConverter tableConverter, - ITypedConverter pointcloudLayerConverter, - IFeatureClassUtils featureClassUtils + ITypedConverter pointcloudLayerConverter ) { _featureClassConverter = featureClassConverter; _tableConverter = tableConverter; _pointcloudLayerConverter = pointcloudLayerConverter; - _featureClassUtils = featureClassUtils; } public object Convert(Base target) => Convert((VectorLayer)target); @@ -34,7 +31,7 @@ IFeatureClassUtils featureClassUtils public string Convert(VectorLayer target) { // pointcloud layers need to be checked separately, because there is no ArcGIS Geometry type - // for Pointcloud. In ArcGIS it's a completely different layer class, so "GetLayerGeometryType" + // for Pointcloud. In ArcGIS it's a completely different layer class, so "GetNativeLayerGeometryType" // will return "Invalid" type if (target.geomType == GISLayerGeometryType.POINTCLOUD) { @@ -42,7 +39,7 @@ public string Convert(VectorLayer target) } // check if Speckle VectorLayer should become a FeatureClass, StandaloneTable or PointcloudLayer - ACG.GeometryType geomType = _featureClassUtils.GetLayerGeometryType(target); + ACG.GeometryType geomType = GISLayerGeometryType.GetNativeLayerGeometryType(target); if (geomType != ACG.GeometryType.Unknown) // feature class { return _featureClassConverter.Convert(target).GetName(); diff --git a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/ToSpeckle/TopLevel/VectorLayerToSpeckleConverter.cs b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/ToSpeckle/TopLevel/VectorLayerToSpeckleConverter.cs index 8d2a36e33..58de84272 100644 --- a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/ToSpeckle/TopLevel/VectorLayerToSpeckleConverter.cs +++ b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/ToSpeckle/TopLevel/VectorLayerToSpeckleConverter.cs @@ -14,20 +14,14 @@ namespace Speckle.Converters.ArcGIS3.ToSpeckle.TopLevel; public class VectorLayerToSpeckleConverter : IToSpeckleTopLevelConverter, ITypedConverter { private readonly ITypedConverter _gisFeatureConverter; - private readonly IFeatureClassUtils _featureClassUtils; - private readonly IArcGISFieldUtils _fieldsUtils; private readonly IConversionContextStack _contextStack; public VectorLayerToSpeckleConverter( ITypedConverter gisFeatureConverter, - IFeatureClassUtils featureClassUtils, - IArcGISFieldUtils fieldsUtils, IConversionContextStack contextStack ) { _gisFeatureConverter = gisFeatureConverter; - _featureClassUtils = featureClassUtils; - _fieldsUtils = fieldsUtils; _contextStack = contextStack; } @@ -36,20 +30,6 @@ public Base Convert(object target) return Convert((FeatureLayer)target); } - private string AssignSpeckleGeometryType(esriGeometryType nativeGeometryType) - { - return nativeGeometryType switch - { - esriGeometryType.esriGeometryMultipoint => GISLayerGeometryType.POINT, - esriGeometryType.esriGeometryPoint => GISLayerGeometryType.POINT, - esriGeometryType.esriGeometryLine => GISLayerGeometryType.POLYLINE, - esriGeometryType.esriGeometryPolyline => GISLayerGeometryType.POLYLINE, - esriGeometryType.esriGeometryPolygon => GISLayerGeometryType.POLYGON, - esriGeometryType.esriGeometryMultiPatch => GISLayerGeometryType.MULTIPATCH, - _ => GISLayerGeometryType.NONE, - }; - } - public VectorLayer Convert(FeatureLayer target) { VectorLayer speckleLayer = new(); @@ -93,7 +73,7 @@ public VectorLayer Convert(FeatureLayer target) speckleLayer.attributes = allLayerAttributes; // get a simple geometry type - string spekleGeometryType = AssignSpeckleGeometryType(target.ShapeType); + string spekleGeometryType = GISLayerGeometryType.LayerGeometryTypeToSpeckle(target.ShapeType); speckleLayer.geomType = spekleGeometryType; // search the rows diff --git a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/ArcGISFieldUtils.cs b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/ArcGISFieldUtils.cs index aff09a3d2..0cd0b9606 100644 --- a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/ArcGISFieldUtils.cs +++ b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/ArcGISFieldUtils.cs @@ -4,10 +4,12 @@ using Objects.GIS; using Speckle.Core.Logging; using Speckle.Core.Models; +using Speckle.InterfaceGenerator; using FieldDescription = ArcGIS.Core.Data.DDL.FieldDescription; namespace Speckle.Converters.ArcGIS3.Utils; +[GenerateAutoInterface] public class ArcGISFieldUtils : IArcGISFieldUtils { private readonly ICharacterCleaner _characterCleaner; diff --git a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/FeatureClassUtils.cs b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/FeatureClassUtils.cs index 6e3a587b4..46010874c 100644 --- a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/FeatureClassUtils.cs +++ b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/FeatureClassUtils.cs @@ -3,10 +3,12 @@ using Speckle.Converters.Common; using Speckle.Converters.Common.Objects; using Speckle.Core.Models; +using Speckle.InterfaceGenerator; using FieldDescription = ArcGIS.Core.Data.DDL.FieldDescription; namespace Speckle.Converters.ArcGIS3.Utils; +[GenerateAutoInterface] public class FeatureClassUtils : IFeatureClassUtils { private readonly IArcGISFieldUtils _fieldsUtils; @@ -110,23 +112,4 @@ public void AddNonGISFeaturesToFeatureClass( } } } - - public ACG.GeometryType GetLayerGeometryType(VectorLayer target) - { - string? originalGeomType = target.geomType != null ? target.geomType : target.nativeGeomType; - return originalGeomType switch - { - GISLayerGeometryType.NONE => ACG.GeometryType.Unknown, - GISLayerGeometryType.POINT => ACG.GeometryType.Multipoint, - GISLayerGeometryType.POLYGON => ACG.GeometryType.Polygon, - GISLayerGeometryType.POLYLINE => ACG.GeometryType.Polyline, - GISLayerGeometryType.MULTIPATCH => ACG.GeometryType.Multipatch, - GISLayerGeometryType.POLYGON3D => ACG.GeometryType.Multipatch, - _ - => throw new ArgumentOutOfRangeException( - nameof(target), - $"Geometry type '{originalGeomType}' is not recognized." - ), - }; - } } diff --git a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/GISAttributeFieldType.cs b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/GISAttributeFieldType.cs index 4da3d0900..a23ceb353 100644 --- a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/GISAttributeFieldType.cs +++ b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/GISAttributeFieldType.cs @@ -16,6 +16,7 @@ public static class GISAttributeFieldType public const string DATEONLY = "DateOnly"; public const string TIMEONLY = "TimeOnly"; public const string TIMESTAMPOFFSET = "TimeStampOffset"; + public const string BOOL = "Bool"; // not supported in ArcGIS, only in QGIS public static string FieldTypeToSpeckle(FieldType fieldType) { @@ -55,6 +56,7 @@ public static FieldType FieldTypeToNative(object fieldType) DATEONLY => FieldType.DateOnly, TIMEONLY => FieldType.TimeOnly, TIMESTAMPOFFSET => FieldType.String, // sending and receiving as stings + BOOL => FieldType.String, // not supported in ArcGIS, converting to string _ => throw new ArgumentOutOfRangeException(nameof(fieldType)), }; } diff --git a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/GISLayerGeometryType.cs b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/GISLayerGeometryType.cs index 612eff480..f10c872d6 100644 --- a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/GISLayerGeometryType.cs +++ b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/GISLayerGeometryType.cs @@ -1,3 +1,5 @@ +using ArcGIS.Core.CIM; + namespace Speckle.Converters.ArcGIS3.Utils; public static class GISLayerGeometryType @@ -9,4 +11,33 @@ public static class GISLayerGeometryType public const string POLYGON3D = "Polygon3d"; public const string MULTIPATCH = "Multipatch"; public const string POINTCLOUD = "Pointcloud"; + + public static string LayerGeometryTypeToSpeckle(esriGeometryType nativeGeometryType) + { + return nativeGeometryType switch + { + esriGeometryType.esriGeometryMultipoint => GISLayerGeometryType.POINT, + esriGeometryType.esriGeometryPoint => GISLayerGeometryType.POINT, + esriGeometryType.esriGeometryLine => GISLayerGeometryType.POLYLINE, + esriGeometryType.esriGeometryPolyline => GISLayerGeometryType.POLYLINE, + esriGeometryType.esriGeometryPolygon => GISLayerGeometryType.POLYGON, + esriGeometryType.esriGeometryMultiPatch => GISLayerGeometryType.MULTIPATCH, + _ => GISLayerGeometryType.NONE, + }; + } + + public static ACG.GeometryType GetNativeLayerGeometryType(Objects.GIS.VectorLayer target) + { + string? originalGeomType = target.geomType != null ? target.geomType : target.nativeGeomType; + return originalGeomType switch + { + GISLayerGeometryType.NONE => ACG.GeometryType.Unknown, + GISLayerGeometryType.POINT => ACG.GeometryType.Multipoint, + GISLayerGeometryType.POLYGON => ACG.GeometryType.Polygon, + GISLayerGeometryType.POLYLINE => ACG.GeometryType.Polyline, + GISLayerGeometryType.MULTIPATCH => ACG.GeometryType.Multipatch, + GISLayerGeometryType.POLYGON3D => ACG.GeometryType.Multipatch, + _ => throw new ArgumentOutOfRangeException(nameof(target)), + }; + } } diff --git a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/IArcGISFieldUtils.cs b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/IArcGISFieldUtils.cs deleted file mode 100644 index 6bda9e1bf..000000000 --- a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/IArcGISFieldUtils.cs +++ /dev/null @@ -1,18 +0,0 @@ -using ArcGIS.Core.Data; -using Objects.GIS; -using Speckle.Core.Models; -using FieldDescription = ArcGIS.Core.Data.DDL.FieldDescription; - -namespace Speckle.Converters.ArcGIS3.Utils; - -public interface IArcGISFieldUtils -{ - public RowBuffer AssignFieldValuesToRow( - RowBuffer rowBuffer, - List fields, - Dictionary attributes - ); - public List GetFieldsFromSpeckleLayer(VectorLayer target); - - public List<(FieldDescription, Func)> CreateFieldsFromListOfBase(List target); -} diff --git a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/IFeatureClassUtils.cs b/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/IFeatureClassUtils.cs deleted file mode 100644 index b60cf4bfe..000000000 --- a/Converters/ArcGIS/Speckle.Converters.ArcGIS3/Utils/IFeatureClassUtils.cs +++ /dev/null @@ -1,24 +0,0 @@ -using ArcGIS.Core.Data; -using Objects.GIS; -using Speckle.Converters.Common.Objects; -using Speckle.Core.Models; -using FieldDescription = ArcGIS.Core.Data.DDL.FieldDescription; - -namespace Speckle.Converters.ArcGIS3.Utils; - -public interface IFeatureClassUtils -{ - void AddFeaturesToFeatureClass( - FeatureClass newFeatureClass, - List gisFeatures, - List fields, - ITypedConverter, ACG.Geometry> gisGeometryConverter - ); - void AddNonGISFeaturesToFeatureClass( - FeatureClass newFeatureClass, - List<(Base baseObj, ACG.Geometry convertedGeom)> featuresTuples, - List<(FieldDescription, Func)> fieldsAndFunctions - ); - void AddFeaturesToTable(Table newFeatureClass, List gisFeatures, List fields); - public ACG.GeometryType GetLayerGeometryType(VectorLayer target); -}