zoukankan      html  css  js  c++  java
  • 纵断面图标注栏数据复制

    新西兰本地化包中有一项小功能不错——纵断面图标注栏数据复制

    刚好这几天我们自己也遇到了同样的需求:

    利用纵断面来创建场地剖面,

    剖面图标注栏要进行重复的设置。

    于是参照新西兰本地化包中的功能,

    自己也写了一遍。

    但写的过程中遇到了一些问题,

    在遇到问题后,

    没有第一时间想起查看api reference,

    没有查看每个属性是否会抛出异常……

    导致冒昧的向Autodesk负责API接口开发的丁工直接请教,

    实在是尴尬……

    相关代码如下:

        class SetProfileViewDataband
        {
            Document doc;
            Database db;
            Editor ed;
            CivilDocument cDoc;
    
            ObjectId fillShapeStyleId;
            ObjectId cutShapeStyleId;
            public SetProfileViewDataband()
            {
                doc = Application.DocumentManager.MdiActiveDocument;
                db = doc.Database;
                ed = doc.Editor;
                cDoc = CivilApplication.ActiveDocument;
    
            }
     /// <summary>
            /// 2019年04月15日
            /// 按照新西兰本地化包中的功能,
            /// 进行纵断面数据复制
            /// </summary>
            public void ProfileDataBandCopy()
            {
    
                PromptEntityOptions peo = new PromptEntityOptions("
    选择源纵断面图: ");
                peo.SetRejectMessage("只允许选择一个纵断面图. 
    ");
                peo.AddAllowedClass(typeof(ProfileView), true);
                PromptEntityResult per = ed.GetEntity(peo);
                if (per.Status == PromptStatus.OK)
                {
                    ProfileView view;
                    using (Transaction tr = db.TransactionManager.StartTransaction())
                    {
                        view = per.ObjectId.GetObject(OpenMode.ForRead) as ProfileView;
                        tr.Commit();
                    }
                    ProfileViewBandItemCollection bottomBandItems = view.Bands.GetBottomBandItems();
                    ProfileViewBandItemCollection topBandItems = view.Bands.GetTopBandItems();
                    TypedValue[] tv = new TypedValue[] { new TypedValue(0, "AECC_PROFILE_VIEW") };
    
                    SelectionFilter filter = new SelectionFilter(tv);
                    PromptSelectionResult psr = ed.GetSelection(filter);
                    if (psr.Status == PromptStatus.OK)
                    {
                        foreach (ObjectId id in psr.Value.GetObjectIds())
                        {
                            using (Transaction tr2 = db.TransactionManager.StartTransaction())
                            {
                                ProfileView view2 = tr2.GetObject(id, OpenMode.ForWrite) as ProfileView;
    
                                ProfileViewBandItemCollection bandItems = view2.Bands.GetBottomBandItems();
                                ProfileViewBandItemCollection items4 = view2.Bands.GetTopBandItems();
                                bandItems = new ProfileViewBandItemCollection(view2.ObjectId, BandLocationType.Bottom);
                                items4 = new ProfileViewBandItemCollection(view2.ObjectId, BandLocationType.Top);
                                this.AddDataBandItems(bottomBandItems, ref bandItems, db);
                                this.AddDataBandItems(topBandItems, ref items4, db);
                                if (bandItems.Count() > 0)
                                {
                                    view2.Bands.SetBottomBandItems(bandItems);
                                }
                                if (items4.Count() > 0)
                                {
                                    view2.Bands.SetTopBandItems(items4);
                                }
                                tr2.Commit();
                            }
                        }
                    }
                }
            }
      public void AddDataBandItems(ProfileViewBandItemCollection srcBandItems,
                ref ProfileViewBandItemCollection targetBandItems, Database db)
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    for (int i = 0; i < srcBandItems.Count(); i++)
                    {
                        ProfileViewBandItem item = srcBandItems[i];
                        targetBandItems.Add(item.BandStyleId);
    
                        Type type = item.GetType();
                        PropertyInfo[] properties = type.GetProperties();
                        foreach (PropertyInfo prop in properties)
                        {
                            if (prop.CanWrite)
                            {
                                //如果不加try,不少属性值无法读取到,
                                //具体哪些属性会抛出异常,可以在api reference中查看
                                try
                                {
                                    object v = prop.GetValue(item);
                                    prop.SetValue(targetBandItems[i], v);
                                }
                                catch 
                                {
                                }
                            }
                        }
                    }
                    tr.Commit();
                }
            }

    总结:遇到问题第一个想到应该是去查看api reference,看是否会抛出异常。

  • 相关阅读:
    The usage of Markdown---杂谈:缩进/换行/分割线/注释/文字颜色
    insert into,insert into select,replace into,replace into select,insert ignore into,on duplicate key update
    mysql使用指南
    openssl使用
    黑名单
    zsh+iTerm2+ powerline+oh-my-zsh+ agnoster
    mac安装brew软件管理工具
    mysql性能优化
    numactl
    vscode
  • 原文地址:https://www.cnblogs.com/myzw/p/10714696.html
Copyright © 2011-2022 走看看