mirror of
https://github.com/jeremytammik/RevitSdkSamples.git
synced 2026-08-09 06:31:32 +00:00
416 lines
16 KiB
C#
416 lines
16 KiB
C#
//
|
|
// (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.Collections.Generic;
|
|
|
|
using Autodesk.Revit.DB;
|
|
using Autodesk.Revit.UI;
|
|
using Autodesk.Revit.DB.Structure;
|
|
|
|
using TaskDialog = Autodesk.Revit.UI.TaskDialog;
|
|
|
|
namespace Revit.SDK.Samples.Loads.CS
|
|
{
|
|
/// <summary>
|
|
/// mainly deal class which give methods to connect Revit and the user operation on the form
|
|
/// </summary>
|
|
public class LoadCombinationDeal
|
|
{
|
|
// Private Members
|
|
Loads m_dataBuffer; // Store the reference of Loads
|
|
Autodesk.Revit.ApplicationServices.Application m_revit; // Store the reference of revit
|
|
Autodesk.Revit.DB.Document m_document; // Store the reference of document
|
|
|
|
// Methods
|
|
/// <summary>
|
|
/// Default constructor of LoadCombinationDeal
|
|
/// </summary>
|
|
public LoadCombinationDeal(Loads dataBuffer)
|
|
{
|
|
m_dataBuffer = dataBuffer;
|
|
m_revit = dataBuffer.RevitApplication;
|
|
UIApplication uiapplication = new UIApplication(m_revit);
|
|
m_document = uiapplication.ActiveUIDocument.Document;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Find out all Load Combination and Usage in the existing document.
|
|
/// As specification require, prepare some Load Combination Usages if they are not in document
|
|
/// </summary>
|
|
public void PrepareData()
|
|
{
|
|
// Find out all Load Combination and Usage in the existing document.
|
|
IList<Element> elements = (new FilteredElementCollector(m_document)).OfClass(typeof(LoadCombination)).ToElements();
|
|
foreach (Element elem in elements)
|
|
{
|
|
LoadCombination combination = elem as LoadCombination;
|
|
if (null != combination)
|
|
{
|
|
// Add the Load Combination name.
|
|
m_dataBuffer.LoadCombinationNames.Add(combination.Name);
|
|
|
|
// Create LoadCombinationMap object.
|
|
LoadCombinationMap combinationMap = new LoadCombinationMap(combination);
|
|
|
|
// Add the LoadCombinationMap object to the array list.
|
|
m_dataBuffer.LoadCombinationMap.Add(combinationMap);
|
|
}
|
|
}
|
|
|
|
elements = (new FilteredElementCollector(m_document)).OfClass(typeof(LoadUsage)).ToElements();
|
|
foreach (Element elem in elements)
|
|
{
|
|
// Add Load Combination Usage information
|
|
LoadUsage usage = elem as LoadUsage;
|
|
if (null != usage)
|
|
{
|
|
// Add the Load Usage name
|
|
m_dataBuffer.LoadUsageNames.Add(usage.Name);
|
|
|
|
// Add the Load Usage object to a LoadUsageArray
|
|
m_dataBuffer.LoadUsages.Add(usage);
|
|
|
|
// Add the Load Usage information to UsageMap.
|
|
UsageMap usageMap = new UsageMap(m_dataBuffer, usage.Name);
|
|
m_dataBuffer.UsageMap.Add(usageMap);
|
|
}
|
|
}
|
|
|
|
// As specification require, some Load Combination Usages if they are not in document
|
|
String[] initUsageArray = { "Gravity", "Lateral", "Steel", "Composite", "Concrete" };
|
|
foreach (String s in initUsageArray)
|
|
{
|
|
NewLoadUsage(s);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create new Load Combination
|
|
/// </summary>
|
|
/// <param name="name">The new Load Combination name</param>
|
|
/// <param name="typeIndex">The index of new Load Combination Type</param>
|
|
/// <param name="stateIndex">The index of new Load Combination State</param>
|
|
/// <returns>true if the creation was successful; otherwise, false</returns>
|
|
public Boolean NewLoadCombination(String name, int typeIndex, int stateIndex)
|
|
{
|
|
// Define some data for creation.
|
|
List<ElementId> usageIds = new List<ElementId>();
|
|
List<LoadComponent> components = new List<LoadComponent>();
|
|
double[] factorArray = new double[m_dataBuffer.FormulaMap.Count];
|
|
|
|
// First check whether the name has been used
|
|
foreach (String s in m_dataBuffer.LoadCombinationNames)
|
|
{
|
|
if (s == name || null == name)
|
|
{
|
|
m_dataBuffer.ErrorInformation = "the combination name has been used.";
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Get the usage information.
|
|
foreach (UsageMap usageMap in m_dataBuffer.UsageMap)
|
|
{
|
|
if (true == usageMap.Set)
|
|
{
|
|
LoadUsage usage = FindUsageByName(usageMap.Name);
|
|
if (null != usage)
|
|
{
|
|
usageIds.Add(usage.Id);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get the formula information
|
|
for (int i = 0; i < m_dataBuffer.FormulaMap.Count; i++)
|
|
{
|
|
FormulaMap formulaMap = m_dataBuffer.FormulaMap[i];
|
|
factorArray[i] = formulaMap.Factor;
|
|
LoadCase loadCase = FindLoadCaseByName(formulaMap.Case);
|
|
if (null != loadCase)
|
|
{
|
|
LoadComponent component = new LoadComponent(loadCase.Id, formulaMap.Factor);
|
|
components.Add(component);
|
|
}
|
|
}
|
|
|
|
|
|
// Begin to new a load combination
|
|
try
|
|
{
|
|
LoadCombination loadCombination = LoadCombination.Create(m_document, name, (LoadCombinationType)typeIndex, (LoadCombinationState)stateIndex);
|
|
if (null == loadCombination)
|
|
{
|
|
m_dataBuffer.ErrorInformation = "Get null reference after usage creation.";
|
|
return false;
|
|
}
|
|
loadCombination.SetComponents(components);
|
|
loadCombination.SetUsageIds(usageIds);
|
|
|
|
// Store this load combination information for further use
|
|
m_dataBuffer.LoadCombinationNames.Add(loadCombination.Name);
|
|
LoadCombinationMap combinationMap = new LoadCombinationMap(loadCombination);
|
|
m_dataBuffer.LoadCombinationMap.Add(combinationMap);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
m_dataBuffer.ErrorInformation = e.Message;
|
|
return false;
|
|
}
|
|
|
|
// If create combination successful, reset the usage check state and clear the formula
|
|
foreach (UsageMap usageMap in m_dataBuffer.UsageMap)
|
|
{
|
|
usageMap.Set = false;
|
|
}
|
|
m_dataBuffer.FormulaMap.Clear();
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Delete the selected Load Combination
|
|
/// </summary>
|
|
/// <param name="index">The selected index in the DataGridView</param>
|
|
/// <returns>true if the delete operation was successful; otherwise, false</returns>
|
|
public Boolean DeleteCombination(int index)
|
|
{
|
|
// Get the name of the delete combination
|
|
String combinationName = m_dataBuffer.LoadCombinationNames[index];
|
|
|
|
// Find the combination by the name and delete the combination
|
|
LoadCombination combination;
|
|
IList<Element> elements = (new FilteredElementCollector(m_document)).OfClass(typeof(LoadCombination)).ToElements();
|
|
foreach (Element elem in elements)
|
|
{
|
|
combination = elem as LoadCombination;
|
|
|
|
if (combinationName == combination.Name)
|
|
{
|
|
// Begin to delete the combination
|
|
try
|
|
{
|
|
m_document.Delete(combination.Id);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
m_dataBuffer.ErrorInformation = e.ToString();
|
|
return false;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
// If delete is successful, Change the map and the string List
|
|
m_dataBuffer.LoadCombinationMap.RemoveAt(index);
|
|
m_dataBuffer.LoadCombinationNames.RemoveAt(index);
|
|
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create a new load combination usage
|
|
/// </summary>
|
|
/// <param name="usageName">The new Load Usage name</param>
|
|
/// <returns>true if the process is successful; otherwise, false</returns>
|
|
public Boolean NewLoadUsage(String usageName)
|
|
{
|
|
// First check whether the name has been used
|
|
foreach (String s in m_dataBuffer.LoadUsageNames)
|
|
{
|
|
if (usageName == s)
|
|
{
|
|
m_dataBuffer.ErrorInformation = "the usage name has been used.";
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Begin to new a load combination usage
|
|
try
|
|
{
|
|
LoadUsage loadUsage = LoadUsage.Create(m_document, usageName);
|
|
if (null == loadUsage)
|
|
{
|
|
m_dataBuffer.ErrorInformation = "Get null reference after usage creation.";
|
|
return false;
|
|
}
|
|
// Store this load usage information for further use.
|
|
m_dataBuffer.LoadUsageNames.Add(loadUsage.Name);
|
|
m_dataBuffer.LoadUsages.Add(loadUsage);
|
|
|
|
// Add the Load Usage information to UsageMap.
|
|
UsageMap usageMap = new UsageMap(m_dataBuffer, loadUsage.Name);
|
|
m_dataBuffer.UsageMap.Add(usageMap);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
m_dataBuffer.ErrorInformation = e.Message;
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Delete the selected Load Usage
|
|
/// </summary>
|
|
/// <param name="index">The selected index in the DataGridView</param>
|
|
/// <returns>true if the delete operation was successful; otherwise, false</returns>
|
|
public Boolean DeleteUsage(int index)
|
|
{
|
|
// Get the delete usage
|
|
LoadUsage deleteUsage = m_dataBuffer.LoadUsages[index];
|
|
String usageName = deleteUsage.Name;
|
|
|
|
// Begin to delete the combination
|
|
try
|
|
{
|
|
m_document.Delete(deleteUsage.Id);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
m_dataBuffer.ErrorInformation = e.ToString();
|
|
return false;
|
|
}
|
|
|
|
// Modify the data to show the delete operation
|
|
m_dataBuffer.LoadUsages.RemoveAt(index);
|
|
m_dataBuffer.LoadUsageNames.RemoveAt(index);
|
|
m_dataBuffer.UsageMap.RemoveAt(index);
|
|
|
|
// Need to delete corresponding in Combination
|
|
foreach (LoadCombinationMap map in m_dataBuffer.LoadCombinationMap)
|
|
{
|
|
String oldUsage = map.Usage;
|
|
int location = oldUsage.IndexOf(usageName);
|
|
if (-1 == location)
|
|
{
|
|
continue;
|
|
}
|
|
if (oldUsage.Length == usageName.Length)
|
|
{
|
|
map.Usage = oldUsage.Remove(0);
|
|
continue;
|
|
}
|
|
if (0 == location)
|
|
{
|
|
map.Usage = oldUsage.Remove(location, usageName.Length + 1);
|
|
}
|
|
else
|
|
{
|
|
map.Usage = oldUsage.Remove(location - 1, usageName.Length + 1);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Change usage name when the user modify it on the form
|
|
/// </summary>
|
|
/// <param name="oldName">The name before modification</param>
|
|
/// <param name="newName">The name after modification</param>
|
|
/// <returns>true if the modification was successful; otherwise, false</returns>
|
|
public Boolean ModifyUsageName(String oldName, String newName)
|
|
{
|
|
// If the name is no change, just return true.
|
|
if (oldName == newName)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
// Check whether the name has been used
|
|
foreach (String s in m_dataBuffer.LoadUsageNames)
|
|
{
|
|
if (s == newName)
|
|
{
|
|
TaskDialog.Show("Revit", "There is a same named usage already.");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Begin to modify the name of the usage
|
|
foreach (LoadUsage usage in m_dataBuffer.LoadUsages)
|
|
{
|
|
if (oldName == usage.Name)
|
|
{
|
|
usage.get_Parameter(BuiltInParameter.LOAD_USAGE_NAME).Set(newName);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Add a formula with the load case name
|
|
/// </summary>
|
|
/// <param name="caseName">The name of the load case</param>
|
|
/// <returns>true if the creation is successful; otherwise, false</returns>
|
|
public Boolean AddFormula(String caseName)
|
|
{
|
|
// New a FormulaMap, and add it to m_dataBuffer.FormulaMap
|
|
// Note: the factor of the formula is always set 1
|
|
FormulaMap map = new FormulaMap(caseName);
|
|
m_dataBuffer.FormulaMap.Add(map);
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Find a load usage by the load usage name
|
|
/// </summary>
|
|
/// <param name="name">The name of load usage</param>
|
|
/// <returns>The reference of the LoadUsage</returns>
|
|
private LoadUsage FindUsageByName(String name)
|
|
{
|
|
LoadUsage usage = null;
|
|
foreach (LoadUsage l in m_dataBuffer.LoadUsages)
|
|
{
|
|
if (name == l.Name)
|
|
{
|
|
usage = l;
|
|
break;
|
|
}
|
|
}
|
|
return usage;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Find a load case by the load case name
|
|
/// </summary>
|
|
/// <param name="name">The name of load case</param>
|
|
/// <returns>The reference of the LoadCase</returns>
|
|
private LoadCase FindLoadCaseByName(String name)
|
|
{
|
|
LoadCase loadCase = null;
|
|
foreach (LoadCase l in m_dataBuffer.LoadCases)
|
|
{
|
|
if (name == l.Name)
|
|
{
|
|
loadCase = l;
|
|
break;
|
|
}
|
|
}
|
|
return loadCase;
|
|
}
|
|
}
|
|
}
|