【Revit 二次开发】与Revit内容有关(视图、族类型、族实例等)操作的相关方法

【Revit 二次开发】与Revit内容有关(视图、族类型、族实例等)操作的相关方法

     #region 与Revit内容有关(视图、族类型、族实例等)操作的相关方法

        /// <summary>
        /// 新建一个文件副本
        /// </summary>
        /// <param name="commandData">Revit项目文档</param>
        public static void SaveFileCopy(ExternalCommandData commandData)
        {
            Document document = commandData.Application.ActiveUIDocument.Document;
            string filePath = Path.GetDirectoryName(document.PathName);
            string oldPath = "";
            for (int i = 1; i < 100; i++)
            {
                string fileName = filePath + "\\" + document.Title.Replace(".rvt", "") + "副本" + i + ".rvt";
                oldPath = filePath + "\\" + document.Title;
                if (!File.Exists(fileName))
                {
                    document.SaveAs(fileName);
                    break; 
                }
            }
            commandData.Application.OpenAndActivateDocument(oldPath);
            document.Close();
        }

        /// <summary>
        /// 获取过程中生成族的保存路径
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="typeName">类型名称</param>
        /// <returns></returns>
        public static string GetFileSavePath(Document document, string typeName)
        {
            string fileSavePath = null;
            if (string.IsNullOrEmpty(document.PathName))
            {
                MessageBox.Show("请先保存文件,然后在执行此操作!");
            }

            fileSavePath = Path.GetDirectoryName(document.PathName) + "\\" + document.Title.Replace(".rvt", "") +
                           "族模型\\" + typeName;
            if (!Directory.Exists(fileSavePath))
            {
                Directory.CreateDirectory(fileSavePath);
            }

            return fileSavePath;
        }

        /// <summary>
        /// 载入族文件到项目文档
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="filPath">族文件路径</param>
        public static void LoadFamily(Document document, string filPath)
        {
            using (Transaction loadFamily = new Transaction(document, "载入族"))
            {
                loadFamily.Start();

                Family family = null;
                MyFamilyLoadOptions options = new MyFamilyLoadOptions();
                document.LoadFamily(filPath, options, out family);
                loadFamily.Commit();
            }
        }


        /// <summary>
        /// 载入族文件到项目文档
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="filPath">族文件路径</param>
        public static Family LoadFamily1(Document document, string filPath)
        {
            Family family = null;
            using (Transaction loadFamily = new Transaction(document, "载入族"))
            {
                loadFamily.Start();
                MyFamilyLoadOptions options = new MyFamilyLoadOptions();
                document.LoadFamily(filPath, options, out family);
                loadFamily.Commit();
            }
            return family;
        }

        /// <summary>
        /// 创建自定义任务对话框
        /// </summary>
        /// <param name="mainContent">主要内容</param>
        /// <param name="commandLinkText1">命令连接文字1</param>
        /// <param name="commandLinkText2">命令连接文字2</param>
        /// <returns>对话结果</returns>
        public static TaskDialogResult HintWinform(string mainContent,string commandLinkText1,string commandLinkText2)
        {
            TaskDialog mainDialog = new TaskDialog("提示");
            mainDialog.MainInstruction = "提示";
            mainDialog.MainContent = mainContent;
            mainDialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, commandLinkText1);
            mainDialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, commandLinkText2);
            mainDialog.CommonButtons = TaskDialogCommonButtons.Close;
            mainDialog.DefaultButton = TaskDialogResult.CommandLink1;
            return mainDialog.Show();
        }

        /// <summary>
        /// 生成图纸时对视口进行相应调整
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="viewport">视口</param>
        public static void EditViewport(Document document, Viewport viewport)
        {
            viewport.LookupParameter("视图比例").Set(100);
            viewport.LookupParameter("注释裁剪").Set(1);
            var elementType = Assist.GetElementType(document, viewport);
            viewport.ChangeTypeId(elementType.Id);
        }

        /// <summary>
        /// 获取视口类型
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="viewport">视口</param>
        /// <returns></returns>
        public static ElementType GetElementType(Document document, Viewport viewport)
        {
            ElementType elementType = null;

            ICollection<ElementId> collection = viewport.GetValidTypes();
            foreach (ElementId element in collection)
            {
                ElementType elementt = document.GetElement(element) as ElementType;
                if (elementt.Name.Contains("无标题"))
                {
                    elementType = elementt;
                }
            }

            return elementType;
        }

        /// <summary>
        /// 删除名称包含关键字的物体
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="type">物体类别</param>
        /// <param name="category">物体类型</param>
        /// <param name="name">关键字</param>
        public static void DeleteObject(Document document, Type type, BuiltInCategory category, string name)
        {
            List<ElementId> elementIds = new List<ElementId>();

            using (Transaction deleteObjects = new Transaction(document, "删除物体"))
            {
                deleteObjects.Start();

                FilteredElementCollector collector = new FilteredElementCollector(document);
                collector.OfClass(type).OfCategory(category);
                foreach (Element element in collector)
                {
                    if (element.Name.Contains(name))
                    {
                        elementIds.Add(element.Id);
                    }
                }
                for (int i = 0; i < elementIds.Count; i++)
                {
                    document.Delete(elementIds[i]);
                }

                document.Regenerate();
                deleteObjects.Commit();
            }
        }

        /// <summary>
        /// 删除单个构件
        /// </summary>
        /// <param name="document">revit项目文档</param>
        /// <param name="familyInstance">构件</param>
        public static void DeleteObject(Document document, FamilyInstance familyInstance)
        {
            using (Transaction deleteObject = new Transaction(document, "删除构件"))
            {
                deleteObject.Start();

                document.Delete(familyInstance.Id);

                deleteObject.Commit();
            }
        }

        /// <summary>
        /// 删除多个构件
        /// </summary>
        /// <param name="document">revit项目文档</param>
        /// <param name="familyInstances">构件集合</param>
        public static void DeleteObject(Document document, List<FamilyInstance> familyInstances)
        {
            using (Transaction deleteObject = new Transaction(document, "删除构件"))
            {
                deleteObject.Start();

                for (int i = 0; i < familyInstances.Count; i++)
                {
                    document.Delete(familyInstances[i].Id);
                }

                deleteObject.Commit();
            }
        }

        /// <summary>
        /// 隐藏东南西北立面图信息
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="view">视图</param>
        public static void HideView(Document document, Autodesk.Revit.DB.View view)
        {
            ICollection<ElementId> elementIds = new List<ElementId>();

            FilteredElementCollector collector = new FilteredElementCollector(document);
            collector.OfCategory(BuiltInCategory.OST_Viewers);
            foreach (Element element in collector)
            {
                if (element.Name.Contains("东") || element.Name.Contains("南") || element.Name.Contains("西") ||
                    element.Name.Contains("北"))
                {
                    elementIds.Add(element.Id);
                }
            }

            FilteredElementCollector collector2 = new FilteredElementCollector(document);
            collector2.OfClass(typeof (ElevationMarker)).OfCategory(BuiltInCategory.OST_Elev);
            foreach (Element element in collector2)
            {
                ElevationMarker temp = element as ElevationMarker;
                if (temp.Name.Contains("立面"))
                {
                    elementIds.Add(element.Id);
                }
            }

            if (elementIds.Count!=0)
            {
                view.HideElements(elementIds); 
            }

        }

        /// <summary>
        /// 创建于标高对应的楼层平面
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="levelName">平面名称</param>
        /// <param name="levelHeight">平面标高</param>
        /// <returns>楼层平面</returns>
        public static ViewPlan GetViewPlan(Document document,string levelName,double levelHeight)
        {
            ViewPlan viewPlan = null;
            using (Transaction tran = new Transaction(document, "创建楼层平面"))
            {
                tran.Start();

                Level level = GetLevel(document, levelName, levelHeight);
                ViewFamilyType viewFamilyType = Assist.GetViewFamilyType(document);
                viewPlan = ViewPlan.Create(document, viewFamilyType.Id, level.Id);
                HideView(document, viewPlan);

                tran.Commit();
            }

            return viewPlan;
        }

        /// <summary>
        /// 创建指定标高的楼层平面(若已存在,则删除)
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="levelName">楼层平面名称</param>
        /// <param name="levelHeight">楼层平面标高</param>
        /// <returns></returns>
        private static Level GetLevel(Document document, string levelName, double levelHeight)
        {
            Level level0 = null;
            FilteredElementCollector collector = new FilteredElementCollector(document);
            collector.OfClass(typeof (Level)).OfCategory(BuiltInCategory.OST_Levels);
            foreach (Element element in collector)
            {
                Level temp = element as Level;
                if (temp.Name == levelName)
                {
                    level0 = temp;
                }
            }

            if (level0 != null)
            {
                document.Delete(level0.Id);
            }
            Level level = Level.Create(document, levelHeight/304.8);
            level.Name = levelName;

            return level;
        }

        /// <summary>
        /// 获取楼层平面类别
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <returns></returns>
        public static ViewFamilyType GetViewFamilyType(Document document)
        {
            ViewFamilyType viewFamilyType = null;

            FilteredElementCollector collector = new FilteredElementCollector(document);
            collector.OfClass(typeof(ViewFamilyType));
            foreach (Element element in collector)
            {
                ViewFamilyType temp = element as ViewFamilyType;
                if (temp.Name.Contains("楼层平面"))
                {
                    viewFamilyType = temp;
                }
            }

            return viewFamilyType;
        }

        /// <summary>
        /// 获得指定名称的族类型
        /// </summary>
        /// <param name="doc">项目文档</param>
        /// <param name="name">名称</param>
        /// <returns>族类型</returns>
        public static FamilySymbol GetSymbolType(Document doc, string name)
        {
            FilteredElementIdIterator elementIdIterator =
                new FilteredElementCollector(doc).OfClass(typeof (Family)).GetElementIdIterator();
            elementIdIterator.Reset();
            FamilySymbol result = null;
            while (elementIdIterator.MoveNext())
            {
                Family family = doc.GetElement(elementIdIterator.Current) as Family;
                foreach (ElementId current in family.GetFamilySymbolIds())
                {
                    FamilySymbol familySymbol = doc.GetElement(current) as FamilySymbol;
                    if (familySymbol.Name.Contains(name))
                    {
                        result = familySymbol;
                    }
                }
            }

            return result;
        }

        /// <summary>
        /// 获取指定名称的族类型
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="keyName">族类型关键字名称</param>
        /// <returns>族类型</returns>
        public static FamilySymbol GetFamilySymbol(Document document,string keyName)
        {
            FamilySymbol familySymbol = null;
            FilteredElementCollector pipeCollector = new FilteredElementCollector(document);
            pipeCollector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_GenericModel);
            foreach (Element element in pipeCollector)
            {
                FamilySymbol fInstance = element as FamilySymbol;
                if (fInstance.Name == keyName)
                {
                    familySymbol = fInstance;
                }
            }
            return familySymbol;
        }

        /// <summary>
        /// 获取电缆接头族类型
        /// </summary>
        /// <param name="document"></param>
        /// <returns></returns>
        public static FamilySymbol GetFamilySymbol(Document document)
        {
            FamilySymbol familySymbol = null;
            FilteredElementCollector filteredElementCollector =
                new FilteredElementCollector(document).OfClass(typeof (FamilySymbol));
            using (IEnumerator<Element> enumerator = filteredElementCollector.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    FamilySymbol familySymbol2 = (FamilySymbol) enumerator.Current;
                    if (familySymbol2.Name.Contains("电缆接头") || familySymbol2.Name.Contains("CCN"))
                    {
                        familySymbol = familySymbol2;
                        break;
                    }
                }
            }

            return familySymbol;
        }

        /// <summary>
        /// 获得指定名称的族
        /// </summary>
        /// <param name="doc">项目文档</param>
        /// <param name="name">名称</param>
        /// <returns>族</returns>
        public static Family GetFamilyType(Document doc, string name)
        {
            FilteredElementIdIterator elementIdIterator =
                new FilteredElementCollector(doc).OfClass(typeof (Family)).GetElementIdIterator();
            elementIdIterator.Reset();
            Family result = null;
            while (elementIdIterator.MoveNext())
            {
                Family family = doc.GetElement(elementIdIterator.Current) as Family;
                if (family.Name == name)
                {
                    result = family;
                }
            }

            return result;
        }

        /// <summary>
        /// 获取详图线样式
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="line">详图线</param>
        /// <param name="name">详图线名称</param>
        /// <returns></returns>
        public static Element GetDetailCurveStyle(Document document, DetailCurve line, string name)
        {
            Element style = null;
            var styles = line.GetLineStyleIds();
            foreach (ElementId styleId in styles)
            {
                var temp = document.GetElement(styleId);
                if (temp.Name == name)
                {
                    style = temp;
                    break;
                }
            }
            return style;
        }

        /// <summary>
        /// 获取模型线样式
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="line">模型线</param>
        /// <param name="name">模型线名称</param>
        /// <returns></returns>
        public static Element GetModelCurveStyle(Document document, ModelCurve line, string name)
        {
            Element style = null;
            var styles = line.GetLineStyleIds();
            foreach (ElementId styleId in styles)
            {
                var temp = document.GetElement(styleId);
                if (temp.Name == name)
                {
                    style = temp;
                    break;
                }
            }
            return style;
        }

        /// <summary>
        /// 获取文字注释型号
        /// </summary>
        /// <param name="document">项目文档</param>
        /// <param name="typeName">文字注释类别名称关键字</param>
        /// <returns></returns>
        public static TextNoteType GetTextNoteType(Document document, string typeName)
        {
            TextNoteType textNoteType = null;

            FilteredElementCollector collector = new FilteredElementCollector(document);
            collector.OfClass(typeof (TextNoteType));
            foreach (Element element in collector)
            {
                TextNoteType temp = element as TextNoteType;
                if (temp.Name == typeName)
                {
                    textNoteType = temp;
                    break;
                }
            }

            return textNoteType;
        }

        /// <summary>
        /// 获取指定名称的实例属性
        /// </summary>
        /// <param name="fi">实例</param>
        /// <param name="parameterName">属性名称</param>
        /// <returns>属性值</returns>
        public static string GetParameterValue(FamilyInstance fi, string parameterName)
        {
            string result = " ";
            Parameter parameter = fi.LookupParameter(parameterName);
            if (parameter == null)
            {
                MessageBox.Show(@"ID为" + fi.Id.ToString() + "的构件中找不到名称为“" + parameterName + "”的属性!");
            }
            else
            {
                result = !string.IsNullOrEmpty(parameter.AsString()) ? parameter.AsString() : parameter.AsValueString();
            }

            if (result==null)
            {
                result = " ";
            }

            return result;
        }

        #endregion

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Revit 二次开发中,获取实例几何信息的方法可以分为两种:使用 Revit API 提供的方法和使用 Geometry API 提供的方法。 首先,使用 Revit API 提供的方法可以通过以下代码获取实例的几何信息: ```csharp // 获取当前文档 Document doc = uidoc.Document; // 获取选中的实例 ElementId elementId = uidoc.Selection.GetElementIds().FirstOrDefault(); FamilyInstance familyInstance = doc.GetElement(elementId) as FamilyInstance; // 获取实例的几何信息 GeometryElement geometryElement = familyInstance.get_Geometry(new Options()); foreach (GeometryObject geometryObject in geometryElement) { if (geometryObject is Solid solid) { // 获取实体的顶点信息 foreach (Face face in solid.Faces) { Mesh mesh = face.Triangulate(); foreach (XYZ vertex in mesh.Vertices) { // 获取顶点坐标 double x = vertex.X; double y = vertex.Y; double z = vertex.Z; } } } } ``` 其次,使用 Geometry API 提供的方法可以通过以下代码获取实例的几何信息: ```csharp // 获取当前文档 Document doc = uidoc.Document; // 获取选中的实例 ElementId elementId = uidoc.Selection.GetElementIds().FirstOrDefault(); FamilyInstance familyInstance = doc.GetElement(elementId) as FamilyInstance; // 获取实例的几何信息 GeometryElement geometryElement = familyInstance.Symbol.Geometry; foreach (GeometryObject geometryObject in geometryElement) { if (geometryObject is Solid solid) { // 获取实体的顶点信息 foreach (Face face in solid.Faces) { Mesh mesh = face.Triangulate(); foreach (XYZ vertex in mesh.Vertices) { // 获取顶点坐标 double x = vertex.X; double y = vertex.Y; double z = vertex.Z; } } } } ``` 无论是哪种方法,都可以获取实例的几何信息。使用 Revit API 提供的方法可以更方便地获取当前文档和选中的实例,而使用 Geometry API 提供的方法则可以直接从类型获取几何信息,避免了需要实例化后再获取几何信息的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值