#Revit二次开发# 调用RevitAPI实现清理未使用项

首先感谢不知名的某个大神提供的类 PerformanceAdviser,不然都没法研究

这个类,明显就是有关性能管理的类,而且是个单例。

通过接口,得到所有的规则,

可以查看到每个规则代表的意思,

 1, 名称: 视图剪裁处于禁用状态, 描述: 视图剪裁被禁用。视图可能会生成与图元无关的图形,这需要额外的时间。,Guid: b37b2ae0-6eab-423d-bec7-59c5598d1c82
        2, 名称: 在三维视图中启用了内部类别, 描述: 大型三维视图启用了内部类别。它可能导致 Revit 花费额外的时间为许多遮挡对象生成图形。,Guid: 5d4c01d2-a2c7-40aa-a29e-f9669cf5aeaa
        3, 名称: 视图的详细程度过高, 描述: 大视图将视图详细程度设置为“中等”或“精细”。Revit 将花费额外的时间生成无关详细信息。,Guid: 10c1bac3-9b90-4772-8731-92ee7b9aca7b
        4, 名称: 多个非重叠环, 描述: 包含多个非重叠环的草图生成具有多个不相交实体的复杂图元,通常可以替换为几个较小且更简单的图元。,Guid: 3410389d-7ae7-4f04-9183-69cd9ef0df48
        5, 名称: 草图过于复杂, 描述: 包含多于 500 个图元的草图可能会花费大量时间来解析,Guid: f4fdc819-9044-4785-b5e3-5a36e89b9bd9
        6, 名称: 草图面积太大, 描述: 面积大于 200 000 平方英尺的草图可能会降低选择、绘制和几何计算的速度。,Guid: 90f0eae9-1840-436a-83fb-260f07d809db
        7, 名称: 主体包含过多的插入对象, 描述: 主体对象包含太多剪切插入对象,可能会花费较长的时间来更新。请考虑将此类主体对象分割为较小的部分或使用叠层墙。,Guid: b85b3b89-d2a3-415a-b289-258a21d58da1
        8, 名称: 重叠的墙, 描述: 墙重叠可能会减慢自动连接和几何更新速度。使用嵌入墙或其他 ediditn 工具(立面轮廓、墙范围)来避免重叠。,Guid: cbb14baa-a57c-48ee-aab4-4137fcad779e
        9, 名称: 族文件太大, 描述: 族文件大小较大,提高了整体 Revit 内存消耗量。,Guid: de12e3b2-92da-48f2-a893-b422cf78d6bc
        10, 名称: 许多嵌套族未使用, 描述: 嵌套在其他族中且未实例化的族会浪费内存,Guid: ad5ef4a1-78e7-4778-8390-cf095c20734a
        11, 名称: 族中的图元太多, 描述: 族包含太多图元。重新生成此类族的速度较低。,Guid: 1827be73-62d8-468b-8553-7606450f401f
        12, 名称: 族中的视图专用导入, 描述: 族中的视图专用导入在项目中不可访问,但它们仍会占用内存。,Guid: 2f03ca4a-8959-44ed-b34e-8359931972a2
        13, 名称: 重复的实例, 描述: 在相同位置的重复实例会占用内存、降低选择和模型更新速度,并会导致明细表不正确。,Guid: b341a0f3-a468-4fad-8b26-39237d8486e7
        14, 名称: 内建族包含未连接的实体, 描述: 具有未连接实体的内建族会降低选择和模型更新速度。,Guid: 67c0ac52-376d-4a45-ad12-7d4df13f0b8f
        15, 名称: 项目中包含未使用的族和类型, 描述: 项目中未使用的族和类型会浪费内存。,Guid: e8c63650-70b7-435a-9010-ec97660c1bda
        16, 名称: 房间分隔线未关联, 描述: 未关联的房间分隔线导致针对房间边界计算执行其他计算。,Guid: 86263995-19bc-4e17-9068-7974a46d0410
        17, 名称: 过多的面积边界线, 描述: 大量的面积边界线将增加模型打开、保存、SWC 和模型更新的时间。,Guid: fc4d3f92-60b0-4bf7-aa07-ed88c23d591b

 

其中第15条,下标是14,就是清除未使用的族和族类型。

调用方法如下:

 /// <summary>
        /// 清除项目中包含未使用的族和类型,revit2017以后支持此接口。
        /// PerformanceAdviser中的PerformanceAdviserRuleId
        /// 名称: 项目中包含未使用的族和类型
        /// 描述: 项目中未使用的族和类型会浪费内存。
        /// Guid: e8c63650-70b7-435a-9010-ec97660c1bda
        /// </summary>
        /// <param name="doc"></param>
        /// <returns></returns>
        public static bool PurgeUnusedFamilyAndSymbol(Document doc)
        {
            List<ElementId> listDelIds = new List<ElementId>();
            try
            {
                var performanceAdviser = PerformanceAdviser.GetPerformanceAdviser();
                var performanceAdviserRuleIds = performanceAdviser.GetAllRuleIds().ToList();
                var clearFamilyId = performanceAdviserRuleIds.Find(p => p.Guid.ToString().Equals("e8c63650-70b7-435a-9010-ec97660c1bda"));
                var failureMessages = performanceAdviser.ExecuteRules(doc, new List<PerformanceAdviserRuleId>() { clearFamilyId });
                if (failureMessages.Count > 0)
                {
                    failureMessages.ToList().ForEach(p =>
                    {
                        try
                        {
                            var ids = p.GetFailingElements().ToList();
                            if (ids.Count > 0)
                            {
                                ids.ForEach(n =>
                                {
                                    if (listDelIds.FindIndex(m => m.Equals(n)) != -1)
                                    {
                                        return;
                                    }
                                    listDelIds.Add(n);
                                });
                            }
                        }
                        catch (Exception ex)
                        {

                        }

                    });
                }
                using (Transaction transaction = new Transaction(doc, "清理未使用的族和族类型"))
                {
                    transaction.Start();
                    listDelIds.ForEach(p =>
                    {
                        try
                        {
                            doc.Delete(p);
                        }
                        catch (Exception ex)
                        {

                        }
                    });
                    transaction.Commit();
                }
                return true;
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
            }
            return false;
        }

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页