private void CreateRevitElement()
        {
            if (this.AlignmentSegmentElement is Line)
            {
                Autodesk.Revit.DB.Line L = Autodesk.Revit.DB.Line.CreateBound(this.GetStartPoint(), this.GetEndPoint());
                RevitSegmentElement = L;

                if ((bool)ObjectPlacement.TransForm.CreateAlignment)
                {
                    try
                    {
                        var ConvertedPointStart             = RevitPlacmenElement.ConvertPointToInternal(this.GetStartPoint());
                        var ConvertedEndPoint               = RevitPlacmenElement.ConvertPointToInternal(this.GetEndPoint());
                        Autodesk.Revit.DB.Line ConvrtedLine = Autodesk.Revit.DB.Line.CreateBound(ConvertedPointStart, ConvertedEndPoint);
                        CreateRevitElementInRevit(ConvrtedLine);
                    }
                    catch (Exception)
                    {
                    }
                    // Create a ModelArc element using the created geometry arc and sketch plane
                }
            }
            if (this.AlignmentSegmentElement is IrregularLine)
            {
                // Autodesk.Revit.DB.Line L = Autodesk.Revit.DB.Line.CreateBound(this.GetStartPoint().PlacementPoint, this.GetEndPoint().PlacementPoint);
                //  RevitSegmentElement = L;
            }
            if (this.AlignmentSegmentElement is Curve)
            {
                var StartPoint = this.GetStartPoint();
                var EndPoint   = this.GetEndPoint();
                var Radius     = this.GetCurveRadius();

                Arc C = CreateArc(StartPoint, EndPoint, Radius, (bool)false);
                RevitSegmentElement = C;

                if ((bool)ObjectPlacement.TransForm.CreateAlignment)
                {
                    try
                    {
                        var ConvertedPointStart = RevitPlacmenElement.ConvertPointToInternal(this.GetStartPoint());
                        var ConvertedEndPoint   = RevitPlacmenElement.ConvertPointToInternal(this.GetEndPoint());
                        var ConvertedRadius     = RevitPlacmenElement.ConvertDoubleToInternal(Radius);
                        Arc ConcertedCurve      = CreateArc(ConvertedPointStart, ConvertedEndPoint, ConvertedRadius, (bool)false);
                        CreateRevitElementInRevit(ConcertedCurve);
                    }
                    catch (Exception)
                    {
                    }
                    // Create a ModelArc element using the created geometry arc and sketch plane
                }
            }
            if (this.AlignmentSegmentElement is Spiral)
            {
                var Sp          = (this.AlignmentSegmentElement as Spiral);
                var NurbsSpline = CreateaSpiral(Sp);
                RevitSegmentElement = NurbsSpline;

                if ((bool)ObjectPlacement.TransForm.CreateAlignment)
                {
                    try
                    {
                        List <XYZ> ConvertedPoints = new List <XYZ>();
                        foreach (XYZ item in NurbsSpline.CtrlPoints)
                        {
                            var ConvertedPointStart = RevitPlacmenElement.ConvertPointToInternal(item);

                            ConvertedPoints.Add(ConvertedPointStart);
                        }
                        List <double> Weights             = Enumerable.Repeat(1.0, ConvertedPoints.Count).ToList();
                        var           ConvertedNurbsCurve = NurbSpline.CreateCurve(ConvertedPoints, Weights);
                        CreateRevitElementInRevit(ConvertedNurbsCurve);
                    }
                    catch (Exception)
                    {
                    }
                    // Create a ModelArc element using the created geometry arc and sketch plane
                }
            }
            if (this.AlignmentSegmentElement is Chain)
            {
                //Review
                //return ExtractPoint((this.AlignmentElement as Chain).Text);
            }
        }
        internal static List <(FamilyInstance, RevitPlacmenElement)> PlaceRevitFamilies(List <RevitPlacmenElement> RevitPlacmentPoints, UIDocument uiDoc, string FamilyPath, string TypeName, ElementTransformParams transform)
        {
            List <(FamilyInstance, RevitPlacmenElement)> CreatedInstances = new List <(FamilyInstance, RevitPlacmenElement)>();
            string FamilyName = string.Empty;

            RevitPlacmentPoints = RevitPlacmentPoints.Distinct(new ComparePlacmentPoints()).ToList();
            RevitPlacmentPoints.Sort(delegate(RevitPlacmenElement c1, RevitPlacmenElement c2) { return(c1.Station.CompareTo(c2.Station)); });
            using (Transaction T = new Transaction(uiDoc.Document, "Place Objects"))
            {
                T.Start();
                try
                {
                    uiDoc.Document.LoadFamily(FamilyPath);
                    FamilyName = System.IO.Path.GetFileNameWithoutExtension(FamilyPath);
                }
                catch (Exception) { }
                try
                {
                    FamilySymbol Fam = new FilteredElementCollector(uiDoc.Document).OfClass(typeof(FamilySymbol)).Cast <FamilySymbol>().FirstOrDefault(F => F.Name == TypeName && F.FamilyName == FamilyName);
                    Fam.Activate();

                    if (transform.StationToStartFrom != default(double))
                    {
                        RevitPlacmentPoints.RemoveAll(E => E.Station < transform.StationToStartFrom);
                    }
                    if (transform.StationToEndAt != default(double))
                    {
                        RevitPlacmentPoints.RemoveAll(E => E.Station > transform.StationToEndAt);
                    }

                    for (int i = 0; i < RevitPlacmentPoints.Count; i++)
                    {
                        FamilyInstance FamIns = uiDoc.Document.Create.NewFamilyInstance(RevitPlacmenElement.ConvertPointToInternal(RevitPlacmentPoints[i].PlacementPoint), Fam, Autodesk.Revit.DB.Structure.StructuralType.NonStructural);
                        RevitPlacmentPoints[i].FillAttributes(FamIns);

                        CreatedInstances.Add((FamIns, RevitPlacmentPoints[i]));
        public RevitPlacmenElement GetPointAtStation(double StationToStudy)
        {
            RevitPlacmenElement PointElement = null;

            if (this.AlignmentSegmentElement is Line)
            {
                XYZ    Point        = (this.RevitSegmentElement as Autodesk.Revit.DB.Line).Evaluate(StationToStudy - Station, false);
                XYZ    NextPoint    = (this.RevitSegmentElement as Autodesk.Revit.DB.Line).Evaluate(StationToStudy + 0.0001 - Station, false);
                double AngleToXAxis = ExtractAngleInX(Point, NextPoint);

                XYZ AxisRotationPoint = (this.RevitSegmentElement as Autodesk.Revit.DB.Line).Evaluate(StationToStudy + 0.01 - Station, false);
                var SimplfiedAxis     = Autodesk.Revit.DB.Line.CreateBound(Point, AxisRotationPoint);
                PointElement = new RevitPlacmenElement(Point, StationToStudy, this.Alignment, AngleToXAxis, SimplfiedAxis);
            }
            if (this.AlignmentSegmentElement is IrregularLine)
            {
                // XYZ Point = (this.RevitSegmentElement as Autodesk.Revit.DB.Line).Evaluate(StationToStudy - Station, false);
                //  PointElement = new RevitPlacmenElement(Point, StationToStudy, this.Alignment);
            }
            if (this.AlignmentSegmentElement is Curve)
            {
                double StationParam;
                StationParam = 1 - (((StationToStudy - this.Station)) / this.GetLength());
                XYZ Point = (this.RevitSegmentElement as Autodesk.Revit.DB.Arc).Evaluate(StationParam, true);

                var NextStationParam = 1 - (((StationToStudy + 0.0001 - this.Station)) / this.GetLength());
                var NextPoint        = (this.RevitSegmentElement as Autodesk.Revit.DB.Arc).Evaluate(NextStationParam, true);

                double AngleToXAxis = ExtractAngleInX(Point, NextPoint);

                var AxisStationParam  = 1 - (((StationToStudy + 0.01 - this.Station)) / this.GetLength());
                var AxisRotationPoint = (this.RevitSegmentElement as Autodesk.Revit.DB.Arc).Evaluate(AxisStationParam, true);
                var SimplfiedAxis     = Autodesk.Revit.DB.Line.CreateBound(Point, AxisRotationPoint);

                PointElement = new RevitPlacmenElement(Point, StationToStudy, this.Alignment, AngleToXAxis, SimplfiedAxis);
            }
            if (this.AlignmentSegmentElement is Spiral)
            {
                double StationParam = (StationToStudy - this.Station) / this.GetLength();
                XYZ    Point        = (this.RevitSegmentElement as NurbSpline).Evaluate((StationToStudy - this.Station), false);

                double StationParamNext = (StationToStudy + 0.0001 - this.Station) / this.GetLength();
                XYZ    NextPoint        = (this.RevitSegmentElement as NurbSpline).Evaluate(StationParamNext, false);

                double AngleToXAxis = ExtractAngleInX(Point, NextPoint);


                double AxisStationParam = (StationToStudy + 0.01 - this.Station) / this.GetLength();
                XYZ    AxisPoint        = (this.RevitSegmentElement as NurbSpline).Evaluate(AxisStationParam, false);
                var    SimplfiedAxis    = Autodesk.Revit.DB.Line.CreateBound(Point, AxisPoint);

                PointElement = new RevitPlacmenElement(Point, StationToStudy, this.Alignment, AngleToXAxis, SimplfiedAxis);
            }
            if (this.AlignmentSegmentElement is Chain)
            {
                //Review
                //return ExtractPoint((this.AlignmentElement as Chain).Text);
            }

            return(PointElement);
        }