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; ListalignmentSubEntityArcList = 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(); } }