Revit二次开发示例:ErrorHandling
本示例介绍了Revit的错误处理。
#region Namespaces
using System;
using System.Collections.Generic;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI; #endregion namespace ErrorHandling
{
[Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)]
[Autodesk.Revit.Attributes.Journaling(JournalingMode.NoCommandData)]
public class Command : IExternalCommand, IExternalApplication
{
public static FailureDefinitionId m_idWarning;
public static FailureDefinitionId m_idError;
private FailureDefinition m_fdWarning;
private FailureDefinition m_fdError;
private Application m_revitApp;
private Document m_doc; public Result OnShutdown(UIControlledApplication application)
{
return Result.Succeeded;
} public Result OnStartup(UIControlledApplication application)
{
try
{
// Create failure definition Ids
Guid guid1 = new Guid("0C3F66B5-3E26-4d24-A228-7A8358C76D39");
Guid guid2 = new Guid("93382A45-89A9-4cfe-8B94-E0B0D9542D34");
Guid guid3 = new Guid("A16D08E2-7D06-4bca-96B0-C4E4CC0512F8");
m_idWarning = new FailureDefinitionId(guid1);
m_idError = new FailureDefinitionId(guid2); m_fdWarning = FailureDefinition.CreateFailureDefinition(m_idWarning, FailureSeverity.Warning, "I am the warning.");
m_fdError = FailureDefinition.CreateFailureDefinition(m_idError, FailureSeverity.Error, "I am the error"); m_fdWarning.AddResolutionType(FailureResolutionType.MoveElements, "MoveElements", typeof(DeleteElements));
m_fdWarning.AddResolutionType(FailureResolutionType.DeleteElements, "DeleteElements", typeof(DeleteElements));
m_fdWarning.SetDefaultResolutionType(FailureResolutionType.DeleteElements); m_fdError.AddResolutionType(FailureResolutionType.DetachElements, "DetachElements", typeof(DeleteElements));
m_fdError.AddResolutionType(FailureResolutionType.DeleteElements, "DeleteElements", typeof(DeleteElements));
m_fdError.SetDefaultResolutionType(FailureResolutionType.DeleteElements); }
catch (Exception)
{
return Result.Failed;
} return Result.Succeeded;
} public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
m_revitApp = commandData.Application.Application;
m_doc = commandData.Application.ActiveUIDocument.Document; Level level1 = GetLevel();
if (level1 == null)
{
throw new Exception("[ERROR] Failed to get level 1");
} try
{
try
{
Transaction transaction = new Transaction(m_doc, "Warning_FailurePreproccessor");
FailureHandlingOptions options = transaction.GetFailureHandlingOptions();
FailurePreproccessor preprocessor = new FailurePreproccessor();
options.SetFailuresPreprocessor(preprocessor);
transaction.SetFailureHandlingOptions(options);
transaction.Start();
FailureMessage fm = new FailureMessage(m_idWarning);
m_doc.PostFailure(fm);
transaction.Commit();
}
catch (Exception)
{
message = "Failed to commit transaction Warning_FailurePreprocessor";
return Result.Failed;
} try
{
Transaction transacton = new Transaction(m_doc, "Warning_FailurePreprocessor_OverlappedWall");
FailureHandlingOptions options = transacton.GetFailureHandlingOptions();
FailurePreproccessor preproccessor = new FailurePreproccessor();
options.SetFailuresPreprocessor(preproccessor);
transacton.SetFailureHandlingOptions(options);
transacton.Start(); Line line = Line.CreateBound(new XYZ(-10, 0, 0), new XYZ(-20, 0, 0));
Wall wall1 = Wall.Create(m_doc, line, level1.Id, false);
Wall wall2 = Wall.Create(m_doc, line, level1.Id, false);
m_doc.Regenerate(); transacton.Commit();
}
catch (Exception)
{
message = "Failed to commit transaction Warning_FailurePreproccessor_OverlappedWall";
return Result.Failed;
} try
{
m_revitApp.FailuresProcessing += FailuresProcessing;
Transaction transactoin = new Transaction(m_doc, "Error_FailuresProcessingEvent");
transactoin.Start(); Line line = Line.CreateBound(new XYZ(0, 10, 0), new XYZ(20, 10, 0));
Wall wall = Wall.Create(m_doc, line, level1.Id, false);
m_doc.Regenerate(); FailureMessage fm = new FailureMessage(m_idError);
FailureResolution fr = DeleteElements.Create(m_doc, wall.Id);
fm.AddResolution(FailureResolutionType.DeleteElements, fr);
m_doc.PostFailure(fm);
transactoin.Commit();
}
catch (Exception)
{
message = "Failed to commit transaction Error_FailuresProcessingEvent";
return Result.Failed;
} try
{
FailuresProcessor processor = new FailuresProcessor();
Application.RegisterFailuresProcessor(processor);
Transaction transaction = new Transaction(m_doc, "Error_FailuresProcessor");
transaction.Start(); Line line = Line.CreateBound(new XYZ(0, 20, 0), new XYZ(20, 20, 0));
Wall wall = Wall.Create(m_doc, line, level1.Id, false);
m_doc.Regenerate(); FailureMessage fm = new FailureMessage(m_idError);
FailureResolution fr = DeleteElements.Create(m_doc, wall.Id);
fm.AddResolution(FailureResolutionType.DeleteElements, fr);
m_doc.PostFailure(fm);
transaction.Commit();
}
catch (Exception)
{
message = "Failed to commit transaction Error_FailuresProcessor";
return Result.Failed;
} }
catch (Exception ex)
{
message = ex.Message;
return Result.Failed;
} return Result.Succeeded;
} void FailuresProcessing(object sender, Autodesk.Revit.DB.Events.FailuresProcessingEventArgs e)
{
FailuresAccessor failuresAccessor = e.GetFailuresAccessor();
string transactionName = failuresAccessor.GetTransactionName(); IList<FailureMessageAccessor> fams = failuresAccessor.GetFailureMessages();
if (fams.Count == 0)
{
e.SetProcessingResult(FailureProcessingResult.Continue);
return;
} if (transactionName.Equals("Error_FailuresProcessingEvent"))
{
foreach (FailureMessageAccessor fma in fams)
{
FailureDefinitionId id = fma.GetFailureDefinitionId();
if (id == Command.m_idError)
{
failuresAccessor.ResolveFailure(fma);
}
} e.SetProcessingResult(FailureProcessingResult.ProceedWithCommit);
return;
} e.SetProcessingResult(FailureProcessingResult.Continue);
} private Level GetLevel()
{
Level level1 = null; FilteredElementCollector collector = new FilteredElementCollector(m_doc);
ElementClassFilter filter = new ElementClassFilter(typeof(Level));
IList<Element> levels = collector.WherePasses(filter).ToElements(); foreach (Level level in levels)
{
if (level.Name.Equals("Level 1"))
{
level1 = level;
break;
}
} return level1;
}
} public class FailurePreproccessor : IFailuresPreprocessor
{
public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)
{
IList<FailureMessageAccessor> fmas = failuresAccessor.GetFailureMessages();
if (fmas.Count == 0)
{
return FailureProcessingResult.Continue;
} string transactionName = failuresAccessor.GetTransactionName();
if (transactionName.Equals("Warning_FailurePreprocessor"))
{
foreach (FailureMessageAccessor fma in fmas)
{
FailureDefinitionId id = fma.GetFailureDefinitionId();
if (id == Command.m_idError)
{
failuresAccessor.ResolveFailure(fma);
}
}
return FailureProcessingResult.ProceedWithCommit;
}
else
{
return FailureProcessingResult.Continue;
}
}
} public class FailuresProcessor : IFailuresProcessor
{
public void Dismiss(Document document)
{ } public FailureProcessingResult ProcessFailures(FailuresAccessor failuresAccessor)
{
IList<FailureMessageAccessor> fmas = failuresAccessor.GetFailureMessages();
if (fmas.Count == 0)
{
return FailureProcessingResult.Continue;
} string transactionName = failuresAccessor.GetTransactionName();
if (transactionName.Equals("Error_FailuresProcessor"))
{
foreach (FailureMessageAccessor fma in fmas)
{
FailureDefinitionId id = fma.GetFailureDefinitionId();
if (id == Command.m_idError)
{
failuresAccessor.ResolveFailure(fma);
}
} return FailureProcessingResult.ProceedWithCommit;
}
else
{
return FailureProcessingResult.Continue;
} }
} }
Revit二次开发示例:ErrorHandling的更多相关文章
- Revit二次开发示例:HelloRevit
本示例实现Revit和Revit打开的文件的相关信息. #region Namespaces using System; using System.Collections.Generic; using ...
- Revit二次开发示例:EventsMonitor
在该示例中,插件在Revit启动时弹出事件监控选择界面,供用户设置,也可在添加的Ribbon界面完成设置.当Revit进行相应操作时,弹出窗体会记录事件时间和名称. #region Namespace ...
- Revit二次开发示例:ChangesMonitor
在本示例中,程序监控Revit打开文件事件,并在创建的窗体中更新文件信息. #region Namespaces using System; using System.Collections.Ge ...
- Revit二次开发示例:AutoStamp
该示例中,在Revit启动时添加打印事件,在打印时向模型添加水印,打印完成后删除该水印. #region Namespaces using System; using System.Collect ...
- Revit二次开发示例:ModelessForm_ExternalEvent
使用Idling事件处理插件任务. #region Namespaces using System; using System.Collections.Generic; using Autodesk. ...
- Revit二次开发示例:Journaling
关于Revit Journal读写的例子. #region Namespaces using System; using System.Collections.Generic; using Sys ...
- Revit二次开发示例:DisableCommand
Revit API 不支持调用Revit内部命令,但可以用RevitCommandId重写它们(包含任意选项卡,菜单和右键命令).使用RevitCommandId.LookupCommandId()可 ...
- Revit二次开发示例:DesignOptions
本例只要演示Revit的类过滤器的用法,在对话框中显示DesignOption元素. #region Namespaces using System; using System.Collections ...
- Revit二次开发示例:DeleteObject
在本例中,通过命令可以删除选中的元素. 需要注意的是要在代码中加入Transaction,否则的话会出现Modifying is forbidden because the document has ...
随机推荐
- linux下搭建Nginx
Linux上搭建nginx,及简单配置 在上家公司都是运维安装nginx,到新公司后代码开发完成部署测试服务器要求自己装nginx,研究了好久安装好之后,到正式上线还要自己安装,索性把安装步骤自己记 ...
- [Effective JavaScript 笔记]第3章:使用函数--个人总结
前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...
- Python 正则表达式_re模块_使用compile加速
使用compile加速 compile( rule [,flag] ) 将正则规则编译成一个Pattern对象,以供接下来使用. 第一个参数是规则式,第二个参数是规则选项. 返回一个Pattern对象 ...
- zb的生日
http://acm.nyist.net/JudgeOnline/problem.php?pid=325 zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 ...
- python 之验证码
验证码原理在于后台自动创建一张带有随机内容的图片,然后将内容通过img标签输出到页面. 安装图像处理模块: pip3 install pillow
- android获取手机信息大全
IMEI号,IESI号,手机型号: private void getInfo() { TelephonyManager mTm = (TelephonyManager) getSystemServic ...
- 【leetcode】Palindrome Partitioning II
Palindrome Partitioning II Given a string s, partition s such that every substring of the partition ...
- 70 数组的Kmin算法和二叉搜索树的Kmin算法对比
[本文链接] http://www.cnblogs.com/hellogiser/p/kmin-of-array-vs-kmin-of-bst.html [分析] 数组的Kmin算法和二叉搜索树的Km ...
- Android Studio "diamond operator is not supported" 处理方法
低版本的android编译环境是不支持使用java7语法的,如果使用了,就会产生上述问题,如果你的android环境较新,那么可以使用以下方法: 在build.gradle的android标签下加入以 ...
- mysql show
1.show命令语法 SHOW {BINARY | MASTER} LOGS SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset, ...