how to add smooth AlignmentTransition

how to add smooth AlignmentTransition

465340553
Mentor Mentor
894 Views
2 Replies
Message 1 of 3

how to add smooth AlignmentTransition

465340553
Mentor
Mentor

I reference this post, 

add widening to alignment,

but the transition isn't smooth。

 

I know using command “Addwidening” create  widening manually,

I can modify the command settings “LinearTransitionAroundCurves.NumberOfSegments”,

and then the transition is smooth 。

 

How to modify the code to create a smooth transition?

thanks!

 

QQ截图20220516175449.jpg

 

 

[CommandMethod("TestOffsetAlign")]
public void offalign()
{
    var doc = Application.DocumentManager.MdiActiveDocument;
    var ed = doc.Editor;
    var db = doc.Database;
    var civDoc = CivilApplication.ActiveDocument;
    var entOpts = new PromptEntityOptions("\nSelect an alignment to offset:");
    entOpts.SetRejectMessage("...not an alignment, try again!");
    entOpts.AddAllowedClass(typeof(Alignment), true);
    var entSel = ed.GetEntity(entOpts);
    if (entSel.Status != PromptStatus.OK)
        return;
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        var align1 = (Alignment)tr.GetObject(entSel.ObjectId, OpenMode.ForRead);
        var align2id = Alignment.CreateOffsetAlignment("OffsetAlignment", align1.ObjectId, 10.0, align1.StyleId);
        var align2 = (Alignment)tr.GetObject(align2id, OpenMode.ForWrite);
        var oInfo = align2.OffsetAlignmentInfo;
        oInfo.AddWidening(150, 250, 20);
        var r2 = oInfo.Regions[1];
        r2.EntryTransition.TransitionType = Autodesk.Civil.TransitionType.CurveLineCurve;
        CurveLineCurveTransitionDescription entrydesc = (CurveLineCurveTransitionDescription)r2.EntryTransition.TransitionDescription;
        entrydesc.StartStation = 100;
        entrydesc.Length = 50;
        entrydesc.EntryCurveRadius = 15;
        entrydesc.ExitCurveRadius = 15;
        r2.ExitTransition.TransitionType = Autodesk.Civil.TransitionType.Linear;
        LinearTransitionDescription exitdesc = (LinearTransitionDescription)r2.ExitTransition.TransitionDescription;
        exitdesc.StartStation = 250;
        exitdesc.Length = 250;
        tr.Commit();
    }
}

 

 

 

 

王磊
您认为此帖子是否有用?欢迎为此帖点赞。
您的问题是否已得到解答?请点击“接受解答”按钮。

EESignature

0 Likes
Accepted solutions (2)
895 Views
2 Replies
Replies (2)
Message 2 of 3

hosneyalaa
Advisor
Advisor
Accepted solution
Message 3 of 3

465340553
Mentor
Mentor
Accepted solution

Thank you very much!

the method “AddAutoWidenings” meets my needs。

 

QQ截图20220518075912.jpg

 

I convert the code to C#。

 

 

[CommandMethod("TestOffsetAlign2")]
public void C_TestOffsetAlign2()
{
    var doc = Application.DocumentManager.MdiActiveDocument;
    var ed = doc.Editor;
    var db = doc.Database;
    var civDoc = CivilApplication.ActiveDocument;
    var entOpts = new PromptEntityOptions("\nSelect an alignment to offset:");
    entOpts.SetRejectMessage("...not an alignment, try again!");
    entOpts.AddAllowedClass(typeof(Alignment), true);
    var entSel = ed.GetEntity(entOpts);
    if (entSel.Status != PromptStatus.OK)
        return;
    List<AlignmentSubEntityArc> alignmentSubEntityArcList = new List<AlignmentSubEntityArc>();
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        //Open Main Alignment for Read
        Alignment align = tr.GetObject(entSel.ObjectId, OpenMode.ForRead) as Alignment;

        //Build List of Alignment Arcs
        foreach (AlignmentEntity alignEnt in align.Entities)
        {
            int subEntCount = System.Convert.ToInt32(alignEnt.SubEntityCount);
            for (int i = 0; i <= subEntCount - 1; i++)
            {
                AlignmentSubEntity alignSubEnt = alignEnt[i];

                if (alignSubEnt.SubEntityType == AlignmentSubEntityType.Arc)
                {
                    alignmentSubEntityArcList.Add(alignSubEnt as AlignmentSubEntityArc);

                }

            }
        }

        //Convert List of Arcs to Array
        AlignmentSubEntityArc[] arcs = alignmentSubEntityArcList.ToArray();

        //Create Left and Right Offset Alignments
        ObjectId offsetAlignRightId = Alignment.CreateOffsetAlignment(db, "MyOffsetAlignmentRight", align.Name, 30, "Standard");
        ObjectId offsetAlignLeftId = Alignment.CreateOffsetAlignment(db, "MyOffsetAlignmentLeft", align.Name, -30, "Standard");

        //Get Left and Right Offset Alignments
        Alignment offsetAlignRight = offsetAlignRightId.GetObject(OpenMode.ForWrite) as Alignment;
        Alignment offsetAlignLeft = offsetAlignLeftId.GetObject(OpenMode.ForWrite) as Alignment;

        //Get Left andd Right Offset Info
        OffsetAlignmentInfo offsetInfoRight = offsetAlignRight.OffsetAlignmentInfo;
        OffsetAlignmentInfo offsetInfoLeft = offsetAlignLeft.OffsetAlignmentInfo;

        //Create AutoWidening Info
        AutoWideningInfo widenInfo = new AutoWideningInfo() { IncreasedWidth = 50, Side = Autodesk.Civil.WideningSide.Both, TransitionLength = 100 };

        //Add the Left and Right AutoWidening Info
        offsetInfoRight.AddAutoWidenings(widenInfo, arcs);
        offsetInfoLeft.AddAutoWidenings(widenInfo, arcs);

        //Commit Transaction
        tr.Commit();
    }
} 

 

 

王磊
您认为此帖子是否有用?欢迎为此帖点赞。
您的问题是否已得到解答?请点击“接受解答”按钮。

EESignature