Client/Desktop/KMBIM3.0/23.10.18/Cmd/Duct/DuctSize/DuctViCmd.cs

246 lines
9.8 KiB
C#

using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using KDCS.Utils;
using KMBIM.Utils;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace KMBIM.Revit.Tools.Cmd.DuctSize
{
[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)]
class DuctViCmd : IExternalCommand
{
UIApplication m_pUIApp;
UIDocument uidoc = null;
Document doc = null;
List<ElementId> _added_emement_ids = new List<ElementId>();
Autodesk.Revit.DB.Mechanical.Duct m_duct;
XYZ m_pt1, m_pt2;
public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements)
{
try
{
if (!WorkMain.GetInstance().IsValid) return Autodesk.Revit.UI.Result.Succeeded;
m_pUIApp = commandData.Application;
uidoc = m_pUIApp.ActiveUIDocument;
doc = uidoc.Document;
MechanicalSystemType ductSystemType = null;
Selection sel1 = uidoc.Selection;
DefinitionFile informationFile = OpenSharedParameter();
if (null == informationFile)
{
return Result.Failed;
}
List<ElementId> selIds = new List<ElementId>(); // 선택된 아이디
List<ElementId> visitedIds = new List<ElementId>(); // 방문한 덕트 아이디
uidoc.Selection.SetElementIds(visitedIds);
var ductrefs = uidoc.Selection.PickObjects(ObjectType.Element, "풍량을 입력할 덕트 대행자 선택");
if (ductrefs == null) return Result.Failed;
Autodesk.Revit.DB.Mechanical.Duct ductMain = doc.GetElement(ductrefs.First()) as Autodesk.Revit.DB.Mechanical.Duct;
// 내부 흐름 기본 단위는 ft3/s; 1 ft3/s = 101.9406477312 m3/h, 1m3/h = 0.0098096296448581
// 1 m3/h = 0.009809629644857942 ft3/s
double m3_per_h = 0.0098096296448581; // 1m3/h = 0.0098096296448581 ft3/s
// 개별풍량, 전체풍량 파라미터 준비
InitDuctFlow(ductMain, informationFile, "IndividualFlow");
InitDuctFlow(ductMain, informationFile, "TotalFlow");
Autodesk.Revit.DB.Parameter paramIF = ductMain.LookupParameter("IndividualFlow");
double dblFlow = paramIF.AsDouble();
double cmh = dblFlow * 101.9406477312;
FormDuctVi frmVi = new FormDuctVi();
frmVi.Flow = cmh;
if (frmVi.ShowDialog() == DialogResult.OK)
{
using (Transaction trans = new Transaction(doc))
{
trans.Start("Set Air Flow");
foreach (Reference refer in ductrefs)
{
ElementId idDuct = refer.ElementId;
ductMain = doc.GetElement(idDuct) as Autodesk.Revit.DB.Mechanical.Duct;
if (ductMain == null) return Result.Failed;
// 개별풍량, 전체풍량 파라미터 준비
InitDuctFlow(ductMain, informationFile, "IndividualFlow");
InitDuctFlow(ductMain, informationFile, "TotalFlow");
paramIF = ductMain.LookupParameter("IndividualFlow");
paramIF.Set(frmVi.Flow * m3_per_h); // ft3/s
Autodesk.Revit.DB.Parameter paramTF = ductMain.LookupParameter("TotalFlow");
paramTF.Set(0d); // ft3/s
}
trans.Commit();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return Result.Succeeded;
}
private void InitDuctFlow(Autodesk.Revit.DB.Mechanical.Duct ductMain, DefinitionFile informationFile, string parameterName)
{
Definition defIndividualFlow = null;
Autodesk.Revit.DB.Parameter paramIF = ductMain.LookupParameter(parameterName);
SharedParameterBindingManager manager = new SharedParameterBindingManager();
manager.parameterName = parameterName;
#if _22 || _23
manager.parameterType = SpecTypeId.AirFlow;
#else
manager.parameterType = ParameterType.HVACAirflow;
#endif
manager.UserModifiable = true;
if (paramIF == null)
{
DefinitionGroup defGroup = informationFile.Groups.get_Item("Duct");
if (defGroup != null)
{
defIndividualFlow = defGroup.Definitions.get_Item(parameterName);
if (defIndividualFlow != null)
{
// Create a new Binding object with the categories to which the parameter will be bound.
CategorySet categories = m_pUIApp.Application.Create.NewCategorySet();
// get door category and insert into the CategorySet.
Category ductCategory = m_pUIApp.ActiveUIDocument.Document.Settings.Categories.
get_Item(BuiltInCategory.OST_PlaceHolderDucts);
categories.Insert(ductCategory);
InstanceBinding instanceBinding = m_pUIApp.Application.Create.NewInstanceBinding(categories);
BindingMap bindingMap = m_pUIApp.ActiveUIDocument.Document.ParameterBindings;
// for "IndividualFlow"
if (!AlreadyAddedSharedParameter(m_pUIApp.ActiveUIDocument.Document, parameterName, BuiltInCategory.OST_PlaceHolderDucts))
{
Definition instanceIndividualFlow = defGroup.Definitions.get_Item(parameterName);
if (null == instanceIndividualFlow)
{
#if _23
ExternalDefinitionCreationOptions ExternalDefinitionCreationOptions2 = new ExternalDefinitionCreationOptions(parameterName, SpecTypeId.AirFlow);
#else
ExternalDefinitionCreationOptions ExternalDefinitionCreationOptions2 = new ExternalDefinitionCreationOptions(parameterName, ParameterType.HVACAirflow);
#endif
instanceIndividualFlow = defGroup.Definitions.Create(ExternalDefinitionCreationOptions2);
}
using (Transaction trans = new Transaction(doc))
{
trans.Start("Add Shared Parameter");
// Add the binding and definition to the document.
bindingMap.Insert(instanceIndividualFlow, instanceBinding, BuiltInParameterGroup.PG_MECHANICAL_AIRFLOW);
trans.Commit();
}
}
}
}
}
}
private DefinitionFile OpenSharedParameter()
{
//Method's return
DefinitionFile informationFile = null;
// create shared parameter file
var location = Util.GetKMBIMLibraryFolder("SharedParameter");
string sharedParameterFile = Path.Combine(location, "KMBIMSharedParameter.txt");
if (File.Exists(sharedParameterFile))
{
m_pUIApp.Application.SharedParametersFilename = sharedParameterFile;
informationFile = m_pUIApp.Application.OpenSharedParameterFile();
}
return informationFile;
}
/// <summary>
/// Has the specific document shared parameter already been added ago?
/// </summary>
/// <param name="doc">Revit project in which the shared parameter will be added.</param>
/// <param name="paraName">the name of the shared parameter.</param>
/// <param name="boundCategory">Which category the parameter will bind to</param>
/// <returns>Returns true if already added ago else returns false.</returns>
private bool AlreadyAddedSharedParameter(Document doc, string paraName, BuiltInCategory boundCategory)
{
try
{
BindingMap bindingMap = doc.ParameterBindings;
DefinitionBindingMapIterator bindingMapIter = bindingMap.ForwardIterator();
while (bindingMapIter.MoveNext())
{
if (bindingMapIter.Key.Name.Equals(paraName))
{
ElementBinding binding = bindingMapIter.Current as ElementBinding;
CategorySet categories = binding.Categories;
foreach (Category category in categories)
{
if (category.Id.IntegerValue.Equals((int)boundCategory))
{
return true;
}
}
}
}
}
catch (Exception)
{
return false;
}
return false;
}
}
}