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

871 lines
36 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 DialogGenerateBOMViewModel : DialogBase, IDialogAware
{
private ObservableCollection<TreeModel> _listDrawings = new ObservableCollection<TreeModel>();
/// <summary>
/// 图纸树
/// </summary>
public ObservableCollection<TreeModel> listDrawings
{
get { return this._listDrawings; }
set
{
if (value != this._listDrawings)
{
this._listDrawings = value;
RaisePropertyChanged(nameof(listDrawings));
}
}
}
private ObservableCollection<DtoBomDrawings> _listBomDrawings = new ObservableCollection<DtoBomDrawings>();
/// <summary>
/// 材料表列表
/// </summary>
public ObservableCollection<DtoBomDrawings> listBomDrawings
{
get { return this._listBomDrawings; }
set
{
if (value != this._listBomDrawings)
{
this._listBomDrawings = value;
RaisePropertyChanged(nameof(listBomDrawings));
}
}
}
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));
}
}
}
/// <summary>
/// 命令事件 生成材料表
/// </summary>
public ICommand Command_StartGenerate { get; set; }
/// <summary>
/// 命令事件 选择节点
/// </summary>
public ICommand Command_ChangeCheck { get; set; }
DrawingServce _ServiceDrawing;
AnnexesService _ServiceAnnexes;
DrawingCatalogueService _ServiceDrawingCatalogue;
PlotBOMService _ServicePlotBOM;
private bool isGenerate = false;//是否正在生成材料表
private string dwgName = string.Empty;
int time = 10;
public DialogGenerateBOMViewModel()
{
Command_StartGenerate = new DelegateCommand(onStartGenerate);
Command_ChangeCheck = new DelegateCommand(onChangeCheck);
title = "材料表自动生成";
_ServiceDrawing = GlobalObject.container.Resolve<DrawingServce>();
_ServiceAnnexes = GlobalObject.container.Resolve<AnnexesService>();
_ServicePlotBOM = GlobalObject.container.Resolve<PlotBOMService>();
_ServiceDrawingCatalogue = GlobalObject.container.Resolve<DrawingCatalogueService>();
}
public string Title => "";
public event Action<IDialogResult> RequestClose;
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
}
#region
/// <summary>
/// 改变子节点选中状态
/// </summary>
private void ChangeChild(TreeModel model, bool isChecked)
{
if (model.ChildNodes != null && model.ChildNodes.Any())
{
foreach (var item in model.ChildNodes)
{
item.IsChecked = isChecked;
ChangeChild(item, isChecked);
}
}
}
/// <summary>
/// 改变父节点选中状态
/// </summary>
private void ChangeParent(TreeModel model, bool isChecked)
{
if (!string.IsNullOrEmpty(model.parentId) && model.parentId != "0")
{
var parentNode = TreeHelper.GetTreeModel(listDrawings.ToList(), model.parentId);
if (parentNode != null)
{
if (isChecked)
{
bool flag = true;
foreach (var child in parentNode.ChildNodes)
{
if (child.IsChecked != true)
{
flag = false;
break;
}
}
parentNode.IsChecked = flag;
ChangeParent(parentNode, flag);
}
else
{
parentNode.IsChecked = isChecked;
ChangeParent(parentNode, isChecked);
}
}
}
}
/// <summary>
/// 节点选中状态改变
/// </summary>
/// <param name="id"></param>
/// <param name="isChecked"></param>
public void ChangeChecked(string id, bool isChecked)
{
var node = TreeHelper.GetTreeModel(listDrawings.ToList(), id);
if (node == null)
{ return; }
if (isChecked) // 如果节点被选中
{
if (node.ChildNodes != null)
{
foreach (var item in node.ChildNodes)
{
ChangeChild(item, isChecked);
item.IsChecked = true;
}
}
if (!string.IsNullOrEmpty(node.parentId) && node.parentId != "0")
{
ChangeParent(node, isChecked);
}
}
else if (isChecked == false) // 如果节点未选中
{
if (node.ChildNodes != null)
{
foreach (var item in node.ChildNodes)
{
item.IsChecked = false;
ChangeChild(item, isChecked);
}
}
if (!string.IsNullOrEmpty(node.parentId) && node.parentId != "0")
{
ChangeParent(node, isChecked);
}
}
}
/// <summary>
/// 过滤文件夹:[材料表][封面、目录、设计说明]
/// </summary>
/// <param name="treeModel"></param>
private void FilterNodes(TreeModel treeModel)
{
if (treeModel.ChildNodes != null && treeModel.ChildNodes.Any())
{
List<TreeModel> nodes = new List<TreeModel>();
foreach (var item in treeModel.ChildNodes)
{
if (item.NodeType == "0" && (item.ChildNodes == null || !item.ChildNodes.Any()))
{ nodes.Add(item); }//过滤无图纸文件的文件
if (item.Text.Equals("材料表") || item.Text.Equals("封面、目录、设计说明"))
{
nodes.Add(item);
}
else
{
FilterNodes(item);
}
}
foreach (var item in nodes)
{
treeModel.ChildNodes.Remove(item);
}
return;
}
else
{
return;
}
}
/// <summary>
/// 获取子节点的图纸数量
/// </summary>
/// <param name="treeModel"></param>
/// <returns></returns>
private int GetChildCount(TreeModel treeModel)
{
int count = 0;
List<TreeModel> listModel = new List<TreeModel>();
if (treeModel.ChildNodes != null && treeModel.ChildNodes.Any())
{
foreach (var item in treeModel.ChildNodes)
{
if (item.Text.ToLower().EndsWith(".dwg"))
{
count++;
}
else
{
var sum = GetChildCount(item);
count += sum;
}
}
return count;
}
else
{
return count;
}
}
/// <summary>
/// 获取选中的图纸列表
/// </summary>
/// <returns></returns>
private List<TreeModel> GetDwgIsChecked(List<TreeModel> listTree)
{
List<TreeModel> listModel = new List<TreeModel>();
foreach (var item in listTree)
{
if (item.Text.ToLower().EndsWith(".dwg") && item.IsChecked)
{
listModel.Add(item);
continue;
}
if (item.ChildNodes != null && item.ChildNodes.Any())
{
var list = GetDwgIsChecked(item.ChildNodes.ToList());
if (list.Any())
{ listModel.AddRange(list); }
}
}
return listModel;
}
#endregion
public async void OnDialogOpened(IDialogParameters parameters)
{
try
{
IsBusy = true;
BusyContent = "数据加载中...";
AddMsg($"图纸数据加载中...");
List<TreeModel> listDwg = new List<TreeModel>();
var list = await _ServiceDrawing.GetDrawingCatalogue();
GlobalObject.AllDrawings = list.ToList();
foreach (var item in list)
{
if (GetChildCount(item) > 0)
{
//把文件夹的放在图纸前面
var childs = item.ChildNodes.OrderBy(a => a.NodeType).ToList();
item.ChildNodes = new ObservableCollection<TreeModel>(childs);
//过滤材料表文件夹,过滤:封面、目录、设计说明
FilterNodes(item);
listDwg.Add(item);
}
}
listDrawings = new ObservableCollection<TreeModel>(listDwg);
AddMsg($"图纸数据加载完成");
}
catch (Exception ex)
{
MessageBox.Show("DialogOpened异常" + ex.Message);
}
finally
{
IsBusy = false;
}
}
/// <summary>
///改变节点选中状态
/// </summary>
/// <param name="o"></param>
public void onChangeCheck(object o)
{
var checkbox = o as System.Windows.Controls.CheckBox;
var id = checkbox.Tag.ToString();
var isChecked = checkbox.IsChecked.Value;
var node = TreeHelper.GetTreeModel(listDrawings.ToList(), id);
if (node == null)
{ return; }
if (isChecked) // 如果节点被选中
{
if (node.ChildNodes != null)
{
foreach (var item in node.ChildNodes)
{
ChangeChild(item, isChecked);
item.IsChecked = true;
}
}
if (!string.IsNullOrEmpty(node.parentId) && node.parentId != "0")
{
ChangeParent(node, isChecked);
}
}
else if (isChecked == false) // 如果节点未选中
{
if (node.ChildNodes != null)
{
foreach (var item in node.ChildNodes)
{
item.IsChecked = false;
ChangeChild(item, isChecked);
}
}
if (!string.IsNullOrEmpty(node.parentId) && node.parentId != "0")
{
ChangeParent(node, isChecked);
}
}
}
/// <summary>
/// 自动生成材料表
/// </summary>
/// <param name="o"></param>
public async void onStartGenerate(object o)
{
if (isGenerate)
{
MessageBox.Show("正在生成材料表,请勿操作...");
return;
}
var msg = string.Empty;
try
{
//AddText();
//return;
var list = GetDwgIsChecked(listDrawings.ToList());
List<DtoBomDrawings> listBom = new List<DtoBomDrawings>();
foreach (var item in list)
{
listBom.Add(new DtoBomDrawings()
{
DrawingFileID = item.ID,
DrawingFileName = item.Text,
AutoGenerate = "等待中..."
});
}
listBomDrawings = new ObservableCollection<DtoBomDrawings>(listBom);
isGenerate = true;
listMsg.Clear();
var progress = new Progress<MessageModel>(UpdateProgress);
await DoWorkAsync(progress, new CancellationTokenSource());
//foreach (var dwg in listBomDrawings)
//{
// if (dwg.AutoGenerate == "已生成")
// {
// AddMsg($"当前图纸[{dwg.DrawingFileName}]的材料表已绘制,跳至下一个图纸");
// continue;
// }
// if (dwg.AutoGenerate == "已存在")
// {
// AddMsg($"当前图纸[{dwg.DrawingFileName}]的材料表已存在,跳至下一个图纸");
// //continue;
// }
// if (dwg.AutoGenerate == "无材料信息")
// {
// AddMsg($"当前图纸[{dwg.DrawingFileName}]无材料信息,跳至下一个图纸");
// continue;
// }
// string folderpath = GlobalObject.GetDwgPath(dwg.DrawingFileID);
// string filepath = Path.Combine(GlobalObj.LocalWorkDir, GlobalObject.curProject.ProjectName, folderpath, $"材料表\\{dwg.DrawingFileName}");
// if (File.Exists(filepath))
// {
// AddMsg($"当前图纸[{dwg.DrawingFileName}]的材料表已存在,跳至下一个图纸", false);
// dwg.AutoGenerate = "已存在";
// //continue;
// }
// var listBomGroup = await _ServicePlotBOM.GetBOMGroupInfo(dwg.DrawingFileID);
// dwg.AutoGenerate = "正在生成...";
// AddMsg($"开始生成图纸[{dwg.DrawingFileName}]的材料表...");
// if (listBomGroup == null || !listBomGroup.Any())
// {
// AddMsg($"当前图纸无材料分组信息,跳至下一个图纸");
// dwg.AutoGenerate = "无材料信息";
// continue;
// }
// msg = GenerateBOM(dwg, filepath, listBomGroup);
// if (!string.IsNullOrEmpty(msg))
// {
// AddMsg($"材料表生成失败,信息:" + msg, false);
// continue;
// }
// //下载图标图纸文件
// //filePath = Path.Combine(GlobalObject.GetCacheFolder(), $"{tag.TagNumber}.dwg");
// //AddMsg($"元件图纸:{tag.TagNumber} 开始下载...");
// //msg = await _ServiceAnnexes.DownloadFile(filePath, obj.FolderId);
// //if (!string.IsNullOrEmpty(msg))
// //{
// // AddMsg($"元件图纸下载失败,信息:" + msg, false);
// // continue;
// //}
// //AddMsg($"元件图纸:{tag.TagNumber} 下载成功");
// //filePath = "D:\\BricsCAD\\Temp\\测试11.dwg";
// dwg.AutoGenerate = "已生成";
// AddMsg($"材料表生成成功!");
//}
//AddMsg("操作已完成!");
//isGenerate = false;
}
catch (Exception ex)
{
MessageBox.Show("异常:" + ex.Message);
isGenerate = false;
}
}
#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
{
var msg = string.Empty;
foreach (var dwg in listBomDrawings)
{
if (dwg.AutoGenerate == "已生成")
{
AddMsg($"当前图纸[{dwg.DrawingFileName}]的材料表已绘制,跳至下一个图纸");
continue;
}
if (dwg.AutoGenerate == "已存在")
{
//AddMsg($"当前图纸[{dwg.DrawingFileName}]的材料表已存在,跳至下一个图纸");
//continue;
}
if (dwg.AutoGenerate == "无材料信息")
{
AddMsg($"当前图纸[{dwg.DrawingFileName}]无材料信息,跳至下一个图纸");
continue;
}
string folderpath = GlobalObject.GetDwgPath(dwg.DrawingFileID);
string filepath = Path.Combine(GlobalObj.LocalWorkDir, GlobalObject.curProject.ProjectName, folderpath, $"材料表\\{dwg.DrawingFileName}");
if (File.Exists(filepath))
{
//AddMsg($"当前图纸[{dwg.DrawingFileName}]的材料表已存在,跳至下一个图纸", false);
//dwg.AutoGenerate = "已存在";
//continue;
}
var listBomGroup = await _ServicePlotBOM.GetBOMGroupInfo(dwg.DrawingFileID);
dwg.AutoGenerate = "正在生成...";
AddMsg($"开始生成图纸[{dwg.DrawingFileName}]的材料表...");
if (listBomGroup == null || !listBomGroup.Any())
{
AddMsg($"当前图纸无材料分组信息,跳至下一个图纸");
dwg.AutoGenerate = "无材料信息";
continue;
}
msg = await GenerateBOM(dwg, filepath, listBomGroup, cts);
if (!string.IsNullOrEmpty(msg))
{
AddMsg($"材料表生成失败,信息:" + msg, false);
continue;
}
//下载图标图纸文件
//filePath = Path.Combine(GlobalObject.GetCacheFolder(), $"{tag.TagNumber}.dwg");
//AddMsg($"元件图纸:{tag.TagNumber} 开始下载...");
//msg = await _ServiceAnnexes.DownloadFile(filePath, obj.FolderId);
//if (!string.IsNullOrEmpty(msg))
//{
// AddMsg($"元件图纸下载失败,信息:" + msg, false);
// continue;
//}
//AddMsg($"元件图纸:{tag.TagNumber} 下载成功");
//filePath = "D:\\BricsCAD\\Temp\\测试11.dwg";
dwg.AutoGenerate = "已生成";
AddMsg($"材料表生成成功!");
}
AddMsg("操作已完成!");
isGenerate = false;
}
catch (Exception ex)
{
MessageBox.Show("异常:" + ex.Message);
isGenerate = false;
}
}
#endregion
/// <summary>
/// 生成BOM表图纸
/// </summary>
/// <param name="filepath">材料表文件路径</param>
/// <param name="listBomGroup">位号分组信息</param>
/// <returns></returns>
private async Task<string> GenerateBOM(DtoBomDrawings dtoBOM, string filepath, List<BOMGroupInfo> listBomGroup, CancellationTokenSource cts)
{
string msg = string.Empty;
//1.创建材料表图纸文件
string folderpath = Path.GetDirectoryName(filepath);
string bomName = Path.Combine(folderpath, "BomTemp.dwg");
string dwgName = dtoBOM.DrawingFileName.Substring(0, dtoBOM.DrawingFileName.Length - 4);
var flag = General.CreateDwg(folderpath, dwgName);
if (!flag)
{
msg = $"材料表图纸创建失败,路径:{filepath}";
return msg;
}
//2.读取BOM表配置文件
string strJson = File.ReadAllText(Path.Combine(GlobalObject.GetDllPath(), "Template\\BomConfig.json"));
BomConfig bomComfig = JsonConvert.DeserializeObject<BomConfig>(strJson);
//3.判断位号分组信息需要分成几张材料表,分页生成材料表
List<DtoTextInfo> listTextInfo = new List<DtoTextInfo>();
List<DtoSymbolInfo> listSymbolInfo = new List<DtoSymbolInfo>();
decimal mod = (decimal)listBomGroup.Count / (decimal)bomComfig.RowCount;
var page = Math.Ceiling(mod);//总的A4表格页数 小数点向上取整数
#region 1
//for (int i = 0; i < page; i++)
//{
// listTextInfo = new List<DtoTextInfo>();
// listSymbolInfo = new List<DtoSymbolInfo>();
// int count = (i + 1) == page ? (listBomGroup.Count % bomComfig.RowCount) : bomComfig.RowCount;
// for (int j = 0; j < count; j++)
// {
// var index = i * bomComfig.RowCount + j;
// var bomInfo = listBomGroup[index];
// #region 序号
// var dto = new DtoTextInfo();
// dto.Text = (j + 1).ToString();
// dto.Position = new Point3d(bomComfig.Column1X, bomComfig.Column1Y - (j * bomComfig.RowHeight), 0);
// dto.IsMText = false;
// dto.Height = 4;
// dto.Width = 20;
// dto.Align = 1;
// listTextInfo.Add(dto);
// #endregion
// #region 图标
// var symbol = new DtoSymbolInfo();
// symbol.Upper_Text = bomInfo.upper_text;
// symbol.Lower_Text = bomInfo.lower_text;
// symbol.Position = new Point3d(bomComfig.Column2X, bomComfig.Column2Y - (j * bomComfig.RowHeight), 0);
// symbol.Scale = 0.02;
// listSymbolInfo.Add(symbol);
// #endregion
// #region 数量
// dto = new DtoTextInfo();
// dto.Text = (bomInfo.Count).ToString();
// dto.Position = new Point3d(bomComfig.Column3X, bomComfig.Column3Y - (j * bomComfig.RowHeight), 0);
// dto.IsMText = false;
// dto.Height = 4;
// dto.Width = 20;
// dto.Align = 1;
// listTextInfo.Add(dto);
// #endregion
// #region 型号
// dto = new DtoTextInfo();
// dto.Text = (bomInfo.Model).ToString();
// dto.Position = new Point3d(bomComfig.Column4X, bomComfig.Column4Y - (j * bomComfig.RowHeight), 0);
// dto.IsMText = false;
// dto.Height = 4;
// dto.Width = 20;
// dto.Align = 1;
// listTextInfo.Add(dto);
// #endregion
// #region 规格
// dto = new DtoTextInfo();
// dto.Text = (bomInfo.Spec).ToString();
// dto.Position = new Point3d(bomComfig.Column5X, bomComfig.Column5Y - (j * bomComfig.RowHeight), 0);
// dto.IsMText = false;
// dto.Height = 4;
// dto.Width = 20;
// dto.Align = 1;
// listTextInfo.Add(dto);
// #endregion
// #region 备注
// dto = new DtoTextInfo();
// dto.Text = (bomInfo.Remark).ToString();
// dto.Position = new Point3d(bomComfig.Column6X, bomComfig.Column6Y - (j * bomComfig.RowHeight), 0);
// dto.IsMText = false;
// dto.Height = 4;
// dto.Width = 20;
// dto.Align = 1;
// listTextInfo.Add(dto);
// #endregion
// }
// #region 把材料信息插入材料表图纸里
// var filename = bomName.Replace("BomTemp", "BomTemp" + (i + 1));
// File.Copy("Template\\材料表.dwg", filename, true);
// General.OpenDwg(filename);
// General.InsertTextInfo(listTextInfo);
// Thread.Sleep(1000);
// InsertSymbol(listSymbolInfo);
// listSymbolInfo.Clear();
// General.SaveAndCloseDwg(filename);
// Thread.Sleep(1000);
// //计算该页材料表是第几行第几列的
// //double x, y = 0;//坐标xy
// //decimal row = (decimal)i / (decimal)bomComfig.RowPageCount;//row表示行数在第几行
// //row = Math.Floor(row);
// //var column = i % bomComfig.RowPageCount;//column表示列数在第几列
// //x = column == 0 ? 0 : (double)column * bomComfig.Width;
// //y = row == 0 ? 0 : 0 - (double)row * bomComfig.Height;
// //var position = new Point3d(x, y, 0);
// //General.AddBlockDWG(filename, $"材料表{i + 1}", position);
// //Thread.Sleep(1000);
// #endregion
//}
//General.OpenDwg(filepath);
//Thread.Sleep(1000);
//for (int i = 0; i < page; i++)
//{
// var filename = bomName.Replace("BomTemp", "BomTemp" + (i + 1));
// //计算该页材料表是第几行第几列的
// double x, y = 0;//坐标xy
// decimal row = (decimal)i / (decimal)bomComfig.RowPageCount;//row表示行数在第几行
// row = Math.Floor(row);
// var column = i % bomComfig.RowPageCount;//column表示列数在第几列
// x = column == 0 ? 0 : (double)column * bomComfig.Width;
// y = row == 0 ? 0 : 0 - (double)row * bomComfig.Height;
// var position = new Point3d(x, y, 0);
// General.AddBlockDWG(filename, $"材料表{i + 1}", position);
// Thread.Sleep(1000);
//}
//General.SaveAndCloseDwg(filepath);
#endregion
#region 2
General.OpenDwg(filepath);
for (int i = 0; i < page; i++)
{
//计算该页材料表是第几行第几列的
double x, y = 0;//坐标xy
decimal row = (decimal)i / (decimal)bomComfig.RowPageCount;//row表示行数在第几行
row = Math.Floor(row);
var column = i % bomComfig.RowPageCount;//column表示列数在第几列
x = column == 0 ? 0 : (double)column * bomComfig.Width;
y = row == 0 ? 0 : 0 - (double)row * bomComfig.Height;
var position = new Point3d(x, y, 0);
File.Copy(Path.Combine(GlobalObject.GetDllPath(), "Template\\材料表.dwg"), bomName, true);
General.AddBlockDWG(bomName, $"材料表{i + 1}", position);
listTextInfo = new List<DtoTextInfo>();
listSymbolInfo = new List<DtoSymbolInfo>();
int count = (i + 1) == page ? (listBomGroup.Count % bomComfig.RowCount) : bomComfig.RowCount;
for (int j = 0; j < count; j++)
{
var index = i * bomComfig.RowCount + j;
var bomInfo = listBomGroup[index];
#region
var dto = new DtoTextInfo();
dto.Text = (j + 1).ToString();
dto.Position = new Point3d(bomComfig.Column1X + x, bomComfig.Column1Y - (j * bomComfig.RowHeight) + y, 0);
dto.IsMText = false;
dto.Height = 4;
dto.Width = 20;
dto.Align = 1;
listTextInfo.Add(dto);
#endregion
#region
var symbol = new DtoSymbolInfo();
symbol.Upper_Text = bomInfo.upper_text;
symbol.Lower_Text = bomInfo.lower_text;
symbol.Position = new Point3d(bomComfig.Column2X + x, bomComfig.Column2Y - (j * bomComfig.RowHeight) + y, 0);
symbol.Scale = string.IsNullOrWhiteSpace(bomInfo.lower_text) ? 1 : 0.02;
listSymbolInfo.Add(symbol);
#endregion
#region
dto = new DtoTextInfo();
dto.Text = (bomInfo.Count).ToString();
dto.Position = new Point3d(bomComfig.Column3X + x, bomComfig.Column3Y - (j * bomComfig.RowHeight) + y, 0);
dto.IsMText = false;
dto.Height = 4;
dto.Width = 20;
dto.Align = 1;
listTextInfo.Add(dto);
#endregion
#region
dto = new DtoTextInfo();
dto.Text = (bomInfo.Model).ToString();
dto.Position = new Point3d(bomComfig.Column4X + x, bomComfig.Column4Y - (j * bomComfig.RowHeight) + y, 0);
dto.IsMText = false;
dto.Height = 4;
dto.Width = 20;
dto.Align = 1;
listTextInfo.Add(dto);
#endregion
#region
dto = new DtoTextInfo();
dto.Text = (bomInfo.Spec).ToString();
dto.Position = new Point3d(bomComfig.Column5X + x, bomComfig.Column5Y - (j * bomComfig.RowHeight) + y, 0);
dto.IsMText = false;
dto.Height = 4;
dto.Width = 20;
dto.Align = 1;
listTextInfo.Add(dto);
#endregion
#region
dto = new DtoTextInfo();
dto.Text = (bomInfo.Remark).ToString();
dto.Position = new Point3d(bomComfig.Column6X + x, bomComfig.Column6Y - (j * bomComfig.RowHeight) + y, 0);
dto.IsMText = false;
dto.Height = 4;
dto.Width = 20;
dto.Align = 1;
listTextInfo.Add(dto);
#endregion
}
#region
General.InsertTextInfo(listTextInfo); //插入文本信息
await InsertSymbol(listSymbolInfo, cts);//插入图标信息
listSymbolInfo.Clear();
#endregion
}
#endregion
General.SaveAndCloseDwg(filepath);
File.Delete(bomName);
General.OpenDwg(filepath);
return msg;
}
/// <summary>
/// 插入图标
/// </summary>
/// <returns></returns>
private async Task<bool> InsertSymbol(List<DtoSymbolInfo> listSymbolInfo, CancellationTokenSource cts)
{
#region
var filePath = Path.Combine(GlobalObject.GetCacheFolder(), $"symbol.dwg");
//默认上下图块
var blockName = "图标图块";
string msg = string.Empty;
foreach (var symbol in listSymbolInfo)
{
var symbolPath = Path.Combine(GlobalObject.GetDllPath(), "Template\\常规矩形两行图块.dwg");
if (string.IsNullOrWhiteSpace(symbol.Lower_Text))
{ symbolPath = Path.Combine(GlobalObject.GetDllPath(), "Template\\常规矩形单行图块.dwg"); }
if (!File.Exists(symbolPath))
{
AddMsg($"默认图标图块找不到:{symbolPath}", false);
continue;
}
File.Copy(symbolPath, filePath, true);
AddMsg($"开始插入图标,上:{symbol.Upper_Text},下:{symbol.Lower_Text}...");
msg = General.UpdateCableNo(filePath, new List<string>(), "", true, symbol.Upper_Text, symbol.Lower_Text);
if (!string.IsNullOrEmpty(msg))
{
AddMsg($"图标修改上下信息失败,上:{symbol.Upper_Text},下:{symbol.Lower_Text},信息:{msg}", false);
continue;
}
var objId = General.AddBomSymbolDWG(filePath, blockName, symbol.Scale, symbol.Position);
if (!objId.IsNull)
{ AddMsg($"图标插入成功!"); }
else { AddMsg($"图标插入失败", false); }
await Task.Delay(time, cts.Token);
}
#endregion
return true;
}
#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("HH:mm:ss") + "==>> " + msg;
tb.Foreground = isSucc ? Brushes.LightSeaGreen : Brushes.Red;
listMsg.Add(tb);
}
catch (Exception ex)
{
MessageBox.Show("添加提示信息异常:" + ex.Message);
}
}
#endregion
}
}