|
@@ -28,9 +28,11 @@ using SAGA.MBI.Model;
|
|
|
using SAGA.MBI.RequestData;
|
|
|
using SAGA.MBI.Tools;
|
|
|
using SAGA.MBI.WinView.ModeInfoMaintenance;
|
|
|
+using SAGA.RevitUtils;
|
|
|
using SAGA.RevitUtils.Windows;
|
|
|
using Visibility = System.Windows.Visibility;
|
|
|
using Path = System.IO.Path;
|
|
|
+using System.Threading.Tasks;
|
|
|
|
|
|
//TODO:1.目前存在的问题,如果只选两个已有的端点画线不能实现
|
|
|
//TODO:2.画图过程中,ESC可取消当前画图
|
|
@@ -98,8 +100,6 @@ namespace SAGA.MBI.WinView.Space
|
|
|
get => new ObservableCollection<TreeNodeItem>(DalModeFileManange.GetMissFileFloors(false));
|
|
|
set => items = value;
|
|
|
}
|
|
|
- //本层空间数据缓存
|
|
|
- private List<MSpace> m_spacesCache;
|
|
|
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
|
|
|
{
|
|
|
CanvasDefaultTips();
|
|
@@ -107,7 +107,7 @@ namespace SAGA.MBI.WinView.Space
|
|
|
/// <summary>
|
|
|
/// 初始化画布,并在画图上画出相关数据
|
|
|
/// </summary>
|
|
|
- private bool InitData()
|
|
|
+ private void InitData()
|
|
|
{
|
|
|
//获取边界值
|
|
|
GetBoundary();
|
|
@@ -127,7 +127,11 @@ namespace SAGA.MBI.WinView.Space
|
|
|
});
|
|
|
//画柱
|
|
|
DrawColumns();
|
|
|
- return true;
|
|
|
+ var spaces =CurrentContext.Document.GetElements<SpatialElement>().Where(s => s is Autodesk.Revit.DB.Mechanical.Space && s.Area > 0).ToList();
|
|
|
+ //创建空间轮廓,这里必须放在初始化之后创建
|
|
|
+ CreateAllSpaceSeq(spaces);
|
|
|
+ //创建右侧空间树
|
|
|
+ ShowSpacesListFrowServer(spaces);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -545,7 +549,22 @@ namespace SAGA.MBI.WinView.Space
|
|
|
{
|
|
|
return new XYZ(((point.X - 20) / m_scale + m_minX), ((point.Y - 20) / (-m_scale) + (m_maxY)), 0);
|
|
|
}
|
|
|
-
|
|
|
+ /// <summary>
|
|
|
+ /// 获取上传确认窗口
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ private Window GetUploadConfirm()
|
|
|
+ {
|
|
|
+ WinConfirm confirm = new WinConfirm()
|
|
|
+ {
|
|
|
+ ShowMessage = "空间已发生变化,是否现在就上传模型并计算空间?",
|
|
|
+ TTitle = "空间计算确认",
|
|
|
+ BtnSure = "上传模型并计算空间",
|
|
|
+ BtnCancel = "暂不计算",
|
|
|
+ Owner = this,
|
|
|
+ };
|
|
|
+ return confirm;
|
|
|
+ }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 保存所画的线
|
|
@@ -554,134 +573,11 @@ namespace SAGA.MBI.WinView.Space
|
|
|
/// <param name="e"></param>
|
|
|
private void btnSave_Click(object sender, RoutedEventArgs e)
|
|
|
{
|
|
|
- m_isAsynFinished = false;
|
|
|
- //禁用界面,防止重复提交
|
|
|
- this.IsEnabled = false;
|
|
|
- m_isDraw = null;
|
|
|
- //需要保存的分隔符数据
|
|
|
- List<PointPair> saveDatas = new List<PointPair>();
|
|
|
- //取出所有的线
|
|
|
- for (var j = 0; j < this.canvas.Children.Count; j++)
|
|
|
- {
|
|
|
- var child = this.canvas.Children[j];
|
|
|
- if (child is WPolyline line && line.Stroke == Brushes.Red)
|
|
|
- {
|
|
|
- for (int i = 0; i < line.Points.Count - 1; i++)
|
|
|
- {
|
|
|
+ SaveFloor();
|
|
|
|
|
|
- //创建新的虚拟墙
|
|
|
- var newLine = new Polyline()
|
|
|
- {
|
|
|
- Stroke = Brushes.Green,
|
|
|
- StrokeThickness = 2,
|
|
|
-
|
|
|
- };
|
|
|
- newLine.Points.Add(line.Points[i]);
|
|
|
- newLine.Points.Add(line.Points[i + 1]);
|
|
|
-
|
|
|
- //将现有坐标转化
|
|
|
- saveDatas.Add(new PointPair()
|
|
|
- {
|
|
|
- RPoint = new List<XYZ>() { WpfPointToReivt(line.Points[i]), WpfPointToReivt(line.Points[i + 1]) },
|
|
|
- ShowLine = newLine
|
|
|
- });
|
|
|
- this.canvas.Children.Add(newLine);
|
|
|
- }
|
|
|
- //删除现有的虚拟墙
|
|
|
- this.canvas.Children.Remove(line);
|
|
|
- j = -1;
|
|
|
- }
|
|
|
- }
|
|
|
- //保存数据到Revit,创建空间分隔符
|
|
|
- var doc = m_document;
|
|
|
- ExecuteCmd.ExecuteCommand(() =>
|
|
|
- {
|
|
|
- Logs.Log($"空间分隔符开始");
|
|
|
- var create = new CreateSpaceCommand();
|
|
|
- //创建空间分隔符
|
|
|
- create.CreateSpaceSeqarate(doc, saveDatas, DeletedPolylines);
|
|
|
- //删除已有的空间分隔符
|
|
|
- DeletedPolylines.Clear();
|
|
|
- Logs.Log($"空间分隔符结束");
|
|
|
- // btnSaveToRevit.IsEnabled = true;
|
|
|
- return Result.Succeeded;
|
|
|
- });
|
|
|
-
|
|
|
-
|
|
|
- //保存后重新创建空间,并加载空间分隔符与空间数据
|
|
|
-
|
|
|
- CreateSpaceAndReload(doc, () =>
|
|
|
- {
|
|
|
- WinConfirm confirm = new WinConfirm()
|
|
|
- {
|
|
|
- ShowMessage = "空间已发生变化,是否现在就上传模型并计算空间?",
|
|
|
- TTitle = "空间计算确认",
|
|
|
- BtnSure = "上传模型并计算空间",
|
|
|
- BtnCancel = "暂不计算",
|
|
|
- Owner=this,
|
|
|
- };
|
|
|
-
|
|
|
- var result = confirm.ShowDialog();
|
|
|
- //选择以后界面可用
|
|
|
- this.IsEnabled = true;
|
|
|
- if (result == true)
|
|
|
- {
|
|
|
- // 由于上传需要关闭所有模型,所以这里需要对所有数据进行清空
|
|
|
- this.canvas.Children.Clear();
|
|
|
- //添加默认提示
|
|
|
- CanvasDefaultTips();
|
|
|
- lbSpaces.ItemsSource = new ObservableCollection<MSpace>();
|
|
|
- WinModeInfoMaintenance.GetWindow().Hide();
|
|
|
- m_isCreaded = true;
|
|
|
- return false;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- return true;
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
-
|
|
|
- timer = new DispatcherTimer();
|
|
|
- timer.Tick += Timer_Elapsed;
|
|
|
- timer.Interval = TimeSpan.FromMilliseconds(1000);
|
|
|
- timer.Start();
|
|
|
}
|
|
|
|
|
|
- private bool m_isCreaded = false;//是否上传数据的标志,用于定时器
|
|
|
- private bool m_isAsynFinished = false;
|
|
|
- private void Timer_Elapsed(object sender, EventArgs e)
|
|
|
- {
|
|
|
-
|
|
|
- if (m_isAsynFinished)
|
|
|
- {
|
|
|
- //所有的操作只在这里进行保存
|
|
|
- m_document.Save();
|
|
|
- Logs.Log($"{DateTime.Now}被保存!!!!!!!!!!!!!!!!!!");
|
|
|
- if (m_isCreaded)
|
|
|
- {
|
|
|
- //放在命令里面
|
|
|
- //ExecuteCmd.ExecuteCommand(() =>
|
|
|
- //{
|
|
|
- try
|
|
|
- {
|
|
|
- string str = "";
|
|
|
- UploadModeCommand command = new UploadModeCommand();
|
|
|
- command.Execute(null, ref str, null);
|
|
|
- }
|
|
|
- catch (Exception exception)
|
|
|
- {
|
|
|
- Console.WriteLine(exception);
|
|
|
- MessageBox.Show(exception.Message);
|
|
|
- }
|
|
|
- // return Result.Succeeded;
|
|
|
- //});
|
|
|
- m_isCreaded = false;
|
|
|
- }
|
|
|
- timer.Stop();
|
|
|
- m_isAsynFinished = false;
|
|
|
- }
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
/// <summary>
|
|
|
/// 离开画布,改变鼠标样式
|
|
@@ -786,9 +682,7 @@ namespace SAGA.MBI.WinView.Space
|
|
|
|
|
|
MoveElement(val, center);
|
|
|
}
|
|
|
-
|
|
|
- private string m_curFloorId = "";//当前选择项楼层Id
|
|
|
- private Document m_document;//当前操作的模型
|
|
|
+ public FloorSpaceContext CurrentContext;
|
|
|
/// <summary>
|
|
|
/// 楼层切换
|
|
|
/// </summary>
|
|
@@ -805,12 +699,14 @@ namespace SAGA.MBI.WinView.Space
|
|
|
ShowMessage = "尚未保存空间变化,确认放弃修改?",
|
|
|
TTitle = "空间修改确认",
|
|
|
BtnSure = "保存并更改模型",
|
|
|
- BtnCancel = "放弃修改"
|
|
|
+ BtnCancel = "放弃修改",
|
|
|
+ Owner=this
|
|
|
+
|
|
|
};
|
|
|
var result = confirm.ShowDialog();
|
|
|
if (result == true)
|
|
|
{
|
|
|
- btnSave_Click(null, null);
|
|
|
+ SaveFloor();
|
|
|
return;
|
|
|
}
|
|
|
DeletedPolylines.Clear();
|
|
@@ -819,127 +715,181 @@ namespace SAGA.MBI.WinView.Space
|
|
|
|
|
|
if (tv.SelectedItem is TreeNodeItem item && item.Item is MFloor floor)
|
|
|
{
|
|
|
- try
|
|
|
+ InitFloor(floor);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void InitFloor(MFloor floor)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ //关闭空间属性窗
|
|
|
+ WinModeInfoMaintenance.GetWindow().Hide();
|
|
|
+ this.canvas.Children.Clear();
|
|
|
+ this.canvas.IsEnabled = false;
|
|
|
+ this.lbSpaces.ItemsSource = null;
|
|
|
+
|
|
|
+ #region 数据整理
|
|
|
+
|
|
|
+ FloorSpaceContext context = new FloorSpaceContext(floor);
|
|
|
+ CurrentContext = context;
|
|
|
+ var doc = context.Document;
|
|
|
+ var view = doc.GetUseView();
|
|
|
+ if (view == null)
|
|
|
{
|
|
|
- //关闭空间属性窗
|
|
|
- WinModeInfoMaintenance.GetWindow().Hide();
|
|
|
- m_curFloorId = floor.Id;
|
|
|
- this.canvas.Children.Clear();
|
|
|
+ MessageBox.Show("无法找到名称以-saga结尾的视图!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- this.canvas.IsEnabled = false;
|
|
|
+ bool result = LoadData();
|
|
|
+ if (!result)
|
|
|
+ {
|
|
|
+ MessageBox.Show("模型文件没有找到相关数据!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- this.lbSpaces.ItemsSource = null;
|
|
|
- //模型文件路径
|
|
|
- var filePath = floor.FullPath;
|
|
|
+ ExecuteCmd.ExecuteCommand(() =>
|
|
|
+ {
|
|
|
+ context.CreateSpaces();
|
|
|
|
|
|
- //检测文件是否存在
|
|
|
- if (!File.Exists(filePath))
|
|
|
+ #region 初始化界面
|
|
|
+ this.canvas.IsEnabled = true;
|
|
|
+ btnOrigin_Click(null, null);
|
|
|
+ InitData();
|
|
|
+ #endregion
|
|
|
+ return Result.Succeeded;
|
|
|
+ });
|
|
|
+
|
|
|
+ #endregion
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ MessageBox.Show(ex.Message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<PointPair> GetPoints()
|
|
|
+ {
|
|
|
+ List<PointPair> saveDatas = new List<PointPair>();
|
|
|
+ for (var j = 0; j < this.canvas.Children.Count; j++)
|
|
|
+ {
|
|
|
+ var child = this.canvas.Children[j];
|
|
|
+ if (child is WPolyline line && line.Stroke == Brushes.Red)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < line.Points.Count - 1; i++)
|
|
|
{
|
|
|
- MessageBox.Show("无法找到相关模型文件!");
|
|
|
- return;
|
|
|
- }
|
|
|
- //加载模型文件并激活
|
|
|
- // var uiDoc = ExternalDataWrapper.Current.App.OpenDocumentFile(filePath);
|
|
|
- Logs.Log("加载模型开始");
|
|
|
- var uiDoc = ExternalDataWrapper.Current.UiApp.OpenAndActivateDocument(filePath);
|
|
|
- Logs.Log("加载模型结束");
|
|
|
|
|
|
- var doc = uiDoc.Document;
|
|
|
- m_document = doc;
|
|
|
+ //创建新的虚拟墙
|
|
|
+ var newLine = new Polyline()
|
|
|
+ {
|
|
|
+ Stroke = Brushes.Green,
|
|
|
+ StrokeThickness = 2,
|
|
|
|
|
|
+ };
|
|
|
+ newLine.Points.Add(line.Points[i]);
|
|
|
+ newLine.Points.Add(line.Points[i + 1]);
|
|
|
|
|
|
- var view = doc.GetElements<ViewPlan>().FirstOrDefault(t => t.GenLevel?.Name != null && t.Name?.IndexOf("-saga") > -1 && t.ViewType == ViewType.FloorPlan);
|
|
|
- if (view == null)
|
|
|
- {
|
|
|
- MessageBox.Show("无法找到名称以-saga结尾的视图!");
|
|
|
- return;
|
|
|
- }
|
|
|
- bool result = LoadData();
|
|
|
- if (!result)
|
|
|
- {
|
|
|
- MessageBox.Show("模型文件没有找到相关数据!");
|
|
|
- return;
|
|
|
+ //将现有坐标转化
|
|
|
+ saveDatas.Add(new PointPair()
|
|
|
+ {
|
|
|
+ RPoint = new List<XYZ>() { WpfPointToReivt(line.Points[i]), WpfPointToReivt(line.Points[i + 1]) },
|
|
|
+ ShowLine = newLine
|
|
|
+ });
|
|
|
+ this.canvas.Children.Add(newLine);
|
|
|
}
|
|
|
- this.canvas.IsEnabled = true;
|
|
|
-
|
|
|
- //重置画布
|
|
|
- btnOrigin_Click(null, null);
|
|
|
- //缓存所有空间数据
|
|
|
- m_spacesCache = SpaceConvert.GetFloorSpaceInfos(m_curFloorId).OfType<MSpace>().ToList();
|
|
|
- //创建空间
|
|
|
- //检测日志,是否有墙,虚拟墙,柱子数据的改变
|
|
|
- CreateSpaceAndReload(doc, InitData);
|
|
|
- }
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
- MessageBox.Show(ex.Message);
|
|
|
+ //删除现有的虚拟墙
|
|
|
+ this.canvas.Children.Remove(line);
|
|
|
+ j = -1;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ return saveDatas;
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 创建空间并重新加载到列表
|
|
|
- /// </summary>
|
|
|
- /// <param name="doc"></param>
|
|
|
- /// <param name="callback">异步回调函数</param>
|
|
|
- private void CreateSpaceAndReload(Document doc, Func<bool> callback)
|
|
|
+ private void SaveFloor()
|
|
|
{
|
|
|
- ExecuteCmd.ExecuteCommand(() =>
|
|
|
+ //禁用界面,防止重复提交
|
|
|
+ this.IsEnabled = false;
|
|
|
+ m_isDraw = null;
|
|
|
+ //需要保存的分隔符数据
|
|
|
+ List<PointPair> saveDatas = GetPoints();
|
|
|
+ bool flagExecuteSuccess = true;//本应在回调函数里传值,目前代码不支持
|
|
|
+ ExecuteCmd.ExecuteCommandOnce(() =>
|
|
|
{
|
|
|
- Logs.Log($"创建空间开始");
|
|
|
- //生成空间
|
|
|
- CreateSpaceCommand cmd = new CreateSpaceCommand();
|
|
|
+ #region 创建空间
|
|
|
+ CurrentContext.UpdateSpaceSeqaration(saveDatas
|
|
|
+ .Select(points => new SpaceSeparation(points.RPoint[0], points.RPoint[1])).ToList(),
|
|
|
+ DeletedPolylines);
|
|
|
+ DeletedPolylines.Clear();
|
|
|
+ var createSuccess=CurrentContext.CreateSpaces();
|
|
|
+ if (!createSuccess)
|
|
|
+ {
|
|
|
+ flagExecuteSuccess = false;
|
|
|
+ MessageShow.Infomation("保存楼层空间失败");
|
|
|
+ return Result.Succeeded;
|
|
|
+ }
|
|
|
|
|
|
- cmd.CreateSpace(doc);
|
|
|
- // doc.Regenerate();
|
|
|
- Logs.Log($"创建空间结束");
|
|
|
- return Result.Succeeded;
|
|
|
- });
|
|
|
+ #endregion
|
|
|
|
|
|
- //因为异步执行,获取空间不能直接放到下面
|
|
|
+ #region 初始化界面
|
|
|
+ this.canvas.IsEnabled = true;
|
|
|
+ btnOrigin_Click(null, null);
|
|
|
+ InitData();
|
|
|
|
|
|
- //删除冲突的空间
|
|
|
- ExecuteCmd.ExecuteCommand(() =>
|
|
|
- {
|
|
|
- Logs.Log($"删除空间开始");
|
|
|
- // DeleteFailuresPreprocessorData(doc);
|
|
|
- DeleteFailuresPreprocessorDataByManual(doc);
|
|
|
- //保存数据
|
|
|
- // doc.Save();
|
|
|
-
|
|
|
- bool? isReload = callback?.Invoke();
|
|
|
- if (isReload == true)
|
|
|
- {
|
|
|
- try
|
|
|
- {
|
|
|
- //加载空间
|
|
|
- var spaces = doc.GetElements<SpatialElement>().Where(s => s is Autodesk.Revit.DB.Mechanical.Space && s.Area > 0).ToList();
|
|
|
+ #endregion
|
|
|
|
|
|
- //创建空间轮廓,这里必须放在初始化之后创建
|
|
|
- CreateAllSpaceSeq(spaces);
|
|
|
- //创建右侧空间树
|
|
|
- ShowSpacesListFrowServer(spaces);
|
|
|
- }
|
|
|
- catch (Exception e)
|
|
|
- {
|
|
|
- MessageBox.Show(e.Message);
|
|
|
- }
|
|
|
+ #region 上传模型选择
|
|
|
+ Window confirm = GetUploadConfirm();
|
|
|
+ var result = confirm.ShowDialog();
|
|
|
+ //选择以后界面可用
|
|
|
+ this.IsEnabled = true;
|
|
|
+ if (result == true)
|
|
|
+ {
|
|
|
+ // 由于上传需要关闭所有模型,所以这里需要对所有数据进行清空
|
|
|
+ this.canvas.Children.Clear();
|
|
|
+ //添加默认提示
|
|
|
+ CanvasDefaultTips();
|
|
|
+ lbSpaces.ItemsSource = new ObservableCollection<MSpace>();
|
|
|
+ WinModeInfoMaintenance.GetWindow().Hide();
|
|
|
|
|
|
+ #region 错误尝试
|
|
|
+ //上传中的一些操作,不能发生在idling中
|
|
|
+
|
|
|
+ // Action<FloorSpaceContext> action = new Action<FloorSpaceContext>((context) =>
|
|
|
+ // {
|
|
|
+ // try
|
|
|
+ // {
|
|
|
+ // CurrentContext.Document.Save();
|
|
|
+ // SpaceManager.UploadModel(context.Document);
|
|
|
+ // }
|
|
|
+ // catch (Exception ex)
|
|
|
+ // {
|
|
|
+ // MessageShow.Show(ex);
|
|
|
+ // }
|
|
|
+ // });
|
|
|
+ // action.BeginInvoke(CurrentContext, null, null);
|
|
|
+ #endregion
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+ return Result.Succeeded;
|
|
|
+ }, () =>
|
|
|
+ {
|
|
|
+ if (!flagExecuteSuccess)
|
|
|
+ {
|
|
|
+ return Result.Succeeded;
|
|
|
}
|
|
|
- m_isAsynFinished = true;
|
|
|
- //btnSaveToRevit.IsEnabled = true;
|
|
|
try
|
|
|
{
|
|
|
- Logs.Log($"删除空间结束");
|
|
|
- doc.Save();
|
|
|
- DocumentChangedLog.RemoveInvalidLogs();
|
|
|
+ var document = CurrentContext.Document;
|
|
|
+ document.Save();
|
|
|
+
|
|
|
+ SpaceManager.UploadModel(document);
|
|
|
}
|
|
|
- catch (Exception e)
|
|
|
+ catch (Exception ex)
|
|
|
{
|
|
|
- MessageBox.Show(e.Message);
|
|
|
+ MessageShow.Show(ex);
|
|
|
}
|
|
|
-
|
|
|
- return Result.Succeeded;
|
|
|
+ return Result.Succeeded;
|
|
|
});
|
|
|
}
|
|
|
|
|
@@ -968,9 +918,7 @@ namespace SAGA.MBI.WinView.Space
|
|
|
/// <param name="spaces"></param>
|
|
|
private void ShowSpacesListFrowServer(List<SpatialElement> spaces)
|
|
|
{
|
|
|
- // var infosjobj = ConvertElementsToJArray(spaces);
|
|
|
- //var datas = CommonConvert.QueryObjectInfoByIds(m_curFloorId, infosjobj).OfType<MSpace>().ToList();
|
|
|
- var datas = GetSpaceFromCacheByIds(spaces.Select(t => t.Id).ToList());
|
|
|
+ var datas = CurrentContext.GetPhysicalSpaces(spaces.Select(t => t.Id.IntegerValue.ToString()).ToList());
|
|
|
|
|
|
var localSpace = spaces.Where(t => !datas.Any(s => s.BimID.Split(':')[1] == t.Id.ToString()))
|
|
|
.Select(t => new MSpace("", $"{Guid.NewGuid()}:{t.Id.ToString()}") { Name = t.Name });
|
|
@@ -981,148 +929,16 @@ namespace SAGA.MBI.WinView.Space
|
|
|
}
|
|
|
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 手动删除冲突的空间
|
|
|
- /// </summary>
|
|
|
- /// <param name="doc"></param>
|
|
|
- private void DeleteFailuresPreprocessorDataByManual(Document doc)
|
|
|
- {
|
|
|
- bool isReCreate = false;
|
|
|
- using (Transaction trans = new Transaction(doc, "删除多余的空间"))
|
|
|
- {
|
|
|
- trans.Start();
|
|
|
- try
|
|
|
- {
|
|
|
- //处理异常显示
|
|
|
- FailureHandlingOptions fho = trans.GetFailureHandlingOptions();
|
|
|
- fho.SetFailuresPreprocessor(new FailuresPreprocessor(false));
|
|
|
- trans.SetFailureHandlingOptions(fho);
|
|
|
-
|
|
|
- List<ServerSpace> serverSpaces = new List<ServerSpace>();
|
|
|
- Regex regex = new Regex("^\\d+$");
|
|
|
-
|
|
|
- var index = 1;
|
|
|
- //对冲突的空间进行删除
|
|
|
- foreach (List<ElementId> elementIds in StaticData.FailuresPreprocessorData)
|
|
|
- {
|
|
|
- Logs.Log(string.Join("-", elementIds));
|
|
|
- //取出空间的服务器信息
|
|
|
-
|
|
|
- var spacesServerInfo = GetSpaceFromCacheByIds(elementIds);
|
|
|
- //如果返回值小于等于1,自动处理
|
|
|
- //如果返回值大于1,则在界面处理
|
|
|
- if (spacesServerInfo == null || spacesServerInfo.Count == 0)
|
|
|
- {
|
|
|
-
|
|
|
-
|
|
|
- var firstElement = doc.GetElement(elementIds.FirstOrDefault());
|
|
|
-
|
|
|
- //对所有冲突的空间编号进行比较,保留较小编号的空间
|
|
|
- if (firstElement is Autodesk.Revit.DB.Mechanical.Space first)
|
|
|
- {
|
|
|
- foreach (var id in elementIds)
|
|
|
- {
|
|
|
- if (first.Id.IsEqual(id))
|
|
|
- continue;
|
|
|
- var curr = doc.GetElement(id) as Autodesk.Revit.DB.Mechanical.Space;
|
|
|
- Logs.Log("=============");
|
|
|
- Logs.Log($"当前空间Id:{id},Num:{curr.Number}");
|
|
|
- //如果编号非数字,删其中一个
|
|
|
- if (!regex.IsMatch(first.Number))
|
|
|
- {
|
|
|
- doc.Delete(new List<ElementId>() { first.Id });
|
|
|
-
|
|
|
- first = curr;
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (!regex.IsMatch(curr.Number))
|
|
|
- {
|
|
|
- doc.Delete(new List<ElementId>() { id });
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (int.Parse(first.Number) > int.Parse(curr.Number))
|
|
|
- {
|
|
|
- Logs.Log($"1.被删除的空间Id:{id},Num:{first.Number}");
|
|
|
- doc.Delete(new List<ElementId>() { first.Id });
|
|
|
-
|
|
|
- first = curr;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- Logs.Log($"2.被删除的空间Id:{id},Num:{curr.Number}");
|
|
|
- doc.Delete(new List<ElementId>() { id });
|
|
|
-
|
|
|
- }
|
|
|
- Logs.Log("=============");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if (spacesServerInfo.Count == 1)
|
|
|
- {
|
|
|
- var serverSpaceId = spacesServerInfo[0].BimID.Split(':')[1];
|
|
|
- doc.Delete(elementIds.Where(t => t.ToString() != serverSpaceId).ToList());
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- doc.Delete(elementIds.Where(t => !spacesServerInfo.Exists(sp => sp.BimID.Split(':')[1] == t.ToString())).ToList());
|
|
|
- var groupName = $"待合并元空间组{index}";
|
|
|
- foreach (var mRevitEquipBase in spacesServerInfo)
|
|
|
- {
|
|
|
- if (mRevitEquipBase is MSpace space)
|
|
|
- {
|
|
|
- serverSpaces.Add(new ServerSpace()
|
|
|
- {
|
|
|
- Space = space,
|
|
|
- GroupName = groupName
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
- serverSpaces.Add(new ServerSpace()
|
|
|
- {
|
|
|
- Name = "不保留已有空间,创建新空间",
|
|
|
- GroupName = groupName
|
|
|
- });
|
|
|
- index++;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- if (serverSpaces.Count > 0)
|
|
|
- {
|
|
|
- var winDeal = new WinSelectSpace(serverSpaces);
|
|
|
- var result = winDeal.ShowDialog();
|
|
|
- if (result == true)
|
|
|
- {
|
|
|
- var ids = winDeal.DeleteElementIds.Select(t => new ElementId(int.Parse(t))).ToList();
|
|
|
- doc.Delete(ids);
|
|
|
- isReCreate = winDeal.IsReCreate;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //提交事务
|
|
|
- trans.Commit();
|
|
|
- }
|
|
|
- catch (Exception e)
|
|
|
- {
|
|
|
- //回滚事务
|
|
|
- trans.RollBack();
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- StaticData.FailuresPreprocessorData.Clear();
|
|
|
- if (isReCreate) CreateSpaceAndReload(doc, null);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 加载模型数据
|
|
|
/// </summary>
|
|
|
private bool LoadData()
|
|
|
{
|
|
|
- var doc = m_document;
|
|
|
+ var doc = CurrentContext.Document;
|
|
|
//读取墙数据
|
|
|
List<Wall> walls = doc.FilterElements<Wall>().ToList();
|
|
|
if (walls.Count == 0) return false;
|
|
|
- // List<List<XYZ>> wallData = GroupWallByParallel(walls);//太慢改为直接获取墙线
|
|
|
|
|
|
//获取虚拟墙(空间分隔符或者房间分隔符)
|
|
|
var wallData = walls.Select(t => t.GetCurve().Tessellate().ToList()).ToList();
|
|
@@ -1137,7 +953,6 @@ namespace SAGA.MBI.WinView.Space
|
|
|
var ml = line as ModelLine;
|
|
|
|
|
|
var mlLine = ml.Location.GetLine();
|
|
|
- //return new SgLine(mlLine.StartPoint().ToW2DPoint(), mlLine.EndPoint().ToW2DPoint()); //return new SgLine(mlLine.StartPoint().ToW2DPoint(), mlLine.EndPoint().ToW2DPoint());
|
|
|
return
|
|
|
new PointPair(ml.Id.IntegerValue, new List<System.Windows.Point>()
|
|
|
{
|
|
@@ -1226,17 +1041,6 @@ namespace SAGA.MBI.WinView.Space
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 从缓存获取空间信息
|
|
|
- /// </summary>
|
|
|
- /// <param name="ids"></param>
|
|
|
- /// <returns></returns>
|
|
|
- private List<MSpace> GetSpaceFromCacheByIds(List<ElementId> ids)
|
|
|
- {
|
|
|
- if (m_spacesCache != null)
|
|
|
- return m_spacesCache.Where(s => ids.Exists(id => id.ToString() == s.BimID.Split(':')[1])).ToList();
|
|
|
- return new List<MSpace>();
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
/// 创建空间边缘轮廓
|
|
|
/// </summary>
|
|
|
/// <param name="space"></param>
|
|
@@ -1327,8 +1131,6 @@ namespace SAGA.MBI.WinView.Space
|
|
|
private DispatcherTimer timer;
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
private void CanvasDefaultTips()
|
|
|
{
|
|
|
string tips = "请选择一个需要进行空间管理的楼层";
|