327 lines
10 KiB
C#
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
|
|
}
|
|
|
|
|
|
}
|