应用程序:ChangesMonitor
Revit平台:所有
Revit版本:2011.0
首次发布用于:2011.0
编程语言:C#
技能等级:中等
类别:基础
类型:外部应用
主题:跟踪文档中的更改。
摘要:此示例演示了如何将DocumentChanged事件订阅到受控制的应用程序级别,以及此事件是如何工作的。
相关类:
Autodesk.Revit.UI. IExternalApplicat
ion
Autodesk.Revit.DB.DocumentChangeArgs
项目文件:
•ChangesMonitor.cs此文件包含一个类ExternalApplication,该类实现IExternalApplication接口并提供示例条目。在这个类中,将创建一个无模式对话框来跟踪更改的元素的信息。
该文件还包含一个类Command,它继承自IExternalCommand接口。该类的功能是在用户关闭信息对话框后再次显示该对话框。
•ChangesInfoForm.cs此文件包含一个表单类ChangesInfomationForm,该类由一个DataGridView组成,用于向用户显示更改元素的信息。信息包括更改类型(添加、删除和修改)、元素id、元素名称、元素的类别名称以及拥有更改元素的文档。
功能:
Revit应用程序启动时,示例会弹出一个名为“更改信息表单”的无模式对话框。
一旦用户进行了一些修改,比如创建一个元素或移动一个元素。该示例在无模式窗口中列出了更改后的元素的信息,如更改样式、元素Id、元素名称、元素类别以及拥有该元素的文档。
实施:
1.运行Revit并新建一个项目。屏幕右下方显示一个无模式对话框。
2.修改文档,如创建、移动或删除元素。更改后的元素信息将转储到无模式对话框中。
3.如果您关闭对话框并想再次显示它,您可以转到加载项 外部工具ShowChangesInfoForm以再次检索对话框。
完整的源代码请加入QQ群649037449,在群文件中下载RevitSDK.exe,解压后在文件夹中搜索本文中应用程序名称即可获得完整源码
ChangesMonitor.cs
//
// (C) Copyright 2003-2019 by Autodesk, Inc.
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted,
// provided that the above copyright notice appears in all copies and
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//
using System;
using System.IO;
using System.Data;
using System.Text;
using System.Reflection;
using System.Diagnostics;
using System.Collections.Generic;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.ApplicationServices;
namespace Revit.SDK.Samples.ChangesMonitor.CS
{
/// <summary>
/// A class inherits IExternalApplication interface and provide an entry of the sample.
/// It create a modeless dialog to track the changes.
/// </summary>
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
[Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
public class ExternalApplication : IExternalApplication
{
#region Class Member Variables
/// <summary>
/// A controlled application used to register the DocumentChanged event. Because all trigger points
/// in this sample come from UI, the event must be registered to ControlledApplication.
/// If the trigger point is from API, user can register it to application
/// which can retrieve from ExternalCommand.
/// </summary>
private static ControlledApplication m_CtrlApp;
/// <summary>
/// data table for information windows.
/// </summary>
private static DataTable m_ChangesInfoTable;
/// <summary>
/// The window is used to show changes' information.
/// </summary>
private static ChangesInformationForm m_InfoForm;
#endregion
#region Class Static Property
/// <summary>
/// Property to get and set private member variables of changes log information.
/// </summary>
public static DataTable ChangesInfoTable
{
get { return m_ChangesInfoTable; }
set { m_ChangesInfoTable = value; }
}
/// <summary>
/// Property to get and set private member variables of info form.
/// </summary>
public static ChangesInformationForm InfoForm
{
get { return ExternalApplication.m_InfoForm; }
set { ExternalApplication.m_InfoForm = value; }
}
#endregion
#region IExternalApplication Members
/// <summary>
/// Implement this method to implement the external application which should be called when
/// Revit starts before a file or default template is actually loaded.
/// </summary>
/// <param name="application">An object that is passed to the external application
/// which contains the controlled application.</param>
/// <returns>Return the status of the external application.
/// A result of Succeeded means that the external application successfully started.
/// Cancelled can be used to signify that the user cancelled the external operation at
/// some point.
/// If false is returned then Revit should inform the user that the external application
/// failed to load and the release the internal reference.</returns>
public Result OnStartup(UIControlledApplication application)
{
// initialize member variables.
m_CtrlApp = application.ControlledApplication;
m_ChangesInfoTable = CreateChangeInfoTable();
m_InfoForm = new ChangesInformationForm(ChangesInfoTable);
// register the DocumentChanged event
m_CtrlApp.DocumentChanged += new EventHandler<Autodesk.Revit.DB.Events.DocumentChangedEventArgs>(CtrlApp_DocumentChanged);
// show dialog
m_InfoForm.Show();
return Result.Succeeded;
}
/// <summary>
/// Implement this method to implement the external application which should be called when
/// Revit is about to exit,Any documents must have been closed before this method is called.
/// </summary>
/// <param name="application">An object that is passed to the external application
/// which contains the controlled application.</param>
/// <returns>Return the status of the external application.
/// A result of Succeeded means that the external application successfully shutdown.
/// Cancelled can be used to signify that the user cancelled the external operation at
/// some point.
/// If false is returned then the Revit user should be warned of the failure of the external
/// application to shut down correctly.</returns>
public Result OnShutdown(UIControlledApplication application)
{
m_CtrlApp.DocumentChanged -= CtrlApp_DocumentChanged;
m_InfoForm = null;
m_ChangesInfoTable = null;
return Result.Succeeded;
}
#endregion
#region Event handler
/// <summary>
/// This method is the event handler, which will dump the change information to tracking dialog
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void CtrlApp_DocumentChanged(object sender, Autodesk.Revit.DB.Events.DocumentChangedEventArgs e)
{
// get the current document.
Document doc = e.GetDocument();
// dump the element information
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");
}
}
#endregion
#region Class Methods
/// <summary>
/// This method is used to retrieve the changed element and add row to data table.
/// </summary>
/// <param name="id"></param>
/// <param name="doc"></param>
/// <param name="changeType"></param>
private void AddChangeInfoRow(ElementId id, Document doc, string changeType)
{
// retrieve the changed element
Element elem = doc.GetElement(id);
DataRow newRow = m_ChangesInfoTable.NewRow();
// set the relative information of this event into the table.
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);
}
/// <summary>
/// Generate a data table with five columns for display in window
/// </summary>
/// <returns>The DataTable to be displayed in window</returns>
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 idColum = new DataColumn("Id", typeof(System.String));
idColum.Caption = "Id";
changesInfoTable.Columns.Add(idColum);
// 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;
}
#endregion
}
/// <summary>
/// This class inherits IExternalCommand interface and used to retrieve the dialog again.
/// </summary>
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
public class Command : IExternalCommand
{
#region IExternalCommand Members
/// <summary>
/// Implement this method as an external command for Revit.
/// </summary>
/// <param name="commandData">An object that is passed to the external application
/// which contains data related to the command,
/// such as the application object and active view.</param>
/// <param name="message">A message that can be set by the external application
/// which will be displayed if a failure or cancellation is returned by
/// the external command.</param>
/// <param name="elements">A set of elements to which the external application
/// can add elements that are to be highlighted in case of failure or cancellation.</param>
/// <returns>Return the status of the external command.
/// A result of Succeeded means that the API external method functioned as expected.
/// Cancelled can be used to signify that the user cancelled the external operation
/// at some point. Failure should be returned if the application is unable to proceed with
/// the operation.</returns>
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
if (ExternalApplication.InfoForm == null)
{
ExternalApplication.InfoForm = new ChangesInformationForm(ExternalApplication.ChangesInfoTable);
}
ExternalApplication.InfoForm.Show();
return Result.Succeeded;
}
#endregion
}
}
ChangesInfoForm.cs
//
// (C) Copyright 2003-2019 by Autodesk, Inc.
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted,
// provided that the above copyright notice appears in all copies and
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//
namespace Revit.SDK.Samples.ChangesMonitor.CS
{
partial class ChangesInformationForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.changesdataGridView = new System.Windows.Forms.DataGridView();
((System.ComponentModel.ISupportInitialize)(this.changesdataGridView)).BeginInit();
this.SuspendLayout();
//
// changesdataGridView
//
this.changesdataGridView.AllowUserToAddRows = false;
this.changesdataGridView.AllowUserToDeleteRows = false;
this.changesdataGridView.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.changesdataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.changesdataGridView.Location = new System.Drawing.Point(-1, -2);
this.changesdataGridView.Name = "changesdataGridView";
this.changesdataGridView.ReadOnly = true;
this.changesdataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.changesdataGridView.Size = new System.Drawing.Size(665, 81);
this.changesdataGridView.TabIndex = 0;
this.changesdataGridView.RowsAdded += new System.Windows.Forms.DataGridViewRowsAddedEventHandler(this.changesdataGridView_RowsAdded);
//
// ChangesInformationForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(664, 77);
this.Controls.Add(this.changesdataGridView);
this.MaximizeBox = false;
this.Name = "ChangesInformationForm";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.Text = "Changes Information";
this.Shown += new System.EventHandler(this.ChangesInfoForm_Shown);
((System.ComponentModel.ISupportInitialize)(this.changesdataGridView)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.DataGridView changesdataGridView;
}
}
版权所有 :无锡模信建筑科技有限公司 苏ICP备2021028830号-1 BIM建模|BIM技术应用|BIM软件开发
联系地址:江苏省无锡市新吴区龙山路4号B座705 手机:18761516598