009_DI-Elec/newFront/c#前端/SWS.Electrical/ViewModels/DialogRefreshAnnotationViewModel.cs
2025-10-17 16:45:00 +08:00

395 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web.UI.WebControls;
using System.Windows.Controls;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Media3D;
using Bricscad.EditorInput;
using ImTools;
using Newtonsoft.Json;
using Prism.Services.Dialogs;
using SWS.CAD.Base;
using SWS.Commons;
using SWS.Electrical.Models;
using SWS.Model;
using SWS.Service;
using SWS.Share;
using SWS.WPF.ViewModels;
using Teigha.DatabaseServices;
using Teigha.Geometry;
using Teigha.GraphicsSystem;
using Telerik.Windows.Controls;
using Unity;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TaskbarClock;
//using static ImTools.Union<TUnion, T1, T2>;
using Visibility = System.Windows.Visibility;
namespace SWS.Electrical.ViewModels
{
public class DialogRefreshAnnotationViewModel : DialogBase, IDialogAware
{
private ObservableCollection<DtoAnnotation> _listAnnotation = new ObservableCollection<DtoAnnotation>();
/// <summary>
/// 正常标注列表
/// </summary>
public ObservableCollection<DtoAnnotation> listAnnotation
{
get { return this._listAnnotation; }
set
{
if (value != this._listAnnotation)
{
this._listAnnotation = value;
RaisePropertyChanged(nameof(listAnnotation));
}
}
}
private ObservableCollection<DtoAnnotation> _listErrAnnotation = new ObservableCollection<DtoAnnotation>();
/// <summary>
/// 异常标注列表
/// </summary>
public ObservableCollection<DtoAnnotation> listErrAnnotation
{
get { return this._listErrAnnotation; }
set
{
if (value != this._listErrAnnotation)
{
this._listErrAnnotation = value;
RaisePropertyChanged(nameof(listErrAnnotation));
}
}
}
private ObservableCollection<TextBlock> _listMsg = new ObservableCollection<TextBlock>();
/// <summary>
/// 信息列表
/// </summary>
public ObservableCollection<TextBlock> listMsg
{
get { return this._listMsg; }
set
{
if (value != this._listMsg)
{
this._listMsg = value;
RaisePropertyChanged(nameof(listMsg));
}
}
}
private string _NormalTagCount = "正常标注";
/// <summary>
/// 正常标注
/// </summary>
public string NormalTagCount
{
get { return _NormalTagCount; }
set { _NormalTagCount = value; OnPropertyChanged(nameof(NormalTagCount)); }
}
private string _ErrTagCount = "异常标注";
/// <summary>
/// 异常标注
/// </summary>
public string ErrTagCount
{
get { return _ErrTagCount; }
set { _ErrTagCount = value; OnPropertyChanged(nameof(ErrTagCount)); }
}
private bool _IsEnableGetAttribute = true;
/// <summary>
/// 获取元件属性值 是否可用
/// </summary>
public bool IsEnableGetAttribute
{
get { return _IsEnableGetAttribute; }
set { _IsEnableGetAttribute = value; OnPropertyChanged(nameof(IsEnableGetAttribute)); }
}
private bool _IsEnableRefreshAnnotation = true;
/// <summary>
/// 刷新标注 是否可用
/// </summary>
public bool IsEnableRefreshAnnotation
{
get { return _IsEnableRefreshAnnotation; }
set { _IsEnableRefreshAnnotation = value; OnPropertyChanged(nameof(IsEnableRefreshAnnotation)); }
}
/// <summary>
/// 命令事件 获取元件属性值
/// </summary>
public ICommand Command_GetAttribute { get; set; }
/// <summary>
/// 命令事件 刷新标注
/// </summary>
public ICommand Command_RefreshAnnotation { get; set; }
DrawingServce _ServiceDrawing;
DrawingCatalogueService _ServiceDrawingCatalogue;
ObjectTypeService _ServiceObjectType;
private TreeModel dwgNode;
int time = 10;
public DialogRefreshAnnotationViewModel()
{
Command_GetAttribute = new DelegateCommand(onGetAttribute);
Command_RefreshAnnotation = new DelegateCommand(onRefreshAnnotation);
title = "刷新标注";
_ServiceDrawing = GlobalObject.container.Resolve<DrawingServce>();
_ServiceObjectType = GlobalObject.container.Resolve<ObjectTypeService>();
_ServiceDrawingCatalogue = GlobalObject.container.Resolve<DrawingCatalogueService>();
}
public string Title => "";
public event Action<IDialogResult> RequestClose;
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
}
public void OnDialogOpened(IDialogParameters parameters)
{
try
{
dwgNode = parameters.GetValue<TreeModel>(GlobalObject.dialogPar.para1.ToString());
title += " - " + dwgNode.Text;
IsBusy = true;
BusyContent = "数据加载中...";
AddMsg($"数据加载中...");
var listMtext = General.GetAllMText();
var listTag = General.GetAllAnnotation();
List<DtoAnnotation> listSuccess = new List<DtoAnnotation>();
List<DtoAnnotation> listFailed = new List<DtoAnnotation>();
foreach (var item in listTag)
{
DtoAnnotation dto = new DtoAnnotation();
dto.TagHandid = item.TagHandId;
dto.AttributeName = item.Name;
dto.AnnotationHandid = item.LabelHandId;
dto.Status = "未刷新";
var mtext = listMtext.FirstOrDefault(a => a.HandId == dto.AnnotationHandid);
if (mtext != null)
{
dto.AnnotationValue = mtext.Text;
listSuccess.Add(dto);
}
else
{
dto.Status = "未匹配";
listFailed.Add(dto);
}
}
listAnnotation = new ObservableCollection<DtoAnnotation>(listSuccess);
listErrAnnotation = new ObservableCollection<DtoAnnotation>(listFailed);
NormalTagCount = $"正常标注({listSuccess.Count}个)";
ErrTagCount = $"异常标注({listFailed.Count}个)";
AddMsg($"数据加载完成");
}
catch (Exception ex)
{
MessageBox.Show("DialogOpened异常" + ex.Message);
}
finally
{
IsBusy = false;
}
}
/// <summary>
/// 获取元件属性值
/// </summary>
/// <param name="o"></param>
public async void onGetAttribute(object o)
{
//if (isRefresh)
//{
// MessageBox.Show("正在刷新标注,请勿操作...");
// return;
//}
//if (isGetAttribute)
//{
// MessageBox.Show("正在获取属性值,请勿操作...");
// return;
//}
try
{
IsEnableGetAttribute = IsEnableRefreshAnnotation = false;
listMsg.Clear();
AddMsg("开始查询元件属性值信息...");
List<string> listTagHandid = new List<string>();
listTagHandid = listAnnotation.Select(a => a.TagHandid).Distinct().ToList();
foreach (string handid in listTagHandid)
{
AddMsg($"查询元件句柄[{handid}]属性值......");
var res = await _ServiceObjectType.GetTagInfosByPixels(dwgNode.ID, handid);
if (res == null || !res.Any())
{
AddMsg($"元件句柄[{handid}]获取属性值失败!", false);
continue;
}
if (res.Count == 1)
{
var objectTypeName = res[0].ObjectTypeName;
var tagNumber = res[0].tags[0].TagNumber;
var props = res[0].tags[0].EngineDataProperty;
var listAnno = listAnnotation.Where(a => a.TagHandid == handid).ToList();
foreach (var anno in listAnno)
{
var pro = props.FirstOrDefault(a => a.PropertyName == anno.AttributeName);
if (pro != null)
{
anno.ObjectTypeName = objectTypeName;
anno.TagNumber = tagNumber;
anno.AttributeValue = pro.PropertyValue.ToString();
AddMsg($"获取属性值成功,类型:{objectTypeName},位号:{tagNumber},属性名:{anno.AttributeName},属性值:{anno.AttributeValue}");
}
}
}
else
{
AddMsg($"元件句柄({handid})获取属性值异常!", false);
continue;
}
}
AddMsg("元件属性值信息查询完成!");
}
catch (Exception ex)
{
AddMsg("基点元件信息查询异常:" + ex.Message);
}
finally
{
IsEnableGetAttribute = IsEnableRefreshAnnotation = true;
}
}
/// <summary>
/// 刷新标注
/// </summary>
/// <param name="o"></param>
public async void onRefreshAnnotation(object o)
{
//if (isRefresh)
//{
// MessageBox.Show("正在刷新标注,请勿操作...");
// return;
//}
var msg = string.Empty;
try
{
IsEnableGetAttribute = IsEnableRefreshAnnotation = false;
listMsg.Clear();
if (!listAnnotation.Any())
{
AddMsg($"没有正常匹配的标注数据,无需刷新!", false);
return;
}
var progress = new Progress<MessageModel>(UpdateProgress);
await DoWorkAsync(progress, new CancellationTokenSource());
}
catch (Exception ex)
{
MessageBox.Show("异常:" + ex.Message);
}
finally
{
IsEnableGetAttribute = IsEnableRefreshAnnotation = true;
}
}
#region dowork
private void UpdateProgress(MessageModel dto)
{
System.Windows.Application.Current.Dispatcher.Invoke(new System.Action(() =>
{
AddMsg(dto.Message, dto.IsSuccess);
}));
}
private async Task DoWorkAsync(IProgress<MessageModel> progress, CancellationTokenSource cts)
{
try
{
List<KeyValueModel> listValue = new List<KeyValueModel>();
var msg = string.Empty;
foreach (var anno in listAnnotation)
{
if (anno.Status == "已刷新")
{
AddMsg($"当前标注[{anno.AnnotationHandid}]的已刷新,跳至下一个");
continue;
}
if (anno.AttributeValue == anno.AnnotationValue)
{
AddMsg($"当前标注[{anno.AnnotationHandid}]的属性值和标注值一致,无需刷新,跳至下一个");
anno.Status = "无需刷新";
continue;
}
listValue.Add(new KeyValueModel() { Key = anno.AnnotationHandid, Value = anno.AttributeValue });
AddMsg($"当前标注句柄:{anno.AnnotationHandid},属性值:{anno.AttributeValue},已加入刷新列表");
anno.Status = "等待刷新";
await Task.Delay(100);
}
if (!listValue.Any())
{ AddMsg($"所有标注值与属性值一致,无需刷新!", false); return; }
msg = General.RefreshMTextInfo(listValue);
if (string.IsNullOrWhiteSpace(msg))
{
foreach (var anno in listValue)
{
var dto = listAnnotation.FirstOrDefault(a => a.AnnotationHandid == anno.Key);
if (dto != null)
{
dto.Status = "已刷新";
}
}
AddMsg("操作已完成!");
}
else { AddMsg($"刷新标注列表异常:{msg}",false); }
}
catch (Exception ex)
{
MessageBox.Show("异常:" + ex.Message);
}
}
#endregion
#region
/// <summary>
/// 添加提示信息
/// </summary>
/// <param name="msg">信息</param>
/// <param name="isSucc">是否成功</param>
private void AddMsg(string msg, bool isSucc = true)
{
try
{
TextBlock tb = new TextBlock();
tb.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff") + "==>> " + msg;
tb.Foreground = isSucc ? Brushes.LightSeaGreen : Brushes.Red;
listMsg.Add(tb);
}
catch (Exception ex)
{
MessageBox.Show("添加提示信息异常:" + ex.Message);
}
}
#endregion
}
}