123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395 |
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using Autodesk.Revit.DB;
- using Autodesk.Revit.UI;
- using Newtonsoft.Json.Linq;
- using SAGA.DotNetUtils;
- using SAGA.MBI.DataArrange;
- using SAGA.MBI.Model;
- using SAGA.MBI.RevitExport;
- using SAGA.MBI.WinView.ModeInfoMaintenance;
- using SAGA.RevitUtils;
- using SAGA.RevitUtils.Extends;
- using SAGA.RevitUtils.Windows;
- using Visibility = System.Windows.Visibility;
- namespace SAGA.MBI.WinView.Space
- {
- /// <summary>
- /// WinCreateSpaceWeb.xaml 的交互逻辑
- /// </summary>
- public partial class WinCreateSpaceWeb : WinBase
- {
- public WinCreateSpaceWeb()
- {
- InitializeComponent();
- ucShowElement.RegisterJsObject("wpfEvent", this);
- this.Loaded += WinCreateSpaceWeb_Loaded;
- }
- private void WinCreateSpaceWeb_Loaded(object sender, RoutedEventArgs e)
- {
- InitData();
- ucShowElement.Show(" http://192.168.20.86:8091/#/demo");
- }
- private void InitData()
- {
- tv.ItemsSource = new ObservableCollection<TreeNodeItem>(DalModeFileManange.GetMissFileFloors(false));
- }
- #region 条目切换事件
-
- private void Tv_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
- {
- try
- {
- #region 核心代码
- //检测是否有未保存的数据,数据分两部分:新建的空间分隔符,删除的空间分隔符
- //删除空间分割的id和新建空间分割的线
- var editData = GetEditData();
- List<int> deletedIds = editData.DeletedIds;
- var newDatas = editData.NewDatas;
- #region 切换前节点处理
- if (deletedIds.Count > 0 || newDatas.Any())
- {
- WinConfirm confirm = CreateSaveConfirm();
- var result = confirm.ShowDialog();
- if (result == true)
- {
- SaveFloor(editData);
- // return;
- }
- }
- #endregion
- //异步造成执行顺序混乱的情况,所以使用idling排队
- ExecuteCmd.ExecuteCommandOnce(() =>
- {
- if (tv.SelectedItem is TreeNodeItem item && item.Item is MFloor floor)
- {
- InitFloor(floor);
- }
- return Result.Succeeded;
- }, () => { return Result.Succeeded; });
- #endregion
- }
- catch (Exception ex)
- {
- MessageShow.Show(ex);
- }
- }
- /// <summary>
- /// 切换空间,亮显空间
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void lbSpaces_SelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- try
- {
- if (lbSpaces.SelectedItems.Count == 0) return;
- var space = lbSpaces.SelectedItems[0] as MISpace;
- var bimId = space.BimID.Split(':')[1];
- //发送js填充命令
- var strJs = $"getData('{bimId.ToString()}')";
- ucShowElement.ExecuteJsFun(strJs);
- #region 显示属性窗格
- var doc = CurrentContext.Document;
- if (doc == null)
- return;
- var revitSpace = doc.GetElement(new ElementId(bimId.ToInt()));
- if (revitSpace == null)
- return;
- MRevitEquipBase equipment = DalCommon.GetEquipmentQueryId(revitSpace);
- if (equipment != null)
- {
- var win = WinModeInfoMaintenanceForSpace.GetWindow();
- win.Topmost = true;
- win.Show(equipment);
- win.Visibility = Visibility.Visible;
- }
- #endregion
- }
- catch (Exception ex)
- {
- MessageShow.Show(ex);
- }
- }
- #endregion
- #region 确认窗口初始化
- /// <summary>
- /// 创建保存确认提示框
- /// </summary>
- /// <returns></returns>
- private WinConfirm CreateSaveConfirm()
- {
- WinConfirm confirm = new WinConfirm()
- {
- ShowMessage = "尚未保存空间变化,确认放弃修改?",
- TTitle = "空间修改确认",
- BtnSure = "保存并更改模型",
- BtnCancel = "放弃修改",
- Owner = this
- };
- return confirm;
- }
- /// <summary>
- /// 获取上传确认窗口
- /// </summary>
- /// <returns></returns>
- private Window CreateUploadConfirm()
- {
- WinConfirm confirm = new WinConfirm()
- {
- ShowMessage = "空间已发生变化,是否现在就上传模型并计算空间?",
- TTitle = "空间计算确认",
- BtnSure = "上传模型并计算空间",
- BtnCancel = "暂不计算",
- Owner = this,
- };
- return confirm;
- }
- #endregion
- #region 界面信息相关处理
- /// <summary>
- /// 清理窗口显示的楼层相关数据
- /// </summary>
- private void ClearFloorData()
- {
- WinModeInfoMaintenance.GetWindow().Hide();
- this.lbSpaces.ItemsSource = new ObservableCollection<MISpace>(); ;
- }
- /// <summary>
- /// 设置窗口楼层相关数据
- /// </summary>
- public void SetFloorData(Document document)
- {
- var spaces = CurrentContext.Document.GetElements<SpatialElement>().Where(s => s is Autodesk.Revit.DB.Mechanical.Space && s.Area > 0).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 MISpace("", $"{Guid.NewGuid()}:{t.Id.ToString()}") { Name = t.Name});
- datas.AddRange(localSpace);
- lbSpaces.ItemsSource = new ObservableCollection<MISpace>(datas);
- }
- #endregion
- #region 空间管理相关逻辑
- public FloorSpaceContext CurrentContext;
- public void InitFloor(MFloor floor)
- {
- try
- {
- ClearFloorData();
- #region 数据整理
- FloorSpaceContext context = new FloorSpaceContext(floor);
- CurrentContext = context;
- var doc = context.Document;
- var view = doc.GetUseView();
- if (view == null)
- {
- MessageBox.Show("无法找到名称以-saga结尾的视图!");
- return;
- }
- ExecuteCmd.ExecuteCommand(() =>
- {
- context.CreateSpaces();
- #region 初始化界面
- SetCanvasShow();
- #endregion
- SetFloorData(doc);
- return Result.Succeeded;
- });
- #endregion
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
- private void SaveFloor(EditData editData)
- {
- //禁用界面,防止重复提交
- this.IsEnabled = false;
- var deletedIds = editData.DeletedIds;
- List<PointPair> saveDatas = editData.NewDatas;
- bool flagExecuteSuccess = true;//本应在回调函数里传值,目前代码不支持
- ExecuteCmd.ExecuteCommandOnce(() =>
- {
- #region 创建空间
- var seqs = saveDatas.Select(points => new SpaceSeparation(points.RPoint[0], points.RPoint[1])).ToList();
- using (TransactionGroup group = new TransactionGroup(CurrentContext.Document, "保存空间修改"))
- {
- group.Start();
- CurrentContext.UpdateSpaceSeqaration(seqs, deletedIds);
- var createSuccess = CurrentContext.CreateSpaces();
- if (!createSuccess)
- {
- flagExecuteSuccess = false;
- group.RollBack();
- MessageShow.Infomation("保存楼层空间失败");
- return Result.Succeeded;
- }
- group.Assimilate();
- }
-
- #endregion
- #region 初始化界面
- SetCanvasShow();
- #endregion
- #region 上传模型选择
- Window confirm = CreateUploadConfirm();
- var result = confirm.ShowDialog();
- //选择以后界面可用
- this.IsEnabled = true;
- if (result == true)
- {
- //添加默认提示
- SetEmptyTip();
- ClearFloorData();
- }
- else
- {
- flagExecuteSuccess = false;
- }
- #endregion
- return Result.Succeeded;
- }, () =>
- {
- try
- {
- var document = CurrentContext.Document;
- document.Save();
- if (!flagExecuteSuccess)
- {
- return Result.Succeeded;
- }
- SpaceManager.UploadModel(document);
- }
- catch (Exception ex)
- {
- MessageShow.Show(ex);
- }
- return Result.Succeeded;
- });
- }
- #endregion
- #region 界面交互
- public EditData GetEditData()
- {
- EditData data = new EditData();
- return data;
- }
- public void SetEmptyTip()
- {
- //清空空间,提示相关信息
- string tips = "请选择一个需要进行空间管理的楼层";
- }
- public void SetCanvasShow()
- {
- var jobject = GetModelDrawing();
-
- }
- #endregion
- #region js调用命令
- public void Save()
- {
- var editData = GetEditData();
- SaveFloor(editData);
- ExecuteCmd.ExecuteCommandOnce(() =>
- {
- if (tv.SelectedItem is TreeNodeItem item && item.Item is MFloor floor)
- {
- InitFloor(floor);
- }
- return Result.Succeeded;
- }, () => { return Result.Succeeded; });
- MessageBox.Show("Save");
- }
- #endregion
- /// <summary>
- /// 获取模型绘图数据
- /// </summary>
- /// <returns></returns>
- private JObject GetModelDrawing()
- {
- //柱子,墙,虚拟墙,空间
- Document linkDoc = CurrentContext.Document;
- MbiElementManager manager = new MbiElementManager();
- var exportDb = manager.ExportMbiEelemntDB(ExportDataBuilder.CreateExportData(linkDoc));
- return exportDb.ToJsonObject();
- }
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- //var strJs = Js.Text;
- StringBuilder builder = new StringBuilder();
- for (int i = 0; i < 1024 * 1024 * 10; i++)
- {
- builder.Append("a");
- }
- var strJs = $"getData('{builder.ToString()}')";
- ucShowElement.ExecuteJsFun(strJs);
- }
-
- public void SaveStr(string path)
- {
- MessageBox.Show(path??"没有数据");
- }
- public void SaveObj(object obj)
- {
- if (obj != null)
- {
- MessageBox.Show(obj.ToString());
- }
-
- }
- private void Button_Click_1(object sender, RoutedEventArgs e)
- {
- ucShowElement.Show(" http://192.168.20.86:8091/#/demo");
- }
- }
- public class EditData
- {
- public EditData()
- {
- DeletedIds = new List<int>();
- NewDatas = new List<PointPair>();
- }
- public List<int> DeletedIds { get; set; }
- public List<PointPair> NewDatas { get; set; }
- }
- }
|