在本示例中,程序监控Revit打开文件事件,并在创建的窗体中更新文件信息。

 

#region Namespaces
using System;
using System.Collections.Generic;
using System.Data;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
#endregion namespace ChangesMonitor
{
[Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)]
[Autodesk.Revit.Attributes.Journaling(JournalingMode.NoCommandData)]
class App : IExternalApplication
{
private static ControlledApplication m_CtrlApp;
private static DataTable m_ChangesInfoTable;
private static ChangesInformationForm m_InfoForm; public static DataTable ChangesInfoTalbe
{
get { return m_ChangesInfoTable; }
set { m_ChangesInfoTable = value; }
} public static ChangesInformationForm InfoForm
{
get { return App.m_InfoForm; }
set { App.m_InfoForm = value; }
} public Result OnStartup(UIControlledApplication a)
{
m_CtrlApp = a.ControlledApplication;
m_ChangesInfoTable = CreateChangeInfoTable();
m_InfoForm = new ChangesInformationForm(ChangesInfoTalbe); m_CtrlApp.DocumentChanged += m_CtrlApp_DocumentChanged; m_InfoForm.Show(); return Result.Succeeded;
} void m_CtrlApp_DocumentChanged(object sender, Autodesk.Revit.DB.Events.DocumentChangedEventArgs e)
{
Document doc = e.GetDocument(); ICollection<ElementId> addedElem = e.GetAddedElementIds();
foreach (ElementId id in addedElem)
{
AddChangeInfoRow(id, doc, "Added");
} ICollection<ElementId> deletedElem = e.GetDeletedElementIds();
foreach (ElementId id in deletedElem)
{
AddChangeInfoRow(id, doc, "Deleted");
} ICollection<ElementId> modifiedElem = e.GetModifiedElementIds();
foreach (ElementId id in modifiedElem)
{
AddChangeInfoRow(id, doc, "Modified");
} } public Result OnShutdown(UIControlledApplication a)
{
m_CtrlApp.DocumentChanged -= m_CtrlApp_DocumentChanged;
m_InfoForm = null;
m_ChangesInfoTable = null; return Result.Succeeded;
} private DataTable CreateChangeInfoTable()
{
// create a new dataTable
DataTable changesInfoTable = new DataTable("ChangesInfoTable"); // Create a "ChangeType" column. It will be "Added", "Deleted" and "Modified".
DataColumn styleColumn = new DataColumn("ChangeType", typeof(System.String));
styleColumn.Caption = "ChangeType";
changesInfoTable.Columns.Add(styleColumn); // Create a "Id" column. It will be the Element ID
DataColumn idColumn = new DataColumn("Id", typeof(System.String));
idColumn.Caption = "Id";
changesInfoTable.Columns.Add(idColumn); // Create a "Name" column. It will be the Element Name
DataColumn nameColum = new DataColumn("Name", typeof(System.String));
nameColum.Caption = "Name";
changesInfoTable.Columns.Add(nameColum); // Create a "Category" column. It will be the Category Name of the element.
DataColumn categoryColum = new DataColumn("Category", typeof(System.String));
categoryColum.Caption = "Category";
changesInfoTable.Columns.Add(categoryColum); // Create a "Document" column. It will be the document which own the changed element.
DataColumn docColum = new DataColumn("Document", typeof(System.String));
docColum.Caption = "Document";
changesInfoTable.Columns.Add(docColum); // return this data table
return changesInfoTable;
} private void AddChangeInfoRow(ElementId id, Document doc, string changeType)
{
Element elem = doc.GetElement(id); DataRow newRow = m_ChangesInfoTable.NewRow(); if(elem==null)
{
// this branch is for deleted element due to the deleted element cannot be retrieve from the document.
newRow["ChangeType"] = changeType;
newRow["Id"] = id.IntegerValue.ToString();
newRow["Name"] = "";
newRow["Category"] = "";
newRow["Document"] = "";
}
else
{
newRow["ChangeType"]=changeType;
newRow["Id"]=id.IntegerValue.ToString();
newRow["Name"]=elem.Name;
newRow["Category"]=elem.Category.Name;
newRow["Document"]=doc.Title;
} m_ChangesInfoTable.Rows.Add(newRow);
}
}
}

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace ChangesMonitor
{
public partial class ChangesInformationForm : Form
{
public ChangesInformationForm()
{
InitializeComponent(); } public ChangesInformationForm(DataTable dataBuffer)
:this()
{
changesdataGridView.DataSource = dataBuffer;
changesdataGridView.AutoGenerateColumns = false; } private void ChangesInfoForm_Shown(object sender, EventArgs e)
{
int left = Screen.PrimaryScreen.WorkingArea.Right - this.Width - 5;
int top = Screen.PrimaryScreen.WorkingArea.Bottom - this.Height;
Point windowLocation = new Point(left, top);
this.Location = windowLocation; } private void changesdataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
changesdataGridView.CurrentCell = changesdataGridView.Rows[changesdataGridView.Rows.Count - 1].Cells[0];
} private void ChangesInformationForm_FormClosed(object sender, FormClosedEventArgs e)
{
App.InfoForm = null;
} }
}

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace ChangesMonitor
{
public partial class ChangesInformationForm : Form
{
public ChangesInformationForm()
{
InitializeComponent(); } public ChangesInformationForm(DataTable dataBuffer)
:this()
{
changesdataGridView.DataSource = dataBuffer;
changesdataGridView.AutoGenerateColumns = false; } private void ChangesInfoForm_Shown(object sender, EventArgs e)
{
int left = Screen.PrimaryScreen.WorkingArea.Right - this.Width - 5;
int top = Screen.PrimaryScreen.WorkingArea.Bottom - this.Height;
Point windowLocation = new Point(left, top);
this.Location = windowLocation; } private void changesdataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
changesdataGridView.CurrentCell = changesdataGridView.Rows[changesdataGridView.Rows.Count - 1].Cells[0];
} private void ChangesInformationForm_FormClosed(object sender, FormClosedEventArgs e)
{
App.InfoForm = null;
} }
}

