diff --git a/Objects/Converters/ConverterGSA/ConverterGSA/ConverterGSA.ToNative.cs b/Objects/Converters/ConverterGSA/ConverterGSA/ConverterGSA.ToNative.cs index 619a73d0af..4fa4f69f4b 100644 --- a/Objects/Converters/ConverterGSA/ConverterGSA/ConverterGSA.ToNative.cs +++ b/Objects/Converters/ConverterGSA/ConverterGSA/ConverterGSA.ToNative.cs @@ -65,7 +65,7 @@ void SetupToNativeFns() { typeof(GSALoadCase), GSALoadCaseToNative }, { typeof(LoadCase), LoadCaseToNative }, { typeof(GSAAnalysisTask), GSAAnalysisTaskToNative }, - { typeof(GSAAnalysisCase), GSAAnalysisCaseToNative }, + //{ typeof(GSAAnalysisCase), GSAAnalysisCaseToNative }, { typeof(GSACombinationCase), GSACombinationCaseToNative }, { typeof(LoadCombination), LoadCombinationToNative }, { typeof(GSALoadBeam), GSALoadBeamToNative }, @@ -358,6 +358,8 @@ private List GSAElement2dToNative(Base speckleObject) var gsaRecords = Element2dToNative(speckleObject); var gsaElement = (GsaEl)gsaRecords.First(o => o is GsaEl); var speckleElement = (GSAElement2D)speckleObject; + + gsaElement.Type = speckleElement.type.ToNative(); gsaElement.Colour = speckleElement.colour?.ColourToNative() ?? Colour.NotSet; gsaElement.Dummy = speckleElement.isDummy; gsaElement.Group = speckleElement.group.IsPositiveOrNull(); @@ -368,12 +370,31 @@ private List Element2dToNative(Base speckleObject) { var retList = new List(); var speckleElement = (Element2D)speckleObject; + + if (speckleElement.memberType != Objects.Structural.Geometry.MemberType.NotSet) + { + var speckleMember = new GSAMember2D() + { + applicationId = speckleElement.applicationId, + topology = speckleElement.topology, + name = speckleElement.name, + property = speckleElement.property, + memberType = speckleElement.memberType, + offset = speckleElement.offset, + orientationAngle = speckleElement.orientationAngle, + outline = speckleElement.outline, + voids = speckleElement.voids, + units = speckleElement.units + }; + return GSAMember2dToNative(speckleMember); + } + var gsaElement = new GsaEl() { ApplicationId = speckleElement.applicationId, Index = speckleElement.GetIndex(), Name = speckleElement.name, - Type = speckleElement.type.ToNative(), + //Type = speckleElement.type.ToNative(), PropertyIndex = IndexByConversionOrLookup(speckleElement.property, ref retList), ReleaseInclusion = ReleaseInclusion.NotIncluded, ParentIndex = IndexByConversionOrLookup(speckleElement.parent, ref retList) @@ -413,17 +434,17 @@ private List Element2dToNative(Base speckleObject) lock (embeddedToBeConvertedLock) { #endif - /* - if (!embeddedToBeConverted.ContainsKey(obj.applicationId)) - { - embeddedToBeConverted.Add(obj.applicationId, new List()); - } - embeddedToBeConverted[obj.applicationId].Add(obj); - */ - if (!alreadyConverted && !embeddedToBeConverted.ContainsKey(obj.applicationId)) - { - embeddedToBeConverted[obj.applicationId] = obj; - } + /* + if (!embeddedToBeConverted.ContainsKey(obj.applicationId)) + { + embeddedToBeConverted.Add(obj.applicationId, new List()); + } + embeddedToBeConverted[obj.applicationId].Add(obj); + */ + if (!alreadyConverted && !embeddedToBeConverted.ContainsKey(obj.applicationId)) + { + embeddedToBeConverted[obj.applicationId] = obj; + } #if !DEBUG } #endif @@ -577,12 +598,14 @@ private List GSAMember2dToNative(Base speckleObject) var speckleMember = (GSAMember2D)speckleObject; //Dynamic properties var dynamicMembers = speckleMember.GetMembers(); + var memberType = Enum.Parse(typeof(Objects.Structural.Geometry.MemberType2D), speckleMember.memberType.ToString()); + var gsaMember = new GsaMemb() { ApplicationId = speckleMember.applicationId, Index = speckleMember.GetIndex(), Name = speckleMember.name, - Type = ToNative(speckleMember.memberType), + Type = ToNative((MemberType2D)memberType), Colour = speckleMember.colour?.ColourToNative() ?? Colour.NotSet, Dummy = speckleMember.isDummy, IsIntersector = true, @@ -1343,9 +1366,12 @@ private List LoadFaceToNative(Base speckleObject) Values = speckleLoad.values.Select(v => factor * v).ToList(), LoadDirection = speckleLoad.direction.ToNative(), Projected = speckleLoad.isProjected, - ElementIndices = IndexByConversionOrLookup(speckleLoad.elements.FindAll(o => o is Element2D), ref gsaRecords) ?? new List(), - MemberIndices = IndexByConversionOrLookup(speckleLoad.elements.FindAll(o => o is GSAMember2D), ref gsaRecords) ?? new List(), }; + if (speckleLoad.elements != null) + { + gsaLoad.ElementIndices = IndexByConversionOrLookup(speckleLoad.elements.FindAll(o => o is Element1D || o is Element2D), ref gsaRecords) ?? new List(); + gsaLoad.MemberIndices = IndexByConversionOrLookup(speckleLoad.elements.FindAll(o => o is GSAMember1D || o is GSAMember2D), ref gsaRecords) ?? new List(); + } if (GetLoadAxis(speckleLoad.loadAxis, speckleLoad.loadAxisType, out var gsaAxisRefType, out var gsaAxisIndex, ref gsaRecords)) { gsaLoad.AxisRefType = gsaAxisRefType; @@ -2794,7 +2820,7 @@ public Speckle.GSA.API.GwaSchema.MemberType ToNative(Objects.Structural.Geometry case Objects.Structural.Geometry.MemberType2D.VoidCutter2D: return Speckle.GSA.API.GwaSchema.MemberType.Void2d; default: Report.ConversionErrors.Add(new Exception(speckleMemberType.ToString() + " is not currently a supported member type for a 2D element.")); - return Speckle.GSA.API.GwaSchema.MemberType.NotSet; + return Speckle.GSA.API.GwaSchema.MemberType.Generic2d; } } diff --git a/Objects/Converters/ConverterGSA/ConverterGSA/ConverterGSA.ToSpeckle.cs b/Objects/Converters/ConverterGSA/ConverterGSA/ConverterGSA.ToSpeckle.cs index 88916b7d58..608f669326 100644 --- a/Objects/Converters/ConverterGSA/ConverterGSA/ConverterGSA.ToSpeckle.cs +++ b/Objects/Converters/ConverterGSA/ConverterGSA/ConverterGSA.ToSpeckle.cs @@ -795,16 +795,16 @@ private ToSpeckleResult GsaAnalysisCaseToSpeckle(GsaRecord nativeObject, GSALaye name = gsaAnalysisCase.Name, }; if (gsaAnalysisCase.Index.IsIndex()) speckleAnalysisCase.applicationId = Instance.GsaModel.Cache.GetApplicationId(gsaAnalysisCase.Index.Value); - if (gsaAnalysisCase.TaskIndex.IsIndex()) - { - speckleAnalysisCase["@task"] = GetTaskFromIndex(gsaAnalysisCase.TaskIndex.Value); - } - if (GetAnalysisCaseFactors(gsaAnalysisCase.Desc, out var loadCases, out var loadFactors)) { speckleAnalysisCase.loadCases = loadCases; speckleAnalysisCase.loadFactors = loadFactors; } + if (gsaAnalysisCase.TaskIndex.IsIndex()) + { + var task = GetTaskFromIndex(gsaAnalysisCase.TaskIndex.Value); + task.analysisCases.Add(speckleAnalysisCase); + } return new ToSpeckleResult(speckleAnalysisCase); } @@ -3018,6 +3018,16 @@ private GSAAnalysisTask GetTaskFromIndex(int index) return (Instance.GsaModel.Cache.GetSpeckleObjects(index, out var speckleObjects)) ? speckleObjects.First() : null; } + private GSAAnalysisTask GetAndUpdateTaskFromIndex(int index, ref GSAAnalysisTask speckleTask) + { + var task = GetTaskFromIndex(index); + if(task != null) + { + + } + return (Instance.GsaModel.Cache.GetSpeckleObjects(index, out var speckleObjects)) ? speckleObjects.First() : null; + } + private List GetLoadBeamPositions(GsaLoadBeam gsaLoadBeam) { List positions = null; diff --git a/Objects/Converters/ConverterGSA/ConverterGSA/Extensions.cs b/Objects/Converters/ConverterGSA/ConverterGSA/Extensions.cs index b1001e8374..bcd641d181 100644 --- a/Objects/Converters/ConverterGSA/ConverterGSA/Extensions.cs +++ b/Objects/Converters/ConverterGSA/ConverterGSA/Extensions.cs @@ -208,14 +208,14 @@ public static MemberType ToSpeckle(this GwaMemberType gsaMemberType) } } - public static MemberType2D ToSpeckle2dMember(this GwaMemberType gsaMemberType) + public static MemberType ToSpeckle2dMember(this GwaMemberType gsaMemberType) { switch (gsaMemberType) { - case GwaMemberType.Slab: return MemberType2D.Slab; - case GwaMemberType.Wall: return MemberType2D.Wall; - case GwaMemberType.Generic2d: return MemberType2D.Generic2D; - case GwaMemberType.Void2d: return MemberType2D.VoidCutter2D; + case GwaMemberType.Slab: return MemberType.Slab; + case GwaMemberType.Wall: return MemberType.Wall; + case GwaMemberType.Generic2d: return MemberType.Generic2D; + case GwaMemberType.Void2d: return MemberType.VoidCutter2D; default: throw new Exception(gsaMemberType.ToString() + " is not currently a supported member type."); } @@ -479,8 +479,8 @@ public static SolutionType ToSpeckle(this StructuralSolutionType speckleType) { switch (speckleType) { - case StructuralSolutionType.BUCKLING_NL: return SolutionType.Static; - case StructuralSolutionType.STATIC: return SolutionType.NonlinearStatic; + case StructuralSolutionType.BUCKLING_NL: return SolutionType.NonlinearStatic; + case StructuralSolutionType.STATIC: return SolutionType.Static; case StructuralSolutionType.MODAL: return SolutionType.Modal; default: return SolutionType.Static; } diff --git a/Objects/Converters/ConverterGSA/ConverterGSATests/SchemaTest.ToSpeckle.cs b/Objects/Converters/ConverterGSA/ConverterGSATests/SchemaTest.ToSpeckle.cs index c9cc8f93e9..dfc4c9064f 100644 --- a/Objects/Converters/ConverterGSA/ConverterGSATests/SchemaTest.ToSpeckle.cs +++ b/Objects/Converters/ConverterGSA/ConverterGSATests/SchemaTest.ToSpeckle.cs @@ -475,7 +475,7 @@ public void MembToSpeckle() Assert.Equal(gsaMembers[1].Name, speckleMember2d.name); //Assert.Null(speckleMember2d.baseMesh); //TODO: update once conversion code handles base mesh Assert.Equal("prop 2D 1", speckleMember2d.property.applicationId); - Assert.Equal(ElementType2D.Quad4, speckleMember2d.type); + //Assert.Equal(ElementType2D.Quad4, speckleMember2d.type); Assert.Equal(gsaMembers[1].Offset2dZ, speckleMember2d.offset); Assert.Equal(90, speckleMember2d.orientationAngle); Assert.Null(speckleMember2d.parent); //not meaningful for member diff --git a/Objects/Converters/ConverterRevit/ConverterRevitShared/Partial Classes/ConvertAnalyticalSurface.cs b/Objects/Converters/ConverterRevit/ConverterRevitShared/Partial Classes/ConvertAnalyticalSurface.cs index eb5f90806e..293262ddaf 100644 --- a/Objects/Converters/ConverterRevit/ConverterRevitShared/Partial Classes/ConvertAnalyticalSurface.cs +++ b/Objects/Converters/ConverterRevit/ConverterRevitShared/Partial Classes/ConvertAnalyticalSurface.cs @@ -18,245 +18,251 @@ namespace Objects.Converter.Revit { public partial class ConverterRevit { - public Objects.Geometry.Line GetBottomLine(List nodes){ - Objects.Geometry.Line baseLine = new Objects.Geometry.Line(); - double lowest_elv = nodes.Min(nodes => nodes.basePoint.z); - List nodes1 = nodes.FindAll(node => node.basePoint.z.Equals(lowest_elv)); - if(nodes1.Count == 2){ - var point1 = nodes1[0].basePoint; - var point2 = nodes1[1].basePoint; - baseLine = new Geometry.Line(point1, point2, point1.units); - return baseLine; - } - return null; + public Objects.Geometry.Line GetBottomLine(List nodes) + { + Objects.Geometry.Line baseLine = new Objects.Geometry.Line(); + double lowest_elv = nodes.Min(nodes => nodes.basePoint.z); + List nodes1 = nodes.FindAll(node => node.basePoint.z.Equals(lowest_elv)); + if (nodes1.Count == 2) + { + var point1 = nodes1[0].basePoint; + var point2 = nodes1[1].basePoint; + baseLine = new Geometry.Line(point1, point2, point1.units); + return baseLine; + } + return null; } - public Objects.Geometry.Polycurve PolycurveFromTopology(List nodes){ - Polycurve polycurve = new Polycurve(); - foreach (int index in Enumerable.Range(0, nodes.Count)) - { - if (index == nodes.Count - 1){ - var point1 = nodes[index].basePoint; - var point2 = nodes[0].basePoint; - Geometry.Line segment = new Geometry.Line(point1, point2, point1.units); - polycurve.segments.Add(segment); + public Objects.Geometry.Polycurve PolycurveFromTopology(List nodes) + { + Polycurve polycurve = new Polycurve(); + foreach (int index in Enumerable.Range(0, nodes.Count)) + { + if (index == nodes.Count - 1) + { + var point1 = nodes[index].basePoint; + var point2 = nodes[0].basePoint; + Geometry.Line segment = new Geometry.Line(point1, point2, point1.units); + polycurve.segments.Add(segment); } - else{ - var point1 = nodes[index].basePoint; - var point2 = nodes[index + 1].basePoint; - Geometry.Line segment = new Geometry.Line(point1, point2, point1.units); - polycurve.segments.Add(segment); + else + { + var point1 = nodes[index].basePoint; + var point2 = nodes[index + 1].basePoint; + Geometry.Line segment = new Geometry.Line(point1, point2, point1.units); + polycurve.segments.Add(segment); } - } - return polycurve; + } + return polycurve; } - public List AnalyticalSurfaceToNative(Element2D speckleElement) - { + public List AnalyticalSurfaceToNative(Element2D speckleElement) + { - List placeholderObjects = new List { }; - switch(speckleElement.property.type){ - case Structural.PropertyType2D.Wall: - Geometry.Line baseline = GetBottomLine(speckleElement.topology); - double lowestElvevation = speckleElement.topology.Min(node => node.basePoint.z); - double topElevation = speckleElement.topology.Max(node => node.basePoint.z); - Node bottomNode = speckleElement.topology.Find(node => node.basePoint.z == lowestElvevation); - Node topNode = speckleElement.topology.Find(node => node.basePoint.z == topElevation); - var bottemLevel = LevelFromPoint(PointToNative(bottomNode.basePoint)); - var topLevel = LevelFromPoint(PointToNative(topNode.basePoint)); - RevitWall revitWall = new RevitWall(speckleElement.property.name, speckleElement.property.name, baseline, bottemLevel, topLevel); - return WallToNative(revitWall); - break; - default: - var polycurve = PolycurveFromTopology(speckleElement.topology); - var level = LevelFromPoint(PointToNative(speckleElement.topology[0].basePoint)); - RevitFloor revitFloor = new RevitFloor(speckleElement.property.name, speckleElement.property.name, polycurve, level); - return FloorToNative(revitFloor); - break; - } - return placeholderObjects; + List placeholderObjects = new List { }; + switch (speckleElement.property.type) + { + case Structural.PropertyType2D.Wall: + Geometry.Line baseline = GetBottomLine(speckleElement.topology); + double lowestElvevation = speckleElement.topology.Min(node => node.basePoint.z); + double topElevation = speckleElement.topology.Max(node => node.basePoint.z); + Node bottomNode = speckleElement.topology.Find(node => node.basePoint.z == lowestElvevation); + Node topNode = speckleElement.topology.Find(node => node.basePoint.z == topElevation); + var bottemLevel = LevelFromPoint(PointToNative(bottomNode.basePoint)); + var topLevel = LevelFromPoint(PointToNative(topNode.basePoint)); + RevitWall revitWall = new RevitWall(speckleElement.property.name, speckleElement.property.name, baseline, bottemLevel, topLevel); + return WallToNative(revitWall); + break; + default: + var polycurve = PolycurveFromTopology(speckleElement.topology); + var level = LevelFromPoint(PointToNative(speckleElement.topology[0].basePoint)); + RevitFloor revitFloor = new RevitFloor(speckleElement.property.name, speckleElement.property.name, polycurve, level); + return FloorToNative(revitFloor); + break; + } + return placeholderObjects; - } + } + + private Element2D AnalyticalSurfaceToSpeckle(AnalyticalModelSurface revitSurface) + { + if (!revitSurface.IsEnabled()) + return new Element2D(); + + var speckleElement2D = new Element2D(); + var structuralElement = Doc.GetElement(revitSurface.GetElementId()); + var mark = GetParamValue(structuralElement, BuiltInParameter.ALL_MODEL_MARK); + speckleElement2D.name = mark; - private Element2D AnalyticalSurfaceToSpeckle(AnalyticalModelSurface revitSurface) - { - if (!revitSurface.IsEnabled()) - return new Element2D(); + var edgeNodes = new List { }; + var loops = revitSurface.GetLoops(AnalyticalLoopType.External); - var speckleElement2D = new Element2D(); - var structuralElement = Doc.GetElement(revitSurface.GetElementId()); - var mark = GetParamValue(structuralElement, BuiltInParameter.ALL_MODEL_MARK); - speckleElement2D.name = mark; - - var edgeNodes = new List { }; - var loops = revitSurface.GetLoops(AnalyticalLoopType.External); + var displayLine = new Polycurve(); + foreach (var loop in loops) + { + var coor = new List(); + foreach (var curve in loop) + { + var points = curve.Tessellate(); - var displayLine = new Polycurve(); - foreach (var loop in loops) - { - var coor = new List(); - foreach (var curve in loop) - { - var points = curve.Tessellate(); + foreach (var p in points.Skip(1)) + { + var vertex = PointToSpeckle(p); + var edgeNode = new Node(vertex, null, null, null); + edgeNodes.Add(edgeNode); + } - foreach (var p in points.Skip(1)) - { - var vertex = PointToSpeckle(p); - var edgeNode = new Node(vertex, null, null, null); - edgeNodes.Add(edgeNode); - } + displayLine.segments.Add(CurveToSpeckle(curve)); + } + } - displayLine.segments.Add(CurveToSpeckle(curve)); - } - } + speckleElement2D.topology = edgeNodes; + speckleElement2D.outline = displayLine; - speckleElement2D.topology = edgeNodes; - speckleElement2D["displayValue"] = displayLine; + var voidNodes = new List> { }; + var voidLoops = revitSurface.GetLoops(AnalyticalLoopType.Void); + foreach (var loop in voidLoops) + { + var loopNodes = new List(); + foreach (var curve in loop) + { + var points = curve.Tessellate(); - var voidNodes = new List> { }; - var voidLoops = revitSurface.GetLoops(AnalyticalLoopType.Void); - foreach (var loop in voidLoops) - { - var loopNodes = new List(); - foreach (var curve in loop) - { - var points = curve.Tessellate(); + foreach (var p in points.Skip(1)) + { + var vertex = PointToSpeckle(p); + var voidNode = new Node(vertex, null, null, null); + loopNodes.Add(voidNode); + } + } + voidNodes.Add(loopNodes); + } + speckleElement2D.voids = voidNodes; - foreach (var p in points.Skip(1)) - { - var vertex = PointToSpeckle(p); - var voidNode = new Node(vertex, null, null, null); - loopNodes.Add(voidNode); - } - } - voidNodes.Add(loopNodes); - } - //speckleElement2D.voids = voidNodes; + //var mesh = new Geometry.Mesh(); + //var solidGeom = GetElementSolids(structuralElement); + //(mesh.faces, mesh.vertices) = GetFaceVertexArrFromSolids(solidGeom); + //speckleElement2D.baseMesh = mesh; - //var mesh = new Geometry.Mesh(); - //var solidGeom = GetElementSolids(structuralElement); - //(mesh.faces, mesh.vertices) = GetFaceVertexArrFromSolids(solidGeom); - //speckleElement2D.baseMesh = mesh; + //speckleElement2D.displayMesh = GetElementDisplayMesh(Doc.GetElement(revitSurface.GetElementId()), + // new Options() { DetailLevel = ViewDetailLevel.Fine, ComputeReferences = false }); - var prop = new Property2D(); + var prop = new Property2D(); - // Material - DB.Material structMaterial = null; - double thickness = 0; - var memberType = MemberType.Generic2D; + // Material + DB.Material structMaterial = null; + double thickness = 0; + var memberType = MemberType.Generic2D; - if (structuralElement is DB.Floor) - { - var floor = structuralElement as DB.Floor; - structMaterial = Doc.GetElement(floor.FloorType.StructuralMaterialId) as DB.Material; - thickness = GetParamValue(structuralElement, BuiltInParameter.STRUCTURAL_FLOOR_CORE_THICKNESS); - memberType = MemberType.Slab; - } - else if (structuralElement is DB.Wall) - { - var wall = structuralElement as DB.Wall; - structMaterial = Doc.GetElement(wall.WallType.get_Parameter(BuiltInParameter.STRUCTURAL_MATERIAL_PARAM).AsElementId()) as DB.Material; - thickness = ScaleToSpeckle(wall.WallType.Width); - memberType = MemberType.Wall; - } + if (structuralElement is DB.Floor) + { + var floor = structuralElement as DB.Floor; + structMaterial = Doc.GetElement(floor.FloorType.StructuralMaterialId) as DB.Material; + thickness = GetParamValue(structuralElement, BuiltInParameter.STRUCTURAL_FLOOR_CORE_THICKNESS); + memberType = MemberType.Slab; + } + else if (structuralElement is DB.Wall) + { + var wall = structuralElement as DB.Wall; + structMaterial = Doc.GetElement(wall.WallType.get_Parameter(BuiltInParameter.STRUCTURAL_MATERIAL_PARAM).AsElementId()) as DB.Material; + thickness = ScaleToSpeckle(wall.WallType.Width); + memberType = MemberType.Wall; + } - var materialAsset = ((PropertySetElement)Doc.GetElement(structMaterial.StructuralAssetId)).GetStructuralAsset(); - var materialType = structMaterial.MaterialClass; + var materialAsset = ((PropertySetElement)Doc.GetElement(structMaterial.StructuralAssetId)).GetStructuralAsset(); + var materialType = structMaterial.MaterialClass; - Structural.Materials.Material speckleMaterial = null; - switch (materialType) - { - case "Concrete": - var concreteMaterial = new Concrete - { - name = Doc.GetElement(structMaterial.StructuralAssetId).Name, - materialType = Structural.MaterialType.Concrete, - grade = null, - designCode = null, - codeYear = null, - elasticModulus = materialAsset.YoungModulus.X, - compressiveStrength = materialAsset.ConcreteCompression, - tensileStrength = 0, - flexuralStrength = 0, - maxCompressiveStrain = 0, - maxTensileStrain = 0, - maxAggregateSize = 0, - lightweight = materialAsset.Lightweight, - poissonsRatio = materialAsset.PoissonRatio.X, - shearModulus = materialAsset.ShearModulus.X, - density = materialAsset.Density, - thermalExpansivity = materialAsset.ThermalExpansionCoefficient.X, - dampingRatio = 0 - }; - speckleMaterial = concreteMaterial; - break; - case "Steel": - var steelMaterial = new Steel - { - name = Doc.GetElement(structMaterial.StructuralAssetId).Name, - materialType = Structural.MaterialType.Steel, - grade = materialAsset.Name, - designCode = null, - codeYear = null, - elasticModulus = materialAsset.YoungModulus.X, // Newtons per foot meter - yieldStrength = materialAsset.MinimumYieldStress, // Newtons per foot meter - ultimateStrength = materialAsset.MinimumTensileStrength, // Newtons per foot meter - maxStrain = 0, - poissonsRatio = materialAsset.PoissonRatio.X, - shearModulus = materialAsset.ShearModulus.X, // Newtons per foot meter - density = materialAsset.Density, // kilograms per cubed feet - thermalExpansivity = materialAsset.ThermalExpansionCoefficient.X, // inverse Kelvin - dampingRatio = 0 - }; - speckleMaterial = steelMaterial; - break; - case "Wood": - var timberMaterial = new Timber - { - name = Doc.GetElement(structMaterial.StructuralAssetId).Name, - materialType = Structural.MaterialType.Timber, - grade = materialAsset.WoodGrade, - designCode = null, - codeYear = null, - elasticModulus = materialAsset.YoungModulus.X, // Newtons per foot meter - poissonsRatio = materialAsset.PoissonRatio.X, - shearModulus = materialAsset.ShearModulus.X, // Newtons per foot meter - density = materialAsset.Density, // kilograms per cubed feet - thermalExpansivity = materialAsset.ThermalExpansionCoefficient.X, // inverse Kelvin - species = materialAsset.WoodSpecies, - dampingRatio = 0 - }; - timberMaterial["bendingStrength"] = materialAsset.WoodBendingStrength; - timberMaterial["parallelCompressionStrength"] = materialAsset.WoodParallelCompressionStrength; - timberMaterial["parallelShearStrength"] = materialAsset.WoodParallelShearStrength; - timberMaterial["perpendicularCompressionStrength"] = materialAsset.WoodPerpendicularCompressionStrength; - timberMaterial["perpendicularShearStrength"] = materialAsset.WoodPerpendicularShearStrength; - speckleMaterial = timberMaterial; - break; - default: - var defaultMaterial = new Structural.Materials.Material - { - name = Doc.GetElement(structMaterial.StructuralAssetId).Name - }; - speckleMaterial = defaultMaterial; - break; - } + Structural.Materials.Material speckleMaterial = null; + switch (materialType) + { + case "Concrete": + var concreteMaterial = new Concrete + { + name = Doc.GetElement(structMaterial.StructuralAssetId).Name, + materialType = Structural.MaterialType.Concrete, + grade = null, + designCode = null, + codeYear = null, + elasticModulus = materialAsset.YoungModulus.X, + compressiveStrength = materialAsset.ConcreteCompression, + tensileStrength = 0, + flexuralStrength = 0, + maxCompressiveStrain = 0, + maxTensileStrain = 0, + maxAggregateSize = 0, + lightweight = materialAsset.Lightweight, + poissonsRatio = materialAsset.PoissonRatio.X, + shearModulus = materialAsset.ShearModulus.X, + density = materialAsset.Density, + thermalExpansivity = materialAsset.ThermalExpansionCoefficient.X, + dampingRatio = 0 + }; + speckleMaterial = concreteMaterial; + break; + case "Steel": + var steelMaterial = new Steel + { + name = Doc.GetElement(structMaterial.StructuralAssetId).Name, + materialType = Structural.MaterialType.Steel, + grade = materialAsset.Name, + designCode = null, + codeYear = null, + elasticModulus = materialAsset.YoungModulus.X, // Newtons per foot meter + yieldStrength = materialAsset.MinimumYieldStress, // Newtons per foot meter + ultimateStrength = materialAsset.MinimumTensileStrength, // Newtons per foot meter + maxStrain = 0, + poissonsRatio = materialAsset.PoissonRatio.X, + shearModulus = materialAsset.ShearModulus.X, // Newtons per foot meter + density = materialAsset.Density, // kilograms per cubed feet + thermalExpansivity = materialAsset.ThermalExpansionCoefficient.X, // inverse Kelvin + dampingRatio = 0 + }; + speckleMaterial = steelMaterial; + break; + case "Wood": + var timberMaterial = new Timber + { + name = Doc.GetElement(structMaterial.StructuralAssetId).Name, + materialType = Structural.MaterialType.Timber, + grade = materialAsset.WoodGrade, + designCode = null, + codeYear = null, + elasticModulus = materialAsset.YoungModulus.X, // Newtons per foot meter + poissonsRatio = materialAsset.PoissonRatio.X, + shearModulus = materialAsset.ShearModulus.X, // Newtons per foot meter + density = materialAsset.Density, // kilograms per cubed feet + thermalExpansivity = materialAsset.ThermalExpansionCoefficient.X, // inverse Kelvin + species = materialAsset.WoodSpecies, + dampingRatio = 0 + }; + timberMaterial["bendingStrength"] = materialAsset.WoodBendingStrength; + timberMaterial["parallelCompressionStrength"] = materialAsset.WoodParallelCompressionStrength; + timberMaterial["parallelShearStrength"] = materialAsset.WoodParallelShearStrength; + timberMaterial["perpendicularCompressionStrength"] = materialAsset.WoodPerpendicularCompressionStrength; + timberMaterial["perpendicularShearStrength"] = materialAsset.WoodPerpendicularShearStrength; + speckleMaterial = timberMaterial; + break; + default: + var defaultMaterial = new Structural.Materials.Material + { + name = Doc.GetElement(structMaterial.StructuralAssetId).Name + }; + speckleMaterial = defaultMaterial; + break; + } - prop.material = speckleMaterial; - prop.name = Doc.GetElement(revitSurface.GetElementId()).Name; - prop["memberType"] = memberType; - prop.type = Structural.PropertyType2D.Shell; - prop.thickness = thickness; + prop.material = speckleMaterial; + prop.name = Doc.GetElement(revitSurface.GetElementId()).Name; + prop.type = Structural.PropertyType2D.Shell; + prop.thickness = thickness; - speckleElement2D.property = prop; + speckleElement2D.memberType = memberType; + speckleElement2D.property = prop; - GetAllRevitParamsAndIds(speckleElement2D, revitSurface); - - //speckleElement2D.displayMesh = GetElementDisplayMesh(Doc.GetElement(revitSurface.GetElementId()), - // new Options() { DetailLevel = ViewDetailLevel.Fine, ComputeReferences = false }); + GetAllRevitParamsAndIds(speckleElement2D, revitSurface); - return speckleElement2D; - } + return speckleElement2D; + } } } \ No newline at end of file diff --git a/Objects/Objects/Structural/ApplicationSpecific/GSA/Geometry/GSAElement2D.cs b/Objects/Objects/Structural/ApplicationSpecific/GSA/Geometry/GSAElement2D.cs index 93d4b6ff25..869030258a 100644 --- a/Objects/Objects/Structural/ApplicationSpecific/GSA/Geometry/GSAElement2D.cs +++ b/Objects/Objects/Structural/ApplicationSpecific/GSA/Geometry/GSAElement2D.cs @@ -14,6 +14,7 @@ public class GSAElement2D : Element2D public int group { get; set; } public string colour { get; set; } public bool isDummy { get; set; } + public ElementType2D type { get; set; } //analysis formulation - Quad4 public GSAElement2D() { } [SchemaInfo("GSAElement2D", "Creates a Speckle structural 2D element for GSA", "GSA", "Geometry")] diff --git a/Objects/Objects/Structural/ApplicationSpecific/GSA/Geometry/GSAMember2D.cs b/Objects/Objects/Structural/ApplicationSpecific/GSA/Geometry/GSAMember2D.cs index b2ae676d17..15c86dfcaa 100644 --- a/Objects/Objects/Structural/ApplicationSpecific/GSA/Geometry/GSAMember2D.cs +++ b/Objects/Objects/Structural/ApplicationSpecific/GSA/Geometry/GSAMember2D.cs @@ -17,9 +17,8 @@ public class GSAMember2D : Element2D public bool isDummy { get; set; } public bool intersectsWithOthers { get; set; } public double targetMeshSize { get; set; } - public List> voids { get; set; } - public MemberType2D memberType { get; set; } - + + public GSAMember2D() { } [SchemaInfo("GSAMember2D", "Creates a Speckle structural 2D member for GSA", "GSA", "Geometry")] @@ -32,7 +31,7 @@ public GSAMember2D([SchemaParamInfo("An ordered list of nodes which represents t this.name = name; this.topology = perimeter; //needs to be ordered properly (ie. matching the point order of a valid polyline) this.property = property; - this.memberType = memberType; + this.memberType = (MemberType)memberType; this.voids = voids; //needs to be ordered properly (ie. matching the point order of a valid polyline) this.offset = offset; this.orientationAngle = orientationAngle; diff --git a/Objects/Objects/Structural/ApplicationSpecific/GSA/Properties/GSAProperty2D.cs b/Objects/Objects/Structural/ApplicationSpecific/GSA/Properties/GSAProperty2D.cs index da2372b308..d519e70ed2 100644 --- a/Objects/Objects/Structural/ApplicationSpecific/GSA/Properties/GSAProperty2D.cs +++ b/Objects/Objects/Structural/ApplicationSpecific/GSA/Properties/GSAProperty2D.cs @@ -2,6 +2,7 @@ using Speckle.Core.Models; using Objects.Structural.Properties; using Objects.Structural.Materials; +using Objects.Structural.Geometry; namespace Objects.Structural.GSA.Properties { @@ -15,6 +16,8 @@ public class GSAProperty2D : Property2D public double additionalMass { get; set; } public string concreteSlabProp { get; set; } public string colour { get; set; } + + public PropertyType2D type { get; set; } public GSAProperty2D() { } [SchemaInfo("GSAProperty2D", "Creates a Speckle structural 2D element property for GSA", "GSA", "Properties")] diff --git a/Objects/Objects/Structural/Enums/MemberType.cs b/Objects/Objects/Structural/Enums/MemberType.cs index adb85ffb0f..132551eab4 100644 --- a/Objects/Objects/Structural/Enums/MemberType.cs +++ b/Objects/Objects/Structural/Enums/MemberType.cs @@ -8,6 +8,7 @@ namespace Objects.Structural.Geometry { public enum MemberType { + NotSet = 0, Beam, Column, Generic1D, @@ -15,7 +16,7 @@ public enum MemberType Wall, Generic2D, VoidCutter1D, - VoidCutter2D + VoidCutter2D //Brace } public enum MemberType2D diff --git a/Objects/Objects/Structural/Geometry/Element2D.cs b/Objects/Objects/Structural/Geometry/Element2D.cs index 222335311c..574f0b5417 100644 --- a/Objects/Objects/Structural/Geometry/Element2D.cs +++ b/Objects/Objects/Structural/Geometry/Element2D.cs @@ -7,16 +7,20 @@ namespace Objects.Structural.Geometry { - public class Element2D : Base, IDisplayMesh + public class Element2D : Base, IDisplayMesh //Member2D in GSA { public string name { get; set; } - public ICurve outline { get; set; } + + [DetachProperty] + public ICurve outline { get; set; } [DetachProperty] public Property2D property { get; set; } - public ElementType2D type { get; set; } + + public MemberType memberType { get; set; } // <<<<<< ex. slab, wall, generic, opening + public double offset { get; set; } //z direction (normal) - public double orientationAngle { get; set; } + public double orientationAngle { get; set; } // [DetachProperty] public Base parent { get; set; } //parent element @@ -24,6 +28,8 @@ public class Element2D : Base, IDisplayMesh [DetachProperty] public List topology { get; set; } + public List> voids { get; set; } // <<<<<< + [DetachProperty] public Mesh displayMesh { get; set; } public string units { get; set; } @@ -36,10 +42,12 @@ public Element2D(List nodes) } [SchemaInfo("Element2D", "Creates a Speckle structural 2D element (based on a list of edge ie. external, geometry defining nodes)", "Structural", "Geometry")] - public Element2D(List nodes, Property2D property, double offset = 0, double orientationAngle = 0) + public Element2D(List nodes, Property2D property, MemberType memberType = MemberType.NotSet, List> voids = null, double offset = 0, double orientationAngle = 0) { this.topology = nodes; this.property = property; + this.memberType = memberType; + this.voids = voids; this.offset = offset; this.orientationAngle = orientationAngle; }