//----------------------------------------------------------------------- //----------------------------------------------------------------------- // file="StepBSplineCurve.cs" // Project: StgSharp // AuthorGroup: Nitload Space // Copyright (c) Nitload Space. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the ¡°Software¡±), to deal in the Software without restriction, // including without limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of the Software, // and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and // this permission notice shall be included in all copies // or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED ¡°AS IS¡±, // WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, // ARISING FROM, OUT OF OR IN CONNECTION WITH // THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //----------------------------------------------------------------------- //----------------------------------------------------------------------- using StgSharp.Model.Step; using StgSharp.Script; using StgSharp.Script.Express; using System; using System.Collections.Generic; using System.Linq; namespace StgSharp.Model.Step { public enum StepBSplineCurveForm { Polyline, CircularArc, EllipticalArc, ParabolicArc, HyperbolicArc, Unspecified } public static class StepExpEnumValue { internal const string CIRCULAR_ARC = "CIRCULAR_ARC"; internal const string ELLIPTIC_ARC = "ELLIPTIC_ARC"; internal const string HYPERBOLIC_ARC = "HYPERBOLIC_ARC"; internal const string PARABOLIC_ARC = "PARABOLIC_ARC"; internal const string POLYLINE_FORM = "POLYLINE_FORM"; internal const string UNSPECIFIED = "UNSPECIFIED"; internal static HashSet AllPossibleValue { get; } = [ CIRCULAR_ARC, ELLIPTIC_ARC, HYPERBOLIC_ARC, PARABOLIC_ARC, POLYLINE_FORM, UNSPECIFIED, ]; } public class StepBSplineCurve : StepBoundedCurve, IExpConvertableFrom { public StepBSplineCurve( StepModel model, params StepCartesianPoint[] controlPoints ) : this( model, ( IEnumerable )controlPoints ) { } public StepBSplineCurve( StepModel model, IEnumerable controlPoints ) : base( model ) { ControlPointsList.AddRange( controlPoints ); } public bool ClosedCurve { get; set; } public bool SelfIntersect { get; set; } public int Degree { get; set; } public List ControlPointsList { get; private set; } = new List(); public StepBSplineCurveForm CurveForm { get; set; } = StepBSplineCurveForm.Unspecified; public void FromInstance( StepBSplineCurve entity ) { base.FromInstance( entity ); this.Degree = entity.Degree; this.ClosedCurve = entity.ClosedCurve; this.ControlPointsList = entity.ControlPointsList; this.SelfIntersect = entity.SelfIntersect; } public override bool IsConvertableTo( string entityName ) { return base.IsConvertableTo( entityName ) || entityName == "StepBSplineCurve"; } protected static string GetCurveFormString( StepBSplineCurveForm form ) { return form switch { StepBSplineCurveForm.Polyline => StepExpEnumValue.POLYLINE_FORM, StepBSplineCurveForm.CircularArc => StepExpEnumValue.CIRCULAR_ARC, StepBSplineCurveForm.EllipticalArc => StepExpEnumValue.ELLIPTIC_ARC, StepBSplineCurveForm.ParabolicArc => StepExpEnumValue.PARABOLIC_ARC, StepBSplineCurveForm.HyperbolicArc => StepExpEnumValue.HYPERBOLIC_ARC, StepBSplineCurveForm.Unspecified => StepExpEnumValue.UNSPECIFIED, _ => throw new NotImplementedException(), }; } protected static StepBSplineCurveForm ParseCurveForm( string enumerationValue ) { return enumerationValue.ToUpperInvariant() switch { StepExpEnumValue.POLYLINE_FORM => StepBSplineCurveForm.Polyline, StepExpEnumValue.CIRCULAR_ARC => StepBSplineCurveForm.CircularArc, StepExpEnumValue.ELLIPTIC_ARC => StepBSplineCurveForm.EllipticalArc, StepExpEnumValue.PARABOLIC_ARC => StepBSplineCurveForm.ParabolicArc, StepExpEnumValue.HYPERBOLIC_ARC => StepBSplineCurveForm.HyperbolicArc, _ => StepBSplineCurveForm.Unspecified, }; } } }