Revit二次开发示例:ChangesMonitor的更多相关文章

  1. Revit二次开发示例:HelloRevit

    本示例实现Revit和Revit打开的文件的相关信息. #region Namespaces using System; using System.Collections.Generic; using ...

  2. Revit二次开发示例:EventsMonitor

    在该示例中,插件在Revit启动时弹出事件监控选择界面,供用户设置,也可在添加的Ribbon界面完成设置.当Revit进行相应操作时,弹出窗体会记录事件时间和名称. #region Namespace ...

  3. Revit二次开发示例:ErrorHandling

    本示例介绍了Revit的错误处理.   #region Namespaces using System; using System.Collections.Generic; using Autodes ...

  4. Revit二次开发示例:AutoStamp

    该示例中,在Revit启动时添加打印事件,在打印时向模型添加水印,打印完成后删除该水印.   #region Namespaces using System; using System.Collect ...

  5. Revit二次开发示例:ModelessForm_ExternalEvent

    使用Idling事件处理插件任务. #region Namespaces using System; using System.Collections.Generic; using Autodesk. ...

  6. Revit二次开发示例:Journaling

    关于Revit Journal读写的例子.   #region Namespaces using System; using System.Collections.Generic; using Sys ...

  7. Revit二次开发示例:DisableCommand

    Revit API 不支持调用Revit内部命令,但可以用RevitCommandId重写它们(包含任意选项卡,菜单和右键命令).使用RevitCommandId.LookupCommandId()可 ...

  8. Revit二次开发示例:DesignOptions

    本例只要演示Revit的类过滤器的用法,在对话框中显示DesignOption元素. #region Namespaces using System; using System.Collections ...

  9. Revit二次开发示例:DeleteObject

    在本例中,通过命令可以删除选中的元素. 需要注意的是要在代码中加入Transaction,否则的话会出现Modifying  is forbidden because the document has ...

随机推荐

  1. shell脚本-监控及邮件提醒

    首先写一个邮件提醒python文件 #!/usr/bin/python # -*- coding: UTF-8 -*- import sys import smtplib import email.m ...

  2. SQL Server 问题之 排序规则(collation)冲突

    一.写在前面 最近公司进行开发环境升级,数据库也准备了一个新的服务器,一切准备好后开始数据迁移,采取的方式为对现有Database(现有服务器Windows Server 2003 + SQL Ser ...

  3. equals方法变量和常量位置区别

    对于字符串比较,我的习惯用法是   变量.equals(常量) 比如:     a.equals("a") 今天看视频才知道变量在前面与后面有很大影响,正确的写法是常量放前面(可以 ...

  4. ActiveMQ与SpringMVC整合实现发送PTP和订阅发布消息功能

    实现一个基于SpringMVC+JMS+ActiveMQ+Tomcat+JDK1.8+IDEA工具 ,Spring4.1.0和ActiveMQ5.15整合的实例,实现PTP和订阅/发布两种消息模型 一 ...

  5. MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题 收藏 MySQL中涉及的几个字符集

    MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的.character-set-database:数据 ...

  6. shell脚本编程之“最简单的死循环”【转】

    转自:http://blog.chinaunix.net/uid-23046336-id-3475462.html 在linux下编程的程序猿都知道shell脚本,就算你不怎么熟悉,也应该听过的吧!那 ...

  7. SDN核心技术剖析和实战指南---读书笔记

    第一章 SDN定义如下: SDN是一种新兴的基于软件的网络架构及技术,其最大的特点在于具有松耦合的控制平面与数据平面.支持集中化的网络状态控制.实现底层网络设施对上层应用的透明. SDN和NFV: O ...

  8. mac 下安装pip

    pip是常用的Python包管理工具,类似于Java的maven.用python的同学,都离不开pip. 在新mac中想用home-brew安装pip时,遇到了一些小问题: bogon:~ wangl ...

  9. 回归模型效果评估系列3-R平方

    决定系数(coefficient of determination,R2)是反映模型拟合优度的重要的统计量,为回归平方和与总平方和之比.R2取值在0到1之间,且无单位,其数值大小反映了回归贡献的相对程 ...

  10. CSS — 贝塞尔曲线(cubic-bezier)

    cubic-bezier 又称三次贝塞尔,主要是为 animation 生成速度曲线的函数,规定是 cubic-bezier(<x1>, <y1>, <x2>, & ...