From d21b699a30eadef16a43edde24586bddafe94e25 Mon Sep 17 00:00:00 2001 From: MP <53620289+Marco-Pellegrino@users.noreply.github.com> Date: Thu, 3 Nov 2022 12:00:03 +0100 Subject: [PATCH] 21.5.0 (#544) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test to fix errors * :construction: Fix Some Reference Error * Update FemDesign.Dynamo.csproj * add missing file * :bug: Dynamo can't have default enum argument Fix #498 * Constructor with Default Parameters * :lipstick: Input Renaming #494 * Update LoadCombinationConstruct.cs close #494 * Update Panel.cs #523 * :sparkles: update xml attributes for BarPart * stiffness modifier does not reset #521 * fix #538 * StiffnessPoint Constructor C# Gh * :sparkles: Icon * :memo: Practical example #508 * match filepath nickname with runDesign * :lipstick: unnecessary information * Update SupportDeconstuctor.cs #483 * :bug: removing-default-material #491 * model run return a bool #487 * :bug: Plane input #559 * Update Region.cs * :pencil: rename component * :bug: correct serialisation in case of default value #562 * :bug: load combination set up #566 fix * :bug: read material bug * Update SectionDefine.cs * :bug: custom section database * :fire: name input was not necessary * :zap: Model serialize paths - Allow relative paths - Omitted extension will be changed to struxml * example 5 update * :pencil2: Fix typo; * ⚠ Better warning on version mismatch Fix #555 * Revert "Update SupportDeconstuctor.cs" This reverts commit 4e464a649fb25a1eba8c0905fa2c223ee8ffe470. * Update SupportDeconstuctor.cs * :sparkles: Add StageLoadCase to LoadCombination Fix #561 * :bug: Parameterless constructor for serialization * fix enum default * result type input for users * :sparkles: Special cases in load combinations Load combinations can now be constructed and deconstructed with - Construction stage - Seismic case - PTC case - Pile/Neg. Shaft friction case In C# and Grasshopper Fix #561 * :sparkles: Line stress load - Added constructors for C# - Added constructor component for Grasshopper - Added deconstructor component for Grasshopper - Override ToString() Fix #563 * :rotating_light: Fixing XML warnings (CS1570) Warning CS1570 XML comment has badly formed XML -- * :rotating_light: Fixing XML warnings (CS1572) Warning CS1572 XML comment has a param tag for *, but there is no parameter by that name * :rotating_light: Fixing XML warnings (CS1573) Warning CS1573 Parameter * has no matching param tag in the XML comment for * (but other parameters do) * :rotating_light: Fixing warning CS8602 Warning CS8602 Dereference of a possibly null reference. * :rotating_light: Fixing CS0168, CS0169, CS0219 Warning CS0219 The variable * is assigned but its value is never used Warning CS0169 The field * is never used Warning CS0168 The variable 'ex' is declared but never used * :rotating_light: Ignore warning CS1591 Ignore the warning: "Missing XML comment for publicly visible type or member *" * :bug: Fix mistake * :memo: Add comment on special load cases * :bug: Fix dynamo references * :bug: Name/Identifier #529 Work in progress on #529 - Added tests (failing for now) - Added LockedIdentifier property on Bar * :bug: Remove bar.Name setter Work in progress on #529 * :lipstick: Add Icons for LineStressLoad Fix #563 * :pencil2: Copy paste typo * :sparkles: Abstract class NamedEntityBase Fix #529 * :sparkles: Bar to use BarPart Name and Instance #511 * Update LineStressLoadDefine.cs * :fire: EntityBase => NamedEntityBase Using NamedEntityBase instead of EntityBase where applicable and remove duplicate code for properties Name, Identifier and Instance for many classes * Update GlobalAssemblyInfo.cs * :bug: Incremented instance counter twice * :fire: EntityBase => NamedEntityBase for SlabPart Also updated Region RectangleXY to take a reference point * :bug: Fix SlabType * :bug: Fix Bar identifier on create * :lipstick: StageDeconstruct Icon * 🔔 Make exceptions more explicit * :rotating_light: xml warning * update stage component same order for constructor and deconstructor Co-authored-by: Andreas Oscarsson <52665994+andosca@users.noreply.github.com> Co-authored-by: xRadne <32938476+xRadne@users.noreply.github.com> --- FemDesign.Core/AdvancedFem/Cover.cs | 27 +- .../AuxiliaryResults/LabelledSection.cs | 17 +- FemDesign.Core/Bars/Bar.cs | 178 +- FemDesign.Core/Bars/BarPart.cs | 111 +- FemDesign.Core/Bars/BarStiffnessFactors.cs | 44 + FemDesign.Core/Bars/Connectivity.cs | 58 +- FemDesign.Core/Bars/Eccentricity.cs | 5 +- FemDesign.Core/Calculate/Analysis.cs | 2 +- FemDesign.Core/Calculate/Application.cs | 1 + FemDesign.Core/Calculate/FdScript.cs | 1 + FemDesign.Core/Calculate/Stage.cs | 4 +- FemDesign.Core/FemDesign.Core.csproj | 11 +- FemDesign.Core/GenericClasses/INamedEntity.cs | 32 + .../GenericClasses/NamedEntityBase.cs | 74 + .../GenericClasses/RestrictedDouble.cs | 4 +- FemDesign.Core/Geometry/Face.cs | 1 - FemDesign.Core/Geometry/LineSegment.cs | 3 +- FemDesign.Core/Geometry/Region.cs | 15 +- FemDesign.Core/Geometry/RegionGroup.cs | 6 +- FemDesign.Core/Loads/LineStressLoad.cs | 76 +- FemDesign.Core/Loads/LineTemperatureLoad.cs | 4 +- FemDesign.Core/Loads/LoadCombination.cs | 213 +- .../Loads/LoadCombinationCaseBase.cs | 21 + FemDesign.Core/Loads/LoadGroupPermanent.cs | 1 + FemDesign.Core/Loads/ModelLoadCase.cs | 9 +- FemDesign.Core/Loads/ModelLoadCaseInGroup.cs | 1 + FemDesign.Core/Loads/PointLoad.cs | 2 +- FemDesign.Core/Loads/StageLoadCase.cs | 44 + FemDesign.Core/Materials/Material.cs | 4 +- FemDesign.Core/Materials/MaterialDatabase.cs | 8 +- FemDesign.Core/Model/Model.cs | 160 +- .../ModellingTools/ConnectedLines.cs | 24 +- .../ModellingTools/ConnectedPoints.cs | 24 +- FemDesign.Core/ModellingTools/Diaphragm.cs | 21 +- .../ModellingTools/FictitiousBar.cs | 28 +- .../ModellingTools/FictitiousShell.cs | 29 +- .../ModellingTools/SurfaceConnection.cs | 22 +- .../Properties/GlobalAssemblyInfo.cs | 4 +- FemDesign.Core/Reinforcement/HiddenBar.cs | 22 +- .../Reinforcement/LongitudinalBar.cs | 9 + FemDesign.Core/Reinforcement/Ptc.cs | 5 + FemDesign.Core/Releases/RigidityDataType0.cs | 44 + FemDesign.Core/Sections/Section.cs | 25 +- FemDesign.Core/Shells/Panel.cs | 63 +- FemDesign.Core/Shells/ShellEccentricity.cs | 1 - FemDesign.Core/Shells/Slab.cs | 112 +- FemDesign.Core/Shells/SlabPart.cs | 51 +- FemDesign.Core/Shells/SlabStiffnessFactors.cs | 16 + FemDesign.Core/Stage/ActivatedLoadCase.cs | 12 +- FemDesign.Core/Stage/Stage.cs | 62 +- FemDesign.Core/Supports/Group.cs | 2 +- FemDesign.Core/Supports/LineSupport.cs | 19 +- FemDesign.Core/Supports/PointSupport.cs | 33 +- FemDesign.Core/Supports/StiffnessPoints.cs | 62 + FemDesign.Core/Supports/Supports.cs | 2 + FemDesign.Core/Supports/SurfaceSupport.cs | 32 +- FemDesign.Dynamo/Dynamo/AdvancedFem/Cover.cs | 4 +- .../AuxiliaryResults/LabelledSection.cs | 2 +- FemDesign.Dynamo/Dynamo/Bars/Bar.cs | 14 +- FemDesign.Dynamo/Dynamo/Bars/BarPart.cs | 2 +- FemDesign.Dynamo/Dynamo/Bars/ColumnCorbel.cs | 2 +- FemDesign.Dynamo/Dynamo/Bars/Connectivity.cs | 15 +- FemDesign.Dynamo/Dynamo/Bars/Eccentricity.cs | 8 - .../Dynamo/Calculate/Application.cs | 10 +- .../Dynamo/Calculate/LoadCombination.cs | 2 +- FemDesign.Dynamo/Dynamo/Calculate/Stage.cs | 5 + .../Dynamo/Deconstruct/Deconstruct.cs | 30 +- .../Dynamo/GenericClasses/LocationValue.cs | 2 +- .../Dynamo/GenericClasses/NamedEntityBase.cs | 20 + ...oordinateSystem.cs => CoordinateSystem.cs} | 46 +- FemDesign.Dynamo/Dynamo/Geometry/Edge.cs | 30 +- .../Geometry/{FdPoint2d.cs => Point2d.cs} | 2 +- .../Geometry/{FdPoint3d.cs => Point3d.cs} | 6 +- FemDesign.Dynamo/Dynamo/Geometry/Region.cs | 2 +- .../Geometry/{FdVector2d.cs => Vector2d.cs} | 2 +- .../Geometry/{FdVector3d.cs => Vector3d.cs} | 6 +- FemDesign.Dynamo/Dynamo/Loads/Footfall.cs | 2 +- FemDesign.Dynamo/Dynamo/Loads/LineLoad.cs | 16 +- .../Dynamo/Loads/LineStressLoad.cs | 2 +- .../Dynamo/Loads/LineTemperatureLoad.cs | 2 +- FemDesign.Dynamo/Dynamo/Loads/LoadCase.cs | 2 +- .../Dynamo/Loads/LoadLocationValue.cs | 2 +- FemDesign.Dynamo/Dynamo/Loads/PointLoad.cs | 8 +- FemDesign.Dynamo/Dynamo/Loads/PressureLoad.cs | 2 +- FemDesign.Dynamo/Dynamo/Loads/SurfaceLoad.cs | 4 +- .../Dynamo/Loads/SurfaceTemperatureLoad.cs | 2 +- .../Dynamo/Loads/TopBotLocationValue.cs | 4 +- FemDesign.Dynamo/Dynamo/Model/Model.cs | 29 +- .../Dynamo/ModellingTools/ConnectedLines.cs | 6 +- .../Dynamo/ModellingTools/ConnectedPoints.cs | 6 +- .../Dynamo/ModellingTools/Diaphragm.cs | 2 +- .../Dynamo/ModellingTools/FictitiousBar.cs | 6 +- .../Dynamo/ModellingTools/FictitiousShell.cs | 10 +- .../ModellingTools/SurfaceConnection.cs | 2 +- .../Dynamo/Reinforcement/BarReinforcement.cs | 2 +- .../Dynamo/Reinforcement/HiddenBar.cs | 2 +- .../Dynamo/Results/BarDisplacement.cs | 10 +- .../Dynamo/Results/BarInternalForce.cs | 7 + FemDesign.Dynamo/Dynamo/Results/BarStress.cs | 7 + .../Dynamo/Results/EigenFrequencies.cs | 6 + FemDesign.Dynamo/Dynamo/Results/FeaNode.cs | 8 +- .../Dynamo/Results/LineSupportReaction.cs | 10 +- .../Dynamo/Results/NodalDisplacement.cs | 10 +- .../Dynamo/Results/NodalVibration.cs | 10 +- .../Dynamo/Results/PointSupportReaction.cs | 12 +- .../Results/PointSupportReactionMinMax.cs | 72 + .../Dynamo/Results/ShellDisplacement.cs | 10 +- .../Dynamo/Results/ShellInternalForce.cs | 7 + .../Dynamo/Shells/EdgeConnection.cs | 15 +- FemDesign.Dynamo/Dynamo/Shells/Panel.cs | 6 +- .../Dynamo/Shells/ShellEccentricity.cs | 8 - .../Dynamo/Shells/ShellOrthotropy.cs | 8 - FemDesign.Dynamo/Dynamo/Shells/Slab.cs | 22 +- FemDesign.Dynamo/Dynamo/Shells/SlabPart.cs | 2 +- FemDesign.Dynamo/Dynamo/Shells/Thickness.cs | 2 +- .../Dynamo/Stage/ActivatedLoadCase.cs | 21 + .../Dynamo/Stage/ConstructionStages.cs | 21 + FemDesign.Dynamo/Dynamo/Stage/Stage.cs | 21 + FemDesign.Dynamo/Dynamo/StructureGrid/Axis.cs | 4 +- .../Dynamo/StructureGrid/Storey.cs | 4 +- .../Dynamo/Supports/LineSupport.cs | 8 +- .../Dynamo/Supports/PointSupport.cs | 8 +- .../Dynamo/Supports/SurfaceSupport.cs | 6 +- FemDesign.Dynamo/FemDesign.Dynamo.csproj | 107 +- .../Program.cs | 8 +- .../C#/Example 3 - Analyse a beam/Program.cs | 7 +- .../Example10 - ConstructionStages/Program.cs | 23 +- .../CreateStiffnessPoints.sln | 25 + .../Parse.cs | 30 + .../PointLocation.txt | 6 + ... example - Stiffness Point from CSV.csproj | 24 + .../Program.cs | 38 + .../Example 5 - Using custom sections.gh | Bin 47115 -> 52320 bytes .../Example 5 - my example section.struxml | 90372 +--------------- FemDesign.Grasshopper/Bars/BarsBeam.cs | 15 +- FemDesign.Grasshopper/Bars/BarsColumn.cs | 95 +- .../Bars/BarsConnectivityConstruct.cs | 16 +- .../Bars/BarsConnectivityDefineSemiRigid.cs | 6 +- FemDesign.Grasshopper/Bars/BarsModify.cs | 3 +- FemDesign.Grasshopper/Bars/BarsTruss.cs | 14 +- .../Bars/BarsTrussLimitedCapacity.cs | 2 +- .../Bars/OBSOLETE/BarsBeam_OBSOLETE.cs | 130 + .../Bars/OBSOLETE/BarsColumn_OBSOLETE.cs | 131 + .../Bars/OBSOLETE/BarsTruss_OBSOLETE.cs | 111 + .../Calculate/ApplicationRunAnalysis.cs | 2 +- .../ConstructionStages/ActivatedLoadCase.cs | 21 +- .../ConstructionStages/Stage.cs | 6 +- .../Deconstruct/LineStressLoadDeconstruct.cs | 57 + .../Deconstruct/LoadCombinationDeconstruct.cs | 71 +- .../Deconstruct/StagesDeconstruct.cs | 16 +- .../Deconstruct/SupportDeconstuctor.cs | 4 +- .../FemDesign.Grasshopper.csproj | 70 +- FemDesign.Grasshopper/Info/Info.cs | 2 +- .../Loads/LineStressLoadDefine.cs | 79 + .../Loads/LoadCombinationConstruct.cs | 278 +- .../Loads/LoadCombinationSetupCalculation.cs | 2 +- .../Loads/LoadGroupConstruct.cs | 2 +- .../MaterialGetMaterialByNameOBSOLETE2.cs | 2 +- .../LoadCombinationConstructOBSOLETE.cs | 82 + .../LoadCombinationDeconstructOBSOLETE.cs | 72 + .../Properties/Resources.Designer.cs | 50 + .../Properties/Resources.resx | 15 + .../icons/LineStressLoadConstruct.png | Bin 0 -> 614 bytes .../icons/LineStressLoadDeconstruct.png | Bin 0 -> 1017 bytes .../Resources/icons/StagesDeconstruct.png | Bin 0 -> 12586 bytes .../Resources/icons/StiffnessPoint.png | Bin 0 -> 992 bytes .../Resources/icons/deconstruct_icon.png | Bin 0 -> 10449 bytes .../OBSOLETE/SectionDefineOBSOLETE.cs | 115 + .../Sections/SectionDatabaseSave.cs | 2 +- .../Sections/SectionDefine.cs | 36 +- .../SlabPlateConstruct_OBSOLETE.cs} | 11 +- .../Shells/OBSOLETE/SlabWall_OBSOLETE.cs | 126 + FemDesign.Grasshopper/Shells/SlabPlate.cs | 127 + FemDesign.Grasshopper/Shells/SlabWall.cs | 8 +- .../Supports/StiffnessPoints.cs | 61 + FemDesign.Tests/Bars/BarTests.cs | 178 + ...eateElements.cs => CreateElementsTests.cs} | 2 +- .../Entities/StiffnessPointsTests.cs | 36 + FemDesign.Tests/FemDesign.Tests.csproj | 10 +- .../GenericClasses/EnumHelpersTests.cs | 12 + FemDesign.Tests/Geometry/RegionTest.cs | 5 +- .../Loads/Load combination case types.struxml | 440 + FemDesign.Tests/Loads/LoadCombinationTests.cs | 108 + ...amGeneration.cs => BeamGenerationTests.cs} | 2 +- femdesign-api.sln | 9 + 185 files changed, 4224 insertions(+), 91565 deletions(-) create mode 100644 FemDesign.Core/Bars/BarStiffnessFactors.cs create mode 100644 FemDesign.Core/GenericClasses/INamedEntity.cs create mode 100644 FemDesign.Core/GenericClasses/NamedEntityBase.cs create mode 100644 FemDesign.Core/Loads/LoadCombinationCaseBase.cs create mode 100644 FemDesign.Core/Loads/StageLoadCase.cs create mode 100644 FemDesign.Core/Releases/RigidityDataType0.cs create mode 100644 FemDesign.Core/Shells/SlabStiffnessFactors.cs create mode 100644 FemDesign.Core/Supports/StiffnessPoints.cs create mode 100644 FemDesign.Dynamo/Dynamo/GenericClasses/NamedEntityBase.cs rename FemDesign.Dynamo/Dynamo/Geometry/{FdCoordinateSystem.cs => CoordinateSystem.cs} (54%) rename FemDesign.Dynamo/Dynamo/Geometry/{FdPoint2d.cs => Point2d.cs} (84%) rename FemDesign.Dynamo/Dynamo/Geometry/{FdPoint3d.cs => Point3d.cs} (76%) rename FemDesign.Dynamo/Dynamo/Geometry/{FdVector2d.cs => Vector2d.cs} (84%) rename FemDesign.Dynamo/Dynamo/Geometry/{FdVector3d.cs => Vector3d.cs} (76%) create mode 100644 FemDesign.Dynamo/Dynamo/Results/PointSupportReactionMinMax.cs create mode 100644 FemDesign.Dynamo/Dynamo/Stage/ActivatedLoadCase.cs create mode 100644 FemDesign.Dynamo/Dynamo/Stage/ConstructionStages.cs create mode 100644 FemDesign.Dynamo/Dynamo/Stage/Stage.cs create mode 100644 FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/CreateStiffnessPoints.sln create mode 100644 FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/Parse.cs create mode 100644 FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/PointLocation.txt create mode 100644 FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/Practical example - Stiffness Point from CSV.csproj create mode 100644 FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/Program.cs create mode 100644 FemDesign.Grasshopper/Bars/OBSOLETE/BarsBeam_OBSOLETE.cs create mode 100644 FemDesign.Grasshopper/Bars/OBSOLETE/BarsColumn_OBSOLETE.cs create mode 100644 FemDesign.Grasshopper/Bars/OBSOLETE/BarsTruss_OBSOLETE.cs create mode 100644 FemDesign.Grasshopper/Deconstruct/LineStressLoadDeconstruct.cs create mode 100644 FemDesign.Grasshopper/Loads/LineStressLoadDefine.cs create mode 100644 FemDesign.Grasshopper/Obsolete/LoadCombinationConstructOBSOLETE.cs create mode 100644 FemDesign.Grasshopper/Obsolete/LoadCombinationDeconstructOBSOLETE.cs create mode 100644 FemDesign.Grasshopper/Resources/icons/LineStressLoadConstruct.png create mode 100644 FemDesign.Grasshopper/Resources/icons/LineStressLoadDeconstruct.png create mode 100644 FemDesign.Grasshopper/Resources/icons/StagesDeconstruct.png create mode 100644 FemDesign.Grasshopper/Resources/icons/StiffnessPoint.png create mode 100644 FemDesign.Grasshopper/Resources/icons/deconstruct_icon.png create mode 100644 FemDesign.Grasshopper/Sections/OBSOLETE/SectionDefineOBSOLETE.cs rename FemDesign.Grasshopper/Shells/{SlabPlateConstruct.cs => OBSOLETE/SlabPlateConstruct_OBSOLETE.cs} (91%) create mode 100644 FemDesign.Grasshopper/Shells/OBSOLETE/SlabWall_OBSOLETE.cs create mode 100644 FemDesign.Grasshopper/Shells/SlabPlate.cs create mode 100644 FemDesign.Grasshopper/Supports/StiffnessPoints.cs create mode 100644 FemDesign.Tests/Bars/BarTests.cs rename FemDesign.Tests/Bars/{CreateElements.cs => CreateElementsTests.cs} (99%) create mode 100644 FemDesign.Tests/Entities/StiffnessPointsTests.cs create mode 100644 FemDesign.Tests/Loads/Load combination case types.struxml create mode 100644 FemDesign.Tests/Loads/LoadCombinationTests.cs rename FemDesign.Tests/Performance/{BeamGeneration.cs => BeamGenerationTests.cs} (98%) diff --git a/FemDesign.Core/AdvancedFem/Cover.cs b/FemDesign.Core/AdvancedFem/Cover.cs index f0ceb8764..d3eac3092 100644 --- a/FemDesign.Core/AdvancedFem/Cover.cs +++ b/FemDesign.Core/AdvancedFem/Cover.cs @@ -11,32 +11,14 @@ namespace FemDesign /// cover_type /// [System.Serializable] - public partial class Cover: EntityBase, IStructureElement + public partial class Cover: NamedEntityBase, IStructureElement { /// /// Cover instance number /// private static int _coverInstance = 0; - - /// - /// Identifier - /// - [XmlAttribute("name")] - public string _name; - [XmlIgnore] - public string Name - { - get - { - return this._name; - } - set - { - Cover._coverInstance++; - this._name = value + "." + Cover._coverInstance.ToString(); - } - } - + protected override int GetUniqueInstanceCount() => ++_coverInstance; + /// /// Load bearing direction (point_type_3d) /// @@ -69,10 +51,11 @@ private Cover() /// Region of cover. /// Guidlist of supporting structure. /// Vector, if null a TwoWay cover is defined. + /// Name. public Cover(Geometry.Region region, CoverReferenceList supportingStructures, Geometry.Vector3d loadBearingDirection, string identifier) { this.EntityCreated(); - this.Name = identifier; + this.Identifier = identifier; this.Region = region; this.SupportingStructures = supportingStructures; this.LoadBearingDirection = loadBearingDirection; diff --git a/FemDesign.Core/AuxiliaryResults/LabelledSection.cs b/FemDesign.Core/AuxiliaryResults/LabelledSection.cs index 2f6820d3e..c2672b104 100644 --- a/FemDesign.Core/AuxiliaryResults/LabelledSection.cs +++ b/FemDesign.Core/AuxiliaryResults/LabelledSection.cs @@ -12,11 +12,13 @@ namespace FemDesign.AuxiliaryResults /// Labelled section. Used for extracting detailed results along a section line or polyline. /// [System.Serializable] - public partial class LabelledSection : EntityBase, IStructureElement + public partial class LabelledSection : NamedEntityBase, IStructureElement { [XmlIgnore] - private static int instances = 0; - public static void ResetInstanceCount() => instances = 0; + private static int _labelledSectioninstances = 0; + public static void ResetInstanceCount() => _labelledSectioninstances = 0; + protected override int GetUniqueInstanceCount() => ++_labelledSectioninstances; + [XmlElement("line_segment")] public LineSegment _lineSegment; [XmlElement("polyline")] @@ -51,12 +53,6 @@ public List Verticies { throw new ArgumentException($"LabelledSection must have at least 2 verticies."); } } - - /// - /// Identifier - /// - [XmlAttribute("name")] - public string Name { get; set; } /// /// Parameterless contructor for serialization @@ -81,11 +77,10 @@ public LabelledSection(string identifier = "LS", params Point3d[] verticies) private void Initialize(List verticies, string identifier) { - instances++; this.EntityCreated(); Verticies = verticies; - Name = $"{identifier}.{instances}"; + Identifier = identifier; } } } diff --git a/FemDesign.Core/Bars/Bar.cs b/FemDesign.Core/Bars/Bar.cs index 409229265..866ab4ea3 100644 --- a/FemDesign.Core/Bars/Bar.cs +++ b/FemDesign.Core/Bars/Bar.cs @@ -1,6 +1,8 @@ // https://strusoft.com/ +using System; using System.Collections.Generic; using System.Linq; +using System.Text.RegularExpressions; using System.Xml.Serialization; using FemDesign.GenericClasses; @@ -17,15 +19,8 @@ namespace FemDesign.Bars [XmlInclude(typeof(Truss))] [XmlRoot("database", Namespace = "urn:strusoft")] [System.Serializable] - public partial class Bar : EntityBase, IStructureElement, IStageElement + public partial class Bar : EntityBase, INamedEntity, IStructureElement, IStageElement { - [XmlIgnore] - private static int _barInstance = 0; // used for counter of name) - [XmlIgnore] - private static int _columnInstance = 0; // used for counter of name - [XmlIgnore] - private static int _trussInstance = 0; // used for counter of name - /// /// Truss only. /// enum @@ -63,86 +58,10 @@ public double MaxTension [XmlAttribute("tensions_plasticity")] public bool TensionPlasticity { get; set; } // bool - [XmlAttribute("name")] - public string _name { get; set; } // identifier - - [XmlIgnore] - public string Name - { - get - { - return this._name; - } - set - { - if (this.Type == BarType.Beam) - { - Bar._barInstance++; - this._name = value + "." + Bar._barInstance.ToString(); - - // update barpart identifier - if (this.BarPart != null) - { - this.BarPart.Name = this._name; - } - } - else if (this.Type == BarType.Column) - { - Bar._columnInstance++; - this._name = value + "." + Bar._columnInstance.ToString(); - - // update barpart identifier - if (this.BarPart != null) - { - this.BarPart.Name = this._name; - } - } - else if (this.Type == BarType.Truss) - { - Bar._trussInstance++; - this._name = value + "." + Bar._trussInstance.ToString(); - - // update barpart identifier - if (this.BarPart != null) - { - this.BarPart.Name = this._name; - } - } - else - { - throw new System.ArgumentException($"Incorrect type of bar: {this.Type}"); - } - } - } - [XmlIgnore] - public string Instance - { - get - { - var found = this._name.IndexOf("."); - return this._name.Substring(found + 1); - } - } - public string Identifier => this.Name.Split('.')[0]; [XmlAttribute("type")] - public BarType _type; // beamtype - - [XmlIgnore] - public BarType Type - { - get - { - return this._type; - } - set - { - this._type = value; - } - // get {return this._type;} - // set {this._type = RestrictedString.BeamType(value);} - } + public BarType Type { get; set; } [XmlAttribute("stage")] public int StageId { get; set; } = 1; @@ -150,7 +69,10 @@ public BarType Type [XmlElement("bar_part", Order = 1)] public BarPart BarPart { get; set; } // bar_part_type - [XmlElement("end", Order = 2)] + [XmlElement("truss_behaviour", Order = 2)] + public StruSoft.Interop.StruXml.Data.Truss_chr_type TrussBehaviour { get; set; } + + [XmlElement("end", Order = 3)] public string End = ""; [XmlIgnore] @@ -176,10 +98,26 @@ public List LongitudinalBars } } + public string Name => this.BarPart.Name.Substring(0, this.BarPart.Name.Length - 2); // Remove trailing ".1" from barpart name + public int Instance => this.BarPart.Instance; + + [XmlIgnore] + public string Identifier + { + get => this.BarPart.Identifier; + set => this.BarPart.Identifier = value; + } + [XmlIgnore] + public bool LockedIdentifier + { + get => this.BarPart.LockedIdentifier; + set => this.BarPart.LockedIdentifier = value; + } + /// /// Parameterless constructor for serialization. /// - internal Bar() + protected Bar() { } @@ -194,17 +132,17 @@ internal Bar() /// Analytical eccentricity, same at start. Eccentricity set to 0,0 if null/end /// Connectivity, same at start/end. Connectivity set to Rigid if null /// Identifier - public Bar(Geometry.Edge edge, Materials.Material material, Sections.Section section, BarType type = BarType.Beam, Eccentricity eccentricity = null, Connectivity connectivity = null, string identifier = "B") + public Bar(Geometry.Edge edge, Materials.Material material, Sections.Section section, BarType type, Eccentricity eccentricity = null, Connectivity connectivity = null, string identifier = "B") { - if(type == BarType.Truss) { throw new System.Exception("Truss is not a valid type"); } - + if (type == BarType.Truss) { throw new System.Exception("Truss is not a valid type"); } + this.EntityCreated(); this.Type = type; - this.Name = identifier; + //this.Identifier = identifier; - if(eccentricity == null) { eccentricity = Eccentricity.Default; } - if(connectivity == null) { connectivity = Connectivity.Default; } - this.BarPart = new BarPart(edge, this.Type, material, section, eccentricity, connectivity, this.Name); + if (eccentricity == null) { eccentricity = Eccentricity.Default; } + if (connectivity == null) { connectivity = Connectivity.Default; } + this.BarPart = new BarPart(edge, this.Type, material, section, eccentricity, connectivity, identifier); } /// @@ -221,7 +159,7 @@ public Bar(Geometry.Edge edge, Materials.Material material, Sections.Section sec /// Connectivity. Connectivity set to Rigid if null/end /// Connectivity. Connectivity set to Rigid if null /// Identifier - public Bar(FemDesign.Geometry.Point3d startPoint, FemDesign.Geometry.Point3d endPoint, Materials.Material material, Sections.Section section, BarType type = BarType.Beam, Geometry.Vector3d localY = null, Eccentricity startEccentricity = null, Eccentricity endEccentricity = null, Connectivity startConnectivity = null, Connectivity endConnectivity = null, string identifier = "B") + public Bar(FemDesign.Geometry.Point3d startPoint, FemDesign.Geometry.Point3d endPoint, Materials.Material material, Sections.Section section, BarType type, Geometry.Vector3d localY = null, Eccentricity startEccentricity = null, Eccentricity endEccentricity = null, Connectivity startConnectivity = null, Connectivity endConnectivity = null, string identifier = "B") { var orientY = localY ?? (endPoint - startPoint).Cross(Geometry.Vector3d.UnitZ); Geometry.Edge edge = new Geometry.Edge(startPoint, endPoint, orientY); @@ -229,14 +167,14 @@ public Bar(FemDesign.Geometry.Point3d startPoint, FemDesign.Geometry.Point3d end this.EntityCreated(); this.Type = type; - this.Name = identifier; + //this.Identifier = identifier; if (startEccentricity == null) { startEccentricity = Eccentricity.Default; } if (endEccentricity == null) { endEccentricity = Eccentricity.Default; } if (startConnectivity == null) { startConnectivity = Connectivity.Default; } if (endConnectivity == null) { endConnectivity = Connectivity.Default; } - this.BarPart = new BarPart(edge, this.Type, material, section, startEccentricity, endEccentricity, startConnectivity, endConnectivity, this.Name); + this.BarPart = new BarPart(edge, this.Type, material, section, startEccentricity, endEccentricity, startConnectivity, endConnectivity, identifier); } @@ -264,10 +202,10 @@ public Bar(Geometry.Edge edge, BarType type, Materials.Material material, Sectio this.EntityCreated(); this.Type = type; - this.Name = identifier; + //this.Identifier = identifier; - this.BarPart = new BarPart(edge, this.Type, material, section, startEccentricity, endEccentricity, startConnectivity, endConnectivity, this.Name); + this.BarPart = new BarPart(edge, this.Type, material, section, startEccentricity, endEccentricity, startConnectivity, endConnectivity, identifier); } /// @@ -289,8 +227,8 @@ public Bar(Geometry.Edge edge, BarType type, Materials.Material material, Sectio this.EntityCreated(); this.Type = type; - this.Name = identifier; - this.BarPart = new BarPart(edge, this.Type, material, startSection, endSection, startEccentricity, endEccentricity, startConnectivity, endConnectivity, this.Name); + //this.Identifier = identifier; + this.BarPart = new BarPart(edge, this.Type, material, startSection, endSection, startEccentricity, endEccentricity, startConnectivity, endConnectivity, identifier); } @@ -310,8 +248,8 @@ public Bar(Geometry.Edge edge, BarType type, Materials.Material material, Sectio this.EntityCreated(); this.Type = type; - this.Name = identifier; - this.BarPart = new BarPart(edge, this.Type, material, sections, eccentricities, connectivities, this.Name); + //this.Identifier = identifier; + this.BarPart = new BarPart(edge, this.Type, material, sections, eccentricities, connectivities, identifier); } /// @@ -332,8 +270,8 @@ public Bar(Geometry.Edge edge, BarType type, Materials.Material material, Sectio this.EntityCreated(); this.Type = type; - this.Name = identifier; - this.BarPart = new BarPart(edge, this.Type, material, sections, positions, eccentricities, startConnectivity, endConnectivity, this.Name); + //this.Identifier = identifier; + this.BarPart = new BarPart(edge, this.Type, material, sections, positions, eccentricities, startConnectivity, endConnectivity, identifier); } @@ -349,10 +287,34 @@ public Bar(Geometry.Edge edge, Materials.Material material, Sections.Section sec { this.EntityCreated(); this.Type = BarType.Truss; - this.Name = identifier; + //this.Identifier = identifier; this.BarPart = new BarPart(edge, this.Type, material, section, identifier); } + + + /// + /// Construct a truss element. + /// + /// + /// + /// + /// + /// + public static Bar Truss(Geometry.Edge edge, Materials.Material material, Sections.Section section, string identifier) + { + var truss = new Bar(); + + truss.EntityCreated(); + truss.Type = BarType.Truss; + //truss.Identifier = identifier; + truss.BarPart = new BarPart(edge, truss.Type, material, section, identifier); + return truss; + } + + + + /// Update entities if this bar should be "reconstructed" public void UpdateEntities() { @@ -371,10 +333,10 @@ public void UpdateEntities() public override string ToString() { - if(this.Type == BarType.Beam || this.Type == BarType.Column) + if (this.Type == BarType.Beam || this.Type == BarType.Column) return $"{this.Type} Start: {this.BarPart.Edge.Points.First()}, End: {this.BarPart.Edge.Points.Last()}, Length: {this.BarPart.Edge.Length} m, Sections: ({this.BarPart.ComplexSectionObj.Sections.First()._sectionName}, {this.BarPart.ComplexSectionObj.Sections.Last()._sectionName}), Material: {this.BarPart.ComplexMaterialObj}"; - else if(this.Type == BarType.Truss) + else if (this.Type == BarType.Truss) { return $"{this.Type} Start: {this.BarPart.Edge.Points.First()}, End: {this.BarPart.Edge.Points.Last()}, Length: {this.BarPart.Edge.Length} m, Section: {this.BarPart.TrussUniformSectionObj._sectionName}, Material: {this.BarPart.ComplexMaterialObj}"; } diff --git a/FemDesign.Core/Bars/BarPart.cs b/FemDesign.Core/Bars/BarPart.cs index d154e2c42..0f7c85a85 100644 --- a/FemDesign.Core/Bars/BarPart.cs +++ b/FemDesign.Core/Bars/BarPart.cs @@ -2,7 +2,9 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Xml; using System.Xml.Serialization; +using System.ComponentModel; using FemDesign.GenericClasses; @@ -14,8 +16,28 @@ namespace FemDesign.Bars /// Underlying representation of a Bar-element. /// [System.Serializable] - public partial class BarPart : EntityBase, IStageElement + public partial class BarPart : NamedEntityPartBase, IStageElement { + [XmlIgnore] + private static int _barInstance = 0; // Number of bar/beam instances created + [XmlIgnore] + private static int _columnInstance = 0; // Number of column instances created + [XmlIgnore] + private static int _trussInstance = 0; // Number of truss instances created + protected override int GetUniqueInstanceCount() + { + switch (this.Type) + { + case BarType.Beam: + return ++_barInstance; + case BarType.Column: + return ++_columnInstance; + case BarType.Truss: + return ++_trussInstance; + default: + throw new System.ArgumentException($"Incorrect type of bar: {this.Type}"); + } + } /// /// Edge field /// @@ -158,47 +180,15 @@ public Geometry.Vector3d LocalZ } } - /// - /// Identifier field - /// - [XmlAttribute("name")] - public string _name; - - /// - /// Identifier property - /// - [XmlIgnore] - public string Name - { - get - { - return this._name; - } - set - { - this._name = value + ".1"; - } - } - [XmlIgnore] - public string Instance - { - get - { - var found = this._name.IndexOf("."); - return this._name.Substring(found + 1); - } - } - public string Identifier => this.Name.Split('.')[0]; - [XmlIgnore] - public BarType Type { get; set; } + public BarType Type; [XmlIgnore] public SectionType SectionType { get { - if(this.Type == BarType.Truss) + if (this.Type == BarType.Truss) { return SectionType.Truss; } @@ -206,11 +196,11 @@ public SectionType SectionType { return SectionType.RegularBeamColumn; } - else if(this.Type != BarType.Truss && this.HasComplexCompositeRef) + else if (this.Type != BarType.Truss && this.HasComplexCompositeRef) { return SectionType.CompositeBeamColumn; } - else if(this.Type != BarType.Truss && this.HasComplexSectionRef && this.HasDeltaBeamComplexSectionRef) + else if (this.Type != BarType.Truss && this.HasComplexSectionRef && this.HasDeltaBeamComplexSectionRef) { return SectionType.DeltaBeamColumn; } @@ -306,7 +296,7 @@ public string ComplexSectionRef this._complexSectionRef = r; return r; } - + } } set @@ -455,9 +445,36 @@ public Eccentricity[] AnalyticalEccentricity } [XmlElement("buckling_data", Order = 5)] public Buckling.BucklingData BucklingData { get; set; } // buckling_data_type - [XmlElement("end", Order = 6)] + + [XmlElement("camber_type_2d", Order = 6)] + public StruSoft.Interop.StruXml.Data.Camber_type_2d CamberType2d { get; set; } + + [XmlElement("stiffness_modifiers", Order = 7)] + public BarStiffnessFactors BarStiffnessFactors { get; set; } + + [XmlElement("end", Order = 8)] public string End = ""; + [XmlAttribute("ecc_crack")] + [DefaultValue(false)] + public bool EccCrack { get; set; } + + [XmlAttribute("first_order_analysis_U")] + [DefaultValue(false)] + public bool FirstOrderAnalysisU { get; set; } + + [XmlAttribute("first_order_analysis_Sq")] + [DefaultValue(false)] + public bool FirstOrderAnalysisSq { get; set; } + + [XmlAttribute("first_order_analysis_Sf")] + [DefaultValue(false)] + public bool FirstOrderAnalysisSf { get; set; } + + [XmlAttribute("first_order_analysis_Sc")] + [DefaultValue(false)] + public bool FirstOrderAnalysisSc { get; set; } + /// /// Parameterless constructor for serialization. /// @@ -484,7 +501,7 @@ public BarPart(Geometry.Edge edge, BarType type, Materials.Material material, Se this.ComplexSectionObj = new Sections.ComplexSection(section, eccentricity); this.Connectivity = new Connectivity[1] { connectivity }; this.EccentricityCalc = true; - this.Name = identifier; + this.Identifier = identifier; } } @@ -506,7 +523,7 @@ public BarPart(Geometry.Edge edge, BarType type, Materials.Material material, Se this.ComplexSectionObj = new Sections.ComplexSection(section, section, startEccentricity, endEccentricity); this.Connectivity = new Connectivity[2] { startConnectivity, endConnectivity }; this.EccentricityCalc = true; - this.Name = identifier; + this.Identifier = identifier; } } @@ -528,7 +545,7 @@ public BarPart(Geometry.Edge edge, BarType type, Materials.Material material, Se this.ComplexSectionObj = new Sections.ComplexSection(startSection, endSection, startEccentricity, endEccentricity); this.Connectivity = new Connectivity[2] { startConnectivity, endConnectivity }; this.EccentricityCalc = true; - this.Name = identifier; + this.Identifier = identifier; } } @@ -550,7 +567,7 @@ public BarPart(Geometry.Edge edge, BarType type, Materials.Material material, Se this.ComplexSectionObj = new Sections.ComplexSection(sections, eccentricities); this.Connectivity = connectivities; this.EccentricityCalc = true; - this.Name = identifier; + this.Identifier = identifier; } } @@ -572,13 +589,13 @@ public BarPart(Geometry.Edge edge, BarType type, Materials.Material material, Se this.ComplexSectionObj = new Sections.ComplexSection(sections, positions, eccentricities); this.Connectivity = new Connectivity[2] { startConnectivity, endConnectivity }; this.EccentricityCalc = true; - this.Name = identifier; + this.Identifier = identifier; } } /// /// Construct BarPart (truss) - /// + /// public BarPart(Geometry.Edge edge, BarType type, Materials.Material material, Sections.Section section, string identifier) { if (type != BarType.Truss) @@ -592,13 +609,13 @@ public BarPart(Geometry.Edge edge, BarType type, Materials.Material material, Se this.Edge = edge; this.ComplexMaterialObj = material; this.TrussUniformSectionObj = section; - this.Name = identifier; + this.Identifier = identifier; } } /// /// Orient this object's coordinate system to GCS - /// + /// public void OrientCoordinateSystemToGCS() { var cs = this.CoordinateSystem; diff --git a/FemDesign.Core/Bars/BarStiffnessFactors.cs b/FemDesign.Core/Bars/BarStiffnessFactors.cs new file mode 100644 index 000000000..6e169ce1c --- /dev/null +++ b/FemDesign.Core/Bars/BarStiffnessFactors.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using System.Xml.Serialization; + +namespace FemDesign.Bars +{ + public partial class BarStiffnessFactors + { + //[XmlElement("stiffness_modifiers", Order = 1)] + //public List Stiffness_modifiers + //{ + // get + // { + // if (_stiffness_modifiers == null) + // return null; + // else if (_stiffness_modifiers.Count == 0) + // return null; + // else + // return _stiffness_modifiers; + // } + // set + // { + // if (value == null) + // _stiffness_modifiers = null; + // else if (value.Count == 0) + // _stiffness_modifiers = null; + // else + // _stiffness_modifiers = value; + // } + //} + + //[XmlIgnore] + //public List _stiffness_modifiers; + + + [XmlElement("factors", Order = 1)] + public List StiffnessModifiers { get; set; } + + } +} diff --git a/FemDesign.Core/Bars/Connectivity.cs b/FemDesign.Core/Bars/Connectivity.cs index 99363daf3..9ca9a0ea0 100644 --- a/FemDesign.Core/Bars/Connectivity.cs +++ b/FemDesign.Core/Bars/Connectivity.cs @@ -19,7 +19,7 @@ public partial class Connectivity // binary-rigid /// Translation local-x axis. [XmlAttribute("m_x")] - public bool Mx + public bool Tx { get { @@ -35,7 +35,7 @@ public bool Mx /// Translation local-y axis. [XmlAttribute("m_y")] - public bool My + public bool Ty { get { @@ -52,7 +52,7 @@ public bool My /// Translation local-z axis. [XmlAttribute("m_z")] - public bool Mz + public bool Tz { get { @@ -119,7 +119,7 @@ public bool Rz [XmlAttribute("m_x_release")] public double _mxRelease; // non_neg_max_1e10. Default = 0. Valid only if m_x is false. [XmlIgnore] - public double MxRelease + public double TxRelease { get { @@ -133,7 +133,7 @@ public double MxRelease [XmlAttribute("m_y_release")] public double _myRelease; // non_neg_max_1e10. Default = 0. Valid only if m_y is false. [XmlIgnore] - public double MyRelease + public double TyRelease { get { @@ -147,7 +147,7 @@ public double MyRelease [XmlAttribute("m_z_release")] public double _mzRelease; // non_neg_max_1e10. Default = 0. Valid only if m_z is false. [XmlIgnore] - public double MzRelease + public double TzRelease { get { @@ -205,7 +205,7 @@ public bool IsRigid { get { - if(this.Mx && this.My && this.Mz && this.Rx && this.Ry && this.Rz) + if(this.Tx && this.Ty && this.Tz && this.Rx && this.Ry && this.Rz) return true; else return false; @@ -216,7 +216,7 @@ public bool IsHinged { get { - if (this.Mx && this.My && this.Mz && this.Rx && this.Ry == false && this.Rz == false) + if (this.Tx && this.Ty && this.Tz && this.Rx && this.Ry == false && this.Rz == false) return true; else return false; @@ -234,17 +234,17 @@ private Connectivity() /// /// Private constructor for binary-rigid definition. /// - /// - /// - /// + /// + /// + /// /// /// /// - public Connectivity(bool mx, bool my, bool mz, bool rx, bool ry, bool rz) + public Connectivity(bool tx, bool ty, bool tz, bool rx, bool ry, bool rz) { - this.Mx = mx; - this.My = my; - this.Mz = mz; + this.Tx = tx; + this.Ty = ty; + this.Tz = tz; this.Rx = rx; this.Ry = ry; this.Rz = rz; @@ -253,29 +253,29 @@ public Connectivity(bool mx, bool my, bool mz, bool rx, bool ry, bool rz) /// /// Private constructor for semi-rigid definition. /// - /// - /// - /// + /// + /// + /// /// /// /// - /// - /// - /// + /// + /// + /// /// /// /// - public Connectivity(bool mx, bool my, bool mz, bool rx, bool ry, bool rz, double mxRelease, double myRelease, double mzRelease, double rxRelease, double ryRelease, double rzRelease) + public Connectivity(bool tx, bool ty, bool tz, bool rx, bool ry, bool rz, double txRelease, double tyRelease, double tzRelease, double rxRelease, double ryRelease, double rzRelease) { - this.Mx = mx; - this.My = my; - this.Mz = mz; + this.Tx = tx; + this.Ty = ty; + this.Tz = tz; this.Rx = rx; this.Ry = ry; this.Rz = rz; - this.MxRelease = mxRelease; - this.MyRelease = myRelease; - this.MzRelease = mzRelease; + this.TxRelease = txRelease; + this.TyRelease = tyRelease; + this.TzRelease = tzRelease; this.RxRelease = rxRelease; this.RyRelease = ryRelease; this.RzRelease = rzRelease; @@ -321,7 +321,7 @@ public override string ToString() else if(IsHinged) return $"{this.GetType().Name} Hinged"; else - return $"{this.GetType().Name} Tx: {this.MxRelease} kN/m, Ty: {this.MyRelease} kN/m, Tz: {this.MzRelease} kN/m, Rx: {this.RxRelease} kNm/rad, Ry: {this.RyRelease} kNm/rad, Rz: {this.RzRelease} kNm/rad"; + return $"{this.GetType().Name} Tx: {this.TxRelease} kN/m, Ty: {this.TyRelease} kN/m, Tz: {this.TzRelease} kN/m, Rx: {this.RxRelease} kNm/rad, Ry: {this.RyRelease} kNm/rad, Rz: {this.RzRelease} kNm/rad"; } } } \ No newline at end of file diff --git a/FemDesign.Core/Bars/Eccentricity.cs b/FemDesign.Core/Bars/Eccentricity.cs index e85245d77..f42853305 100644 --- a/FemDesign.Core/Bars/Eccentricity.cs +++ b/FemDesign.Core/Bars/Eccentricity.cs @@ -14,7 +14,7 @@ public partial class Eccentricity { /// /// Private field for eccentricity of local-x. - /// + /// [XmlAttribute("x")] public double _x; @@ -138,8 +138,7 @@ public override int GetHashCode() public static Eccentricity Default => new Eccentricity(0, 0); public override string ToString() { - return $"{this.GetType().Name} Local-X: 0.00, Local-Y: {this.Y.ToString(FemDesign.TextFormatting.decimalRounding)}, Local-Z: {this.Z.ToString(FemDesign.TextFormatting.decimalRounding)}"; + return $"{this.GetType().Name} Local-Y: {this.Y.ToString(FemDesign.TextFormatting.decimalRounding)}, Local-Z: {this.Z.ToString(FemDesign.TextFormatting.decimalRounding)}"; } - } } \ No newline at end of file diff --git a/FemDesign.Core/Calculate/Analysis.cs b/FemDesign.Core/Calculate/Analysis.cs index eae4874a9..99d089d52 100644 --- a/FemDesign.Core/Calculate/Analysis.cs +++ b/FemDesign.Core/Calculate/Analysis.cs @@ -259,7 +259,7 @@ public static Analysis StaticAnalysis(Comb comb = null, bool calcCase = true, bo /// Consider masses in global x-direction. /// Consider masses in global y-direction. /// Consider masses in global z-direction. - /// Top of substructure. Masses on this level and below are not considered in Eigenfrequency + /// Top of substructure. Masses on this level and below are not considered in Eigenfrequency /// public static Analysis Eigenfrequencies(int numShapes = 3, int maxSturm = 0, bool x = true, bool y = true, bool z = true, double top = -0.01) { diff --git a/FemDesign.Core/Calculate/Application.cs b/FemDesign.Core/Calculate/Application.cs index 384850927..1867ffc7d 100644 --- a/FemDesign.Core/Calculate/Application.cs +++ b/FemDesign.Core/Calculate/Application.cs @@ -163,6 +163,7 @@ public void OpenStruxml(string struxmlPath, bool killProcess) /// /// /// + /// /// public bool RunFdScript(FdScript fdScript, bool killProcess, bool endSession, bool checkOpenFiles = true) { diff --git a/FemDesign.Core/Calculate/FdScript.cs b/FemDesign.Core/Calculate/FdScript.cs index 86fdca28d..ee2d42a31 100644 --- a/FemDesign.Core/Calculate/FdScript.cs +++ b/FemDesign.Core/Calculate/FdScript.cs @@ -245,6 +245,7 @@ public static FdScript CreateDocumentation(string strPath, string docxTemplatePa return fdScript; } + /// /// Create fdscript to open and extract results from a FEM-Design .str model. /// /// Path to model with results to be extracted. diff --git a/FemDesign.Core/Calculate/Stage.cs b/FemDesign.Core/Calculate/Stage.cs index b37612eaa..1b5963765 100644 --- a/FemDesign.Core/Calculate/Stage.cs +++ b/FemDesign.Core/Calculate/Stage.cs @@ -16,12 +16,12 @@ public partial class Stage /// /// Parameterless constructor for serialization. /// - private Stage() + public Stage() { } - private Stage(bool ghost = false) + public Stage(bool ghost = false) { this._ghost = Convert.ToInt32(ghost); } diff --git a/FemDesign.Core/FemDesign.Core.csproj b/FemDesign.Core/FemDesign.Core.csproj index b5e5ae197..5fd5dd1e7 100644 --- a/FemDesign.Core/FemDesign.Core.csproj +++ b/FemDesign.Core/FemDesign.Core.csproj @@ -20,6 +20,7 @@ 4 false bin\Debug\FemDesign.Core.xml + CS1591 pdbonly @@ -46,17 +47,22 @@ + + + + + @@ -175,6 +181,7 @@ + @@ -185,12 +192,13 @@ + - + @@ -318,6 +326,7 @@ + diff --git a/FemDesign.Core/GenericClasses/INamedEntity.cs b/FemDesign.Core/GenericClasses/INamedEntity.cs new file mode 100644 index 000000000..b32b62cfa --- /dev/null +++ b/FemDesign.Core/GenericClasses/INamedEntity.cs @@ -0,0 +1,32 @@ +// https://strusoft.com/ + +namespace FemDesign +{ + /// + /// Entities with a name/identifier. E.g "B.42" or "@MyLockedName.1" + /// + public interface INamedEntity + { + /// + /// Name of the entity. E.g. "B.42" + /// + string Name { get; } + + /// + /// Instance number. + /// + int Instance { get; } + + /// + /// Identifier part of the name. + /// + string Identifier { get; set; } + + /// + /// When true, FEM-Design will not modify the Instance number of the Name. Note that this might not always be possible. + /// + /// See https://github.com/strusoft/femdesign-api/issues/81#issuecomment-1250848165 for more info. + /// + bool LockedIdentifier { get; set; } + } +} \ No newline at end of file diff --git a/FemDesign.Core/GenericClasses/NamedEntityBase.cs b/FemDesign.Core/GenericClasses/NamedEntityBase.cs new file mode 100644 index 000000000..4b5aaa76b --- /dev/null +++ b/FemDesign.Core/GenericClasses/NamedEntityBase.cs @@ -0,0 +1,74 @@ +// https://strusoft.com/ +using System; +using System.Xml.Serialization; +using System.Text.RegularExpressions; +using FemDesign.GenericClasses; + +namespace FemDesign +{ + public abstract partial class NamedEntityBase : EntityBase, INamedEntity + { + [XmlAttribute("name")] + public string _name; // identifier + [XmlIgnore] + public virtual string Name => _namePattern.Match(this._name).Groups["name"].Value; + [XmlIgnore] + public virtual int Instance => int.Parse(_namePattern.Match(this._name).Groups["instance"].Value); + + [XmlIgnore] + public virtual string Identifier + { + get => _namePattern.Match(this._name).Groups["identifier"].Value; + set + { + this._name = $"{value}.{GetUniqueInstanceCount()}"; + + if (string .IsNullOrEmpty(value) || _namePattern.IsMatch(this._name) == false) + throw new ArgumentException($"'{value}' is not a valid Identifier."); + } + } + + [XmlIgnore] + public virtual bool LockedIdentifier + { + get => _name.StartsWith("@"); + set + { + if (value && !LockedIdentifier) + _name = "@" + _name; + else if (!value && LockedIdentifier) + _name = _name.Substring(1); + } + } + + protected static readonly Regex _namePattern = new Regex(@"^@{0,1}(?'name'(?'identifier'[ -#%'-;=?A-\ufffd;]{0,50})\.(?'instance'[0-9]{1,6}){1})$"); + + protected NamedEntityBase() + { + this._name = ""; + } + + /// + /// This value will be used to set number (like ".1") part of the entity name (like "B.1"). Typically this is a counter starting at 1 and incrementing for each new instance of this class that has been created. + /// + /// A unique number. + protected abstract int GetUniqueInstanceCount(); + } + + public abstract partial class NamedEntityPartBase : NamedEntityBase + { + public override string Name => _namePattern.Match(base._name).Groups["name"].Value; + public override int Instance => int.Parse(_namePattern.Match(base._name).Groups["instance"].Value); + [XmlIgnore] + public override string Identifier + { + get => _namePattern.Match(base._name).Groups["identifier"].Value; + set + { + base.Identifier = value; + base._name += ".1"; + } + } + protected new static readonly Regex _namePattern = new Regex(@"@{0,1}(?'name'(?'identifier'[ -#%'-;=?A-\ufffd;]{0,50})\.(?'instance'[0-9]{1,6}){1}\.1)"); + } +} \ No newline at end of file diff --git a/FemDesign.Core/GenericClasses/RestrictedDouble.cs b/FemDesign.Core/GenericClasses/RestrictedDouble.cs index 3f2bfe72f..0cd91f467 100644 --- a/FemDesign.Core/GenericClasses/RestrictedDouble.cs +++ b/FemDesign.Core/GenericClasses/RestrictedDouble.cs @@ -56,7 +56,7 @@ internal static double AbsMax_10000(double val) } /// - // abs_max_1e20 + /// abs_max_1e20 /// internal static double AbsMax_1e20(double val) { @@ -83,7 +83,7 @@ internal static double NonNegMax_10(double val) } /// - // non_neg_max_100 + /// non_neg_max_100 /// internal static double NonNegMax_100(double val) { diff --git a/FemDesign.Core/Geometry/Face.cs b/FemDesign.Core/Geometry/Face.cs index f2c8573ad..3d6bd0ac1 100644 --- a/FemDesign.Core/Geometry/Face.cs +++ b/FemDesign.Core/Geometry/Face.cs @@ -47,7 +47,6 @@ public Face(int node1, int node2, int node3, int node4) /// /// /// - /// public Face(int node1, int node2, int node3) { this.Node1 = node1; diff --git a/FemDesign.Core/Geometry/LineSegment.cs b/FemDesign.Core/Geometry/LineSegment.cs index b399e6567..6b693e617 100644 --- a/FemDesign.Core/Geometry/LineSegment.cs +++ b/FemDesign.Core/Geometry/LineSegment.cs @@ -36,7 +36,8 @@ public LineSegment() /// /// Construct LineSegment from start and endpoint. /// - /// + /// + /// public LineSegment(Point3d start, Point3d end) { this.StartPoint = start; diff --git a/FemDesign.Core/Geometry/Region.cs b/FemDesign.Core/Geometry/Region.cs index 05232acd2..e20628327 100644 --- a/FemDesign.Core/Geometry/Region.cs +++ b/FemDesign.Core/Geometry/Region.cs @@ -128,12 +128,12 @@ public static Region RectangleXZ(double width, double height) return region; } - public static Region RectangleXY(double width, double length) + public static Region RectangleXY(Point3d corner, double widthX, double widthY) { - var points0 = new Point3d(0, 0, 0); - var points1 = new Point3d(width, 0, 0); - var points2 = new Point3d(width, length, 0); - var points3 = new Point3d(0, length, 0); + var points0 = corner + new Vector3d(0, 0, 0); + var points1 = corner + new Vector3d(widthX, 0, 0); + var points2 = corner + new Vector3d(widthX, widthY, 0); + var points3 = corner + new Vector3d(0, widthY, 0); var points = new List() { points0, points1, points2, points3 }; @@ -186,8 +186,9 @@ public void SetEdgeConnection(Shells.EdgeConnection edgeConnection, int index) edge.EdgeConnection = null; } else - { - string name = "CE." + cInstance.ToString(); + { + string name = edgeConnection.Name == null ? "CE." + cInstance.ToString() : edgeConnection.Name; + Shells.EdgeConnection ec = Shells.EdgeConnection.CopyExisting(edgeConnection, name); edge.EdgeConnection = ec; } diff --git a/FemDesign.Core/Geometry/RegionGroup.cs b/FemDesign.Core/Geometry/RegionGroup.cs index 41f036df3..9c67f897d 100644 --- a/FemDesign.Core/Geometry/RegionGroup.cs +++ b/FemDesign.Core/Geometry/RegionGroup.cs @@ -16,7 +16,7 @@ public partial class RegionGroup /// /// Parameterless constructor for serialization - /// + /// private RegionGroup() { @@ -24,7 +24,7 @@ private RegionGroup() /// /// Construct region group from single region - /// + /// public RegionGroup(Region region) { this.Regions.Add(region); @@ -32,7 +32,7 @@ public RegionGroup(Region region) /// /// Construct region group from list of regions - /// + /// public RegionGroup(List regions) { this.Regions = regions; diff --git a/FemDesign.Core/Loads/LineStressLoad.cs b/FemDesign.Core/Loads/LineStressLoad.cs index 9e67cebdf..bb627c8fd 100644 --- a/FemDesign.Core/Loads/LineStressLoad.cs +++ b/FemDesign.Core/Loads/LineStressLoad.cs @@ -1,5 +1,6 @@ // https://strusoft.com/ +using FemDesign.Geometry; using System.Collections.Generic; using System.Xml.Serialization; @@ -9,7 +10,7 @@ namespace FemDesign.Loads /// line_stress_load_type /// [System.Serializable] - public partial class LineStressLoad: LoadBase + public partial class LineStressLoad : LoadBase { /// /// Edge defining the geometry of the load @@ -68,21 +69,90 @@ private LineStressLoad() } + /// + /// Construct a line stress load + /// + /// + /// Force (n1 and n2) + /// Load case + /// Comment + public LineStressLoad(Edge edge, double force, LoadCase loadCase, string comment = "") + : this(edge, edge.CoordinateSystem.LocalY, force, force, 0.0, 0.0, loadCase, comment) + { } + + /// + /// Construct a line stress load + /// + /// Underlying edge of line load. Line or Arc. + /// Force (n1 and n2) + /// Moment (m1 and m2) + /// Load case + /// Comment + public LineStressLoad(Edge edge, double force, double moment, LoadCase loadCase, string comment = "") + : this(edge, edge.CoordinateSystem.LocalY, force, force, moment, moment, loadCase, comment) + { } + + /// + /// Construct a uniform or variable line stress load + /// + /// Underlying edge of line load. Line or Arc. + /// Force at start. + /// Force at end. + /// Moment at start. + /// Moment at end. + /// Load case + /// Comment + public LineStressLoad(Edge edge, double n1, double n2, double m1, double m2, LoadCase loadCase, string comment = "") + : this(edge, edge.CoordinateSystem.LocalY, n1, n2, m1, m2, loadCase, comment) + { } + /// /// Construct a uniform or variable line stress load /// /// Underlying edge of line load. Line or Arc. /// Direction of load. - /// List of 2 top bottom location values - public LineStressLoad(Geometry.Edge edge, Geometry.Vector3d direction, List topBotLocVals, LoadCase loadCase, string comment) + /// Force at start. + /// Force at end. + /// Moment at start. + /// Moment at end. + /// Load case + /// Comment + public LineStressLoad(Edge edge, Vector3d direction, double n1, double n2, double m1, double m2, LoadCase loadCase, string comment = "") + { + var topBotLocVals = new List { + new TopBotLocationValue(edge.Points[0], n1, m1), + new TopBotLocationValue(edge.Points[0], n2, m2) + }; + Initialize(edge, direction, topBotLocVals, loadCase, comment); + } + + /// + /// Construct a uniform or variable line stress load + /// + /// Underlying edge of line load. Line or Arc. + /// Direction of load. + /// List of 2 top bottom location values + /// Load case + /// Comment + public LineStressLoad(Edge edge, Vector3d direction, List topBotLocVals, LoadCase loadCase, string comment = "") + { + Initialize(edge, direction, topBotLocVals, loadCase, comment); + } + + private void Initialize(Edge edge, Vector3d direction, List topBotLocVals, LoadCase loadCase, string comment) { this.EntityCreated(); this.Edge = edge; this.Direction = direction; this.TopBotLocVal = topBotLocVals; this.LoadCaseGuid = loadCase.Guid; + this.LoadCaseName = loadCase.Name; this.Comment = comment; } + public override string ToString() + { + return $"{this.GetType().Name}, Force: {TopBotLocVal[0].TopVal:0.0}/{TopBotLocVal[1].TopVal:0.0}kN, Moment: {TopBotLocVal[0].BottomVal:0.0}/{TopBotLocVal[1].BottomVal:0.0}kNm, LoadCase: {this.LoadCaseName}"; + } } } \ No newline at end of file diff --git a/FemDesign.Core/Loads/LineTemperatureLoad.cs b/FemDesign.Core/Loads/LineTemperatureLoad.cs index aa5cd0f12..01f3f87fe 100644 --- a/FemDesign.Core/Loads/LineTemperatureLoad.cs +++ b/FemDesign.Core/Loads/LineTemperatureLoad.cs @@ -70,7 +70,9 @@ private LineTemperatureLoad() /// /// Underlying edge of line load. Line or Arc. /// Directio of load. - /// 1 or 2 top bottom location values + /// 1 or 2 top bottom location values + /// + /// public LineTemperatureLoad(Geometry.Edge edge, Geometry.Vector3d direction, List topBotLocVals, LoadCase loadCase, string comment) { this.EntityCreated(); diff --git a/FemDesign.Core/Loads/LoadCombination.cs b/FemDesign.Core/Loads/LoadCombination.cs index 0e48866a1..8d5f4e249 100644 --- a/FemDesign.Core/Loads/LoadCombination.cs +++ b/FemDesign.Core/Loads/LoadCombination.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Xml.Serialization; +using System.Linq; namespace FemDesign.Loads { @@ -14,9 +15,59 @@ public partial class LoadCombination : EntityBase [XmlAttribute("name")] public string Name { get; set; } // name159 [XmlAttribute("type")] - public LoadCombType Type { get; set; } // loadcombtype + public LoadCombType Type { get; set; } // loadcombtype + + // CASES: Xml elements sequence in order + // + // load_case (sequence) + // seismic_max + // seismic_res_fx_plus_mx + // seismic_res_fx_minus_mx + // seismic_res_fy_plus_my + // seismic_res_fy_minus_my + // seismic_res_fz + // ptc_t0 + // ptc_t8 + // ldcase_pile + // cs_case + [XmlElement("load_case")] - public List ModelLoadCase = new List(); // sequence: ModelLoadCase + public List ModelLoadCase { get; set; } = new List(); + + // Special load cases of the combination, from FD18 + [XmlElement("seismic_max")] + public LoadCombinationCaseBase SeismicMax { get; set; } + + [XmlElement("seismic_res_fx_plus_mx")] + public LoadCombinationCaseBase SeismicResFxPlusMx { get; set; } + + [XmlElement("seismic_res_fx_minus_mx")] + public LoadCombinationCaseBase SeismicResFxMinusMx { get; set; } + + [XmlElement("seismic_res_fy_plus_my")] + public LoadCombinationCaseBase SeismicResFyPlusMy { get; set; } + + [XmlElement("seismic_res_fy_minus_my")] + public LoadCombinationCaseBase SeismicResFyMinusMy { get; set; } + + [XmlElement("seismic_res_fz")] + public LoadCombinationCaseBase SeismicResFz { get; set; } + + // Special load cases of the combination, from FD19 + [XmlElement("ptc_t0")] + public LoadCombinationCaseBase PtcT0 { get; set; } + + [XmlElement("ptc_t8")] + public LoadCombinationCaseBase PtcT8 { get; set; } + + // Special load cases of the combination, from FD20 + [XmlElement("ldcase_pile")] + public LoadCombinationCaseBase PileLoadCase { get; set; } + + // Special load cases of the combination, from FD21.0003 + [XmlElement("cs_case")] + public StageLoadCase StageLoadCase { get; set; } + [XmlIgnore] public Calculate.CombItem CombItem { get; set; } @@ -28,9 +79,6 @@ private LoadCombination() } - /// - /// Internal constructor. Used for GH components and Dynamo nodes. - /// public LoadCombination(string name, LoadCombType type, List loadCases, List gammas, Calculate.CombItem combItem = null) { Initialize(name, type, combItem); @@ -95,18 +143,133 @@ public List GetGammas() } /// - /// Add LoadCase to LoadCombination. + /// /// - private void AddLoadCase(LoadCase loadCase, double gamma) + /// List of pairs of CaseId and gamma values. CaseId may be LoadCase guid, construction stage index description or special case name. + public List<(string CaseId, double Gamma)> GetCaseDescriptionAndGammas() { - if (this.LoadCaseInLoadCombination(loadCase)) + var pairs = new List<(string CaseId, double Gamma)>(); + for (int i = 0; i < ModelLoadCase.Count; i++) { - // pass + pairs.Add((ModelLoadCase[i].Guid.ToString(), ModelLoadCase[i].Gamma)); } - else + + if (SeismicMax != null) + pairs.Add(("Seismic max.", SeismicMax.Gamma)); + if (SeismicResFxMinusMx != null) + pairs.Add(("Seismic fx-mx", SeismicResFxMinusMx.Gamma)); + if (SeismicResFxPlusMx != null) + pairs.Add(("Seismic fx+mx", SeismicResFxPlusMx.Gamma)); + if (SeismicResFyMinusMy != null) + pairs.Add(("Seismic fy-my", SeismicResFyMinusMy.Gamma)); + if (SeismicResFyPlusMy != null) + pairs.Add(("Seismic fy+my", SeismicResFyPlusMy.Gamma)); + if (SeismicResFz != null) + pairs.Add(("Seismic fz", SeismicResFz.Gamma)); + + if (PtcT0 != null) + pairs.Add(("Ptc T0", PtcT0.Gamma)); + if (PtcT8 != null) + pairs.Add(("Ptc T8", PtcT8.Gamma)); + + if (PileLoadCase != null) + pairs.Add(("pile loadcase", PileLoadCase.Gamma)); + + if (StageLoadCase != null) + pairs.Add((StageLoadCase._stageType, StageLoadCase.Gamma)); + + return pairs; + } + + + + public List<(LoadCase Case, double Gamma, string CaseType)> GetLoadCasesAndGammas() + { + var pairs = new List<(LoadCase Case, double Gamma, string CaseType)>(); + for (int i = 0; i < ModelLoadCase.Count; i++) { - this.ModelLoadCase.Add(new ModelLoadCase(loadCase, gamma)); + pairs.Add(( + ModelLoadCase[i].LoadCase, + ModelLoadCase[i].Gamma, + ModelLoadCase[i].IsMovingLoadLoadCase ? "Moving load case" : "Load case" + )); } + return pairs; + } + public List<(string Case, double Gamma)> GetSpecialCasesAndGammas() + { + var pairs = new List<(string Case, double Gamma)>(); + + if (SeismicMax != null) + pairs.Add(("Seismic max.", SeismicMax.Gamma)); + if (SeismicResFxMinusMx != null) + pairs.Add(("Seis res, Fx-Mx", SeismicResFxMinusMx.Gamma)); + if (SeismicResFxPlusMx != null) + pairs.Add(("Seis res, Fx+Mx", SeismicResFxPlusMx.Gamma)); + if (SeismicResFyMinusMy != null) + pairs.Add(("Seis res, Fy-My", SeismicResFyMinusMy.Gamma)); + if (SeismicResFyPlusMy != null) + pairs.Add(("Seis res, Fy+My", SeismicResFyPlusMy.Gamma)); + if (SeismicResFz != null) + pairs.Add(("Seis res, Fz", SeismicResFz.Gamma)); + + if (PtcT0 != null) + pairs.Add(("PTC T0", PtcT0.Gamma)); + if (PtcT8 != null) + pairs.Add(("PTC T8", PtcT8.Gamma)); + + if (PileLoadCase != null) + pairs.Add(("Neg. Shaft friction", PileLoadCase.Gamma)); + + return pairs; + } + + public List<(object Case, double Gamma, string CaseType)> GetCaseAndGammas() + { + var pairs = new List<(object, double, string)>(); + pairs.AddRange( + GetLoadCasesAndGammas() + .Select((t) => { return ((object)t.Case, t.Gamma, t.CaseType); }) + .ToList()); + pairs.AddRange( + GetSpecialCasesAndGammas() + .Select((t) => { return ((object)t.Case, t.Gamma, "Special load case"); }) + .ToList()); + + if (StageLoadCase is null) return pairs; + + if (StageLoadCase.IsFinalStage) + pairs.Add(("Final construction stage", StageLoadCase.Gamma, "Special load case")); + else + pairs.Add((StageLoadCase.Stage, StageLoadCase.Gamma, "Stage")); + + return pairs; + } + + /// + /// Add LoadCase to LoadCombination. + /// + public void AddLoadCase(LoadCase loadCase, double gamma) + { + if (this.LoadCaseInLoadCombination(loadCase)) + return; + + this.ModelLoadCase.Add(new ModelLoadCase(loadCase, gamma)); + } + + public void SetStageLoadCase(Stage stage, double gamma) + { + this.StageLoadCase = new StageLoadCase(stage, gamma); + } + + public void SetFinalStageLoadCase(double gamma) + { + this.StageLoadCase = StageLoadCase.FinalStage(gamma); + } + + public void RemoveStageLoadCase() + { + this.StageLoadCase = null; } /// @@ -114,14 +277,7 @@ private void AddLoadCase(LoadCase loadCase, double gamma) /// private bool LoadCaseInLoadCombination(LoadCase loadCase) { - foreach (ModelLoadCase elem in this.ModelLoadCase) - { - if (elem.Guid == loadCase.Guid) - { - return true; - } - } - return false; + return this.ModelLoadCase.Any(elem => elem.Guid == loadCase.Guid); } public override string ToString() @@ -131,14 +287,23 @@ public override string ToString() const int gammaSpace = -3; var repr = ""; repr += $"{this.Name,space} {this.Type}\n"; - foreach (var item in this.ModelLoadCase) + + var casesAndGammas = GetCaseAndGammas(); + + foreach (var (@case, gamma, type) in casesAndGammas) { - if(item.LoadCase == null) { return base.ToString(); } // Deserialisation can not get the loadcase name from the object. Only the GUID + if (@case is null) { return base.ToString(); } // Deserialisation can not get the loadcase name from the object. + + if (@case.GetType() == typeof(LoadCase)) + { + var lc = (LoadCase)@case; + repr += $"{"",space - 1}{gamma,gammaSpace} {lc.Name,caseNameSpace}\n"; + } else - repr += $"{"",space - 1}{item.LoadCase.Name,caseNameSpace} {item.Gamma,gammaSpace}\n"; + repr += $"{"",space - 1}{gamma,gammaSpace} {@case,caseNameSpace}\n"; } - + return repr; } } -} \ No newline at end of file +} diff --git a/FemDesign.Core/Loads/LoadCombinationCaseBase.cs b/FemDesign.Core/Loads/LoadCombinationCaseBase.cs new file mode 100644 index 000000000..1ab0d12b0 --- /dev/null +++ b/FemDesign.Core/Loads/LoadCombinationCaseBase.cs @@ -0,0 +1,21 @@ +// https://strusoft.com/ + +using System.Xml.Serialization; + +namespace FemDesign.Loads +{ + public class LoadCombinationCaseBase // spec_load_case_item + { + [XmlAttribute("gamma")] + public double Gamma; + + /// + /// Parameterless constructor for serialization + /// + protected LoadCombinationCaseBase() { } + public LoadCombinationCaseBase(double gamma) + { + Gamma = gamma; + } + } +} \ No newline at end of file diff --git a/FemDesign.Core/Loads/LoadGroupPermanent.cs b/FemDesign.Core/Loads/LoadGroupPermanent.cs index d9481b317..3cc9c6551 100644 --- a/FemDesign.Core/Loads/LoadGroupPermanent.cs +++ b/FemDesign.Core/Loads/LoadGroupPermanent.cs @@ -50,6 +50,7 @@ private LoadGroupPermanent() { } /// List of load cases in the load group /// Specifies how to condider the load cases in combinations /// Xi-factor used in the combinations, see EN 1990. + /// public LoadGroupPermanent(double standardFavourable, double standardUnfavourable, double accidentalFavourable, double accidentalUnfavourable, List loadCases, diff --git a/FemDesign.Core/Loads/ModelLoadCase.cs b/FemDesign.Core/Loads/ModelLoadCase.cs index f43419ae9..a2ec18f39 100644 --- a/FemDesign.Core/Loads/ModelLoadCase.cs +++ b/FemDesign.Core/Loads/ModelLoadCase.cs @@ -10,7 +10,7 @@ namespace FemDesign.Loads /// load_case (child of load_combination_type) /// [Serializable] - public partial class ModelLoadCase + public partial class ModelLoadCase : LoadCombinationCaseBase { [XmlAttribute("guid")] public string _guid = string.Empty; @@ -25,8 +25,9 @@ public Guid Guid else return new Guid(_guid); } - set { - _guid = IsMovingLoadLoadCase ? _guid = $"{value}#{Index}": _guid = value.ToString(); + set + { + _guid = IsMovingLoadLoadCase ? _guid = $"{value}#{Index}" : _guid = value.ToString(); } } [XmlIgnore] @@ -53,8 +54,6 @@ public int Index public bool IsMovingLoadLoadCase { get { return _guid.IndexOf('#') != -1; } } [XmlIgnore] public string IndexedGuid => _guid; - [XmlAttribute("gamma")] - public double Gamma { get; set; } // double [XmlIgnore] public LoadCase LoadCase { get; set; } public ModelLoadCase() diff --git a/FemDesign.Core/Loads/ModelLoadCaseInGroup.cs b/FemDesign.Core/Loads/ModelLoadCaseInGroup.cs index 085704e8b..5bfcafe09 100644 --- a/FemDesign.Core/Loads/ModelLoadCaseInGroup.cs +++ b/FemDesign.Core/Loads/ModelLoadCaseInGroup.cs @@ -23,6 +23,7 @@ private ModelLoadCaseInGroup() { } /// Public constructor. /// /// LoadCase guid reference. + /// public ModelLoadCaseInGroup(System.Guid guid, LoadGroupBase parentLoadGroup) { this.Guid = guid; diff --git a/FemDesign.Core/Loads/PointLoad.cs b/FemDesign.Core/Loads/PointLoad.cs index 0d1533075..04b38d2b2 100644 --- a/FemDesign.Core/Loads/PointLoad.cs +++ b/FemDesign.Core/Loads/PointLoad.cs @@ -27,7 +27,7 @@ private PointLoad() /// /// Internal constructor accessed by static methods. /// - public PointLoad(Geometry.Point3d point, Geometry.Vector3d force, LoadCase loadCase, string comment = "", ForceLoadType type = ForceLoadType.Force) + public PointLoad(Geometry.Point3d point, Geometry.Vector3d force, LoadCase loadCase, string comment, ForceLoadType type) { this.EntityCreated(); this.LoadCaseGuid = loadCase.Guid; diff --git a/FemDesign.Core/Loads/StageLoadCase.cs b/FemDesign.Core/Loads/StageLoadCase.cs new file mode 100644 index 000000000..61ce4d7c4 --- /dev/null +++ b/FemDesign.Core/Loads/StageLoadCase.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml.Serialization; + +namespace FemDesign.Loads +{ + public class StageLoadCase : LoadCombinationCaseBase + { + [XmlAttribute("type")] + public string _stageType; + + private Stage _stage; + [XmlIgnore] + public Stage Stage { get { return _stage; } set { _stage = value; _stageType = $"cs.{value.Id}"; } } + + private const string _finalStage = "final_cs"; + public bool IsFinalStage => _stageType == _finalStage; + public int StageIndex => IsFinalStage ? -1 : int.Parse(_stageType.Substring(3)); + + /// + /// Parameterless constructor for serialization + /// + private StageLoadCase() + { + } + + public StageLoadCase(Stage stage, double gamma) + { + Gamma = gamma; + Stage = stage; + } + + public static StageLoadCase FinalStage(double gamma) + { + return new StageLoadCase() + { + _stageType = _finalStage, + Gamma = gamma + }; + } + } +} diff --git a/FemDesign.Core/Materials/Material.cs b/FemDesign.Core/Materials/Material.cs index 17b71a9c4..b1346d43b 100644 --- a/FemDesign.Core/Materials/Material.cs +++ b/FemDesign.Core/Materials/Material.cs @@ -68,7 +68,7 @@ public static Material GetMaterialByNameOrIndex(List materials, dynami } catch (Exception ex) { - throw new Exception($"{materialInput} does not exist!"); + throw new Exception($"{materialInput} does not exist!", ex); } } else @@ -79,7 +79,7 @@ public static Material GetMaterialByNameOrIndex(List materials, dynami } catch (Exception ex) { - throw new System.Exception($"Materials List only contains {materials.Count} item. {materialInput} is out of range!"); + throw new System.Exception($"Materials List only contains {materials.Count} item. {materialInput} is out of range!", ex); } } return material; diff --git a/FemDesign.Core/Materials/MaterialDatabase.cs b/FemDesign.Core/Materials/MaterialDatabase.cs index 287f23b71..2252d280d 100644 --- a/FemDesign.Core/Materials/MaterialDatabase.cs +++ b/FemDesign.Core/Materials/MaterialDatabase.cs @@ -230,7 +230,13 @@ public static MaterialDatabase GetDefault(string countryCode = "S") public (List steel, List concrete, List timber, List reinforcement, List stratum, List custom) ByType() { - var materialDataBaseList = this.Materials.Material.Concat(this.ReinforcingMaterials.Material); + var materialDataBaseList = new List(); + if (this.ReinforcingMaterials != null) + { + materialDataBaseList = this.Materials.Material.Concat(this.ReinforcingMaterials.Material).ToList(); + } + else + materialDataBaseList.AddRange(this.Materials.Material); var steel = new List(); var timber = new List(); diff --git a/FemDesign.Core/Model/Model.cs b/FemDesign.Core/Model/Model.cs index 6e63ff6a5..a41f0b2ba 100644 --- a/FemDesign.Core/Model/Model.cs +++ b/FemDesign.Core/Model/Model.cs @@ -125,6 +125,7 @@ private Model() /// Load cases /// Load combinations /// Load groups + /// Construction stages object instance. public Model(Country country, List elements = null, List loads = null, List loadCases = null, List loadCombinations = null, List loadGroups = null, ConstructionStages constructionStage = null) { Initialize(country); @@ -248,6 +249,8 @@ public static Model DeserializeFromFilePath(string filePath) model.GetLineConnections(); if (model.ConstructionStages != null && model.ConstructionStages.Stages.Any()) model.GetConstructionStages(); + if (model.Entities?.Loads?.LoadCombinations != null && model.Entities.Loads.LoadCombinations.Any()) + model.GetLoadCombinations(); return model; } @@ -263,13 +266,20 @@ public void SerializeModel(string filePath) filePath = System.IO.Path.Combine(currentDirectory, "myModel.struxml"); } - // check file extension + // Relavive paths will be converted to full paths + filePath = System.IO.Path.GetFullPath(filePath); + + // If path has no file extension "struxml" will be used + if (Path.GetExtension(filePath) == "") + filePath = Path.ChangeExtension(filePath, "struxml"); + + // Check file extension if (Path.GetExtension(filePath) != ".struxml") { throw new System.ArgumentException("File extension must be .struxml! Model.SerializeModel failed."); } - // serialize + // Serialize XmlSerializer serializer = new XmlSerializer(typeof(Model)); using (TextWriter writer = new StreamWriter(filePath)) { @@ -287,12 +297,12 @@ public void SerializeModel(string filePath) /// public static (Model fdModel, IEnumerable results) ReadStr(string strPath, IEnumerable resultTypes, bool killProcess = false, bool endSession = true, bool checkOpenFiles = true) { - if(resultTypes != null) - { + if (resultTypes != null) + { var notAResultType = resultTypes.Where(r => !typeof(Results.IResult).IsAssignableFrom(r)).FirstOrDefault(); if (notAResultType != null) throw new ArgumentException($"{notAResultType.Name} is not a result type. (It does not inherit from {typeof(FemDesign.Results.IResult).FullName})"); - } + } var fdScript = Calculate.FdScript.ExtractResults(strPath, resultTypes); @@ -337,7 +347,7 @@ public void Open(string filePath = null, bool closeOpenWindows = false) this.FdApp.OpenStruxml(filePath, closeOpenWindows); } - public void RunAnalysis(Calculate.Analysis analysis, IEnumerable resultTypes = null, Results.UnitResults units = null, string struxmlPath = null, string docxTemplatePath = null, bool endSession = false, bool closeOpenWindows = false, Calculate.CmdGlobalCfg cmdGlobalCfg = null) + public bool RunAnalysis(Calculate.Analysis analysis, IEnumerable resultTypes = null, Results.UnitResults units = null, string struxmlPath = null, string docxTemplatePath = null, bool endSession = false, bool closeOpenWindows = false, Calculate.CmdGlobalCfg cmdGlobalCfg = null) { if (struxmlPath == null) { @@ -353,10 +363,10 @@ public void RunAnalysis(Calculate.Analysis analysis, IEnumerable resultTyp this.SerializeModel(struxmlPath); analysis.SetLoadCombinationCalculationParameters(this); - this.FdApp.RunAnalysis(struxmlPath, analysis, bscPath, docxTemplatePath, endSession, closeOpenWindows, cmdGlobalCfg); + return this.FdApp.RunAnalysis(struxmlPath, analysis, bscPath, docxTemplatePath, endSession, closeOpenWindows, cmdGlobalCfg); } - public void RunDesign(Calculate.CmdUserModule mode, Calculate.Analysis analysis, Calculate.Design design, IEnumerable resultTypes = null, Results.UnitResults units = null, string struxmlPath = null, string docxTemplatePath = null, bool endSession = false, bool closeOpenWindows = false, Calculate.CmdGlobalCfg cmdGlobalCfg = null) + public bool RunDesign(Calculate.CmdUserModule mode, Calculate.Analysis analysis, Calculate.Design design, IEnumerable resultTypes = null, Results.UnitResults units = null, string struxmlPath = null, string docxTemplatePath = null, bool endSession = false, bool closeOpenWindows = false, Calculate.CmdGlobalCfg cmdGlobalCfg = null) { if (struxmlPath == null) { @@ -375,7 +385,7 @@ public void RunDesign(Calculate.CmdUserModule mode, Calculate.Analysis analysis, this.SerializeModel(struxmlPath); analysis.SetLoadCombinationCalculationParameters(this); - this.FdApp.RunDesign(mode.ToString(), struxmlPath, analysis, design, bscPath, docxTemplatePath, endSession, closeOpenWindows, cmdGlobalCfg); + return this.FdApp.RunDesign(mode.ToString(), struxmlPath, analysis, design, bscPath, docxTemplatePath, endSession, closeOpenWindows, cmdGlobalCfg); } /// @@ -1082,6 +1092,7 @@ private bool DiaphragmInModel(ModellingTools.Diaphragm obj) /// Add Load to Model. /// /// PointLoad, LineLoad, PressureLoad, SurfaceLoad + /// private void AddLoad(object obj, bool overwrite) { if (obj == null) @@ -1547,29 +1558,32 @@ public void AddLoadCases(List loadCases, bool overwrite = true) /// /// Add LoadCase to Model. /// - private void AddLoadCase(Loads.LoadCase obj, bool overwrite) + private void AddLoadCase(Loads.LoadCase loadCase, bool overwrite) { + if (loadCase is null) + throw new ArgumentNullException("loadCase"); + // in model? - bool inModel = this.LoadCaseInModel(obj); + bool inModel = this.LoadCaseInModel(loadCase); // in model, don't overwrite? if (inModel && !overwrite) { - throw new System.ArgumentException($"{obj.GetType().FullName} with guid: {obj.Guid} has already been added to model. Are you adding the same element twice?"); + throw new System.ArgumentException($"{loadCase.GetType().FullName} with guid: {loadCase.Guid} has already been added to model. Are you adding the same element twice?"); } // in model, overwrite else if (inModel && overwrite) { - this.Entities.Loads.LoadCases.RemoveAll(x => x.Guid == obj.Guid); + this.Entities.Loads.LoadCases.RemoveAll(x => x.Guid == loadCase.Guid); } // add load case - if (this.LoadCaseNameTaken(obj)) + if (this.LoadCaseNameTaken(loadCase)) { - obj.Name = obj.Name + " (1)"; + loadCase.Name = loadCase.Name + " (1)"; } - this.Entities.Loads.LoadCases.Add(obj); + this.Entities.Loads.LoadCases.Add(loadCase); } /// @@ -1659,29 +1673,32 @@ public void AddLoadGroupTable(List generalLoadGroup /// /// Add LoadCombination to Model. /// - private void AddLoadCombination(Loads.LoadCombination obj, bool overwrite) + private void AddLoadCombination(Loads.LoadCombination loadCombination, bool overwrite) { + if (loadCombination is null) + throw new ArgumentNullException("loadCombination"); + // in model? - bool inModel = this.LoadCombinationInModel(obj); + bool inModel = this.LoadCombinationInModel(loadCombination); // in model, don't overwrite if (inModel && !overwrite) { - throw new System.ArgumentException($"{obj.GetType().FullName} with guid: {obj.Guid} has already been added to model. Are you adding the same element twice?"); + throw new System.ArgumentException($"{loadCombination.GetType().FullName} with guid: {loadCombination.Guid} has already been added to model. Are you adding the same element twice?"); } // in model, overwrite else if (inModel && overwrite) { - this.Entities.Loads.LoadCombinations.RemoveAll(x => x.Guid == obj.Guid); + this.Entities.Loads.LoadCombinations.RemoveAll(x => x.Guid == loadCombination.Guid); } // add load combination - if (this.LoadCombinationNameTaken(obj)) + if (this.LoadCombinationNameTaken(loadCombination)) { - obj.Name = obj.Name + " (1)"; + loadCombination.Name = loadCombination.Name + " (1)"; } - this.Entities.Loads.LoadCombinations.Add(obj); + this.Entities.Loads.LoadCombinations.Add(loadCombination); } /// @@ -1868,6 +1885,7 @@ private bool PredefRigidityInModel(Releases.RigidityDataLibType3 obj) /// Add StructureGrid (axis or storey) to model. /// /// Axis, Storey + /// private void AddStructureGrid(object obj, bool overwrite) { if (obj == null) @@ -1892,6 +1910,7 @@ private void AddStructureGrid(object obj, bool overwrite) /// Add axis to entities. /// /// Axis. + /// private void AddAxis(StructureGrid.Axis obj, bool overwrite) { // check if axes in entities @@ -1940,6 +1959,7 @@ private bool AxisInModel(StructureGrid.Axis obj) /// Add Storey to Model. /// /// Storey. + /// private void AddStorey(StructureGrid.Storey obj, bool overwrite) { // check if storeys in entities @@ -2064,6 +2084,7 @@ private bool BarReinforcementInModel(Reinforcement.BarReinforcement obj) /// Add SurfaceReinforcement(s) from Slab to Model. /// /// + /// private void AddSurfaceReinforcements(Shells.Slab obj, bool overwrite) { foreach (Reinforcement.SurfaceReinforcement surfaceReinforcement in obj.SurfaceReinforcement) @@ -2166,6 +2187,7 @@ private bool SurfaceReinforcementParametersInModel(Reinforcement.SurfaceReinforc /// Add Support to Model /// /// PointSupport, LineSupport or SurfaceSupport + /// private void AddSupport(ISupportElement obj, bool overwrite) { if (obj == null) @@ -2420,6 +2442,48 @@ private void AddSurfaceSupportLibItem(Releases.RigidityDataLibType1 obj, bool ov this.SurfaceSupportTypes.PredefinedTypes.Add(obj); } + + /// + /// Add SurfaceSupport to Model. + /// + private void AddStiffnessPoint(Supports.StiffnessPoint obj, bool overwrite) + { + // in model? + bool inModel = this.StiffnessPointInModel(obj); + + // in model, don't overwrite + if (inModel && !overwrite) + { + throw new System.ArgumentException($"{obj.GetType().FullName} with guid: {obj.Guid} has already been added to model. Are you adding the same element twice?"); + } + + // in model, overwrite + else if (inModel && overwrite) + { + this.Entities.Supports.StiffnessPoint.RemoveAll(x => x.Guid == obj.Guid); + } + + // add obj + this.Entities.Supports.StiffnessPoint.Add(obj); + } + + + /// + /// Check if StiffnessPoint in Model. + /// + private bool StiffnessPointInModel(Supports.StiffnessPoint obj) + { + foreach (Supports.StiffnessPoint elem in this.Entities.Supports.StiffnessPoint) + { + if (elem.Guid == obj.Guid) + { + return true; + } + } + return false; + } + + /// /// Add Material to Model. /// @@ -2797,6 +2861,8 @@ public Model AddElements(IEnumerable elements, bool overwrite = true) wher } catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException exeption) { + if (item == null) + throw new ArgumentNullException("Can not add null element to model.", exeption); throw new System.NotImplementedException($"Class Model don't have a method AddEntity that accepts {item.GetType()}. ", exeption); } } @@ -2819,7 +2885,16 @@ public Model AddLoads(IEnumerable elements, bool overwrite = true) where T foreach (var item in elements) { - AddEntity(item as dynamic, overwrite); + try + { + AddEntity(item as dynamic, overwrite); + } + catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException exeption) + { + if (item == null) + throw new ArgumentNullException("Can not add null load to model.", exeption); + throw new System.NotImplementedException($"Class Model don't have a method AddEntity that accepts {item.GetType()}. ", exeption); + } } return this; @@ -2842,7 +2917,16 @@ public Model AddSupports(IEnumerable elements, bool overwrite = true) wher foreach (var item in elements) { - AddEntity(item as dynamic, overwrite); + try + { + AddEntity(item as dynamic, overwrite); + } + catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException exeption) + { + if (item == null) + throw new ArgumentNullException("Can not add null support to model.", exeption); + throw new System.NotImplementedException($"Class Model don't have a method AddEntity that accepts {item.GetType()}. ", exeption); + } } return this; @@ -2868,6 +2952,7 @@ public Model AddSupports(IEnumerable elements, bool overwrite = true) wher private void AddEntity(Supports.PointSupport obj, bool overwrite) => AddPointSupport(obj, overwrite); private void AddEntity(Supports.LineSupport obj, bool overwrite) => AddLineSupport(obj, overwrite); private void AddEntity(Supports.SurfaceSupport obj, bool overwrite) => AddSurfaceSupport(obj, overwrite); + private void AddEntity(Supports.StiffnessPoint obj, bool overwrite) => AddStiffnessPoint(obj, overwrite); private void AddEntity(StructureGrid.Axis axis, bool overwrite) => AddAxis(axis, overwrite); private void AddEntity(StructureGrid.Storey storey, bool overwrite) => AddStorey(storey, overwrite); @@ -3355,7 +3440,9 @@ internal void GetConstructionStages() { i++; // Starts at 1 stage.Id = i; - stage.Elements = elementsPerStage[i]; + + if (elementsPerStage.ContainsKey(i)) + stage.Elements = elementsPerStage[i]; if (stage.ActivatedLoadCases != null) { @@ -3372,6 +3459,27 @@ internal void GetConstructionStages() } } } + internal void GetLoadCombinations() + { + var loadCasesMap = this.Entities.Loads.LoadCases?.ToDictionary(lc => lc.Guid); + var stageMap = this.ConstructionStages?.Stages?.ToDictionary(s => s.Id); + + foreach (var lComb in this.Entities.Loads.LoadCombinations) + { + foreach (Loads.ModelLoadCase mLoadCase in lComb.ModelLoadCase) + { + if (mLoadCase.IsMovingLoadLoadCase) + continue; + + mLoadCase.LoadCase = loadCasesMap[mLoadCase.Guid].DeepClone(); + } + + if (lComb.StageLoadCase != null && lComb.StageLoadCase.IsFinalStage == false) + { + lComb.StageLoadCase.Stage = stageMap[lComb.StageLoadCase.StageIndex].DeepClone(); + } + } + } #endregion } } diff --git a/FemDesign.Core/ModellingTools/ConnectedLines.cs b/FemDesign.Core/ModellingTools/ConnectedLines.cs index 082978dda..905ea5c6d 100644 --- a/FemDesign.Core/ModellingTools/ConnectedLines.cs +++ b/FemDesign.Core/ModellingTools/ConnectedLines.cs @@ -6,10 +6,11 @@ namespace FemDesign.ModellingTools { [System.Serializable] - public partial class ConnectedLines: EntityBase, IStructureElement + public partial class ConnectedLines: NamedEntityBase, IStructureElement { [XmlIgnore] - private static int _instance = 0; + private static int _connectedLineInstances = 0; + protected override int GetUniqueInstanceCount() => ++_connectedLineInstances; [XmlElement("edge" , Order = 1)] public Geometry.Edge[] Edges { get; set; } @@ -58,23 +59,6 @@ public Releases.RigidityDataLibType3 PredefRigidity [XmlElement("ref", Order = 7)] public GuidListType[] References { get; set; } - - [XmlAttribute("name")] - public string _name; - - [XmlIgnore] - public string Name - { - get - { - return this._name; - } - set - { - _instance++; - this._name = $"{RestrictedString.Length(value, 50)}.{_instance.ToString()}"; - } - } [XmlAttribute("moving_local")] public bool MovingLocal { get; set; } @@ -131,7 +115,7 @@ public ConnectedLines(Geometry.Edge firstEdge, Geometry.Edge secondEdge, Geometr this.LocalY = localY; this.Rigidity = rigidity; this.References = references; - this.Name = identifier; + this.Identifier = identifier; this.MovingLocal = movingLocal; this.InterfaceStart = interfaceStart; this.InterfaceEnd = interfaceEnd; diff --git a/FemDesign.Core/ModellingTools/ConnectedPoints.cs b/FemDesign.Core/ModellingTools/ConnectedPoints.cs index ea1f4afb3..c20b139b6 100644 --- a/FemDesign.Core/ModellingTools/ConnectedPoints.cs +++ b/FemDesign.Core/ModellingTools/ConnectedPoints.cs @@ -9,10 +9,11 @@ namespace FemDesign.ModellingTools { [System.Serializable] - public partial class ConnectedPoints : EntityBase, IStructureElement + public partial class ConnectedPoints : NamedEntityBase, IStructureElement { [XmlIgnore] - private static int _instance = 0; + private static int _connectedPointInstances = 0; + protected override int GetUniqueInstanceCount() => ++_connectedPointInstances; [XmlElement("point", Order = 1)] public Point3d[] _points; @@ -74,23 +75,6 @@ public RigidityDataLibType2 PredefRigidity [XmlElement("ref", Order = 6)] public GuidListType[] References { get; set; } - [XmlAttribute("name")] - public string _name; - - [XmlIgnore] - public string Name - { - get - { - return this._name; - } - set - { - _instance++; - this._name = $"{RestrictedString.Length(value, 50)}.{_instance.ToString()}"; - } - } - [XmlAttribute("interface")] public double _interface; @@ -179,7 +163,7 @@ private void Initialize(Point3d firstPoint, Point3d secondPoint, RigidityDataTyp this.LocalY = Vector3d.UnitY; this.Rigidity = rigidity; this.References = references; - this.Name = identifier; + this.Identifier = identifier; } } } diff --git a/FemDesign.Core/ModellingTools/Diaphragm.cs b/FemDesign.Core/ModellingTools/Diaphragm.cs index cb4b5ef40..3beafa501 100644 --- a/FemDesign.Core/ModellingTools/Diaphragm.cs +++ b/FemDesign.Core/ModellingTools/Diaphragm.cs @@ -4,10 +4,11 @@ namespace FemDesign.ModellingTools { [System.Serializable] - public partial class Diaphragm: EntityBase, IStructureElement, IStageElement + public partial class Diaphragm: NamedEntityBase, IStructureElement, IStageElement { [XmlIgnore] - private static int _instance = 0; + private static int _diaphragmInstances = 0; + protected override int GetUniqueInstanceCount() => ++_diaphragmInstances; [XmlElement("region", Order = 1)] public Geometry.Region Region { get; set; } @@ -18,20 +19,6 @@ public partial class Diaphragm: EntityBase, IStructureElement, IStageElement [XmlAttribute("stage")] public int StageId { get; set; } = 1; - [XmlIgnore] - public string Name - { - get - { - return this._name; - } - set - { - Diaphragm._instance++; - this._name = $"{RestrictedString.Length(value, 50)}.{_instance}"; - } - } - private Diaphragm() { @@ -44,7 +31,7 @@ public Diaphragm(Geometry.Region region, string identifier) // add properties this.Region = region; - this.Name = identifier; + this.Identifier = identifier; } } } diff --git a/FemDesign.Core/ModellingTools/FictitiousBar.cs b/FemDesign.Core/ModellingTools/FictitiousBar.cs index ee5f5baa5..83b04f5a6 100644 --- a/FemDesign.Core/ModellingTools/FictitiousBar.cs +++ b/FemDesign.Core/ModellingTools/FictitiousBar.cs @@ -7,10 +7,11 @@ namespace FemDesign.ModellingTools { [System.Serializable] - public partial class FictitiousBar: EntityBase, IStructureElement + public partial class FictitiousBar: NamedEntityBase, IStructureElement { [XmlIgnore] - private static int Instance = 0; + private static int _ficticiousBarInstances = 0; + protected override int GetUniqueInstanceCount() => ++_ficticiousBarInstances; [XmlElement("edge", Order = 1)] public Geometry.Edge Edge { get; set; } @@ -113,23 +114,6 @@ public Bars.Connectivity EndConnectivity } } - [XmlAttribute("name")] - public string _name; - - [XmlIgnore] - public string Name - { - get - { - return this._name; - } - set - { - FictitiousBar.Instance++; - this._name = RestrictedString.Length(value, 40) + "." + FictitiousBar.Instance.ToString(); - } - } - [XmlAttribute("AE")] public double _ae; @@ -205,14 +189,14 @@ private FictitiousBar() /// /// Internal constructor. /// - public FictitiousBar(Geometry.Edge edge, Geometry.Vector3d localY, Bars.Connectivity startConnectivity, Bars.Connectivity endConnectivity, string name, double ae, double itg, double i1e, double i2e) + public FictitiousBar(Geometry.Edge edge, Geometry.Vector3d localY, Bars.Connectivity startConnectivity, Bars.Connectivity endConnectivity, string identifier, double ae, double itg, double i1e, double i2e) { this.EntityCreated(); this.Edge = edge; this.LocalY = localY; this.StartConnectivity = startConnectivity; this.EndConnectivity = endConnectivity; - this.Name = name; + this.Identifier = identifier; this.AE = ae; this.ItG = itg; this.I1E = i1e; @@ -221,7 +205,7 @@ public FictitiousBar(Geometry.Edge edge, Geometry.Vector3d localY, Bars.Connecti /// /// Orient this object's coordinate system to GCS. - /// + /// public void OrientCoordinateSystemToGCS() { var cs = this.CoordinateSystem; diff --git a/FemDesign.Core/ModellingTools/FictitiousShell.cs b/FemDesign.Core/ModellingTools/FictitiousShell.cs index 67cd1f1a8..b54026674 100644 --- a/FemDesign.Core/ModellingTools/FictitiousShell.cs +++ b/FemDesign.Core/ModellingTools/FictitiousShell.cs @@ -6,11 +6,13 @@ namespace FemDesign.ModellingTools { [System.Serializable] - public partial class FictitiousShell: EntityBase, IStructureElement + public partial class FictitiousShell: NamedEntityBase, IStructureElement { [XmlIgnore] - private static int Instance = 0; + private static int _ficticiousShellInstances = 0; + protected override int GetUniqueInstanceCount() => ++_ficticiousShellInstances; + [XmlIgnore] private Geometry.CoordinateSystem _coordinateSystem; @@ -128,26 +130,6 @@ public Geometry.Vector3d LocalZ [XmlElement("shear_stiffness", Order=7)] public StiffnessMatrix2Type ShearStiffness { get; set; } - /// - /// Identifier. Default FS. - /// - [XmlAttribute("name")] - public string _name; - - [XmlIgnore] - public string Name - { - get - { - return this._name; - } - set - { - FictitiousShell.Instance++; - this._name = RestrictedString.Length(value, 40) + "." + FictitiousShell.Instance.ToString(); - } - } - /// /// Density in t/m2 /// @@ -285,6 +267,7 @@ private FictitiousShell() /// /// /// + /// public FictitiousShell(Geometry.Region region, StiffnessMatrix4Type membraneStiffness, StiffnessMatrix4Type flexuralStiffness, StiffnessMatrix2Type shearStiffness, double density, double t1, double t2, double alpha1, double alpha2, bool ignoreInStImpCalc, double meshSize, string identifier) { this.EntityCreated(); @@ -300,7 +283,7 @@ public FictitiousShell(Geometry.Region region, StiffnessMatrix4Type membraneStif this.Alpha2 = alpha2; this.IgnoreInStImpCalculation = ignoreInStImpCalc; this.MeshSize = meshSize; - this.Name = identifier; + this.Identifier = identifier; } /// diff --git a/FemDesign.Core/ModellingTools/SurfaceConnection.cs b/FemDesign.Core/ModellingTools/SurfaceConnection.cs index 3574ff2f7..0d0b892bc 100644 --- a/FemDesign.Core/ModellingTools/SurfaceConnection.cs +++ b/FemDesign.Core/ModellingTools/SurfaceConnection.cs @@ -6,10 +6,11 @@ namespace FemDesign.ModellingTools { [System.Serializable] - public partial class SurfaceConnection: EntityBase, IStructureElement + public partial class SurfaceConnection: NamedEntityBase, IStructureElement { [XmlIgnore] - private static int _instance = 0; + private static int _surfaceConnectionInstances = 0; + protected override int GetUniqueInstanceCount() => ++_surfaceConnectionInstances; [XmlElement("region", Order = 1)] public Geometry.Region Region { get; set; } @@ -46,23 +47,6 @@ public Releases.RigidityDataLibType1 PredefRigidity [XmlElement("local_system", Order = 5)] public Geometry.CoordinateSystem CoordinateSystem { get; set; } - [XmlAttribute("name")] - public string _name; - - [XmlIgnore] - public string Name - { - get - { - return this._name; - } - set - { - _instance++; - this._name = $"{RestrictedString.Length(value, 50)}.{_instance.ToString()}"; - } - } - [XmlAttribute("distance")] public double _distance; diff --git a/FemDesign.Core/Properties/GlobalAssemblyInfo.cs b/FemDesign.Core/Properties/GlobalAssemblyInfo.cs index 205c3c20a..06c6720ff 100644 --- a/FemDesign.Core/Properties/GlobalAssemblyInfo.cs +++ b/FemDesign.Core/Properties/GlobalAssemblyInfo.cs @@ -23,5 +23,5 @@ // Revision // -[assembly: AssemblyVersion("21.4.0.0")] -[assembly: AssemblyFileVersion("21.4.0.0")] +[assembly: AssemblyVersion("21.5.0.0")] +[assembly: AssemblyFileVersion("21.5.0.0")] diff --git a/FemDesign.Core/Reinforcement/HiddenBar.cs b/FemDesign.Core/Reinforcement/HiddenBar.cs index 156f20451..6cd7a122a 100644 --- a/FemDesign.Core/Reinforcement/HiddenBar.cs +++ b/FemDesign.Core/Reinforcement/HiddenBar.cs @@ -6,10 +6,11 @@ namespace FemDesign.Reinforcement { [System.Serializable] - public partial class HiddenBar: EntityBase, IStructureElement + public partial class HiddenBar: NamedEntityBase, IStructureElement { - private static int _instance = 0; + private static int _hiddenBarInstances = 0; + protected override int GetUniqueInstanceCount() => ++_hiddenBarInstances; [XmlElement("rectangle", Order = 1)] public Geometry.RectangleType Rectangle { get; set; } @@ -20,23 +21,6 @@ public partial class HiddenBar: EntityBase, IStructureElement [XmlElement("end", Order = 3)] public string End = ""; - [XmlAttribute("name")] - public string _name; - - [XmlIgnore] - public string Name - { - get - { - return this._name; - } - set - { - HiddenBar._instance++; - this._name = RestrictedString.Length(value, 50) + HiddenBar._instance.ToString(); - } - } - [XmlAttribute("base_shell")] public Guid BaseShell { get; set; } } diff --git a/FemDesign.Core/Reinforcement/LongitudinalBar.cs b/FemDesign.Core/Reinforcement/LongitudinalBar.cs index 7a27c091c..34edd0260 100644 --- a/FemDesign.Core/Reinforcement/LongitudinalBar.cs +++ b/FemDesign.Core/Reinforcement/LongitudinalBar.cs @@ -36,8 +36,12 @@ public LongitudinalBar() /// /// Construct longitudinal bar using start and end distance from bar start /// + /// /// Start anchorage in meters. /// End anchorage in meters. + /// + /// + /// public LongitudinalBar(Geometry.Point2d position, double startAnchorage, double endAnchorage, double start, double end, bool auxiliary) { this.Position2d = position; @@ -50,8 +54,13 @@ public LongitudinalBar(Geometry.Point2d position, double startAnchorage, double /// /// Construct longitudinal bar using start and end param from bar start /// + /// + /// /// Start anchorage in meters. /// End anchorage in meters. + /// + /// + /// public LongitudinalBar(Bars.Bar bar, Geometry.Point2d position, double startAnchorage, double endAnchorage, double startParam, double endParam, bool auxiliary) { this.Position2d = position; diff --git a/FemDesign.Core/Reinforcement/Ptc.cs b/FemDesign.Core/Reinforcement/Ptc.cs index fd7d78e0a..1ad7c3b1f 100644 --- a/FemDesign.Core/Reinforcement/Ptc.cs +++ b/FemDesign.Core/Reinforcement/Ptc.cs @@ -409,6 +409,8 @@ private Ptc() /// /// /// + /// + /// /// /// public Ptc(Bars.Bar bar, PtcShapeType shape, PtcLosses losses, PtcManufacturingType manufacturing, PtcStrandLibType strand, JackingSide jackingSide, double jackingStress, int numberOfStrands = 3, string identifier = "PTC") @@ -431,6 +433,8 @@ public Ptc(Bars.Bar bar, PtcShapeType shape, PtcLosses losses, PtcManufacturingT /// /// /// + /// + /// /// /// public Ptc(Shells.Slab slab, Geometry.LineSegment line, PtcShapeType shape, PtcLosses losses, PtcManufacturingType manufacturing, PtcStrandLibType strand, JackingSide jackingSide, double jackingStress, int numberOfStrands = 3, string identifier = "PTC") @@ -483,6 +487,7 @@ private PtcStrandLibType() /// /// Create a custom PTC-strand. /// + /// /// f pk [N/mm2] /// A p [mm2] /// E p [N/mm2] diff --git a/FemDesign.Core/Releases/RigidityDataType0.cs b/FemDesign.Core/Releases/RigidityDataType0.cs new file mode 100644 index 000000000..479558dd3 --- /dev/null +++ b/FemDesign.Core/Releases/RigidityDataType0.cs @@ -0,0 +1,44 @@ +// https://strusoft.com/ + +using System.Xml.Serialization; + + +namespace FemDesign.Releases +{ + /// + /// rigidity_data_type1 + /// + [System.Serializable] + public partial class RigidityDataType0 + { + [XmlElement("motions", Order = 1)] + public Releases.Motions Motions { get; set; } + [XmlElement("plastic_limit_forces", Order = 2)] + public Releases.MotionsPlasticLimits PlasticLimitForces { get; set; } + + /// + /// Parameterless constructor for serialization + /// + public RigidityDataType0() + { + + } + + /// + /// Construct RigidityDataType1 with motions only + /// + public RigidityDataType0(Motions motions) + { + this.Motions = motions; + } + + /// + /// Construct RigidityDataType1 with motions and plastic limits forces only + /// + public RigidityDataType0(Motions motions, MotionsPlasticLimits motionsPlasticLimits) + { + this.Motions = motions; + this.PlasticLimitForces = motionsPlasticLimits; + } + } +} \ No newline at end of file diff --git a/FemDesign.Core/Sections/Section.cs b/FemDesign.Core/Sections/Section.cs index 2a2c78f4f..8341010c5 100644 --- a/FemDesign.Core/Sections/Section.cs +++ b/FemDesign.Core/Sections/Section.cs @@ -87,7 +87,7 @@ internal string _sectionName /// /// Parameterless constructor for serialization - /// + /// private Section() { @@ -95,7 +95,8 @@ private Section() /// /// Construct a new section - /// + /// + [Obsolete("Consider use the other constructor. 'Name' shouldn't be set.")] public Section(Geometry.RegionGroup regionGroup, string name, string type, Materials.MaterialTypeEnum materialTypeEnum, string groupName, string typeName, string sizeName) { this.EntityCreated(); @@ -109,6 +110,22 @@ public Section(Geometry.RegionGroup regionGroup, string name, string type, Mater this._end = ""; } + /// + /// Construct a new section + /// + public Section(Geometry.RegionGroup regionGroup, string type, Materials.MaterialTypeEnum materialTypeEnum, string groupName, string typeName, string sizeName) + { + this.EntityCreated(); + this.RegionGroup = regionGroup; + this.Name = $"{groupName}, {typeName}, {sizeName}"; + this.Type = type; + this.MaterialType = ((int)materialTypeEnum).ToString(); + this.GroupName = groupName; + this.TypeName = typeName; + this.SizeName = sizeName; + this._end = ""; + } + [XmlIgnore] public string MaterialFamily @@ -141,7 +158,7 @@ public static Section GetSectionByNameOrIndex(List
sections, dynamic se } catch (Exception ex) { - throw new Exception($"{sectionInput} does not exist!"); + throw new Exception($"{sectionInput} does not exist!", ex); } } else @@ -152,7 +169,7 @@ public static Section GetSectionByNameOrIndex(List
sections, dynamic se } catch (Exception ex) { - throw new System.Exception($"Materials List only contains {sections.Count} item. {sectionInput} is out of range!"); + throw new System.Exception($"Materials List only contains {sections.Count} item. {sectionInput} is out of range!", ex); } } return section; diff --git a/FemDesign.Core/Shells/Panel.cs b/FemDesign.Core/Shells/Panel.cs index 28b36f742..9935e4dfd 100644 --- a/FemDesign.Core/Shells/Panel.cs +++ b/FemDesign.Core/Shells/Panel.cs @@ -11,12 +11,13 @@ namespace FemDesign.Shells /// panel_type ///
[System.Serializable] - public partial class Panel: EntityBase, IStructureElement, IStageElement + public partial class Panel: NamedEntityBase, IStructureElement, IStageElement { /// /// Panel instance counter /// - private static int _instance = 0; + private static int _panelInstances = 0; + protected override int GetUniqueInstanceCount() => ++_panelInstances; /// /// Coordinate system @@ -252,31 +253,6 @@ public Sections.Section Section return this._section; } } - [XmlAttribute("name")] - public string _name; // identifier - [XmlIgnore] - public string Instance - { - get - { - var found = this.Name.IndexOf("."); - return this.Name.Substring(found + 1); - } - } - [XmlIgnore] - public string Name - { - get - { - return this._name; - } - set - { - Panel._instance++; - this._name = RestrictedString.Length(value, 50) + "." + Panel._instance.ToString(); - } - } - public string Identifier => this.Name.Split('.')[0]; [XmlAttribute("panelname")] public string PanelName { get; set; } @@ -347,6 +323,26 @@ public double UniformAvgMeshSize [XmlAttribute("stage")] public int StageId { get; set; } = 1; + + [XmlAttribute("ignored_distance")] + public double _ignoredDistance = 0.02; + + [XmlIgnore] + public double IgnoredDistance + { + get + { + return this._ignoredDistance; + } + set + { + this._ignoredDistance = RestrictedDouble.NonNegMax_1000(value); + } + } + + [XmlAttribute("ignored_in_stability")] + public bool IgnoredInStability { get; set; } = false; + /// /// Set external edge connections (i.e. set edge connections around region). /// When this is performed for panels the external rigidity is changed accordingly. @@ -434,18 +430,18 @@ private Panel() /// Construct standard panel with "Continuous" analytical model. /// /// Region of shell containing panels. - /// Direction of panels. /// - /// Default value for shell border EdgeConnections. Can be overwritten by EdgeConnection for each specific edge in Region. /// Type of panel. - /// Guid reference to material. - /// Guid reference to complex section. /// Name of shell. /// Name of panel. /// Gap between panels. /// Orthotropy. /// ShellEccentricity. /// EdgeConnection LCS changes along edge? + /// + /// + /// + /// internal Panel(Geometry.Region region, Geometry.Point3d anchorPoint, InternalPanels internalPanels, EdgeConnection externalEdgeConnection, PanelType type, Materials.Material material, Sections.Section section, string identifier, string panelName, double gap, double orthotropy, ShellEccentricity ecc, bool externalMovingLocal) { this.EntityCreated(); @@ -464,7 +460,7 @@ internal Panel(Geometry.Region region, Geometry.Point3d anchorPoint, InternalPan this.Type = type; this.Material = material; // note that material and section are not added directly to complexMaterial and complexSection fields. this.Section = section; - this.Name = identifier; + this.Identifier = identifier; this.PanelName = panelName; this.Gap = gap; this.Orthotropy = orthotropy; @@ -490,6 +486,7 @@ internal Panel(Geometry.Region region, Geometry.Point3d anchorPoint, InternalPan /// Orthotropy. /// ShellEccentricity. /// EdgeConnection LCS changes along edge? + /// internal Panel(Geometry.Region region, Geometry.Point3d anchorPoint, InternalPanels internalPanels, Materials.TimberPanelType timberApplicationData, EdgeConnection externalEdgeConnection, PanelType type, string identifier, string panelName, double gap, double orthotropy, ShellEccentricity ecc, bool externalMovingLocal, double panelWidth) { this.EntityCreated(); @@ -508,7 +505,7 @@ internal Panel(Geometry.Region region, Geometry.Point3d anchorPoint, InternalPan // attributes this.Type = type; - this.Name = identifier; + this.Identifier = identifier; this.PanelName = panelName; this.Gap = gap; this.Alignment = ecc.Alignment; diff --git a/FemDesign.Core/Shells/ShellEccentricity.cs b/FemDesign.Core/Shells/ShellEccentricity.cs index d16eb8cee..29e68a1d0 100644 --- a/FemDesign.Core/Shells/ShellEccentricity.cs +++ b/FemDesign.Core/Shells/ShellEccentricity.cs @@ -6,7 +6,6 @@ namespace FemDesign.Shells { public partial class ShellEccentricity { - private string _alignment; // ver_align public VerticalAlignment Alignment { get; set; } private double _eccentricity; // align_offset // abs_max_1e20 public double Eccentricity diff --git a/FemDesign.Core/Shells/Slab.cs b/FemDesign.Core/Shells/Slab.cs index b13ca3bbd..aa3470f9e 100644 --- a/FemDesign.Core/Shells/Slab.cs +++ b/FemDesign.Core/Shells/Slab.cs @@ -12,29 +12,31 @@ namespace FemDesign.Shells /// slab_type /// [System.Serializable] - public partial class Slab : EntityBase, IStructureElement, IStageElement + public partial class Slab : EntityBase, INamedEntity, IStructureElement, IStageElement { - private static int _plateInstance = 0; - private static int _wallInstance = 0; + public string Name => this.SlabPart.Name.Substring(0, this.SlabPart.Name.Length - 2); // Remove trailing ".1" from barpart name + public int Instance => this.SlabPart.Instance; + + [XmlIgnore] + public string Identifier + { + get => this.SlabPart.Identifier; + set => this.SlabPart.Identifier = value; + } + [XmlIgnore] + public bool LockedIdentifier + { + get => this.SlabPart.LockedIdentifier; + set => this.SlabPart.LockedIdentifier = value; + } + [XmlIgnore] public Materials.Material Material { get; set; } [XmlIgnore] public Reinforcement.SurfaceReinforcementParameters SurfaceReinforcementParameters { get; set; } [XmlIgnore] public List SurfaceReinforcement = new List(); - [XmlAttribute("name")] - public string Name { get; set; } // identifier - [XmlIgnore] - public string Instance - { - get - { - var found = this.Name.IndexOf("."); - return this.Name.Substring(found + 1); - } - } - public string Identifier => this.Name.Split('.')[0]; [XmlAttribute("type")] public SlabType Type { get; set; } @@ -71,32 +73,30 @@ private Slab() /// /// Construct Slab. /// - private Slab(SlabType type, string name, SlabPart slabPart, Materials.Material material) + private Slab(SlabType type, string identifier, SlabPart slabPart, Materials.Material material) { this.EntityCreated(); - this.Name = name; - this.Type = type; this.SlabPart = slabPart; + this.Identifier = identifier; + this.Type = type; this.Material = material; this.End = ""; } public static Slab Plate(string identifier, Materials.Material material, Geometry.Region region, EdgeConnection shellEdgeConnection, ShellEccentricity eccentricity, ShellOrthotropy orthotropy, List thickness) { - Slab._plateInstance++; SlabType type = SlabType.Plate; - string name = identifier + "." + Slab._plateInstance.ToString() + ".1"; - SlabPart slabPart = SlabPart.Define(name, region, thickness, material, shellEdgeConnection, eccentricity, orthotropy); - name = identifier + "." + Slab._plateInstance.ToString(); - Slab shell = new Slab(type, name, slabPart, material); + SlabPart slabPart = SlabPart.Define(type, identifier, region, thickness, material, shellEdgeConnection, eccentricity, orthotropy); + Slab shell = new Slab(type, identifier, slabPart, material); return shell; } /// /// Construct a rectangular slab in the XY plane /// - /// - /// + /// + /// + /// /// /// /// @@ -104,20 +104,17 @@ public static Slab Plate(string identifier, Materials.Material material, Geometr /// /// /// - public static Slab Plate(double width, double height, double thickness, Materials.Material material, EdgeConnection shellEdgeConnection = null, ShellEccentricity eccentricity = null, ShellOrthotropy orthotropy = null, string identifier = "Plate") + public static Slab Plate(Geometry.Point3d corner, double widthX, double widthY, double thickness, Materials.Material material, EdgeConnection shellEdgeConnection = null, ShellEccentricity eccentricity = null, ShellOrthotropy orthotropy = null, string identifier = "Plate") { - Slab._plateInstance++; SlabType type = SlabType.Plate; - string name = identifier + "." + Slab._wallInstance.ToString() + ".1"; - var region = Geometry.Region.RectangleXY(width, height); + var region = Geometry.Region.RectangleXY(corner, widthX, widthY); List thicknessObj = new List(); thicknessObj.Add(new FemDesign.Shells.Thickness(region.CoordinateSystem.Origin, thickness)); - SlabPart slabPart = SlabPart.Define(name, region, thicknessObj, material, shellEdgeConnection, eccentricity, orthotropy); - name = identifier + "." + Slab._plateInstance.ToString(); + SlabPart slabPart = SlabPart.Define(type, identifier, region, thicknessObj, material, shellEdgeConnection, eccentricity, orthotropy); - Slab shell = new Slab(type, name, slabPart, material); + Slab shell = new Slab(type, identifier, slabPart, material); return shell; } @@ -136,14 +133,12 @@ public static Slab Plate(double width, double height, double thickness, Material /// public static Slab Wall(Geometry.Point3d point0, Geometry.Point3d point1, double height, double thickness, Materials.Material material, EdgeConnection shellEdgeConnection = null, ShellEccentricity eccentricity = null, ShellOrthotropy orthotropy = null, string identifier = "Wall") { - Slab._plateInstance++; SlabType type = SlabType.Wall; - string name = identifier + "." + Slab._wallInstance.ToString() + ".1"; var translation = new Geometry.Vector3d(0, 0, height); var point2 = point1 + translation; var point3 = point0 + translation; - var points = new List() { point0, point1, point2, point3}; + var points = new List() { point0, point1, point2, point3 }; var fdCoordinate = new Geometry.CoordinateSystem(point0, point1, point3); @@ -153,10 +148,9 @@ public static Slab Wall(Geometry.Point3d point0, Geometry.Point3d point1, double List thicknessObj = new List(); thicknessObj.Add(new FemDesign.Shells.Thickness(region.CoordinateSystem.Origin, thickness)); - SlabPart slabPart = SlabPart.Define(name, region, thicknessObj, material, shellEdgeConnection, eccentricity, orthotropy); - name = identifier + "." + Slab._plateInstance.ToString(); + SlabPart slabPart = SlabPart.Define(type, identifier, region, thicknessObj, material, shellEdgeConnection, eccentricity, orthotropy); - Slab shell = new Slab(type, name, slabPart, material); + Slab shell = new Slab(type, identifier, slabPart, material); return shell; } @@ -176,9 +170,7 @@ public static Slab Wall(Geometry.Point3d point0, Geometry.Point3d point1, double /// public static Slab FromFourPoints(Geometry.Point3d point0, Geometry.Point3d point1, Geometry.Point3d point2, Geometry.Point3d point3, double thickness, Materials.Material material, EdgeConnection shellEdgeConnection = null, ShellEccentricity eccentricity = null, ShellOrthotropy orthotropy = null, string identifier = "Plate") { - Slab._plateInstance++; SlabType type = SlabType.Plate; - string name = identifier + "." + Slab._wallInstance.ToString() + ".1"; var points = new List() { point0, point1, point2, point3 }; var fdCoordinate = new Geometry.CoordinateSystem(point0, point1, point3); @@ -187,10 +179,9 @@ public static Slab FromFourPoints(Geometry.Point3d point0, Geometry.Point3d poin List thicknessObj = new List(); thicknessObj.Add(new FemDesign.Shells.Thickness(region.CoordinateSystem.Origin, thickness)); - SlabPart slabPart = SlabPart.Define(name, region, thicknessObj, material, shellEdgeConnection, eccentricity, orthotropy); - name = identifier + "." + Slab._plateInstance.ToString(); + SlabPart slabPart = SlabPart.Define(type, identifier, region, thicknessObj, material, shellEdgeConnection, eccentricity, orthotropy); - Slab shell = new Slab(type, name, slabPart, material); + Slab shell = new Slab(type, identifier, slabPart, material); return shell; } @@ -203,41 +194,10 @@ public static Slab Wall(string identifier, Materials.Material material, Geometry throw new System.ArgumentException("Wall is not vertical! Create plate instead."); } - Slab._wallInstance++; - SlabType type = SlabType.Wall; - string name = identifier + "." + Slab._wallInstance.ToString() + ".1"; - SlabPart slabPart = SlabPart.Define(name, region, thickness, material, shellEdgeConnection, eccentricity, orthotropy); - name = identifier + "." + Slab._plateInstance.ToString(); - - Slab shell = new Slab(type, name, slabPart, material); - return shell; - } - /// - /// Construct a Wall Element in XZ plane - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - public static Slab Wall(double width, double height, double thickness, Materials.Material material, EdgeConnection shellEdgeConnection = null, ShellEccentricity eccentricity = null, ShellOrthotropy orthotropy = null, string identifier = "Wall") - { - Slab._wallInstance++; SlabType type = SlabType.Wall; - string name = identifier + "." + Slab._wallInstance.ToString() + ".1"; - var region = Geometry.Region.RectangleXZ(width, height); - - List thicknessObj = new List(); - thicknessObj.Add(new FemDesign.Shells.Thickness(region.CoordinateSystem.Origin, thickness)); - - SlabPart slabPart = SlabPart.Define(name, region, thicknessObj, material, shellEdgeConnection, eccentricity, orthotropy); - name = identifier + "." + Slab._plateInstance.ToString(); + SlabPart slabPart = SlabPart.Define(type, identifier, region, thickness, material, shellEdgeConnection, eccentricity, orthotropy); - Slab shell = new Slab(type, name, slabPart, material); + Slab shell = new Slab(type, identifier, slabPart, material); return shell; } diff --git a/FemDesign.Core/Shells/SlabPart.cs b/FemDesign.Core/Shells/SlabPart.cs index 52b12dc00..21f26a54e 100644 --- a/FemDesign.Core/Shells/SlabPart.cs +++ b/FemDesign.Core/Shells/SlabPart.cs @@ -11,8 +11,26 @@ namespace FemDesign.Shells /// slab_part_type ///
[System.Serializable] - public partial class SlabPart: EntityBase - { + public partial class SlabPart: NamedEntityPartBase + { + private static int _plateInstance = 0; + private static int _wallInstance = 0; + protected override int GetUniqueInstanceCount() + { + switch (this.SlabType) + { + case SlabType.Plate: + return ++_plateInstance; + case SlabType.Wall: + return ++_wallInstance; + default: + throw new ArgumentException($"Incorrect type of slab: {this.SlabType}"); + } + } + + [XmlIgnore] + public SlabType SlabType; + /// /// Get ShellEccentricity /// @@ -37,20 +55,6 @@ public ShellOrthotropy ShellOrthotropy } } - [XmlAttribute("name")] - public string Name {get; set;} // identifier - [XmlIgnore] - public string Instance - { - get - { - var found = this.Name.IndexOf("."); - return this.Name.Substring(found + 1); - } - } - public string Identifier => this.Name.Split('.')[0]; - - [XmlAttribute("complex_material")] public System.Guid ComplexMaterialGuid {get; set;} // guidtype @@ -194,7 +198,11 @@ public Geometry.Vector3d LocalZ } } } - [XmlElement("end", Order = 6)] + + [XmlElement(ElementName = "stiffness_modifiers", Order = 6)] + public SlabStiffnessFactors SlabStiffnessFactors { get; set; } + + [XmlElement("end", Order = 7)] public string End {get; set;} // empty_type /// @@ -208,10 +216,11 @@ private SlabPart() /// /// Construct SlabPart. /// - public SlabPart(string name, Geometry.Region region, List thickness, Materials.Material complexMaterial, ShellEccentricity alignment, ShellOrthotropy orthotropy) + public SlabPart(SlabType type, string identifier, Geometry.Region region, List thickness, Materials.Material complexMaterial, ShellEccentricity alignment, ShellOrthotropy orthotropy) { this.EntityCreated(); - this.Name = name; + this.SlabType = type; + this.Identifier = identifier; this.Region = region; this.ComplexMaterialGuid = complexMaterial.Guid; this.ComplexMaterial = complexMaterial; @@ -231,7 +240,7 @@ public SlabPart(string name, Geometry.Region region, List thickness, /// /// Construct SlabPart with EdgeConnections. /// - public static SlabPart Define(string name, Geometry.Region region, List thickness, Materials.Material material, EdgeConnection shellEdgeConnection = null, ShellEccentricity eccentricity = null, ShellOrthotropy orthotropy = null) + public static SlabPart Define(SlabType type, string identifier, Geometry.Region region, List thickness, Materials.Material material, EdgeConnection shellEdgeConnection = null, ShellEccentricity eccentricity = null, ShellOrthotropy orthotropy = null) { shellEdgeConnection = shellEdgeConnection ?? EdgeConnection.Default; eccentricity = eccentricity ?? ShellEccentricity.Default; @@ -241,7 +250,7 @@ public static SlabPart Define(string name, Geometry.Region region, List StiffnessModifiers { get; set; } + } +} diff --git a/FemDesign.Core/Stage/ActivatedLoadCase.cs b/FemDesign.Core/Stage/ActivatedLoadCase.cs index f7b5bf573..a30540e10 100644 --- a/FemDesign.Core/Stage/ActivatedLoadCase.cs +++ b/FemDesign.Core/Stage/ActivatedLoadCase.cs @@ -6,6 +6,8 @@ using System.Threading.Tasks; using System.Text.RegularExpressions; +using FemDesign.GenericClasses; + namespace FemDesign { public enum PTCLoadCase @@ -69,12 +71,12 @@ private ActivatedLoadCase() /// /// The load case to be activated. /// Load case factor. - /// Activation type. - public ActivatedLoadCase(Loads.LoadCase loadCase, double factor, ActivationType type) + /// Partitioning. + public ActivatedLoadCase(Loads.LoadCase loadCase, double factor, ActivationType partitioning) { this.LoadCaseDisplayName = loadCase.Name; this._case = loadCase.Guid.ToString(); - Initialize(factor, type); + Initialize(factor, partitioning); } /// @@ -127,21 +129,25 @@ public enum ActivationType /// /// Only in this stage /// + [Parseable("only_in_this_stage", "0", "OnlyInThisStage")] [XmlEnum("only_in_this_stage")] OnlyInThisStage, /// /// From this stage on /// + [Parseable("from_this_stage_on", "1", "FromThisStageOn")] [XmlEnum("from_this_stage_on")] FromThisStageOn, /// /// Shifted from first stage /// + [Parseable("shifted_from_first_stage", "2", "ShiftedFromFirstStage")] [XmlEnum("shifted_from_first_stage")] ShiftedFromFirstStage, /// /// Only stage activated elements /// + [Parseable("only_stage_activated_elem", "3", "OnlyStageActivatedElements")] [XmlEnum("only_stage_activated_elem")] OnlyStageActivatedElements } diff --git a/FemDesign.Core/Stage/Stage.cs b/FemDesign.Core/Stage/Stage.cs index 85973662f..83d81d806 100644 --- a/FemDesign.Core/Stage/Stage.cs +++ b/FemDesign.Core/Stage/Stage.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using FemDesign.GenericClasses; +using FemDesign.Loads; namespace FemDesign { @@ -35,7 +36,38 @@ private Stage() } - public Stage(int index, string description, List activatedLoadCases, List elements, bool initialStressState = false) + /// + /// Construction stage. + /// + /// + /// Stage description (name). + /// LoadCases with factor and partitioning for when to be activated. + /// Elements to be activated in this stage. + /// Initial stress state. + public Stage(int index, string description, List activatedLoadCases = null, List elements = null, bool initialStressState = false) + { + Initialize(index, description, activatedLoadCases, elements, initialStressState); + } + + /// + /// Construction stage. + /// + /// + /// Stage description (name). + /// LoadCases to be activated (with factor 1.0). + /// Elements to be activated in this stage. + /// Partitioning for when to activate load cases. + /// Initial stress state. +#if ISDYNAMO // Dynamo may not have any default enum arguments in any constructor in any imported C# libraries it seems like + public Stage(int index, string description, List loadCases, List elements, ActivationType partitioning, bool initialStressState = false) +#else + public Stage(int index, string description, List loadCases, List elements, ActivationType partitioning = ActivationType.OnlyInThisStage, bool initialStressState = false) +#endif + { + var activatedLoadCase = loadCases.Select(l => new ActivatedLoadCase(l, 1.0, partitioning)).ToList(); + Initialize(index, description, activatedLoadCase, elements, initialStressState); + } + private void Initialize(int index, string description, List activatedLoadCases, List elements, bool initialStressState) { if (index <= 0) { @@ -48,6 +80,34 @@ public Stage(int index, string description, List activatedLoa this.InitialStressState = initialStressState; } + /// + /// Add element to construction stage. + /// + /// Element to be activated in this stage. + public void AddElement(IStageElement element) + { + this.Elements.Add(element); + } + + /// + /// Adds a (construction stage) activated load case. + /// + /// The load case to be activated. + /// Load case factor. + /// Partitioning. + public void AddLoadCase(LoadCase loadCase, double factor, ActivationType partitioning) + { + AddLoadCase(new ActivatedLoadCase(loadCase, factor, partitioning)); + } + + /// + /// Adds a (construction stage) activated load case. + /// + public void AddLoadCase(ActivatedLoadCase activatedLoadCase) + { + this.ActivatedLoadCases.Add(activatedLoadCase); + } + public override string ToString() { return $"Stage {this.Description}"; diff --git a/FemDesign.Core/Supports/Group.cs b/FemDesign.Core/Supports/Group.cs index 1ef05ac8e..c68100cd6 100644 --- a/FemDesign.Core/Supports/Group.cs +++ b/FemDesign.Core/Supports/Group.cs @@ -151,7 +151,7 @@ public Group(Geometry.Vector3d localX, Geometry.Vector3d localY, Motions motions /// /// Orient this object's coordinate system to GCS - /// + /// public void OrientCoordinateSystemToGCS() { var cs = this.CoordinateSystem; diff --git a/FemDesign.Core/Supports/LineSupport.cs b/FemDesign.Core/Supports/LineSupport.cs index 2c0d960b5..380e23e28 100644 --- a/FemDesign.Core/Supports/LineSupport.cs +++ b/FemDesign.Core/Supports/LineSupport.cs @@ -12,21 +12,9 @@ namespace FemDesign.Supports /// line_support_type /// [System.Serializable] - public partial class LineSupport: EntityBase, IStructureElement, ISupportElement, IStageElement + public partial class LineSupport: NamedEntityBase, IStructureElement, ISupportElement, IStageElement { - // serialization properties - [XmlAttribute("name")] - public string Name { get; set; } // identifier. - [XmlIgnore] - public string Instance - { - get - { - var found = this.Name.IndexOf("."); - return this.Name.Substring(found + 1); - } - } - public string Identifier => this.Name.Split('.')[0]; + protected override int GetUniqueInstanceCount() => ++PointSupport._instance; // PointSupport and LineSupport share the same instance counter. [XmlAttribute("moving_local")] public bool MovingLocal { get; set; } // bool @@ -143,9 +131,8 @@ public LineSupport(Edge edge, Motions motions, MotionsPlasticLimits motionsPlast private void Initialize(Edge edge, Group group, bool movingLocal, string identifier) { - PointSupport._instance++; // PointSupport and LineSupport share the same instance counter. this.EntityCreated(); - this.Name = identifier + "." + PointSupport._instance.ToString(); + this.Identifier = identifier; this.MovingLocal = movingLocal; // set edge specific properties diff --git a/FemDesign.Core/Supports/PointSupport.cs b/FemDesign.Core/Supports/PointSupport.cs index 7fb4abefc..c308f2120 100644 --- a/FemDesign.Core/Supports/PointSupport.cs +++ b/FemDesign.Core/Supports/PointSupport.cs @@ -11,23 +11,11 @@ namespace FemDesign.Supports /// point_support_type /// [System.Serializable] - public partial class PointSupport : EntityBase, IStructureElement, ISupportElement, IStageElement + public partial class PointSupport : NamedEntityBase, IStructureElement, ISupportElement, IStageElement { [XmlIgnore] - public static int _instance = 0; // used for PointSupports and LineSupports - [XmlAttribute("name")] - public string Name { get; set; } // identifier - [XmlIgnore] - public string Instance - { - get - { - var found = this.Name.IndexOf("."); - return this.Name.Substring(found + 1); - } - } - public string Identifier => this.Name.Split('.')[0]; - + internal static int _instance = 0; // Shared instance counter for both PointSupport and LineSupport + protected override int GetUniqueInstanceCount() => ++_instance; [XmlAttribute("stage")] public int StageId { get; set; } = 1; @@ -99,10 +87,10 @@ public PointSupport(CoordinateSystem plane, Motions motions, Rotations rotations /// /// Create a Point Support oriented along the Global Axis X and Y. /// - /// - /// - /// - /// + /// Position of the support. + /// Motions stiffnessess. + /// Rotation stiffnessess. + /// Name. public PointSupport(Point3d point, Motions motions, Rotations rotations, string identifier = "S") { var group = new Group(Vector3d.UnitX, Vector3d.UnitY, motions, rotations); @@ -112,7 +100,7 @@ public PointSupport(Point3d point, Motions motions, Rotations rotations, string /// /// PointSupport at point with rigidity (motions, rotations) and plastic limits (forces, moments). Group aligned with global coordinate system. /// - /// Position of the support. + /// Position (and orientation) of the support. /// Motions stiffnessess. /// Motions plastic limit forces. /// Rotation stiffnessess. @@ -120,7 +108,7 @@ public PointSupport(Point3d point, Motions motions, Rotations rotations, string /// Name. public PointSupport(CoordinateSystem plane, Motions motions, MotionsPlasticLimits motionsPlasticLimits, Rotations rotations, RotationsPlasticLimits rotationsPlasticLimits, string identifier = "S") { - var group = new Group(Vector3d.UnitX, Vector3d.UnitY, motions, motionsPlasticLimits, rotations, rotationsPlasticLimits); + var group = new Group(plane.LocalX, plane.LocalY, motions, motionsPlasticLimits, rotations, rotationsPlasticLimits); Initialize(plane, group, identifier); } @@ -154,9 +142,8 @@ public PointSupport(CoordinateSystem plane, bool tx, bool ty, bool tz, bool rx, private void Initialize(CoordinateSystem point, Group group, string identifier) { - PointSupport._instance++; this.EntityCreated(); - this.Name = $"{identifier}.{_instance}"; + this.Identifier = identifier; this.Group = group; this.Position = point; } diff --git a/FemDesign.Core/Supports/StiffnessPoints.cs b/FemDesign.Core/Supports/StiffnessPoints.cs new file mode 100644 index 000000000..a2af17926 --- /dev/null +++ b/FemDesign.Core/Supports/StiffnessPoints.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using System.Xml.Serialization; +using FemDesign; +using FemDesign.GenericClasses; +using FemDesign.Releases; + +namespace FemDesign.Supports +{ + public partial class StiffnessPoint : EntityBase, IStructureElement, ISupportElement + { + [XmlIgnore] + public FemDesign.Geometry.Point3d Point { get; set; } + + [XmlAttribute("x")] + public double X; + + [XmlAttribute("y")] + public double Y; + + [XmlAttribute("z")] + public double Z; + + [XmlAttribute("name")] + public string Name { get; set; } + + [XmlIgnore] + public FemDesign.Supports.SurfaceSupport Surface { get; set; } + + [XmlAttribute("surface_support")] + public Guid SurfaceSupport; + + [XmlElement("rigidity")] + public RigidityDataType0 Rigidity { get; set; } + public Motions Motions { get { return Rigidity?.Motions; } } + public MotionsPlasticLimits MotionsPlasticityLimits { get { return Rigidity?.PlasticLimitForces; } } + + public StiffnessPoint() + { + } + + private void Initialise(FemDesign.Supports.SurfaceSupport surface, FemDesign.Geometry.Point3d point) + { + this.SurfaceSupport = surface.Guid; + this.X = point.X; + this.Y = point.Y; + this.Z = point.Z; + this.EntityCreated(); + } + + public StiffnessPoint(FemDesign.Supports.SurfaceSupport surface, FemDesign.Geometry.Point3d point, Motions motions, MotionsPlasticLimits MotionsPlasticityLimits = null, string name = null) + { + this.Initialise(surface, point); + this.Rigidity = new RigidityDataType0(motions, MotionsPlasticityLimits); + this.Name = name; + } + } +} \ No newline at end of file diff --git a/FemDesign.Core/Supports/Supports.cs b/FemDesign.Core/Supports/Supports.cs index c574f43d1..757c01917 100644 --- a/FemDesign.Core/Supports/Supports.cs +++ b/FemDesign.Core/Supports/Supports.cs @@ -17,6 +17,8 @@ public partial class Supports public List LineSupport = new List(); // line_support_type [XmlElement("surface_support", Order = 3)] public List SurfaceSupport = new List(); // surface_support + [XmlElement("stiffness_point", Order = 4)] + public List StiffnessPoint = new List(); // surface_support public List GetSupports() { diff --git a/FemDesign.Core/Supports/SurfaceSupport.cs b/FemDesign.Core/Supports/SurfaceSupport.cs index 56f92d744..28ffedded 100644 --- a/FemDesign.Core/Supports/SurfaceSupport.cs +++ b/FemDesign.Core/Supports/SurfaceSupport.cs @@ -8,35 +8,9 @@ namespace FemDesign.Supports { [System.Serializable] - public partial class SurfaceSupport: EntityBase, IStructureElement, ISupportElement, IStageElement + public partial class SurfaceSupport: NamedEntityBase, IStructureElement, ISupportElement, IStageElement { - [XmlAttribute("name")] - public string _name; - [XmlIgnore] - public string Name - { - get - { - return this._name; - } - set - { - PointSupport._instance++; - this._name = value + "." + PointSupport._instance.ToString(); - } - } - public string Identifier => this.Name.Split('.')[0]; - - - [XmlIgnore] - public string Instance - { - get - { - var found = this._name.IndexOf("."); - return this._name.Substring(found + 1); - } - } + protected override int GetUniqueInstanceCount() => ++PointSupport._instance; // PointSupport and SurfaceSupport share the same instance counter. [XmlAttribute("stage")] public int StageId { get; set; } = 1; @@ -109,7 +83,7 @@ public SurfaceSupport(Geometry.Region region, Motions motions, MotionsPlasticLim private void Initialize(Geometry.Region region, RigidityDataType1 rigidity, string identifier) { this.EntityCreated(); - this.Name = identifier; + this.Identifier = identifier; this.Region = region; this.Rigidity = rigidity; this.CoordinateSystem = region.CoordinateSystem; diff --git a/FemDesign.Dynamo/Dynamo/AdvancedFem/Cover.cs b/FemDesign.Dynamo/Dynamo/AdvancedFem/Cover.cs index 3ff26cf40..cd9da3372 100644 --- a/FemDesign.Dynamo/Dynamo/AdvancedFem/Cover.cs +++ b/FemDesign.Dynamo/Dynamo/AdvancedFem/Cover.cs @@ -4,7 +4,7 @@ namespace FemDesign { [IsVisibleInDynamoLibrary(false)] - public partial class Cover : EntityBase + public partial class Cover { #region dynamo @@ -24,7 +24,7 @@ public static Cover OneWayCover(Autodesk.DesignScript.Geometry.Surface surface, Geometry.Region region = Geometry.Region.FromDynamo(surface); // get loadBearingDirection - Geometry.FdVector3d _loadBearingDirection = Geometry.FdVector3d.FromDynamo(loadBearingDirection).Normalize(); + Geometry.Vector3d _loadBearingDirection = Geometry.Vector3d.FromDynamo(loadBearingDirection).Normalize(); // return return Cover.OneWayCover(region, supportingStructures, _loadBearingDirection, identifier); diff --git a/FemDesign.Dynamo/Dynamo/AuxiliaryResults/LabelledSection.cs b/FemDesign.Dynamo/Dynamo/AuxiliaryResults/LabelledSection.cs index 5da4002eb..98bf234d8 100644 --- a/FemDesign.Dynamo/Dynamo/AuxiliaryResults/LabelledSection.cs +++ b/FemDesign.Dynamo/Dynamo/AuxiliaryResults/LabelledSection.cs @@ -8,7 +8,7 @@ namespace FemDesign.AuxiliaryResults { [IsVisibleInDynamoLibrary(false)] - public partial class LabelledSection : EntityBase, IStructureElement + public partial class LabelledSection { } } \ No newline at end of file diff --git a/FemDesign.Dynamo/Dynamo/Bars/Bar.cs b/FemDesign.Dynamo/Dynamo/Bars/Bar.cs index 4e7c7c808..a37223adb 100644 --- a/FemDesign.Dynamo/Dynamo/Bars/Bar.cs +++ b/FemDesign.Dynamo/Dynamo/Bars/Bar.cs @@ -37,7 +37,7 @@ public static Bar Beam(Autodesk.DesignScript.Geometry.Curve curve, Materials.Mat // set local y-axis if (!localY.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - bar.BarPart.LocalY = FemDesign.Geometry.FdVector3d.FromDynamo(localY); + bar.BarPart.LocalY = FemDesign.Geometry.Vector3d.FromDynamo(localY); } // else orient coordinate system to GCS @@ -77,7 +77,7 @@ public static Bar Column(Autodesk.DesignScript.Geometry.Line line, Materials.Mat // set local y-axis if (!localY.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - bar.BarPart.LocalY = FemDesign.Geometry.FdVector3d.FromDynamo(localY); + bar.BarPart.LocalY = FemDesign.Geometry.Vector3d.FromDynamo(localY); } // else orient coordinate system to GCS @@ -114,7 +114,7 @@ public static Bar Truss(Autodesk.DesignScript.Geometry.Line line, Materials.Mate // set local y-axis if (!localY.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - bar.BarPart.LocalY = FemDesign.Geometry.FdVector3d.FromDynamo(localY); + bar.BarPart.LocalY = FemDesign.Geometry.Vector3d.FromDynamo(localY); } // else orient coordinate system to GCS @@ -151,8 +151,7 @@ public static Bar TrussLimitedCapacity(Autodesk.DesignScript.Geometry.Line line, Geometry.Edge edge = Geometry.Edge.FromDynamoLine(line); // create bar - var type = BarType.Truss; - Bar bar = new Bar(edge, type, material, section, identifier); + Bar bar = Bar.Truss(edge, material, section, identifier); bar.MaxCompression = maxCompression; bar.MaxTension = maxTension; bar.CompressionPlasticity = compressionPlasticity; @@ -161,7 +160,7 @@ public static Bar TrussLimitedCapacity(Autodesk.DesignScript.Geometry.Line line, // set local y-axis if (!localY.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - bar.BarPart.LocalY = FemDesign.Geometry.FdVector3d.FromDynamo(localY); + bar.BarPart.LocalY = FemDesign.Geometry.Vector3d.FromDynamo(localY); } // else orient coordinate system to GCS @@ -238,7 +237,7 @@ public static Bar Modify(Bar bar, [DefaultArgument("false")] bool newGuid, [Defa if (localY != null) { - bar.BarPart.LocalY = Geometry.FdVector3d.FromDynamo(localY); + bar.BarPart.LocalY = Geometry.Vector3d.FromDynamo(localY); } if (orientLCS) @@ -249,7 +248,6 @@ public static Bar Modify(Bar bar, [DefaultArgument("false")] bool newGuid, [Defa if (identifier != null) { bar.Identifier = identifier; - bar.BarPart.Identifier = bar.Identifier; } return bar; diff --git a/FemDesign.Dynamo/Dynamo/Bars/BarPart.cs b/FemDesign.Dynamo/Dynamo/Bars/BarPart.cs index ce4e9e52f..0a76af5db 100644 --- a/FemDesign.Dynamo/Dynamo/Bars/BarPart.cs +++ b/FemDesign.Dynamo/Dynamo/Bars/BarPart.cs @@ -10,7 +10,7 @@ namespace FemDesign.Bars { [IsVisibleInDynamoLibrary(false)] - public partial class BarPart: EntityBase + public partial class BarPart: NamedEntityPartBase { } diff --git a/FemDesign.Dynamo/Dynamo/Bars/ColumnCorbel.cs b/FemDesign.Dynamo/Dynamo/Bars/ColumnCorbel.cs index c63098588..35d4bd23e 100644 --- a/FemDesign.Dynamo/Dynamo/Bars/ColumnCorbel.cs +++ b/FemDesign.Dynamo/Dynamo/Bars/ColumnCorbel.cs @@ -8,7 +8,7 @@ namespace FemDesign.Bars { [IsVisibleInDynamoLibrary(false)] - public partial class ColumnCorbel: EntityBase + public partial class ColumnCorbel { } diff --git a/FemDesign.Dynamo/Dynamo/Bars/Connectivity.cs b/FemDesign.Dynamo/Dynamo/Bars/Connectivity.cs index 3fb59b186..981baa362 100644 --- a/FemDesign.Dynamo/Dynamo/Bars/Connectivity.cs +++ b/FemDesign.Dynamo/Dynamo/Bars/Connectivity.cs @@ -9,13 +9,6 @@ namespace FemDesign.Bars [IsVisibleInDynamoLibrary(false)] public partial class Connectivity { - /// - /// Define default (rigid) releases for a bar-element. - /// - /// - [IsVisibleInDynamoLibrary(false)] - public static Connectivity Default() => GetDefault(); - /// /// Define releases for a bar-element. /// @@ -94,18 +87,18 @@ public static Connectivity SemiRigid([DefaultArgument("true")] System.Object mx, ///
/// Create [IsVisibleInDynamoLibrary(true)] - public static Connectivity Hinged() + public static Connectivity GetHinged() { - return GetHinged(); + return Connectivity.Hinged; } /// /// Define rigid releases for a bar-element. /// /// Create [IsVisibleInDynamoLibrary(true)] - public static Connectivity Rigid() + public static Connectivity GetRigid() { - return GetRigid(); + return Connectivity.Rigid; } } } \ No newline at end of file diff --git a/FemDesign.Dynamo/Dynamo/Bars/Eccentricity.cs b/FemDesign.Dynamo/Dynamo/Bars/Eccentricity.cs index 9290e0904..d59bcd989 100644 --- a/FemDesign.Dynamo/Dynamo/Bars/Eccentricity.cs +++ b/FemDesign.Dynamo/Dynamo/Bars/Eccentricity.cs @@ -22,13 +22,5 @@ public static Eccentricity Define(double y = 0, double z = 0) { return new Eccentricity(y, z); } - - /// - /// Create a default eccentricity, i.e. no ecceentricity (y=z=0). - /// - /// Create - /// - [IsVisibleInDynamoLibrary(false)] - public static Eccentricity Default() => GetDefault(); } } \ No newline at end of file diff --git a/FemDesign.Dynamo/Dynamo/Calculate/Application.cs b/FemDesign.Dynamo/Dynamo/Calculate/Application.cs index 943e38c3b..e3c417365 100644 --- a/FemDesign.Dynamo/Dynamo/Calculate/Application.cs +++ b/FemDesign.Dynamo/Dynamo/Calculate/Application.cs @@ -26,7 +26,7 @@ public partial class Application /// Bool. True if session has exited. False if session is still open or was closed manually. [IsVisibleInDynamoLibrary(true)] [MultiReturn(new[] { "FdModel", "FdFeaModel", "Results", "HasExited" })] - public static Dictionary RunAnalysis(Model fdModel, string struxmlPath, Calculate.Analysis analysis, [DefaultArgument("[]")] List resultTypes, [DefaultArgument("[]")] Results.UnitResults units, string docxTemplatePath = "", bool endSession = true, bool closeOpenWindows = false, bool runNode = true) + public static Dictionary RunAnalysis(Model fdModel, string struxmlPath, Calculate.Analysis analysis, [DefaultArgument("[]")] List resultTypes, [DefaultArgument("[]")] Results.UnitResults units, string docxTemplatePath = "", bool endSession = true, bool closeOpenWindows = false, bool runNode = true) { if (!runNode) { @@ -38,12 +38,12 @@ public static Dictionary RunAnalysis(Model fdModel, string strux units = Results.UnitResults.Default(); // It needs to check if model has been runned // Always Return the FeaNode Result - resultTypes.Insert(0, Results.ResultType.FeaNode); - resultTypes.Insert(1, Results.ResultType.FeaBar); - resultTypes.Insert(1, Results.ResultType.FeaShell); + resultTypes.Insert(0, typeof(Results.FeaNode)); + resultTypes.Insert(1, typeof(Results.FeaBar)); + resultTypes.Insert(2, typeof(Results.FeaShell)); // Create Bsc files from resultTypes - var listProcs = resultTypes.Select(r => Results.ResultAttributeExtentions.ListProcs[r]); + //var listProcs = resultTypes.Select(r => Results.ResultAttributeExtentions.ListProcs[r]); var bscPathsFromResultTypes = Calculate.Bsc.BscPathFromResultTypes(resultTypes, struxmlPath, units); var rtn = fdModel.FdApp.RunAnalysis(struxmlPath, analysis, bscPathsFromResultTypes, docxTemplatePath, endSession, closeOpenWindows); diff --git a/FemDesign.Dynamo/Dynamo/Calculate/LoadCombination.cs b/FemDesign.Dynamo/Dynamo/Calculate/LoadCombination.cs index 68e3c757b..3e68e5491 100644 --- a/FemDesign.Dynamo/Dynamo/Calculate/LoadCombination.cs +++ b/FemDesign.Dynamo/Dynamo/Calculate/LoadCombination.cs @@ -25,7 +25,7 @@ public partial class LoadCombination /// Ground water level /// [IsVisibleInDynamoLibrary(true)] - public static Loads.LoadCombination SetupCalculation(Loads.LoadCombination loadCombination, int ImpfRqd = 0, int StabRqd = 0, bool NLE = false, bool PL = false, bool NLS = false, bool Cr = false, bool f2nd = false, bool Im = false, int Waterlevel = 0) + public static Loads.LoadCombination SetupCalculation(Loads.LoadCombination loadCombination, int ImpfRqd = 0, int StabRqd = 0, bool NLE = false, bool PL = false, bool NLS = false, bool Cr = false, bool f2nd = false, int Im = 0, int Waterlevel = 0) { loadCombination.CombItem = new Calculate.CombItem(ImpfRqd, StabRqd, NLE, PL, NLS, Cr, f2nd, Im, Waterlevel); return loadCombination; diff --git a/FemDesign.Dynamo/Dynamo/Calculate/Stage.cs b/FemDesign.Dynamo/Dynamo/Calculate/Stage.cs index 6a3f4887e..78e0e8528 100644 --- a/FemDesign.Dynamo/Dynamo/Calculate/Stage.cs +++ b/FemDesign.Dynamo/Dynamo/Calculate/Stage.cs @@ -1,8 +1,13 @@ using System; using System.Xml.Serialization; +#region dynamo +using Autodesk.DesignScript.Runtime; +#endregion + namespace FemDesign.Calculate { + [IsVisibleInDynamoLibrary(false)] public partial class Stage { diff --git a/FemDesign.Dynamo/Dynamo/Deconstruct/Deconstruct.cs b/FemDesign.Dynamo/Dynamo/Deconstruct/Deconstruct.cs index f4090aec9..5896b9c78 100644 --- a/FemDesign.Dynamo/Dynamo/Deconstruct/Deconstruct.cs +++ b/FemDesign.Dynamo/Dynamo/Deconstruct/Deconstruct.cs @@ -88,7 +88,7 @@ public static Dictionary FictitiousBarDeconstruct(FemDesign.Mode return new Dictionary { {"Guid", fictitiousBar.Guid}, - {"AnalyticalID", fictitiousBar.Identifier}, + {"AnalyticalID", fictitiousBar.Name}, {"Curve", fictitiousBar.Edge.ToDynamo()}, {"AE", fictitiousBar.AE}, {"ItG", fictitiousBar.ItG}, @@ -112,7 +112,7 @@ public static Dictionary CoverDeconstruct(FemDesign.Cover cover) return new Dictionary { {"Guid", cover.Guid}, - {"Id", cover.Identifier}, + {"Id", cover.Name}, {"Surface", cover.GetDynamoSurface()}, {"Contours", cover.GetDynamoCurves()} }; @@ -369,7 +369,7 @@ public static Dictionary LoadCaseDeconstruct(FemDesign.Loads.Loa return new Dictionary { {"Guid", loadCase.Guid.ToString()}, - {"Name", loadCase.Identifier}, + {"Name", loadCase.Name}, {"Type", loadCase.Type.ToString()}, {"DurationClass", loadCase.DurationClass.ToString()} }; @@ -387,7 +387,7 @@ public static Dictionary LoadCombinationDeconstruct(FemDesign.Lo return new Dictionary { {"Guid", loadCombination.Guid}, - {"Name", loadCombination.Identifier}, + {"Name", loadCombination.Name}, {"Type", loadCombination.Type.ToString()}, {"LoadCases", loadCombination.GetLoadCaseGuidsAsString()}, {"Gammas", loadCombination.GetGammas()} @@ -415,7 +415,7 @@ public static Dictionary MaterialDeconstruct(FemDesign.Materials {"Guid", material.Guid}, {"Standard", standard}, {"Country", country}, - {"Name", material.Identifier} + {"Name", material.Name} }; } @@ -538,7 +538,7 @@ public static Dictionary StoreyDeconstruct(FemDesign.StructureGr {"Direction", storey.Direction.ToDynamo()}, {"DimensionX", storey.DimensionX}, {"DimensionY", storey.DimensionY}, - {"Name", storey.Identifier} + {"Name", storey.Name} }; } @@ -599,7 +599,7 @@ public static Dictionary FictitiousShellDeconstruct(FemDesign.Mo return new Dictionary { {"Guid", fictitiousShell.Guid}, - {"AnalyticalId", fictitiousShell.Identifier}, + {"AnalyticalId", fictitiousShell.Name}, {"Surface", fictitiousShell.Region.ToDynamoSurface()}, {"MembraneStiffness", fictitiousShell.MembraneStiffness}, {"FlexuralStiffness", fictitiousShell.FlexuralStiffness}, @@ -630,7 +630,7 @@ public static Dictionary DiaphragmDeconstruct(FemDesign.Modellin { {"Guid", diaphragm.Guid}, {"Surface", diaphragm.Region.ToDynamoSurface()}, - {"Identifier", diaphragm.Identifier} + {"Identifier", diaphragm.Name} }; } @@ -671,7 +671,7 @@ public static Dictionary SectionDeconstruct(FemDesign.Sections.S return new Dictionary { {"Guid", section.Guid}, - {"Name", section.Identifier}, + {"Name", section.Name}, {"Surfaces", section.RegionGroup.ToDynamo()}, {"SectionType", section.Type}, {"MaterialType", section.MaterialType}, @@ -710,7 +710,7 @@ public static Dictionary EdgeConnectionDeconstruct(FemDesign.She return new Dictionary { {"Guid", shellEdgeConnection.Guid}, - {"AnalyticalID", shellEdgeConnection.Identifier}, + {"AnalyticalID", shellEdgeConnection.Name}, {"PredefinedName", null}, {"PredefinedGuid", null}, {"Friction", null}, @@ -723,7 +723,7 @@ public static Dictionary EdgeConnectionDeconstruct(FemDesign.She return new Dictionary { {"Guid", shellEdgeConnection.Guid}, - {"AnalyticalID", shellEdgeConnection.Identifier}, + {"AnalyticalID", shellEdgeConnection.Name}, {"PredefinedName", null}, {"PredefinedGuid", null}, {"Friction", shellEdgeConnection.Rigidity.Friction}, @@ -736,8 +736,8 @@ public static Dictionary EdgeConnectionDeconstruct(FemDesign.She return new Dictionary { {"Guid", shellEdgeConnection.Guid}, - {"AnalyticalID", shellEdgeConnection.Identifier}, - {"PredefinedName", shellEdgeConnection.PredefRigidity.Identifier}, + {"AnalyticalID", shellEdgeConnection.Name}, + {"PredefinedName", shellEdgeConnection.PredefRigidity.Name}, {"PredefinedGuid", shellEdgeConnection.PredefRigidity.Guid}, {"Friction", null}, {"Motions", shellEdgeConnection.PredefRigidity.Rigidity.Motions}, @@ -749,8 +749,8 @@ public static Dictionary EdgeConnectionDeconstruct(FemDesign.She return new Dictionary { {"Guid", shellEdgeConnection.Guid}, - {"AnalyticalID", shellEdgeConnection.Identifier}, - {"PredefinedName", shellEdgeConnection.PredefRigidity.Identifier}, + {"AnalyticalID", shellEdgeConnection.Name}, + {"PredefinedName", shellEdgeConnection.PredefRigidity.Name}, {"PredefinedGuid", shellEdgeConnection.PredefRigidity.Guid}, {"Friction", shellEdgeConnection.PredefRigidity.Rigidity.Friction}, {"Motions", shellEdgeConnection.PredefRigidity.Rigidity.Motions}, diff --git a/FemDesign.Dynamo/Dynamo/GenericClasses/LocationValue.cs b/FemDesign.Dynamo/Dynamo/GenericClasses/LocationValue.cs index 04c4ef3e4..7d96dc426 100644 --- a/FemDesign.Dynamo/Dynamo/GenericClasses/LocationValue.cs +++ b/FemDesign.Dynamo/Dynamo/GenericClasses/LocationValue.cs @@ -7,7 +7,7 @@ namespace FemDesign { [IsVisibleInDynamoLibrary(false)] - public partial class LocationValue: Geometry.FdPoint3d + public partial class LocationValue: Geometry.Point3d { } diff --git a/FemDesign.Dynamo/Dynamo/GenericClasses/NamedEntityBase.cs b/FemDesign.Dynamo/Dynamo/GenericClasses/NamedEntityBase.cs new file mode 100644 index 000000000..a8b16f31a --- /dev/null +++ b/FemDesign.Dynamo/Dynamo/GenericClasses/NamedEntityBase.cs @@ -0,0 +1,20 @@ +using System.Xml.Serialization; + +#region dynamo +using Autodesk.DesignScript.Runtime; +#endregion + +namespace FemDesign +{ + [IsVisibleInDynamoLibrary(false)] + public partial class NamedEntityBase + { + + } + + [IsVisibleInDynamoLibrary(false)] + public partial class NamedEntityPartBase + { + + } +} \ No newline at end of file diff --git a/FemDesign.Dynamo/Dynamo/Geometry/FdCoordinateSystem.cs b/FemDesign.Dynamo/Dynamo/Geometry/CoordinateSystem.cs similarity index 54% rename from FemDesign.Dynamo/Dynamo/Geometry/FdCoordinateSystem.cs rename to FemDesign.Dynamo/Dynamo/Geometry/CoordinateSystem.cs index adf25dbae..558b4dc2a 100644 --- a/FemDesign.Dynamo/Dynamo/Geometry/FdCoordinateSystem.cs +++ b/FemDesign.Dynamo/Dynamo/Geometry/CoordinateSystem.cs @@ -8,20 +8,20 @@ namespace FemDesign.Geometry { [IsVisibleInDynamoLibrary(false)] - public partial class FdCoordinateSystem + public partial class CoordinateSystem { #region dynamo /// /// Create FdCoordinateSystem from Dynamo coordinate system of a Line or NurbsCurve(?). /// This method realignes the coordinate system. /// - internal static FdCoordinateSystem FromDynamoCoordinateSystemLine(Autodesk.DesignScript.Geometry.CoordinateSystem obj) + internal static CoordinateSystem FromDynamoCoordinateSystemLine(Autodesk.DesignScript.Geometry.CoordinateSystem obj) { - FdPoint3d origin = FdPoint3d.FromDynamo(obj.Origin); - FdVector3d localX = FdVector3d.FromDynamo(obj.YAxis); - FdVector3d localY = FdVector3d.FromDynamo(obj.XAxis.Reverse()); - FdVector3d localZ = localX.Cross(localY).Normalize(); - return new FdCoordinateSystem(origin, localX, localY, localZ); + Point3d origin = Point3d.FromDynamo(obj.Origin); + Vector3d localX = Vector3d.FromDynamo(obj.YAxis); + Vector3d localY = Vector3d.FromDynamo(obj.XAxis.Reverse()); + Vector3d localZ = localX.Cross(localY).Normalize(); + return new CoordinateSystem(origin, localX, localY, localZ); } /// @@ -30,32 +30,32 @@ internal static FdCoordinateSystem FromDynamoCoordinateSystemLine(Autodesk.Desig /// Dynamo Arcs and Circles follow left-hand rule. /// This method realignes the coordinate system. /// - internal static FdCoordinateSystem FromDynamoCoordinateSystemArcOrCircle(Autodesk.DesignScript.Geometry.CoordinateSystem obj) + internal static CoordinateSystem FromDynamoCoordinateSystemArcOrCircle(Autodesk.DesignScript.Geometry.CoordinateSystem obj) { - FdPoint3d origin = FdPoint3d.FromDynamo(obj.Origin); - FdVector3d localX = FdVector3d.FromDynamo(obj.YAxis); - FdVector3d localY = FdVector3d.FromDynamo(obj.XAxis); - FdVector3d localZ = localX.Cross(localY).Normalize(); - return new FdCoordinateSystem(origin, localX, localY, localZ); + Point3d origin = Point3d.FromDynamo(obj.Origin); + Vector3d localX = Vector3d.FromDynamo(obj.YAxis); + Vector3d localY = Vector3d.FromDynamo(obj.XAxis); + Vector3d localZ = localX.Cross(localY).Normalize(); + return new CoordinateSystem(origin, localX, localY, localZ); } /// /// Create FdCoordinateSystem from Dynamo coordinate system of a Surface. /// No realignment neccessary. /// - internal static FdCoordinateSystem FromDynamoCoordinateSystemSurface(Autodesk.DesignScript.Geometry.CoordinateSystem obj) + internal static CoordinateSystem FromDynamoCoordinateSystemSurface(Autodesk.DesignScript.Geometry.CoordinateSystem obj) { - FdPoint3d origin = FdPoint3d.FromDynamo(obj.Origin); - FdVector3d localX = FdVector3d.FromDynamo(obj.XAxis); - FdVector3d localY = FdVector3d.FromDynamo(obj.YAxis); - FdVector3d localZ = FdVector3d.FromDynamo(obj.ZAxis); - return new FdCoordinateSystem(origin, localX, localY, localZ); + Point3d origin = Point3d.FromDynamo(obj.Origin); + Vector3d localX = Vector3d.FromDynamo(obj.XAxis); + Vector3d localY = Vector3d.FromDynamo(obj.YAxis); + Vector3d localZ = Vector3d.FromDynamo(obj.ZAxis); + return new CoordinateSystem(origin, localX, localY, localZ); } /// /// Create FdCoordinateSystem from Dynamo coordinate system on curve mid u-point. /// - internal static FdCoordinateSystem FromDynamoCurve(Autodesk.DesignScript.Geometry.Curve obj) + internal static CoordinateSystem FromDynamoCurve(Autodesk.DesignScript.Geometry.Curve obj) { // CoordinateSystemAtParameter returns a coordinate system on curve // with origin at the point at the given parameter. @@ -67,7 +67,7 @@ internal static FdCoordinateSystem FromDynamoCurve(Autodesk.DesignScript.Geometr // Note: Arcs and Circles in Dynamo are defined with left-hand rule while coordinate system is defined by right-hand rule if (obj.GetType() == typeof(Autodesk.DesignScript.Geometry.Arc) || obj.GetType() == typeof(Autodesk.DesignScript.Geometry.Circle)) { - return FdCoordinateSystem.FromDynamoCoordinateSystemArcOrCircle(cs); + return CoordinateSystem.FromDynamoCoordinateSystemArcOrCircle(cs); } else { @@ -78,10 +78,10 @@ internal static FdCoordinateSystem FromDynamoCurve(Autodesk.DesignScript.Geometr /// /// Create FdCoordinateSystem from Dynamo coordinate system on surface mid u/v-point. /// - internal static FdCoordinateSystem FromDynamoSurface(Autodesk.DesignScript.Geometry.Surface obj) + internal static CoordinateSystem FromDynamoSurface(Autodesk.DesignScript.Geometry.Surface obj) { Autodesk.DesignScript.Geometry.CoordinateSystem cs = obj.CoordinateSystemAtParameter(0.5, 0.5); - return FdCoordinateSystem.FromDynamoCoordinateSystemSurface(cs); + return CoordinateSystem.FromDynamoCoordinateSystemSurface(cs); } #endregion diff --git a/FemDesign.Dynamo/Dynamo/Geometry/Edge.cs b/FemDesign.Dynamo/Dynamo/Geometry/Edge.cs index e494bff7a..69cc9e14c 100644 --- a/FemDesign.Dynamo/Dynamo/Geometry/Edge.cs +++ b/FemDesign.Dynamo/Dynamo/Geometry/Edge.cs @@ -129,11 +129,11 @@ public static Geometry.Edge FromDynamoArc1(Autodesk.DesignScript.Geometry.Arc ob double radius = obj.Radius; double startAngle = 0; double endAngle = startAngle + Degree.ToRadians(obj.SweepAngle); - FdPoint3d centerPoint = FdPoint3d.FromDynamo(obj.CenterPoint); - FdVector3d xAxis = new FdVector3d(centerPoint, FdPoint3d.FromDynamo(obj.StartPoint)).Normalize(); + Point3d centerPoint = Point3d.FromDynamo(obj.CenterPoint); + Vector3d xAxis = new Vector3d(centerPoint, Point3d.FromDynamo(obj.StartPoint)).Normalize(); // lcs - FdCoordinateSystem cs = FdCoordinateSystem.FromDynamoCurve(obj); + CoordinateSystem cs = CoordinateSystem.FromDynamoCurve(obj); // return return new Geometry.Edge(radius, startAngle, endAngle, centerPoint, xAxis, cs); @@ -145,12 +145,12 @@ public static Geometry.Edge FromDynamoArc1(Autodesk.DesignScript.Geometry.Arc ob ///
public static Geometry.Edge FromDynamoArc2(Autodesk.DesignScript.Geometry.Arc obj) { - FdPoint3d p0 = FdPoint3d.FromDynamo(obj.StartPoint); - FdPoint3d p1 = FdPoint3d.FromDynamo(obj.PointAtParameter(0.5)); - FdPoint3d p2 = FdPoint3d.FromDynamo(obj.EndPoint); + Point3d p0 = Point3d.FromDynamo(obj.StartPoint); + Point3d p1 = Point3d.FromDynamo(obj.PointAtParameter(0.5)); + Point3d p2 = Point3d.FromDynamo(obj.EndPoint); // lcs - FdCoordinateSystem cs = FdCoordinateSystem.FromDynamoCurve(obj); + CoordinateSystem cs = CoordinateSystem.FromDynamoCurve(obj); // return return new Geometry.Edge(p0, p1, p2, cs); @@ -162,10 +162,10 @@ public static Geometry.Edge FromDynamoArc2(Autodesk.DesignScript.Geometry.Arc ob public static Geometry.Edge FromDynamoCircle(Autodesk.DesignScript.Geometry.Circle obj) { double radius = obj.Radius; - FdPoint3d centerPoint = FdPoint3d.FromDynamo(obj.CenterPoint); + Point3d centerPoint = Point3d.FromDynamo(obj.CenterPoint); // lcs - FdCoordinateSystem cs = FdCoordinateSystem.FromDynamoCurve(obj); + CoordinateSystem cs = CoordinateSystem.FromDynamoCurve(obj); // return return new Geometry.Edge(radius, centerPoint, cs); @@ -176,11 +176,11 @@ public static Geometry.Edge FromDynamoCircle(Autodesk.DesignScript.Geometry.Circ ///
public static Geometry.Edge FromDynamoLine(Autodesk.DesignScript.Geometry.Line obj) { - FdPoint3d startPoint = FdPoint3d.FromDynamo(obj.StartPoint); - FdPoint3d endPoint = FdPoint3d.FromDynamo(obj.EndPoint); + Point3d startPoint = Point3d.FromDynamo(obj.StartPoint); + Point3d endPoint = Point3d.FromDynamo(obj.EndPoint); // lcs - FdCoordinateSystem cs = FdCoordinateSystem.FromDynamoCurve(obj); + CoordinateSystem cs = CoordinateSystem.FromDynamoCurve(obj); // return return new Geometry.Edge(startPoint, endPoint, cs); @@ -191,11 +191,11 @@ public static Geometry.Edge FromDynamoLine(Autodesk.DesignScript.Geometry.Line o ///
public static Geometry.Edge FromDynamoLinearNurbsCurve(Autodesk.DesignScript.Geometry.NurbsCurve obj) { - FdPoint3d startPoint = FdPoint3d.FromDynamo(obj.StartPoint); - FdPoint3d endPoint = FdPoint3d.FromDynamo(obj.EndPoint); + Point3d startPoint = Point3d.FromDynamo(obj.StartPoint); + Point3d endPoint = Point3d.FromDynamo(obj.EndPoint); // lcs - FdCoordinateSystem cs = FdCoordinateSystem.FromDynamoCurve(obj); + CoordinateSystem cs = CoordinateSystem.FromDynamoCurve(obj); // return return new Geometry.Edge(startPoint, endPoint, cs); diff --git a/FemDesign.Dynamo/Dynamo/Geometry/FdPoint2d.cs b/FemDesign.Dynamo/Dynamo/Geometry/Point2d.cs similarity index 84% rename from FemDesign.Dynamo/Dynamo/Geometry/FdPoint2d.cs rename to FemDesign.Dynamo/Dynamo/Geometry/Point2d.cs index f01cefa4a..2083fdd84 100644 --- a/FemDesign.Dynamo/Dynamo/Geometry/FdPoint2d.cs +++ b/FemDesign.Dynamo/Dynamo/Geometry/Point2d.cs @@ -8,7 +8,7 @@ namespace FemDesign.Geometry { [IsVisibleInDynamoLibrary(false)] - public partial class FdPoint2d + public partial class Point2d { } diff --git a/FemDesign.Dynamo/Dynamo/Geometry/FdPoint3d.cs b/FemDesign.Dynamo/Dynamo/Geometry/Point3d.cs similarity index 76% rename from FemDesign.Dynamo/Dynamo/Geometry/FdPoint3d.cs rename to FemDesign.Dynamo/Dynamo/Geometry/Point3d.cs index 0034c7184..1c1f202ea 100644 --- a/FemDesign.Dynamo/Dynamo/Geometry/FdPoint3d.cs +++ b/FemDesign.Dynamo/Dynamo/Geometry/Point3d.cs @@ -9,15 +9,15 @@ namespace FemDesign.Geometry { [IsVisibleInDynamoLibrary(false)] - public partial class FdPoint3d + public partial class Point3d { #region dynamo /// /// Create FdPoint3d from Dynamo point. /// - public static FdPoint3d FromDynamo(Autodesk.DesignScript.Geometry.Point point) + public static Point3d FromDynamo(Autodesk.DesignScript.Geometry.Point point) { - FdPoint3d newPoint = new FdPoint3d(point.X, point.Y, point.Z); + Point3d newPoint = new Point3d(point.X, point.Y, point.Z); return newPoint; } diff --git a/FemDesign.Dynamo/Dynamo/Geometry/Region.cs b/FemDesign.Dynamo/Dynamo/Geometry/Region.cs index b3e16f70c..016bea823 100644 --- a/FemDesign.Dynamo/Dynamo/Geometry/Region.cs +++ b/FemDesign.Dynamo/Dynamo/Geometry/Region.cs @@ -152,7 +152,7 @@ public static Geometry.Region FromDynamo(Autodesk.DesignScript.Geometry.Surface } // get LCS - FdCoordinateSystem cs = FdCoordinateSystem.FromDynamoSurface(obj); + CoordinateSystem cs = CoordinateSystem.FromDynamoSurface(obj); // return return new Geometry.Region(contours, cs); diff --git a/FemDesign.Dynamo/Dynamo/Geometry/FdVector2d.cs b/FemDesign.Dynamo/Dynamo/Geometry/Vector2d.cs similarity index 84% rename from FemDesign.Dynamo/Dynamo/Geometry/FdVector2d.cs rename to FemDesign.Dynamo/Dynamo/Geometry/Vector2d.cs index 1233e4e7c..4437c88b2 100644 --- a/FemDesign.Dynamo/Dynamo/Geometry/FdVector2d.cs +++ b/FemDesign.Dynamo/Dynamo/Geometry/Vector2d.cs @@ -8,7 +8,7 @@ namespace FemDesign.Geometry { [IsVisibleInDynamoLibrary(false)] - public partial class FdVector2d + public partial class Vector2d { } diff --git a/FemDesign.Dynamo/Dynamo/Geometry/FdVector3d.cs b/FemDesign.Dynamo/Dynamo/Geometry/Vector3d.cs similarity index 76% rename from FemDesign.Dynamo/Dynamo/Geometry/FdVector3d.cs rename to FemDesign.Dynamo/Dynamo/Geometry/Vector3d.cs index a53951685..889d998be 100644 --- a/FemDesign.Dynamo/Dynamo/Geometry/FdVector3d.cs +++ b/FemDesign.Dynamo/Dynamo/Geometry/Vector3d.cs @@ -9,15 +9,15 @@ namespace FemDesign.Geometry { [IsVisibleInDynamoLibrary(false)] - public partial class FdVector3d + public partial class Vector3d { #region dynamo /// /// Create FdVector3d from Dynamo vector. /// - public static FdVector3d FromDynamo(Autodesk.DesignScript.Geometry.Vector vector) + public static Vector3d FromDynamo(Autodesk.DesignScript.Geometry.Vector vector) { - FdVector3d newVector = new FdVector3d(vector.X, vector.Y, vector.Z); + Vector3d newVector = new Vector3d(vector.X, vector.Y, vector.Z); return newVector; } diff --git a/FemDesign.Dynamo/Dynamo/Loads/Footfall.cs b/FemDesign.Dynamo/Dynamo/Loads/Footfall.cs index 5138d2530..f04abc74a 100644 --- a/FemDesign.Dynamo/Dynamo/Loads/Footfall.cs +++ b/FemDesign.Dynamo/Dynamo/Loads/Footfall.cs @@ -19,7 +19,7 @@ public partial class Footfall [IsVisibleInDynamoLibrary(true)] public static Footfall FullExcitation(Autodesk.DesignScript.Geometry.Point point, string identifier = "FE", string comment = "") { - var p0 = FdPoint3d.FromDynamo(point); + var p0 = Point3d.FromDynamo(point); return new Footfall(p0, identifier, comment); } diff --git a/FemDesign.Dynamo/Dynamo/Loads/LineLoad.cs b/FemDesign.Dynamo/Dynamo/Loads/LineLoad.cs index 53229a4d2..e66566c07 100644 --- a/FemDesign.Dynamo/Dynamo/Loads/LineLoad.cs +++ b/FemDesign.Dynamo/Dynamo/Loads/LineLoad.cs @@ -24,8 +24,8 @@ public static LineLoad ForceUniform(Autodesk.DesignScript.Geometry.Curve curve, { // convert geometry Geometry.Edge edge = Geometry.Edge.FromDynamoLineOrArc1(curve); - Geometry.FdVector3d _startForce = Geometry.FdVector3d.FromDynamo(force); - Geometry.FdVector3d _endForce = _startForce; + Geometry.Vector3d _startForce = Geometry.Vector3d.FromDynamo(force); + Geometry.Vector3d _endForce = _startForce; // check zero vector if (_startForce.IsZero()) @@ -52,8 +52,8 @@ public static LineLoad Force(Autodesk.DesignScript.Geometry.Curve curve, Autodes { // convert geometry Geometry.Edge edge = Geometry.Edge.FromDynamoLineOrArc1(curve); - Geometry.FdVector3d _startForce = Geometry.FdVector3d.FromDynamo(startForce); - Geometry.FdVector3d _endForce = Geometry.FdVector3d.FromDynamo(endForce); + Geometry.Vector3d _startForce = Geometry.Vector3d.FromDynamo(startForce); + Geometry.Vector3d _endForce = Geometry.Vector3d.FromDynamo(endForce); // return new LineLoad(edge, _startForce, _endForce, loadCase, ForceLoadType.Force, comment, constLoadDir, loadProjection: false); @@ -73,8 +73,8 @@ public static LineLoad MomentUniform(Autodesk.DesignScript.Geometry.Curve curve, { // convert geometry Geometry.Edge edge = Geometry.Edge.FromDynamoLineOrArc1(curve); - Geometry.FdVector3d _startForce = Geometry.FdVector3d.FromDynamo(force); - Geometry.FdVector3d _endForce = _startForce; + Geometry.Vector3d _startForce = Geometry.Vector3d.FromDynamo(force); + Geometry.Vector3d _endForce = _startForce; // check zero vector if (_startForce.IsZero()) @@ -100,8 +100,8 @@ public static LineLoad Moment(Autodesk.DesignScript.Geometry.Curve curve, Autode { // convert geometry Geometry.Edge edge = Geometry.Edge.FromDynamoLineOrArc1(curve); - Geometry.FdVector3d _startForce = Geometry.FdVector3d.FromDynamo(startForce); - Geometry.FdVector3d _endForce = Geometry.FdVector3d.FromDynamo(endForce); + Geometry.Vector3d _startForce = Geometry.Vector3d.FromDynamo(startForce); + Geometry.Vector3d _endForce = Geometry.Vector3d.FromDynamo(endForce); return new LineLoad(edge, _startForce, _endForce, loadCase, ForceLoadType.Moment, comment, constLoadDir, loadProjection: false); } diff --git a/FemDesign.Dynamo/Dynamo/Loads/LineStressLoad.cs b/FemDesign.Dynamo/Dynamo/Loads/LineStressLoad.cs index 465b084de..465dac9c2 100644 --- a/FemDesign.Dynamo/Dynamo/Loads/LineStressLoad.cs +++ b/FemDesign.Dynamo/Dynamo/Loads/LineStressLoad.cs @@ -25,7 +25,7 @@ public static LineStressLoad Define(Autodesk.DesignScript.Geometry.Curve curve, { // convert geometry Geometry.Edge edge = Geometry.Edge.FromDynamoLineOrArc1(curve); - Geometry.FdVector3d v = Geometry.FdVector3d.FromDynamo(direction); + Geometry.Vector3d v = Geometry.Vector3d.FromDynamo(direction); // return return new LineStressLoad(edge, v, topBottomLocationValues, loadCase, comments); diff --git a/FemDesign.Dynamo/Dynamo/Loads/LineTemperatureLoad.cs b/FemDesign.Dynamo/Dynamo/Loads/LineTemperatureLoad.cs index 02fc380ef..10756f731 100644 --- a/FemDesign.Dynamo/Dynamo/Loads/LineTemperatureLoad.cs +++ b/FemDesign.Dynamo/Dynamo/Loads/LineTemperatureLoad.cs @@ -25,7 +25,7 @@ public static LineTemperatureLoad Define(Autodesk.DesignScript.Geometry.Curve cu { // convert geometry Geometry.Edge edge = Geometry.Edge.FromDynamoLineOrArc1(curve); - Geometry.FdVector3d v = Geometry.FdVector3d.FromDynamo(direction); + Geometry.Vector3d v = Geometry.Vector3d.FromDynamo(direction); // return return new LineTemperatureLoad(edge, v, topBottomLocationValues, loadCase, comments); diff --git a/FemDesign.Dynamo/Dynamo/Loads/LoadCase.cs b/FemDesign.Dynamo/Dynamo/Loads/LoadCase.cs index af2b998a9..49a4f02c3 100644 --- a/FemDesign.Dynamo/Dynamo/Loads/LoadCase.cs +++ b/FemDesign.Dynamo/Dynamo/Loads/LoadCase.cs @@ -41,7 +41,7 @@ public static LoadCase GetLoadCaseFromListByName(List loadCases, strin { foreach (LoadCase _loadCase in loadCases) { - if (_loadCase.Identifier == name) + if (_loadCase.Name == name) { return _loadCase; } diff --git a/FemDesign.Dynamo/Dynamo/Loads/LoadLocationValue.cs b/FemDesign.Dynamo/Dynamo/Loads/LoadLocationValue.cs index efe738fa0..c77cdbae4 100644 --- a/FemDesign.Dynamo/Dynamo/Loads/LoadLocationValue.cs +++ b/FemDesign.Dynamo/Dynamo/Loads/LoadLocationValue.cs @@ -18,7 +18,7 @@ public partial class LoadLocationValue: LocationValue [IsVisibleInDynamoLibrary(true)] public static LoadLocationValue Define(Autodesk.DesignScript.Geometry.Point point, double intensity) { - return new LoadLocationValue(Geometry.FdPoint3d.FromDynamo(point), intensity); + return new LoadLocationValue(Geometry.Point3d.FromDynamo(point), intensity); } #endregion diff --git a/FemDesign.Dynamo/Dynamo/Loads/PointLoad.cs b/FemDesign.Dynamo/Dynamo/Loads/PointLoad.cs index c1c4cb1d8..18bba1906 100644 --- a/FemDesign.Dynamo/Dynamo/Loads/PointLoad.cs +++ b/FemDesign.Dynamo/Dynamo/Loads/PointLoad.cs @@ -21,8 +21,8 @@ public partial class PointLoad: ForceLoadBase [IsVisibleInDynamoLibrary(true)] public static PointLoad Force(Autodesk.DesignScript.Geometry.Point point, Autodesk.DesignScript.Geometry.Vector force, LoadCase loadCase, string comment = "") { - var p0 = Geometry.FdPoint3d.FromDynamo(point); - var v0 = Geometry.FdVector3d.FromDynamo(force); + var p0 = Geometry.Point3d.FromDynamo(point); + var v0 = Geometry.Vector3d.FromDynamo(force); PointLoad pointLoad = new PointLoad(p0, v0, loadCase, comment, ForceLoadType.Force); return pointLoad; } @@ -37,8 +37,8 @@ public static PointLoad Force(Autodesk.DesignScript.Geometry.Point point, Autode [IsVisibleInDynamoLibrary(true)] public static PointLoad Moment(Autodesk.DesignScript.Geometry.Point point, Autodesk.DesignScript.Geometry.Vector moment, LoadCase loadCase, string comment = "") { - var p0 = Geometry.FdPoint3d.FromDynamo(point); - var v0 = Geometry.FdVector3d.FromDynamo(moment); + var p0 = Geometry.Point3d.FromDynamo(point); + var v0 = Geometry.Vector3d.FromDynamo(moment); PointLoad pointLoad = new PointLoad(p0, v0, loadCase, comment, ForceLoadType.Moment); return pointLoad; } diff --git a/FemDesign.Dynamo/Dynamo/Loads/PressureLoad.cs b/FemDesign.Dynamo/Dynamo/Loads/PressureLoad.cs index 1f1e48b97..af6229458 100644 --- a/FemDesign.Dynamo/Dynamo/Loads/PressureLoad.cs +++ b/FemDesign.Dynamo/Dynamo/Loads/PressureLoad.cs @@ -30,7 +30,7 @@ public static PressureLoad Define(Autodesk.DesignScript.Geometry.Surface surface Geometry.Region region = Geometry.Region.FromDynamo(surface); // normalize direction - Geometry.FdVector3d _loadDirection = Geometry.FdVector3d.FromDynamo(direction).Normalize(); + Geometry.Vector3d _loadDirection = Geometry.Vector3d.FromDynamo(direction).Normalize(); // create SurfaceLoad PressureLoad _pressureLoad = new PressureLoad(region, _loadDirection, z0, q0, qh, loadCase, comment, false, ForceLoadType.Force); diff --git a/FemDesign.Dynamo/Dynamo/Loads/SurfaceLoad.cs b/FemDesign.Dynamo/Dynamo/Loads/SurfaceLoad.cs index e4fa551cc..dd1d62b7d 100644 --- a/FemDesign.Dynamo/Dynamo/Loads/SurfaceLoad.cs +++ b/FemDesign.Dynamo/Dynamo/Loads/SurfaceLoad.cs @@ -21,7 +21,7 @@ public partial class SurfaceLoad: ForceLoadBase public static SurfaceLoad Uniform(Autodesk.DesignScript.Geometry.Surface surface, Autodesk.DesignScript.Geometry.Vector force, LoadCase loadCase, string comment = "") { Geometry.Region region = Geometry.Region.FromDynamo(surface); - Geometry.FdVector3d _force = Geometry.FdVector3d.FromDynamo(force); + Geometry.Vector3d _force = Geometry.Vector3d.FromDynamo(force); SurfaceLoad surfaceLoad = SurfaceLoad.Uniform(region, _force, loadCase, false, comment); @@ -48,7 +48,7 @@ public static SurfaceLoad Variable(Autodesk.DesignScript.Geometry.Surface surfac } Geometry.Region region = Geometry.Region.FromDynamo(surface); - Geometry.FdVector3d loadDirection = Geometry.FdVector3d.FromDynamo(direction).Normalize(); + Geometry.Vector3d loadDirection = Geometry.Vector3d.FromDynamo(direction).Normalize(); SurfaceLoad surfaceLoad = SurfaceLoad.Variable(region, loadDirection, loadLocationValue, loadCase, false, comment); return surfaceLoad; diff --git a/FemDesign.Dynamo/Dynamo/Loads/SurfaceTemperatureLoad.cs b/FemDesign.Dynamo/Dynamo/Loads/SurfaceTemperatureLoad.cs index 14301d5b6..549c66b62 100644 --- a/FemDesign.Dynamo/Dynamo/Loads/SurfaceTemperatureLoad.cs +++ b/FemDesign.Dynamo/Dynamo/Loads/SurfaceTemperatureLoad.cs @@ -25,7 +25,7 @@ public static SurfaceTemperatureLoad Define(Autodesk.DesignScript.Geometry.Surfa { // convert geometry Geometry.Region region = Geometry.Region.FromDynamo(surface); - Geometry.FdVector3d dir = Geometry.FdVector3d.FromDynamo(direction); + Geometry.Vector3d dir = Geometry.Vector3d.FromDynamo(direction); // return return new SurfaceTemperatureLoad(region, dir, tempLocValue, loadCase, comment); diff --git a/FemDesign.Dynamo/Dynamo/Loads/TopBotLocationValue.cs b/FemDesign.Dynamo/Dynamo/Loads/TopBotLocationValue.cs index a0aa7aeed..63dbd479c 100644 --- a/FemDesign.Dynamo/Dynamo/Loads/TopBotLocationValue.cs +++ b/FemDesign.Dynamo/Dynamo/Loads/TopBotLocationValue.cs @@ -7,7 +7,7 @@ namespace FemDesign.Loads { [IsVisibleInDynamoLibrary(false)] - public partial class TopBotLocationValue: Geometry.FdPoint3d + public partial class TopBotLocationValue: Geometry.Point3d { #region dynamo /// @@ -21,7 +21,7 @@ public partial class TopBotLocationValue: Geometry.FdPoint3d public static TopBotLocationValue Define(Autodesk.DesignScript.Geometry.Point point, double topVal, double bottomVal) { // convert geometry - Geometry.FdPoint3d p = Geometry.FdPoint3d.FromDynamo(point); + Geometry.Point3d p = Geometry.Point3d.FromDynamo(point); return new TopBotLocationValue(p, topVal, bottomVal); } diff --git a/FemDesign.Dynamo/Dynamo/Model/Model.cs b/FemDesign.Dynamo/Dynamo/Model/Model.cs index 3ba75d132..5fd7a8fb4 100644 --- a/FemDesign.Dynamo/Dynamo/Model/Model.cs +++ b/FemDesign.Dynamo/Dynamo/Model/Model.cs @@ -172,19 +172,36 @@ public static Model ReadStruxml(string filePathStruxml) /// [IsVisibleInDynamoLibrary(true)] [MultiReturn(new[]{"Model", "FdFeaModel", "Results" })] - public static Dictionary ReadStr(string strPath, List resultTypes, Results.UnitResults units) + public static Dictionary ReadStr(string strPath, List resultTypes, Results.UnitResults units) { Results.FDfea fdFeaModel = null; // It needs to check if model has been runned // Always Return the FeaNode Result - resultTypes.Insert(0, Results.ResultType.FeaNode); - resultTypes.Insert(1, Results.ResultType.FeaBar); - resultTypes.Insert(2, Results.ResultType.FeaShell); + resultTypes.Insert(0, "FeaNode"); + resultTypes.Insert(1, "FeaBar"); + resultTypes.Insert(2, "FeaShell"); + + var notValidResultTypes = new List(); + var _resultTypes = resultTypes.Select(r => + { + var sucess = Results.ResultTypes.All.TryGetValue(r, out Type value); + if (sucess) + return value; + else + { + notValidResultTypes.Add(r); + return null; + } + }); + if (notValidResultTypes.Count() != 0) + { + throw new Exception( "The following strings are not valid result types: " + string.Join(", ", notValidResultTypes)); + } // Create Bsc files from resultTypes - var bscPathsFromResultTypes = Calculate.Bsc.BscPathFromResultTypes(resultTypes, strPath, units); + var bscPathsFromResultTypes = Calculate.Bsc.BscPathFromResultTypes(_resultTypes, strPath, units); // Create FdScript var fdScript = FemDesign.Calculate.FdScript.ReadStr(strPath, bscPathsFromResultTypes); @@ -202,7 +219,7 @@ public static Dictionary ReadStr(string strPath, List feaBarRes = new List(); List feaShellRes = new List(); - if (resultTypes != null && resultTypes.Any()) + if (_resultTypes != null && _resultTypes.Any()) { foreach (var cmd in fdScript.CmdListGen) { diff --git a/FemDesign.Dynamo/Dynamo/ModellingTools/ConnectedLines.cs b/FemDesign.Dynamo/Dynamo/ModellingTools/ConnectedLines.cs index 7c506190d..15952dd51 100644 --- a/FemDesign.Dynamo/Dynamo/ModellingTools/ConnectedLines.cs +++ b/FemDesign.Dynamo/Dynamo/ModellingTools/ConnectedLines.cs @@ -8,7 +8,7 @@ namespace FemDesign.ModellingTools { [IsVisibleInDynamoLibrary(false)] - public partial class ConnectedLines: EntityBase + public partial class ConnectedLines { #region dynamo [IsVisibleInDynamoLibrary(true)] @@ -17,8 +17,8 @@ public static ConnectedLines Define(Autodesk.DesignScript.Geometry.Curve firstCu // convert geometry Geometry.Edge edge0 = Geometry.Edge.FromDynamoLineOrArc2(firstCurve); Geometry.Edge edge1 = Geometry.Edge.FromDynamoLineOrArc2(secondCurve); - Geometry.FdVector3d x = Geometry.FdVector3d.FromDynamo(localX); - Geometry.FdVector3d y = Geometry.FdVector3d.FromDynamo(localY); + Geometry.Vector3d x = Geometry.Vector3d.FromDynamo(localX); + Geometry.Vector3d y = Geometry.Vector3d.FromDynamo(localY); // rigidity Releases.RigidityDataType3 rigidity = new Releases.RigidityDataType3(motions, rotations); diff --git a/FemDesign.Dynamo/Dynamo/ModellingTools/ConnectedPoints.cs b/FemDesign.Dynamo/Dynamo/ModellingTools/ConnectedPoints.cs index 2ca7f8510..1072b0117 100644 --- a/FemDesign.Dynamo/Dynamo/ModellingTools/ConnectedPoints.cs +++ b/FemDesign.Dynamo/Dynamo/ModellingTools/ConnectedPoints.cs @@ -8,7 +8,7 @@ namespace FemDesign.ModellingTools { [IsVisibleInDynamoLibrary(false)] - public partial class ConnectedPoints: EntityBase + public partial class ConnectedPoints { #region dynamo @@ -17,8 +17,8 @@ public partial class ConnectedPoints: EntityBase public static ConnectedPoints Define(Autodesk.DesignScript.Geometry.Point firstPoint, Autodesk.DesignScript.Geometry.Point secondPoint, Releases.Motions motions, Releases.Rotations rotations, System.Guid[] references, string identifier) { // convert geometry - Geometry.FdPoint3d p1 = Geometry.FdPoint3d.FromDynamo(firstPoint); - Geometry.FdPoint3d p2 = Geometry.FdPoint3d.FromDynamo(secondPoint); + Geometry.Point3d p1 = Geometry.Point3d.FromDynamo(firstPoint); + Geometry.Point3d p2 = Geometry.Point3d.FromDynamo(secondPoint); // rigidity Releases.RigidityDataType2 rigidity = new Releases.RigidityDataType2(motions, rotations); diff --git a/FemDesign.Dynamo/Dynamo/ModellingTools/Diaphragm.cs b/FemDesign.Dynamo/Dynamo/ModellingTools/Diaphragm.cs index 84fa3a016..b28ddbf24 100644 --- a/FemDesign.Dynamo/Dynamo/ModellingTools/Diaphragm.cs +++ b/FemDesign.Dynamo/Dynamo/ModellingTools/Diaphragm.cs @@ -7,7 +7,7 @@ namespace FemDesign.ModellingTools { [IsVisibleInDynamoLibrary(false)] - public partial class Diaphragm : EntityBase + public partial class Diaphragm { [IsVisibleInDynamoLibrary(true)] public static Diaphragm Define(Autodesk.DesignScript.Geometry.Surface surface, string identifier = "D") diff --git a/FemDesign.Dynamo/Dynamo/ModellingTools/FictitiousBar.cs b/FemDesign.Dynamo/Dynamo/ModellingTools/FictitiousBar.cs index a4459a354..37cb3b27b 100644 --- a/FemDesign.Dynamo/Dynamo/ModellingTools/FictitiousBar.cs +++ b/FemDesign.Dynamo/Dynamo/ModellingTools/FictitiousBar.cs @@ -9,7 +9,7 @@ namespace FemDesign.ModellingTools { [IsVisibleInDynamoLibrary(false)] - public partial class FictitiousBar: EntityBase + public partial class FictitiousBar { #region dynamo [IsVisibleInDynamoLibrary(true)] @@ -30,7 +30,7 @@ public static FictitiousBar Define(Autodesk.DesignScript.Geometry.Curve curve, [ { // convert geometry Geometry.Edge edge = Geometry.Edge.FromDynamoLineOrArc2(curve); - Geometry.FdVector3d y = Geometry.FdVector3d.FromDynamo(localY); + Geometry.Vector3d y = Geometry.Vector3d.FromDynamo(localY); // get connectivity Bars.Connectivity startConnectivity; @@ -56,7 +56,7 @@ public static FictitiousBar Define(Autodesk.DesignScript.Geometry.Curve curve, [ // set local y-axis if (!localY.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - bar.LocalY = FemDesign.Geometry.FdVector3d.FromDynamo(localY); + bar.LocalY = FemDesign.Geometry.Vector3d.FromDynamo(localY); } // else orient coordinate system to GCS diff --git a/FemDesign.Dynamo/Dynamo/ModellingTools/FictitiousShell.cs b/FemDesign.Dynamo/Dynamo/ModellingTools/FictitiousShell.cs index 315db3548..050c2766d 100644 --- a/FemDesign.Dynamo/Dynamo/ModellingTools/FictitiousShell.cs +++ b/FemDesign.Dynamo/Dynamo/ModellingTools/FictitiousShell.cs @@ -8,7 +8,7 @@ namespace FemDesign.ModellingTools { [IsVisibleInDynamoLibrary(false)] - public partial class FictitiousShell: EntityBase + public partial class FictitiousShell { /// /// Set EdgeConnection by indices. @@ -47,8 +47,8 @@ public static FictitiousShell Define(Autodesk.DesignScript.Geometry.Surface surf { // convert geometry Geometry.Region region = Geometry.Region.FromDynamo(surface); - Geometry.FdVector3d x = Geometry.FdVector3d.FromDynamo(localX); - Geometry.FdVector3d z = Geometry.FdVector3d.FromDynamo(localZ); + Geometry.Vector3d x = Geometry.Vector3d.FromDynamo(localX); + Geometry.Vector3d z = Geometry.Vector3d.FromDynamo(localZ); // add edge connections to region region.SetEdgeConnections(edgeConnection); @@ -59,13 +59,13 @@ public static FictitiousShell Define(Autodesk.DesignScript.Geometry.Surface surf // set local x-axis if (!localX.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - obj.LocalX = FemDesign.Geometry.FdVector3d.FromDynamo(localX); + obj.LocalX = FemDesign.Geometry.Vector3d.FromDynamo(localX); } // set local z-axis if (!localZ.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - obj.LocalZ = FemDesign.Geometry.FdVector3d.FromDynamo(localZ); + obj.LocalZ = FemDesign.Geometry.Vector3d.FromDynamo(localZ); } // return diff --git a/FemDesign.Dynamo/Dynamo/ModellingTools/SurfaceConnection.cs b/FemDesign.Dynamo/Dynamo/ModellingTools/SurfaceConnection.cs index 6e5d2bd2a..36142b122 100644 --- a/FemDesign.Dynamo/Dynamo/ModellingTools/SurfaceConnection.cs +++ b/FemDesign.Dynamo/Dynamo/ModellingTools/SurfaceConnection.cs @@ -8,7 +8,7 @@ namespace FemDesign.ModellingTools { [IsVisibleInDynamoLibrary(false)] - public partial class SurfaceConnection: EntityBase + public partial class SurfaceConnection { } diff --git a/FemDesign.Dynamo/Dynamo/Reinforcement/BarReinforcement.cs b/FemDesign.Dynamo/Dynamo/Reinforcement/BarReinforcement.cs index d6f77fe05..2006d2bc4 100644 --- a/FemDesign.Dynamo/Dynamo/Reinforcement/BarReinforcement.cs +++ b/FemDesign.Dynamo/Dynamo/Reinforcement/BarReinforcement.cs @@ -46,7 +46,7 @@ public static Bars.Bar AddToBar(Bars.Bar bar, List /// Deconstruct the Bar Displacement Results /// @@ -37,8 +43,8 @@ public static Dictionary Deconstruct(List)result["CaseIdentifier"]; var elementId = (List)result["ElementId"]; var positionResult = (List)result["PositionResult"]; - var iTranslation = (List)result["Translation"]; - var iRotation = (List)result["Rotation"]; + var iTranslation = (List)result["Translation"]; + var iRotation = (List)result["Rotation"]; // Convert the FdVector to Dynamo var oTranslation = iTranslation.Select(x => x.ToDynamo()); diff --git a/FemDesign.Dynamo/Dynamo/Results/BarInternalForce.cs b/FemDesign.Dynamo/Dynamo/Results/BarInternalForce.cs index addcfa004..4bb4a33f0 100644 --- a/FemDesign.Dynamo/Dynamo/Results/BarInternalForce.cs +++ b/FemDesign.Dynamo/Dynamo/Results/BarInternalForce.cs @@ -11,6 +11,13 @@ namespace FemDesign.Results [IsVisibleInDynamoLibrary(false)] public partial class BarInternalForce : IResult { + + [IsVisibleInDynamoLibrary(true)] + public static string ResultType() + { + return "BarInternalForce"; + } + /// /// Create new model. Add entities to model. Nested lists are not supported, use flatten. /// diff --git a/FemDesign.Dynamo/Dynamo/Results/BarStress.cs b/FemDesign.Dynamo/Dynamo/Results/BarStress.cs index 651ed055d..7fa9f0f11 100644 --- a/FemDesign.Dynamo/Dynamo/Results/BarStress.cs +++ b/FemDesign.Dynamo/Dynamo/Results/BarStress.cs @@ -11,6 +11,13 @@ namespace FemDesign.Results [IsVisibleInDynamoLibrary(false)] public partial class BarStress : IResult { + + [IsVisibleInDynamoLibrary(true)] + public static string ResultType() + { + return "BarStress"; + } + /// /// Read Bar Stress from a previously run model. /// diff --git a/FemDesign.Dynamo/Dynamo/Results/EigenFrequencies.cs b/FemDesign.Dynamo/Dynamo/Results/EigenFrequencies.cs index 7a85adf98..9552b9856 100644 --- a/FemDesign.Dynamo/Dynamo/Results/EigenFrequencies.cs +++ b/FemDesign.Dynamo/Dynamo/Results/EigenFrequencies.cs @@ -12,6 +12,12 @@ namespace FemDesign.Results [IsVisibleInDynamoLibrary(false)] public partial class EigenFrequencies : IResult { + [IsVisibleInDynamoLibrary(true)] + public static string ResultType() + { + return "EigenFrequencies"; + } + /// /// Read the EigenFrequencies for the entire model /// diff --git a/FemDesign.Dynamo/Dynamo/Results/FeaNode.cs b/FemDesign.Dynamo/Dynamo/Results/FeaNode.cs index c72e77b29..5615664ff 100644 --- a/FemDesign.Dynamo/Dynamo/Results/FeaNode.cs +++ b/FemDesign.Dynamo/Dynamo/Results/FeaNode.cs @@ -12,6 +12,12 @@ namespace FemDesign.Results [IsVisibleInDynamoLibrary(false)] public partial class FeaNode : IResult { + [IsVisibleInDynamoLibrary(true)] + public static string ResultType() + { + return "FeaNode"; + } + /// /// Deconstruct the Fea Node Element /// @@ -25,7 +31,7 @@ public static Dictionary Deconstruct(FDfea FdFeaModel) var nodeId = (List)result["NodeId"]; - var feaNodePoint = (List)result["Position"]; + var feaNodePoint = (List)result["Position"]; // Convert the FdPoint to Rhino diff --git a/FemDesign.Dynamo/Dynamo/Results/LineSupportReaction.cs b/FemDesign.Dynamo/Dynamo/Results/LineSupportReaction.cs index 7db9b0317..0765846b6 100644 --- a/FemDesign.Dynamo/Dynamo/Results/LineSupportReaction.cs +++ b/FemDesign.Dynamo/Dynamo/Results/LineSupportReaction.cs @@ -12,6 +12,12 @@ namespace FemDesign.Results [IsVisibleInDynamoLibrary(false)] public partial class LineSupportReaction : IResult { + [IsVisibleInDynamoLibrary(true)] + public static string ResultType() + { + return "LineSupportReaction"; + } + /// /// /// @@ -37,8 +43,8 @@ public static Dictionary Deconstruct(List)result["Identifier"]; var elementId = (List)result["ElementId"]; var nodeId = (List)result["NodeId"]; - var iReactionForce = (List)result["ReactionForce"]; - var iReactionMoment = (List)result["ReactionMoment"]; + var iReactionForce = (List)result["ReactionForce"]; + var iReactionMoment = (List)result["ReactionMoment"]; var iForceResultant = (List)result["ForceResultant"]; var iMomentResultant = (List)result["MomentResultant"]; diff --git a/FemDesign.Dynamo/Dynamo/Results/NodalDisplacement.cs b/FemDesign.Dynamo/Dynamo/Results/NodalDisplacement.cs index 6b181b357..8571e1ba4 100644 --- a/FemDesign.Dynamo/Dynamo/Results/NodalDisplacement.cs +++ b/FemDesign.Dynamo/Dynamo/Results/NodalDisplacement.cs @@ -12,6 +12,12 @@ namespace FemDesign.Results [IsVisibleInDynamoLibrary(false)] public partial class NodalDisplacement : IResult { + [IsVisibleInDynamoLibrary(true)] + public static string ResultType() + { + return "NodalDisplacement"; + } + /// /// Create new model. Add entities to model. Nested lists are not supported, use flatten. /// @@ -35,8 +41,8 @@ public static Dictionary Deconstruct(List)result["CaseIdentifier"]; var nodeId = (List)result["NodeId"]; - var iTranslation = (List)result["Translation"]; - var iRotation = (List)result["Rotation"]; + var iTranslation = (List)result["Translation"]; + var iRotation = (List)result["Rotation"]; // Convert the FdVector to Dynamo diff --git a/FemDesign.Dynamo/Dynamo/Results/NodalVibration.cs b/FemDesign.Dynamo/Dynamo/Results/NodalVibration.cs index 6cccfa939..52701ed38 100644 --- a/FemDesign.Dynamo/Dynamo/Results/NodalVibration.cs +++ b/FemDesign.Dynamo/Dynamo/Results/NodalVibration.cs @@ -12,6 +12,12 @@ namespace FemDesign.Results [IsVisibleInDynamoLibrary(false)] public partial class NodalVibration : IResult { + [IsVisibleInDynamoLibrary(true)] + public static string ResultType() + { + return "NodalVibration"; + } + /// /// Read the Modal Shape vectors for the entire model /// @@ -36,8 +42,8 @@ public static Dictionary Deconstruct(List)result["ShapeId"]; var identifier = (List)result["Id"]; var nodeId = (List)result["NodeId"]; - var iTranslation = (List)result["Translation"]; - var iRotation = (List)result["Rotation"]; + var iTranslation = (List)result["Translation"]; + var iRotation = (List)result["Rotation"]; // Convert the FdVector to Dynamo var oTranslation = iTranslation.Select(x => x.ToDynamo()); diff --git a/FemDesign.Dynamo/Dynamo/Results/PointSupportReaction.cs b/FemDesign.Dynamo/Dynamo/Results/PointSupportReaction.cs index 6a59db7dd..cd209a160 100644 --- a/FemDesign.Dynamo/Dynamo/Results/PointSupportReaction.cs +++ b/FemDesign.Dynamo/Dynamo/Results/PointSupportReaction.cs @@ -12,6 +12,12 @@ namespace FemDesign.Results [IsVisibleInDynamoLibrary(false)] public partial class PointSupportReaction : IResult { + [IsVisibleInDynamoLibrary(true)] + public static string ResultType() + { + return "PointSupportReaction"; + } + /// /// /// @@ -35,9 +41,9 @@ public static Dictionary Deconstruct(List)result["CaseIdentifier"]; var identifier = (List)result["Identifier"]; var nodeId = (List)result["NodeId"]; - var iPos = (List)result["Position"]; - var iReactionForce = (List)result["ReactionForce"]; - var iReactionMoment = (List)result["ReactionMoment"]; + var iPos = (List)result["Position"]; + var iReactionForce = (List)result["ReactionForce"]; + var iReactionMoment = (List)result["ReactionMoment"]; var iForceResultant = (List)result["ForceResultant"]; var iMomentResultant = (List)result["MomentResultant"]; diff --git a/FemDesign.Dynamo/Dynamo/Results/PointSupportReactionMinMax.cs b/FemDesign.Dynamo/Dynamo/Results/PointSupportReactionMinMax.cs new file mode 100644 index 000000000..d045dd57b --- /dev/null +++ b/FemDesign.Dynamo/Dynamo/Results/PointSupportReactionMinMax.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +#region dynamo +using Autodesk.DesignScript.Runtime; +using Autodesk.DesignScript.Geometry; +#endregion + +namespace FemDesign.Results +{ + [IsVisibleInDynamoLibrary(false)] + public partial class PointSupportReactionMinMax : IResult + { + + + /// + /// + /// + /// Result to be Parse + /// Name of Load Case/Load Combination for which to return the results. Default value returns the results for the first load case + [IsVisibleInDynamoLibrary(true)] + [MultiReturn(new[] { "MinMax", "CaseIdentifier", "Identifier", "NodeId", "SupportPosition", "ReactionForce", "ReactionMoment", "ForceResultant", "MomentResultant" })] + public static Dictionary Deconstruct(List Result) + { + + List minMax = new List(); + List loadCases = new List(); + List identifier = new List(); + List nodeId = new List(); + List pos = new List(); + List reactionForce = new List(); + List reactionMoment = new List(); + List forceResultant = new List(); + List momentResultant = new List(); + + foreach (var item in Result) + { + minMax.Add(item.Max); + loadCases.Add(item.CaseIdentifier); + identifier.Add(item.Id); + nodeId.Add(item.NodeId); + pos.Add(Autodesk.DesignScript.Geometry.Point.ByCoordinates(item.X, item.Y, item.Z)); + reactionForce.Add(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(item.Fx, item.Fy, item.Fz)); + reactionMoment.Add(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(item.Mx, item.My, item.Mz)); + forceResultant.Add(item.Fr); + momentResultant.Add(item.Mr); + } + + return new Dictionary + { + {"MinMax", minMax }, + {"CaseIdentifier", loadCases}, + {"Identifier", identifier}, + {"NodeId", nodeId}, + {"SupportPosition", pos}, + {"ReactionForce", reactionForce}, + {"ReactionMoment", reactionMoment}, + {"ForceResultant", forceResultant}, + {"MomentResultant", momentResultant} + }; + } + + + [IsVisibleInDynamoLibrary(true)] + public static string ResultType() + { + return "PointSupportReactionMinMax"; + } + } +} diff --git a/FemDesign.Dynamo/Dynamo/Results/ShellDisplacement.cs b/FemDesign.Dynamo/Dynamo/Results/ShellDisplacement.cs index 6826c8a27..eb2cdff24 100644 --- a/FemDesign.Dynamo/Dynamo/Results/ShellDisplacement.cs +++ b/FemDesign.Dynamo/Dynamo/Results/ShellDisplacement.cs @@ -12,6 +12,12 @@ namespace FemDesign.Results [IsVisibleInDynamoLibrary(false)] public partial class ShellDisplacement : IResult { + [IsVisibleInDynamoLibrary(true)] + public static string ResultType() + { + return "ShellDisplacement"; + } + /// /// Deconstruct the Shell Displacement Results /// @@ -37,8 +43,8 @@ public static Dictionary Deconstruct(List)result["CaseIdentifier"]; var elementId = (List)result["ElementId"]; var nodeId = (List)result["NodeId"]; - var iTranslation = (List)result["Translation"]; - var iRotation = (List)result["Rotation"]; + var iTranslation = (List)result["Translation"]; + var iRotation = (List)result["Rotation"]; // Convert the FdVector to Dynamo var oTranslation = iTranslation.Select(x => x.ToDynamo()); diff --git a/FemDesign.Dynamo/Dynamo/Results/ShellInternalForce.cs b/FemDesign.Dynamo/Dynamo/Results/ShellInternalForce.cs index 668acdc4f..e48b79e1c 100644 --- a/FemDesign.Dynamo/Dynamo/Results/ShellInternalForce.cs +++ b/FemDesign.Dynamo/Dynamo/Results/ShellInternalForce.cs @@ -14,6 +14,13 @@ namespace FemDesign.Results [IsVisibleInDynamoLibrary(false)] public partial class ShellInternalForce : IResult { + [IsVisibleInDynamoLibrary(true)] + public static string ResultType() + { + return "ShellInternalForce"; + } + + /// /// Deconstruct the Shell Internal Force Results /// diff --git a/FemDesign.Dynamo/Dynamo/Shells/EdgeConnection.cs b/FemDesign.Dynamo/Dynamo/Shells/EdgeConnection.cs index b3aa19d5c..1061ba982 100644 --- a/FemDesign.Dynamo/Dynamo/Shells/EdgeConnection.cs +++ b/FemDesign.Dynamo/Dynamo/Shells/EdgeConnection.cs @@ -11,13 +11,6 @@ namespace FemDesign.Shells [IsVisibleInDynamoLibrary(false)] public partial class EdgeConnection: EdgeConnectionBase { - /// - /// Create a default (rigid) EdgeConnection. - /// - /// - [IsVisibleInDynamoLibrary(false)] - public static EdgeConnection Default() => GetDefault(); - /// /// Define a new EdgeConnection /// @@ -37,9 +30,9 @@ public static EdgeConnection Define(Releases.Motions motions, Releases.Rotations /// Create /// [IsVisibleInDynamoLibrary(true)] - public static EdgeConnection Hinged() + public static EdgeConnection GetHinged() { - return EdgeConnection.GetHinged(); + return EdgeConnection.Hinged; } /// @@ -48,9 +41,9 @@ public static EdgeConnection Hinged() /// Create /// [IsVisibleInDynamoLibrary(true)] - public static EdgeConnection Rigid() + public static EdgeConnection GetRigid() { - return EdgeConnection.GetRigid(); + return EdgeConnection.Rigid; } } } \ No newline at end of file diff --git a/FemDesign.Dynamo/Dynamo/Shells/Panel.cs b/FemDesign.Dynamo/Dynamo/Shells/Panel.cs index 0eda6a02c..b13e2006f 100644 --- a/FemDesign.Dynamo/Dynamo/Shells/Panel.cs +++ b/FemDesign.Dynamo/Dynamo/Shells/Panel.cs @@ -10,7 +10,7 @@ namespace FemDesign.Shells { [IsVisibleInDynamoLibrary(false)] - public partial class Panel: EntityBase + public partial class Panel { #region dynamo @@ -40,13 +40,13 @@ public static Panel ProfiledPlate(Autodesk.DesignScript.Geometry.Surface surface // set local x-axis if (!localX.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - obj.LocalX = FemDesign.Geometry.FdVector3d.FromDynamo(localX); + obj.LocalX = FemDesign.Geometry.Vector3d.FromDynamo(localX); } // set local z-axis if (!localZ.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - obj.LocalZ = FemDesign.Geometry.FdVector3d.FromDynamo(localZ); + obj.LocalZ = FemDesign.Geometry.Vector3d.FromDynamo(localZ); } // set mesh diff --git a/FemDesign.Dynamo/Dynamo/Shells/ShellEccentricity.cs b/FemDesign.Dynamo/Dynamo/Shells/ShellEccentricity.cs index 1539096c6..a97fa5195 100644 --- a/FemDesign.Dynamo/Dynamo/Shells/ShellEccentricity.cs +++ b/FemDesign.Dynamo/Dynamo/Shells/ShellEccentricity.cs @@ -20,13 +20,5 @@ public static ShellEccentricity Create(VerticalAlignment alignment, double eccen { return new ShellEccentricity(alignment, eccentricity, eccentricityCalculation, eccentricityByCracking); } - - /// - /// Create a default ShellEccentricity. - /// - /// Create - /// - [IsVisibleInDynamoLibrary(false)] - public static ShellEccentricity Default() => GetDefault(); } } \ No newline at end of file diff --git a/FemDesign.Dynamo/Dynamo/Shells/ShellOrthotropy.cs b/FemDesign.Dynamo/Dynamo/Shells/ShellOrthotropy.cs index d4d433abb..ef889b97d 100644 --- a/FemDesign.Dynamo/Dynamo/Shells/ShellOrthotropy.cs +++ b/FemDesign.Dynamo/Dynamo/Shells/ShellOrthotropy.cs @@ -20,13 +20,5 @@ public static ShellOrthotropy Create(double orthoAlfa = 0, double orthoRatio = 1 { return new ShellOrthotropy(orthoAlfa, orthoRatio); } - - /// - /// Create a default definition for ShellOrthotropy. - /// - /// Create - /// - [IsVisibleInDynamoLibrary(false)] - public static ShellOrthotropy Default() => GetDefault(); } } \ No newline at end of file diff --git a/FemDesign.Dynamo/Dynamo/Shells/Slab.cs b/FemDesign.Dynamo/Dynamo/Shells/Slab.cs index d47140e8f..33cf8e228 100644 --- a/FemDesign.Dynamo/Dynamo/Shells/Slab.cs +++ b/FemDesign.Dynamo/Dynamo/Shells/Slab.cs @@ -9,7 +9,7 @@ namespace FemDesign.Shells { [IsVisibleInDynamoLibrary(false)] - public partial class Slab: EntityBase + public partial class Slab { #region dynamo @@ -66,13 +66,13 @@ public static Slab Plate(Autodesk.DesignScript.Geometry.Surface surface, double // set local x-axis if (!localX.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - slab.SlabPart.LocalX = FemDesign.Geometry.FdVector3d.FromDynamo(localX); + slab.SlabPart.LocalX = FemDesign.Geometry.Vector3d.FromDynamo(localX); } // set local z-axis if (!localZ.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - slab.SlabPart.LocalZ = FemDesign.Geometry.FdVector3d.FromDynamo(localZ); + slab.SlabPart.LocalZ = FemDesign.Geometry.Vector3d.FromDynamo(localZ); } return slab; @@ -109,13 +109,13 @@ public static Slab PlateVariableThickness(Autodesk.DesignScript.Geometry.Surface // set local x-axis if (!localX.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - slab.SlabPart.LocalX = FemDesign.Geometry.FdVector3d.FromDynamo(localX); + slab.SlabPart.LocalX = FemDesign.Geometry.Vector3d.FromDynamo(localX); } // set local z-axis if (!localZ.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - slab.SlabPart.LocalZ = FemDesign.Geometry.FdVector3d.FromDynamo(localZ); + slab.SlabPart.LocalZ = FemDesign.Geometry.Vector3d.FromDynamo(localZ); } return slab; @@ -156,13 +156,13 @@ public static Slab Wall(Autodesk.DesignScript.Geometry.Surface surface, double t // set local x-axis if (!localX.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - slab.SlabPart.LocalX = FemDesign.Geometry.FdVector3d.FromDynamo(localX); + slab.SlabPart.LocalX = FemDesign.Geometry.Vector3d.FromDynamo(localX); } // set local z-axis if (!localZ.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - slab.SlabPart.LocalZ = FemDesign.Geometry.FdVector3d.FromDynamo(localZ); + slab.SlabPart.LocalZ = FemDesign.Geometry.Vector3d.FromDynamo(localZ); } return slab; @@ -205,13 +205,13 @@ public static Slab WallVariableThickness(Autodesk.DesignScript.Geometry.Surface // set local x-axis if (!localX.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - slab.SlabPart.LocalX = FemDesign.Geometry.FdVector3d.FromDynamo(localX); + slab.SlabPart.LocalX = FemDesign.Geometry.Vector3d.FromDynamo(localX); } // set local z-axis if (!localZ.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - slab.SlabPart.LocalZ = FemDesign.Geometry.FdVector3d.FromDynamo(localZ); + slab.SlabPart.LocalZ = FemDesign.Geometry.Vector3d.FromDynamo(localZ); } return slab; @@ -230,8 +230,8 @@ public Slab SetLocalAxes(Autodesk.DesignScript.Geometry.Vector localX, Autodesk. Slab slab = this.DeepClone(); // set local x and local z - slab.SlabPart.LocalX = Geometry.FdVector3d.FromDynamo(localX); - slab.SlabPart.LocalZ = Geometry.FdVector3d.FromDynamo(localZ); + slab.SlabPart.LocalX = Geometry.Vector3d.FromDynamo(localX); + slab.SlabPart.LocalZ = Geometry.Vector3d.FromDynamo(localZ); // return slab; diff --git a/FemDesign.Dynamo/Dynamo/Shells/SlabPart.cs b/FemDesign.Dynamo/Dynamo/Shells/SlabPart.cs index 159c8bbf9..0813fa5c5 100644 --- a/FemDesign.Dynamo/Dynamo/Shells/SlabPart.cs +++ b/FemDesign.Dynamo/Dynamo/Shells/SlabPart.cs @@ -10,7 +10,7 @@ namespace FemDesign.Shells { [IsVisibleInDynamoLibrary(false)] - public partial class SlabPart: EntityBase + public partial class SlabPart { #region dynamo diff --git a/FemDesign.Dynamo/Dynamo/Shells/Thickness.cs b/FemDesign.Dynamo/Dynamo/Shells/Thickness.cs index c1fba3be2..21bc1088e 100644 --- a/FemDesign.Dynamo/Dynamo/Shells/Thickness.cs +++ b/FemDesign.Dynamo/Dynamo/Shells/Thickness.cs @@ -19,7 +19,7 @@ public partial class Thickness: LocationValue [IsVisibleInDynamoLibrary(true)] public static Thickness Define(Autodesk.DesignScript.Geometry.Point point, double val) { - return new Thickness(Geometry.FdPoint3d.FromDynamo(point), val); + return new Thickness(Geometry.Point3d.FromDynamo(point), val); } #endregion diff --git a/FemDesign.Dynamo/Dynamo/Stage/ActivatedLoadCase.cs b/FemDesign.Dynamo/Dynamo/Stage/ActivatedLoadCase.cs new file mode 100644 index 000000000..eb8871802 --- /dev/null +++ b/FemDesign.Dynamo/Dynamo/Stage/ActivatedLoadCase.cs @@ -0,0 +1,21 @@ +using System; +using System.Xml.Serialization; +using System.Globalization; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using FemDesign.GenericClasses; + +#region dynamo +using Autodesk.DesignScript.Runtime; +#endregion + +namespace FemDesign +{ + [IsVisibleInDynamoLibrary(false)] + public partial class ActivatedLoadCase + { + + } +} \ No newline at end of file diff --git a/FemDesign.Dynamo/Dynamo/Stage/ConstructionStages.cs b/FemDesign.Dynamo/Dynamo/Stage/ConstructionStages.cs new file mode 100644 index 000000000..9157dabc8 --- /dev/null +++ b/FemDesign.Dynamo/Dynamo/Stage/ConstructionStages.cs @@ -0,0 +1,21 @@ +using System; +using System.Xml.Serialization; +using System.Globalization; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using FemDesign.GenericClasses; + +#region dynamo +using Autodesk.DesignScript.Runtime; +#endregion + +namespace FemDesign +{ + [IsVisibleInDynamoLibrary(false)] + public partial class ConstructionStages + { + + } +} \ No newline at end of file diff --git a/FemDesign.Dynamo/Dynamo/Stage/Stage.cs b/FemDesign.Dynamo/Dynamo/Stage/Stage.cs new file mode 100644 index 000000000..dcb3b81f8 --- /dev/null +++ b/FemDesign.Dynamo/Dynamo/Stage/Stage.cs @@ -0,0 +1,21 @@ +using System; +using System.Xml.Serialization; +using System.Globalization; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using FemDesign.GenericClasses; + +#region dynamo +using Autodesk.DesignScript.Runtime; +#endregion + +namespace FemDesign +{ + [IsVisibleInDynamoLibrary(false)] + public partial class Stage + { + + } +} \ No newline at end of file diff --git a/FemDesign.Dynamo/Dynamo/StructureGrid/Axis.cs b/FemDesign.Dynamo/Dynamo/StructureGrid/Axis.cs index 78cfe4467..b65246bf7 100644 --- a/FemDesign.Dynamo/Dynamo/StructureGrid/Axis.cs +++ b/FemDesign.Dynamo/Dynamo/StructureGrid/Axis.cs @@ -22,8 +22,8 @@ public partial class Axis: EntityBase public static Axis Define(Autodesk.DesignScript.Geometry.Line line, [DefaultArgument("")] string prefix, int id, [DefaultArgument("false")] bool idIsLetter) { // convert geometry - Geometry.FdPoint3d p0 = Geometry.FdPoint3d.FromDynamo(line.StartPoint); - Geometry.FdPoint3d p1 = Geometry.FdPoint3d.FromDynamo(line.EndPoint); + Geometry.Point3d p0 = Geometry.Point3d.FromDynamo(line.StartPoint); + Geometry.Point3d p1 = Geometry.Point3d.FromDynamo(line.EndPoint); // return new Axis(p0, p1, prefix, id, idIsLetter); diff --git a/FemDesign.Dynamo/Dynamo/StructureGrid/Storey.cs b/FemDesign.Dynamo/Dynamo/StructureGrid/Storey.cs index 8bae6b0b0..03bad591a 100644 --- a/FemDesign.Dynamo/Dynamo/StructureGrid/Storey.cs +++ b/FemDesign.Dynamo/Dynamo/StructureGrid/Storey.cs @@ -24,8 +24,8 @@ public partial class Storey: EntityBase public static Storey Define(string name, Autodesk.DesignScript.Geometry.Point origo, [DefaultArgument("Autodesk.DesignScript.Geometry.Vector.XAxis()")] Autodesk.DesignScript.Geometry.Vector direction, double dimensionX = 50, double dimensionY = 30) { // convert geometry - Geometry.FdPoint3d p = Geometry.FdPoint3d.FromDynamo(origo); - Geometry.FdVector3d v = Geometry.FdVector3d.FromDynamo(direction); + Geometry.Point3d p = Geometry.Point3d.FromDynamo(origo); + Geometry.Vector3d v = Geometry.Vector3d.FromDynamo(direction); // return return new Storey(p, v, dimensionX, dimensionY, name); diff --git a/FemDesign.Dynamo/Dynamo/Supports/LineSupport.cs b/FemDesign.Dynamo/Dynamo/Supports/LineSupport.cs index 3c6125c96..0860b153d 100644 --- a/FemDesign.Dynamo/Dynamo/Supports/LineSupport.cs +++ b/FemDesign.Dynamo/Dynamo/Supports/LineSupport.cs @@ -7,7 +7,7 @@ namespace FemDesign.Supports { [IsVisibleInDynamoLibrary(false)] - public partial class LineSupport: EntityBase + public partial class LineSupport: NamedEntityBase { /// /// Create a rigid line support element. @@ -28,7 +28,7 @@ public static LineSupport Rigid(Autodesk.DesignScript.Geometry.Curve curve, [Def // set local y-axis if (!localY.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - obj.Group.LocalY = FemDesign.Geometry.FdVector3d.FromDynamo(localY); + obj.Group.LocalY = FemDesign.Geometry.Vector3d.FromDynamo(localY); } // else orient coordinate system to GCS @@ -62,7 +62,7 @@ public static LineSupport Hinged(Autodesk.DesignScript.Geometry.Curve curve, [De // set local y-axis if (!localY.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - obj.Group.LocalY = FemDesign.Geometry.FdVector3d.FromDynamo(localY); + obj.Group.LocalY = FemDesign.Geometry.Vector3d.FromDynamo(localY); } // else orient coordinate system to GCS @@ -98,7 +98,7 @@ public static LineSupport Define(Autodesk.DesignScript.Geometry.Curve curve, Mot // set local y-axis if (!localY.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - obj.Group.LocalY = FemDesign.Geometry.FdVector3d.FromDynamo(localY); + obj.Group.LocalY = FemDesign.Geometry.Vector3d.FromDynamo(localY); } // else orient coordinate system to GCS diff --git a/FemDesign.Dynamo/Dynamo/Supports/PointSupport.cs b/FemDesign.Dynamo/Dynamo/Supports/PointSupport.cs index ebbe04e20..4d4a7c99e 100644 --- a/FemDesign.Dynamo/Dynamo/Supports/PointSupport.cs +++ b/FemDesign.Dynamo/Dynamo/Supports/PointSupport.cs @@ -7,7 +7,7 @@ namespace FemDesign.Supports { [IsVisibleInDynamoLibrary(false)] - public partial class PointSupport: EntityBase + public partial class PointSupport: NamedEntityBase { /// /// Create a rigid point support element. @@ -19,7 +19,7 @@ public partial class PointSupport: EntityBase [IsVisibleInDynamoLibrary(true)] public static PointSupport Rigid(Autodesk.DesignScript.Geometry.Point point, [DefaultArgument("S")] string identifier) { - return PointSupport.Rigid(Geometry.FdPoint3d.FromDynamo(point), identifier); + return PointSupport.Rigid(Geometry.Point3d.FromDynamo(point), identifier); } /// @@ -32,7 +32,7 @@ public static PointSupport Rigid(Autodesk.DesignScript.Geometry.Point point, [De [IsVisibleInDynamoLibrary(true)] public static PointSupport Hinged(Autodesk.DesignScript.Geometry.Point point, [DefaultArgument("S")] string identifier) { - return PointSupport.Hinged(Geometry.FdPoint3d.FromDynamo(point), identifier); + return PointSupport.Hinged(Geometry.Point3d.FromDynamo(point), identifier); } /// @@ -49,7 +49,7 @@ public static PointSupport Hinged(Autodesk.DesignScript.Geometry.Point point, [D [IsVisibleInDynamoLibrary(true)] public static PointSupport Define(Autodesk.DesignScript.Geometry.Point point, Motions motions, [DefaultArgument("MotionsPlasticLimits.Default()")] MotionsPlasticLimits motionsPlasticLimits, Rotations rotations, [DefaultArgument("RotationsPlasticLimits.Default()")] RotationsPlasticLimits rotationsPlasticLimits, [DefaultArgument("S")] string identifier) { - return new PointSupport(Geometry.FdPoint3d.FromDynamo(point), motions, motionsPlasticLimits, rotations, rotationsPlasticLimits, identifier); + return new PointSupport(Geometry.Point3d.FromDynamo(point), motions, motionsPlasticLimits, rotations, rotationsPlasticLimits, identifier); } internal Autodesk.DesignScript.Geometry.Point GetDynamoGeometry() diff --git a/FemDesign.Dynamo/Dynamo/Supports/SurfaceSupport.cs b/FemDesign.Dynamo/Dynamo/Supports/SurfaceSupport.cs index 8539675eb..63186461b 100644 --- a/FemDesign.Dynamo/Dynamo/Supports/SurfaceSupport.cs +++ b/FemDesign.Dynamo/Dynamo/Supports/SurfaceSupport.cs @@ -7,7 +7,7 @@ namespace FemDesign.Supports { [IsVisibleInDynamoLibrary(false)] - public partial class SurfaceSupport: EntityBase + public partial class SurfaceSupport: NamedEntityBase { /// /// Create a SurfaceSupport element. @@ -29,13 +29,13 @@ public static SurfaceSupport SurfaceSupportDefine(Autodesk.DesignScript.Geometry // set local x-axis if (!localX.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - obj.CoordinateSystem.SetXAroundZ(FemDesign.Geometry.FdVector3d.FromDynamo(localX)); + obj.CoordinateSystem.SetXAroundZ(FemDesign.Geometry.Vector3d.FromDynamo(localX)); } // set local z-axis if (!localZ.Equals(Autodesk.DesignScript.Geometry.Vector.ByCoordinates(0,0,0))) { - obj.CoordinateSystem.SetZAroundX(FemDesign.Geometry.FdVector3d.FromDynamo(localZ)); + obj.CoordinateSystem.SetZAroundX(FemDesign.Geometry.Vector3d.FromDynamo(localZ)); } return obj; diff --git a/FemDesign.Dynamo/FemDesign.Dynamo.csproj b/FemDesign.Dynamo/FemDesign.Dynamo.csproj index ebdd4d133..2d6b0ed0e 100644 --- a/FemDesign.Dynamo/FemDesign.Dynamo.csproj +++ b/FemDesign.Dynamo/FemDesign.Dynamo.csproj @@ -83,6 +83,9 @@ Core\Bars\BarPart.cs + + Core\Bars\BarStiffnessFactors.cs + Core\Bars\Beam.cs @@ -128,6 +131,9 @@ Core\Calculate\Bsc.cs + + Core\Calculate\CmdApplyDesignChanges.cs + Core\Calculate\CmdCalculation.cs @@ -161,9 +167,6 @@ Core\Calculate\CombItem.cs - - Core\Calculate\ConstructionStage.cs - Core\Calculate\Design.cs @@ -194,6 +197,9 @@ Core\Calculate\Options.cs + + Core\Calculate\Stage.cs + Core\GenericClasses\Camber.cs @@ -224,6 +230,9 @@ Core\GenericClasses\ILoadElement.cs + + Core\GenericClasses\INamedEntity.cs + Core\GenericClasses\IStageElement.cs @@ -239,6 +248,9 @@ Core\GenericClasses\LocationValue.cs + + Core\GenericClasses\NamedEntityBase.cs + Core\GenericClasses\RestrictedDouble.cs @@ -254,12 +266,21 @@ Core\GenericClasses\StartEndType.cs + + Core\GenericClasses\TextFormatting.cs + Core\GenericClasses\Tolerance.cs Core\GenericClasses\VerticalAlignmentEnum.cs + + Core\Geometry\ArcEdge.cs + + + Core\Geometry\CircleEdge.cs + Core\Geometry\Contour.cs @@ -272,20 +293,26 @@ Core\Geometry\Face.cs - - Core\Geometry\FdCoordinateSystem.cs + + Core\Geometry\CoordinateSystem.cs + + + Core\Geometry\LineEdge.cs - - Core\Geometry\FdPoint2d.cs + + Core\Geometry\Point2d.cs - - Core\Geometry\FdPoint3d.cs + + Core\Geometry\Point3d.cs - - Core\Geometry\FdVector2d.cs + + Core\Geometry\Proximity.cs - - Core\Geometry\FdVector3d.cs + + Core\Geometry\Vector2d.cs + + + Core\Geometry\Vector3d.cs Core\Geometry\LineSegment.cs @@ -344,6 +371,9 @@ Core\Loads\LoadCombination.cs + + Core\Loads\LoadCombinationCaseBase.cs + Core\Loads\LoadCombTypeEnum.cs @@ -392,6 +422,9 @@ Core\Loads\PressureLoad.cs + + Core\Loads\StageLoadCase.cs + Core\Loads\SurfaceLoad.cs @@ -596,6 +629,9 @@ Core\Releases\RigidityDataLibType3.cs + + Core\Releases\RigidityDataType0.cs + Core\Releases\RigidityDataType1.cs @@ -686,6 +722,9 @@ Core\Results\PointSupportReaction.cs + + Core\Results\PointSupportReactionMinMax.cs + Core\Results\QuantityEstimation.cs @@ -695,9 +734,6 @@ Core\Results\ResultsReader.cs - - Core\Results\ResultTypeEnum.cs - Core\Results\ShellDerivedForce.cs @@ -761,6 +797,9 @@ Core\Shells\SlabPart.cs + + Core\Shells\SlabStiffnessFactors.cs + Core\Shells\SlabTypeEnum.cs @@ -770,15 +809,6 @@ Core\Shells\WallCorbel.cs - - Core\AdvancedFem\ActivatedLoadCase.cs - - - Core\AdvancedFem\ConstructionStages.cs - - - Core\AdvancedFem\Stage.cs - Core\StructureGrid\Axes.cs @@ -812,9 +842,21 @@ Core\Supports\PointSupport.cs + + Core\Supports\StiffnessPoints.cs + Core\Supports\Supports.cs + + Core\Stage\Stage.cs + + + Core\Stage\ConstructionStages.cs + + + Core\Stage\ActivatedLoadCase.cs + Core\Supports\SurfaceSupport.cs @@ -865,17 +907,18 @@ + - - - - - + + + + + @@ -983,6 +1026,7 @@ + @@ -1007,6 +1051,8 @@ + + @@ -1017,6 +1063,7 @@ + True diff --git a/FemDesign.Examples/C#/Example 1 - Creating a simple beam/Program.cs b/FemDesign.Examples/C#/Example 1 - Creating a simple beam/Program.cs index 9c5b3c7d4..3efa994a6 100644 --- a/FemDesign.Examples/C#/Example 1 - Creating a simple beam/Program.cs +++ b/FemDesign.Examples/C#/Example 1 - Creating a simple beam/Program.cs @@ -50,7 +50,8 @@ static void Main() // Create load cases var deadload = new Loads.LoadCase("Deadload", Loads.LoadCaseType.DeadLoad, Loads.LoadCaseDuration.Permanent); var liveload = new Loads.LoadCase("Liveload", Loads.LoadCaseType.Static, Loads.LoadCaseDuration.Permanent); - var loadcases = new List() { deadload, liveload }; + var stressload = new Loads.LoadCase("Stresses", Loads.LoadCaseType.Static, Loads.LoadCaseDuration.Permanent); + var loadcases = new List() { deadload, liveload, stressload }; // Create load combinations @@ -71,10 +72,13 @@ static void Main() var lineLoadEnd = new Geometry.Vector3d(0.0, 0.0, -4.0); var lineLoad = Loads.LineLoad.VariableForce(edge, lineLoadStart, lineLoadEnd, liveload); + var lineStress = new Loads.LineStressLoad(edge, 10, stressload); + var loads = new List() { pointForce, pointMoment, - lineLoad + lineLoad, + lineStress }; diff --git a/FemDesign.Examples/C#/Example 3 - Analyse a beam/Program.cs b/FemDesign.Examples/C#/Example 3 - Analyse a beam/Program.cs index fa1a4edba..f9b9091e4 100644 --- a/FemDesign.Examples/C#/Example 3 - Analyse a beam/Program.cs +++ b/FemDesign.Examples/C#/Example 3 - Analyse a beam/Program.cs @@ -123,11 +123,6 @@ static void Main() // Run a specific analysis model.RunAnalysis(analysisType, resultTypes: results, cmdGlobalCfg: config, endSession: true); - - - - // TO DO - //model.ReadResult(ResultType); } } -} +} \ No newline at end of file diff --git a/FemDesign.Examples/C#/Example10 - ConstructionStages/Program.cs b/FemDesign.Examples/C#/Example10 - ConstructionStages/Program.cs index 80a40fb91..92cface1f 100644 --- a/FemDesign.Examples/C#/Example10 - ConstructionStages/Program.cs +++ b/FemDesign.Examples/C#/Example10 - ConstructionStages/Program.cs @@ -90,13 +90,6 @@ static void Main(string[] args) var imposedCase = new Loads.LoadCase("IMPOSED", Loads.LoadCaseType.Static, Loads.LoadCaseDuration.Permanent); var loadcases = new List() { deadLoadCase, windCase, imposedCase }; - // Create load combinations - var slsFactors = new List() { 1.0, 1.0, 1.0 }; - var SLS = new Loads.LoadCombination("SLS", Loads.LoadCombType.ServiceabilityCharacteristic, loadcases, slsFactors); - var ulsFactors = new List() { 1.35, 1.5, 1.2 }; - var ULS = new Loads.LoadCombination("ULS", Loads.LoadCombType.UltimateOrdinary, loadcases, ulsFactors); - var loadCombinations = new List() { SLS, ULS }; - // Create loads var pointMoment = new Loads.PointLoad(p2, new Geometry.Vector3d(0.0, 5.0, 0.0), deadLoadCase, null, Loads.ForceLoadType.Moment); @@ -123,12 +116,22 @@ static void Main(string[] args) // Create the stages var stage1 = new Stage(1, "STAGE_1", stageOneLoadCases, elementsStageOne); var stage2 = new Stage(2, "STAGE_2", stageTwoLoadCases, elementsStageTwo); - var stage3 = new Stage(3, "STAGE_3", null, elementsStageThree); - var stage4 = new Stage(4, "STAGE_4", null, null); - var stage5 = new Stage(5, "STAGE_5", null, null); + var stage3 = new Stage(3, "STAGE_3", elements: elementsStageThree); + var stage4 = new Stage(4, "STAGE_4"); + var stage5 = new Stage(5, "STAGE_5"); var stages = new List() { stage1, stage2, stage3, stage4, stage5 }; + + // Create load combinations + var slsFactors = new List() { 1.0, 1.0, 1.0 }; + var SLS = new Loads.LoadCombination("SLS", Loads.LoadCombType.ServiceabilityCharacteristic, loadcases, slsFactors); + var ulsFactors = new List() { 1.35, 1.5, 1.2 }; + var ULS = new Loads.LoadCombination("ULS", Loads.LoadCombType.UltimateOrdinary, loadcases, ulsFactors); + var CSCombination = new Loads.LoadCombination("Stage combination", Loads.LoadCombType.UltimateOrdinary, loadcases, ulsFactors); + CSCombination.SetStageLoadCase(stage1, 1.0); + var loadCombinations = new List() { SLS, ULS, CSCombination }; + // Create the model Model model = new Model(Country.S); model.AddElements(elements); diff --git a/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/CreateStiffnessPoints.sln b/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/CreateStiffnessPoints.sln new file mode 100644 index 000000000..6ecc539cf --- /dev/null +++ b/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/CreateStiffnessPoints.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.32421.90 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreateStiffnessPoints", "CreateStiffnessPoints.csproj", "{BE21154D-59B3-40F1-A567-14312741EFD5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BE21154D-59B3-40F1-A567-14312741EFD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BE21154D-59B3-40F1-A567-14312741EFD5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE21154D-59B3-40F1-A567-14312741EFD5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BE21154D-59B3-40F1-A567-14312741EFD5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {46A8FE65-03A3-490A-9D1A-E2503F24BD9B} + EndGlobalSection +EndGlobal diff --git a/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/Parse.cs b/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/Parse.cs new file mode 100644 index 000000000..8db84c234 --- /dev/null +++ b/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/Parse.cs @@ -0,0 +1,30 @@ +using Newtonsoft.Json; + +namespace FemDesign.Examples +{ + public class DataParser + { + public static string ConvertCsvFileToJsonObject(string path) + { + var csv = new List(); + var lines = File.ReadAllLines(path); + + foreach (string line in lines) + csv.Add(line.Split(',')); + + var properties = lines[0].Split(','); + + var listObjResult = new List>(); + + for (int i = 1; i < lines.Length; i++) + { + var objResult = new Dictionary(); + for (int j = 0; j < properties.Length; j++) + objResult.Add(properties[j], csv[i][j]); + + listObjResult.Add(objResult); + } + return JsonConvert.SerializeObject(listObjResult); + } + } +} \ No newline at end of file diff --git a/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/PointLocation.txt b/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/PointLocation.txt new file mode 100644 index 000000000..a80667373 --- /dev/null +++ b/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/PointLocation.txt @@ -0,0 +1,6 @@ +X,Y,Z +1,1,0 +3,1,0 +3,3,0 +1,3,0 +2,2,0 \ No newline at end of file diff --git a/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/Practical example - Stiffness Point from CSV.csproj b/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/Practical example - Stiffness Point from CSV.csproj new file mode 100644 index 000000000..d471b5bbf --- /dev/null +++ b/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/Practical example - Stiffness Point from CSV.csproj @@ -0,0 +1,24 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + + + + + + Always + + + + diff --git a/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/Program.cs b/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/Program.cs new file mode 100644 index 000000000..401e06422 --- /dev/null +++ b/FemDesign.Examples/C#/Practical example - Create Stiffness Point from a CSV/Program.cs @@ -0,0 +1,38 @@ +using FemDesign.Examples; +using FemDesign; +using Newtonsoft.Json; + +// Convert the csv file data to a Point3d object +var jsonObject = DataParser.ConvertCsvFileToJsonObject("PointLocation.txt"); +var points = JsonConvert.DeserializeObject(jsonObject); +if (points is null || points.Length < 1) + throw new Exception("Empty json file."); + +// Empty List to contain all the Structural Elements +var struElements = new List(); + +// Define Stiffness +var motionsSurface = new FemDesign.Releases.Motions(10000, 10000, 10000, 10000, 10000, 10000); +var motionsPoint = new FemDesign.Releases.Motions(10, 10, 10, 10, 10, 10); + + +// Define Geometry +var region = FemDesign.Geometry.Region.RectangleXY(FemDesign.Geometry.Point3d.Origin, 4, 4); + +// Create a Surface Support +var surfaceSupport = new FemDesign.Supports.SurfaceSupport(region, motionsSurface, null); +struElements.Add(surfaceSupport); + + +// Create the stiffness points +foreach (var point in points) +{ + var stiffPoints = new FemDesign.Supports.StiffnessPoint(surfaceSupport, point, motionsPoint); + struElements.Add(stiffPoints); +} + +// Create Model +var model = new FemDesign.Model(FemDesign.Country.S); +model.AddElements(struElements); + +model.Open(); \ No newline at end of file diff --git a/FemDesign.Examples/Grasshopper/Example 5 - Using custom sections.gh b/FemDesign.Examples/Grasshopper/Example 5 - Using custom sections.gh index e18b394dfc7b6c10ab9f7c4adba5c26c986e8744..d2cfaa81cf98eb1bbac84f478d628931f7e7fc78 100644 GIT binary patch literal 52320 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 literal 47115 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 diff --git a/FemDesign.Examples/Grasshopper/Example 5 - my example section.struxml b/FemDesign.Examples/Grasshopper/Example 5 - my example section.struxml index 02d1e9b65..2db17c540 100644 --- a/FemDesign.Examples/Grasshopper/Example 5 - my example section.struxml +++ b/FemDesign.Examples/Grasshopper/Example 5 - my example section.struxml @@ -1,90427 +1,93 @@ - + -

+
- - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - -
-
- - - + + + + + + + + + + + + - - - - - + diff --git a/FemDesign.Grasshopper/Bars/BarsBeam.cs b/FemDesign.Grasshopper/Bars/BarsBeam.cs index b2f30d91c..4d146fd73 100644 --- a/FemDesign.Grasshopper/Bars/BarsBeam.cs +++ b/FemDesign.Grasshopper/Bars/BarsBeam.cs @@ -19,9 +19,7 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) { pManager.AddCurveParameter("Curve", "Curve", "LineCurve or ArcCurve", GH_ParamAccess.item); pManager.AddGenericParameter("Material", "Material", "Material.", GH_ParamAccess.item); - pManager[pManager.ParamCount - 1].Optional = true; pManager.AddGenericParameter("Section", "Section", "Section. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end.", GH_ParamAccess.list); - pManager[pManager.ParamCount - 1].Optional = true; pManager.AddGenericParameter("Connectivity", "Connectivity", "Connectivity. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end. Optional, default value if undefined.", GH_ParamAccess.list); pManager[pManager.ParamCount - 1].Optional = true; pManager.AddGenericParameter("Eccentricity", "Eccentricity", "Eccentricity. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end. Optional, default value if undefined.", GH_ParamAccess.list); @@ -44,17 +42,10 @@ protected override void SolveInstance(IGH_DataAccess DA) if (!DA.GetData(0, ref curve)) { return; } FemDesign.Materials.Material material = null; - if (!DA.GetData(1, ref material)) - { - material = FemDesign.Materials.MaterialDatabase.GetDefault().MaterialByName("C30/37"); - } + if (!DA.GetData(1, ref material)) { return; } List sections = new List(); - if (!DA.GetDataList(2, sections)) - { - sections = new List(); - sections.Add(FemDesign.Sections.SectionDatabase.GetDefault().SectionByName("Concrete sections, Rectangle, 250x600")); - } + if (!DA.GetDataList(2, sections)) { return; } List connectivities = new List(); if (!DA.GetDataList(3, connectivities)) @@ -122,7 +113,7 @@ protected override System.Drawing.Bitmap Icon } public override Guid ComponentGuid { - get { return new Guid("135b6331-bf19-4d89-9e81-9e5e0d137f67"); } + get { return new Guid("{ED5BB11A-1A9A-438E-9BD3-A2283DB9C025}"); } } public override GH_Exposure Exposure => GH_Exposure.primary; diff --git a/FemDesign.Grasshopper/Bars/BarsColumn.cs b/FemDesign.Grasshopper/Bars/BarsColumn.cs index 32ddb83ff..db54697b4 100644 --- a/FemDesign.Grasshopper/Bars/BarsColumn.cs +++ b/FemDesign.Grasshopper/Bars/BarsColumn.cs @@ -7,63 +7,54 @@ namespace FemDesign.Grasshopper { - public class BarsColumn: GH_Component + public class BarsColumn : GH_Component { - public BarsColumn(): base("Bars.Column", "Column", "Create a bar element of type column.", CategoryName.Name(), - SubCategoryName.Cat2a()) + public BarsColumn() : base("Bars.Column", "Column", "Create a bar element of type column.", CategoryName.Name(), + SubCategoryName.Cat2a()) { - } - protected override void RegisterInputParams(GH_InputParamManager pManager) - { - pManager.AddCurveParameter("Line", "Line", "Line. Local x of line must equal positive global Z.", GH_ParamAccess.item); - pManager.AddGenericParameter("Material", "Material", "Material.", GH_ParamAccess.item); - pManager[pManager.ParamCount - 1].Optional = true; + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddCurveParameter("Line", "Line", "Line. Local x of line must equal positive global Z.", GH_ParamAccess.item); + pManager.AddGenericParameter("Material", "Material", "Material.", GH_ParamAccess.item); pManager.AddGenericParameter("Section", "Section", "Section. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end.", GH_ParamAccess.list); - pManager[pManager.ParamCount - 1].Optional = true; pManager.AddGenericParameter("Connectivity", "Connectivity", "Connectivity. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end. Optional, default value if undefined.", GH_ParamAccess.list); - pManager[pManager.ParamCount - 1].Optional = true; - pManager.AddGenericParameter("Eccentricity", "Eccentricity", "Eccentricity. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end. Optional, default value if undefined.", GH_ParamAccess.list); - pManager[pManager.ParamCount - 1].Optional = true; - pManager.AddVectorParameter("LocalY", "LocalY", "Set local y-axis. Vector must be perpendicular to Curve mid-point local x-axis. This parameter overrides OrientLCS", GH_ParamAccess.item); - pManager[pManager.ParamCount - 1].Optional = true; - pManager.AddBooleanParameter("OrientLCS", "OrientLCS", "Orient LCS to GCS? If true the LCS of this object will be oriented to the GCS trying to align local z to global z if possible or align local y to global y if possible (if object is vertical). If false local y-axis from Curve coordinate system at mid-point will be used.", GH_ParamAccess.item, true); - pManager.AddTextParameter("Identifier", "Identifier", "Identifier. Optional, default value if undefined.", GH_ParamAccess.item, "C"); - pManager[pManager.ParamCount - 1].Optional = true; - } - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { - pManager.AddGenericParameter("Bar", "Bar", "Bar.", GH_ParamAccess.item); - } - protected override void SolveInstance(IGH_DataAccess DA) - { - // get input + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("Eccentricity", "Eccentricity", "Eccentricity. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end. Optional, default value if undefined.", GH_ParamAccess.list); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddVectorParameter("LocalY", "LocalY", "Set local y-axis. Vector must be perpendicular to Curve mid-point local x-axis. This parameter overrides OrientLCS", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("OrientLCS", "OrientLCS", "Orient LCS to GCS? If true the LCS of this object will be oriented to the GCS trying to align local z to global z if possible or align local y to global y if possible (if object is vertical). If false local y-axis from Curve coordinate system at mid-point will be used.", GH_ParamAccess.item, true); + pManager.AddTextParameter("Identifier", "Identifier", "Identifier. Optional, default value if undefined.", GH_ParamAccess.item, "C"); + pManager[pManager.ParamCount - 1].Optional = true; + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Bar", "Bar", "Bar.", GH_ParamAccess.item); + } + protected override void SolveInstance(IGH_DataAccess DA) + { + // get input Curve curve = null; if (!DA.GetData(0, ref curve)) { return; } FemDesign.Materials.Material material = null; - if (!DA.GetData(1, ref material)) - { - material = FemDesign.Materials.MaterialDatabase.GetDefault().MaterialByName("C30/37"); - } + if (!DA.GetData(1, ref material)) { return; } List sections = new List(); - if (!DA.GetDataList(2, sections)) - { - sections = new List(); - sections.Add(FemDesign.Sections.SectionDatabase.GetDefault().SectionByName("Concrete sections, Rectangle, 250x600")); - } + if (!DA.GetDataList(2, sections)) { return; } List connectivities = new List(); if (!DA.GetDataList(3, connectivities)) { - connectivities = new List{FemDesign.Bars.Connectivity.Rigid}; + connectivities = new List { FemDesign.Bars.Connectivity.Rigid }; } List eccentricities = new List(); if (!DA.GetDataList(4, eccentricities)) { - eccentricities = new List{FemDesign.Bars.Eccentricity.Default}; + eccentricities = new List { FemDesign.Bars.Eccentricity.Default }; } Vector3d v = Vector3d.Zero; @@ -92,9 +83,9 @@ protected override void SolveInstance(IGH_DataAccess DA) FemDesign.Geometry.Edge edge = Convert.FromRhinoLineCurve((LineCurve)curve); // create bar - var type = FemDesign.Bars.BarType.Column; + var type = FemDesign.Bars.BarType.Column; FemDesign.Bars.Bar bar = new FemDesign.Bars.Bar(edge, type, material, sections.ToArray(), eccentricities.ToArray(), connectivities.ToArray(), identifier); - + // set local y-axis if (!v.Equals(Vector3d.Zero)) { @@ -105,26 +96,26 @@ protected override void SolveInstance(IGH_DataAccess DA) else { if (orientLCS) - { + { bar.BarPart.OrientCoordinateSystemToGCS(); } } - + // output DA.SetData(0, bar); - } - protected override System.Drawing.Bitmap Icon - { - get - { + } + protected override System.Drawing.Bitmap Icon + { + get + { return FemDesign.Properties.Resources.ColumnDefine; - } - } - public override Guid ComponentGuid - { - get { return new Guid("3105b98e-ed85-46f4-9295-ed1d0d1af432"); } - } + } + } + public override Guid ComponentGuid + { + get { return new Guid("{5001B207-03E3-4571-A012-A05B7AC3F717}"); } + } public override GH_Exposure Exposure => GH_Exposure.primary; } diff --git a/FemDesign.Grasshopper/Bars/BarsConnectivityConstruct.cs b/FemDesign.Grasshopper/Bars/BarsConnectivityConstruct.cs index 6da8f3b04..2694cda70 100644 --- a/FemDesign.Grasshopper/Bars/BarsConnectivityConstruct.cs +++ b/FemDesign.Grasshopper/Bars/BarsConnectivityConstruct.cs @@ -14,9 +14,9 @@ public class BarsConnectivityConstruct: GH_Component } protected override void RegisterInputParams(GH_InputParamManager pManager) { - pManager.AddBooleanParameter("m_x", "m_x", "Translation local-x axis. True if rigid, false if free.", GH_ParamAccess.item); - pManager.AddBooleanParameter("m_y", "m_z", "Translation local-y axis. True if rigid, false if free.", GH_ParamAccess.item); - pManager.AddBooleanParameter("m_z", "m_z", "Translation local-z axis. True if rigid, false if free.", GH_ParamAccess.item); + pManager.AddBooleanParameter("t_x", "t_x", "Translation local-x axis. True if rigid, false if free.", GH_ParamAccess.item); + pManager.AddBooleanParameter("t_y", "t_y", "Translation local-y axis. True if rigid, false if free.", GH_ParamAccess.item); + pManager.AddBooleanParameter("t_z", "t_z", "Translation local-z axis. True if rigid, false if free.", GH_ParamAccess.item); pManager.AddBooleanParameter("r_x", "r_x", "Rotation around local-x axis. True if rigid, false if free.", GH_ParamAccess.item); pManager.AddBooleanParameter("r_y", "r_y", "Rotation around local-y axis. True if rigid, false if free.", GH_ParamAccess.item); pManager.AddBooleanParameter("r_z", "r_z", "Rotation around local-z axis. True if rigid, false if free.", GH_ParamAccess.item); @@ -28,16 +28,16 @@ protected override void RegisterOutputParams(GH_OutputParamManager pManager) protected override void SolveInstance(IGH_DataAccess DA) { // get indata - bool m_x = false, m_y = false, m_z = false, r_x = false, r_y = false, r_z = false; - if (!DA.GetData(0, ref m_x)) { return; } - if (!DA.GetData(1, ref m_y)) { return; } - if (!DA.GetData(2, ref m_z)) { return; } + bool t_x = false, t_y = false, t_z = false, r_x = false, r_y = false, r_z = false; + if (!DA.GetData(0, ref t_x)) { return; } + if (!DA.GetData(1, ref t_y)) { return; } + if (!DA.GetData(2, ref t_z)) { return; } if (!DA.GetData(3, ref r_x)) { return; } if (!DA.GetData(4, ref r_y)) { return; } if (!DA.GetData(5, ref r_z)) { return; } // return - DA.SetData(0, new FemDesign.Bars.Connectivity(m_x, m_y, m_z, r_x, r_y, r_z)); + DA.SetData(0, new FemDesign.Bars.Connectivity(t_x, t_y, t_z, r_x, r_y, r_z)); } protected override System.Drawing.Bitmap Icon { diff --git a/FemDesign.Grasshopper/Bars/BarsConnectivityDefineSemiRigid.cs b/FemDesign.Grasshopper/Bars/BarsConnectivityDefineSemiRigid.cs index 410b98d1a..0431f006f 100644 --- a/FemDesign.Grasshopper/Bars/BarsConnectivityDefineSemiRigid.cs +++ b/FemDesign.Grasshopper/Bars/BarsConnectivityDefineSemiRigid.cs @@ -14,11 +14,11 @@ public class BarsConnectivityDefineSemiRigid: GH_Component } protected override void RegisterInputParams(GH_InputParamManager pManager) { - pManager.AddNumberParameter("m_x", "m_x", "Release stiffness. Translation local-x axis. Optional, default value is fully rigid. [kN/m]", GH_ParamAccess.item); + pManager.AddNumberParameter("t_x", "t_x", "Release stiffness. Translation local-x axis. Optional, default value is fully rigid. [kN/m]", GH_ParamAccess.item); pManager[pManager.ParamCount -1].Optional = true; - pManager.AddNumberParameter("m_y", "m_z", "Release stiffness. Translation local-y axis. Optional, default value is fully rigid. [kN/m]", GH_ParamAccess.item); + pManager.AddNumberParameter("t_y", "t_z", "Release stiffness. Translation local-y axis. Optional, default value is fully rigid. [kN/m]", GH_ParamAccess.item); pManager[pManager.ParamCount -1].Optional = true; - pManager.AddNumberParameter("m_z", "m_z", "Release stiffness. Translation local-z axis. Optional, default value is fully rigid. [kN/m]", GH_ParamAccess.item); + pManager.AddNumberParameter("t_z", "t_z", "Release stiffness. Translation local-z axis. Optional, default value is fully rigid. [kN/m]", GH_ParamAccess.item); pManager[pManager.ParamCount -1].Optional = true; pManager.AddNumberParameter("r_x", "r_x", "Release stiffness. Rotation around local-x axis. Optional, default value is fully rigid. [kNm/rad]", GH_ParamAccess.item); pManager[pManager.ParamCount -1].Optional = true; diff --git a/FemDesign.Grasshopper/Bars/BarsModify.cs b/FemDesign.Grasshopper/Bars/BarsModify.cs index 0e34655f0..1a5324c38 100644 --- a/FemDesign.Grasshopper/Bars/BarsModify.cs +++ b/FemDesign.Grasshopper/Bars/BarsModify.cs @@ -117,8 +117,7 @@ protected override void SolveInstance(IGH_DataAccess DA) string identifier = null; if (DA.GetData(9, ref identifier)) { - bar.Name = identifier; - bar.BarPart.Name = bar.Name; + bar.Identifier = identifier; } // output diff --git a/FemDesign.Grasshopper/Bars/BarsTruss.cs b/FemDesign.Grasshopper/Bars/BarsTruss.cs index 53db50274..47d6200e0 100644 --- a/FemDesign.Grasshopper/Bars/BarsTruss.cs +++ b/FemDesign.Grasshopper/Bars/BarsTruss.cs @@ -16,9 +16,7 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) { pManager.AddCurveParameter("Line", "Line", "LineCurve", GH_ParamAccess.item); pManager.AddGenericParameter("Material", "Material", "Material.", GH_ParamAccess.item); - pManager[pManager.ParamCount - 1].Optional = true; pManager.AddGenericParameter("Section", "Section", "Section.", GH_ParamAccess.item); - pManager[pManager.ParamCount - 1].Optional = true; pManager.AddVectorParameter("LocalY", "LocalY", "Set local y-axis. Vector must be perpendicular to Curve mid-point local x-axis. This parameter overrides OrientLCS", GH_ParamAccess.item); pManager[pManager.ParamCount - 1].Optional = true; pManager.AddBooleanParameter("OrientLCS", "OrientLCS", "Orient LCS to GCS? If true the LCS of this object will be oriented to the GCS trying to align local z to global z if possible or align local y to global y if possible (if object is vertical). If false local y-axis from Curve coordinate system at mid-point will be used.", GH_ParamAccess.item, true); @@ -37,16 +35,10 @@ protected override void SolveInstance(IGH_DataAccess DA) if (!DA.GetData(0, ref curve)) { return; } FemDesign.Materials.Material material = null; - if (!DA.GetData(1, ref material)) - { - material = FemDesign.Materials.MaterialDatabase.GetDefault().MaterialByName("C30/37"); - } + if (!DA.GetData(1, ref material)) { return; } FemDesign.Sections.Section section = null; - if (!DA.GetData(2, ref section)) - { - section = FemDesign.Sections.SectionDatabase.GetDefault().SectionByName("Concrete sections, Rectangle, 250x600"); - } + if (!DA.GetData(2, ref section)) { return; } Vector3d v = Vector3d.Zero; if (!DA.GetData(3, ref v)) @@ -103,7 +95,7 @@ protected override System.Drawing.Bitmap Icon } public override Guid ComponentGuid { - get { return new Guid("bfc07633-529a-4a98-a45b-ce657e916f83"); } + get { return new Guid("{EC481150-B491-406E-8549-92625E18FBEC}"); } } public override GH_Exposure Exposure => GH_Exposure.primary; diff --git a/FemDesign.Grasshopper/Bars/BarsTrussLimitedCapacity.cs b/FemDesign.Grasshopper/Bars/BarsTrussLimitedCapacity.cs index da0ea5c29..2c50279de 100644 --- a/FemDesign.Grasshopper/Bars/BarsTrussLimitedCapacity.cs +++ b/FemDesign.Grasshopper/Bars/BarsTrussLimitedCapacity.cs @@ -82,7 +82,7 @@ protected override void SolveInstance(IGH_DataAccess DA) FemDesign.Geometry.Edge edge = Convert.FromRhinoLineCurve((LineCurve)curve); // bar - FemDesign.Bars.Bar bar = new FemDesign.Bars.Bar(edge, material, section, identifier: identifier); + FemDesign.Bars.Bar bar = Bars.Bar.Truss(edge, material, section, identifier); bar.MaxCompression = maxCompression; bar.MaxTension = maxTension; bar.CompressionPlasticity = compressionPlasticity; diff --git a/FemDesign.Grasshopper/Bars/OBSOLETE/BarsBeam_OBSOLETE.cs b/FemDesign.Grasshopper/Bars/OBSOLETE/BarsBeam_OBSOLETE.cs new file mode 100644 index 000000000..cca0bbbb4 --- /dev/null +++ b/FemDesign.Grasshopper/Bars/OBSOLETE/BarsBeam_OBSOLETE.cs @@ -0,0 +1,130 @@ +// https://strusoft.com/ +using System; +using System.Collections.Generic; +using System.Linq; +using Grasshopper.Kernel; +using Rhino.Geometry; + +namespace FemDesign.Grasshopper +{ + public class BarsBeam_OBSOLETE : GH_Component + { + public BarsBeam_OBSOLETE() : base("Bars.Beam", "Beam", "Create a bar element of type beam.", + CategoryName.Name(), + SubCategoryName.Cat2a()) + { + + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddCurveParameter("Curve", "Curve", "LineCurve or ArcCurve", GH_ParamAccess.item); + pManager.AddGenericParameter("Material", "Material", "Material.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("Section", "Section", "Section. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end.", GH_ParamAccess.list); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("Connectivity", "Connectivity", "Connectivity. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end. Optional, default value if undefined.", GH_ParamAccess.list); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("Eccentricity", "Eccentricity", "Eccentricity. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end. Optional, default value if undefined.", GH_ParamAccess.list); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddVectorParameter("LocalY", "LocalY", "Set local y-axis. Vector must be perpendicular to Curve mid-point local x-axis. This parameter overrides OrientLCS", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("OrientLCS", "OrientLCS", "Orient LCS to GCS? If true the LCS of this object will be oriented to the GCS trying to align local z to global z if possible or align local y to global y if possible (if object is vertical). If false local y-axis from Curve coordinate system at mid-point will be used.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddTextParameter("Identifier", "Identifier", "Identifier. Optional, default value if undefined.", GH_ParamAccess.item, "B"); + pManager[pManager.ParamCount - 1].Optional = true; + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Bar", "Bar", "Bar.", GH_ParamAccess.item); + } + protected override void SolveInstance(IGH_DataAccess DA) + { + // get input + Curve curve = null; + if (!DA.GetData(0, ref curve)) { return; } + + FemDesign.Materials.Material material = null; + if (!DA.GetData(1, ref material)) + { + material = FemDesign.Materials.MaterialDatabase.GetDefault().MaterialByName("C30/37"); + } + + List sections = new List(); + if (!DA.GetDataList(2, sections)) + { + sections = new List(); + sections.Add(FemDesign.Sections.SectionDatabase.GetDefault().SectionByName("Concrete sections, Rectangle, 250x600")); + } + + List connectivities = new List(); + if (!DA.GetDataList(3, connectivities)) + { + connectivities = new List { FemDesign.Bars.Connectivity.Rigid }; + } + + List eccentricities = new List(); + if (!DA.GetDataList(4, eccentricities)) + { + eccentricities = new List { FemDesign.Bars.Eccentricity.Default }; + } + + Vector3d v = Vector3d.Zero; + if (!DA.GetData(5, ref v)) + { + // pass + } + + bool orientLCS = true; + if (!DA.GetData(6, ref orientLCS)) + { + // pass + } + + string identifier = "B"; + if (!DA.GetData(7, ref identifier)) + { + // pass + } + + + // convert geometry + FemDesign.Geometry.Edge edge = Convert.FromRhinoLineOrArc2(curve); + + // create bar + var type = FemDesign.Bars.BarType.Beam; + FemDesign.Bars.Bar bar = new FemDesign.Bars.Bar(edge, type, material, sections.ToArray(), eccentricities.ToArray(), connectivities.ToArray(), identifier); + + // set local y-axis + if (!v.Equals(Vector3d.Zero)) + { + bar.BarPart.LocalY = v.FromRhino(); + } + + // else orient coordinate system to GCS + else + { + if (orientLCS) + { + bar.BarPart.OrientCoordinateSystemToGCS(); + } + } + + // output + DA.SetData(0, bar); + + } + protected override System.Drawing.Bitmap Icon + { + get + { + return FemDesign.Properties.Resources.BeamDefine; + } + } + public override Guid ComponentGuid + { + get { return new Guid("135b6331-bf19-4d89-9e81-9e5e0d137f67"); } + } + public override GH_Exposure Exposure => GH_Exposure.hidden; + + } +} \ No newline at end of file diff --git a/FemDesign.Grasshopper/Bars/OBSOLETE/BarsColumn_OBSOLETE.cs b/FemDesign.Grasshopper/Bars/OBSOLETE/BarsColumn_OBSOLETE.cs new file mode 100644 index 000000000..7b36e49ff --- /dev/null +++ b/FemDesign.Grasshopper/Bars/OBSOLETE/BarsColumn_OBSOLETE.cs @@ -0,0 +1,131 @@ +// https://strusoft.com/ +using System; +using System.Collections.Generic; +using System.Linq; +using Grasshopper.Kernel; +using Rhino.Geometry; + +namespace FemDesign.Grasshopper +{ + public class BarsColumn_OBSOLETE: GH_Component + { + public BarsColumn_OBSOLETE(): base("Bars.Column", "Column", "Create a bar element of type column.", CategoryName.Name(), + SubCategoryName.Cat2a()) + { + + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddCurveParameter("Line", "Line", "Line. Local x of line must equal positive global Z.", GH_ParamAccess.item); + pManager.AddGenericParameter("Material", "Material", "Material.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("Section", "Section", "Section. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end.", GH_ParamAccess.list); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("Connectivity", "Connectivity", "Connectivity. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end. Optional, default value if undefined.", GH_ParamAccess.list); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("Eccentricity", "Eccentricity", "Eccentricity. If 1 item this item defines both start and end. If two items the first item defines the start and the last item defines the end. Optional, default value if undefined.", GH_ParamAccess.list); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddVectorParameter("LocalY", "LocalY", "Set local y-axis. Vector must be perpendicular to Curve mid-point local x-axis. This parameter overrides OrientLCS", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("OrientLCS", "OrientLCS", "Orient LCS to GCS? If true the LCS of this object will be oriented to the GCS trying to align local z to global z if possible or align local y to global y if possible (if object is vertical). If false local y-axis from Curve coordinate system at mid-point will be used.", GH_ParamAccess.item, true); + pManager.AddTextParameter("Identifier", "Identifier", "Identifier. Optional, default value if undefined.", GH_ParamAccess.item, "C"); + pManager[pManager.ParamCount - 1].Optional = true; + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Bar", "Bar", "Bar.", GH_ParamAccess.item); + } + protected override void SolveInstance(IGH_DataAccess DA) + { + // get input + Curve curve = null; + if (!DA.GetData(0, ref curve)) { return; } + + FemDesign.Materials.Material material = null; + if (!DA.GetData(1, ref material)) + { + material = FemDesign.Materials.MaterialDatabase.GetDefault().MaterialByName("C30/37"); + } + + List sections = new List(); + if (!DA.GetDataList(2, sections)) + { + sections = new List(); + sections.Add(FemDesign.Sections.SectionDatabase.GetDefault().SectionByName("Concrete sections, Rectangle, 250x600")); + } + + List connectivities = new List(); + if (!DA.GetDataList(3, connectivities)) + { + connectivities = new List{FemDesign.Bars.Connectivity.Rigid}; + } + + List eccentricities = new List(); + if (!DA.GetDataList(4, eccentricities)) + { + eccentricities = new List{FemDesign.Bars.Eccentricity.Default}; + } + + Vector3d v = Vector3d.Zero; + if (!DA.GetData(5, ref v)) + { + // pass + } + + bool orientLCS = true; + if (!DA.GetData(6, ref orientLCS)) + { + // pass + } + + string identifier = "C"; + if (!DA.GetData(7, ref identifier)) + { + // pass + } + + // convert geometry + if (curve.GetType() != typeof(LineCurve)) + { + throw new System.ArgumentException("Curve must be a LineCurve"); + } + FemDesign.Geometry.Edge edge = Convert.FromRhinoLineCurve((LineCurve)curve); + + // create bar + var type = FemDesign.Bars.BarType.Column; + FemDesign.Bars.Bar bar = new FemDesign.Bars.Bar(edge, type, material, sections.ToArray(), eccentricities.ToArray(), connectivities.ToArray(), identifier); + + // set local y-axis + if (!v.Equals(Vector3d.Zero)) + { + bar.BarPart.LocalY = v.FromRhino(); + } + + // else orient coordinate system to GCS + else + { + if (orientLCS) + { + bar.BarPart.OrientCoordinateSystemToGCS(); + } + } + + // output + DA.SetData(0, bar); + + } + protected override System.Drawing.Bitmap Icon + { + get + { + return FemDesign.Properties.Resources.ColumnDefine; + } + } + public override Guid ComponentGuid + { + get { return new Guid("3105b98e-ed85-46f4-9295-ed1d0d1af432"); } + } + + public override GH_Exposure Exposure => GH_Exposure.hidden; + } +} \ No newline at end of file diff --git a/FemDesign.Grasshopper/Bars/OBSOLETE/BarsTruss_OBSOLETE.cs b/FemDesign.Grasshopper/Bars/OBSOLETE/BarsTruss_OBSOLETE.cs new file mode 100644 index 000000000..1193f3844 --- /dev/null +++ b/FemDesign.Grasshopper/Bars/OBSOLETE/BarsTruss_OBSOLETE.cs @@ -0,0 +1,111 @@ +// https://strusoft.com/ +using System; +using Grasshopper.Kernel; +using Rhino.Geometry; + +namespace FemDesign.Grasshopper +{ + public class BarsTruss_OBSOLETE: GH_Component + { + public BarsTruss_OBSOLETE(): base("Bars.Truss", "Truss", "Create a bar element of type truss.", CategoryName.Name(), + SubCategoryName.Cat2a()) + { + + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddCurveParameter("Line", "Line", "LineCurve", GH_ParamAccess.item); + pManager.AddGenericParameter("Material", "Material", "Material.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("Section", "Section", "Section.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddVectorParameter("LocalY", "LocalY", "Set local y-axis. Vector must be perpendicular to Curve mid-point local x-axis. This parameter overrides OrientLCS", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("OrientLCS", "OrientLCS", "Orient LCS to GCS? If true the LCS of this object will be oriented to the GCS trying to align local z to global z if possible or align local y to global y if possible (if object is vertical). If false local y-axis from Curve coordinate system at mid-point will be used.", GH_ParamAccess.item, true); + pManager.AddTextParameter("Identifier", "Identifier", "Identifier. Optional, default value if undefined.", GH_ParamAccess.item, "T"); + pManager[pManager.ParamCount - 1].Optional = true; + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Bar", "Bar", "Bar.", GH_ParamAccess.item); + } + protected override void SolveInstance(IGH_DataAccess DA) + { + // get input + + Curve curve = null; + if (!DA.GetData(0, ref curve)) { return; } + + FemDesign.Materials.Material material = null; + if (!DA.GetData(1, ref material)) + { + material = FemDesign.Materials.MaterialDatabase.GetDefault().MaterialByName("C30/37"); + } + + FemDesign.Sections.Section section = null; + if (!DA.GetData(2, ref section)) + { + section = FemDesign.Sections.SectionDatabase.GetDefault().SectionByName("Concrete sections, Rectangle, 250x600"); + } + + Vector3d v = Vector3d.Zero; + if (!DA.GetData(3, ref v)) + { + // pass + } + + bool orientLCS = true; + if (!DA.GetData(4, ref orientLCS)) + { + // pass + } + + string identifier = "T"; + if (!DA.GetData(5, ref identifier)) + { + // pass + } + + // convert geometry + if (curve.GetType() != typeof(LineCurve)) + { + throw new System.ArgumentException("Curve must be a LineCurve"); + } + FemDesign.Geometry.Edge edge = Convert.FromRhinoLineCurve((LineCurve)curve); + + // bar + FemDesign.Bars.Bar bar = new Bars.Truss(edge, material, section, identifier); + + // set local y-axis + if (!v.Equals(Vector3d.Zero)) + { + bar.BarPart.LocalY = v.FromRhino(); + } + + // else orient coordinate system to GCS + else + { + if (orientLCS) + { + bar.BarPart.OrientCoordinateSystemToGCS(); + } + } + + // return + DA.SetData(0, bar); + } + protected override System.Drawing.Bitmap Icon + { + get + { + return FemDesign.Properties.Resources.TrussDefine; + } + } + public override Guid ComponentGuid + { + get { return new Guid("bfc07633-529a-4a98-a45b-ce657e916f83"); } + } + public override GH_Exposure Exposure => GH_Exposure.hidden; + + } +} \ No newline at end of file diff --git a/FemDesign.Grasshopper/Calculate/ApplicationRunAnalysis.cs b/FemDesign.Grasshopper/Calculate/ApplicationRunAnalysis.cs index a6fff2899..d6659d023 100644 --- a/FemDesign.Grasshopper/Calculate/ApplicationRunAnalysis.cs +++ b/FemDesign.Grasshopper/Calculate/ApplicationRunAnalysis.cs @@ -17,7 +17,7 @@ public ModelRunAnalysis() : base("Application.RunAnalysis", "RunAnalysis", "Run protected override void RegisterInputParams(GH_InputParamManager pManager) { pManager.AddGenericParameter("FdModel", "FdModel", "FdModel to open.", GH_ParamAccess.item); - pManager.AddTextParameter("FilePathStruxml", "FilePathStruxml", "File path where to save the model as .struxml.\nIf not specified, the file will be saved using the name and location folder of your .gh script.", GH_ParamAccess.item); + pManager.AddTextParameter("FilePathStruxml", "FilePath", "File path where to save the model as .struxml.\nIf not specified, the file will be saved using the name and location folder of your .gh script.", GH_ParamAccess.item); pManager[pManager.ParamCount - 1].Optional = true; pManager.AddGenericParameter("Analysis", "Analysis", "Analysis.", GH_ParamAccess.item); pManager.AddTextParameter("ResultTypes", "ResultTypes", "Results to be extracted from model. This might require the model to have been analysed. Item or list.", GH_ParamAccess.list); diff --git a/FemDesign.Grasshopper/ConstructionStages/ActivatedLoadCase.cs b/FemDesign.Grasshopper/ConstructionStages/ActivatedLoadCase.cs index f28424816..a9b62b50c 100644 --- a/FemDesign.Grasshopper/ConstructionStages/ActivatedLoadCase.cs +++ b/FemDesign.Grasshopper/ConstructionStages/ActivatedLoadCase.cs @@ -4,6 +4,10 @@ using Grasshopper.Kernel; using Rhino.Geometry; using FemDesign.Loads; +using System.Linq; +using Grasshopper.Kernel.Special; + +using FemDesign.Grasshopper.Extension.ComponentExtension; namespace FemDesign.Grasshopper { @@ -19,7 +23,7 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) pManager.AddGenericParameter("LoadCase", "LoadCase", "LoadCase to be activated.\n\nLoadCase may also be \"PTC T0\" or \"PTC T8\" to activate a PTC load", GH_ParamAccess.item); pManager.AddNumberParameter("Factor", "Factor", "Factor", GH_ParamAccess.item, 1.0); pManager[pManager.ParamCount - 1].Optional = true; - pManager.AddIntegerParameter("Partitioning", "Partitioning", "0 - only_in_this_stage\n1 - from_this_stage_on\n2 - shifted_from_first_stage\n3 - only_stage_activated_elem.\nDefault: from_this_stage_on.", GH_ParamAccess.item, 1); + pManager.AddTextParameter("Partitioning", "Partitioning", "Connect 'ValueList' to get the options.\n0 - only_in_this_stage\n1 - from_this_stage_on\n2 - shifted_from_first_stage\n3 - only_stage_activated_elem.\nDefault: from_this_stage_on.", GH_ParamAccess.item, "from_this_stage_on"); pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -39,14 +43,10 @@ protected override void SolveInstance(IGH_DataAccess DA) double factor = 1; DA.GetData(1, ref factor); - int partitioning = 1; - ActivationType type = (ActivationType)partitioning; //from_this_stage_on + string partitioning = "1"; DA.GetData(2, ref partitioning); - if (Enum.IsDefined(typeof(ActivationType), partitioning)) - { - type = (ActivationType)partitioning; - } + ActivationType type = FemDesign.GenericClasses.EnumParser.Parse(partitioning); FemDesign.ActivatedLoadCase activatedLoadCase; if (isLoadCase) @@ -61,6 +61,13 @@ protected override void SolveInstance(IGH_DataAccess DA) DA.SetData(0, activatedLoadCase); } + protected override void BeforeSolveInstance() + { + var resultTypes = Enum.GetNames(typeof(ActivationType)).ToList(); + ValueListUtils.updateValueLists(this, 2, resultTypes, null); + + } + protected override System.Drawing.Bitmap Icon { get diff --git a/FemDesign.Grasshopper/ConstructionStages/Stage.cs b/FemDesign.Grasshopper/ConstructionStages/Stage.cs index 8f0f1f21b..11d6db5ef 100644 --- a/FemDesign.Grasshopper/ConstructionStages/Stage.cs +++ b/FemDesign.Grasshopper/ConstructionStages/Stage.cs @@ -9,9 +9,9 @@ namespace FemDesign.Grasshopper { - public class Stage : GH_Component + public class StageComponent : GH_Component { - public Stage() : base("Stage", "Stage", "Creates a construction stage.", CategoryName.Name(), + public StageComponent() : base("Stage", "Stage", "Creates a construction stage.", CategoryName.Name(), SubCategoryName.Cat7a()) { @@ -30,7 +30,7 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) } protected override void RegisterOutputParams(GH_OutputParamManager pManager) { - pManager.AddGenericParameter("Stages", "Stages", "", GH_ParamAccess.item); + pManager.AddGenericParameter("Stage", "Stage", "", GH_ParamAccess.item); } protected override void SolveInstance(IGH_DataAccess DA) { diff --git a/FemDesign.Grasshopper/Deconstruct/LineStressLoadDeconstruct.cs b/FemDesign.Grasshopper/Deconstruct/LineStressLoadDeconstruct.cs new file mode 100644 index 000000000..4be0755db --- /dev/null +++ b/FemDesign.Grasshopper/Deconstruct/LineStressLoadDeconstruct.cs @@ -0,0 +1,57 @@ +// https://strusoft.com/ +using System; +using Grasshopper.Kernel; + +namespace FemDesign.Grasshopper +{ + public class LineStressLoadDeconstruct : GH_Component + { + public LineStressLoadDeconstruct() : base("LineStressLoad.Deconstruct", "Deconstruct", "Deconstruct a LineStressLoad.", "FEM-Design", "Deconstruct") + { + + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("LineStressLoad", "LineStressLoad", "Line stress load. Use SortLoads to extract LineStressLoads.", GH_ParamAccess.item); + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddTextParameter("Guid", "Guid", "Guid.", GH_ParamAccess.item); + pManager.AddCurveParameter("Curve", "Curve", "Curve.", GH_ParamAccess.item); + pManager.AddVectorParameter("Direction", "Direction", "Direction.", GH_ParamAccess.item); + pManager.AddNumberParameter("n1", "n1", "Force at start.", GH_ParamAccess.item); + pManager.AddNumberParameter("n2", "n2", "Force at end.", GH_ParamAccess.item); + pManager.AddNumberParameter("m1", "m1", "Moment at start.", GH_ParamAccess.item); + pManager.AddNumberParameter("m2", "m2", "Moment at end.", GH_ParamAccess.item); + pManager.AddTextParameter("LoadCaseGuid", "LoadCaseGuid", "LoadCase guid reference.", GH_ParamAccess.item); + pManager.AddTextParameter("Comment", "Comment", "Comment.", GH_ParamAccess.item); + } + protected override void SolveInstance(IGH_DataAccess DA) + { + // get input + FemDesign.Loads.LineStressLoad stressLoad = null; + if (!DA.GetData(0, ref stressLoad)) + { + return; + } + if (stressLoad == null) + { + return; + } + + DA.SetData("Guid", stressLoad.LoadCaseGuid); + DA.SetData("Curve", stressLoad.Edge.ToRhino()); + DA.SetData("Direction", stressLoad.Direction.ToRhino()); + DA.SetData("n1", stressLoad.TopBotLocVal[0].TopVal); + DA.SetData("m1", stressLoad.TopBotLocVal[0].BottomVal); + DA.SetData("n2", stressLoad.TopBotLocVal[1].TopVal); + DA.SetData("m2", stressLoad.TopBotLocVal[1].BottomVal); + DA.SetData("LoadCaseGuid", stressLoad.LoadCaseGuid); + DA.SetData("Comment", stressLoad.Comment); + } + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.LineStressLoadDeconstruct; + public override Guid ComponentGuid => new Guid("6b4b792a-a7cc-44de-af6a-5e30a9429fa1"); + public override GH_Exposure Exposure => GH_Exposure.quarternary; + + } +} \ No newline at end of file diff --git a/FemDesign.Grasshopper/Deconstruct/LoadCombinationDeconstruct.cs b/FemDesign.Grasshopper/Deconstruct/LoadCombinationDeconstruct.cs index b1fe2f47b..7d725dc45 100644 --- a/FemDesign.Grasshopper/Deconstruct/LoadCombinationDeconstruct.cs +++ b/FemDesign.Grasshopper/Deconstruct/LoadCombinationDeconstruct.cs @@ -1,30 +1,32 @@ // https://strusoft.com/ using System; +using System.Linq; using System.Collections.Generic; using Grasshopper.Kernel; namespace FemDesign.Grasshopper { - public class LoadCombinationDeconstruct: GH_Component + public class LoadCombinationDeconstruct : GH_Component { - public LoadCombinationDeconstruct(): base("LoadCombination.Deconstruct", "Deconstruct", "Deconstruct a LoadCombination.", "FEM-Design", "Deconstruct") - { + public LoadCombinationDeconstruct() : base("LoadCombination.Deconstruct", "Deconstruct", "Deconstruct a LoadCombination.", "FEM-Design", "Deconstruct") + { - } - protected override void RegisterInputParams(GH_InputParamManager pManager) - { - pManager.AddGenericParameter("LoadCombination", "LoadCombination", "LoadCombination.", GH_ParamAccess.item); - } - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { - pManager.AddTextParameter("Guid", "Guid", "Guid.", GH_ParamAccess.list); - pManager.AddTextParameter("Name", "Name", "Name.", GH_ParamAccess.list); - pManager.AddTextParameter("Type", "Type", "Type." , GH_ParamAccess.list); - pManager.AddTextParameter("LoadCases", "LoadCases", "LoadCases.", GH_ParamAccess.list); - pManager.AddNumberParameter("Gammas", "Gammas", "Gammas.", GH_ParamAccess.list); - } - protected override void SolveInstance(IGH_DataAccess DA) - { + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("LoadCombination", "LoadCombination", "LoadCombination.", GH_ParamAccess.item); + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddTextParameter("Guid", "Guid", "Guid.", GH_ParamAccess.list); + pManager.AddTextParameter("Name", "Name", "Name.", GH_ParamAccess.list); + pManager.AddTextParameter("Type", "Type", "Type.", GH_ParamAccess.list); + pManager.AddGenericParameter("LoadCases", "LoadCases", "LoadCases. Note that load cases may also include a single construction stage and any single of the special load cases such as seisemic, PTC or Neg. shaft friction load case.", GH_ParamAccess.list); + pManager.AddNumberParameter("Gammas", "Gammas", "Gammas.", GH_ParamAccess.list); + pManager.AddTextParameter("LoadCaseTypes", "LoadCaseTypes", "Load case types. One of 'Load case', 'stage' or 'Special load case'.", GH_ParamAccess.list); + } + protected override void SolveInstance(IGH_DataAccess DA) + { // get input FemDesign.Loads.LoadCombination obj = null; if (!DA.GetData(0, ref obj)) @@ -39,33 +41,26 @@ protected override void SolveInstance(IGH_DataAccess DA) // The following code is to convert 'item' to 'list object' // It is required to construct the Load Combination without graftening the data - var guidList = new List { obj.Guid }; + var guidList = new List { obj.Guid }; - var nameList = new List { obj.Name }; + var nameList = new List { obj.Name }; - var objectTypeList = new List { obj.Type.ToString() }; + var objectTypeList = new List { obj.Type.ToString() }; + var pairs = obj.GetCaseAndGammas(); + + // TODO: Remove when Moving load load cases is implemented + pairs = pairs.Where(p => p.CaseType != "Moving load case").ToList(); - // return DA.SetDataList(0, guidList); DA.SetDataList(1, nameList); DA.SetDataList(2, objectTypeList); - DA.SetDataList(3, obj.GetLoadCaseGuidsAsString()); - DA.SetDataList(4, obj.GetGammas()); - - } - protected override System.Drawing.Bitmap Icon - { - get - { - return FemDesign.Properties.Resources.LoadCombinationDeconstruct; - } - } - public override Guid ComponentGuid - { - get { return new Guid("c1cf57c6-be8c-42a8-a489-4145c2d88896"); } - } - + DA.SetDataList(3, pairs.Select(p => p.Case)); + DA.SetDataList(4, pairs.Select(p => p.Gamma)); + DA.SetDataList(5, pairs.Select(p => p.CaseType)); + } + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.LoadCombinationDeconstruct; + public override Guid ComponentGuid => new Guid("21050992-3259-4a57-a7a6-77b7566e0603"); public override GH_Exposure Exposure => GH_Exposure.quarternary; } diff --git a/FemDesign.Grasshopper/Deconstruct/StagesDeconstruct.cs b/FemDesign.Grasshopper/Deconstruct/StagesDeconstruct.cs index 4cef5afcc..0c109084b 100644 --- a/FemDesign.Grasshopper/Deconstruct/StagesDeconstruct.cs +++ b/FemDesign.Grasshopper/Deconstruct/StagesDeconstruct.cs @@ -17,11 +17,11 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) } protected override void RegisterOutputParams(GH_OutputParamManager pManager) { - pManager.AddIntegerParameter("Id", "Id", "Stage id", GH_ParamAccess.item); - pManager.AddGenericParameter("Elements", "Elements", "", GH_ParamAccess.list); + pManager.AddIntegerParameter("Index", "Index", "Stage id", GH_ParamAccess.item); pManager.AddTextParameter("Description", "Description", "", GH_ParamAccess.item); - pManager.AddBooleanParameter("InitialStressState", "InitialState", "", GH_ParamAccess.item); + pManager.AddGenericParameter("Elements", "Elements", "", GH_ParamAccess.list); pManager.AddGenericParameter("ActivatedLoadCases", "ActivatedLoadCases", "", GH_ParamAccess.list); + pManager.AddBooleanParameter("InitialStressState", "InitialState", "", GH_ParamAccess.item); } protected override void SolveInstance(IGH_DataAccess DA) { @@ -35,17 +35,17 @@ protected override void SolveInstance(IGH_DataAccess DA) var activeLoadCases = stage.ActivatedLoadCases; DA.SetData(0, id); - DA.SetDataList(1, elements); - DA.SetData(2, description); - DA.SetData(3, initialStressState); - DA.SetDataList(4, activeLoadCases); + DA.SetData(1, description); + DA.SetDataList(2, elements); + DA.SetDataList(3, activeLoadCases); + DA.SetData(4, initialStressState); } protected override System.Drawing.Bitmap Icon { get { - return null; + return FemDesign.Properties.Resources.StagesDeconstruct; } } public override Guid ComponentGuid diff --git a/FemDesign.Grasshopper/Deconstruct/SupportDeconstuctor.cs b/FemDesign.Grasshopper/Deconstruct/SupportDeconstuctor.cs index b92839f4a..600bd23a0 100644 --- a/FemDesign.Grasshopper/Deconstruct/SupportDeconstuctor.cs +++ b/FemDesign.Grasshopper/Deconstruct/SupportDeconstuctor.cs @@ -20,8 +20,8 @@ protected override void RegisterOutputParams(GH_OutputParamManager pManager) pManager.AddTextParameter("AnalyticalID", "AnalyticalID", "Analytical ID.", GH_ParamAccess.item); pManager.AddGenericParameter("Geometry", "Geometry", "Geometry. [m]", GH_ParamAccess.item); pManager.AddGenericParameter("MovingLocal", "MovingLocal", "MovingLocal.", GH_ParamAccess.item); - pManager.AddVectorParameter("LocalX", "LocalX", "LocalX.", GH_ParamAccess.item); - pManager.AddVectorParameter("LocalY", "LocalY", "LocalY.", GH_ParamAccess.item); + pManager.AddVectorParameter("GroupLocalX", "GroupLocalX", "The value refer to Group LocalX and NOT the local coordinate system of the underlying geometry.", GH_ParamAccess.item); + pManager.AddVectorParameter("GroupLocalY", "GroupLocalY", "The value refer to Group LocalY and NOT the local coordinate system of the underlying geometry.", GH_ParamAccess.item); pManager.AddGenericParameter("Motions", "Motions", "Motions.", GH_ParamAccess.item); pManager.AddGenericParameter("Rotations", "Rotations", "Rotations.", GH_ParamAccess.item); pManager.AddGenericParameter("Plastic Limits Forces Motions", "PlaLimMotions", "Plastic limits forces for motion springs.", GH_ParamAccess.item); diff --git a/FemDesign.Grasshopper/FemDesign.Grasshopper.csproj b/FemDesign.Grasshopper/FemDesign.Grasshopper.csproj index 3832afdb3..5c7c34cd9 100644 --- a/FemDesign.Grasshopper/FemDesign.Grasshopper.csproj +++ b/FemDesign.Grasshopper/FemDesign.Grasshopper.csproj @@ -74,8 +74,11 @@ - + + + + @@ -83,7 +86,7 @@ - + @@ -104,6 +107,7 @@ + @@ -112,6 +116,7 @@ + @@ -121,6 +126,8 @@ + + @@ -146,9 +153,13 @@ + + + + @@ -289,7 +300,7 @@ - + @@ -298,11 +309,11 @@ - + - + @@ -784,25 +795,30 @@ - + - + - + - + - + - + + + + + + @@ -810,38 +826,28 @@ - - - - - - - - + + + + + + + + - - + {1d91ebf4-a473-4c5b-a171-ab2da1b7017b} FemDesign.Core - - - - - - - - - - + - + diff --git a/FemDesign.Grasshopper/Info/Info.cs b/FemDesign.Grasshopper/Info/Info.cs index 121ce5cbd..a600fedfd 100644 --- a/FemDesign.Grasshopper/Info/Info.cs +++ b/FemDesign.Grasshopper/Info/Info.cs @@ -47,7 +47,7 @@ protected override void SolveInstance(IGH_DataAccess DA) var current = Info.GetCurrentFemDesignApiVersion(); if (current != VersionWhenFirstCreated) - AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, $"The version of this script ({current}) is different than the version it was created with ({VersionWhenFirstCreated})"); + AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, $"The version of FEM-Design API installed ({current}) is different than the version when this script was created ({VersionWhenFirstCreated}). Most things are expected to work anyways. If you update the components marked with the \"OLD\"-tag it is recommended that you also create a new \"Info\"-component to indicate that this script has been updated to the current version ({current})."); } public override void CreateAttributes() { diff --git a/FemDesign.Grasshopper/Loads/LineStressLoadDefine.cs b/FemDesign.Grasshopper/Loads/LineStressLoadDefine.cs new file mode 100644 index 000000000..9c7a07bd6 --- /dev/null +++ b/FemDesign.Grasshopper/Loads/LineStressLoadDefine.cs @@ -0,0 +1,79 @@ +// https://strusoft.com/ +using System; +using GH = Grasshopper; +using Grasshopper.Kernel; +using Rhino.Geometry; + +namespace FemDesign.Grasshopper +{ + public class LineStressLoad : GH_Component + { + public LineStressLoad() : base("LineStressLoad.Define", "Define", "Creates a line stress load.", CategoryName.Name(), SubCategoryName.Cat3()) + { + + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddCurveParameter("Curve", "Curve", "Curve defining the line stress load.", GH_ParamAccess.item); + pManager.AddVectorParameter("Direction", "Direction", "Reference axis for Moment Stress. Default is LocalY", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddNumberParameter("n1", "n1", "Force at start. Or the force at both the start and end of the curve. [kN]\n+ compression\n- tension", GH_ParamAccess.item); + pManager.AddNumberParameter("n2", "n2", "Force at end. Optional. [kN]", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddNumberParameter("m1", "m1", "Moment at start. Or the moment at both the start and end of the curve. [kNm]", GH_ParamAccess.item, 0.0); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddNumberParameter("m2", "m2", "Moment at end. Optional. [kNm]", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + + pManager.AddGenericParameter("LoadCase", "LoadCase", "LoadCase.", GH_ParamAccess.item); + + pManager.AddTextParameter("Comment", "Comment", "Comment.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("StressLoad", "StressLoad", "Line stress load.", GH_ParamAccess.item); + } + protected override void SolveInstance(IGH_DataAccess DA) + { + Curve curve = null; + if (!DA.GetData("Curve", ref curve)) return; + + var edge = Convert.FromRhino(curve); + var direction = edge.CoordinateSystem.LocalY.ToRhino(); + DA.GetData("Direction", ref direction); + + double n1 = 0.0; + if (!DA.GetData("n1", ref n1)) return; + + double n2 = n1; + DA.GetData("n2", ref n2); + + double m1 = 0.0; + DA.GetData("m1", ref m1); + + double m2 = m1; + DA.GetData("m2", ref m2); + + Loads.LoadCase loadCase = null; + if (!DA.GetData("LoadCase", ref loadCase)) return; + + string comment = null; + DA.GetData("Comment", ref comment); + + try + { + var obj = new Loads.LineStressLoad(edge, direction.FromRhino(), n1, n2, m1, m2, loadCase, comment); + DA.SetData("StressLoad", obj); + } + catch (ArgumentException e) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, e.Message); + } + } + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.LineStressLoadConstruct; + public override Guid ComponentGuid => new Guid("22908c81-003d-4281-bc8c-c85029d13af6"); + public override GH_Exposure Exposure => GH_Exposure.secondary; + + } +} \ No newline at end of file diff --git a/FemDesign.Grasshopper/Loads/LoadCombinationConstruct.cs b/FemDesign.Grasshopper/Loads/LoadCombinationConstruct.cs index bd80ff71d..765e901e0 100644 --- a/FemDesign.Grasshopper/Loads/LoadCombinationConstruct.cs +++ b/FemDesign.Grasshopper/Loads/LoadCombinationConstruct.cs @@ -1,82 +1,216 @@ // https://strusoft.com/ using System; +using System.Linq; using System.Collections.Generic; -using Grasshopper.Kernel; + using Rhino.Geometry; +using Grasshopper.Kernel; using Grasshopper.Kernel.Special; -using FemDesign.Loads; +using Grasshopper.Kernel.Types; using FemDesign.Grasshopper.Extension.ComponentExtension; +using FemDesign.Loads; + namespace FemDesign.Grasshopper { - public class LoadCombinationConstruct : GH_Component - { - public LoadCombinationConstruct() : base("LoadCombination.Construct", "Construct", "Construct a LoadCombination from a LoadCase or a list of LoadCases.", CategoryName.Name(), SubCategoryName.Cat3()) - { - - } - protected override void RegisterInputParams(GH_InputParamManager pManager) - { - pManager.AddTextParameter("Name", "Name", "Name of LoadCombination.", GH_ParamAccess.item); - pManager.AddTextParameter("Type", "Type", "Connect 'ValueList' to get the options.\nultimate_ordinary\nultimate_accidental\nultimate_seismic\nserviceability_quasi_permanent\nserviceability_frequent\nserviceability_characteristic.", GH_ParamAccess.item, "ultimate_ordinary"); - pManager[1].Optional = true; - pManager.AddGenericParameter("LoadCase", "LoadCase", "LoadCase to include in LoadCombination. Single LoadCase or list of LoadCases.", GH_ParamAccess.list); - pManager.AddNumberParameter("Gamma", "Gamma", "Gamma value for respective LoadCase. Single value or list of values. [-]", GH_ParamAccess.list); - } - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { - pManager.AddGenericParameter("LoadCombination", "LoadCombination.", "LoadCombination.", GH_ParamAccess.item); - } - protected override void SolveInstance(IGH_DataAccess DA) - { - // get data - string name = null, type = "ultimate_ordinary"; - List loadCases = new List(); - List gammas = new List(); - if (!DA.GetData(0, ref name)) { return; } - - DA.GetData(1, ref type); - - - if (!DA.GetDataList(2, loadCases)) { return; } - if (!DA.GetDataList(3, gammas)) { return; } - - var _type = FemDesign.GenericClasses.EnumParser.Parse(type); - - if (name == null || type == null || loadCases == null || gammas == null) { return; } - - - LoadCombination obj = new LoadCombination(name, _type, loadCases, gammas); - - DA.SetData(0, obj); - } - - protected override void BeforeSolveInstance() - { - ValueListUtils.updateValueLists(this, 1, new List - { "ultimate_ordinary", - "ultimate_accidental", - "ultimate_seismic", - "serviceability_quasi_permanent", - "serviceability_frequent", - "serviceability_characteristic" - }, null, 0); - } - - - protected override System.Drawing.Bitmap Icon - { - get - { - - return FemDesign.Properties.Resources.LoadCombinationDefine; - } - } - public override Guid ComponentGuid - { - get { return new Guid("043982aa-8f6a-41f3-896c-9c9f2f16a8ea"); } - } - - public override GH_Exposure Exposure => GH_Exposure.quarternary; - } + public class LoadCombinationConstruct : GH_Component + { + public LoadCombinationConstruct() : base("LoadCombination.Construct", "Construct", "Construct a LoadCombination from a LoadCase or a list of LoadCases.", CategoryName.Name(), SubCategoryName.Cat3()) + { + + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddTextParameter("Name", "Name", "Name of LoadCombination.", GH_ParamAccess.item); + pManager.AddTextParameter("Type", "Type", "Connect 'ValueList' to get the options.\nultimate_ordinary\nultimate_accidental\nultimate_seismic\nserviceability_quasi_permanent\nserviceability_frequent\nserviceability_characteristic.", GH_ParamAccess.item, "ultimate_ordinary"); + pManager[1].Optional = true; + pManager.AddGenericParameter("LoadCase", "LoadCase", "Load cases to include in LoadCombination.\n\nThis may also include a single construction stage and/or any special load case strings. Connect a ValueList to get the options for the special load cases.", GH_ParamAccess.list); + pManager.AddNumberParameter("Gamma", "Gamma", "Gamma value for respective LoadCase. Must be equal to the number of load cases.", GH_ParamAccess.list); + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("LoadCombination", "LoadCombination.", "LoadCombination.", GH_ParamAccess.item); + } + + protected override void SolveInstance(IGH_DataAccess DA) + { + string name = null, type = "ultimate_ordinary"; + List loadCasesOrOthers = new List(); + List gammas = new List(); + if (!DA.GetData(0, ref name)) { return; } + if (!DA.GetDataList(2, loadCasesOrOthers)) { return; } + if (!DA.GetDataList(3, gammas)) { return; } + + DA.GetData(1, ref type); + + if (loadCasesOrOthers.Count != gammas.Count) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, $"The number of load cases ({loadCasesOrOthers.Count}) and gamma values ({gammas.Count}) must be equal."); + return; + } + + var _type = FemDesign.GenericClasses.EnumParser.Parse(type); + + if (name == null || type == null || loadCasesOrOthers == null || gammas == null) { return; } + + LoadCombination loadCombination = new LoadCombination(name, _type); + + LoadCase loadCase = null; + Stage stage = null; + string text = null; + for (int i = 0; i < loadCasesOrOthers.Count; i++) + { + object loadCaseLike = loadCasesOrOthers[i]; + double gamma = gammas[i]; + + if (loadCaseLike.GetType() == typeof(GH_ObjectWrapper)) + { + GH_ObjectWrapper wrapper = (GH_ObjectWrapper)loadCaseLike; + + if (wrapper.Value.TryCast(ref loadCase)) + loadCombination.AddLoadCase(loadCase, gamma); + + //if (wrapper.CastTo(out stage)) + else if (wrapper.Value.TryCast(ref stage)) + loadCombination.SetStageLoadCase(stage, gamma); + } + + else if (loadCaseLike.GetType() == typeof(GH_String)) + { + GH_String wrapper = (GH_String)loadCaseLike; + + if (wrapper.Value.TryCast(ref text)) + { + string sanitized = text.ToLower() + .Replace("_", " ") + .Replace(".", "") + .Replace(",", "") + .Trim(); + switch (sanitized) + { + case "seis max": + case "seismic max": + loadCombination.SeismicMax = new LoadCombinationCaseBase(gamma); + break; + + case "seis fx-mx": + case "seis res fx-mx": + case "seismic fx-mx": + case "seismic res fx-mx": + loadCombination.SeismicResFxMinusMx = new LoadCombinationCaseBase(gamma); + break; + + case "seis fx+mx": + case "seis res fx+mx": + case "seismic fx+mx": + case "seismic res fx+mx": + loadCombination.SeismicResFxPlusMx = new LoadCombinationCaseBase(gamma); + break; + + case "seis fy-my": + case "seis res fy-my": + case "seismic fy-my": + case "seismic res fy-my": + loadCombination.SeismicResFyMinusMy = new LoadCombinationCaseBase(gamma); + break; + + case "seis fy+my": + case "seis res fy+my": + case "seismic fy+my": + case "seismic res fy+my": + loadCombination.SeismicResFyPlusMy = new LoadCombinationCaseBase(gamma); + break; + + case "seis fz": + case "seis res fz": + case "seismic fz": + case "seismic res fz": + loadCombination.SeismicResFz = new LoadCombinationCaseBase(gamma); + break; + + case "t0": + case "ptc t0": + loadCombination.PtcT0 = new LoadCombinationCaseBase(gamma); + break; + + case "t8": + case "ptc t8": + loadCombination.PtcT8 = new LoadCombinationCaseBase(gamma); + break; + + case "pile": + case "pile loadcase": + case "pile load case": + case "ldcase pile": + case "loadcase pile": + case "load case pile": + case "neg shaft friction": + loadCombination.PileLoadCase = new LoadCombinationCaseBase(gamma); + break; + + case "final cs": + case "final stage": + case "final construction stage": + loadCombination.SetFinalStageLoadCase(gamma); + break; + + default: + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, $"'{wrapper.Value}' is not a valid special load case string."); + break; + } + } + } + + else + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, $"'{loadCaseLike}' of type {loadCaseLike.GetType().FullName} is not a valid LoadCase-like object."); + } + + DA.SetData(0, loadCombination); + } + + protected override void BeforeSolveInstance() + { + ValueListUtils.updateValueLists(this, 1, new List + { "ultimate_ordinary", + "ultimate_accidental", + "ultimate_seismic", + "serviceability_quasi_permanent", + "serviceability_frequent", + "serviceability_characteristic" + }, null, GH_ValueListMode.DropDown); + + ValueListUtils.updateValueLists(this, 2, new List + { + "Seismic max.", + "Seis res, Fx+Mx", + "Seis res, Fx-Mx", + "Seis res, Fy+My", + "Seis res, Fy-My", + "Seis res, Fz", + "Final construction stage", + "PTC T0", + "PTC T8", + "Neg. Shaft friction" + }, null, GH_ValueListMode.DropDown); + } + + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.LoadCombinationDefine; + public override Guid ComponentGuid => new Guid("4dc97ef5-44a8-4117-8abd-c94fdadd1f11"); + public override GH_Exposure Exposure => GH_Exposure.quarternary; + } + + public static class CastingExtensions + { + public static bool TryCast(this object obj, ref T result) + { + if (obj is T) + { + result = (T)obj; + return true; + } + + result = default(T); + return false; + } + } } \ No newline at end of file diff --git a/FemDesign.Grasshopper/Loads/LoadCombinationSetupCalculation.cs b/FemDesign.Grasshopper/Loads/LoadCombinationSetupCalculation.cs index 5c73f136c..35f65f29e 100644 --- a/FemDesign.Grasshopper/Loads/LoadCombinationSetupCalculation.cs +++ b/FemDesign.Grasshopper/Loads/LoadCombinationSetupCalculation.cs @@ -30,7 +30,7 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) pManager[pManager.ParamCount - 1].Optional = true; pManager.AddBooleanParameter("f2nd", "f2nd", "2nd order analysis.", GH_ParamAccess.item, false); pManager[pManager.ParamCount - 1].Optional = true; - pManager.AddNumberParameter("Im", "Im", "Imperfection shape for 2nd order analysis.", GH_ParamAccess.item, 0); + pManager.AddIntegerParameter("Im", "Im", "Imperfection shape for 2nd order analysis.", GH_ParamAccess.item, 0); pManager[pManager.ParamCount - 1].Optional = true; pManager.AddIntegerParameter("Waterlevel", "Waterlevel", "Ground water level. [m]", GH_ParamAccess.item, 0); pManager[pManager.ParamCount - 1].Optional = true; diff --git a/FemDesign.Grasshopper/Loads/LoadGroupConstruct.cs b/FemDesign.Grasshopper/Loads/LoadGroupConstruct.cs index 465447fb8..047af41c8 100644 --- a/FemDesign.Grasshopper/Loads/LoadGroupConstruct.cs +++ b/FemDesign.Grasshopper/Loads/LoadGroupConstruct.cs @@ -53,7 +53,7 @@ protected override void SolveInstance(IGH_DataAccess DA) { // get data string name = null; - double gamma_d = 0, unfavourableSafetyFactor = 0, favourableSafetyFactor = 0, unfavourableSafetyFactorAccidental = 0, favourableSafetyFactorAccidental = 0, xi = 0.89; + double unfavourableSafetyFactor = 0, favourableSafetyFactor = 0, unfavourableSafetyFactorAccidental = 0, favourableSafetyFactorAccidental = 0, xi = 0.89; int loadCaseRelation = 0, type = 0, potentiallyLeadingAction = 1; List loadCases = new List(); FemDesign.Loads.LoadCategory psi = null; diff --git a/FemDesign.Grasshopper/Materials/OBSOLETE/MaterialGetMaterialByNameOBSOLETE2.cs b/FemDesign.Grasshopper/Materials/OBSOLETE/MaterialGetMaterialByNameOBSOLETE2.cs index 9c50468ba..57808c199 100644 --- a/FemDesign.Grasshopper/Materials/OBSOLETE/MaterialGetMaterialByNameOBSOLETE2.cs +++ b/FemDesign.Grasshopper/Materials/OBSOLETE/MaterialGetMaterialByNameOBSOLETE2.cs @@ -34,7 +34,7 @@ protected override void SolveInstance(IGH_DataAccess DA) { material = materials.Where(x => x.Name == materialName).First(); } - catch (Exception ex) + catch (Exception) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, $"{materialName} does not exist!"); } diff --git a/FemDesign.Grasshopper/Obsolete/LoadCombinationConstructOBSOLETE.cs b/FemDesign.Grasshopper/Obsolete/LoadCombinationConstructOBSOLETE.cs new file mode 100644 index 000000000..501bc2e9b --- /dev/null +++ b/FemDesign.Grasshopper/Obsolete/LoadCombinationConstructOBSOLETE.cs @@ -0,0 +1,82 @@ +// https://strusoft.com/ +using System; +using System.Collections.Generic; +using Grasshopper.Kernel; +using Rhino.Geometry; +using Grasshopper.Kernel.Special; +using FemDesign.Loads; +using FemDesign.Grasshopper.Extension.ComponentExtension; + +namespace FemDesign.Grasshopper +{ + public class LoadCombinationConstructOBSOLETE : GH_Component + { + public LoadCombinationConstructOBSOLETE() : base("LoadCombination.Construct", "Construct", "Construct a LoadCombination from a LoadCase or a list of LoadCases.", CategoryName.Name(), SubCategoryName.Cat3()) + { + + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddTextParameter("Name", "Name", "Name of LoadCombination.", GH_ParamAccess.item); + pManager.AddTextParameter("Type", "Type", "Connect 'ValueList' to get the options.\nultimate_ordinary\nultimate_accidental\nultimate_seismic\nserviceability_quasi_permanent\nserviceability_frequent\nserviceability_characteristic.", GH_ParamAccess.item, "ultimate_ordinary"); + pManager[1].Optional = true; + pManager.AddGenericParameter("LoadCase", "LoadCase", "LoadCase to include in LoadCombination. Single LoadCase or list of LoadCases.", GH_ParamAccess.list); + pManager.AddNumberParameter("Gamma", "Gamma", "Gamma value for respective LoadCase. Single value or list of values. [-]", GH_ParamAccess.list); + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("LoadCombination", "LoadCombination.", "LoadCombination.", GH_ParamAccess.item); + } + protected override void SolveInstance(IGH_DataAccess DA) + { + // get data + string name = null, type = "ultimate_ordinary"; + List loadCases = new List(); + List gammas = new List(); + if (!DA.GetData(0, ref name)) { return; } + + DA.GetData(1, ref type); + + + if (!DA.GetDataList(2, loadCases)) { return; } + if (!DA.GetDataList(3, gammas)) { return; } + + var _type = FemDesign.GenericClasses.EnumParser.Parse(type); + + if (name == null || type == null || loadCases == null || gammas == null) { return; } + + + LoadCombination obj = new LoadCombination(name, _type, loadCases, gammas); + + DA.SetData(0, obj); + } + + protected override void BeforeSolveInstance() + { + ValueListUtils.updateValueLists(this, 1, new List + { "ultimate_ordinary", + "ultimate_accidental", + "ultimate_seismic", + "serviceability_quasi_permanent", + "serviceability_frequent", + "serviceability_characteristic" + }, null, 0); + } + + + protected override System.Drawing.Bitmap Icon + { + get + { + + return FemDesign.Properties.Resources.LoadCombinationDefine; + } + } + public override Guid ComponentGuid + { + get { return new Guid("043982aa-8f6a-41f3-896c-9c9f2f16a8ea"); } + } + + public override GH_Exposure Exposure => GH_Exposure.hidden; + } +} diff --git a/FemDesign.Grasshopper/Obsolete/LoadCombinationDeconstructOBSOLETE.cs b/FemDesign.Grasshopper/Obsolete/LoadCombinationDeconstructOBSOLETE.cs new file mode 100644 index 000000000..687b5f4a0 --- /dev/null +++ b/FemDesign.Grasshopper/Obsolete/LoadCombinationDeconstructOBSOLETE.cs @@ -0,0 +1,72 @@ +// https://strusoft.com/ +using System; +using System.Collections.Generic; +using Grasshopper.Kernel; + +namespace FemDesign.Grasshopper +{ + public class LoadCombinationDeconstructOBSOLETE : GH_Component + { + public LoadCombinationDeconstructOBSOLETE() : base("LoadCombination.Deconstruct", "Deconstruct", "Deconstruct a LoadCombination.", "FEM-Design", "Deconstruct") + { + + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("LoadCombination", "LoadCombination", "LoadCombination.", GH_ParamAccess.item); + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddTextParameter("Guid", "Guid", "Guid.", GH_ParamAccess.list); + pManager.AddTextParameter("Name", "Name", "Name.", GH_ParamAccess.list); + pManager.AddTextParameter("Type", "Type", "Type.", GH_ParamAccess.list); + pManager.AddTextParameter("LoadCases", "LoadCases", "LoadCases.", GH_ParamAccess.list); + pManager.AddNumberParameter("Gammas", "Gammas", "Gammas.", GH_ParamAccess.list); + } + protected override void SolveInstance(IGH_DataAccess DA) + { + // get input + FemDesign.Loads.LoadCombination obj = null; + if (!DA.GetData(0, ref obj)) + { + return; + } + if (obj == null) + { + return; + } + + // The following code is to convert 'item' to 'list object' + // It is required to construct the Load Combination without graftening the data + + var guidList = new List { obj.Guid }; + + var nameList = new List { obj.Name }; + + var objectTypeList = new List { obj.Type.ToString() }; + + + // return + DA.SetDataList(0, guidList); + DA.SetDataList(1, nameList); + DA.SetDataList(2, objectTypeList); + DA.SetDataList(3, obj.GetLoadCaseGuidsAsString()); + DA.SetDataList(4, obj.GetGammas()); + + } + protected override System.Drawing.Bitmap Icon + { + get + { + return FemDesign.Properties.Resources.LoadCombinationDeconstruct; + } + } + public override Guid ComponentGuid + { + get { return new Guid("c1cf57c6-be8c-42a8-a489-4145c2d88896"); } + } + + public override GH_Exposure Exposure => GH_Exposure.quarternary; + + } +} diff --git a/FemDesign.Grasshopper/Properties/Resources.Designer.cs b/FemDesign.Grasshopper/Properties/Resources.Designer.cs index c9034ea1c..8ceb8cbe0 100644 --- a/FemDesign.Grasshopper/Properties/Resources.Designer.cs +++ b/FemDesign.Grasshopper/Properties/Resources.Designer.cs @@ -290,6 +290,16 @@ internal static System.Drawing.Bitmap CoverTwoWay { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap deconstruct_icon { + get { + object obj = ResourceManager.GetObject("deconstruct_icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -590,6 +600,26 @@ internal static System.Drawing.Bitmap LineLoadMoment { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap LineStressLoadConstruct { + get { + object obj = ResourceManager.GetObject("LineStressLoadConstruct", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap LineStressLoadDeconstruct { + get { + object obj = ResourceManager.GetObject("LineStressLoadDeconstruct", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -1650,6 +1680,16 @@ internal static System.Drawing.Bitmap Stages { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap StagesDeconstruct { + get { + object obj = ResourceManager.GetObject("StagesDeconstruct", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -1690,6 +1730,16 @@ internal static System.Drawing.Bitmap StiffnessMatrix4TypeDeconstruct { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap StiffnessPoint { + get { + object obj = ResourceManager.GetObject("StiffnessPoint", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/FemDesign.Grasshopper/Properties/Resources.resx b/FemDesign.Grasshopper/Properties/Resources.resx index 6d08b0e57..38c5baf68 100644 --- a/FemDesign.Grasshopper/Properties/Resources.resx +++ b/FemDesign.Grasshopper/Properties/Resources.resx @@ -6557,4 +6557,19 @@ ..\Resources\icons\RebarAddToElement.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\icons\StiffnessPoint.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons\LineStressLoadConstruct.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons\LineStressLoadDeconstruct.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons\deconstruct_icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons\StagesDeconstruct.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/FemDesign.Grasshopper/Resources/icons/LineStressLoadConstruct.png b/FemDesign.Grasshopper/Resources/icons/LineStressLoadConstruct.png new file mode 100644 index 0000000000000000000000000000000000000000..c04526da1099a7a3aa77c841f916891f216053b5 GIT binary patch literal 614 zcmV-s0-61ZP)EX>4Tx04R}tkv&MmP!xqvQ>CJn4t5Z6$WV2$AS&W0RV;#q(pG5I!Q`cX(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=M<*vm7b)?+q|hS93y=44-aUu+?gNBIg{fxO1fXh` zk&4H}Y;IKyyrK_2gfNDX#7sSrUd+I=zV4})>MqK&y!-yFekE@*z$X&VG2O6;H;898 zEuHf|ahR1Ph4`F!+@K2*KXP4m`HgeYVS#6cjZA8uI7}=SJ6P^uRx(uLY2t{YYLqWz zT~;`6aaJoe*19KuVKA?)q`6LO7;!8ifh0u8sG*DsEJSJ7NHLM3^O%Q!$nhu1C6lWR zMvetkp+a)};D7LYwq{{!(oG7+fbJLD{uluQyFjyU+uz5w-8=#O&%l+|_E#Ig>?i5< zwiY=8LfgQ_bz777fXf|V@JW{p$&viDghBy$KcjET0Ry){@0vTe);UfefDFxQ`35*R z1V)RLz3%bup3b@b+tZrg4_UKvot@5vUjP6A24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&X_4=@l42xZ{_003f1L_t(Y$L&?I4FDhr1L7f` z&T0KbR~NO0FqqKM0&O)x1u!HLCdnv)637c4a^bc9gAxd%x%=MEX>4Tx04R}tkv&MmP!xqvQ>CJn4t5Z6$WV2$AS&W0RV;#q(pG5I!Q`cX(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=M<*vm7b)?+q|hS93y=44-aUu+?gNBIg{fxO1fXh` zk&4H}Y;IKyyrK_2gfNDX#7sSrUd+I=zV4})>MqK&y!-yFekE@*z$X&VG2O6;H;898 zEuHf|ahR1Ph4`F!+@K2*KXP4m`HgeYVS#6cjZA8uI7}=SJ6P^uRx(uLY2t{YYLqWz zT~;`6aaJoe*19KuVKA?)q`6LO7;!8ifh0u8sG*DsEJSJ7NHLM3^O%Q!$nhu1C6lWR zMvetkp+a)};D7LYwq{{!(oG7+fbJLD{uluQyFjyU+uz5w-8=#O&%l+|_E#Ig>?i5< zwiY=8LfgQ_bz777fXf|V@JW{p$&viDghBy$KcjET0Ry){@0vTe);UfefDFxQ`35*R z1V)RLz3%bup3b@b+tZrg4_UKvot@5vUjP6A24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&X_4=*=jSl$!>00H$$L_t(Y$L*FqXj4%bhM)Z0 z+n#8vol2)ha1wM8Avg#IjZMgpKWGO*q1ZuiP%;!8Yyt`jVnGm>iY^^=Q1Ay7x zCSPU`c_4^Jy&<;r31L#2IgR7iJu3JgNgMe5-BTPHJA)&Y4~x2yw1L09eUf-0Ltxhs zuDeDM_GN=%bOtY%cy%jFGMyqgI0UwZBkK^2_P%6MF7dpW;Y2b)c;{}A7Dx-Hsi1YL zjjUe3>w-+gAhus~(i zMcNk9wpvo;^M*dWn&5o)09s!^wdF;gzWGM}!4E=_5h^P#s@_mg_eUUv$^9$GxtQCB zruS2={Nd4y?-U>ZBor9|SX0oj$d3XcOzvGi#zb~6ny#ay#mw9S0N2Jx|LIlIT2GM| z0wGN9OvbsC+e1j#niJ+P?C;pWuE2vuLYUl~ILc&h6fGP?IW^DwYNRMoC=|N>D$1XV nJ>Bx**!0E>ph$5k#ofKd_0qoY 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 literal 0 HcmV?d00001 diff --git a/FemDesign.Grasshopper/Resources/icons/StiffnessPoint.png b/FemDesign.Grasshopper/Resources/icons/StiffnessPoint.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2f65890b1b4851933888826e2ff96aef019efe GIT binary patch literal 992 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 literal 0 HcmV?d00001 diff --git a/FemDesign.Grasshopper/Sections/OBSOLETE/SectionDefineOBSOLETE.cs b/FemDesign.Grasshopper/Sections/OBSOLETE/SectionDefineOBSOLETE.cs new file mode 100644 index 000000000..c45e5cb31 --- /dev/null +++ b/FemDesign.Grasshopper/Sections/OBSOLETE/SectionDefineOBSOLETE.cs @@ -0,0 +1,115 @@ +// https://strusoft.com/ +using System; +using System.Linq; +using System.Collections.Generic; +using Grasshopper.Kernel; +using Grasshopper.Kernel.Special; + +using FemDesign.Grasshopper.Extension.ComponentExtension; + +namespace FemDesign.Grasshopper +{ + public class SectionDefine_OBSOLETE : GH_Component + { + public SectionDefine_OBSOLETE() : base("Section.Define", "Define", "Define a new custom section.", CategoryName.Name(), SubCategoryName.Cat4b()) + { + + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddSurfaceParameter("Surfaces", "Srfs", "Item or list of surfaces of section. Surfaces must lie in the XY-plane at z=0.", GH_ParamAccess.list); + pManager.AddTextParameter("Name", "Name", "Name of section", GH_ParamAccess.item); + pManager.AddTextParameter("MaterialType", "MatType", "Connect 'ValueList' to get the options.\nSteelRolled\nSteelColdWorked\nSteelWelded\nConcrete\nTimber\nUnknown\nUndefined", GH_ParamAccess.item); + pManager.AddTextParameter("GroupName", "GroupName", "Name of section group", GH_ParamAccess.item); + pManager.AddTextParameter("TypeName", "TypeName", "Name of section type", GH_ParamAccess.item); + pManager.AddTextParameter("SizeName", "SizeName", "Name of section size", GH_ParamAccess.item); + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Custom Section", "Custom Section", "CustomSection.", GH_ParamAccess.item); + } + protected override void SolveInstance(IGH_DataAccess DA) + { + List breps = new List(); + if (!DA.GetDataList(0, breps)) + { + return; + } + + string name = null; + if (!DA.GetData(1, ref name)) + { + return; + } + + string matType = null; + if (!DA.GetData(2, ref matType)) + { + return; + } + + string groupName = null; + if (!DA.GetData(3, ref groupName)) + { + return; + } + + string typeName = null; + if (!DA.GetData(4, ref typeName)) + { + return; + } + + string sizeName = null; + if (!DA.GetData(5, ref sizeName)) + { + return; + } + + if (name == null || matType == null || groupName == null || typeName == null || sizeName == null) + { + return; + } + + // convert geometry + List regions = new List(); + foreach (Rhino.Geometry.Brep brep in breps) + { + regions.Add(brep.FromRhino()); + } + + // create region group + FemDesign.Geometry.RegionGroup regionGroup = new FemDesign.Geometry.RegionGroup(regions); + + // get mat type + FemDesign.Materials.MaterialTypeEnum matTypeEnum = (FemDesign.Materials.MaterialTypeEnum)Enum.Parse(typeof(FemDesign.Materials.MaterialTypeEnum), matType); + + // create section + FemDesign.Sections.Section section = new FemDesign.Sections.Section(regionGroup, name, "custom", matTypeEnum, groupName, typeName, sizeName); + + // return + DA.SetData(0, section); + } + protected override System.Drawing.Bitmap Icon + { + get + { + return FemDesign.Properties.Resources.SectionDefine; + } + } + public override Guid ComponentGuid + { + get { return new Guid("637c784c-7832-4a23-8cd7-a8a942dbb272"); } + } + + protected override void BeforeSolveInstance() + { + ValueListUtils.updateValueLists(this, 2, Enum.GetNames(typeof( FemDesign.Materials.MaterialTypeEnum )).ToList() + , null, GH_ValueListMode.DropDown); + } + + public override GH_Exposure Exposure => GH_Exposure.hidden; + + + } +} \ No newline at end of file diff --git a/FemDesign.Grasshopper/Sections/SectionDatabaseSave.cs b/FemDesign.Grasshopper/Sections/SectionDatabaseSave.cs index b52dd5852..83492cc7c 100644 --- a/FemDesign.Grasshopper/Sections/SectionDatabaseSave.cs +++ b/FemDesign.Grasshopper/Sections/SectionDatabaseSave.cs @@ -45,7 +45,7 @@ protected override void SolveInstance(IGH_DataAccess DA) foreach(var section in sections) obj.AddNewSection(section); - database.SerializeSectionDatabase(filePath); + obj.SerializeSectionDatabase(filePath); } protected override System.Drawing.Bitmap Icon { diff --git a/FemDesign.Grasshopper/Sections/SectionDefine.cs b/FemDesign.Grasshopper/Sections/SectionDefine.cs index ef8fac235..d7604e83e 100644 --- a/FemDesign.Grasshopper/Sections/SectionDefine.cs +++ b/FemDesign.Grasshopper/Sections/SectionDefine.cs @@ -1,9 +1,11 @@ -// https://strusoft.com/ +// https://strusoft.com/ using System; using System.Linq; using System.Collections.Generic; using Grasshopper.Kernel; +using Grasshopper.Kernel.Special; +using FemDesign.Grasshopper.Extension.ComponentExtension; namespace FemDesign.Grasshopper { @@ -16,11 +18,10 @@ public class SectionDefine : GH_Component protected override void RegisterInputParams(GH_InputParamManager pManager) { pManager.AddSurfaceParameter("Surfaces", "Srfs", "Item or list of surfaces of section. Surfaces must lie in the XY-plane at z=0.", GH_ParamAccess.list); - pManager.AddTextParameter("Name", "Name", "Name of section", GH_ParamAccess.item); - pManager.AddTextParameter("MaterialType", "MatType", "Material type. Choice: SteelRolled/SteelColdWorked/SteelWelded/Concrete/Timber", GH_ParamAccess.item); + pManager.AddTextParameter("MaterialType", "MatType", "Connect 'ValueList' to get the options.\nSteelRolled\nSteelColdWorked\nSteelWelded\nConcrete\nTimber\nUnknown\nUndefined", GH_ParamAccess.item); pManager.AddTextParameter("GroupName", "GroupName", "Name of section group", GH_ParamAccess.item); pManager.AddTextParameter("TypeName", "TypeName", "Name of section type", GH_ParamAccess.item); - pManager.AddTextParameter("SizeName", "SizeName", "Name of section size", GH_ParamAccess.item); + pManager.AddTextParameter("SizeName", "SizeName", "Name of section size. The name must be unique", GH_ParamAccess.item); } protected override void RegisterOutputParams(GH_OutputParamManager pManager) { @@ -34,37 +35,31 @@ protected override void SolveInstance(IGH_DataAccess DA) return; } - string name = null; - if (!DA.GetData(1, ref name)) - { - return; - } - string matType = null; - if (!DA.GetData(2, ref matType)) + if (!DA.GetData(1, ref matType)) { return; } string groupName = null; - if (!DA.GetData(3, ref groupName)) + if (!DA.GetData(2, ref groupName)) { return; } string typeName = null; - if (!DA.GetData(4, ref typeName)) + if (!DA.GetData(3, ref typeName)) { return; } string sizeName = null; - if (!DA.GetData(5, ref sizeName)) + if (!DA.GetData(4, ref sizeName)) { return; } - if (name == null || matType == null || groupName == null || typeName == null || sizeName == null) + if (matType == null || groupName == null || typeName == null || sizeName == null) { return; } @@ -83,7 +78,7 @@ protected override void SolveInstance(IGH_DataAccess DA) FemDesign.Materials.MaterialTypeEnum matTypeEnum = (FemDesign.Materials.MaterialTypeEnum)Enum.Parse(typeof(FemDesign.Materials.MaterialTypeEnum), matType); // create section - FemDesign.Sections.Section section = new FemDesign.Sections.Section(regionGroup, name, "custom", matTypeEnum, groupName, typeName, sizeName); + FemDesign.Sections.Section section = new FemDesign.Sections.Section(regionGroup, "custom", matTypeEnum, groupName, typeName, sizeName); // return DA.SetData(0, section); @@ -97,8 +92,15 @@ protected override System.Drawing.Bitmap Icon } public override Guid ComponentGuid { - get { return new Guid("637c784c-7832-4a23-8cd7-a8a942dbb272"); } + get { return new Guid("{FD3B284F-1199-4870-8902-5937A1BADE71}"); } } + + protected override void BeforeSolveInstance() + { + ValueListUtils.updateValueLists(this, 1, Enum.GetNames(typeof(FemDesign.Materials.MaterialTypeEnum)).ToList() + , null, GH_ValueListMode.DropDown); + } + public override GH_Exposure Exposure => GH_Exposure.tertiary; diff --git a/FemDesign.Grasshopper/Shells/SlabPlateConstruct.cs b/FemDesign.Grasshopper/Shells/OBSOLETE/SlabPlateConstruct_OBSOLETE.cs similarity index 91% rename from FemDesign.Grasshopper/Shells/SlabPlateConstruct.cs rename to FemDesign.Grasshopper/Shells/OBSOLETE/SlabPlateConstruct_OBSOLETE.cs index 67f76387a..76a60b2ee 100644 --- a/FemDesign.Grasshopper/Shells/SlabPlateConstruct.cs +++ b/FemDesign.Grasshopper/Shells/OBSOLETE/SlabPlateConstruct_OBSOLETE.cs @@ -6,9 +6,9 @@ namespace FemDesign.Grasshopper { - public class SlabPlateConstruct: GH_Component + public class SlabPlateConstruct_OBSOLETE: GH_Component { - public SlabPlateConstruct(): base("Plate.Construct", "Construct", "Construct a plate element.", CategoryName.Name(), SubCategoryName.Cat2b()) + public SlabPlateConstruct_OBSOLETE(): base("Plate", "Construct", "Construct a plate element.", CategoryName.Name(), SubCategoryName.Cat2b()) { } @@ -46,10 +46,7 @@ protected override void SolveInstance(IGH_DataAccess DA) DA.GetData(1, ref thickness); FemDesign.Materials.Material material = null; - if(!DA.GetData(2, ref material)) - { - material = FemDesign.Materials.MaterialDatabase.GetDefault().MaterialByName("C30/37"); - }; + if(!DA.GetData(2, ref material)) { return; } FemDesign.Shells.ShellEccentricity eccentricity = FemDesign.Shells.ShellEccentricity.Default; if(!DA.GetData(3, ref eccentricity)) @@ -125,7 +122,7 @@ public override Guid ComponentGuid { get { return new Guid("8c85f3e3-c50b-49ef-9cc0-5f90867bc0a1"); } } - public override GH_Exposure Exposure => GH_Exposure.primary; + public override GH_Exposure Exposure => GH_Exposure.hidden; } } \ No newline at end of file diff --git a/FemDesign.Grasshopper/Shells/OBSOLETE/SlabWall_OBSOLETE.cs b/FemDesign.Grasshopper/Shells/OBSOLETE/SlabWall_OBSOLETE.cs new file mode 100644 index 000000000..c03585795 --- /dev/null +++ b/FemDesign.Grasshopper/Shells/OBSOLETE/SlabWall_OBSOLETE.cs @@ -0,0 +1,126 @@ +// https://strusoft.com/ +using System; +using System.Collections.Generic; +using Grasshopper.Kernel; +using Rhino.Geometry; + +namespace FemDesign.Grasshopper +{ + public class SlabWall_OBSOLETE: GH_Component + { + public SlabWall_OBSOLETE(): base("Wall", "Construct", "Construct a wall element.", CategoryName.Name(), SubCategoryName.Cat2b()) + { + + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddSurfaceParameter("Surface", "Surface", "Surface must be flat and vertical", GH_ParamAccess.item); + pManager.AddNumberParameter("Thickness", "Thickness", "Thickness. [m]", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("Material", "Material", "Material.", GH_ParamAccess.item); + pManager.AddGenericParameter("ShellEccentricity", "Eccentricity", "ShellEccentricity. Optional.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("ShellOrthotropy", "Orthotropy", "ShellOrthotropy. Optional.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("EdgeConnection", "EdgeConnection", "EdgeConnection. Optional.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddVectorParameter("LocalX", "LocalX", "Set local x-axis. Vector must be perpendicular to surface local z-axis. Local y-axis will be adjusted accordingly. Optional, local x-axis from surface coordinate system used if undefined.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddVectorParameter("LocalZ", "LocalZ", "Set local z-axis. Vector must be perpendicular to surface local x-axis. Local y-axis will be adjusted accordingly. Optional, local z-axis from surface coordinate system used if undefined.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddTextParameter("Identifier", "Identifier", "Identifier. Optional.", GH_ParamAccess.item, "P"); + pManager[pManager.ParamCount - 1].Optional = true; + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Slab", "Slab", "Slab.", GH_ParamAccess.item); + } + protected override void SolveInstance(IGH_DataAccess DA) + { + // get input + Brep surface = null; + if(!DA.GetData(0, ref surface)) { return; } + + double thickness = 0.15; + DA.GetData(1, ref thickness); + + FemDesign.Materials.Material material = null; + if (!DA.GetData(2, ref material)) { return; } + + FemDesign.Shells.ShellEccentricity eccentricity = FemDesign.Shells.ShellEccentricity.Default; + if(!DA.GetData(3, ref eccentricity)) + { + // pass + } + + FemDesign.Shells.ShellOrthotropy orthotropy = FemDesign.Shells.ShellOrthotropy.Default; + if(!DA.GetData(4, ref orthotropy)) + { + // pass + } + + FemDesign.Shells.EdgeConnection edgeConnection = FemDesign.Shells.EdgeConnection.Rigid; + if(!DA.GetData(5, ref edgeConnection)) + { + // pass + } + + Rhino.Geometry.Vector3d x = Vector3d.Zero; + if (!DA.GetData(6, ref x)) + { + // pass + } + + Rhino.Geometry.Vector3d z = Vector3d.Zero; + if (!DA.GetData(7, ref z)) + { + // pass + } + + string identifier = "P"; + if(!DA.GetData(8, ref identifier)) + { + // pass + } + if (surface == null || material == null || eccentricity == null || orthotropy == null || edgeConnection == null || identifier == null) { return; } + + // + FemDesign.Geometry.Region region = surface.FromRhino(); + + // + List thicknessObj = new List(); + thicknessObj.Add(new FemDesign.Shells.Thickness(region.CoordinateSystem.Origin, thickness)); + + // + FemDesign.Shells.Slab obj = FemDesign.Shells.Slab.Wall(identifier, material, region, edgeConnection, eccentricity, orthotropy, thicknessObj); + + // set local x-axis + if (!x.Equals(Vector3d.Zero)) + { + obj.SlabPart.LocalX = x.FromRhino(); + } + + // set local z-axis + if (!z.Equals(Vector3d.Zero)) + { + obj.SlabPart.LocalZ = z.FromRhino(); + } + + // return + DA.SetData(0, obj); + } + protected override System.Drawing.Bitmap Icon + { + get + { + return FemDesign.Properties.Resources.Wall; + } + } + public override Guid ComponentGuid + { + get { return new Guid("e26cd4b0-0582-4ea5-8705-3b9695937277"); } + } + public override GH_Exposure Exposure => GH_Exposure.hidden; + + } +} \ No newline at end of file diff --git a/FemDesign.Grasshopper/Shells/SlabPlate.cs b/FemDesign.Grasshopper/Shells/SlabPlate.cs new file mode 100644 index 000000000..498828911 --- /dev/null +++ b/FemDesign.Grasshopper/Shells/SlabPlate.cs @@ -0,0 +1,127 @@ +// https://strusoft.com/ +using System; +using System.Collections.Generic; +using Grasshopper.Kernel; +using Rhino.Geometry; + +namespace FemDesign.Grasshopper +{ + public class SlabPlate: GH_Component + { + public SlabPlate(): base("Plate", "Construct", "Construct a plate element.", CategoryName.Name(), SubCategoryName.Cat2b()) + { + + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddSurfaceParameter("Surface", "Surface", "Surface must be flat.", GH_ParamAccess.item); + pManager.AddNumberParameter("Thickness", "Thickness", "Thickness. [m]", GH_ParamAccess.item, 0.15); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("Material", "Material", "Material.", GH_ParamAccess.item); + pManager.AddGenericParameter("ShellEccentricity", "Eccentricity", "ShellEccentricity. Optional.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("ShellOrthotropy", "Orthotropy", "ShellOrthotropy. Optional.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("EdgeConnection", "EdgeConnection", "EdgeConnection. Optional.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddVectorParameter("LocalX", "LocalX", "Set local x-axis. Vector must be perpendicular to surface local z-axis. Local y-axis will be adjusted accordingly. Optional, local x-axis from surface coordinate system used if undefined.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddVectorParameter("LocalZ", "LocalZ", "Set local z-axis. Vector must be perpendicular to surface local x-axis. Local y-axis will be adjusted accordingly. Optional, local z-axis from surface coordinate system used if undefined.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddTextParameter("Identifier", "Identifier", "Identifier. Optional.", GH_ParamAccess.item, "P"); + pManager[pManager.ParamCount - 1].Optional = true; + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Slab", "Slab", "Slab.", GH_ParamAccess.item); + } + protected override void SolveInstance(IGH_DataAccess DA) + { + // get input + Brep surface = null; + if(!DA.GetData(0, ref surface)) { return; } + + double thickness = 0.15; + DA.GetData(1, ref thickness); + + FemDesign.Materials.Material material = null; + if(!DA.GetData(2, ref material)) { return; } + + FemDesign.Shells.ShellEccentricity eccentricity = FemDesign.Shells.ShellEccentricity.Default; + if(!DA.GetData(3, ref eccentricity)) + { + // pass + } + + FemDesign.Shells.ShellOrthotropy orthotropy = FemDesign.Shells.ShellOrthotropy.Default; + if(!DA.GetData(4, ref orthotropy)) + { + // pass + } + + FemDesign.Shells.EdgeConnection edgeConnection = FemDesign.Shells.EdgeConnection.Rigid; + if(!DA.GetData(5, ref edgeConnection)) + { + // pass + } + + Rhino.Geometry.Vector3d x = Vector3d.Zero; + if (!DA.GetData(6, ref x)) + { + // pass + } + + Rhino.Geometry.Vector3d z = Vector3d.Zero; + if (!DA.GetData(7, ref z)) + { + // pass + } + + string identifier = "P"; + if(!DA.GetData(8, ref identifier)) + { + // pass + } + + if (surface == null || material == null || eccentricity == null || orthotropy == null || edgeConnection == null || identifier == null) { return; } + + // + FemDesign.Geometry.Region region = surface.FromRhino(); + + // + List thicknessObj = new List(); + thicknessObj.Add(new FemDesign.Shells.Thickness(region.CoordinateSystem.Origin, thickness)); + + // + FemDesign.Shells.Slab obj = FemDesign.Shells.Slab.Plate(identifier, material, region, edgeConnection, eccentricity, orthotropy, thicknessObj); + + // set local x-axis + if (!x.Equals(Vector3d.Zero)) + { + obj.SlabPart.LocalX = x.FromRhino(); + } + + // set local z-axis + if (!z.Equals(Vector3d.Zero)) + { + obj.SlabPart.LocalZ = z.FromRhino(); + } + + // return + DA.SetData(0, obj); + } + protected override System.Drawing.Bitmap Icon + { + get + { + return FemDesign.Properties.Resources.Plate; + } + } + public override Guid ComponentGuid + { + get { return new Guid("{2C49099C-6ABF-4EFE-A30C-45A2B81BDC79}"); } + } + public override GH_Exposure Exposure => GH_Exposure.primary; + + } +} \ No newline at end of file diff --git a/FemDesign.Grasshopper/Shells/SlabWall.cs b/FemDesign.Grasshopper/Shells/SlabWall.cs index fb536295e..07b4b1aff 100644 --- a/FemDesign.Grasshopper/Shells/SlabWall.cs +++ b/FemDesign.Grasshopper/Shells/SlabWall.cs @@ -18,7 +18,6 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) pManager.AddNumberParameter("Thickness", "Thickness", "Thickness. [m]", GH_ParamAccess.item); pManager[pManager.ParamCount - 1].Optional = true; pManager.AddGenericParameter("Material", "Material", "Material.", GH_ParamAccess.item); - pManager[pManager.ParamCount - 1].Optional = true; pManager.AddGenericParameter("ShellEccentricity", "Eccentricity", "ShellEccentricity. Optional.", GH_ParamAccess.item); pManager[pManager.ParamCount - 1].Optional = true; pManager.AddGenericParameter("ShellOrthotropy", "Orthotropy", "ShellOrthotropy. Optional.", GH_ParamAccess.item); @@ -46,10 +45,7 @@ protected override void SolveInstance(IGH_DataAccess DA) DA.GetData(1, ref thickness); FemDesign.Materials.Material material = null; - if (!DA.GetData(2, ref material)) - { - material = FemDesign.Materials.MaterialDatabase.GetDefault().MaterialByName("C30/37"); - }; + if (!DA.GetData(2, ref material)) { return; } FemDesign.Shells.ShellEccentricity eccentricity = FemDesign.Shells.ShellEccentricity.Default; if(!DA.GetData(3, ref eccentricity)) @@ -122,7 +118,7 @@ protected override System.Drawing.Bitmap Icon } public override Guid ComponentGuid { - get { return new Guid("e26cd4b0-0582-4ea5-8705-3b9695937277"); } + get { return new Guid("{C3C9CD9E-BEE2-4B12-B0DE-60817FA7D2F5}"); } } public override GH_Exposure Exposure => GH_Exposure.primary; diff --git a/FemDesign.Grasshopper/Supports/StiffnessPoints.cs b/FemDesign.Grasshopper/Supports/StiffnessPoints.cs new file mode 100644 index 000000000..f440fdd24 --- /dev/null +++ b/FemDesign.Grasshopper/Supports/StiffnessPoints.cs @@ -0,0 +1,61 @@ +// https://strusoft.com/ +using System; +using Grasshopper.Kernel; +using Rhino.Geometry; +using FemDesign.Releases; + + +namespace FemDesign.Grasshopper +{ + public class StiffnessPoint : GH_Component + { + public StiffnessPoint() : base("StiffnessPoint", "StiffnessPoint", "Add Stiffness Point to a SurfaceSupport element.", CategoryName.Name(), + SubCategoryName.Cat1()) + { + + } + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("SurfaceSupport", "SurfaceSupport", "", GH_ParamAccess.item); + pManager.AddPointParameter("Position", "Position", "", GH_ParamAccess.item); + pManager.AddGenericParameter("Motions", "Motions", "Motions stiffness for the point.", GH_ParamAccess.item); + pManager.AddGenericParameter("Plastic Limits Forces Motions", "PlaLimM", "Plastic limits forces for motion springs. Optional.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + } + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("StiffnessPoint", "StiffnessPoint", "Define StiffnessPoint.", GH_ParamAccess.item); + } + protected override void SolveInstance(IGH_DataAccess DA) + { + FemDesign.Supports.SurfaceSupport surfaceSupport = null; + Point3d point = Point3d.Origin; + Motions motions = null; + MotionsPlasticLimits motionsPlasticLimit = null; + + if (!DA.GetData(0, ref surfaceSupport)) { return; } + if (!DA.GetData(1, ref point)) { return; } + if (!DA.GetData(2, ref motions)) { return; } + DA.GetData(3, ref motionsPlasticLimit); + + var stiffPoint = new FemDesign.Supports.StiffnessPoint(surfaceSupport, point.FromRhino(), motions, motionsPlasticLimit); + + + DA.SetData(0, stiffPoint); + } + protected override System.Drawing.Bitmap Icon + { + get + { + return FemDesign.Properties.Resources.StiffnessPoint; + } + } + public override Guid ComponentGuid + { + get { return new Guid("{3FA53044-C6D9-4483-BE65-AC8539FE43F6}"); } + } + + public override GH_Exposure Exposure => GH_Exposure.tertiary; + + } +} \ No newline at end of file diff --git a/FemDesign.Tests/Bars/BarTests.cs b/FemDesign.Tests/Bars/BarTests.cs new file mode 100644 index 000000000..174b5292c --- /dev/null +++ b/FemDesign.Tests/Bars/BarTests.cs @@ -0,0 +1,178 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using FemDesign.Bars; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FemDesign.Sections; +using FemDesign.Materials; + +namespace FemDesign.Bars.Tests +{ + [TestClass()] + public class BarTests + { + [TestInitialize] + public void ResetInstanceCounters() + { + // Reset all instance counters before each tests + PrivateType barPartType = new PrivateType(typeof(BarPart)); + barPartType.SetStaticFieldOrProperty("_barInstance", 0); + barPartType.SetStaticFieldOrProperty("_columnInstance", 0); + barPartType.SetStaticFieldOrProperty("_trussInstance", 0); + } + + [TestMethod("Bar constructor 1")] + public void BarConstructorTest1() + { + var edge = new Geometry.LineEdge(new Geometry.Point3d(0, 0, 0), new Geometry.Point3d(1, 0, 0)); + Bar bar = new Bar(edge, new Material(), GetTestSection(), "Truss"); + + Assert.AreEqual("Truss", bar.Identifier); + Assert.AreEqual(BarType.Truss, bar.Type); + Assert.AreEqual(1, bar.Instance); + + Bar bar2 = new Bar(edge, new Material(), GetTestSection(), "Truss"); + Assert.AreEqual(2, bar2.Instance); + } + + [TestMethod("Name, Identifier etc.")] + public void BarTest() + { + var bar = GetTestBar(); + bar.Identifier = "TestName"; + + Assert.AreEqual("TestName", bar.Identifier); + Assert.AreEqual("TestName.2", bar.Name); + Assert.AreEqual(2, bar.Instance); + } + + [TestMethod("Name, Identifier etc. (BarPart)")] + public void BarPartTest() + { + var bar = GetTestBar(); + bar.Identifier = "BP"; + + Assert.AreEqual("BP", bar.Identifier); + Assert.AreEqual("BP.2", bar.Name); + Assert.AreEqual(2, bar.Instance); + + Assert.AreEqual("BP", bar.BarPart.Identifier); + Assert.AreEqual("BP.2.1", bar.BarPart.Name); + Assert.AreEqual(2, bar.BarPart.Instance); + } + + [TestMethod("Identifier 1")] + public void BarTest3() + { + var bar = GetTestBar(); + bar.Identifier = "BeamOfLight"; + bar.Identifier = bar.Identifier; + bar.Identifier = bar.Identifier; + bar.Identifier = bar.Identifier; + bar.Identifier = bar.Identifier; + bar.Identifier = bar.Identifier; + + Assert.AreEqual("BeamOfLight", bar.Identifier); + } + + [TestMethod("Identifier 2")] + public void BarTest4() + { + var bar = GetTestBar(); + bar.Identifier = "Repeat"; + bar.Identifier = "Repeat"; + bar.Identifier = "Repeat"; + bar.Identifier = "Repeat"; + bar.Identifier = "Repeat"; + + Assert.AreEqual("Repeat", bar.Identifier); + } + + [TestMethod("Identifier validation")] + public void BarTest5() + { + var bar = GetTestBar(); + + bar.Identifier = "Valid"; + Assert.AreEqual("Valid", bar.Identifier); + + bar.Identifier = "Valid_1"; + Assert.AreEqual("Valid_1", bar.Identifier); + + bar.Identifier = "Valid.1.2.3"; + Assert.AreEqual("Valid.1.2.3", bar.Identifier); + + bar.Identifier = "Valid_åäöÅÄÖ~!£\"%^*()"; + Assert.AreEqual("Valid_åäöÅÄÖ~!£\"%^*()", bar.Identifier); + + Assert.ThrowsException(() => bar.Identifier = null); + Assert.ThrowsException(() => bar.Identifier = ""); + Assert.ThrowsException(() => bar.Identifier = "invalid char >"); + Assert.ThrowsException(() => bar.Identifier = "invalid char &"); + Assert.ThrowsException(() => bar.Identifier = "invalid char $"); + } + + [TestMethod("LockedIdentifier 1")] + public void LockedIdentifierTest() + { + var bar = GetTestBar(); + bar.LockedIdentifier = true; + + Assert.IsTrue(bar.LockedIdentifier); + Assert.IsFalse(bar.Name.StartsWith("@")); + + Assert.IsTrue(bar.BarPart.LockedIdentifier); + Assert.IsFalse(bar.BarPart.Name.StartsWith("@")); + } + + [TestMethod("LockedIdentifier 2")] + public void LockedIdentifierTest2() + { + Bar bar = GetTestBar(); + bar.LockedIdentifier = false; + + Assert.IsFalse(bar.LockedIdentifier); + Assert.IsFalse(bar.Name.StartsWith("@")); + + Assert.IsFalse(bar.BarPart.LockedIdentifier); + Assert.IsFalse(bar.BarPart.Name.StartsWith("@")); + } + + private static Bar GetTestBar() + { + var edge = new Geometry.LineEdge(new Geometry.Point3d(0, 0, 0), new Geometry.Point3d(1, 0, 0)); + Section section = GetTestSection(); + Material material = new Material(); + + return new Beam(edge, material, section, identifier: "Test"); + } + + private static Section GetTestSection() + { + return new FemDesign.Sections.Section( + new Geometry.RegionGroup( + new Geometry.Region( + new List { + new Geometry.Contour( + new List { + new Geometry.CircleEdge( + 0.010, + Geometry.Point3d.Origin, + Geometry.CoordinateSystem.Global() + ) + } + ) + } + ) + ), + "custom", + Materials.MaterialTypeEnum.Undefined, + "TestGroup", + "TestType", + "TestSize" + ); + } + } +} \ No newline at end of file diff --git a/FemDesign.Tests/Bars/CreateElements.cs b/FemDesign.Tests/Bars/CreateElementsTests.cs similarity index 99% rename from FemDesign.Tests/Bars/CreateElements.cs rename to FemDesign.Tests/Bars/CreateElementsTests.cs index 1e388f6a0..263af26c8 100644 --- a/FemDesign.Tests/Bars/CreateElements.cs +++ b/FemDesign.Tests/Bars/CreateElementsTests.cs @@ -9,7 +9,7 @@ namespace FemDesign.Bars { [TestClass()] - public class CreateElements + public class CreateElementsTests { [TestCategory("FEM-Design required")] [TestMethod("Create a Linear Beam,Bar,Truss and Deserialise")] diff --git a/FemDesign.Tests/Entities/StiffnessPointsTests.cs b/FemDesign.Tests/Entities/StiffnessPointsTests.cs new file mode 100644 index 000000000..6d581d2f1 --- /dev/null +++ b/FemDesign.Tests/Entities/StiffnessPointsTests.cs @@ -0,0 +1,36 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.IO; +using System.Collections.Generic; +using System.Xml.Serialization; +using FemDesign.Supports; + +namespace FemDesign.Entities +{ + [TestClass()] + public class StiffnessPointsTests + { + [TestMethod("Create")] + public void Create() + { + var rectangle = FemDesign.Geometry.Region.RectangleXY(Geometry.Point3d.Origin, 5, 5); + var surface = new SurfaceSupport(rectangle, Releases.Motions.RigidPoint()); + var point = new FemDesign.Geometry.Point3d(5, 0.123, -0.39); + var stiffnessPoint = new FemDesign.Supports.StiffnessPoint(surface, point, Releases.Motions.RigidPoint(), new Releases.MotionsPlasticLimits(10,10,10,10,10,10)); + + var objText = SerializeToString(stiffnessPoint); + Console.Write(objText); + } + + public static string SerializeToString(StiffnessPoint stiffPoint) + { + // serialize + XmlSerializer serializer = new XmlSerializer(typeof(StiffnessPoint)); + using (TextWriter writer = new StringWriter()) + { + serializer.Serialize(writer, stiffPoint); + return writer.ToString(); + } + } + } +} diff --git a/FemDesign.Tests/FemDesign.Tests.csproj b/FemDesign.Tests/FemDesign.Tests.csproj index 7236a8c4d..c286cbbc6 100644 --- a/FemDesign.Tests/FemDesign.Tests.csproj +++ b/FemDesign.Tests/FemDesign.Tests.csproj @@ -70,18 +70,21 @@ Properties\GlobalAssemblyInfo.cs - + + + + - + @@ -117,6 +120,9 @@ Always + + Always + Always diff --git a/FemDesign.Tests/GenericClasses/EnumHelpersTests.cs b/FemDesign.Tests/GenericClasses/EnumHelpersTests.cs index 6bfe361ba..b81c2c5de 100644 --- a/FemDesign.Tests/GenericClasses/EnumHelpersTests.cs +++ b/FemDesign.Tests/GenericClasses/EnumHelpersTests.cs @@ -27,5 +27,17 @@ public void ParseCountryTest() Assert.Fail($"Should be able to parse country \"{countryCode}\" successfully"); } } + + [TestMethod("Parse Activation Type")] + public void ParseLoadActivation() + { + Assert.IsTrue(EnumParser.Parse("0") == ActivationType.OnlyInThisStage); + Assert.IsTrue(EnumParser.Parse("1") == ActivationType.FromThisStageOn); + Assert.IsTrue(EnumParser.Parse("2") == ActivationType.ShiftedFromFirstStage); + Assert.IsTrue(EnumParser.Parse("3") == ActivationType.OnlyStageActivatedElements); + + Assert.IsTrue(EnumParser.Parse("only_in_this_stage") == ActivationType.OnlyInThisStage); + Assert.IsTrue(EnumParser.Parse("only_stage_activated_elem") == ActivationType.OnlyStageActivatedElements); + } } } \ No newline at end of file diff --git a/FemDesign.Tests/Geometry/RegionTest.cs b/FemDesign.Tests/Geometry/RegionTest.cs index 3b3f6ff2e..304d18a09 100644 --- a/FemDesign.Tests/Geometry/RegionTest.cs +++ b/FemDesign.Tests/Geometry/RegionTest.cs @@ -12,14 +12,15 @@ public class RegionTest [TestMethod("Create Rectangle Slab")] public void CreateRectangle() { - // var rectangleWall = FemDesign.Shells.Slab.Wall( + Point3d.Origin, + new Point3d(10, 10, 0), 10.0, - 20.0, 0.1, FemDesign.Materials.MaterialDatabase.GetDefault().MaterialByName("C30/37")); var rectangleWall2 = FemDesign.Shells.Slab.Plate( + Point3d.Origin, 10.0, 20.0, 0.1, diff --git a/FemDesign.Tests/Loads/Load combination case types.struxml b/FemDesign.Tests/Loads/Load combination case types.struxml new file mode 100644 index 000000000..627181801 --- /dev/null +++ b/FemDesign.Tests/Loads/Load combination case types.struxml @@ -0,0 +1,440 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + -10 + + + + + 0 + -10 + + + + + 0 + -10 + + + + + 0 + -10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 0.142593308852768 0.285186617705536 0.500000001781668 0.712966544263839 0.855559853116607 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+ + +
+
+ +
+ + +
+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/FemDesign.Tests/Loads/LoadCombinationTests.cs b/FemDesign.Tests/Loads/LoadCombinationTests.cs new file mode 100644 index 000000000..eac32ec1d --- /dev/null +++ b/FemDesign.Tests/Loads/LoadCombinationTests.cs @@ -0,0 +1,108 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using FemDesign.Loads; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FemDesign.Loads +{ + [TestClass()] + public class LoadCombinationTests + { + [TestCategory("FEM-Design required")] + [TestMethod("Load combinations - Deserialize")] + public void LoadCombinationTest1() + { + Model model = Model.DeserializeFromFilePath("Loads/Load combination case types.struxml"); + + Assert.AreEqual(4, model.Entities.Loads.LoadCombinations.Count); + var comb1 = model.Entities.Loads.LoadCombinations[0]; + var comb2 = model.Entities.Loads.LoadCombinations[1]; + var comb3 = model.Entities.Loads.LoadCombinations[2]; + var comb4 = model.Entities.Loads.LoadCombinations[3]; + + // LoadCase and moving load load cases + Assert.AreEqual(1, comb1.ModelLoadCase.Count); + Assert.AreEqual(1, comb2.ModelLoadCase.Count); + Assert.AreEqual(1, comb3.ModelLoadCase.Count); + Assert.AreEqual(1, comb4.ModelLoadCase.Count); + + Assert.IsFalse(comb1.ModelLoadCase[0].IsMovingLoadLoadCase); + Assert.IsFalse(comb2.ModelLoadCase[0].IsMovingLoadLoadCase); + Assert.IsFalse(comb3.ModelLoadCase[0].IsMovingLoadLoadCase); + Assert.IsTrue(comb4.ModelLoadCase[0].IsMovingLoadLoadCase); + + Assert.IsNotNull(comb1.ModelLoadCase[0].LoadCase); + Assert.IsNotNull(comb2.ModelLoadCase[0].LoadCase); + Assert.IsNotNull(comb3.ModelLoadCase[0].LoadCase); + Assert.IsNull(comb4.ModelLoadCase[0].LoadCase); + + // Seismic + Assert.IsNotNull(comb2.SeismicMax); + Assert.IsNotNull(comb2.SeismicResFxMinusMx); + Assert.IsNotNull(comb2.SeismicResFxPlusMx); + Assert.IsNotNull(comb2.SeismicResFyMinusMy); + Assert.IsNotNull(comb2.SeismicResFyPlusMy); + Assert.IsNotNull(comb2.SeismicResFz); + + // PTC + Assert.IsNotNull(comb3.PtcT0); + Assert.IsNotNull(comb3.PtcT8); + + // Pile + Assert.IsNotNull(comb3.PileLoadCase); + + // Construction stages + Assert.AreEqual("cs.1", comb1.StageLoadCase._stageType); + Assert.AreEqual(1, comb1.StageLoadCase.StageIndex); + Assert.IsFalse(comb1.StageLoadCase.IsFinalStage); + Assert.IsNotNull(comb1.StageLoadCase.Stage); + + Assert.AreEqual("cs.2", comb2.StageLoadCase._stageType); + Assert.AreEqual(2, comb2.StageLoadCase.StageIndex); + Assert.IsFalse(comb2.StageLoadCase.IsFinalStage); + Assert.IsNotNull(comb2.StageLoadCase.Stage); + + Assert.AreEqual("final_cs", comb3.StageLoadCase._stageType); + Assert.AreEqual(-1, comb3.StageLoadCase.StageIndex); + Assert.IsTrue(comb3.StageLoadCase.IsFinalStage); + Assert.IsNull(comb3.StageLoadCase.Stage); + } + + [TestCategory("FEM-Design required")] + [TestMethod("Load combinations - Serialize")] + public void LoadCombinationTest2() + { + Model expected = Model.DeserializeFromFilePath("Loads/Load combination case types.struxml"); + expected.SerializeModel("Loads/out.struxml"); + Model actual = Model.DeserializeFromFilePath("Loads/out.struxml"); + + Assert.AreEqual(expected.Entities.Loads.LoadCombinations.Count, actual.Entities.Loads.LoadCombinations.Count); + var e = expected.Entities.Loads.LoadCombinations; + var a = actual.Entities.Loads.LoadCombinations; + + for (int i = 0; i < a.Count; i++) + { + Assert.AreEqual(e[i].ModelLoadCase.Count, a[i].ModelLoadCase.Count); + for (int j = 0; j < a[i].ModelLoadCase.Count; j++) + Assert.AreEqual(e[i].ModelLoadCase[j].Gamma, a[i].ModelLoadCase[j].Gamma); + + Assert.AreEqual(e[i].SeismicMax?.Gamma, a[i].SeismicMax?.Gamma); + Assert.AreEqual(e[i].SeismicResFxPlusMx?.Gamma, a[i].SeismicResFxPlusMx?.Gamma); + Assert.AreEqual(e[i].SeismicResFxMinusMx?.Gamma, a[i].SeismicResFxMinusMx?.Gamma); + Assert.AreEqual(e[i].SeismicResFyPlusMy?.Gamma, a[i].SeismicResFyPlusMy?.Gamma); + Assert.AreEqual(e[i].SeismicResFyMinusMy?.Gamma, a[i].SeismicResFyMinusMy?.Gamma); + Assert.AreEqual(e[i].SeismicResFz?.Gamma, a[i].SeismicResFz?.Gamma); + + Assert.AreEqual(e[i].PtcT0?.Gamma, a[i].PtcT0?.Gamma); + Assert.AreEqual(e[i].PtcT8?.Gamma, a[i].PtcT8?.Gamma); + + Assert.AreEqual(e[i].PileLoadCase?.Gamma, a[i].PileLoadCase?.Gamma); + + Assert.AreEqual(e[i].StageLoadCase?._stageType, a[i].StageLoadCase?._stageType); + } + } + } +} \ No newline at end of file diff --git a/FemDesign.Tests/Performance/BeamGeneration.cs b/FemDesign.Tests/Performance/BeamGenerationTests.cs similarity index 98% rename from FemDesign.Tests/Performance/BeamGeneration.cs rename to FemDesign.Tests/Performance/BeamGenerationTests.cs index 447fec18c..47ac53933 100644 --- a/FemDesign.Tests/Performance/BeamGeneration.cs +++ b/FemDesign.Tests/Performance/BeamGenerationTests.cs @@ -12,7 +12,7 @@ namespace FemDesign.Performance { [TestClass()] - public class BeamGeneration + public class BeamGenerationTests { [TestMethod("GenerateBeam")] [TestCategory("FEM-Design required"), TestCategory("Performance")] diff --git a/femdesign-api.sln b/femdesign-api.sln index 973082be1..254b656bf 100644 --- a/femdesign-api.sln +++ b/femdesign-api.sln @@ -10,6 +10,7 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FemDesign.Dynamo", "FemDesign.Dynamo\FemDesign.Dynamo.csproj", "{419CA97B-DCA5-40EF-A640-7691622E3BE5}" ProjectSection(ProjectDependencies) = postProject {81B4BC3B-8FC7-46FA-8C79-DFAA1C16FE21} = {81B4BC3B-8FC7-46FA-8C79-DFAA1C16FE21} + {1D91EBF4-A473-4C5B-A171-AB2DA1B7017B} = {1D91EBF4-A473-4C5B-A171-AB2DA1B7017B} EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FemDesign.Examples", "FemDesign.Examples", "{C68FA42C-7B20-4FE3-AED6-8B6619EE5410}" @@ -46,6 +47,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example 5 - Design a beam", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FemDesign.Tests", "FemDesign.Tests\FemDesign.Tests.csproj", "{CCADA385-E5FB-4F08-BC50-1826BBEF9794}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Practical example - Stiffness Point from CSV", "FemDesign.Examples\C#\Practical example - Create Stiffness Point from a CSV\Practical example - Stiffness Point from CSV.csproj", "{CA1CEF5F-1122-4D9B-B21D-3FB260335598}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -61,6 +64,7 @@ Global {04F35658-7446-4513-AA4D-17B4782D3D00}.Release|Any CPU.ActiveCfg = Release|Any CPU {04F35658-7446-4513-AA4D-17B4782D3D00}.Release|Any CPU.Build.0 = Release|Any CPU {419CA97B-DCA5-40EF-A640-7691622E3BE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {419CA97B-DCA5-40EF-A640-7691622E3BE5}.Debug|Any CPU.Build.0 = Debug|Any CPU {419CA97B-DCA5-40EF-A640-7691622E3BE5}.Release|Any CPU.ActiveCfg = Release|Any CPU {419CA97B-DCA5-40EF-A640-7691622E3BE5}.Release|Any CPU.Build.0 = Release|Any CPU {1E5D535D-C21B-454B-A62E-1DF4D968E677}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -127,6 +131,10 @@ Global {CCADA385-E5FB-4F08-BC50-1826BBEF9794}.Debug|Any CPU.Build.0 = Debug|Any CPU {CCADA385-E5FB-4F08-BC50-1826BBEF9794}.Release|Any CPU.ActiveCfg = Release|Any CPU {CCADA385-E5FB-4F08-BC50-1826BBEF9794}.Release|Any CPU.Build.0 = Release|Any CPU + {CA1CEF5F-1122-4D9B-B21D-3FB260335598}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA1CEF5F-1122-4D9B-B21D-3FB260335598}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA1CEF5F-1122-4D9B-B21D-3FB260335598}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA1CEF5F-1122-4D9B-B21D-3FB260335598}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -146,6 +154,7 @@ Global {8954D8AD-051F-4B44-87A4-559C00DB1CD6} = {C68FA42C-7B20-4FE3-AED6-8B6619EE5410} {A261E23F-DF9D-4ED5-8DC6-0DB6ECB06B9F} = {C68FA42C-7B20-4FE3-AED6-8B6619EE5410} {04FA45B2-F2AF-4394-99F8-E50A82E91658} = {C68FA42C-7B20-4FE3-AED6-8B6619EE5410} + {CA1CEF5F-1122-4D9B-B21D-3FB260335598} = {C68FA42C-7B20-4FE3-AED6-8B6619EE5410} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DDF9D949-F79B-4EA6-A766-976B0BE0BC79}