using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Prism.Commands; using Prism.Events; using Prism.Ioc; using SWS.CAD.Event; using SWS.CAD.Views; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Windows; using System.Windows.Forms; using System.Windows.Input; using System.Windows.Interop; using System.Windows.Markup; using System.Windows.Media; using Teigha.GraphicsSystem; using Telerik.Windows.Controls; using Unity; using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; using MessageBox = System.Windows.MessageBox; using Application = Bricscad.ApplicationServices.Application; using SWS.CAD.CADFunc; using Teigha.DatabaseServices; using Bricscad.EditorInput; using SWS.CAD.Views.CustomControl; using DryIoc; using Path = System.IO.Path; using ImageSource = System.Windows.Media.ImageSource; using Prism.Services.Dialogs; using SWS.Commons; using SWS.Model; using SWS.Service; using SWS.WPF.Views; namespace SWS.CAD.ViewModels { public class LeftPanelViewModel : ViewModelBase { #region 图纸列表的右键功能 public ICommand ExcuteCommand { get; set; } /// /// 创建图纸 /// public ICommand Command_CreateDwg { get; set; } /// /// 打开图纸 /// public ICommand Command_OpenDwg { get; set; } /// /// 删除图纸 /// public ICommand Command_DeleteDwg { get; set; } /// /// 图纸属性 /// public ICommand Command_EditPropertyDwg { get; set; } /// /// 检入 /// public ICommand Command_CheckInDwg { get; set; } /// /// 检出 /// public ICommand Command_CheckOutDwg { get; set; } /// /// 释放 /// public ICommand Command_FreeDwg { get; set; } /// /// 浏览所在文件夹 /// public ICommand Command_OpenDwgFileFolder { get; set; } /// /// 上移 /// public ICommand Command_UpDwg { get; set; } /// /// 下移 /// public ICommand Command_DownDwg { get; set; } /// /// 生成文件材料表 /// public ICommand Command_GenerateFileMaterial { get; set; } /// /// 修订 /// public ICommand Command_ReviseDwg { get; set; } /// /// 发布 /// public ICommand Command_PublishDwg { get; set; } /// /// 检入记录 /// public ICommand Command_CheckInRecordDwg { get; set; } /// /// 检入审核 /// public ICommand Command_CheckInAuditDwg { get; set; } /// /// 发布记录 /// public ICommand Command_PublishRecordDwg { get; set; } /// /// 操作记录 /// public ICommand Command_OperateRecordDwg { get; set; } /// /// 改变选中的设计浏览节点 /// public ICommand Common_SelectedDesign { get; set; } /// /// 双击设计浏览节点 /// public ICommand Common_DoubleClickDesign { get; set; } /// /// 只读打开图纸 /// public ICommand Command_ReadOnlyOpenDwg { get; set; } /// /// 刷新历史版次 /// public ICommand Command_RefreshHistoryDwg { get; set; } /// /// 图元双击事件 /// public ICommand Command_TagDoubleClick { get; set; } /// /// 图元关联元件 /// public ICommand Command_Guanlian { get; set; } private void onExecuteCommand(Model.TreeModel obj) { if (obj != null) { if (obj.NodeType == "0") { //目前后台逻辑,此时0为文件夹 } else if (obj.NodeType == "1") { } } } #endregion #region 目录列表的右键功能 /// /// 目录属性 /// public ICommand Command_EditDrawingCatalogue { get; set; } #endregion #region binding private bool _LoginOK; public bool LoginOK { get { return _LoginOK; } set { _LoginOK = value; RaisePropertyChanged(nameof(LoginOK)); } } public ICommand window_loaded { get; } private string _curProjName; public string curProjName { get { return _curProjName; } set { _curProjName = value; RaisePropertyChanged(nameof(curProjName)); } } private ObservableCollection drawings; /// /// 图纸目录树 /// public ObservableCollection Drawings { get { return this.drawings; } set { if (value != this.drawings) { this.drawings = value; RaisePropertyChanged(nameof(drawings)); } } } private ObservableCollection _historyDrawings; /// /// 历史版次图纸树 /// public ObservableCollection historyDrawings { get { return this._historyDrawings; } set { if (value != this._historyDrawings) { this._historyDrawings = value; RaisePropertyChanged(nameof(historyDrawings)); } } } private ObservableCollection _objectTypeTree; /// /// 放置元件列表 /// public ObservableCollection objectTypeTree { get { return _objectTypeTree; } set { _objectTypeTree = value; RaisePropertyChanged(nameof(objectTypeTree)); } } private Model.TreeModel _selectType; /// /// 选中的元件树节点 /// public Model.TreeModel selectType { get { return _selectType; } set { if (_selectType != value) { eventAggregator.GetEvent().Publish(value); GetLibrary(value.ID); } if (value == null) { isEnabledGuanlian = false; } else if (value.ChildNodes.Any()) { isEnabledGuanlian = false; } else { isEnabledGuanlian = true; } _selectType = value; RaisePropertyChanged(nameof(selectType)); } } private ObservableCollection _designTree; /// /// 设计浏览列表 /// public ObservableCollection designTree { get { return _designTree; } set { _designTree = value; RaisePropertyChanged(nameof(designTree)); } } private Model.TreeModel _selectDesign; /// /// 选中的设计浏览树节点 /// public Model.TreeModel selectDesign { get { return _selectDesign; } set { _selectDesign = value; RaisePropertyChanged(nameof(selectDesign)); } } private Model.TreeModel _selectedNode; public Model.TreeModel selectedNode { get { return _selectedNode; } set { if (value != null && value.Text.ToLower().EndsWith(".dwg")) { var dwgObj = JsonConvert.DeserializeObject(value.NodeExtData.ToString()); eventAggregator.GetEvent().Publish(dwgObj); } _selectedNode = value; RaisePropertyChanged(nameof(selectedNode)); } } private ObservableCollection _listLibrary; /// /// 图元列表 /// public ObservableCollection listLibrary { get { return _listLibrary; } set { _listLibrary = value; RaisePropertyChanged(nameof(listLibrary)); } } private ec_library_file _selectedTag = new ec_library_file(); public ec_library_file selectedTag { get { return _selectedTag; } set { _selectedTag = value; RaisePropertyChanged(nameof(selectedTag)); } } private bool _isEnabledGuanlian = false; /// /// 图元关联元件 功能是否启用 /// public bool isEnabledGuanlian { get { return _isEnabledGuanlian; } set { _isEnabledGuanlian = value; if (value) { guanlianImage = guanlian1Image; } RaisePropertyChanged(nameof(isEnabledGuanlian)); } } private ImageSource _guanlianImage; /// /// 元件关联图元 /// public ImageSource guanlianImage { get { return _guanlianImage; } set { _guanlianImage = value; RaisePropertyChanged(nameof(guanlianImage)); } } private ImageSource _guanlian1Image; /// /// 元件关联图元 /// public ImageSource guanlian1Image { get { return _guanlian1Image; } set { _guanlian1Image = value; RaisePropertyChanged(nameof(guanlian1Image)); } } private ImageSource _guanlian2Image; /// /// 元件关联图元 Enable为false时灰色 /// public ImageSource guanlian2Image { get { return _guanlian2Image; } set { _guanlian2Image = value; RaisePropertyChanged(nameof(guanlian2Image)); } } #endregion ObjectTypeService objectTypeService { get; set; } ObservableCollection originDrawings = new ObservableCollection(); ProjectService _projectService; DrawingServce _dwgService; ConfigService _configService; AnnexesService _annexesService; NotificationService _notificationService; EnginedataService _enginedataService; DataItemService _dataItemService; IEventAggregator eventAggregator; private readonly IDialogService _dialogService; private bool isCheckIn = false;//是否正在进行检入 关联云线 private bool isIOassociationChannel = false;//是否正在进行位号关联通道 private bool isObjectTypeGuanlian = false;//是否正在进行元件关联图元 关联云线 public LeftPanelViewModel( DrawingServce httpService, ProjectService projectServ, ConfigService configService, IEventAggregator eventAggregator) { LoginOK = false; _dialogService = GlobalObject._prismContainer.Resolve(); _annexesService = GlobalObject.container.Resolve(); _notificationService = GlobalObject.container.Resolve(); _enginedataService = GlobalObject.container.Resolve(); _dataItemService = GlobalObject.container.Resolve(); _dwgService = httpService; _configService = configService; _projectService = projectServ; this.eventAggregator = eventAggregator; ExcuteCommand = new DelegateCommand(onExecuteCommand); Command_CreateDwg = new DelegateCommand(onCreateDwg); Command_OpenDwg = new DelegateCommand(onOpenDwg); Command_DeleteDwg = new DelegateCommand(onDeleteDwg); Command_EditPropertyDwg = new DelegateCommand(onPropertyDwg); Command_OpenDwgFileFolder = new DelegateCommand(onOpenDwgFileFolder); Command_CheckInDwg = new DelegateCommand(onCheckInDwg); Command_CheckOutDwg = new DelegateCommand(onCheckOutDwg); Command_FreeDwg = new DelegateCommand(onFreeDwg); Command_UpDwg = new DelegateCommand(onUpDwg); Command_DownDwg = new DelegateCommand(onDownDwg); Command_GenerateFileMaterial = new DelegateCommand(onGenerateFileMaterialDwg); Command_ReviseDwg = new DelegateCommand(onReviseDwg); Command_PublishDwg = new DelegateCommand(onPublishDwg); Command_CheckInRecordDwg = new DelegateCommand(onCheckInRecordDwg); Command_CheckInAuditDwg = new DelegateCommand(onCheckInAuditDwg); Command_PublishRecordDwg = new DelegateCommand(onPublishRecordDwg); Command_OperateRecordDwg = new DelegateCommand(onOperateRecordDwg); Common_SelectedDesign = new DelegateCommand(onDesignSelectedChange); Common_DoubleClickDesign = new DelegateCommand(onDesignDoubleClick); Command_ReadOnlyOpenDwg = new DelegateCommand(onReadOnlyOpenDwg); Command_RefreshHistoryDwg = new DelegateCommand(onRefreshHistoryDwg); Command_TagDoubleClick = new DelegateCommand(onTagDoubleClick); Command_Guanlian = new DelegateCommand(onGuanlian); Command_EditDrawingCatalogue = new DelegateCommand(onEditDrawingCatalogue); window_loaded = new Telerik.Windows.Controls.DelegateCommand(onWindow_loaded); eventAggregator.GetEvent().Subscribe(onEnterProjOK, ThreadOption.UIThread, true); eventAggregator.GetEvent().Subscribe(CheckInDwg, ThreadOption.UIThread, true); eventAggregator.GetEvent().Subscribe(ChangeIORelation, ThreadOption.UIThread, true); objectTypeService = GlobalObject.container.Resolve(); listLibrary = new ObservableCollection(); designTree = new ObservableCollection(); objectTypeTree = new ObservableCollection(); guanlian1Image = GlobalObject.ImageSourceFromEmbeddedResourceStream(@"SWS.CAD.Images.guanlian.png"); guanlian2Image = GlobalObject.ImageSourceFromEmbeddedResourceStream(@"SWS.CAD.Images.guanlian2.png"); guanlianImage = guanlian2Image; } #region 树节点名称加入状态 自己检出、别人检出、未检出 /// /// 图纸树节点 加入状态:自己检出、别人检出、未检出 /// /// /// private ObservableCollection CheckInOutStatus(ObservableCollection trees) { foreach (Model.TreeModel node in trees) { foreach (var item in node.ChildNodes) { ec_drawing_file dwgObj = JsonConvert.DeserializeObject(item.NodeExtData.ToString()); UpdateNode(item, dwgObj); } } return trees; } /// /// 修改节点UI信息 /// /// /// private void UpdateNode(Model.TreeModel item, ec_drawing_file dwgObj) { if (dwgObj.IsCheckOut == 0) { item.CheckInOutStatus = 0; item.Glyph = "";//修改节点图标为 未检出 item.ToolTipText = "未检出"; item.FontColor = new SolidColorBrush(Colors.Yellow); //图纸名称字体颜色:黄色 } else if (dwgObj.IsCheckOut == 1 && dwgObj.CheckOutUserID == GlobalObject.userInfo.userId) { item.CheckInOutStatus = 1; item.Glyph = "";//修改节点图标为 自己检出 item.ToolTipText = "自己检出"; item.FontColor = new SolidColorBrush(Colors.LightBlue);//图纸名称字体颜色:浅蓝 } else if (dwgObj.IsCheckOut == 1 && dwgObj.CheckOutUserID != GlobalObject.userInfo.userId) { item.CheckInOutStatus = 2; item.Glyph = "";//修改节点图标为 别人检出 var userName = GlobalObject.GetUserNameById(dwgObj.CheckOutUserID); userName = string.IsNullOrEmpty(userName) ? dwgObj.CheckOutUserID : userName; item.ToolTipText = "别人检出:" + userName; item.FontColor = new SolidColorBrush(Colors.LightPink);//图纸名称字体颜色:浅分红 } item.OrderNo = dwgObj.OrderID; item.NodeExtData = JsonConvert.SerializeObject(dwgObj); } #endregion #region 选中项目 /// /// 选中项目 /// /// async void onEnterProjOK(JToken obj) { //图纸目录树 var data = obj.First(x => (string)x["Name"] == "图纸树(按目录)")["data"]; if (Drawings != null) { Drawings.Clear(); } originDrawings = JsonConvert.DeserializeObject>(data.ToString()); Drawings = new ObservableCollection(originDrawings); Drawings = CheckInOutStatus(Drawings); curProjName = "当前项目:" + GlobalObject.curProject.ProjectName; LoginOK = true; //放置元件列表树 data = obj.First(x => (string)x["Name"] == "对象类型树")["data"]; GlobalObject.objectTypeTree = JsonConvert.DeserializeObject>(data.ToString()); GlobalObject.objectTypeTree = SetTreeGlyph(GlobalObject.objectTypeTree); #region 设计元件 最近使用 Model.TreeModel recentNode = new Model.TreeModel() { ID = "0", NodeType = "000", Text = "最近使用" }; var strRecentObjectType = _configService.Read("Project" + GlobalObject.curProject.ProjectId, nameof(ConfigIni.RecentObjectType)); if (!string.IsNullOrEmpty(strRecentObjectType)) { var listObjectTypeId = strRecentObjectType.Split(','); foreach (var id in listObjectTypeId) { //获取节点 Model.TreeModel node = Helper.TreeHelper.GetTreeModel(GlobalObject.objectTypeTree, id); if (node != null) { var node1 = (Model.TreeModel)node.Clone(); recentNode.ChildNodes.Add(node1); } } } GlobalObject.objectTypeTree.Insert(0, recentNode); #endregion objectTypeTree = new ObservableCollection(GlobalObject.objectTypeTree); //设计浏览树 data = obj.First(x => (string)x["Name"] == "对象类型树")["data"]; GlobalObject.designTree = JsonConvert.DeserializeObject>(data.ToString()); designTree = new ObservableCollection(GlobalObject.designTree); //加载项目下的所有计量单位 var listUnit = await _dataItemService.GetMeasuringUnitList(); GlobalObject.Units = listUnit; InitHistoryDrawings(); #region 获取所有图纸名称 GlobalObject.AllDwgName.Clear(); foreach (var dwg in Drawings) { Helper.TreeHelper.GetTreeText(dwg); } #endregion #region 选择项目后,如果自己有接收的消息,就弹出消息界面 data = obj.First(x => (string)x["Name"] == "通知")["data"]; var infos = JsonConvert.DeserializeObject>(data.ToString()); //var infos = await _notificationService.GetUserAllNotification(0); infos = infos.Where(x => x.RetrieveUserID.ToUpper() != x.SenderUserID.ToUpper()).ToList(); if (infos.Any()) { var View = GlobalObject.container.Resolve(); eventAggregator.GetEvent().Publish(infos); Application.ShowModalWindow(Application.MainWindow.Handle, View); } #endregion } /// /// 设置元件树末级节点的图标 /// /// 完整的节点 /// private List SetTreeGlyph(List nodes) { foreach (var node in nodes) { if (node.ChildNodes.Count > 0) { node.ChildNodes = new ObservableCollection(SetTreeGlyph(node.ChildNodes.ToList())); //node.FontColor = new SolidColorBrush(Colors.Yellow); //图纸名称字体颜色:黄色 } else { node.Glyph = ""; node.FontColor = new SolidColorBrush(Colors.DeepSkyBlue); //图纸名称字体颜色:蓝色 } } return nodes; } #endregion public void onWindow_loaded(object para) { } #region tab切换 public void TabChanged(int tabIndex) { switch (tabIndex) { case 0: break; case 1: break; default: break; } } #endregion #region 查找树节点 public ICommand TextChangedCmd => new Telerik.Windows.Controls.DelegateCommand(TextBox_TextChanged); /// /// 显示状态按钮 /// /// public virtual async void TextBox_TextChanged(object parameter) { var textValue = parameter.ToString(); } /// /// 查找树节点 /// /// 查找内容 public async void SearchTree(string tag, string searchText) { if (Drawings != null) { if (tag.Equals("工程文件")) { // 递归筛选树形结构中的节点 //var filteredItems = FilterTree(originDrawings, searchText); //Drawings.Clear(); //foreach (var item in filteredItems) //{ // Drawings.Add(item); //} if (string.IsNullOrEmpty(searchText)) { Drawings.Clear(); Drawings = new ObservableCollection(GlobalObject.objectTypeTree); return; } //调用接口筛选树形结构的节点 var resObjectTypeData = await objectTypeService.GetObjectTypeData("0", searchText); Drawings.Clear(); if (resObjectTypeData != null) { Drawings = new ObservableCollection(resObjectTypeData); } } if (tag.Equals("设计浏览")) { if (string.IsNullOrEmpty(searchText)) { designTree.Clear(); designTree = new ObservableCollection(GlobalObject.designTree); return; } var resObjectTypeData = await objectTypeService.GetObjectTypeData("0", searchText); designTree.Clear(); if (resObjectTypeData != null) { designTree = new ObservableCollection(resObjectTypeData); } } } } /// /// 过滤查询图纸树节点 /// /// 完整的节点 /// 带搜索的 /// private ObservableCollection FilterTree(ObservableCollection nodes, string searchText) { ObservableCollection result = new ObservableCollection(); foreach (var node in nodes) { // 先检查节点本身是否匹配 var filteredChildren = FilterTree(node.ChildNodes, searchText); // 如果节点匹配,或者它有匹配的子节点,添加当前节点到结果 if (node.Text.ToUpper().Contains(searchText.ToUpper()) || filteredChildren.Any()) { var dto = (Model.TreeModel)node.Clone(); dto.ChildNodes = filteredChildren; result.Add(dto); //result.Add(new Model.TreeModel //{ // Text = node.Text, // ChildNodes = filteredChildren //}); } } return result; } #endregion #region 检出用户是否有操作节点权限 /// /// 检出用户是否有操作节点权限 /// /// /// private bool IsCanEdit(Model.TreeModel node) { //超级管理员都有权限 if (GlobalObject.userInfo.userId.ToLower().Equals("system")) { return true; } //取图纸数据 ec_drawing_file dwgFile = JsonConvert.DeserializeObject(node.NodeExtData.ToString()); if (dwgFile.AllUsersCanEdit.Contains(GlobalObject.userInfo.RealName)) { return true; } else { return false; } } #endregion #region 刷新图纸树 /// /// 刷新图纸树 /// private async void RefreshDrawings() { if (Drawings != null) { Drawings.Clear(); } if (originDrawings != null) { originDrawings.Clear(); } originDrawings = await _dwgService.GetDrawingCatalogue(); Drawings = new ObservableCollection(originDrawings); Drawings = CheckInOutStatus(Drawings); } #endregion #region 创建图纸 /// /// 创建图纸 /// /// private void onCreateDwg(Model.TreeModel model) { IDialogParameters par = new Prism.Services.Dialogs.DialogParameters(); par.Add(nameof(ec_drawing_file.DrawingCatalogueID), model); _dialogService.ShowDialog(nameof(NewDrawing), par, (result) => { if (result.Result == ButtonResult.OK || result.Result == ButtonResult.Yes) { //新建了图纸,所以需要UI刷新 RefreshDrawings(); } }); } #endregion #region 打开图纸 /// /// 打开图纸 /// /// 图纸 private async void onOpenDwg(Model.TreeModel model) { string filePath = Path.Combine(GlobalObject.GetDwgFileFolder(), model.Text); var msg = string.Empty; var dwgObj = JsonConvert.DeserializeObject(model.NodeExtData.ToString()); if (dwgObj.IsPublish == 1) { MessageBox.Show("当前状态为:已发布,只能以只读模式打开图纸!"); //下载图纸文件,只读打开 DownDwgByOpenReadOnly(model); return; } if (model.CheckInOutStatus == 0)//状态为检入 { if (MessageBoxResult.Yes == MessageBox.Show("当前图纸状态为:未检出,是否检出打开图纸?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question)) { //检出图纸 await CheckOut(model); } else { //下载图纸文件,只读打开 DownDwgByOpenReadOnly(model); } } else if (model.CheckInOutStatus == 1)//状态为自己检出 { //自己检出,打开图纸编辑 OpenDwgByMyself(model); } else if (model.CheckInOutStatus == 2)//状态为别人检出 { //下载图纸文件,只读打开 DownDwgByOpenReadOnly(model); } } /// /// 自己检出,打开图纸编辑 /// private async void OpenDwgByMyself(Model.TreeModel model) { string filePath = Path.Combine(GlobalObject.GetDwgFileFolder(), model.Text); var dwgObj = JsonConvert.DeserializeObject(model.NodeExtData.ToString()); string msg = string.Empty; if (!string.IsNullOrEmpty(dwgObj.PCInfo) && !GlobalObject.GetPCInfo().Equals(dwgObj.PCInfo))//对比PCInfo { if (MessageBoxResult.Yes != MessageBox.Show("服务器记录的检出电脑用户信息与当前电脑用户信息不一致,是否继续打开图纸?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question)) { return; } } if (!File.Exists(filePath)) { if (MessageBoxResult.Yes == MessageBox.Show("本地图纸文件不存在,是否需要手动找回图纸?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question)) { // 文件选择框 OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = "选择图纸文件"; // 设置过滤器,限制用户只能选择特定类型的文件 openFileDialog.Filter = "图纸文件|*.dwg;"; // 设置是否允许选择多个文件 openFileDialog.Multiselect = false; if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { // 获取用户选择的文件路径 string selectedFilePath = openFileDialog.FileName; File.Copy(selectedFilePath, filePath); } } else { //服务器下载图纸 var dwgfileDto = await _annexesService.GetAnnexesFile(dwgObj.FolderId); msg = await _annexesService.DownloadFile(filePath, dwgfileDto.F_Id); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("图纸文件下载失败,信息:" + msg); return; } } } msg = CADFunc.General.OpenDwg(filePath);//打开编辑图纸 if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"本地图纸文件:{model.Text} 打开失败,信息:{msg}"); return; } InitDrawingSelectedAdd(dwgObj); } /// /// 下载图纸文件,只读打开 /// private async void DownDwgByOpenReadOnly(Model.TreeModel model) { #region 下载文件,只读打开 string filePath = Path.Combine(GlobalObject.GetDwgFileFolder(), model.Text); var msg = string.Empty; var dwgObj = JsonConvert.DeserializeObject(model.NodeExtData.ToString()); if (File.Exists(filePath)) { if (FileHelper.IsFileLocked(filePath)) { MessageBox.Show($"本地图纸文件:{filePath} 已被打开!"); return; } //已有本地图纸文件移至备份文件夹 string now = DateTime.Now.ToString("yyyyMMddHHmmss");//加上当前时间,防止重名 string backFile = Path.Combine(GlobalObject.GetBackupDwgFileFolder(), now + model.Text); File.Move(filePath, backFile); MessageBox.Show($"本地图纸文件已移至:{backFile} !"); } // 下载图纸文件再打开 var dwgfileDto = await _annexesService.GetAnnexesFile(dwgObj.FolderId); msg = await _annexesService.DownloadFile(filePath, dwgfileDto.F_Id); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("图纸文件下载失败,信息:" + msg); return; } msg = CADFunc.General.OpenDwg(filePath, true);//以只读模式打开图纸 if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"本地图纸文件:{model.Text} 打开失败,信息:{msg}"); return; } InitDrawingSelectedAdd(dwgObj, true); #endregion } #endregion #region 删除图纸 /// /// 删除图纸 /// /// 图纸 private void onDeleteDwg(Model.TreeModel model) { if (!IsCanEdit(model)) { MessageBox.Show("当前用户没有权限操作图纸!"); return; } MessageBox.Show("功能开发中..."); } #endregion #region 编辑属性 /// /// 编辑属性 /// /// 图纸 private async void onPropertyDwg(Model.TreeModel model) { //取旧的图纸数据 var oldDwgFile = await _dwgService.GetDrawingFile(model.ID); IDialogParameters par = new Prism.Services.Dialogs.DialogParameters(); par.Add(nameof(ec_drawing_file.DrawingCatalogueID), model); _dialogService.ShowDialog(nameof(NewDrawing), par, async (result) => { if (result.Result == ButtonResult.OK || result.Result == ButtonResult.Yes) { var newDwgFile = await _dwgService.GetDrawingFile(model.ID); //旧的图纸数据和新的图纸数据对比图纸名称、图纸目录是否一致 if (oldDwgFile.DrawingFileName != newDwgFile.DrawingFileName || oldDwgFile.DrawingCatalogueID != newDwgFile.DrawingCatalogueID) { //数据不一致,所以需要UI刷新 RefreshDrawings(); } } }); } #endregion #region 浏览所在文件夹 /// /// 浏览所在文件夹 /// /// 图纸 private void onOpenDwgFileFolder(Model.TreeModel model) { try { System.Diagnostics.Process.Start(GlobalObject.GetDwgFileFolder()); } catch (Exception ex) { MessageBox.Show($"打开文件夹异常,信息:{ex.Message}"); } } #endregion #region 检入 /// /// 检入 /// /// 图纸 private async void onCheckInDwg(Model.TreeModel model) { if (!IsCanEdit(model)) { MessageBox.Show("当前用户没有权限操作图纸!"); return; } string msg = string.Empty; string filePath = Path.Combine(GlobalObject.GetDwgFileFolder(), model.Text); #region 校验 if (!File.Exists(filePath)) { MessageBox.Show("本地图纸文件不存在,无法检入!"); return; } //if (FileHelper.IsFileLocked(filePath)) //{ // MessageBox.Show("图纸文件已被打开,无法进行上传检入,请关闭文件!"); // return; //} var dwgObj = await _dwgService.GetDrawingFile(model.ID); if (dwgObj == null) { MessageBox.Show("服务器不存在当前图纸,检入失败!"); return; } else if (dwgObj.IsCheckOut == 0) { MessageBox.Show("当前图纸状态为:检入,无法再进行检入!"); return; } #endregion //获取所有打开图纸名 var listName = General.GetAllOpenDrawingNames(); if (listName.Contains(filePath)) { //把要检入的图纸切换到当前图纸 General.SwitchToDocument(filePath); //重新已只读模式打开图纸,有未保存的会自动保存 General.SetDrawingReadOnly(filePath, true); var item = GlobalObject.ListDwgOpened.FirstOrDefault(a => a.Path == filePath); if (item != null) { GlobalObject.ListDwgOpened.Remove(item); } InitDrawingSelectedAdd(dwgObj, true); } else { //以只读模式打开图纸 msg = CADFunc.General.OpenDwg(filePath, true); InitDrawingSelectedAdd(dwgObj, true); } //获取当前图纸所有句柄 var listHandles = General.GetHandles(); if (!listHandles.Any()) { //ec_drawing_syn syn = new ec_drawing_syn(); //syn.FolderId = dwgObj.FolderId; //syn.DrawingFileID = dwgObj.DrawingFileID; //CheckInModel checkin=new CheckInModel(); //checkin.handles = listHandles; //checkin.dwgObj = dwgObj; //checkin.syn = syn; //CheckInDwg(checkin); //dwgObj.CheckOutUserID = ""; //dwgObj.CheckOutUserName = ""; //dwgObj.IsCheckOut = 0; //UpdateNode(model, dwgObj); //General.SetDrawingReadOnly(filePath, false); //InitDrawingSelectedAdd(dwgObj); //return; } string lines = string.Empty; if (MessageBoxResult.Yes == MessageBox.Show("是否关联云线?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question)) { isCheckIn = true; General.SelectHandles.Clear(); var listLine = General.StartLineSelection(); if (listLine.Any()) { lines = string.Join("|", listLine); } } ec_drawing_file dwgFile = JsonConvert.DeserializeObject(model.NodeExtData.ToString()); IDialogParameters par = new Prism.Services.Dialogs.DialogParameters(); par.Add(GlobalObject.dialogPar.info.ToString(), dwgFile); par.Add(GlobalObject.dialogPar.para1.ToString(), listHandles); par.Add(GlobalObject.dialogPar.para2.ToString(), lines); _dialogService.ShowDialog(nameof(DialogPreCheckIn), par, (result) => { if (result.Result == ButtonResult.OK || result.Result == ButtonResult.Yes) { dwgObj.CheckOutUserID = ""; dwgObj.CheckOutUserName = ""; dwgObj.IsCheckOut = 0; UpdateNode(model, dwgObj); //重新改变当前图纸为可编辑模式 } General.SetDrawingReadOnly(filePath, false); InitDrawingSelectedAdd(dwgObj); }); isCheckIn = false; return; ////预检入校验 //msg = await _dwgService.PreCheckInDrawingFile(dwgObj); //if (!string.IsNullOrEmpty(msg)) //{ // MessageBox.Show($"预检入失败,信息:{msg}"); // return; //} ////上传文件,获取文件新FolderId //var newFolderId = await _annexesService.UploadFile(filePath, dwgObj.DrawingFileName); //dwgObj.FolderId = newFolderId; //dwgObj.FileMD5 = FileHelper.GetFileMD5(filePath); ////检入第一步 //msg = await _dwgService.CheckInDrawingFileStep1(dwgObj); //if (!string.IsNullOrEmpty(msg)) //{ // MessageBox.Show($"检入失败,信息:{msg}"); // return; //} ////检入第二步 //msg = await _dwgService.CheckInDrawingFileStep2(dwgObj); //if (!string.IsNullOrEmpty(msg)) //{ // MessageBox.Show($"检入失败,信息:{msg}"); // return; //} //MessageBox.Show("检入成功!"); //dwgObj = await _dwgService.GetDrawingFile(model.ID); //UpdateNode(model, dwgObj); } private async void CheckInDwg(CheckInModel model) { ec_drawing_file dwgObj = model.dwgObj; List handles = model.handles; ec_drawing_syn syn = model.syn; string filePath = Path.Combine(GlobalObject.GetDwgFileFolder(), dwgObj.DrawingFileName); //预检入校验 var msg = await _dwgService.PreCheckInDrawingFile(dwgObj, handles); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"预检入失败,信息:{msg}"); return; } //上传文件,获取文件新FolderId var newFolderId = await _annexesService.UploadFile(filePath, dwgObj.DrawingFileName); dwgObj.FolderId = newFolderId; dwgObj.FileMD5 = FileHelper.GetFileMD5(filePath); //检入第一步 msg = await _dwgService.CheckInDrawingFileStep1(dwgObj, handles); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"检入失败,信息:{msg}"); return; } //检入第二步 msg = await _dwgService.CheckInDrawingFileStep2(dwgObj, syn); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"检入失败,信息:{msg}"); return; } MessageBox.Show("检入成功!"); eventAggregator.GetEvent().Publish(true); //dwgObj = await _dwgService.GetDrawingFile(dwgObj.DrawingFileID); //UpdateNode(model, dwgObj);d } #endregion #region 检出 /// /// 检出 /// /// 图纸 private async void onCheckOutDwg(Model.TreeModel model) { if (!IsCanEdit(model)) { MessageBox.Show("当前用户没有权限操作图纸!"); return; } var flag = await CheckOut(model);//检出操作 //if (!flag) //{ return; } //if (MessageBoxResult.Yes == MessageBox.Show("检出成功,是否打开图纸文件?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question)) //{ // //打开图纸文件 // string filePath = Path.Combine(GlobalObject.GetDwgFileFolder(), model.Text); // var msg = CADFunc.General.OpenDwg(filePath); // if (!string.IsNullOrEmpty(msg)) // { // MessageBox.Show($"本地图纸文件:{model.Text} 打开失败,信息:{msg}"); // return; // } //}; } /// /// 检出 /// /// 图纸节点 /// private async Task CheckOut(Model.TreeModel model) { string filePath = Path.Combine(GlobalObject.GetDwgFileFolder(), model.Text); if (File.Exists(filePath)) { if (FileHelper.IsFileLocked(filePath)) { MessageBox.Show($"本地图纸文件:{model.Text} 已存在并被打开,请关闭文件再检出"); return false; } string backFolder = GlobalObject.GetBackupDwgFileFolder(); if (MessageBoxResult.OK == MessageBox.Show($"本地图纸文件:{model.Text} 已存在,继续检出会把本地图纸移至:[{backFolder}]", "是否继续检出", MessageBoxButton.OKCancel, MessageBoxImage.Question)) { //本地图纸文件移至备份文件夹 string now = DateTime.Now.ToString("yyyyMMddHHmmss");//加上当前时间,防止重名 string backFile = Path.Combine(GlobalObject.GetBackupDwgFileFolder(), now + model.Text); File.Move(filePath, backFile); } else { return false; } } ec_drawing_file dwgObj = JsonConvert.DeserializeObject(model.NodeExtData.ToString()); //下载文件 var dwgfileDto = await _annexesService.GetAnnexesFile(dwgObj.FolderId); var msg = await _annexesService.DownloadFile(filePath, dwgfileDto.F_Id); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("图纸文件下载失败,信息:" + msg); return false; } //检出接口提交修改信息 msg = await _dwgService.CheckOutDrawingFile(dwgObj.DrawingFileID); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"检出失败,信息:{msg}"); return false; } //打开图纸文件 filePath = Path.Combine(GlobalObject.GetDwgFileFolder(), model.Text); msg = CADFunc.General.OpenDwg(filePath); //更新图纸节点图标和字体颜色 dwgObj.CheckOutUserID = GlobalObject.userInfo.userId; dwgObj.CheckOutUserName = GlobalObject.userInfo.RealName; dwgObj.CheckOutTime = DateTime.Now; dwgObj.IsCheckOut = 1; UpdateNode(model, dwgObj); //设置图纸选中元素回调 InitDrawingSelectedAdd(dwgObj); return true; } #endregion #region 释放 /// /// 释放 /// /// 图纸 private async void onFreeDwg(Model.TreeModel model) { if (!IsCanEdit(model)) { MessageBox.Show("当前用户没有权限操作图纸!"); return; } if (MessageBoxResult.Yes != MessageBox.Show($"确定忽略本地文件修改,释放文件的占用状态?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question)) { return; } var msg = await _dwgService.FreeDrawingFile(model.ID); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("释放失败,信息:" + msg); return; } string filePath = Path.Combine(GlobalObject.GetDwgFileFolder(), model.Text); if (!FileHelper.IsFileLocked(filePath)) { File.Delete(filePath); }//删除本地图纸文件 MessageBox.Show("释放成功!"); var dwgObj = await _dwgService.GetDrawingFile(model.ID); UpdateNode(model, dwgObj); } #endregion #region 上移\下移 /// /// 上移 /// /// 图纸 private async void onUpDwg(Model.TreeModel node) { //MessageBox.Show("功能开发中..."); //return; var preNode = GetPreviousNode(node); if (preNode == null) { MessageBox.Show("当前图纸为第一个,不能上移"); return; } var preDwgFile = await _dwgService.GetDrawingFile(preNode.ID); preDwgFile.OrderID++; var msg = await _dwgService.UpdateDrawingFile(preDwgFile); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("修改前一个图纸数据失败,信息:" + msg); return; } var dwgFile = await _dwgService.GetDrawingFile(node.ID); dwgFile.OrderID--; msg = await _dwgService.UpdateDrawingFile(dwgFile); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("修改一个图纸数据失败,信息:" + msg); return; } MoveItem(drawings, node, -1);//图纸树UI刷新,当前节点上移一个位置 MessageBox.Show("上移成功"); } /// /// 下移 /// /// 图纸 private async void onDownDwg(Model.TreeModel node) { //MessageBox.Show("功能开发中..."); //return; var nextNode = GetNextNode(node); if (nextNode == null) { MessageBox.Show("当前图纸为最后一个,不能下移"); return; } var preDwgFile = await _dwgService.GetDrawingFile(nextNode.ID); preDwgFile.OrderID--; var msg = await _dwgService.UpdateDrawingFile(preDwgFile); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("修改前一个图纸数据失败,信息:" + msg); return; } var dwgFile = await _dwgService.GetDrawingFile(node.ID); dwgFile.OrderID++; msg = await _dwgService.UpdateDrawingFile(dwgFile); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("修改一个图纸数据失败,信息:" + msg); return; } MoveItem(drawings, node, 1);//图纸树UI刷新,当前节点下移一个位置 MessageBox.Show("下移成功"); } /// /// 获取当前节点的前一个节点 /// /// private Model.TreeModel GetPreviousNode(Model.TreeModel node) { if (string.IsNullOrEmpty(node.parentId)) return null; //根节点无上级节点 var dwgFile = drawings.FirstOrDefault(a => a.ID == node.parentId); if (dwgFile == null) { return null; } var listNodes = dwgFile.ChildNodes; int index = listNodes.IndexOf(node); return index > 0 ? listNodes[index - 1] : null; } /// /// 获取当前节点的后一个节点 /// /// public Model.TreeModel GetNextNode(Model.TreeModel node) { if (string.IsNullOrEmpty(node.parentId)) return null; //根节点无上级节点 var dwgFile = drawings.FirstOrDefault(a => a.ID == node.parentId); if (dwgFile == null) { return null; } var listNodes = dwgFile.ChildNodes; int index = listNodes.IndexOf(node); var listOrderId = listNodes.Select(a => a.OrderNo).ToList(); var maxIndex = listOrderId.Max(); return index < maxIndex - 1 ? listNodes[index + 1] : null; } /// /// 移动元素位置 /// /// 目标集合 /// 要移动的元素 /// 移动步数(正数后移,负数前移) public void MoveItem(ObservableCollection list, Model.TreeModel item, int step) { Model.TreeModel parentNode = list.FirstOrDefault(a => a.ID == item.parentId); if (parentNode == null) return; var listNodes = parentNode.ChildNodes; if (listNodes == null || !listNodes.Contains(item)) return; int oldIndex = listNodes.IndexOf(item); int newIndex = oldIndex + step; // 边界检查 if (newIndex < 0) newIndex = 0; if (newIndex >= listNodes.Count) newIndex = listNodes.Count - 1; listNodes.Move(oldIndex, newIndex); //return list; } #endregion #region 生成文件材料表 /// /// 生成文件材料表 /// /// 图纸 private void onGenerateFileMaterialDwg(Model.TreeModel model) { MessageBox.Show("功能开发中..."); } #endregion #region 修订 /// /// 修订 /// /// 图纸 private void onReviseDwg(Model.TreeModel model) { if (!IsCanEdit(model)) { MessageBox.Show("当前用户没有权限操作图纸!"); return; } ec_drawing_file dwgObj = JsonConvert.DeserializeObject(model.NodeExtData.ToString()); IDialogParameters x = new Prism.Services.Dialogs.DialogParameters(); x.Add(GlobalObject.dialogPar.title.ToString(), $"[{dwgObj.DrawingFileName}] 文件版本号输入"); x.Add(GlobalObject.dialogPar.info.ToString(), "文件版本号:"); var _dialogService = GlobalObject._prismContainer.Resolve(); _dialogService.ShowDialog(nameof(DialogInput), x, async (RES) => { if (RES.Result == ButtonResult.Yes) { var version = RES.Parameters.GetValue(GlobalObject.dialogPar.info.ToString()); var msg = await _dwgService.ModifyDrawingFile(model.ID, version); if (string.IsNullOrEmpty(msg)) { MessageBox.Show("修订成功!"); //获取最新图纸信息 dwgObj = await _dwgService.GetDrawingFile(model.ID); //更新图纸节点图标和字体颜色 UpdateNode(model, dwgObj); } else { MessageBox.Show("修订失败:" + msg); } } else if (RES.Result == ButtonResult.No) { } }); } #endregion #region 发布 /// /// 发布 /// /// 图纸 private void onPublishDwg(Model.TreeModel model) { if (!IsCanEdit(model)) { MessageBox.Show("当前用户没有权限操作图纸!"); return; } ec_drawing_file dwgObj = JsonConvert.DeserializeObject(model.NodeExtData.ToString()); IDialogParameters x = new Prism.Services.Dialogs.DialogParameters(); x.Add(GlobalObject.dialogPar.title.ToString(), $"[{dwgObj.DrawingFileName}] 文件发布"); x.Add(GlobalObject.dialogPar.info.ToString(), "注释:"); var _dialogService = GlobalObject._prismContainer.Resolve(); _dialogService.ShowDialog(nameof(DialogInput), x, async (RES) => { if (RES.Result == ButtonResult.Yes) { var remark = RES.Parameters.GetValue(GlobalObject.dialogPar.info.ToString()); var msg = await _dwgService.PublishDrawingFile(model.ID, remark); if (string.IsNullOrEmpty(msg)) { MessageBox.Show("发布成功!"); //获取最新图纸信息 dwgObj = await _dwgService.GetDrawingFile(model.ID); //更新图纸节点图标和字体颜色 UpdateNode(model, dwgObj); //更新图纸历史树 InitHistoryDrawings(); } else { MessageBox.Show("发布失败:" + msg); } } else if (RES.Result == ButtonResult.No) { } }); } #endregion #region 检入记录 /// /// 检入记录 /// /// 图纸 private void onCheckInRecordDwg(Model.TreeModel model) { var dwg = JsonConvert.DeserializeObject(model.NodeExtData.ToString()); IDialogParameters x = new Prism.Services.Dialogs.DialogParameters(); x.Add(GlobalObject.dialogPar.info.ToString(), dwg); var _dialogService = GlobalObject._prismContainer.Resolve(); _dialogService.ShowDialog(nameof(DialogCheckInRecord), x, (RES) => { }); } #endregion #region 检入审核 /// /// 检入审核 /// /// 图纸 private void onCheckInAuditDwg(Model.TreeModel model) { var view = GlobalObject.container.Resolve(); if (GlobalObject.userInfo != null) { Application.ShowModalWindow(Application.MainWindow.Handle, view); } } #endregion #region 发布记录 /// /// 发布记录 /// /// 图纸 private void onPublishRecordDwg(Model.TreeModel model) { var dwg = JsonConvert.DeserializeObject(model.NodeExtData.ToString()); IDialogParameters x = new Prism.Services.Dialogs.DialogParameters(); x.Add(GlobalObject.dialogPar.info.ToString(), dwg); var _dialogService = GlobalObject._prismContainer.Resolve(); _dialogService.ShowDialog(nameof(DialogPublishRecord), x, (RES) => { }); } #endregion #region 操作记录 /// /// 操作记录 /// /// 图纸 private void onOperateRecordDwg(Model.TreeModel model) { var dwg = JsonConvert.DeserializeObject(model.NodeExtData.ToString()); IDialogParameters x = new Prism.Services.Dialogs.DialogParameters(); x.Add(GlobalObject.dialogPar.info.ToString(), dwg); var _dialogService = GlobalObject._prismContainer.Resolve(); _dialogService.ShowDialog(nameof(DialogOperateRecord), x, (RES) => { }); } #endregion #region 获取并显示图元列表 private ObservableCollection ListTagNumber = new ObservableCollection(); /// /// 获取并显示图元列表 /// /// private async void GetLibrary(string id) { try { if (id == "000") { return; } #region 获取图元列表,并显示出来 var list = await objectTypeService.GetLibraryDataById(id); var flag = false; var msg = string.Empty; listLibrary?.Clear(); foreach (var item in list) { //下载文件 var dwgfileDto = await _annexesService.GetAnnexesFile(item.FolderId); var filePath = Path.Combine(GlobalObject.GetDwgFileFolder(), item.LibraryFileName + ".dwg"); if (File.Exists(filePath)) { File.Delete(filePath); } msg = await _annexesService.DownloadFile(filePath, dwgfileDto.F_Id); if (!string.IsNullOrEmpty(msg)) { flag = true; continue; } var img = General.GetDwgThumbnail(filePath); if (img != null) { var imgPath = Path.Combine(GlobalObject.GetDwgFileFolder(), item.LibraryFileName + ".png"); if (File.Exists(imgPath)) { File.Delete(imgPath); } img.Save(imgPath); item.ImagePath = imgPath; } } if (flag) { MessageBox.Show($"图元文件下载失败,信息:" + msg); } listLibrary = new ObservableCollection(list); #endregion #region 获取位号列表 ListTagNumber.Clear(); var listTag = await objectTypeService.GetTagNumberById(id); if (listTag != null) { foreach (var item in listTag) { if (string.IsNullOrEmpty(item.TagNumber)) { continue; } if (ListTagNumber.FirstOrDefault(a => a.Key == item.TagNumber) != null) { continue; } ListTagNumber.Add(new Model.KeyValueModel() { Key = item.TagNumber, Value = item.EngineDataID }); } } #endregion } catch (Exception ex) { MessageBox.Show($"图元列表异常:" + ex.Message); } } #endregion #region 选中的设计浏览树节点 /// /// 选中的设计浏览树节点 /// /// 图纸 private async void onDesignSelectedChange(TreeModel reeModel) { selectDesign = await InitDesignChildren(reeModel); //OnPropertyChanged(nameof(selectDesign)); } /// /// 获取对象类型下的所有现有位号清单(仅有位号) /// /// /// private async Task InitDesignChildren(TreeModel TreeModel) { if (TreeModel == null) { return null; } if (TreeModel.ChildNodes.Count <= 0) { if (TreeModel.NodeType == "91") { var pixel = JsonConvert.DeserializeObject(TreeModel.NodeExtData.ToString()); var dwgObj = await _dwgService.GetDrawingFile(pixel.DrawingFileID); //获取属性 eventAggregator.GetEvent().Publish(dwgObj); return TreeModel; } else if (TreeModel.NodeType == "9") { //获取位号的pixel对象 var list = await _enginedataService.GetTagPixelsById(TreeModel.ID); if (list.Any()) { ObservableCollection listTree = new ObservableCollection(); foreach (var item in list) { var node = new Model.TreeModel(); node.ID = item.DrawingFileID; node.Text = item.DrawingFileName; node.ToolTipText = item.DrawingFileName; node.NodeType = "91"; //node.Glyph = ""; node.FontColor = new SolidColorBrush(Colors.DeepSkyBlue); //图纸名称字体颜色:蓝色 node.ChildNodes = new ObservableCollection(); var dwgFile = await _dwgService.GetDrawingFile(item.DrawingFileID); UpdateNode(node, dwgFile); node.NodeExtData = JsonConvert.SerializeObject(item); listTree.Add(node); } TreeModel.ChildNodes = new ObservableCollection(listTree); TreeModel.isexpand = true; } //获取属性 eventAggregator.GetEvent().Publish(TreeModel); } else { var list = await objectTypeService.GetTagNumberById_Brief(TreeModel.ID); if (list.Any()) { foreach (var item in list) { item.NodeType = "9"; item.Glyph = ""; item.FontColor = new SolidColorBrush(Colors.DeepSkyBlue); //图纸名称字体颜色:蓝色 item.ChildNodes = new ObservableCollection(); } TreeModel.ChildNodes = new ObservableCollection(list); TreeModel.isexpand = true; } //获取属性 eventAggregator.GetEvent().Publish(TreeModel); } } else { //获取属性 eventAggregator.GetEvent().Publish(TreeModel); } return TreeModel; } #endregion #region 双击设计浏览树的图纸节点 /// /// 双击设计浏览树的图纸节点 /// /// private async void onDesignDoubleClick(Model.TreeModel model) { if (model == null) return; if (model.NodeType != "91") return; string filePath = Path.Combine(GlobalObject.GetDwgFileFolder(), model.Text); var pixel = JsonConvert.DeserializeObject(model.NodeExtData.ToString()); var dwgObj = await _dwgService.GetDrawingFile(pixel.DrawingFileID); //获取属性 eventAggregator.GetEvent().Publish(dwgObj); string msg = string.Empty; if (model.CheckInOutStatus == 1) { #region 自己检出则下载图纸并打开编辑 if (!GlobalObject.GetPCInfo().Equals(dwgObj.PCInfo)) { MessageBox.Show($"当前图纸被:【{dwgObj.PCInfo}】检出,请注意同时编辑可能丢失数据!"); } if (File.Exists(filePath)) { #region 当图纸文件已被打开时,直接打开图纸并选中图元 if (FileHelper.IsFileLocked(filePath)) { msg = CADFunc.General.OpenDwg(filePath);//打开编辑图纸 if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"本地图纸文件:{model.Text} 打开失败,信息:{msg}"); return; } //根据句柄设置选中图元 msg = General.SelectEntityByHandle(pixel.PixelCode); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show(msg); } return; } #endregion //图纸未被打开则删除再下载服务器最新图纸 File.Delete(filePath); } //服务器下载图纸 var dwgfileDto = await _annexesService.GetAnnexesFile(dwgObj.FolderId); msg = await _annexesService.DownloadFile(filePath, dwgfileDto.F_Id); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("图纸文件下载失败,信息:" + msg); return; } msg = CADFunc.General.OpenDwg(filePath);//打开编辑图纸 if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"本地图纸文件:{model.Text} 打开失败,信息:{msg}"); return; } //根据句柄设置选中图元 msg = General.SelectEntityByHandle(pixel.PixelCode); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show(msg); return; } #endregion } else { #region 未检出或别人检出,则下载图纸并只读打开 if (File.Exists(filePath)) { #region 当图纸文件已被打开时,直接打开图纸并选中图元 if (FileHelper.IsFileLocked(filePath)) { msg = CADFunc.General.OpenDwg(filePath, true);//只读打开图纸 if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"本地图纸文件:{model.Text} 打开失败,信息:{msg}"); return; } //根据句柄设置选中图元 msg = General.SelectEntityByHandle(pixel.PixelCode); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show(msg); } return; } #endregion //图纸未被打开则删除再下载服务器最新图纸 File.Delete(filePath); } //服务器下载图纸 var dwgfileDto = await _annexesService.GetAnnexesFile(dwgObj.FolderId); msg = await _annexesService.DownloadFile(filePath, dwgfileDto.F_Id); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("图纸文件下载失败,信息:" + msg); return; } msg = CADFunc.General.OpenDwg(filePath, true);//只读打开图纸 if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"本地图纸文件:{model.Text} 打开失败,信息:{msg}"); return; } //根据句柄设置选中图元 msg = General.SelectEntityByHandle(pixel.PixelCode); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show(msg); } #endregion } } #endregion #region 图纸选中元素,获取属性 /// /// 图纸选中元素,获取属性 /// /// 是否只读 private void InitDrawingSelectedAdd(ec_drawing_file dwgObj, bool isReadOnly = false) { //GlobalObject.drawingFileId = dwgObj.DrawingFileID; var doc = Application.DocumentManager.MdiActiveDocument; doc.CloseWillStart += onCloseWillStart; var ed = doc.Editor; ed.SelectionAdded += OnSelectionAdded; GlobalObject.ListDwgOpened.Add(new DrawingOpened() { Id = dwgObj.DrawingFileID, Path = Path.Combine(GlobalObject.GetDwgFileFolder(), dwgObj.DrawingFileName), IsReadOnly = isReadOnly }); } /// /// 图纸选中元素,获取属性 /// private void InitDrawingSelectedAdd(Model.TreeModel dwgObj, bool isReadOnly = false) { //GlobalObject.drawingFileId = dwgObj.DrawingFileID; var doc = Application.DocumentManager.MdiActiveDocument; doc.CloseWillStart += onCloseWillStart; var ed = doc.Editor; ed.SelectionAdded += OnSelectionAdded; //GlobalObject.ListDwgOpened.Add(Path.Combine(GlobalObject.GetDwgFileFolder(), dwgObj.Text), dwgObj.ID); GlobalObject.ListDwgOpened.Add(new DrawingOpened() { Id = dwgObj.ID, Path = Path.Combine(GlobalObject.GetDwgFileFolder(), dwgObj.Text), IsReadOnly = isReadOnly }); } /// /// 添加选中元素事件 /// /// /// private void OnSelectionAdded(object sender, SelectionAddedEventArgs e) { #region 过滤500毫秒内多次事件响应 //var span = DateTime.Now - GlobalObject.preClickTime; //if (span.TotalMilliseconds < 500) //{ // Console.WriteLine($"当前时间:{DateTime.Now.ToString("HH:mm:ss:ffff")},上次点击时间:{GlobalObject.preClickTime.ToString("HH:mm:ss:ffff")}在500毫秒内,不处理"); // return; //} //else //{ // GlobalObject.preClickTime = DateTime.Now; // Console.WriteLine($"当前时间:{DateTime.Now.ToString("HH:mm:ss:ffff")},上次点击时间:{GlobalObject.preClickTime.ToString("HH:mm:ss:ffff")}"); //} #endregion try { var doc = Application.DocumentManager.MdiActiveDocument; var ed = doc.Editor; if (e.AddedObjects.Count > 0) { List listHand = new List(); using (Transaction tr = doc.TransactionManager.StartTransaction()) { //var obj = e.AddedObjects[e.AddedObjects.Count - 1]; for (int i = 0; i < e.AddedObjects.Count; i++) { var obj = e.AddedObjects[i]; Entity ent = tr.GetObject(obj.ObjectId, OpenMode.ForWrite) as Entity; var xdata = ent.XData; if (ent != null) { if (isCheckIn) { ent.ColorIndex = 1;//1为红色 if (!General.SelectHandles.Contains(ent.Handle.ToString())) { General.SelectHandles.Add(ent.Handle.ToString()); } } else if (isObjectTypeGuanlian) { if (!General.SelectHandles.Contains(ent.Handle.ToString())) { General.SelectHandles.Add(ent.Handle.ToString()); } } else if (isIOassociationChannel) { List listHandId = new List(); if (!General.SelectHandles.Contains(ent.Handle.ToString())) { General.SelectHandles.Add(ent.Handle.ToString()); listHandId.Add(ent.Handle.ToString()); } eventAggregator.GetEvent().Publish(listHandId); } else { listHand.Add(ent.Handle.ToString()); } } } if (!isCheckIn) { eventAggregator.GetEvent().Publish(listHand); } tr.Commit(); } } //var doc = Application.DocumentManager.MdiActiveDocument; //var ed = doc.Editor; //if (e.AddedObjects.Count > 0) //{ // using (Transaction tr = doc.TransactionManager.StartTransaction()) // { // var obj = e.AddedObjects[e.AddedObjects.Count - 1]; // Entity ent = tr.GetObject(obj.ObjectId, OpenMode.ForRead) as Entity; // if (ent != null && ent.XData != null) // { // var handlid = ent.Handle.ToString(); // // 在此处理被点击的图元 // //ed.WriteMessage($"\n选中图元:{ent.GetType().Name}, 句柄:{ent.Handle}"); // eventAggregator.GetEvent().Publish(handlid); // ed.WriteMessage($"\n选中图元事件触发:{handlid} \n"); // } // else if (ent != null && ent.XData == null) // { // var handlid = ent.Handle.ToString(); // ed.WriteMessage($"\n选中图元:{handlid} XData为空\n"); // } // tr.Commit(); // } //} //获取属性事件 } catch (Exception ex) { } } /// /// 关闭图纸事件 /// /// /// private void onCloseWillStart(object sender, EventArgs e) { var name = General.GetDwgName(); var dwg = GlobalObject.ListDwgOpened.FirstOrDefault(a => a.Path == name); if (dwg != null) { GlobalObject.ListDwgOpened.Remove(dwg); } } #endregion #region 初始化历史版次图纸树 /// /// 初始化历史版次图纸树 /// private async void InitHistoryDrawings() { var historyDrawingsTree = await _dwgService.GetDrawingCatalogue(); historyDrawingsTree = CheckInOutStatus(historyDrawingsTree); var listHistory = await _dwgService.GetPublishedDwg(); if (listHistory.Any()) { //历史树1 //historyDrawings = FilterHistoryTree(historyDrawingsTree, listHistory); //FilterHistoryZero(historyDrawings); #region 历史树2 historyDrawings = new ObservableCollection(); for (int i = 0; i < GlobalObje.DwgStage().Count; i++) { var stage = GlobalObje.DwgStage()[i]; historyDrawings.Add(new Model.TreeModel() { ID = i.ToString(), Text = stage.DataItemName, NodeType = "0", ChildNodes = new ObservableCollection() }); } foreach (var item in listHistory) { var stageNode = historyDrawings.FirstOrDefault(a => a.Text == item.FileVersion); if (stageNode != null) { Model.TreeModel node = null; foreach (var dto in historyDrawingsTree) { //获取节点下的图纸 node = Helper.TreeHelper.GetTreeModel(dto, item.DrawingFileID); if (node != null) { break; } } if (node == null) { continue; } var model = new Model.TreeModel() { ID = item.DrawingFileID, Text = node.Text, NodeType = "99",//历史图纸类型99 NodeExtData = JsonConvert.SerializeObject(item) }; var dwg = JsonConvert.DeserializeObject(node.NodeExtData.ToString()); UpdateNode(model, dwg); stageNode.ChildNodes.Add(model); } } #endregion } } /// /// 遍历图纸把有历史版次的图纸加入进去 /// /// 完整的节点 /// private ObservableCollection FilterHistoryTree(ObservableCollection nodes, List listHistory) { foreach (var node in nodes) { if (node.Text.ToLower().EndsWith(".dwg")) { var list = listHistory.Where(a => a.DrawingFileID == node.ID).ToList(); if (list.Any()) { if (node.ChildNodes == null) { node.ChildNodes = new ObservableCollection(); } foreach (var item in list) { var name = node.Text.Replace(".dwg", ""); var model = new Model.TreeModel() { ID = item.DrawingFileID, Text = $"{name}({item.FileVersion}).dwg", NodeType = "99", NodeExtData = JsonConvert.SerializeObject(item) }; node.ChildNodes.Add(model); } node.isexpand = true; } else { node.NodeType = "-1";//没有历史版次,当前节点要删除 } } else { FilterHistoryTree(node.ChildNodes, listHistory); } } return nodes; } /// /// 遍历图纸把没有历史版次的图纸删除 /// /// 完整的节点 /// private ObservableCollection FilterHistoryTreeDwgZero(ObservableCollection nodes) { if (nodes == null) { return null; } foreach (var node in nodes) { var list = node.ChildNodes; if (list != null && list.Any()) { ObservableCollection listRemove = new ObservableCollection(); foreach (var item in list) { if (item.NodeType == "-1") { listRemove.Add(item); } } foreach (var item in listRemove) { node.ChildNodes.Remove(item); } if (node.ChildNodes.Any()) { node.isexpand = true; } } FilterHistoryTreeDwgZero(node.ChildNodes); } return nodes; } /// /// 遍历图纸把没有下级的目录删除 /// /// 完整的节点 /// private ObservableCollection FilterHistoryTreeFolderZero(ObservableCollection nodes) { if (nodes == null) { return null; } foreach (var node in nodes) { FilterHistoryTreeFolderZero(node.ChildNodes); if ((node.ChildNodes == null || !node.ChildNodes.Any()) && node.NodeType != "99") { node.NodeType = "-1"; } ObservableCollection listRemove = new ObservableCollection(); var list = node.ChildNodes; if (list != null && list.Any()) { foreach (var item in list) { if (item.NodeType == "-1") { listRemove.Add(item); } } foreach (var item in listRemove) { node.ChildNodes.Remove(item); } if ((node.ChildNodes == null || !node.ChildNodes.Any()) && node.NodeType != "99") { node.NodeType = "-1"; } if (node.ChildNodes.Any()) { node.isexpand = true; } } } return nodes; } /// /// 过滤没有下级历史图纸的节点 /// /// private void FilterHistoryZero(ObservableCollection nodes) { FilterHistoryTreeDwgZero(nodes); FilterHistoryTreeFolderZero(nodes); ObservableCollection listRemove = new ObservableCollection(); foreach (var item in nodes) { if (item.NodeType == "-1") { listRemove.Add(item); } } foreach (var item in listRemove) { nodes.Remove(item); } } #endregion #region 只读打开历史版次图纸 /// /// 只读打开历史版次图纸 /// /// 图纸 private async void onReadOnlyOpenDwg(Model.TreeModel model) { #region 下载文件,只读打开 string filePath = Path.Combine(GlobalObject.GetDwgFileFolder(), model.Text); var msg = string.Empty; var dwgPublishObj = JsonConvert.DeserializeObject(model.NodeExtData.ToString()); if (File.Exists(filePath)) { msg = CADFunc.General.OpenDwg(filePath, true);//以只读模式打开图纸 if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"本地图纸文件:{model.Text} 打开失败,信息:{msg}"); } //设置图纸选中元素回调 InitDrawingSelectedAdd(model, true); return; } // 下载图纸文件再打开 var dwgfileDto = await _annexesService.GetAnnexesFile(dwgPublishObj.FolderId); msg = await _annexesService.DownloadFile(filePath, dwgfileDto.F_Id); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("图纸文件下载失败,信息:" + msg); return; } msg = CADFunc.General.OpenDwg(filePath, true);//以只读模式打开图纸 if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"本地图纸文件:{model.Text} 打开失败,信息:{msg}"); return; } //设置图纸选中元素回调 InitDrawingSelectedAdd(model, true); #endregion } #endregion #region 刷新历史版次图纸树 /// /// 刷新历史版次图纸树 /// /// 图纸 private void onRefreshHistoryDwg(Model.TreeModel model) { InitHistoryDrawings(); } #endregion #region 双击图元,把图元加入到图纸上 /// /// 双击图元,把图元加入到图纸上 ec_library_file /// /// 图元 private void onTagDoubleClick(object tag) { if (tag == null) { return; } var dwgLibrary = tag as ec_library_file; if (dwgLibrary == null) { return; } else { //在SWS系统内打开且不是只读的图纸才可添加图元 var name = General.GetDwgName(); var dwgFile = GlobalObject.ListDwgOpened.FirstOrDefault(a => a.Path == name && a.IsReadOnly == false); if (dwgFile == null) { return; } IDialogParameters x = new Prism.Services.Dialogs.DialogParameters(); x.Add(GlobalObject.dialogPar.info.ToString(), ListTagNumber); x.Add(GlobalObject.dialogPar.id.ToString(), selectType.ID); var _dialogService = GlobalObject._prismContainer.Resolve(); _dialogService.ShowDialog(nameof(DialogTagSelect), x, async (RES) => { if (RES.Result == ButtonResult.Yes) { string tagNum = string.Empty; var tagNumber = RES.Parameters.GetValue(GlobalObject.dialogPar.info.ToString()); var dgwFilePath = Path.Combine(GlobalObject.GetDwgFileFolder(), dwgLibrary.LibraryFileName + ".dwg"); var objId = General.InsertExternalDWG(dgwFilePath, tagNumber, ref tagNum); #region 图纸上保存图元属性 if (!objId.IsNull) { List listPro = new List(); var handlid = objId.Handle.ToString();//添加图元返回的句柄 ec_enginedata item = new ec_enginedata(); item.TagNumber = tagNum; item.ObjectTypeID = selectType.ID; item.Layout_Block_File = dwgLibrary; var res = await objectTypeService.GetObjectTypePById(selectType.ID);//添加属性 if (res.Any()) { foreach (var dto in res) { listPro.Add(new ec_enginedata_property() { EngineDataPropertyID = dto.PropertyID, PropertyName = dto.PropertyName, PropertyNameEN = dto.PropertyNameEN, PropertyValue = dto.DefaultValue, MeasuringUnit = dto.MeasuringUnitTypeName, PropertyGID = dto.PropertyGID, PropertyGroupName = dto.PropertyGroupName }); } } item.EngineDataProperty = listPro; List listPixel = new List(); var pixelDto = new ec_enginedata_pixel() { TagNumber = tagNum, DrawingFileID = dwgFile.Id, LibraryFileID = dwgLibrary.LibraryFileID, PixelCode = handlid, ObjectTypeID = selectType.ID, ObjectTypeName = selectType.Text, EngineDataProperty = listPro }; listPixel.Add(pixelDto); item.EngineDataPixel = listPixel; string msg = string.Empty; msg = await objectTypeService.UpdatePixelAndProp(item); if (msg != string.Empty) { MessageBox.Show("保存图元属性至图纸异常:" + msg); } } #endregion AddRecentObjectType(); } else if (RES.Result == ButtonResult.No) { } }); return; } } /// /// 把设计元件当前节点, 添加到最近使用 /// private void AddRecentObjectType() { if (selectType == null) { return; } string ids = string.Empty; var strRecentObjectType = _configService.Read("Project" + GlobalObject.curProject.ProjectId, nameof(ConfigIni.RecentObjectType)); if (string.IsNullOrEmpty(strRecentObjectType)) { //获取节点 Model.TreeModel node = Helper.TreeHelper.GetTreeModel(GlobalObject.objectTypeTree, selectType.ID); var addNode = (Model.TreeModel)node.Clone(); var firstNode = objectTypeTree[0]; //UI添加到最近使用 firstNode.ChildNodes.Insert(0, addNode); ids = selectType.ID; } else if (strRecentObjectType.Contains(selectType.ID)) { return; } else { var firstNode = objectTypeTree[0]; var listObjectTypeId = strRecentObjectType.Split(',').ToList(); if (listObjectTypeId.Count >= 5) { //删除最后一个 listObjectTypeId.Remove(listObjectTypeId.Last()); firstNode.ChildNodes.Remove(firstNode.ChildNodes.Last()); } listObjectTypeId.Insert(0, selectType.ID); //获取节点 Model.TreeModel node = Helper.TreeHelper.GetTreeModel(GlobalObject.objectTypeTree, selectType.ID); var addNode = (Model.TreeModel)node.Clone(); firstNode.ChildNodes.Insert(0, addNode);//UI添加到最近使用 ids = string.Join(",", listObjectTypeId); } //保存最近使用id到本地文件里 _configService.Save("Project" + GlobalObject.curProject.ProjectId, nameof(ConfigIni.RecentObjectType), ids); } #endregion #region 编辑目录属性 /// /// 编辑目录属性 /// /// 图纸 private void onEditDrawingCatalogue(Model.TreeModel model) { var oldName = model.Text; IDialogParameters x = new Prism.Services.Dialogs.DialogParameters(); x.Add(GlobalObject.dialogPar.id.ToString(), model.ID); var _dialogService = GlobalObject._prismContainer.Resolve(); _dialogService.ShowDialog(nameof(DialogDrawingCatalogue), x, (RES) => { if (RES.Result == ButtonResult.Yes) { var newName = RES.Parameters.GetValue(GlobalObject.dialogPar.info.ToString()); if (!newName.Equals(oldName)) { model.Text = newName; } } else if (RES.Result == ButtonResult.No) { } }); } #endregion #region 元件关联图元 /// /// 元件关联图元 /// /// 图纸 private void onGuanlian(object obj) { if (selectedTag == null) { MessageBox.Show("请先选择元件!"); return; } //在SWS系统内打开且不是只读的图纸才可添加图元 var dwgName = General.GetDwgName(); var dwgFile = GlobalObject.ListDwgOpened.FirstOrDefault(a => a.Path == dwgName && a.IsReadOnly == false); if (dwgFile == null) { MessageBox.Show("请在系统打开的图纸上操作!"); return; } IDialogParameters x = new Prism.Services.Dialogs.DialogParameters(); x.Add(GlobalObject.dialogPar.info.ToString(), ListTagNumber); x.Add(GlobalObject.dialogPar.id.ToString(), selectType.ID); var _dialogService = GlobalObject._prismContainer.Resolve(); _dialogService.ShowDialog(nameof(DialogTagSelect), x, async (RES) => { if (RES.Result == ButtonResult.Yes) { General.SendMessage($"请选择需关联【{selectType.Text}】元件的图元"); var tagNumber = RES.Parameters.GetValue(GlobalObject.dialogPar.info.ToString()); isObjectTypeGuanlian = true; General.SelectHandles.Clear(); var listHandles = General.StartObjectTypeSelection(); if (!listHandles.Any()) { isObjectTypeGuanlian = false; return; } #region 图纸上保存图元属性 List listEnginedata = new List(); foreach (var handlid in listHandles) { List listPro = new List(); ec_enginedata item = new ec_enginedata(); item.TagNumber = tagNumber; item.ObjectTypeID = selectType.ID; var res = await objectTypeService.GetObjectTypePById(selectType.ID);//添加属性 if (res.Any()) { foreach (var dto in res) { listPro.Add(new ec_enginedata_property() { EngineDataPropertyID = dto.PropertyID, PropertyName = dto.PropertyName, PropertyNameEN = dto.PropertyNameEN, PropertyValue = dto.DefaultValue, MeasuringUnit = dto.MeasuringUnitTypeName, PropertyGID = dto.PropertyGID, PropertyGroupName = dto.PropertyGroupName }); } } item.EngineDataProperty = listPro; List listPixel = new List(); var pixelDto = new ec_enginedata_pixel() { TagNumber = tagNumber, DrawingFileID = dwgFile.Id, PixelCode = handlid, ObjectTypeID = selectType.ID, ObjectTypeName = selectType.Text, EngineDataProperty = listPro }; listPixel.Add(pixelDto); item.EngineDataPixel = listPixel; listEnginedata.Add(item); } var msg = await objectTypeService.UpdatePixelAndPropBatch(listEnginedata); if (msg != string.Empty) { MessageBox.Show("保存图元属性至图纸异常:" + msg); } else { General.SetXdata(listHandles, tagNumber);//对空XData进行设置XData General.SendMessage($"图元:{string.Join(",", listHandles)},成功转【{selectType.Text}】对象"); } isObjectTypeGuanlian = false; #endregion } else if (RES.Result == ButtonResult.No) { } }); } #endregion #region 位号关联通道 private void ChangeIORelation(bool flag) { isIOassociationChannel = flag; } #endregion } }