Revit中自定义警告

Revit中自定义警告

想要实现效果:

当创建的墙体长度小于1米弹出警告,提示“you created a false wall”;

第一步在OnStartUp事件中创建自定义警告。

因为在Application.GetFailureDefinitionRegistry()中获取的FailureDefinitionRegistry会在Revit启动后就会加锁,所以没办法在启动以后创建自定义的警告,异常等。

        public Result OnStartup(UIControlledApplication application)
        {
            //可以通过GUID唯一的确定一个异常和警告,等下在用的时候也是通过这个GUID找到,这个FailureDefinition
            var guid = new Guid("{504BD947-0813-48DA-8784-15DE43DA6280}");

            var failureDefinitionId = new FailureDefinitionId(guid);

            var failureDefinition = 			           FailureDefinition.CreateFailureDefinition(failureDefinitionId, FailureSeverity.Warning, "you created a false wall");

            //添加处理器
            failureDefinition.AddResolutionType(FailureResolutionType.CreateElements, "create wall", typeof(DeleteElements));

            return Result.Succeeded;
        }
第二步创建对应的自定义警告预处理类
    public class WallFailurePreProcessor : IFailuresPreprocessor
    {
        public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)
        {
            var messages = failuresAccessor.GetFailureMessages();
            if (messages.Count() == 0)
            {
                return FailureProcessingResult.Continue;
            }

            var my = messages.FirstOrDefault(x => x.GetSeverity() == FailureSeverity.Warning);
            var ids = my.GetAdditionalElementIds();
            if (ids.Count() == 1)
            {
                var wall = failuresAccessor.GetDocument().GetElement(ids.FirstOrDefault()) as Wall;
                if (wall != null)
                {
                    var curve = (wall.Location as LocationCurve).Curve;
                    if (curve.Length < 1000 / 304.8)
                    {
                        //当创建的是墙体,并长度小于1000mm时弹出警告
                        return FailureProcessingResult.Continue;
                    }
                }
            }
            return FailureProcessingResult.ProceedWithCommit;
        }
    }
第三 创建墙时post这个警告,通过自定义的警告预处理类WallFailurePreProcessor判断是否需要弹出警告
        private void FailureOption()
        {
            var registry = Application.GetFailureDefinitionRegistry();

            //跟之前注册的GUID保持一致
            var guid = new Guid("{504BD947-0813-48DA-8784-15DE43DA6280}");

            var failureDefinitionId = new FailureDefinitionId(guid);

            var failureMessage = new FailureMessage(failureDefinitionId);

            using (Transaction ts = new Transaction(_doc))
            {
                var options = ts.GetFailureHandlingOptions();

                var preProcessor = new WallFailurePreProcessor();
                options.SetFailuresPreprocessor(preProcessor);

                ts.SetFailureHandlingOptions(options);

                ts.Start("test");

                var shortWall = CreateWall(800);
  				 var longWall = CreateWall(2000);
                
                failureMessage.SetAdditionalElement(shortWall.Id);
                _doc.PostFailure(failureMessage);
                ts.Commit();
            }
        }

        private Element CreateWall(double length)
        {
            var curve = Line.CreateBound(XYZ.Zero, new XYZ(length / 304.8, 0, 0));
            var level = new FilteredElementCollector(_doc).OfCategory(BuiltInCategory.OST_Levels)
                                                        .OfClass(typeof(Level))
                                                        .Cast<Level>()
                                                        .FirstOrDefault();

            return Wall.Create(_doc, curve, level.Id, false);
        }

效果:

当调用shortWall时会弹出警告
在这里插入图片描述

当调用longWall时不会弹出警告

Revit API是Autodesk公司开发的一款用于建筑信息模型(BIM)软件Revit的API。它允许开发者通过编程扩展Revit的功能,包括自动化任务、创建插件等。导出自定义属性是通过Revit API执行的一个常见任务,以下是使用Revit API导出自定义属性的基本步骤: 1. 启动Revit API环境:首先,你需要设置Revit API的开发环境,包括安装Revit SDK,并配置好开发环境,如Visual Studio。 2. 引用Revit API程序集:在你的项目引用Revit API相关程序集,如`RevitAPI.dll`和`RevitAPIUI.dll`。 3. 创建一个外部命令:在Revit插件,你需要创建一个外部命令来处理导出操作。通常这涉及到实现`IExternalCommand`接口。 4. 遍历文档元素:使用Revit API遍历文档的元素,可以是全部元素,也可以是特定类型的元素。 5. 检索自定义属性:对于每个元素,你可以使用`UIApplication.ActiveUIDocument.Document`对象来访问其自定义属性。这通常通过元素的`Parameters`集合实现。 6. 导出到文件:将检索到的属性数据写入到CSV、Excel或其他格式的文件。你可以使用.NET框架的文件操作类,比如`System.IO.File`类。 7. 注册命令:在Revit注册你的外部命令,这样用户就可以在Revit的用户界面找到并执行它。 示例代码片段: ```csharp public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiApp = commandData.Application; UIDocument uiDoc = uiApp.ActiveUIDocument; Document doc = uiDoc.Document; // 使用FilteredElementCollector来获取所有或特定类型的元素 FilteredElementCollector collector = new FilteredElementCollector(doc); ICollection<Element> elementsWithCustomProperties = collector.OfClass(typeof(Element)).ToElements(); // 创建一个用于输出数据的CSV文件 string csvPath = Path.Combine(Path.GetTempPath(), "CustomProperties.csv"); using (StreamWriter writer = new StreamWriter(csvPath)) { writer.WriteLine("ElementId,ParameterName,ParameterValue"); foreach (Element element in elementsWithCustomProperties) { foreach (Parameter parameter in element.Parameters) { if (parameter.IsShared && parameter.IsCustom) { writer.WriteLine($"{element.Id},{parameter.Definition.Name},{parameter.AsValueString()}"); } } } } // 输出文件路径或通知用户文件已创建 TaskDialog.Show("Exported", $"Custom properties have been exported to {csvPath}"); return Result.Succeeded; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值