civil 3d偏移路线加宽过渡段平滑


我在autodesk论坛中的发的相关帖子:

加宽过渡段不够平滑

how to add smooth AlignmentTransition

把相关的代码发到此处:

使用方法AddWidening时不会读取命令设置里的值,

需要使用方法AddAutoWidenings才行。

[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();
    }
}
[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 alignmentSubEntityArcList = new List();
    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();
    }
} 

相关