筑龙首页

[分享]路桥BIM技术:Civil3D从文件创建纵断面圆曲线代码

发表于2018-02-12    778人浏览    1人跟帖    筑龙币+100  复制链接  只看楼主

筑龙币+100

xhf0293

从文件创建纵断面,

Civil 3D内部命令创建的是抛物线,

《Civil 3D从入门到精通》讲师自己写了一点儿代码,

可以创建圆曲线,

有兴趣的朋友可以看一下。

==============================

using System;

using System.Collections.Generic;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.Geometry;

using Autodesk.Civil.ApplicationServices;

using Autodesk.Civil.DatabaseServices;

using Surface= Autodesk.Civil.DatabaseServices.Surface;

using Autodesk.Civil.Settings;

using System.IO;

namespace ProfileTools

{

    struct ser { public double station; public double elevation; public double radius; }  //用于存储桩号、高程及圆弧半径的strcut

    /// <summary>

    /// 从文件创建纵断面,模仿civil3d内部命令

    /// 不同之处在于此命令创建的竖曲线为圆弧

    /// 2018年2月12日,文件格式如下

    /// 0,100

    /// 100,105,200

    /// 200,100,300

    /// 300,108

    /// 450,103

    /// 550,104,400

    /// 650,100

    /// </summary>

    class CreateProfileFromFile

    {

        Document doc;

        Editor ed;

        CivilDocument civilDoc;

        ObjectId layerId;

        ObjectId styleId;

        ObjectId labelSetId;

        ObjectId alignmentId;

        string fileName;

        public CreateProfileFromFile()

        {

            doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            ed = doc.Editor;

            civilDoc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;

            layerId = civilDoc.Settings.DrawingSettings.ObjectLayerSettings.GetObjectLayerSetting(SettingsObjectLayerType.Profile).LayerId;

            styleId = civilDoc.Settings.GetSettings<SettingsProfile>().StyleSettings.ProfileStyleId.Value;

            labelSetId = civilDoc.Settings.GetSettings<SettingsProfile>().StyleSettings.ProfileLabelSetId.Value;

            alignmentId = ObjectId.Null;

            fileName = null;

        }

        public void DoSth()

        {

            alignmentId = SelectAlignment();   //此方法为《AutoCAD Civil 3D .NET二次开发》8.1节中的方法,当然您也可以自己写方法,只要获取路线的Id即可。

            if (alignmentId == ObjectId.Null) return;

            GetFileName();

            if (fileName == null) return;

            List<ser> sers = new List<ser>();

            using (StreamReader sr = new StreamReader(fileName))

            {

                while (sr.Peek() >= 0)

                {

                    string[] strs = sr.ReadLine().Split(',');

                    double s = 0, e = 0, r = 0;

                    if (strs.Length == 2)

                    {

                        double.TryParse(strs[0], out s);

                        double.TryParse(strs[1], out e);

                    }

                    else if (strs.Length == 3)

                    {

                        double.TryParse(strs[0], out s);

                        double.TryParse(strs[1], out e);

                        double.TryParse(strs[2], out r);

                    }

                    ser oser = new ser();

                    oser.station = s;

                    oser.elevation = e;

                    oser.radius = r;

                    sers.Add(oser);

                }

            }

            //2018年1月12日

            //基本功能已实现,但很不完善,

            //需要判断文件中桩号与路线长度的关系

            //需要考虑半径过大,无法实现的情况等

            //创建纵断面

            ObjectId profilrid = Profile.CreateByLayout("test", alignmentId, layerId, styleId, labelSetId);

            //添加切线

            using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

            {

                Profile pf = profilrid.GetObject(OpenMode.ForWrite) as Profile;

                ProfileEntityCollection pec = pf.Entities;

                for (int i = 0; i < sers.Count - 1; i++)

                {

                    Point2d pt0 = new Point2d(sers[i].station, sers[i].elevation);

                    Point2d pt1 = new Point2d(sers[i + 1].station, sers[i + 1].elevation);

                    pec.AddFixedTangent(pt0, pt1);

                }

                tr.Commit();

            }

            //重新开启事务,添加圆弧

            using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

            {

                Profile pf = profilrid.GetObject(OpenMode.ForWrite) as Profile;

                ProfilePVICollection pvis = pf.PVIs;

                ProfileEntityCollection pec = pf.Entities;

                for (int i = 1; i < sers.Count - 1; i++)

                {

                    if (sers[i].radius != 0)

                    {

                        pec.AddFreeCircularCurveByPVIAndRadius(pvis[i], sers[i].radius);

                    }

                }

                tr.Commit();

            }

        }

