123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384 |
- /*-------------------------------------------------------------------------
- * 功能描述:SpaceManager
- * 作者:xulisong
- * 创建时间: 2018/12/14 10:11:22
- * 版本号:v1.0
- * -------------------------------------------------------------------------*/
- 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.DB.Architecture;
- using SAGA.DotNetUtils;
- using SAGA.MBI.Common;
- using SAGA.MBI.Model;
- using SAGA.MBI.WinView.Space;
- using SAGA.RevitUtils;
- using SAGA.RevitUtils.Extends;
- using RSpace=Autodesk.Revit.DB.Mechanical.Space;
- namespace SAGA.MBI.WinView
- {
- /// <summary>
- /// 元空间管理相关模操作
- /// </summary>
- public class SpaceManager
- {
- public const string NewCreateSpaceFlag = "不保留已有空间,创建新空间";
- public static bool IsNewSpaceFlag(ServerSpace space)
- {
- return space?.Name == NewCreateSpaceFlag;
- }
- /// <summary>
- /// 获取元素Id
- /// </summary>
- /// <param name="space"></param>
- /// <returns></returns>
- public static string GetElementId(MISpace space)
- {
- return space.BimID.Split(':')[1];
- }
- /// <summary>
- /// 更新项目中的空间分割
- /// </summary>
- /// <param name="doc"></param>
- /// <param name="separations"></param>
- /// <param name="deletedIds"></param>
- public static void UpdateSpaceSequaration(Document doc,List<SpaceSeparation> separations,List<int> deletedIds)
- {
- using (Transaction trans = new Transaction(doc, "更新空间分隔符"))
- {
- trans.Start();
- try
- {
- FailureHandlingOptions fho = trans.GetFailureHandlingOptions();
- //警告不提示,但不捕获冲突空间
- fho.SetFailuresPreprocessor(new SpaceFailuresPreprocessor());
- trans.SetFailureHandlingOptions(fho);
- //读取空间所在视图
- var view = doc.GetUseView();
- if (view == null)
- {
- MessageShow.Infomation("无法找到-saga标志的视图");
- return;
- }
- //创建空间分隔符
- CreateSpaceSeparation(view, separations);
- doc.Delete(deletedIds.Select(id => new ElementId(id)).ToList());
- trans.Commit();
- }
- catch (Exception e)
- {
- trans.RollBack();
- }
- }
- }
- /// <summary>
- /// 创建空间分隔符
- /// </summary>
- /// <param name="view"></param>
- /// <param name="separations"></param>
- public static void CreateSpaceSeparation(ViewPlan view, List<SpaceSeparation> separations)
- {
- if (view == null)
- return;
- double z = view.GenLevel.Elevation;
- Document doc = view.Document;
- Plane p =Plane.CreateByNormalAndOrigin(view.ViewDirection, view.Origin);
- var sp = SketchPlane.Create(doc, p);
- foreach (var pair in separations)
- {
- XYZ start = pair.Start.NewZ(z);
- XYZ end = pair.End.NewZ(z);
- Line line = null;
- try
- {
- line = start.NewLine(end);
- }
- catch (Exception e)
- {
- Console.WriteLine(e.StackTrace);
- }
- if (line != null)
- {
- var curveArray = new CurveArray();
- curveArray.Append(line);
- var newLIneId = doc.Create.NewSpaceBoundaryLines(sp, curveArray, view).get_Item(0).Id;
- pair.Id = newLIneId.IntegerValue;
- }
- }
- }
- /// <summary>
- /// 手动创建空间
- /// </summary>
- /// <param name="doc"></param>
- public static void CreateSpace(Document doc)
- {
- doc.LoadFamilySymbolExt(MBIConst.SpaceTagFamilyFilePath);
- var view = doc.GetUseView();
- if (view != null)
- {
- var level = view.GenLevel;
- var phase = view.GetUsePhase();
- PhaseUtil.ValidateUsePhase(phase);
- #region 创建新的节点
- List<XYZ> points = new List<XYZ>();
- using (SubTransaction sub = new SubTransaction(doc))
- {
- //把所有的空间分割转换成房间分割,然后获取封闭区域
- try
- {
- sub.Start();
- var virWalls = doc.FilterElements<CurveElement>((line) =>
- {
- var categoryId = line.Category.Id.IntegerValue;
- return categoryId == (int) BuiltInCategory.OST_MEPSpaceSeparationLines && line is ModelLine;
- }).OfType<ModelLine>();
- CurveArray curveArray = new CurveArray();
- foreach (var modelLine in virWalls)
- {
- curveArray.Append(modelLine.GeometryCurve);
- }
- #region 创建房间分割
- Plane p = Plane.CreateByNormalAndOrigin(view.ViewDirection, view.Origin);
- var sp = SketchPlane.Create(doc, p);
- doc.Create.NewRoomBoundaryLines(sp, curveArray, view);
- #endregion
- #region 获取封闭区域
- var topology = doc.get_PlanTopology(level, phase);
- foreach (PlanCircuit topologyCircuit in topology.Circuits)
- {
- var point = topologyCircuit.GetPointInside();
- var xyz = new XYZ(point.U, point.V, level.ProjectElevation+1); //适当升高一些
- points.Add(xyz);
- }
- #endregion
- }
- catch (Exception e)
- {
- }
- finally
- {
- sub.RollBack();
- }
- }
- #endregion
- #region 创建空间
- foreach (var point in points)
- {
- var oldSpace = doc.GetSpaceAtPoint(point, phase);
- if (oldSpace == null)
- {
- doc.Create.NewSpace(level, phase, new UV(point.X, point.Y));
- }
- }
- // var newSpaces = doc.Create.NewSpaces2(level, phase, view);
- #endregion
- }
- }
- /// <summary>
- /// 处理冲突信息
- /// </summary>
- /// <param name="doc"></param>
- /// <param name="failItems"></param>
- /// <param name="context">楼层上下文</param>
- /// <returns>ture表示处理完成,false表示存在没处理的空间【冲突空间可能未处理】</returns>
- public static bool DealSpaceFailuresPreprocessor(Document doc, List<FailItem> failItems,FloorSpaceContext context)
- {
- bool flag = true;
- #region 处理逻辑
- /*
- * 1、根据条件过滤,满足自动处理的自动处理。
- * 2、不满足自动处理的,手动选择保留项
- */
- #endregion
- List<ServerSpace> serverSpaces = new List<ServerSpace>();
- Regex regex = new Regex(@"^\d+$");
- var index = 1;
- foreach (var failItem in failItems)
- {
-
- var spacesServerInfo =context.GetPhysicalSpaces(failItem.Select(id=>id.IntegerValue.ToString()).ToList());
- if (spacesServerInfo == null || spacesServerInfo.Count == 0)
- {
- #region 冲突对象不包含物理世界空间
- var firstElement = doc.GetElement(failItem.FirstOrDefault());
- if (firstElement is RSpace first)
- {
- for (int i = 1; i < failItem.Count; i++)
- {
- var currentId = failItem[i];
- if (first.Id.IsEqual(currentId))
- continue;
- var curr = doc.GetElement(currentId) as RSpace;
- if (!regex.IsMatch(curr.Number))
- {
- doc.Delete(new List<ElementId>() { currentId });
- continue;
- }
- if (!regex.IsMatch(first.Number))
- {
- doc.Delete(new List<ElementId>() { first.Id });
- first = curr;
- continue;
- }
- if (int.Parse(first.Number) > int.Parse(curr.Number))
- {
- doc.Delete(new List<ElementId>() { first.Id });
- first = curr;
- }
- else
- {
- doc.Delete(new List<ElementId>() { currentId });
- }
- }
- }
- #endregion
- }
- else if (spacesServerInfo.Count == 1)
- {
- #region 冲突对象包好一个物理世界对象
- var serverSpaceId = spacesServerInfo[0].BimID.Split(':')[1];
- doc.Delete(failItem.Where(t => t.ToString() != serverSpaceId).ToList());
- #endregion
- }
- else
- {
- #region 冲突对象包含多个物理世界对象,保留物理世界对象手动选择【一般删掉空间分割产生这种情况】
- doc.Delete(failItem.Where(t => !spacesServerInfo.Exists(sp => sp.BimID.Split(':')[1] == t.ToString())).ToList());
- var groupName = $"待合并元空间组{index}";
- foreach (var mRevitEquipBase in spacesServerInfo)
- {
- if (mRevitEquipBase is MISpace space)
- {
- serverSpaces.Add(new ServerSpace()
- {
- Space = space,
- GroupName = groupName
- });
- }
- }
- serverSpaces.Add(new ServerSpace()
- {
- Name = NewCreateSpaceFlag,
- GroupName = groupName
- });
- index++;
- #endregion
- }
- }
- if (serverSpaces.Count > 0)
- {
- var winDeal = new WinSelectSpace(serverSpaces);
- var result = winDeal.ShowDialog();
- if (result == true)
- {
- //在指定位置创建空间,保留任意存在空间的定位点,根据定位点创建空间。
- var groups = serverSpaces.GroupBy(t => t.GroupName);
- List<string> deletedIds = new List<string>();
- List<UV> newSpaceLocations = new List<UV>();
- foreach (var groupSpaces in groups)
- {
- var spaces = groupSpaces.ToList();
- foreach (var serverSpace in spaces)
- {
- if (serverSpace.IsChecked)
- {
- if (IsNewSpaceFlag(serverSpace))
- {
- //新建标志的,利用原始空间坐标创建新空间
- var tempSpace = spaces.FirstOrDefault(c => !IsNewSpaceFlag(c));
- var elementId = GetElementId(tempSpace.Space);
- var useSpace = doc.GetElement(new ElementId(elementId.ToInt())) as RSpace;
- newSpaceLocations.Add(useSpace.GetLocationPoint().ToUv());
- }
- }
- else
- {
- //没选中删除
- if (!IsNewSpaceFlag(serverSpace))
- {
- deletedIds.Add(GetElementId(serverSpace.Space));
- }
- }
- }
- }
- #region revit 模型处理
- //删除
- if (deletedIds.Any())
- {
- doc.Delete(deletedIds.Select(c=>new ElementId(c.ToInt())).ToList());
- }
- //创建新的空间
- var view = doc.GetUseView();
- Phase phase = view.GetUsePhase();
- PhaseUtil.ValidateUsePhase(phase);
- foreach (var newSpaceLocation in newSpaceLocations)
- {
- var space = ExternalDataWrapper.Current.DocCreater.NewSpace(view.GenLevel, phase,newSpaceLocation);
- ExternalDataWrapper.Current.DocCreater.NewSpaceTag(space, newSpaceLocation, view);
- }
- #endregion
- }
- else
- {
- //没处理会有什么操作
- flag = false;
- }
- }
- return flag;
- }
- /// <summary>
- /// 上传模型
- /// </summary>
- /// <param name="doc"></param>
- public static void UploadModel(Document doc)
- {
- //doc.Save();
- string str = "";
- UploadModeCommand command = new UploadModeCommand();
- command.Execute(null, ref str, null);
- }
- }
- /// <summary>
- /// 空间分割信息
- /// </summary>
- public class SpaceSeparation
- {
- public SpaceSeparation(XYZ start, XYZ end)
- {
- this.Start = start;
- this.End = end;
- }
- public XYZ Start { get; private set; }
- public XYZ End { get; private set; }
- /// <summary>
- /// 关联Id
- /// </summary>
- public int Id { get; set; }
- }
- }
|