Files
2024-12-12 09:51:40 +01:00

336 lines
14 KiB
C#

//
// (C) Copyright 2003-2011 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.Collections.Generic;
using System.Text;
using System.Data;
using System.Collections;
using System.Windows.Forms;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB.Structure;
namespace Revit.SDK.Samples.BarDescriptions.CS
{
/// <summary>
/// Iterates through the BarDescriptions in the project and displays the properties in a table.
/// Allow the table to be saved in an Excel .CSV file.
/// </summary>
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)]
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
[Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
public class Command: IExternalCommand
{
// this object contains information related to the external command
ExternalCommandData m_revit = null;
// an array list store all AreaReinforcements' ids in the project
ArrayList m_areaReinforcementIdList = new ArrayList();
// an data table store all required information
System.Data.DataTable m_barDescriptions = new System.Data.DataTable("BarDescriptions");
// an data view which filtrate data from m_barDescriptions data table
// according the given id of AreaReinforcement.
DataView m_specificBarDescriptions = new DataView();
// properties
#region properties
/// <summary>
/// the ids of the AreaReinforcements in the project
/// </summary>
public ArrayList AreaReinforcementIds
{
get
{
return m_areaReinforcementIdList;
}
}
/// <summary>
/// all the BarDescriptions in the project
/// </summary>
public System.Data.DataTable AllBarDescriotions
{
get
{
return m_barDescriptions;
}
}
/// <summary>
/// the BarDescriotions of one appointed AreaReinforcement
/// </summary>
public DataView SpecificBarDescriptions
{
get
{
return m_specificBarDescriptions;
}
}
#endregion
///<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 Autodesk.Revit.UI.Result Execute(Autodesk.Revit.UI.ExternalCommandData revit,
ref string message,
ElementSet elements)
{
m_revit = revit;
// store all BarDescriptions in m_barDescriptions table and
// store the AreaReinforcements id value in m_areaReinforcementIdList array
if (!PrepareAllNeededData())
{
message = "Cannot found AreaReinforcement in Project";
return Autodesk.Revit.UI.Result.Cancelled;
}
// show UI
BarDescriptionsForm displayForm = new BarDescriptionsForm(this);
displayForm.ShowDialog();
return Autodesk.Revit.UI.Result.Succeeded;
}
/// <summary>
/// set one specific AreaReinforcemet id value as row filter condition
/// of data view m_specificBarDescriptions.
/// </summary>
/// <param name="areaReinforcementIdValue">
/// an specific AreaReinforcemet id value
/// </param>
public void SetViewRowFilterCondition(int areaReinforcementIdValue)
{
m_specificBarDescriptions.Table = m_barDescriptions;
string rowFilterCondition = "areaReinforcementId = " + areaReinforcementIdValue;
m_specificBarDescriptions.RowFilter = rowFilterCondition;
}
/// <summary>
/// export the BarDescriptions to a Excel
/// </summary>
/// <param name="saveFileName"></param>
public void ExportAllData(string saveFileName)
{
// CSV format data which store all information that need be exported.
string exportData = "";
// set table title
string projectTitle = m_revit.Application.ActiveUIDocument.Document.Title;
exportData += "Bar Descriotions of " + projectTitle + "\r\n";
// set table head
for (int i = 1; i < m_barDescriptions.Columns.Count; i++)
{
exportData += m_barDescriptions.Columns[i].Caption + ",";
}
exportData += "\r\n";
// write into BarDescriptions
int areaReinId = System.Int32.MinValue;
for (int i = 0; i < m_barDescriptions.Rows.Count; i++)
{
int currentAreaReinId = int.Parse(m_barDescriptions.Rows[i][0].ToString());
// AreaReinforment id has own row
if (currentAreaReinId != areaReinId)
{
exportData += "AreaForcement Id: " + currentAreaReinId + "\r\n";
areaReinId = currentAreaReinId;
}
// write into current row's each column data
for (int j = 1; j < m_barDescriptions.Columns.Count; j++)
{
exportData += m_barDescriptions.Rows[i][j].ToString() + ",";
}
exportData += "\r\n";
}
// save the information which is stored in exportData in an Excel .CSV
if (exportData.Length > 0)
{
System.IO.StreamWriter exportFile = new System.IO.StreamWriter(saveFileName);
exportFile.WriteLine(exportData);
exportFile.Close();
}
}
/// <summary>
/// Iterates through all the BarDescriptions in the project.
/// store these data in a data table m_barDescriptions and
/// store the AreaReinforcements id value in a array list m_areaReinforcementIdList
/// </summary>
private bool PrepareAllNeededData()
{
// reset the Columns of data table m_barDescriptions
SetDataTableCloumn();
AreaReinforcement tempAreaReinforcement = null;
FilteredElementIterator i = (new FilteredElementCollector(m_revit.Application.ActiveUIDocument.Document)).OfClass(typeof(AreaReinforcement)).GetElementIterator();
while (i.MoveNext())
{
tempAreaReinforcement = i.Current as AreaReinforcement;
if (tempAreaReinforcement != null)
{
// store all the AreaReinforcements id value in a array list m_areaReinforcementIdList
m_areaReinforcementIdList.Add(tempAreaReinforcement.Id.IntegerValue);
// store BarDescriptions in a data table m_barDescriptions
for (int j = 0; j < tempAreaReinforcement.NumBarDescriptions; j++)
{
BarDescription barDescription = tempAreaReinforcement.get_BarDescription(j);
SetCurrentBarDescriptionToTable(tempAreaReinforcement, barDescription);
}
}
}
if (null == tempAreaReinforcement)
{
return false;
}
return true;
}
/// <summary>
/// insert current BarDescription, which is iterated through, into data table
/// </summary>
/// <param name="areaReinforcement"></param>
/// <param name="barDescription"></param>
private void SetCurrentBarDescriptionToTable(AreaReinforcement areaReinforcement,
BarDescription barDescription)
{
int areaReinforcementId = areaReinforcement.Id.IntegerValue;
int layer = barDescription.Layer;
string barType = barDescription.BarType.Name;
double barLength = barDescription.Length;
string[] hookType = new string[2]{"",""};
bool hookSameDirection = barDescription.HooksInSameDirection;
int barCount = barDescription.Count;
for (int i = 0; i < 2; i++)
{
if (null == barDescription.get_HookType(i))
{
hookType[i] = "None";
}
else
{
hookType[i] = barDescription.get_HookType(i).Name;
}
}
DataRow newRow = m_barDescriptions.NewRow();
newRow["areaReinforcementId"] = areaReinforcementId;
newRow["layer"] = layer;
newRow["barType"] = barType;
newRow["barLength"] = barLength;
newRow["oneEndHookType"] = hookType[0];
newRow["otherEndHookType"] = hookType[1];
newRow["hookSameDirection"] = hookSameDirection;
newRow["barCount"] = barCount;
m_barDescriptions.Rows.Add(newRow);
}
/// <summary>
/// edit the Columns of data table m_barDescriptions
/// </summary>
private void SetDataTableCloumn()
{
m_barDescriptions.Clear();
m_barDescriptions.Columns.Clear();
// add a column to store the id value of AreaReinforcement.
DataColumn areaReinforcementId = new DataColumn("areaReinforcementId", typeof(int));
areaReinforcementId.Caption = "AreaReinforcement Id";
areaReinforcementId.ReadOnly = true;
m_barDescriptions.Columns.Add(areaReinforcementId);
// add a column to store current layer.
DataColumn layer = new DataColumn("layer", typeof(int));
layer.Caption = "Layer";
layer.ReadOnly = true;
m_barDescriptions.Columns.Add(layer);
// add a column to store bar type name.
DataColumn barType = new DataColumn("barType", typeof(string));
barType.Caption = "Bar Type";
barType.ReadOnly = true;
m_barDescriptions.Columns.Add(barType);
// add a column to store bar length.
DataColumn barLength = new DataColumn("barLength", typeof(double));
barLength.Caption = "Bar Length (feet)";
barLength.ReadOnly = true;
m_barDescriptions.Columns.Add(barLength);
// add a column to store hook type in one end.
DataColumn oneEndHookType = new DataColumn("oneEndHookType", typeof(string));
oneEndHookType.Caption = "One End Hook Type";
oneEndHookType.ReadOnly = true;
m_barDescriptions.Columns.Add(oneEndHookType);
// add a column to store hook type in other end.
DataColumn otherEndHookType = new DataColumn("otherEndHookType", typeof(string));
otherEndHookType.Caption = "Other End Hook Type";
otherEndHookType.ReadOnly = true;
m_barDescriptions.Columns.Add(otherEndHookType);
// add a column to store if the both hooks are bent in the same direction.
DataColumn hookSameDirection = new DataColumn("hookSameDirection", typeof(bool));
hookSameDirection.Caption = "Hook Same Direction";
hookSameDirection.ReadOnly = true;
m_barDescriptions.Columns.Add(hookSameDirection);
// add a column to store the number of bars of this shape.
DataColumn barCount = new DataColumn("barCount", typeof(int));
barCount.Caption = "Bar Count";
barCount.ReadOnly = true;
m_barDescriptions.Columns.Add(barCount);
}
}
}