欢迎来到我的博客
Civil 3D开发与应用,欢迎加入QQ群:484124761
AutoCAD开发,欢迎加入QQ群:193522571

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<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();
    }
} 
复制代码

 

注意:

AlignmentSubEntityArc是父路线的,不是偏移路线的!!!!!!!

 

posted @   david96007  阅读(218)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2017-05-18 学习 Civil 3D二次开发从哪儿开始?
点击右上角即可分享
微信分享提示