        //----------------------------------------------------------------------

        /// <summary>

        /// 获取文件名称

        /// </summary>

        private void GetFileName()                                  //获取文件名

        {

            Microsoft.Win32.OpenFileDialog openFileName = new Microsoft.Win32.OpenFileDialog();               //保存文件对话框

            openFileName.Filter = "csv文件|*.csv|所有文件|*.*";               //后缀过滤器

            openFileName.AddExtension = true;

            openFileName.Title = "保存文件";                                  //对话框标题

            if (openFileName.ShowDialog() == true)                            //显示对话框

            {

                fileName = openFileName.FileName;                             //存储文件名

            }

        }

        //----------------------------------------------------------------------

        ObjectId SelectEntity(string typeName, ObjectIdCollection ids, Type t)

        {

            PromptEntityOptions opt = new PromptEntityOptions(

                " 选择" + typeName + "<或按回车键从列表中选择>");

            opt.AllowNone = true;

            opt.SetRejectMessage(" 选定的图元必须属于类型:" + typeName);

            opt.AddAllowedClass(t, false);

            PromptEntityResult res = doc.Editor.GetEntity(opt);

            if (res.Status == PromptStatus.OK)              //选择对象

            {

                return res.ObjectId;

            }

            else if (res.Status == PromptStatus.None)       //如果没选中对象,

            {                                               //从对话框列表中选择

                using (FormSelectEntity fse = new FormSelectEntity(typeName, ids))

                {

                    fse.EntType = t;                        //设置选择对象的类型

                    Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(fse);       //显示对话框

                    if (fse.DialogResult == System.Windows.Forms.DialogResult.OK)

                    {

                        return fse.EntObjectId;

                    }

                    else

                    {

                        return ObjectId.Null;

                    }

                }

            }

            else

            {

                return ObjectId.Null;

            }

        }

        //----------------------------------------------------------------------

        public ObjectId SelectSurface()                     //选择曲面  此处为多余的代码

        {

            return SelectEntity("曲面"

                , CivilApplication.ActiveDocument.GetSurfaceIds(), typeof(Surface));

        }

        //----------------------------------------------------------------------

        public ObjectId SelectAlignment()                   //选择路线

        {

            return SelectEntity("路线"

                , CivilApplication.ActiveDocument.GetAlignmentIds(), typeof(Alignment));

        }

    }

}

测试结果如下:

路桥BIM技术:Civil3D从文件创建纵断面圆曲线代码_1

路桥BIM技术:Civil3D从文件创建纵断面圆曲线代码_2

 


 ==============

 



 





路桥BIM技术:

Civil3D入门到精通视频教程(路桥bim培训)【视频+答疑】

路桥BIM技术:Civil3D从文件创建纵断面圆曲线代码_3

InfraWorks 360(AIW软件)功能讲解及案例实战(路桥BIM设计)

Civil 3D做外延级公路施工图设计实战(全网独家/路桥bim培训)

分享至

分享到微信朋友圈 ×

打开微信"扫一扫",扫描上方二维码
请点击右上角按钮 ,选择 

 发表于2018-02-12  | 只看该作者      

2

Civil3D从文件创建纵断面圆曲线代码,懂的朋友可以试试

登录后才能评论,评论超过10个字,有机会获得筑龙币奖励!

猜你爱看

筑龙学社APP扫码

立即免费下载资料

扫码安装筑龙学社
随时随地学习