| | |
| | | using Autodesk.Revit.ApplicationServices;
|
| | | using Autodesk.Revit.DB;
|
| | | using Autodesk.Revit.DB;
|
| | | using Autodesk.Revit.DB.Events;
|
| | | using Autodesk.Revit.DB.Plumbing;
|
| | | using Autodesk.Revit.UI;
|
| | |
| | | using DevExpress.Utils.Extensions;
|
| | | using HStation.RevitDev.Model.ModelEnum;
|
| | | using HStation.RevitDev.RevitDataExport.Common;
|
| | | using HStation.RevitDev.RevitDataExport.Entity;
|
| | | using HStation.RevitDev.RevitDataExport.Service;
|
| | | using System;
|
| | | using System.Collections.Generic;
|
| | | using System.Collections.ObjectModel;
|
| | | using System.Linq;
|
| | | using static DevExpress.Data.Mask.Internal.RegExMaskMath.CloudOfInts;
|
| | |
|
| | | namespace HStation.RevitDev.RevitDataExport.Utility
|
| | | {
|
| | |
| | |
|
| | | private static void App_DocumentChanged(object sender, DocumentChangedEventArgs e)
|
| | | {
|
| | | //当创建一个新文档时,先执行documentChanged事件,在执行documentCreated事件
|
| | | var doc = e.GetDocument();
|
| | | GlobalResource.CurrentDocument = doc;
|
| | | try
|
| | | {
|
| | | var addedIds = e.GetAddedElementIds();
|
| | | var removeIds = e.GetDeletedElementIds();
|
| | | var modifiedIds = e.GetModifiedElementIds();
|
| | |
|
| | | AddElements(doc, addedIds);
|
| | | AddElements(doc, addedIds);
|
| | | RemoveElements(removeIds);
|
| | | ModifyElements(modifiedIds);
|
| | |
|
| | | UpdateLinkerInfo(doc);
|
| | | AddUnhandledElements();
|
| | | GlobalResource.InstancePanel.UpdateForm();
|
| | | }
|
| | | catch (Exception ex)
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | private static void UpdateLinkerInfo(Document doc)
|
| | | {
|
| | | foreach (var pair in GlobalResource.RevitModels)
|
| | | {
|
| | | foreach (var model in pair.Value) |
| | | {
|
| | | var id = model.Id;
|
| | | var element = doc.GetElement(new ElementId(int.Parse(id)));
|
| | | var linkedElems = element.GetConnectElements();
|
| | | var linkedIds = linkedElems.Select(x => x.Id.IntegerValue.ToString());
|
| | | model.LinkIds = string.Join(",", linkedIds);
|
| | | }
|
| | | } |
| | | }
|
| | | //private static void UpdateLinkerInfo(Document doc)
|
| | | //{
|
| | | // if (!doc.IsValidObject) { return; }
|
| | |
|
| | | private static void ModifyElements(ICollection<ElementId> modifiedIds)
|
| | | {
|
| | | foreach (var id in modifiedIds)
|
| | | {
|
| | | if (GlobalResource.ElementIds.Contains(id.IntegerValue.ToString()))
|
| | | {
|
| | | // foreach (var pair in GlobalResource.RevitModels)
|
| | | // {
|
| | | // foreach (var id in pair.Value)
|
| | | // {
|
| | | // if (id == null) { continue; }
|
| | |
|
| | | }
|
| | | }
|
| | | }
|
| | | // var element = doc.GetElement(new ElementId(int.Parse(id)));
|
| | | // var linkedElems = element.GetConnectElements();
|
| | | // var linkedIds = linkedElems.Select(x => x.Id.IntegerValue.ToString());
|
| | | // model.LinkIds = string.Join(",", linkedIds);
|
| | | // }
|
| | | // }
|
| | | //}
|
| | |
|
| | | private static void RemoveElements(ICollection<ElementId> removeIds)
|
| | | {
|
| | | foreach (var id in removeIds)
|
| | | {
|
| | | var strId = id.IntegerValue.ToString();
|
| | | if (GlobalResource.ElementIds.Contains(strId))
|
| | | {
|
| | | GlobalResource.ElementIds.Remove(id.IntegerValue.ToString());
|
| | | foreach (var pair in GlobalResource.RevitModels)
|
| | | {
|
| | | var values = pair.Value;
|
| | | var model = values.Where(x => x.Id == strId)?.ToList();
|
| | | if (model == null || model.Count() == 0)
|
| | | {
|
| | | continue;
|
| | | }
|
| | | else
|
| | | {
|
| | | values.Remove(model[0]);
|
| | | }
|
| | | }
|
| | | }
|
| | | GlobalResource.RevitModels.Remove(id.IntegerValue.ToString());
|
| | | }
|
| | |
|
| | | return;
|
| | | }
|
| | |
|
| | | private static void AddElements(Document doc, ICollection<ElementId> addedIds)
|
| | | {
|
| | | bool instancePlacing = GlobalResource.InstancePlacing;
|
| | | bool pipePlacing = GlobalResource.PipePlacing;
|
| | |
|
| | | if (pipePlacing)
|
| | | if (GlobalResource.PlacingType == RevitType.RFT_Pipe)
|
| | | {
|
| | | foreach (var id in addedIds)
|
| | | {
|
| | |
| | | }
|
| | | if (elem is Pipe)
|
| | | {
|
| | | GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
|
| | | AddManualCreated(elem);
|
| | | GlobalResource.RevitModels.Add(elem, RevitType.RFT_Pipe);
|
| | | }
|
| | | }
|
| | | }
|
| | | else if (instancePlacing)
|
| | | else if (GlobalResource.PlacingType != RevitType.RFT_Unknown)
|
| | | {
|
| | | foreach (var id in addedIds)
|
| | | {
|
| | | var elem = doc.GetElement(id);
|
| | | if (elem is FamilyInstance)
|
| | | {
|
| | | GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
|
| | | AddManualCreated(elem);
|
| | | GlobalResource.RevitModels.Add(elem, GlobalResource.PlacingType);
|
| | | }
|
| | | }
|
| | | }
|
| | |
| | | bool isPumpSystemElement = false;
|
| | | foreach (var id in addedIds)
|
| | | {
|
| | | //手动布置的构件如消火栓、热换器等基本不能自动加入到系统中,能自动布置并连接
|
| | | //系统的基本都是三通、四通、弯头、过渡件、管帽这些
|
| | | if (IsConnectedWithPumpSystem(doc, id))
|
| | | {
|
| | | isPumpSystemElement = true;
|
| | |
| | | {
|
| | | if (pipe.ConnectWithPumpSystem())
|
| | | {
|
| | | //GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
|
| | | //TaskDialog.Show("提示", "增加管道:" + id.IntegerValue.ToString());
|
| | | //AddManualCreated(elem);
|
| | | return true;
|
| | | }
|
| | | }
|
| | |
| | | {
|
| | | if (fi.ConnectWithPumpSystem()) //直接点击管道连接点创建管道时,Revit会自动创建弯头,都需要加入到缓存
|
| | | {
|
| | | //GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
|
| | | //TaskDialog.Show("提示", "增加族实例:" + id.IntegerValue.ToString());
|
| | | //AddManualCreated(elem);
|
| | | return true;
|
| | | }
|
| | | }
|
| | |
| | | var elem = doc.GetElement(id);
|
| | | if (elem is Pipe)
|
| | | {
|
| | | GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
|
| | | AddToMap(elem, RevitType.RFT_Pipe);
|
| | | GlobalResource.RevitModels.Add(elem, RevitType.RFT_Pipe);
|
| | | }
|
| | | else if (elem is FamilyInstance fi)
|
| | | {
|
| | | GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
|
| | | AddAutoCreated(fi);
|
| | | }
|
| | | return;
|
| | |
| | |
|
| | | private static void AddAutoCreated(FamilyInstance fi)
|
| | | {
|
| | | var id = fi.Id;
|
| | | GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
|
| | | if (fi.IsWanTou())
|
| | | if (fi.IsPipeHat())
|
| | | {
|
| | | AddToMap(fi, RevitType.RFT_Elbow);
|
| | | GlobalResource.RevitModels.Add(fi, RevitType.RFT_Blocker);
|
| | | }
|
| | | else if (fi.IsWanTou())
|
| | | {
|
| | | GlobalResource.RevitModels.Add(fi, RevitType.RFT_Elbow);
|
| | | }
|
| | | else if (fi.IsConverter())
|
| | | {
|
| | | AddToMap(fi, RevitType.RFT_Converter);
|
| | | GlobalResource.RevitModels.Add(fi, RevitType.RFT_Converter);
|
| | | }
|
| | | else if (fi.IsSanTong())
|
| | | {
|
| | | AddToMap(fi, RevitType.RFT_ThreeJoint);
|
| | | GlobalResource.RevitModels.Add(fi, RevitType.RFT_ThreeJoint);
|
| | | }
|
| | | else if (fi.IsSiTong())
|
| | | {
|
| | | AddToMap(fi, RevitType.RFT_FourJoint);
|
| | | GlobalResource.RevitModels.Add(fi, RevitType.RFT_FourJoint);
|
| | | }
|
| | | else
|
| | | {
|
| | | TaskDialog.Show("警告", $"未知类型被添加!id:{fi.Id.IntegerValue}");
|
| | | //报错
|
| | | }
|
| | | }
|
| | |
|
| | | private static void AddManualCreated(Element elem)
|
| | | {
|
| | | var id = elem.Id.IntegerValue.ToString();
|
| | |
|
| | | //更新已加入到缓存中的构件数据
|
| | | List<string> linkedIds = elem.GetConnectElements().Select(x => x.Id.IntegerValue.ToString()).ToList();
|
| | | //foreach (var linkId in linkedIds)
|
| | | //{
|
| | | // var model = GlobalResource.GetElementModel(linkId);
|
| | | // if (!model.LinkIds.Contains(id))
|
| | | // {
|
| | | // model.LinkIds += "," + id;
|
| | | // }
|
| | | //}
|
| | |
|
| | | //把新增构件加入到缓存中
|
| | | if (!GlobalResource.RevitModels.ContainsKey(GlobalResource.RevitFamilyType))
|
| | | {
|
| | | GlobalResource.RevitModels.Add(GlobalResource.RevitFamilyType, new ObservableCollection<ElementModel>());
|
| | | GlobalResource.RevitModels[GlobalResource.RevitFamilyType].Add(new ElementModel
|
| | | {
|
| | | Name = elem.Name,
|
| | | Id = id,
|
| | | LinkIds = /*string.Join(",", linkedIds)*/string.Empty
|
| | | });
|
| | |
|
| | | }
|
| | | else if(!GlobalResource.RevitModels[GlobalResource.RevitFamilyType].Any(x=>x.Id == id))
|
| | | {
|
| | | GlobalResource.RevitModels[GlobalResource.RevitFamilyType].Add(new ElementModel
|
| | | {
|
| | | Name = elem.Name,
|
| | | Id = id,
|
| | | LinkIds = /* string.Join(",", linkedIds)*/string.Empty
|
| | | });
|
| | | }
|
| | | }
|
| | |
|
| | | private static void AddToMap(Element elem, RevitType revitType)
|
| | | {
|
| | | var id = elem.Id.IntegerValue.ToString();
|
| | |
|
| | | //更新已加入到缓存中的构件数据
|
| | | //List<string> linkedIds = elem.GetConnectElements().Select(x => x.Id.IntegerValue.ToString()).ToList();
|
| | | //foreach (var linkId in linkedIds)
|
| | | //{
|
| | | // var model = GlobalResource.GetElementModel(linkId);
|
| | | // if (!model.LinkIds.Contains(id))
|
| | | // {
|
| | | // model.LinkIds += "," + id;
|
| | | // }
|
| | | //}
|
| | |
|
| | | if (!GlobalResource.RevitModels.ContainsKey(revitType))
|
| | | {
|
| | | GlobalResource.RevitModels.Add(revitType, new ObservableCollection<ElementModel>());
|
| | | GlobalResource.RevitModels[revitType].Add(new ElementModel
|
| | | {
|
| | | Name = elem.Name,
|
| | | Id = id,
|
| | | LinkIds = /*string.Join(",", linkedIds)*/string.Empty
|
| | | });
|
| | | }
|
| | | else if (!GlobalResource.RevitModels[revitType].Any(x => x.Id == id))
|
| | | {
|
| | | GlobalResource.RevitModels[revitType].Add(new ElementModel
|
| | | {
|
| | | Name = elem.Name,
|
| | | Id = id,
|
| | | LinkIds = /*string.Join(",", linkedIds)*/string.Empty
|
| | | });
|
| | | }
|
| | | }
|
| | |
|
| | |
| | |
|
| | | private static void Application_ViewActivated(object sender, ViewActivatedEventArgs e)
|
| | | {
|
| | | GlobalResource.CurrentDocument = e.CurrentActiveView.Document;
|
| | | //切换文档时
|
| | | if (GlobalResource.CurrentDocument == null ||
|
| | | GlobalResource.CurrentDocument.GetHashCode() != e.CurrentActiveView.Document.GetHashCode())
|
| | | {
|
| | | GlobalResource.CurrentDocument = e.CurrentActiveView.Document;
|
| | | GlobalResource.InstancePanel.UpdateForm();
|
| | | }
|
| | | }
|
| | |
|
| | | public static List<Element> GetModelElements(this Document doc) |
| | | public static List<Element> GetModelElements(this Document doc)
|
| | | {
|
| | | //FilteredElementCollector collector = null;
|
| | | //foreach (Category cate in doc.Settings.Categories)
|
| | | //{
|
| | | // if (cate.CategoryType != CategoryType.Model)
|
| | | // {
|
| | | // continue;
|
| | | // }
|
| | | // var subCollector = new FilteredElementCollector(doc);
|
| | | // subCollector.OfCategory((BuiltInCategory)(cate.Id.IntegerValue));
|
| | | // subCollector.WhereElementIsNotElementType();
|
| | | // if (collector == null)
|
| | | // {
|
| | | // collector = subCollector;
|
| | | // }
|
| | | // else
|
| | | // {
|
| | | // collector.UnionWith(subCollector);
|
| | | // }
|
| | | //}
|
| | | //
|
| | | if (!doc.IsValidObject)
|
| | | {
|
| | | return new List<Element>();
|
| | | }
|
| | |
|
| | | var collector1 = new FilteredElementCollector(doc).
|
| | | OfCategory(BuiltInCategory.OST_PipeCurves).
|
| | | WhereElementIsNotElementType();
|
| | |
| | | var collector2 = new FilteredElementCollector(doc).
|
| | | OfClass(typeof(FamilyInstance)).
|
| | | WhereElementIsNotElementType();
|
| | |
|
| | | |
| | |
|
| | | var elements1 = collector1.ToElements()?.ToList();
|
| | | var elements2 = collector2.ToElements()?.ToList();
|
| | |
| | | return elements1;
|
| | | }
|
| | |
|
| | | public static void AddUnhandledElementsToCache()
|
| | | public static void AddUnhandledElements()
|
| | | {
|
| | | var elements = GlobalResource.CurrentDocument.GetModelElements();
|
| | | foreach (var element in elements) |
| | | foreach (var element in elements)
|
| | | {
|
| | | var id = element.Id.IntegerValue.ToString();
|
| | | if (GlobalResource.ElementIds.Contains(id))
|
| | | if (GlobalResource.RevitModels.Contains(id))
|
| | | {
|
| | | continue;
|
| | | }
|
| | | RevitMepCategoryService.MatchElement(element);
|
| | | RevitMepCategoryService.AddToCache(element);
|
| | | }
|
| | | UpdateLinkerInfo(GlobalResource.CurrentDocument);
|
| | | //UpdateLinkerInfo(GlobalResource.CurrentDocument);
|
| | | }
|
| | |
|
| | | public static void UpdataDocumentCache(this Document doc)
|
| | | {
|
| | | if (!doc.IsValidObject)
|
| | | {
|
| | | return;
|
| | | }
|
| | | if (!GlobalResource.CurrentDocument.IsValidObject || doc.GetHashCode() != GlobalResource.CurrentDocument.GetHashCode())
|
| | | {
|
| | | GlobalResource.CurrentDocument = doc;
|
| | | //GlobalResource.RevitModels = new List<Tuple<string, Dictionary<RevitType, List<string>>>>();
|
| | | }
|
| | | AddUnhandledElements();
|
| | | }
|
| | | }
|
| | | }
|