009_DI-Elec/newFront/c#前端/SWS.Electrical/ViewModels/DialogRefreshAnnotationViewModel.cs

395 lines
14 KiB
C#
Raw Normal View History

2025-10-17 16:45:00 +08:00
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
}
}