/* ============================================================================== * 功能描述:CreateFacilityRevitUtils * 创 建 者:Garrett * 创建日期:2019/10/23 10:24:09 * ==============================================================================*/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.DB.Structure; using Saga.PlugIn.ModelCheck; using SAGA.DotNetUtils.Others; using SAGA.RevitUtils.Extends; using SAGA.RevitUtils.Windows; using FWindSoft.Revit; using SAGA.DotNetUtils; namespace Saga.PlugIn.CreateFacility { /// /// CreateFacilityRevitUtils /// public class CreateFacilityRevitUtils { /// /// 由资产id查找模型中的设备 /// /// /// /// public static string FindFacility(Document doc,string code, string propertyId) { var facilities = DocumentExtension.GetElements(doc); string id = null; foreach (FamilyInstance facility in facilities) { var familyName = facility.GetFamilyName(); if (familyName.StartsWith(code)) { var parameter = ParameterExtend.GetParameterString(facility, CreateFacilityConst.PropertyID); if (parameter == propertyId) { id = facility.Id.ToString(); break; } } } return id; } /// /// 定位模型 /// /// public static void FocusFacility(string id) { RevitCore.UIApp.SetShowElements(new ElementId(id.ToInt())); } /// /// 自动创建设备 /// /// /// /// /// /// public static string CreateFacility(Document doc, MFacilityClass facilityClass, MXYZ location, string propertyId) { FamilyInstance fi = null; using (Transaction trans = new Transaction(doc, "自动创建模型")) { trans.Start(); try { FamilySymbol fs = GetFamilySymbol(doc, facilityClass.code); if (fs == null) { WinTipMissFamily win=new WinTipMissFamily($"{facilityClass.code}-{facilityClass.name}"); win.ShowDialog(); return null; } if (IsBasePointFamily(fs)) { //使用BIMLocation中的坐标,mm转为英寸 XYZ xyz = new XYZ(location.X.ToDouble().ToApi(), location.Y.ToDouble().ToApi(), location.Z.ToDouble().ToApi()); xyz = xyz == null ? XYZ.Zero : xyz.ConvertToApi(); var level = GetCurFloorLevel(doc); //传标高,z值设置为零 xyz = xyz.NewZ(0); fi = doc.Create.NewFamilyInstance(xyz, fs, level, StructuralType.NonStructural); //假如定位点和中心点不一致,平移设备,将设备中心点移到定位点上 doc.Regenerate(); fi.SetSharedParameter(CreateFacilityConst.PropertyID, propertyId); XYZ centerXyz = FWindSoft.Revit.ElementExtension.GetLocationPoint(fi).NewZ(0); if (!centerXyz.IsEqual2(xyz)) { XYZ vector = xyz - centerXyz; doc.MoveElement(fi.Id, vector); } trans.Commit(); } else { MessageShowBase.Infomation("自动创建只能创建基于点的族,请查看族类型"); } } catch (Exception e) { trans.RollBack(); } } return fi?.Id.ToString(); } /// /// 判断是否为基于点的设备 /// /// /// private static bool IsBasePointFamily(FamilySymbol fs) { bool result = false; Family fa = fs?.Family; if (fa == null) return result; result = fa.FamilyPlacementType == FamilyPlacementType.OneLevelBased; return result; } private static Level GetCurFloorLevel(Document doc) { var view = DocumentExtension.GetElements(doc).FirstOrDefault(t => t.GenLevel?.Name != null && t.Name?.IndexOf("-saga") > -1 && t.ViewType == ViewType.FloorPlan); Level level = view?.GenLevel ?? doc.GetLevels().FirstOrDefault(); return level; } /// /// 由code获取FamilySymbol /// /// /// /// public static FamilySymbol GetFamilySymbol(Document doc,string code) { Func filterFamily = (t) => { return Regex.IsMatch(t, $@"{code}{ModelCheckConst.IsFamilyCode}"); }; List listFamily = doc.GetFamilys(); var fa = listFamily.FirstOrDefault(t => filterFamily(t.Name)); if (fa == null) return null; List symbolList = FamilyExtension.GetFamilySymbols(fa); var fs = symbolList?.FirstOrDefault(); if (fs != null && !fs.IsActive) fs.Activate(); return fs; } } }