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 ...
随机推荐
- HTML 快速入门
最近帮朋友研究作一个网站,虽然对很多人来说这是很简单的事情,但是对我来说却比较复杂!废话不多讲了,看看我找的HTML快速入门,说不定也会对你有帮助! 一. HTML 的基本概念 HTML ( Hyp ...
- Floyd算法 及其运用
#include<stdio.h> ][]; ][]; void floyd(int n) { ;k<=n;k++) { ;i<=n;i++) { ;j<=n;j++) ...
- django-jinjia 集成
现成包可以参考这里: http://niwibe.github.io/django-jinja/ Requirements Python 2.7, 3.3 or 3.4 Django 1.4, 1. ...
- No bootable device-insert boot disk and press any key
macbook air 2012 mid. 长按关机键关机,按开机键,然后长按option键,会出现可以选择启动的磁盘块,选择要启动的磁盘进入即可.
- 【Python】python代码如何调试?
Python 程序如何高效地调试? 现在我在debug python程序就只是简单在有可能错误的地方print出来看一下,不知道python有没像c++的一些IDE一样有单步调试这类的工具?或者说各位 ...
- 面向侧面的程序设计AOP-------《三》.Net平台AOP技术概览
本文转载自张逸:晴窗笔记 .Net平台与Java平台相比,由于它至今在服务端仍不具备与unix系统的兼容性,也不具备类似于Java平台下J2EE这样的企业级容器,使得.Net平台在大型的企业级应用上, ...
- iOS __block类型变量作用域
看下图 在c语言中,2个独立的函数是不可能互相访问局部变量的,但是__block提供了这个功能,它不单单能读变量,还可以对变量进行写!上图说明,block获得了i最后的真实值5,没有只取得0,这都是& ...
- iOS 端的第三方语音识别库
最近在看语音识别方面的库,主要看了2个收费的项目,一个是 At&t 的,一个是Nuance的.这2个项目虽然是收费的,但是仅仅测试的话,是免费的,连接如下 https://developer. ...
- angularjs 指令(directive)详解(1)
原文地址 什么是directive?我们先来看一下官方的解释: At a high level, directives are markers on a DOM element (such as an ...
- 菜鸟学Linux命令:chmod命令和数字文件权限
chmod是一条在Unix系统中用于控制用户对文件的权限的命令(change mode单词前缀的组合)和函数.只有文件所有者和超级用户可以修改文件或目录的权限.可以使用绝对模式,符号模式指定文件的权限 ...