009_DI-Elec/newFront/c#前端/SWS.CAD/ViewModels/DialogParallelCableViewModel.cs
2025-09-04 18:28:02 +08:00

327 lines
10 KiB
C#

using Prism.Commands;
using Prism.Events;
using Prism.Ioc;
using Prism.Services.Dialogs;
using SWS.CAD.Event;
using SWS.Commons;
using SWS.Model;
using SWS.Service;
using SWS.WPF.ViewModels;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using Unity;
using DelegateCommand = Prism.Commands.DelegateCommand;
namespace SWS.CAD.ViewModels
{
public class DialogParallelCableViewModel : DialogBase, IDialogAware
{
#region
/// <summary>
/// 新增位号
/// </summary>
public ICommand Command_Add { get; set; }
/// <summary>
/// 删除位号
/// </summary>
public ICommand Command_Delete { get; set; }
/// <summary>
/// 生成
/// </summary>
public ICommand Command_Build { get; set; }
#endregion
#region
private ObservableCollection<KeyValueModel> _listTagNumber;
/// <summary>
/// 位号列表
/// </summary>
public ObservableCollection<KeyValueModel> listTagNumber
{
get { return this._listTagNumber; }
set
{
if (value != this._listTagNumber)
{
this._listTagNumber = value;
RaisePropertyChanged(nameof(listTagNumber));
}
}
}
private KeyValueModel _selectTag;
public KeyValueModel selectTag
{
get { return this._selectTag; }
set
{
if (value != this._selectTag)
{
this._selectTag = value;
RaisePropertyChanged(nameof(selectTag));
}
}
}
private string _strParallelCable;
public string StrParallelCable
{
get { return this._strParallelCable; }
set
{
if (value != this._strParallelCable)
{
this._strParallelCable = value;
RaisePropertyChanged(nameof(StrParallelCable));
}
}
}
#endregion
/// <summary>
/// 位号
/// </summary>
private string tagNumber;
/// <summary>
/// 位号数字前的字符串
/// </summary>
private string preTagNumber;
/// <summary>
/// 位号默认的数字
/// </summary>
private int num = 0;
/// <summary>
/// 图元类型
/// </summary>
private ec_objecttype objectType;
/// <summary>
/// 平行电缆属性
/// </summary>
private propertyModel proModel1;
/// <summary>
/// 平行电缆位号属性
/// </summary>
private propertyModel proModel2;
EnginedataService _enginedataService;
ObjectTypeService _objectTypeService;
IEventAggregator eventAggregator;
public DialogParallelCableViewModel()
{
_enginedataService = GlobalObject.container.Resolve<EnginedataService>();
_objectTypeService = GlobalObject.container.Resolve<ObjectTypeService>();
eventAggregator = GlobalObject.container.Resolve<IEventAggregator>();
listTagNumber = new ObservableCollection<KeyValueModel>();
Command_Add = new DelegateCommand(onAddTagNumber);
Command_Delete = new DelegateCommand(onDeleteTagNumber);
Command_Build = new DelegateCommand(onBuild);
}
#region dialog
public string Title => "";
public event Action<IDialogResult> RequestClose;
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
}
public void OnDialogOpened(IDialogParameters parameters)
{
objectType = parameters.GetValue<ec_objecttype>(GlobalObject.dialogPar.info.ToString());
proModel1 = parameters.GetValue<propertyModel>(GlobalObject.dialogPar.para1.ToString());
proModel2 = parameters.GetValue<propertyModel>(GlobalObject.dialogPar.para2.ToString());
tagNumber = objectType.tags[0].TagNumber;
title = $"平行电缆管理 - {tagNumber}";
GlobalObject.GetLastNumber(tagNumber, ref preTagNumber, ref num);
StrParallelCable = proModel2.PropertyValue;
if (!string.IsNullOrEmpty(proModel1.PropertyValue))
{
var listCable = proModel1.PropertyValue.Split(',');
for (int i = 0; i < listCable.Length; i++)
{
listTagNumber.Add(new KeyValueModel()
{
Key = (i + 1).ToString(),
Value= listCable[i]
});
}
GlobalObject.GetLastNumber(listCable.Last(), ref preTagNumber, ref num);
}
}
#endregion
#region
public override void ExecuteOKCommandAsync(object para)
{
string strValue1=string.Empty;
string strValue2 = string.Empty;
if (listTagNumber.Any())
{
if (string.IsNullOrEmpty(StrParallelCable))
{ MessageBox.Show("平行电缆位号不能为空!"); return; }
strValue2 = StrParallelCable;
strValue1=string.Join(",", listTagNumber.Select(a=>a.Value).ToList());
}
proModel1.PropertyValue = strValue1;
proModel2.PropertyValue = strValue2;
eventAggregator.GetEvent<propertyChangeEvent>().Publish(proModel1);
eventAggregator.GetEvent<propertyChangeEvent>().Publish(proModel2);
DialogResult res = new DialogResult(ButtonResult.Yes);
}
#endregion
#region
public override void ExecuteCloseCommand(object parameter)
{
if (parameter as string == "ClickNo")
{
DialogResult res = new DialogResult(ButtonResult.No);
RequestClose.Invoke(res);
}
else
{
RequestClose.Invoke(new DialogResult(ButtonResult.Cancel));
}
this.Dispose();
}
#endregion
#region
public void onAddTagNumber()
{
num++;
var dto = new KeyValueModel()
{
Key = (listTagNumber.Count + 1).ToString(),
Value = preTagNumber + num
};
listTagNumber.Add(dto);
selectTag = dto;
}
#endregion
#region
/// <summary>
/// 删除位号
/// </summary>
public void onDeleteTagNumber()
{
if (selectTag == null)
{ MessageBox.Show("请选择要删除的位号!"); return; }
if (!listTagNumber.Any())
{ MessageBox.Show("位号列表不能为空!"); return; }
var lastDto = listTagNumber.Last();
if (selectTag == lastDto)
{
listTagNumber.Remove(selectTag);
num--;
}
else
{
listTagNumber.Remove(selectTag);
}
for (int i = 0; i < listTagNumber.Count; i++)
{
var item = listTagNumber[i];
item.Key = (i + 1).ToString();
}
listTagNumber = new ObservableCollection<KeyValueModel>(listTagNumber);
}
#endregion
#region
/// <summary>
/// 生成平行电缆位
/// </summary>
public void onBuild()
{
if (!listTagNumber.Any())
{ MessageBox.Show("位号列表不能为空!"); return; }
StrParallelCable = FormatCableNumbers(listTagNumber.Select(a => a.Value).ToArray());
}
/// <summary>
/// 根据位号组,生成一定规则的规则字符串
/// </summary>
public string FormatCableNumbers(string[] input)
{
string strPre = GetCommonPrefix(input);
// 1. 提取数字并排序
List<int> numbers = input
.Select(s => int.Parse(s.Substring(strPre.Length)))
.OrderBy(n => n)
.ToList();
if (numbers.Count == 0) return strPre;
// 2. 合并连续数字范围
List<string> ranges = new List<string>();
int currentStart = numbers[0];
int currentEnd = numbers[0];
for (int i = 1; i < numbers.Count; i++)
{
if (numbers[i] == currentEnd + 1)
{
currentEnd = numbers[i];
}
else
{
AddRange(ranges, currentStart, currentEnd);
currentStart = currentEnd = numbers[i];
}
}
AddRange(ranges, currentStart, currentEnd);
// 3. 拼接最终结果
return $"{strPre}({string.Join(",", ranges)})";
}
/// <summary>
/// 获取字符串数组的最长公共前缀(包含所有字符类型)
/// </summary>
private static string GetCommonPrefix(string[] strs)
{
if (strs.Length == 0) return "";
string first = strs[0];
int prefixLength = 0;
for (int i = 0; i < first.Length; i++)
{
char currentChar = first[i];
foreach (string s in strs)
{
if (i >= s.Length || s[i] != currentChar)
{
return first.Substring(0, prefixLength);
}
}
prefixLength++;
}
return first.Substring(0, prefixLength);
}
private void AddRange(List<string> ranges, int start, int end)
{
ranges.Add(start == end ? start.ToString() : $"{start}~{end}");
}
#endregion
}
}