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

Civil 3D 删除不需要的标签表达式

正常情况下,

不需要的标签表达式应该能够手动删除,

不知道什么原因

有些表达式在创建后状态就成了“被引用”状态,

导致无法删除。

即使想修改名称也不行,

不得不采用编程的方式进行删除。

代码如下:

        public void m_RemoveExpression()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.CurrentDocument;
            Database db = doc.Database;
            Transaction tr = db.TransactionManager.StartTransaction();
            try
            {
                CivilDocument civilDoc = CivilDocument.GetCivilDocument(db);
                object obj = civilDoc.Styles;           //获取所有样式
                RemoveExpression(tr, obj, ref doc);         //修改样式
                tr.Commit();
                tr.Dispose();
            }
            catch (System.Exception ex)
            {
                tr.Commit();
                tr.Dispose();
                doc.Editor.WriteMessage("\n" + ex.Message);
            }
        }

递归方法,

遍历所有的样式....

找到需要删除的后删除之......

 private void RemoveExpression(Transaction tr, object obj, ref Document doc)
        {

            Type objType = obj.GetType();
            PropertyInfo[] properties = objType.GetProperties();
            foreach (PropertyInfo prop in properties)
            {
                Object obj1 = prop.GetValue(obj);
                if (IsEnumberable(obj1))
                {
                    #region try
                    try
                    {
                        PropertyInfo property = obj1.GetType().GetProperty("Expressions");
                        if (property != null)
                        {
                            #region 
                            ExpressionCollection exps = property.GetValue(obj1) as ExpressionCollection;
                            List<int> indexs = new List<int>();
                            for (int i = 0; i < exps.Count; i++)
                            {
                                if (exps[i].Description .Contains("删除"))
                                {
                                    indexs.Add(i);
                                }
                            }
                            for (int j = indexs.Count - 1; j >= 0; j--)
                            {
                                exps.RemoveAt(indexs[j]);
                            }
                            #endregion
                        }
                        else
                        {
                            IEnumerable enumerable = obj1 as IEnumerable;
                            IEnumerator enumerator = enumerable.GetEnumerator();
                            List<object> objs = new List<object>();
                            while (enumerator.MoveNext())
                            {
                                object obj2 = enumerator.Current;
                                objs.Add(obj2);
                            }
                            foreach (object obj2 in objs)
                            {
                                RemoveExpression(tr, obj2, ref doc);
                            }
                        }
                    }
                    catch (System.Exception ex)
                    {
                        //doc.Editor.WriteMessage("\n{0}\t{1}\t{2}",
                        //    ex.Message, objType.ToString(), obj.ToString());
                    }
                    #endregion
                }
                else if (prop.PropertyType.ToString().Contains("Root"))
                {
                    RemoveExpression(tr, obj1, ref doc);
                }
            }
        }
        bool IsEnumberable(Object obj)
        {
            if (obj is string) return false;
            IEnumerable enumerable = obj as IEnumerable;
            return (enumerable != null);
        }

要处理Civil 3d样式相关的东西,

反射是个好工具,

可惜本人对此并不熟悉,

试验了很长时间才写出了上面的代码。

 

 

posted @ 2023-06-15 15:21  david96007  阅读(61)  评论(0编辑  收藏  举报