Imports System.IO
Imports System.Threading
Imports System.Threading.Channels
Imports System.Windows.Forms.VisualStyles.VisualStyleElement
Imports CorelDRAW
Imports CorelDRAW.RuningLog
Imports Newtonsoft.Json
Imports StackExchange.Redis
Imports VGCore
Public Class CorelDRAW
Public M_Redisip As String = "127.0.0.1"
Public M_Redisport As Integer = 10079 ' 6379 ' 10079 ' 10079 '10079 ' 10079
Public M_Redispassword As String = "blw@redis-ser@123" ' "" ' "blw@redis-ser@123" '"blw@redis-ser@123" ' "blw@redis-ser@123" ' "" '
'redis消息队列
Public M_RedisQueue As Queue
'事件处理线程
Public M_EventThread As Thread
'服务器文件路径
Private M_ServerPath As String = "R:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic\" ' "D:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic\" ' "R:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic\" ' "R:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic\" '"D:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic\" ' "R:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic\" '
'素材库路径
Private M_MaterialPath As String = "R:\Canvas\material\" '"D:\Canvas\material\" ' "R:\Canvas\material\" ' "R:\Canvas\material\" ' "R:\Canvas\material\" '
'成平文件路径
Private M_TplPath As String = "D:\CorelDRAW\"
Public G_RedisSub, G_Redislish As RedisSubscriber
'发布字段
Public G_Publish As String = ""
Public G_Subscribe As String = ""
Public G_OldSubscribe As String = ""
'日志对象
Public G_Log As RuningLog
Public APP As Object
Public G_LibDoc As Document
'数据库连接字符串
Public LocalConnString As String = "server=10.8.8.208;database=cdr_library;charset=utf8;uid=BLWlog;pwd=Blw@1234;port=16036"
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'定义一个画布
Text = "CorelDRAW" & "_" & System.Windows.Forms.Application.ProductVersion
M_RedisQueue = New Queue()
'启动事件处理线程
M_EventThread = New Thread(AddressOf EventThread)
M_EventThread.Start()
'Dim t As Type = Type.GetTypeFromProgID("CorelDRAW.Application.22")
'If t IsNot Nothing Then
' Console.WriteLine("COM 已注册,可以连接!")
'Else
' Console.WriteLine("COM 未注册!")
'End If
APP = New Application()
Thread.Sleep(300)
APP.Visible = False
' Dim MaterialPath As String = M_MaterialPath & "素材模板.cdr"
'G_LibDoc = APP.OpenDocument(MaterialPath, False)
G_Log = New RuningLog(RichTextBox1, System.Windows.Forms.Application.StartupPath & "\log")
GetSeting()
initRedisSubscriber(G_Subscribe, G_OldSubscribe)
initRedisPublisher()
End Sub
Private Sub EventThread()
Dim item As RedisMsgNode
While True
If M_RedisQueue.Count > 0 Then
item = M_RedisQueue.Dequeue()
If item Is Nothing Then Continue While
Select Case item.MsgType
Case 1
Dim MsgNode = JsonConvert.DeserializeObject(Of RedisInfoNode)(item.MsgNode.ToString)
DisposeRedisMsgNode1(MsgNode)
Case 2
Dim MsgNode = JsonConvert.DeserializeObject(Of PreviewRoomTypePanel)(item.MsgNode.ToString)
DisposeOverviewRedisMsgNode(MsgNode)
'DisposeRedisMsgNode2(MsgNode)
End Select
End If
System.Threading.Thread.Sleep(10)
End While
End Sub
Sub DisposeRedisMsgNode1(item As RedisInfoNode)
Dim gLogNode As LogNode
Try
gLogNode = New LogNode($"开始进行用户【{item.User}】_[{item.ProjectName}]项目[{item.TemplateName.Replace("Mode_", "") }]图像生成!", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
'gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
If HandleNodeInformation3(item) Then
gLogNode = New LogNode($"开始进行用户【{item.User}】_[{item.ProjectName}]项目[{item.TemplateName.Replace("Mode_", "") }]图像生成成功!", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
'gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Else
gLogNode = New LogNode($"开始进行用户【{item.User}】_[{item.ProjectName}]项目[{item.TemplateName.Replace("Mode_", "") }]图像生成失败!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
End If
Catch ex As Exception
Dim RsNode As New RedisSendNode
RsNode.User = item.User
RsNode.ProjectName = item.ProjectName
RsNode.ProjectId = item.ProjectId
RsNode.PictureNum = item.PictureNum
RsNode.Status = RedisSendNode.StatusType.SerializeFail
RsNode.Process = item.Process
RsNode.Msg = "序列化数据错误!"
Dim RMNode As New RedisMsgNode
RMNode.MsgType = 1
RMNode.MsgNode = RsNode
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"序列化数据错误!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
APP = New Application()
Thread.Sleep(500)
End Try
End Sub
Sub DisposeRedisMsgNode2(node As PreviewRoomTypePanel)
Dim gLogNode As LogNode
Dim filedir As String = M_ServerPath ' "D:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic"
Dim RsNode As New RedisSendNode
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.PictureNum = node.picNum
Dim RMNode As New RedisMsgNode
RMNode.MsgType = 2
RMNode.MsgNode = RsNode
Try
InpotMessage1("1、文档初始化")
gLogNode = New LogNode($"生成酒店房间面板预览文档!", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
G_Log.AddLogNode(gLogNode)
Dim doc As Document
Try
doc = APP.CreateDocument()
doc.Unit = cdrUnit.cdrMillimeter ' 设置单位为毫米
Catch ex As Exception
APP = New Application()
Thread.Sleep(1000)
APP.Visible = False
doc = APP.CreateDocument()
doc.Unit = cdrUnit.cdrMillimeter ' 设置单位为毫米
End Try
InpotMessage1("3、打开模板库并创建新文件等待构建图像")
InpotMessage1("2、酒店标题生成")
Dim hotelName As String = ""
If node.project IsNot Nothing AndAlso node.project.Count > 0 Then
hotelName = node.project(0).hotel_name
RsNode.Guid = node.project(0).guid
End If
InpotMessage1("创建酒店标题文本")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = "创建酒店标题失败!!"
'Dim hotelText As Shape = doc.ActiveLayer.CreateArtisticText(0, 0, hotelName)
Dim remark As String() = {"思源黑体", "48"}
Dim hotelText As Shape = CreateTextImage2(doc.ActiveLayer, hotelName, remark)
hotelText.CenterY = 0
hotelText.LeftX = 0
'With hotelText.Text.Properties
' .Font = "Source Han Sans SC"
' .Size = 48
'End With
' 计算当前文档高度
Dim currentY As Double = hotelText.CenterY - 20 ' 标题底部向下50mm
InpotMessage1("3、数据分组处理")
Dim roomGroups As Dictionary(Of String, List(Of Panel)) = New Dictionary(Of String, List(Of Panel))()
For Each panel As Panel In node.panels
If Not roomGroups.ContainsKey(panel.room_name) Then
roomGroups.Add(panel.room_name, New List(Of Panel)())
End If
roomGroups(panel.room_name).Add(panel)
Next
InpotMessage1("4、房型分类处理")
For Each roomName As String In roomGroups.Keys
InpotMessage1("创建房型标题文本")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = "创建酒店房型标题失败!!"
remark = {"思源黑体", "28"}
Dim roomText As Shape = CreateTextImage2(doc.ActiveLayer, roomName, remark)
roomText.CenterY = currentY
roomText.LeftX = 0
'Dim roomText As Shape = doc.ActiveLayer.CreateArtisticText(0, currentY, roomName)
'With roomText.Text.Properties
' .Font = "Source Han Sans SC"
' .Size = 28
'End With
currentY = roomText.CenterY - (roomText.OriginalHeight / 2) - 10 ' 房型标题底部向下30mm
Dim currentX As Double = 0 ' 当前行的X坐标
Dim maxHeight As Double = 0 ' 当前行最高图像的高度
InpotMessage1("遍历该房型对应的所有panel")
For Each panel As Panel In roomGroups(roomName)
Dim cdr_filename As String = $"{filedir}\{panel.cdr_filename}".Replace("\\", "\")
InpotMessage1("5、CDR文件图像处理")
If File.Exists(cdr_filename) Then
InpotMessage1("打开CDR文件")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = $"拷贝文件{vbCrLf}{cdr_filename}{vbCrLf}中的面板图像失败!!"
Dim cdrDoc As Document = APP.OpenDocument(cdr_filename, False)
If cdrDoc.Pages.Count > 0 AndAlso cdrDoc.Pages(1).ActiveLayer.Shapes.Count > 0 Then
InpotMessage1("复制第一个图像")
Dim cdrShape As Shape = cdrDoc.Pages(1).ActiveLayer.Shapes(1)
'cdrShape.Copy()
shapeCopy(cdrShape)
InpotMessage1("粘贴到当前文档")
Dim pastedShape As Shape = doc.ActiveLayer.Paste() 'doc.ActiveLayer.Shapes(doc.ActiveLayer.Shapes.Count)
InpotMessage1("设置图像位置")
pastedShape.LeftX = currentX
pastedShape.CenterY = currentY - (pastedShape.OriginalHeight / 2)
InpotMessage1("6、属性文本生成")
InpotMessage1("生成panel_list_name文本")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = $"生成名称文本图像失败:{panel.panel_list_name} !!"
remark = {"思源黑体", "24"}
Dim listNameText As Shape = CreateTextImage2(doc.ActiveLayer, "名称:" & panel.panel_list_name, remark)
Dim textY As Double = pastedShape.CenterY - (pastedShape.OriginalHeight / 2) - 10
listNameText.CenterY = textY
listNameText.LeftX = currentX
'Dim listNameText As Shape = doc.ActiveLayer.CreateArtisticText(currentX, textY, "名称:" & panel.panel_list_name)
'With listNameText.Text.Properties
' .Font = "Source Han Sans SC"
' .Size = 12
'End With
InpotMessage1("生成position文本")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = $"生成位置文本图像失败:{panel.position} !!"
Dim positionText As Shape = CreateTextImage2(doc.ActiveLayer, "位置:" & panel.position, remark)
textY = listNameText.CenterY - (listNameText.OriginalHeight / 2) - 10
positionText.CenterY = textY
positionText.LeftX = currentX
'Dim positionText As Shape = doc.ActiveLayer.CreateArtisticText(currentX, textY + 10, "位置:" & panel.position)
'With positionText.Text.Properties
' .Font = "Source Han Sans SC"
' .Size = 12
'End With
InpotMessage1("生成carving_quantity文本")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = $"生成数量文本图像失败:{panel.carving_quantity} !!"
Dim quantityText As Shape = CreateTextImage2(doc.ActiveLayer, "数量:" & panel.carving_quantity, remark)
textY = positionText.CenterY - (positionText.OriginalHeight / 2) - 10
quantityText.CenterY = textY
quantityText.LeftX = currentX
'Dim quantityText As Shape = doc.ActiveLayer.CreateArtisticText(currentX, textY + 20, "数量:" & panel.carving_quantity)
'With quantityText.Text.Properties
' .Font = "Source Han Sans SC"
' .Size = 12
'End With
InpotMessage1("7、图文组合")
pastedShape.Selected = True
listNameText.Selected = True
positionText.Selected = True
quantityText.Selected = True
Dim group As Shape = doc.SelectionRange.Group()
group.Name = pastedShape.Name 'Path.GetFileNameWithoutExtension(panel.cdr_filename)
group.Selected = False
pastedShape.Selected = False
listNameText.Selected = False
positionText.Selected = False
quantityText.Selected = False
InpotMessage1("更新X坐标,为下一个图像留出50mm间距")
InpotMessage1("计算当前行的最大高度")
If group.OriginalHeight > maxHeight Then
maxHeight = group.OriginalHeight
End If
currentX += pastedShape.SizeWidth + 50
Else
RsNode.Status = RedisSendNode.StatusType.MaterialNotExist
RsNode.Msg = $"未找到文件{vbCrLf}{cdr_filename}{vbCrLf}中的图像!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"生成酒店房间面板预览文档失败:{ RsNode.Msg}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
InpotMessage1("关闭CDR文件")
cdrDoc.Close()
Else
RsNode.Status = RedisSendNode.StatusType.MaterialNotExist
RsNode.Msg = $"文件{vbCrLf}{cdr_filename}{vbCrLf}不存在!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"生成酒店房间面板预览文档失败:{ RsNode.Msg}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
Next
' 更新Y坐标,为下一个房型留出50mm间距
currentY = currentY - maxHeight - 20
Next
InpotMessage1("8、文档保存")
RsNode.Status = RedisSendNode.StatusType.SaveFileFail
RsNode.Msg = $"生成文件失败 !!"
Dim savePath As String = $"{filedir}\{hotelName}\{Now:yyyyMMdd}"
If Not Directory.Exists(savePath) Then
Directory.CreateDirectory(savePath)
End If
Dim cdrFileName As String = $"{node.picNum}.cdr"
Dim cdrFilePath As String = Path.Combine(savePath, cdrFileName)
Dim ssao As New StructSaveAsOptions
ssao.Filter = VGCore.cdrFilter.cdrCDR
ssao.Range = VGCore.cdrExportRange.cdrAllPages
ssao.Version = VGCore.cdrFileVersion.cdrVersion19
doc.SaveAs(cdrFilePath, ssao)
'InpotMessage1("9、文档导出")
'Dim pltFileName As String = $"PreviewRoomTypePanel{node.picNum}.plt"
'Dim pltFilePath As String = Path.Combine(savePath, pltFileName)
'doc.Export(pltFilePath, cdrExportFileFormat.cdrPLT)
InpotMessage1("关闭文档")
doc.Close()
RsNode.Status = RedisSendNode.StatusType.Success
RsNode.Msg = "Ok"
RsNode.CdrPath = cdrFilePath.Replace(filedir & "\", "")
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
InpotMessage1($"18、向Redis写入生成成功信息")
gLogNode = New LogNode($"成功生成酒店房间面板预览文档:{cdrFilePath}", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
G_Log.AddLogNode(gLogNode)
Return
Catch ex As Exception
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"生成酒店房间面板预览文档失败:{ex.Message}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
End Try
End Sub
Sub DisposeOverviewRedisMsgNode(node As PreviewRoomTypePanel)
Dim gLogNode As LogNode
Dim filedir As String = M_ServerPath ' "D:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic"
Dim RsNode As New RedisSendNode
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.PictureNum = node.picNum
Dim RMNode As New RedisMsgNode
RMNode.MsgType = 2
RMNode.MsgNode = RsNode
Dim hotelText, hotelnodeText, kuang_lin As Shape
Dim nodeText As String
Dim bProject As Project = Nothing
Dim remark As String() = {"思源黑体", "36"}
Try
InpotMessage1("1、文档初始化")
gLogNode = New LogNode($"生成酒店房间面板预览文档!", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
G_Log.AddLogNode(gLogNode)
Dim doc As Document
Try
doc = APP.CreateDocument()
doc.Unit = cdrUnit.cdrMillimeter ' 设置单位为毫米
Catch ex As Exception
APP = New Application()
Thread.Sleep(1000)
APP.Visible = False
doc = APP.CreateDocument()
doc.Unit = cdrUnit.cdrMillimeter ' 设置单位为毫米
End Try
InpotMessage1("2、打开总览框 模板 拷贝模版")
Dim overviewFilePath As String = Path.Combine(M_MaterialPath, "BLV_总览框.cdr")
Dim overviewDoc As Document = Nothing
Dim previewBox As Shape = Nothing
Dim currentY As Double
Dim hotelName As String = ""
Dim projectTitleShape As Shape = Nothing
If Not File.Exists(overviewFilePath) Then
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Msg = $"未找到文件{vbCrLf}BLV_总览框.cdr!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"BLV_总览框.cdr文件不存在::{ overviewFilePath}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
doc.Close()
Return
Else
InpotMessage1("3、处理标题信息")
If node.project IsNot Nothing AndAlso node.project.Count > 0 Then
hotelName = node.project(0).hotel_name
bProject = node.project(0)
Else
RsNode.Status = RedisSendNode.StatusType.SerializeFail
RsNode.Msg = $"未找到标题信息!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"生成酒店房间面板预览文档失败:{ RsNode.Msg}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
doc.Close()
Return
End If
Dim chpcolor As Color = New Color
chpcolor.RGBAssign(0, 140, 140)
Dim ZcdrDoc As Document = APP.OpenDocument(overviewFilePath, False)
If ZcdrDoc.Pages.Count > 0 AndAlso ZcdrDoc.Pages(1).ActiveLayer.Shapes.Count > 0 Then
hotelText = ZcdrDoc.Pages(1).ActiveLayer.Shapes(1)
'将hotelText 拷贝到doc
InpotMessage1("将总览框拷贝文件中")
shapeCopy(hotelText)
hotelText = doc.ActiveLayer.Paste()
'设置总览框图形中心点与文档中心点一致
hotelText.CenterX = doc.ActivePage.CenterX
hotelText.CenterY = doc.ActivePage.CenterY
hotelText.TopY = doc.ActivePage.TopY
'设置总览框图形原点 为垂直居上水平居中
ZcdrDoc.Close()
'查找hotelText中名称为 Project_Title 的形状
hotelText.Ungroup()
For Each shape As Shape In doc.Pages(1).ActiveLayer.Shapes
If shape.Name.ToLower.Equals("Project_Title".ToLower) Then
projectTitleShape = shape
'遍历其子形状,查找名称为 PreviewBox 的形状
End If
'kuang_lin
If shape.Name.ToLower.Equals("kuang_lin".ToLower) Then
kuang_lin = shape
End If
Next
For Each childShape As Shape In projectTitleShape.Shapes
nodeText = ""
'当名称分别为Txt_EnglishFont、Txt_SocketSeries、Txt_ChineseFont、Txt_SwitchSeries、Txt_Data、Txt_Protocol、Txt_SocketSizeText、Txt_SwitchSizeText、Txt_ProjectName时
Select Case childShape.Name.ToLower
Case "Txt_EnglishFont".ToLower
nodeText = $"{bProject.en_font} {bProject.en_font_size.ToString}PT"
hotelnodeText = CreateTextImage2(doc.ActiveLayer, nodeText, remark)
hotelnodeText.Fill.ApplyUniformFill(chpcolor)
'移动到childShape对象中心位置
hotelnodeText.CenterX = childShape.CenterX
hotelnodeText.CenterY = childShape.CenterY
Case "Txt_SocketSeries".ToLower
nodeText = bProject.socket_series
hotelnodeText = CreateTextImage2(doc.ActiveLayer, nodeText, remark)
hotelnodeText.Fill.ApplyUniformFill(chpcolor)
hotelnodeText.CenterX = childShape.CenterX
hotelnodeText.CenterY = childShape.CenterY
Case "Txt_ChineseFont".ToLower
nodeText = $"{bProject.cn_font} {bProject.cn_font_size.ToString}PT"
hotelnodeText = CreateTextImage2(doc.ActiveLayer, nodeText, remark)
hotelnodeText.Fill.ApplyUniformFill(chpcolor)
hotelnodeText.CenterX = childShape.CenterX
hotelnodeText.CenterY = childShape.CenterY
Case "Txt_SwitchSeries".ToLower
nodeText = bProject.switch_series
hotelnodeText = CreateTextImage2(doc.ActiveLayer, nodeText, remark)
hotelnodeText.Fill.ApplyUniformFill(chpcolor)
hotelnodeText.CenterX = childShape.CenterX
hotelnodeText.CenterY = childShape.CenterY
Case "Txt_Data".ToLower
nodeText = node.RecordDate
hotelnodeText = CreateTextImage2(doc.ActiveLayer, nodeText, remark)
hotelnodeText.Fill.ApplyUniformFill(chpcolor)
hotelnodeText.CenterX = childShape.CenterX
hotelnodeText.CenterY = childShape.CenterY
Case "Txt_Protocol".ToLower
nodeText = bProject.protocol
hotelnodeText = CreateTextImage2(doc.ActiveLayer, nodeText, remark)
hotelnodeText.Fill.ApplyUniformFill(chpcolor)
hotelnodeText.CenterX = childShape.CenterX
hotelnodeText.CenterY = childShape.CenterY
Case "Txt_SocketSizeText".ToLower
nodeText = bProject.SocketSizeText.Replace("_", vbCrLf)
hotelnodeText = CreateTextImage2(doc.ActiveLayer, nodeText, remark)
hotelnodeText.Fill.ApplyUniformFill(chpcolor)
hotelnodeText.CenterX = childShape.CenterX
hotelnodeText.CenterY = childShape.CenterY
Case "Txt_SwitchSizeText".ToLower
nodeText = bProject.SwitchSizeText.Replace("_", vbCrLf)
hotelnodeText = CreateTextImage2(doc.ActiveLayer, nodeText, remark)
hotelnodeText.Fill.ApplyUniformFill(chpcolor)
hotelnodeText.CenterX = childShape.CenterX
hotelnodeText.CenterY = childShape.CenterY
Case "Txt_ProjectName".ToLower
nodeText = bProject.project_name
hotelnodeText = CreateTextImage2(doc.ActiveLayer, nodeText, remark)
hotelnodeText.Fill.ApplyUniformFill(chpcolor)
hotelnodeText.CenterX = childShape.CenterX
hotelnodeText.CenterY = childShape.CenterY
End Select
Next
Else
RsNode.Status = RedisSendNode.StatusType.MaterialNotExist
RsNode.Msg = $"未找到文件{vbCrLf}{overviewFilePath}{vbCrLf}中的图像!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"生成酒店房间面板预览文档失败:{ RsNode.Msg}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
doc.Close()
Return
End If
End If
InpotMessage1("4、标题信息处理完成")
InpotMessage1("5、数据分组处理")
' 设置起始坐标:Project_Title对象的左边值作为起始X,下边值+50mm作为起始Y
Dim startX As Double = projectTitleShape.LeftX
Dim startY As Double = projectTitleShape.BottomY - 50 ' 起始Y坐标:Project_Title对象的下边值+50mm
Dim Panelli As List(Of Panel)
Dim roomGroups As Dictionary(Of String, List(Of Panel)) = New Dictionary(Of String, List(Of Panel))()
For Each panel As Panel In node.panels
If Not roomGroups.ContainsKey(panel.room_name) Then
Panelli = New List(Of Panel)()
roomGroups.Add(panel.room_name, Panelli)
Else
Panelli = roomGroups(panel.room_name)
End If
'roomGroups(panel.room_name).Add(panel)
SortPanelListBySize(Panelli, panel)
Console.WriteLine($"添加面板:{panel.room_name} - {panel.model_type}")
Next
InpotMessage1("6、房型分类处理")
currentY = startY ' 设置当前Y坐标为起始Y
For Each roomName As String In roomGroups.Keys
InpotMessage1("创建房型标题文本")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = "创建酒店房型标题失败!!"
remark = {"思源黑体", "38"}
Dim roomText As Shape = CreateTextImage2(doc.ActiveLayer, roomName, remark)
roomText.CenterY = currentY
roomText.LeftX = startX ' 房型标题左对齐到起始X
' 房型标题下方留出空间
currentY = roomText.CenterY - (roomText.OriginalHeight / 2) - 10
Dim currentX As Double = startX + 50 ' 当前行的X坐标,行左边距50mm
Dim maxHeight As Double = 0 ' 当前行最高面板高度
Dim rowWidth As Double = 0 ' 当前行已排布宽度
Dim firstPanelInRow As Boolean = True ' 是否是行内第一个面板
InpotMessage1("遍历该房型对应的所有panel")
For Each panel As Panel In roomGroups(roomName)
Dim cdr_filename As String = $"{filedir}\{panel.cdr_filename}".Replace("\\", "\")
InpotMessage1("7、CDR文件图像处理")
If File.Exists(cdr_filename) Then
InpotMessage1("打开CDR文件")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = $"拷贝文件{vbCrLf}{cdr_filename}{vbCrLf}中的面板图像失败!!"
Dim cdrDoc As Document = APP.OpenDocument(cdr_filename, False)
If cdrDoc.Pages.Count > 0 AndAlso cdrDoc.Pages(1).ActiveLayer.Shapes.Count > 0 Then
InpotMessage1("复制第一个图像")
Dim cdrShape As Shape = cdrDoc.Pages(1).ActiveLayer.Shapes(1)
'cdrShape.Copy()
shapeCopy(cdrShape)
InpotMessage1("粘贴到当前文档")
Dim pastedShape As Shape = doc.ActiveLayer.Paste() 'doc.ActiveLayer.Shapes(doc.ActiveLayer.Shapes.Count)
'延时(500)
Thread.Sleep(100)
pastedShape.Name = $"{roomName}_{ pastedShape.Name }"
' 计算面板宽度
Dim panelWidth As Double = pastedShape.SizeWidth
' 检查是否需要换行(当前行已排布宽度 + 新面板宽度 + 间距 > 1300mm)
If Not firstPanelInRow AndAlso (rowWidth + panelWidth + 50) > 1250 Then
' 换行:换行间距30mm+上一行最高面板高度
currentY = currentY - maxHeight - 30
currentX = startX + 50 ' 重置X坐标到行左边距
maxHeight = 0 ' 重置最大高度
rowWidth = 0 ' 重置行宽度
firstPanelInRow = True ' 重置为行内第一个面板
End If
InpotMessage1("设置图像位置")
pastedShape.LeftX = currentX
pastedShape.CenterY = currentY - (pastedShape.OriginalHeight / 2)
InpotMessage1("8、属性文本生成")
InpotMessage1("生成panel_list_name文本")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = $"生成名称文本图像失败:{panel.panel_list_name} !!"
remark = {"思源黑体", "24"}
Dim listNameText As Shape = CreateTextImage2(doc.ActiveLayer, "名称:" & panel.panel_list_name, remark)
Dim textY As Double = pastedShape.CenterY - (pastedShape.OriginalHeight / 2) - 10
listNameText.CenterY = textY
listNameText.LeftX = currentX
'Dim listNameText As Shape = doc.ActiveLayer.CreateArtisticText(currentX, textY, "名称:" & panel.panel_list_name)
'With listNameText.Text.Properties
' .Font = "Source Han Sans SC"
' .Size = 12
'End With
InpotMessage1("生成position文本")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = $"生成位置文本图像失败:{panel.position} !!"
Dim positionText As Shape = CreateTextImage2(doc.ActiveLayer, "位置:" & panel.position, remark)
textY = listNameText.CenterY - (listNameText.OriginalHeight / 2) - 10
positionText.CenterY = textY
positionText.LeftX = currentX
'Dim positionText As Shape = doc.ActiveLayer.CreateArtisticText(currentX, textY + 10, "位置:" & panel.position)
'With positionText.Text.Properties
' .Font = "Source Han Sans SC"
' .Size = 12
'End With
InpotMessage1("生成carving_quantity文本")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = $"生成数量文本图像失败:{panel.carving_quantity} !!"
Dim quantityText As Shape = CreateTextImage2(doc.ActiveLayer, "数量:" & panel.carving_quantity, remark)
textY = positionText.CenterY - (positionText.OriginalHeight / 2) - 10
quantityText.CenterY = textY
quantityText.LeftX = currentX
'Dim quantityText As Shape = doc.ActiveLayer.CreateArtisticText(currentX, textY + 20, "数量:" & panel.carving_quantity)
'With quantityText.Text.Properties
' .Font = "Source Han Sans SC"
' .Size = 12
'End With
InpotMessage1("9、图文组合")
pastedShape.Selected = True
listNameText.Selected = True
positionText.Selected = True
quantityText.Selected = True
Dim group As Shape = doc.SelectionRange.Group()
group.Name = pastedShape.Name 'Path.GetFileNameWithoutExtension(panel.cdr_filename)
group.Selected = False
pastedShape.Selected = False
listNameText.Selected = False
positionText.Selected = False
quantityText.Selected = False
InpotMessage1("计算当前行的最大高度")
If group.OriginalHeight > maxHeight Then
maxHeight = group.OriginalHeight
End If
InpotMessage1("更新行宽度和X坐标")
If firstPanelInRow Then
rowWidth = panelWidth
firstPanelInRow = False
Else
rowWidth += panelWidth + 50 ' 行内面板间距50mm
End If
currentX += panelWidth + 50 ' 更新X坐标,为下一个面板留出50mm间距
Else
RsNode.Status = RedisSendNode.StatusType.MaterialNotExist
RsNode.Msg = $"未找到文件{vbCrLf}{cdr_filename}{vbCrLf}中的图像!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"生成酒店房间面板预览文档失败:{ RsNode.Msg}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
InpotMessage1("关闭CDR文件")
cdrDoc.Close()
Else
RsNode.Status = RedisSendNode.StatusType.MaterialNotExist
RsNode.Msg = $"文件{vbCrLf}{cdr_filename}{vbCrLf}不存在!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"生成酒店房间面板预览文档失败:{ RsNode.Msg}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
Next
' 更新Y坐标,为下一个房型留出50mm间距
currentY = currentY - maxHeight - 20
Next
InpotMessage1("10、文档保存")
RsNode.Status = RedisSendNode.StatusType.SaveFileFail
RsNode.Msg = $"生成文件失败 !!"
Dim savePath As String = $"{filedir}\{hotelName}\{Now:yyyyMMdd}"
If Not Directory.Exists(savePath) Then
Directory.CreateDirectory(savePath)
End If
''判断kuang_lin是否为空
If kuang_lin IsNot Nothing Then
Dim heigth As Double = kuang_lin.TopY - currentY + 50
Dim kuang_linTopY As Double = kuang_lin.TopY
kuang_lin.SizeHeight = heigth
kuang_lin.TopY = kuang_linTopY
'kuang_lin.TransformationMatrix.Rotate()
'' 可选:设置变换原点的可见性
'kuang_lin.TransformationOriginVisible = True
End If
Dim cdrFileName As String = $"{node.picNum}.cdr"
Dim cdrFilePath As String = Path.Combine(savePath, cdrFileName)
Dim ssao As New StructSaveAsOptions
ssao.Filter = VGCore.cdrFilter.cdrCDR
ssao.Range = VGCore.cdrExportRange.cdrAllPages
ssao.Version = VGCore.cdrFileVersion.cdrVersion19
doc.SaveAs(cdrFilePath, ssao)
Dim nngroup As Shape = doc.Pages(1).ActiveLayer.Shapes.All.Group()
nngroup.Selected = True
Dim ptfFilePath As String = cdrFilePath.Replace(".cdr", ".pdf")
'Dim pngFilePath As String = cdrFilePath.Replace(".cdr", ".png")
'Dim Ef As ExportFilter = doc.ExportBitmap(pngFilePath, VGCore.cdrFilter.cdrPNG, VGCore.cdrExportRange.cdrSelection, VGCore.cdrImageType.cdrRGBColorImage)
'Ef.Finish()
'Dim Options As New StructExportOptions
'Dim PaletteOptions As New StructPaletteOptions
doc.PublishToPDF(ptfFilePath)
'Ef = doc.ExportEx(ptfFilePath, VGCore.cdrFilter.cdrPPF, VGCore.cdrExportRange.cdrSelection, Options, PaletteOptions)
'Ef.Finish()
'InpotMessage1("9、文档导出")
'Dim pltFileName As String = $"PreviewRoomTypePanel{node.picNum}.plt"
'Dim pltFilePath As String = Path.Combine(savePath, pltFileName)
'doc.Export(pltFilePath, cdrExportFileFormat.cdrPLT)
InpotMessage1("关闭文档")
doc.Close()
RsNode.Status = RedisSendNode.StatusType.Success
RsNode.Msg = "Ok"
RsNode.CdrPath = cdrFilePath.Replace(filedir & "\", "")
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
InpotMessage1($"11、向Redis写入生成成功信息")
gLogNode = New LogNode($"成功生成酒店房间面板预览文档:{cdrFilePath}", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
G_Log.AddLogNode(gLogNode)
Return
Catch ex As Exception
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"生成酒店房间面板预览文档失败:{ex.Message}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
End Try
End Sub
'''
''' 检测图库文件命名及内容是否符合规范
'''
''' 图库文件路径
''' 错误信息输出
''' 是否符合规范
Public Function CheckLibraryFile(ByVal filePath As String, ByRef errorMessage As String) As Boolean
Dim srcDoc As Document
Try
' 获取文件名(不含路径和扩展名)
Dim fileName As String = Path.GetFileNameWithoutExtension(filePath)
' 分割文件名
Dim fileParts() As String = fileName.Split("_")
' 检查文件名基本格式
If fileParts.Length < 5 Then
errorMessage = "文件名格式错误:必须包含公司_系列_库名_版本_备注"
Return False
End If
' 检查库名
Dim libName As String = fileParts(2)
If libName <> "图标图库" AndAlso libName <> "模型图库" Then
errorMessage = "库名错误:只能为'图标图库'或'模型图库'"
Return False
End If
' 打开文件获取图像名称
srcDoc = APP.OpenDocument(filePath, False)
Dim imageNames As New List(Of Shape)
' 遍历所有页、图层和形状获取图像名称
For Each nPage As Page In srcDoc.Pages
For Each Layer As Layer In nPage.Layers
For Each Shape As Shape In Layer.Shapes
If Not String.IsNullOrEmpty(Shape.Name) Then
imageNames.Add(Shape)
End If
Next
Next
Next
' 遍历检查每个图像名称
For Each imageName As Shape In imageNames
If Not CheckImageName(imageName, libName, errorMessage) Then
Return False
End If
Next
' 关闭文件
srcDoc.Close()
errorMessage = ""
Return True
Catch ex As Exception
' 关闭文件
If srcDoc IsNot Nothing Then
srcDoc.Close()
End If
errorMessage = "文件处理错误:" & ex.Message
Return False
End Try
End Function
'''
''' 将Panel按照最小高度优先、最小宽度优先的顺序插入到List(Of Panel)中并重新排序
'''
''' 要排序的Panel列表
''' 要插入的新Panel
''' 排序后的Panel列表
Public Shared Function SortPanelListBySize(ByRef panelList As List(Of Panel), ByVal newPanel As Panel) As List(Of Panel)
' 创建列表副本,避免修改原始列表
' 添加新Panel到列表
' 定义一个函数来从model_type中提取宽度和高度
Dim getSize As Func(Of Panel, Tuple(Of Double, Double)) = Function(panel)
If String.IsNullOrEmpty(panel.model_type) Then
Return Tuple.Create(0.0, 0.0)
End If
Dim parts() As String = panel.model_type.Split("_")
If parts.Length < 6 Then
Return Tuple.Create(0.0, 0.0)
End If
Dim width As Double = 0.0
Dim height As Double = 0.0
Double.TryParse(parts(parts.Length - 2), width)
Double.TryParse(parts(parts.Length - 1), height)
Return Tuple.Create(width, height)
End Function
If panelList.Count = 0 Then
panelList.Add(newPanel)
Return panelList
End If
Dim currentSize, newSize As Tuple(Of Double, Double)
For i As Integer = 0 To panelList.Count - 1
'取得当前Panel的宽度和高
currentSize = getSize(panelList(i))
'取得新Panel的宽度和高
newSize = getSize(newPanel)
'比较高度 高度低的在前
If currentSize.Item2 > newSize.Item2 Then
panelList.Insert(i, newPanel)
End If
Next
' 如果没有找到合适的位置,则将新Panel添加到列表末尾
If Not panelList.Contains(newPanel) Then
panelList.Add(newPanel)
End If
Return panelList
End Function
'''
''' 检查单个图像名称是否符合规范
'''
''' 图像名称
''' 图库类型
''' 错误信息输出
''' 是否符合规范
Private Function CheckImageName(imageName As Shape, ByVal libName As String, ByRef errorMessage As String) As Boolean
' 分割图像名称
Dim parts() As String = imageName.Name.Split("_")
If parts.Length < 2 Then
errorMessage = $"图像名称'{imageName.Name}'格式错误:缺少必要部分"
Return False
End If
Dim imageType As String = parts(0).ToLower()
Select Case libName
Case "模型图库"
Return CheckModelLibraryImage(imageType, parts, imageName, errorMessage)
Case "图标图库"
Return CheckIconLibraryImage(imageType, parts, imageName.Name, errorMessage)
Case Else
errorMessage = $"未知图库类型:{libName}"
Return False
End Select
End Function
'''
''' 检查模型图库图像名称
'''
Private Function CheckModelLibraryImage(ByVal imageType As String, ByVal parts() As String, imageName As Shape, ByRef errorMessage As String) As Boolean
Dim snode As String()
Select Case imageType
Case "mode"
' Mode_连体数_方向_颜色_宽_高
If parts.Length < 6 Then
errorMessage = $"Mode图像'{imageName.Name}'格式错误:必须为Mode_N连体_方向_颜色_宽_高"
Return False
End If
' 检查连体数格式
If Not parts(1).EndsWith("连体") Then
errorMessage = $"Mode图像'{imageName.Name}'连体数格式错误:必须包含'连体'"
Return False
End If
' 检查宽高是否为数字
If Not IsNumeric(parts(4)) OrElse Not IsNumeric(parts(5)) Then
errorMessage = $"Mode图像'{imageName.Name}'宽高格式错误:必须为数字"
Return False
End If
For Each imageNamenode As Shape In imageName.Shapes
snode = imageNamenode.Name.Split("_")
Select Case snode(0).ToLower()
Case "effect"
' Effect_效果名称_w_h
If snode.Length < 4 Then
errorMessage = $"Effect图像'{imageNamenode.Name}'格式错误:必须为Effect_效果名称_w_h"
Return False
End If
' 检查宽高是否为数字
If Not IsNumeric(snode(snode.Length - 2)) OrElse Not IsNumeric(snode(snode.Length - 1)) Then
errorMessage = $"Effect图像'{imageNamenode.Name}'宽高格式错误:必须为数字"
Return False
End If
Return True
Case "logo"
' Logo_图像类型_左右_宽_高
If snode.Length < 5 Then
errorMessage = $"Logo图像'{imageNamenode.Name}'格式错误:必须为Logo_图像类型_左右(L/R)_宽_高"
Return False
End If
' 检查左右标识
If snode(2) <> "L" AndAlso snode(2) <> "R" Then
errorMessage = $"Logo图像'{imageNamenode.Name}'左右标识错误:只能为L或R"
Return False
End If
' 检查宽高是否为数字
If Not IsNumeric(snode(3)) OrElse Not IsNumeric(snode(4)) Then
errorMessage = $"Logo图像'{imageNamenode.Name}'宽高格式错误:必须为数字"
Return False
End If
Return True
Case "iconb"
' IconB_N连体_方向_颜色_宽_高
If snode.Length < 6 Then
errorMessage = $"IconB图像'{imageNamenode.Name}'格式错误:必须为IconB_N连体_方向_颜色_宽_高"
Return False
End If
' 检查连体数格式
If Not snode(1).EndsWith("连体") Then
errorMessage = $"IconB图像'{imageNamenode.Name}'连体数格式错误:必须包含'连体'"
Return False
End If
' 检查宽高是否为数字
If Not IsNumeric(snode(4)) OrElse Not IsNumeric(snode(5)) Then
errorMessage = $"IconB图像'{imageNamenode.Name}'宽高格式错误:必须为数字"
Return False
End If
Return True
Case "trench"
' Trench_槽位编号_w_h
If snode.Length < 4 Then
errorMessage = $"Trench图像'{imageNamenode.Name}'格式错误:必须为Trench_槽位编号_w_h"
Return False
End If
' 检查槽位编号是否为数字
If Not IsNumeric(snode(1)) Then
errorMessage = $"Trench图像'{imageNamenode.Name}'槽位编号错误:必须为数字"
Return False
End If
' 检查宽高是否为数字
If Not IsNumeric(snode(2)) OrElse Not IsNumeric(snode(3)) Then
errorMessage = $"Trench图像'{imageNamenode.Name}'宽高格式错误:必须为数字"
Return False
End If
End Select
Next
Return True
Case "mono"
' Mono_图像名称_w_h
If parts.Length < 4 Then
errorMessage = $"Mono图像'{imageName.Name}'格式错误:必须为Mono_图像名称_w_h"
Return False
End If
' 检查宽高是否为数字
If Not IsNumeric(parts(parts.Length - 2)) OrElse Not IsNumeric(parts(parts.Length - 1)) Then
errorMessage = $"Mono图像'{imageName.Name}'宽高格式错误:必须为数字"
Return False
End If
For Each imageNamenode In imageName.Shapes
snode = imageNamenode.Name.Split("_")
Select Case snode(0)
Case "location"
' location_图像类型_按键序号_w_h 或 location_图像类型_按键序号_w_h_行号
If snode.Length < 5 OrElse snode.Length > 6 Then
errorMessage = $"Location图像'{imageNamenode.Name}'格式错误:必须为location_图像类型_按键序号_w_h[_行号]"
Return False
End If
' 检查按键序号是否为数字
If Not IsNumeric(snode(2)) Then
errorMessage = $"Location图像'{imageNamenode.Name}'按键序号错误:必须为数字"
Return False
End If
' 检查宽高是否为数字
If Not IsNumeric(snode(3)) OrElse Not IsNumeric(snode(4)) Then
errorMessage = $"Location图像'{imageNamenode.Name}'宽高格式错误:必须为数字"
Return False
End If
' 如果有行号,检查是否为数字
If snode.Length = 6 AndAlso Not IsNumeric(snode(5)) Then
errorMessage = $"Location图像'{imageNamenode.Name}'行号错误:必须为数字"
Return False
End If
End Select
Next
Return True
Case Else
Return True
errorMessage = $"模型图库中包含未知图像类型:{imageType}"
Return False
End Select
End Function
'''
''' 检查图标图库图像名称
'''
Private Function CheckIconLibraryImage(ByVal imageType As String, ByVal parts() As String, ByVal imageName As String, ByRef errorMessage As String) As Boolean
Select Case imageType
Case "icon"
' Icon_图像名称_图像英文名称_w_h
If parts.Length < 5 Then
errorMessage = $"Icon图像'{imageName}'格式错误:必须为Icon_图像名称_图像英文名称_w_h"
Return False
End If
' 检查宽高是否为数字
If Not IsNumeric(parts(parts.Length - 2)) OrElse Not IsNumeric(parts(parts.Length - 1)) Then
errorMessage = $"Icon图像'{imageName}'宽高格式错误:必须为数字"
Return False
End If
Return True
Case "logo"
' Logo_图像名称_w_h
If parts.Length > 5 OrElse parts.Length < 4 Then
errorMessage = $"Logo图像'{imageName}'格式错误:必须为Logo_图像名称_图像英文名称_w_h"
Return False
End If
' 检查宽高是否为数字
If Not IsNumeric(parts(parts.Length - 2)) OrElse Not IsNumeric(parts(parts.Length - 1)) Then
errorMessage = $"Logo图像'{imageName}'宽高格式错误:必须为数字"
Return False
End If
Return True
Case Else
errorMessage = $"图标图库中包含未知图像类型:{imageType}"
Return False
End Select
End Function
Public Function HandleNodeInformation1(node As RedisInfoNode) As Boolean
Dim oldTime As DateTime = Now
Dim MaterialPath As String = M_MaterialPath & node.MaterialLibraryName
Dim RsNode As New RedisSendNode
RsNode.User = node.User
RsNode.ProjectName = node.ProjectName
RsNode.ProjectId = node.ProjectId
RsNode.PictureNum = node.PictureNum
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Process = node.Process
RsNode.Guid = node.Guid
Dim gLogNode As LogNode
Dim ProjectPath As String
Dim locionbuf(), indexbuf() As String
Dim shp, lhp, rhp, chp, clhp As Shape
Dim x#, y#, w#, h#
Dim dx As Double, dy As Double
Dim destLayer As Layer
'''Console.WriteLine($"到达节点1耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
'查找素材库
If Not File.Exists(MaterialPath) Then
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Msg = "素材库不存在!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RsNode))
gLogNode = New LogNode("素材库不存在", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End If
'''Console.WriteLine($"到达节点2耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
Try
Try
G_LibDoc = APP.OpenDocument(MaterialPath, False)
Catch ex As Exception
APP = New Application()
Thread.Sleep(500)
APP.Visible = False
G_LibDoc = APP.OpenDocument(MaterialPath, False)
End Try
ProjectPath = $"{M_TplPath}{node.ProjectName}\{Now:yyyyMMdd}"
'判断项目文件夹是否存在
If Not Directory.Exists(ProjectPath) Then
'MsgBox("项目文件夹不存在")
'创建文件夹
Directory.CreateDirectory(ProjectPath)
End If
'查找模板
locionbuf = node.TemplateNameIndex.Split("_")
Dim page As Page = G_LibDoc.Pages(CInt(locionbuf(0)))
'''Console.WriteLine($"到达节点8耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
Dim layer As Layer = page.Layers(CInt(locionbuf(1)))
'''Console.WriteLine($"到达节点7耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
shp = layer.Shapes(CInt(locionbuf(2)))
'''Console.WriteLine($"到达节点6耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
If IsNothing(shp) OrElse Not node.TemplateName.Trim.Equals(shp.Name.Trim) Then
RsNode.Status = RedisSendNode.StatusType.TemplateNotExist
RsNode.Msg = "未找到模板信息!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RsNode))
gLogNode = New LogNode("未找到模板信息!!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End If
'''Console.WriteLine($"到达节点3耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
Dim li As New List(Of (Shape, Shape))
Dim ctdic As New List(Of (Shape, Shape))
'遍历node.MaterialDic
For Each item In node.PatternList
'''Console.WriteLine($"到达节点10耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
indexbuf = item.ShapeNumber.Split("_")
RsNode.Status = RedisSendNode.StatusType.MaterialPositionNotExist
lhp = shp.Shapes(CInt(item.IndexNumber))
RsNode.Status = RedisSendNode.StatusType.MaterialNotExist
page = G_LibDoc.Pages(CInt(indexbuf(0)))
layer = page.Layers(CInt(indexbuf(1)))
rhp = layer.Shapes(CInt(indexbuf(2)))
'单体先挪到槽位
x = lhp.CenterX - rhp.CenterX
y = lhp.CenterY - rhp.CenterY
dx = lhp.LeftX
dy = lhp.TopY
rhp.Move(x, y)
clhp = rhp.Shapes(rhp.Shapes.Count)
clhp.Visible = False
li.Add((rhp, lhp))
'再将素材挪到指定的小槽位
For Each LocationNode In item.LocationList
clhp = rhp.Shapes(CInt(LocationNode.IndexNumber))
indexbuf = LocationNode.ShapeNumber.Split("_")
page = G_LibDoc.Pages(CInt(indexbuf(0)))
layer = page.Layers(CInt(indexbuf(1)))
chp = layer.Shapes(CInt(indexbuf(2)))
x = clhp.CenterX - chp.CenterX
y = clhp.CenterY - chp.CenterY
dx = clhp.LeftX
dy = clhp.TopY
chp.Move(x, y)
ctdic.Add((chp, clhp))
Next
Next
'''Console.WriteLine($"到达节点10耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
shp.Selected = True
For Each item In li
item.Item1.OrderToFront()
item.Item1.Selected = True
''Console.WriteLine(item.Item2.Name)
item.Item2.Delete()
Next
For Each item In ctdic
item.Item1.OrderToFront()
item.Item1.Selected = True
item.Item2.Delete()
Next
'''Console.WriteLine($"到达节点4耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
Dim sr As ShapeRange = APP.ActiveSelectionRange
shp = sr.Group()
shp.Name = node.TemplateName
page = G_LibDoc.Pages(CInt(locionbuf(0)))
SetIconToCentered(page, shp)
'''Console.WriteLine($"到达节点11耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
RsNode.Status = RedisSendNode.StatusType.SaveFileFail
shp.Selected = True
'Dim sel As ShapeRange = APP.ActiveSelectionRange
'0-预览小图 1-生成文件
Select Case node.Process
Case 0
ProjectPath = $"{ProjectPath}\{node.TemplateName.Replace("Mode_", "")}_{Now:yyyyMMddHHmmss}.png"
Dim Ef As ExportFilter = G_LibDoc.ExportBitmap(ProjectPath, VGCore.cdrFilter.cdrPNG, VGCore.cdrExportRange.cdrSelection, VGCore.cdrImageType.cdrRGBColorImage)
Ef.Finish()
Case 1
ProjectPath = $"{ProjectPath}\{node.TemplateName.Replace("Mode_", "")}_{Now:yyyyMMddHHmmss}.cdr"
Dim ssao As New StructSaveAsOptions
ssao.Filter = VGCore.cdrFilter.cdrCDR
ssao.Range = VGCore.cdrExportRange.cdrSelection
G_LibDoc.SaveAs(ProjectPath, ssao)
Case Else
G_LibDoc.Close()
RsNode.Status = RedisSendNode.StatusType.UnknownFail
RsNode.Msg = "位置操作!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RsNode))
Return False
End Select
G_LibDoc.Close()
RsNode.Status = RedisSendNode.StatusType.Success
RsNode.Msg = "Ok"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RsNode))
Return True
Catch ex As Exception
Select Case RsNode.Status
Case RedisSendNode.StatusType.MaterialPositionNotExist
RsNode.Msg = "素材位置不存在!!"
Case RedisSendNode.StatusType.MaterialNotExist
RsNode.Msg = "素材不存在!!"
Case RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = "生成图像失败!!"
Case RedisSendNode.StatusType.SaveFileFail
RsNode.Msg = "保存文件失败!!"
End Select
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RsNode))
If Not IsNothing(G_LibDoc) Then
G_LibDoc.Close()
End If
gLogNode = New LogNode($"{RsNode.Msg}{vbCrLf}{ex.Message}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End Try
End Function
Public Function HandleNodeInformation2(node As RedisInfoNode) As Boolean
Dim oldTime As DateTime = Now
Dim MaterialPath As String = M_MaterialPath & node.MaterialLibraryName
Dim RsNode As New RedisSendNode
RsNode.User = node.User
RsNode.ProjectName = node.ProjectName
RsNode.ProjectId = node.ProjectId
RsNode.PictureNum = node.PictureNum
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Process = node.Process
RsNode.Guid = node.Guid
Dim gLogNode As LogNode
Dim ProjectPath As String
Dim locionbuf(), indexbuf() As String
Dim fshp, shp, lhp, rhp, chp, clhp As Shape
Dim x#, y#, w#, h#
Dim dx As Double, dy As Double
Dim destLayer As Layer
Dim MLibDoc As Document
Dim ServerFilePath As String = "D:\BLWLog\Web\wwwroot\PanelSelectionPic\"
'''Console.WriteLine($"到达节点1耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
'查找素材库
If Not File.Exists(MaterialPath) Then
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Msg = "素材库不存在!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RsNode))
gLogNode = New LogNode("素材库不存在", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End If
'''Console.WriteLine($"到达节点2耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
Try
Try
G_LibDoc = APP.OpenDocument(MaterialPath, False)
MLibDoc = APP.CreateDocument()
Catch ex As Exception
APP = New Application()
Thread.Sleep(1000)
APP.Visible = False
G_LibDoc = APP.OpenDocument(MaterialPath, False)
MLibDoc = APP.CreateDocument()
End Try
APP.EventsEnabled = False
APP.Optimization = True
'APP.EventsEnabled = True
'APP.Optimization = False
'APP.Refresh()
ProjectPath = $"{ServerFilePath}{node.ProjectName}\{Now:yyyyMMdd}"
'判断项目文件夹是否存在
If Not Directory.Exists(ProjectPath) Then
'MsgBox("项目文件夹不存在")
'创建文件夹
Directory.CreateDirectory(ProjectPath)
End If
'查找模板
locionbuf = node.TemplateNameIndex.Split("_")
Dim npage As Page
Dim page As Page = G_LibDoc.Pages(CInt(locionbuf(0)))
'''Console.WriteLine($"到达节点8耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
Dim layer As Layer = page.Layers(CInt(locionbuf(1)))
Dim nlayer As Layer
'''Console.WriteLine($"到达节点7耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
shp = layer.Shapes(CInt(locionbuf(2)))
'''Console.WriteLine($"到达节点6耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
If IsNothing(shp) OrElse Not node.TemplateName.Trim.Equals(shp.Name.Trim) Then
RsNode.Status = RedisSendNode.StatusType.TemplateNotExist
RsNode.Msg = "未找到模板信息!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RsNode))
gLogNode = New LogNode("未找到模板信息!!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
Else
'将模板复制到新文档
'''Console.WriteLine($"到达节点5耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
''Console.WriteLine($"到达节点1耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
shapeCopy(shp)
npage = MLibDoc.Pages(1)
nlayer = MLibDoc.ActiveLayer
''Console.WriteLine($"到达节点2耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
fshp = nlayer.Paste()
''Console.WriteLine($"到达节点3耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
End If
'''Console.WriteLine($"到达节点3耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
Dim li As New List(Of (Shape, Shape))
Dim ctdic As New List(Of (Shape, Shape))
Dim Uctdic As New Dictionary(Of Integer, List(Of Shape))
'遍历node.MaterialDic
For Each item In node.PatternList
' ''Console.WriteLine(item.ShapeNumber)
'''Console.WriteLine($"到达节点10耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
indexbuf = item.ShapeNumber.Split("_")
RsNode.Status = RedisSendNode.StatusType.MaterialPositionNotExist
lhp = fshp.Shapes(CInt(item.IndexNumber))
RsNode.Status = RedisSendNode.StatusType.MaterialNotExist
page = G_LibDoc.Pages(CInt(indexbuf(0)))
layer = page.Layers(CInt(indexbuf(1)))
rhp = layer.Shapes(CInt(indexbuf(2)))
'延时20个毫秒
''Console.WriteLine(rhp.Name)
''Console.WriteLine($"到达节点4耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
shapeCopy(rhp)
''Console.WriteLine($"到达节点5耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
rhp = nlayer.Paste()
''Console.WriteLine($"到达节点6耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
rhp.Name = rhp.Name & "_" & item.IndexNumber
'单体先挪到槽位
li.Add((rhp, lhp))
'再将素材挪到指定的小槽位
For Each LocationNode In item.LocationList
''Console.WriteLine(LocationNode.ShapeNumber)
If LocationNode.ShapeType = 0 Then
Dim remark As String() = LocationNode.Remark.Split("_")
If remark.Length > 1 Then
clhp = rhp.Shapes(CInt(LocationNode.IndexNumber))
chp = CreateTextImage(nlayer, LocationNode.ShapeNumber, remark)
If IsNothing(chp) Then
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Msg = "生成文本图像失败!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RsNode))
gLogNode = New LogNode("生成文本图像失败!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End If
chp.Name = chp.Name & "_" & item.IndexNumber & "_" & LocationNode.IndexNumber
ctdic.Add((chp, clhp))
If remark.Length > 2 Then
Dim chpli As List(Of Shape)
If Uctdic.ContainsKey(remark(2)) Then
chpli = Uctdic(remark(2))
chpli.Add(chp)
Else
chpli = New List(Of Shape)
chpli.Add(chp)
Uctdic.Add(remark(2), chpli)
End If
End If
Else
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Msg = "生成文本图像失败!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RsNode))
gLogNode = New LogNode("生成文本图像失败!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End If
Else
clhp = rhp.Shapes(CInt(LocationNode.IndexNumber))
indexbuf = LocationNode.ShapeNumber.Split("_")
page = G_LibDoc.Pages(CInt(indexbuf(0)))
layer = page.Layers(CInt(indexbuf(1)))
chp = layer.Shapes(CInt(indexbuf(2)))
'延时10个毫秒
'延时20个毫秒
''Console.WriteLine($"到达节点7耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
''Console.WriteLine(chp.Name)
'延时50ms
''Console.WriteLine($"到达节点8耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
shapeCopy(chp)
''Console.WriteLine($"到达节点9耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
chp = nlayer.Paste()
''Console.WriteLine($"到达节点10耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
chp.Name = chp.Name & "_" & item.IndexNumber & "_" & LocationNode.IndexNumber
ctdic.Add((chp, clhp))
End If
Next
''Console.WriteLine(rhp.Name)
Next
'''Console.WriteLine($"到达节点10耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
'fshp.Selected = True
For Each item In li
item.Item1.OrderToFront()
x = item.Item2.CenterX - item.Item1.CenterX
y = item.Item2.CenterY - item.Item1.CenterY
item.Item1.Move(x, y)
clhp = item.Item1.Shapes(item.Item1.Shapes.Count)
clhp.Visible = False
' li.Add((rhp, lhp))
'item.Item1.Selected = True
''Console.WriteLine(item.Item2.Name)
item.Item2.Delete()
Next
For Each item In ctdic
item.Item1.OrderToFront()
x = item.Item2.CenterX - item.Item1.CenterX
y = item.Item2.CenterY - item.Item1.CenterY
item.Item1.Move(x, y)
'ctdic.Add((chp, clhp))
'item.Item1.Selected = True
item.Item2.Delete()
Next
Dim topl As Single = 0
For Each item In Uctdic
For i = 0 To item.Value.Count - 1
If i = 0 Then
topl = item.Value(0).TopY
End If
item.Value(i).TopY = topl
Next
Next
'''Console.WriteLine($"到达节点4耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
'Dim sr As ShapeRange = APP.ActiveSelectionRange
fshp = nlayer.Shapes.All().Group()
'shp = sr.Group()
fshp.Name = node.TemplateName
'page = G_LibDoc.Pages(CInt(locionbuf(0)))
'SetIconToCentered(page, shp)
'''Console.WriteLine($"到达节点11耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
RsNode.Status = RedisSendNode.StatusType.SaveFileFail
fshp.Selected = True
SetIconToCentered(npage, fshp)
'Dim sel As ShapeRange = APP.ActiveSelectionRange
'0-预览小图 1-生成文件
Select Case node.Process
Case 0
ProjectPath = $"{ProjectPath}\{node.TemplateName.Replace("Mode_", "")}_{Now:yyyyMMddHHmmss}.png"
Dim Ef As ExportFilter = MLibDoc.ExportBitmap(ProjectPath, VGCore.cdrFilter.cdrPNG, VGCore.cdrExportRange.cdrSelection, VGCore.cdrImageType.cdrRGBColorImage)
Ef.Finish()
RsNode.ImagePath = ProjectPath.Replace(ServerFilePath, "")
Case 1
ProjectPath = $"{ProjectPath}\{node.TemplateName.Replace("Mode_", "")}_{Now:yyyyMMddHHmmss}.cdr"
Dim ssao As New StructSaveAsOptions
ssao.Filter = VGCore.cdrFilter.cdrCDR
ssao.Range = VGCore.cdrExportRange.cdrSelection
MLibDoc.SaveAs(ProjectPath, ssao)
RsNode.CdrPath = ProjectPath.Replace(ServerFilePath, "")
Case Else
MLibDoc.Close()
G_LibDoc.Close()
RsNode.Status = RedisSendNode.StatusType.UnknownFail
RsNode.Msg = "位置操作!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RsNode))
Return False
End Select
APP.EventsEnabled = True
APP.Optimization = False
APP.Refresh()
MLibDoc.Close()
G_LibDoc.Close()
RsNode.Status = RedisSendNode.StatusType.Success
RsNode.Msg = "Ok"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RsNode))
Return True
Catch ex As Exception
APP.EventsEnabled = True
APP.Optimization = False
APP.Refresh()
Select Case RsNode.Status
Case RedisSendNode.StatusType.MaterialPositionNotExist
RsNode.Msg = "素材位置不存在!!"
Case RedisSendNode.StatusType.MaterialNotExist
RsNode.Msg = "素材不存在!!"
Case RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = "生成图像失败!!"
Case RedisSendNode.StatusType.SaveFileFail
RsNode.Msg = "保存文件失败!!"
End Select
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RsNode))
If Not IsNothing(MLibDoc) Then
MLibDoc.Close()
End If
If Not IsNothing(G_LibDoc) Then
G_LibDoc.Close()
End If
gLogNode = New LogNode($"{RsNode.Msg}{vbCrLf}{ex.Message}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End Try
End Function
'输出日志
Public Sub InpotMessage1(PictureNum As String)
If Isdisply Then
Dim gLogNode As LogNode
gLogNode = New LogNode(PictureNum, RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Blue)
G_Log.AddLogNode(gLogNode)
End If
End Sub
Public Function HandleNodeInformation3(node As RedisInfoNode) As Boolean
InpotMessage1("1、开始生成文件")
Dim oldTime As DateTime = Now
Dim MaterialPath As String = M_MaterialPath & node.MaterialLibraryName
Dim RsNode As New RedisSendNode
RsNode.User = node.User
RsNode.ProjectName = node.ProjectName
RsNode.ProjectId = node.ProjectId
RsNode.PictureNum = node.PictureNum
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Process = node.Process
RsNode.Guid = node.Guid
Dim RMNode As New RedisMsgNode
RMNode.MsgType = 1
RMNode.MsgNode = RsNode
Dim gLogNode As LogNode
Dim ProjectPath As String
Dim locionbuf(), indexbuf() As String
Dim fshp, shp, lhp, rhp, chp, clhp As Shape
Dim x#, y#, w#, h#
Dim dx As Double, dy As Double
Dim destLayer As Layer
Dim MLibDoc As Document
Dim li As New List(Of (Shape, Shape))
Dim ServerFilePath As String = M_ServerPath '"R:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic\" ' "D:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic\" '
'''Console.WriteLine($"到达节点1耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
'查找素材库
InpotMessage1("2、检测模版素材库是否存在")
If Not File.Exists(MaterialPath) Then
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Msg = "模版素材库不存在!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode("模版素材库不存在", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End If
'''Console.WriteLine($"到达节点2耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
Try
Try
G_LibDoc = APP.OpenDocument(MaterialPath, False)
MLibDoc = APP.CreateDocument()
InpotMessage1("3、打开模板库并创建新文件等待构建图像")
Catch ex As Exception
APP = New Application()
Thread.Sleep(1000)
APP.Visible = False
G_LibDoc = APP.OpenDocument(MaterialPath, True)
MLibDoc = APP.CreateDocument()
End Try
APP.EventsEnabled = False
APP.Optimization = True
'APP.EventsEnabled = True
'APP.Optimization = False
'APP.Refresh()
ProjectPath = $"{ServerFilePath}{node.ProjectName}\{Now:yyyyMMdd}"
'判断项目文件夹是否存在
InpotMessage1("4、创建项目文件夹")
If Not Directory.Exists(ProjectPath) Then
'MsgBox("项目文件夹不存在")
'创建文件夹
Directory.CreateDirectory(ProjectPath)
End If
'查找模板
InpotMessage1("5、开始查找模板图像")
locionbuf = node.TemplateNameIndex.Split("_")
Dim npage As Page
Dim page As Page = G_LibDoc.Pages(CInt(locionbuf(0)))
'''Console.WriteLine($"到达节点8耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
Dim layer As Layer = page.Layers(CInt(locionbuf(1)))
Dim nlayer As Layer
'''Console.WriteLine($"到达节点7耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
shp = layer.Shapes(CInt(locionbuf(2)))
'''Console.WriteLine($"到达节点6耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
If IsNothing(shp) OrElse Not node.TemplateName.Trim.Equals(shp.Name.Trim) Then
RsNode.Status = RedisSendNode.StatusType.TemplateNotExist
RsNode.Msg = "未找到模板信息!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode("未找到模板信息!!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
Else
'将模板复制到新文档
'''Console.WriteLine($"到达节点5耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
''Console.WriteLine($"到达节点1耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
InpotMessage1("6、开始拷贝模版图像到目标文件")
shapeCopy(shp)
npage = MLibDoc.Pages(1)
nlayer = MLibDoc.ActiveLayer
''Console.WriteLine($"到达节点2耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
fshp = nlayer.Paste()
InpotMessage1("7、拷贝模版图像到目标文件")
If Not String.IsNullOrEmpty(node.LogoPosition) Then
MaterialPath = M_MaterialPath & node.LogoFileName
If Not File.Exists(MaterialPath) Then
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Msg = $"Logo素材库不存在!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"Logo素材库不存在!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End If
InpotMessage1("8、查找Logo图像")
Dim cshape, vshape As Shape
G_LibDoc = APP.OpenDocument(MaterialPath, False)
vshape = fshp.Shapes(CInt(node.LogoPosition))
indexbuf = node.LogoIndexNumber.Split("_")
page = G_LibDoc.Pages(CInt(indexbuf(0)))
layer = page.Layers(CInt(indexbuf(1)))
cshape = layer.Shapes(CInt(indexbuf(2)))
InpotMessage1("9、开始拷贝Logo图像")
shapeCopy(cshape)
''Console.WriteLine($"到达节点9耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
cshape = nlayer.Paste()
''Console.WriteLine($"到达节点3耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
'Console.WriteLine($"logo:{cshape.Name} 复制完成{ cshape.LeftX},{cshape.TopY}!")
InpotMessage1("10、拷贝Logo图像到目标文件")
cshape.OrderToFront()
vshape.Visible = True
vshape.Selected = True
x = vshape.CenterX - cshape.CenterX
y = vshape.CenterY - cshape.CenterY
cshape.Move(x, y)
'cshape.SetPosition(vshape.LeftX, vshape.TopY)
'cshape.SetSize(vshape.SizeWidth, vshape.SizeHeight)
'Dim Stretchbuf As (Double, Double) = GetScale(cshape.SizeWidth, cshape.SizeHeight, vshape.SizeWidth, vshape.SizeHeight)
'cshape.Stretch(Stretchbuf.Item1, Stretchbuf.Item2)
Console.WriteLine($"{cshape.Name}_{cshape.CenterX}_{cshape.CenterY}->{vshape.Name}_{vshape.CenterX}_{vshape.CenterY }")
InpotMessage1("11、设置Logo图像在目标文件的为位置")
li.Add((cshape, vshape))
End If
End If
'''Console.WriteLine($"到达节点3耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
Dim ctdic As New List(Of (Shape, Shape))
Dim Uctdic As New Dictionary(Of Integer, List(Of Shape))
'遍历node.MaterialDic
'APP.EventsEnabled = True
'APP.Optimization = False
'APP.Refresh()
InpotMessage1("12、开始构建单体")
For Each item In node.PatternList
' ''Console.WriteLine(item.ShapeNumber)
'''Console.WriteLine($"到达节点10耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
MaterialPath = M_MaterialPath & item.FileName
If Not File.Exists(MaterialPath) Then
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Msg = $"单体素材库不存在!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"单体素材库不存在!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End If
InpotMessage1($"打开单体所在文件{vbCrLf}{MaterialPath}")
G_LibDoc = APP.OpenDocument(MaterialPath, False)
InpotMessage1($"开始查找单体")
indexbuf = item.ShapeNumber.Split("_")
RsNode.Status = RedisSendNode.StatusType.MaterialPositionNotExist
lhp = fshp.Shapes(CInt(item.IndexNumber))
RsNode.Status = RedisSendNode.StatusType.MaterialNotExist
page = G_LibDoc.Pages(CInt(indexbuf(0)))
layer = page.Layers(CInt(indexbuf(1)))
rhp = layer.Shapes(CInt(indexbuf(2)))
InpotMessage1($"开始拷贝单体{rhp.Name}")
'延时20个毫秒
''Console.WriteLine(rhp.Name)
''Console.WriteLine($"到达节点4耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
shapeCopy(rhp)
''Console.WriteLine($"到达节点5耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
rhp = nlayer.Paste()
''Console.WriteLine($"到达节点6耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
rhp.Name = rhp.Name & "_" & item.IndexNumber
'单体先挪到槽位
InpotMessage1($"拷贝单体:{rhp.Name} 到目标文件")
li.Add((rhp, lhp))
'再将素材挪到指定的小槽位
For Each LocationNode In item.LocationList
''Console.WriteLine(LocationNode.ShapeNumber)
If LocationNode.ShapeType = 0 Then
InpotMessage1($"开始创建字体图像:{LocationNode.ShapeNumber} 到目标文件")
Dim remark As String() = LocationNode.Remark.Split("_")
clhp = rhp.Shapes(CInt(LocationNode.IndexNumber))
chp = CreateTextImage1(nlayer, LocationNode.ShapeNumber, LocationNode)
If IsNothing(chp) Then
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Msg = "生成文本图像失败!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode("生成文本图像失败!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End If
InpotMessage1($"创建字体图像:{LocationNode.ShapeNumber} 到目标文件")
chp.Name = chp.Name & "_" & item.IndexNumber & "_" & LocationNode.IndexNumber
ctdic.Add((chp, clhp))
If Not String.IsNullOrEmpty(LocationNode.LineNumber) Then
Dim chpli As List(Of Shape)
Dim LineNumber As Integer = CInt(LocationNode.LineNumber)
If Uctdic.ContainsKey(LineNumber) Then
chpli = Uctdic(LineNumber)
chpli.Add(chp)
Else
chpli = New List(Of Shape)
chpli.Add(chp)
Uctdic.Add(LineNumber, chpli)
End If
End If
Else
MaterialPath = M_MaterialPath & LocationNode.FileName
InpotMessage1($"开始检测素材库文件是否存在:{MaterialPath} ")
If Not File.Exists(MaterialPath) Then
RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
RsNode.Msg = $"图标素材库不存在!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
gLogNode = New LogNode($"图标素材库不存在!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End If
InpotMessage1($"打开素材库文件:{MaterialPath} ")
G_LibDoc = APP.OpenDocument(MaterialPath, False)
InpotMessage1($"开始查找素材 ")
clhp = rhp.Shapes(CInt(LocationNode.IndexNumber))
indexbuf = LocationNode.ShapeNumber.Split("_")
page = G_LibDoc.Pages(CInt(indexbuf(0)))
layer = page.Layers(CInt(indexbuf(1)))
chp = layer.Shapes(CInt(indexbuf(2)))
InpotMessage1($"开始拷贝素材 ")
'延时10个毫秒
'延时20个毫秒
'''Console.WriteLine($"到达节点7耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
''Console.WriteLine(chp.Name)
'延时50ms
''Console.WriteLine($"到达节点8耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
shapeCopy(chp)
''Console.WriteLine($"到达节点9耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
chp = nlayer.Paste()
InpotMessage1($"拷贝素材 {chp.Name}到目标文件")
'Dim chpcolor As New VGCore.color '
Dim chpcolor As Color = New Color
Dim colorint As (Integer, Integer, Integer) = HexToRgb(LocationNode.ShapeColor)
chpcolor.RGBAssign(colorint.Item1, colorint.Item2, colorint.Item3)
Dim chpcolor1 As IVGColor = chp.Fill.UniformColor
chp.Fill.ApplyUniformFill(chpcolor)
InpotMessage1($"设置素材 {chp.Name}图像颜色")
''Console.WriteLine($"到达节点10耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
chp.Name = chp.Name & "_" & item.IndexNumber & "_" & LocationNode.IndexNumber
ctdic.Add((chp, clhp))
End If
Next
'这里要先把单体移到对应位置
InpotMessage1($"开始设置单体位置")
rhp.OrderToFront()
lhp.Visible = True
x = lhp.CenterX - rhp.CenterX
y = lhp.CenterY - rhp.CenterY
rhp.Move(x, y)
clhp = rhp.Shapes(rhp.Shapes.Count)
clhp.Delete() ' = False
'将替换的元素移到对应位置
InpotMessage1($"开始设置该单体内的素材图像位置")
For Each nitem In ctdic
nitem.Item1.OrderToFront()
x = nitem.Item2.CenterX - nitem.Item1.CenterX
y = nitem.Item2.CenterY - nitem.Item1.CenterY
nitem.Item1.Move(x, y)
'ctdic.Add((chp, clhp))
'item.Item1.Selected = True
nitem.Item2.Delete()
InpotMessage1($"设置素材{nitem.Item1.Name} 图像位置")
Next
ctdic.Clear()
'对齐
Dim topl As Single = 0
InpotMessage1($"开始设素材图像顶部对齐")
For Each Uitem In Uctdic
For i = 0 To Uitem.Value.Count - 1
If i = 0 Then
topl = Uitem.Value(0).TopY
End If
Uitem.Value(i).TopY = topl
Next
Next
InpotMessage1($"素材图像顶部对齐完毕")
Uctdic.Clear()
Next
'''Console.WriteLine($"到达节点10耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
RsNode.Status = RedisSendNode.StatusType.BuildImageFail
InpotMessage1($"开始删除单体槽位")
For Each mitem In li
'Console.WriteLine(mitem.Item1.Name)
'Console.WriteLine(mitem.Item2.Name)
mitem.Item2.Delete()
Next
InpotMessage1($"单体槽位删除完毕")
li.Clear()
'''Console.WriteLine($"到达节点4耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
'Dim sr As ShapeRange = APP.ActiveSelectionRange
InpotMessage1($"13、开始组合整个图像")
fshp = nlayer.Shapes.All().Group()
'shp = sr.Group()
fshp.Name = node.TemplateName
'page = G_LibDoc.Pages(CInt(locionbuf(0)))
'SetIconToCentered(page, shp)
'''Console.WriteLine($"到达节点11耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
RsNode.Status = RedisSendNode.StatusType.SaveFileFail
fshp.Selected = True
InpotMessage1($"14、开始将整个图像移动至中心位置")
SetIconToCentered(npage, fshp)
'Dim sel As ShapeRange = APP.ActiveSelectionRange
APP.EventsEnabled = True
APP.Optimization = False
APP.Refresh()
'fshp.SetSize(Math.Abs(fshp.SizeWidth) * 10000, Math.Abs(fshp.SizeHeight) * 10000)
InpotMessage1($"15、开始保存图像成文件")
'0-预览小图 1-生成文件
Select Case node.Process
Case 0
ProjectPath = $"{ProjectPath}\{node.TemplateName.Replace("Mode_", "")}_{Now:yyyyMMddHHmmss}.png"
Dim Ef As ExportFilter = MLibDoc.ExportBitmap(ProjectPath, VGCore.cdrFilter.cdrPNG, VGCore.cdrExportRange.cdrSelection, VGCore.cdrImageType.cdrRGBColorImage)
Ef.Finish()
RsNode.ImagePath = ProjectPath.Replace(ServerFilePath, "")
Case 1
For Each shnode In fshp.Shapes
'查找名称为Mode_的子节点
If shnode.Name.Contains("Mode_") Then
'倒序遍历其子节点
Dim xvbnode As Shape
For i = shnode.Shapes.Count To 1 Step -1
xvbnode = shnode.Shapes.Item(i)
'将子节点中名称带有Effect _ 的节点删除
If xvbnode.Name.Contains("Effect") Then
xvbnode.Delete()
End If
Next
End If
Next
ProjectPath = $"{ProjectPath}\{node.TemplateName.Replace("Mode_", "")}_{Now:yyyyMMddHHmmss}.cdr"
Dim ssao As New StructSaveAsOptions
ssao.Filter = VGCore.cdrFilter.cdrCDR
ssao.Range = VGCore.cdrExportRange.cdrSelection
MLibDoc.SaveAs(ProjectPath, ssao)
InpotMessage1($"16、保存图像成plt文件")
ProjectPath = ProjectPath.Replace(".cdr", ".plt")
'ssao.Filter = VGCore.cdrFilter.cdrPLT
'ssao.Range = VGCore.cdrExportRange.cdrSelection
'MLibDoc.FullFileName = ProjectPath
'MLibDoc.SaveAs(ProjectPath, ssao)
'fshp.SizeWidth = fshp.SizeWidth * 10000
'fshp.SizeHeight = fshp.SizeHeight * 10000
Dim originalUnit As cdrUnit
originalUnit = MLibDoc.Unit
' 将文档单位设置为毫米
MLibDoc.Unit = VGCore.cdrUnit.cdrMillimeter
'1. 宽高(mm)
Dim wMm As Double = Format(fshp.SizeWidth, "0.000")
Dim hMm As Double = Format(fshp.SizeHeight, "0.000")
fshp.GetSize(wMm, hMm)
hMm = (hMm * 100) ' / 304.8
wMm = (wMm * 100) '/ 304.8
'fshp.Scale
'fshp.SizeWidth = wMm
'fshp.SizeHeight = hMm
'fshp.SetSizeEx(fshp.CenterX, fshp.CenterY, wMm, hMm)
fshp.SetSize(wMm, hMm)
'4. 打印
Console.WriteLine($"宽 : {wMm:F2} mm")
Console.WriteLine($"高 : {hMm:F2} mm")
'Console.WriteLine($"X 放大倍数: {scaleX:F2}")
'Console.WriteLine($"Y 放大倍数: {scaleY:F2}")
'Console.WriteLine($"比例锁定 : {locked}")
Dim opt As New StructExportOptions
opt.MaintainAspect = True
'opt.ResolutionX = 100
'opt.ResolutionY = 100
'opt.SizeX = wMm
'opt.SizeY = hMm
opt.AntiAliasingType = VGCore.cdrAntiAliasingType.cdrSupersampling
'MLibDoc.Export(ProjectPath, VGCore.cdrFilter.cdrPLT, VGCore.cdrExportRange.cdrSelection, opt)
Dim Ef As ExportFilter = MLibDoc.ExportEx(ProjectPath, VGCore.cdrFilter.cdrPLT, VGCore.cdrExportRange.cdrSelection, opt)
Ef.Finish()
RsNode.CdrPath = ProjectPath.Replace(ServerFilePath, "")
Case Else
MLibDoc.Close()
G_LibDoc.Close()
RsNode.Status = RedisSendNode.StatusType.UnknownFail
RsNode.Msg = "位置操作!!"
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
Return False
End Select
InpotMessage1($"16、保存图像成文件完成")
G_LibDoc.Close()
MLibDoc.Close()
RsNode.Status = RedisSendNode.StatusType.Success
RsNode.Msg = "Ok"
InpotMessage1($"17、关闭素材库和目标文件")
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
InpotMessage1($"18、向Redis写入生成成功信息")
Return True
Catch ex As Exception
APP.EventsEnabled = True
APP.Optimization = False
APP.Refresh()
Select Case RsNode.Status
Case RedisSendNode.StatusType.MaterialPositionNotExist
RsNode.Msg = "素材位置不存在!!"
Case RedisSendNode.StatusType.MaterialNotExist
RsNode.Msg = "素材不存在!!"
Case RedisSendNode.StatusType.BuildImageFail
RsNode.Msg = "生成图像失败!!"
Case RedisSendNode.StatusType.SaveFileFail
RsNode.Msg = "保存文件失败!!"
End Select
RedisPublishMessage1(RsNode.PictureNum, JsonConvert.SerializeObject(RMNode))
If Not IsNothing(MLibDoc) Then
MLibDoc.Close()
End If
If Not IsNothing(G_LibDoc) Then
G_LibDoc.Close()
End If
gLogNode = New LogNode($"{RsNode.Msg}{vbCrLf}{ex.Message}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End Try
End Function
'''
''' 计算缩放因子
'''
''' 图像原始宽度
''' 图像原始高度
''' 槽位宽度
''' 槽位高度
''' 0=填满 1=完整 2=拉伸
''' (scaleX, scaleY)
Public Function GetScale(imgW As Double, imgH As Double, slotW As Double, slotH As Double, Optional mode As Integer = 1) As (Double, Double)
Dim sx As Double = slotW / imgW
Dim sy As Double = slotH / imgH
' Return mode switch
'{
' 0 => (Math.Max(sx, sy), Math.Max(sx, sy)), // 填满(保持比例)
' 1 => (Math.Min(sx, sy), Math.Min(sx, sy)), // 完整(保持比例)
' 2 => (sx, sy), // 强制拉伸
' _ => (sx, sy)
'};
Select Case mode
Case 0
Return (Math.Max(sx, sy), Math.Max(sx, sy))
Case 1
Return (Math.Min(sx, sy), Math.Min(sx, sy))
Case 2
Return (sx, sy)
Case Else
Return (sx, sy)
End Select
End Function
'創建字體圖像
Public Function CreateTextImage(nlayer As Layer, ShapeNumber As String, remark As String()) As Shape
Dim chp As Shape
Dim txtsize As Single
If Not txtsize.TryParse(remark(1), txtsize) Then
Return Nothing
End If
Try
chp = nlayer.CreateArtisticText(0, 0, ShapeNumber, cdrTextLanguage.cdrLanguageNone, cdrTextCharSet.cdrCharSetDefault, remark(0), txtsize, cdrFontStyle.cdrNormalFontStyle)
'chp = nlayer.CreateArtisticText(0, 0, ShapeNumber, cdrTextLanguage.cdrLanguageNone, cdrTextCharSet.cdrCharSetDefault, remark(0), txtsize, cdrFontStyle.cdrNormalFontStyle)
'Dim chpcolor As New VGCore.Color
Dim chpcolor As Color = New Color
chpcolor.RGBAssign(255, 255, 255)
chp.Fill.ApplyUniformFill(chpcolor)
Return chp
Catch ex As Exception
Return Nothing
End Try
End Function
'創建字體圖像
Public Function CreateTextImage2(nlayer As Layer, ShapeNumber As String, remark As String()) As Shape
Dim chp As Shape
Dim txtsize As Single
If Not txtsize.TryParse(remark(1), txtsize) Then
Return Nothing
End If
Try
chp = nlayer.CreateArtisticText(0, 0, ShapeNumber, cdrTextLanguage.cdrLanguageNone, cdrTextCharSet.cdrCharSetDefault, remark(0), txtsize, cdrFontStyle.cdrNormalFontStyle)
'chp = nlayer.CreateArtisticText(0, 0, ShapeNumber, cdrTextLanguage.cdrLanguageNone, cdrTextCharSet.cdrCharSetDefault, remark(0), txtsize, cdrFontStyle.cdrNormalFontStyle)
'Dim chpcolor As New VGCore.Color
Dim chpcolor As Color = New Color
chpcolor.RGBAssign(0, 0, 0)
chp.Fill.ApplyUniformFill(chpcolor)
Return chp
Catch ex As Exception
Return Nothing
End Try
End Function
Public Function CreateTextImage1(nlayer As Layer, ShapeNumber As String, LocationNode As LocationList) As Shape
Dim chp As Shape
Dim txtsize As Single
If Not txtsize.TryParse(LocationNode.ShapeFontSize, txtsize) Then
Return Nothing
End If
Try
chp = nlayer.CreateArtisticText(0, 0, ShapeNumber, cdrTextLanguage.cdrLanguageNone, cdrTextCharSet.cdrCharSetDefault, LocationNode.ShapeFont, txtsize, cdrFontStyle.cdrNormalFontStyle)
'chp = nlayer.CreateArtisticText(0, 0, ShapeNumber, cdrTextLanguage.cdrLanguageNone, cdrTextCharSet.cdrCharSetDefault, remark(0), txtsize, cdrFontStyle.cdrNormalFontStyle)
'Dim chpcolor As New VGCore.Color
Dim chpcolor As Color = New Color
Dim colorint As (Integer, Integer, Integer) = HexToRgb(LocationNode.ShapeColor)
chpcolor.RGBAssign(colorint.Item1, colorint.Item2, colorint.Item3)
chp.Fill.ApplyUniformFill(chpcolor)
chp.ConvertToCurves()
Return chp
Catch ex As Exception
Return Nothing
End Try
End Function
Public Sub shapeCopy(shp As Shape)
Try
shp.Copy()
Catch ex As Exception
''Console.WriteLine($"图像[{shp.Name}]复制失败!")
shapeCopy(shp)
End Try
End Sub
'处理节点信息
'Public Function HandleNodeInformation(node As RedisInfoNode) As Boolean
' Dim gLogNode As LogNode
' Dim ProjectPath As String
' Dim MaterialPath As String = M_MaterialPath & node.MaterialLibraryName
' Dim RsNode As New RedisSendNode
' RsNode.User = node.User
' RsNode.ProjectName = node.ProjectName
' RsNode.ProjectId = node.ProjectId
' RsNode.PictureNum = node.PictureNum
' Dim oldTime As DateTime = Now
' '判断素材库是否存在
' If Not File.Exists(MaterialPath) Then
' 'MsgBox("素材库不存在")
' RsNode.Status = RedisSendNode.StatusType.MaterialLibraryNotExist
' RsNode.Msg = "素材库不存在!"
' RedisPublishMessage(JsonConvert.SerializeObject(RsNode))
' gLogNode = New LogNode("素材库不存在", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
' gLogNode.SetLogColor(System.Drawing.Color.Red)
' G_Log.AddLogNode(gLogNode)
' Return False
' End If
' ProjectPath = $"{M_TplPath}{node.ProjectName}\{Now:yyyyMMdd}"
' '判断项目文件夹是否存在
' If Not Directory.Exists(ProjectPath) Then
' 'MsgBox("项目文件夹不存在")
' '创建文件夹
' Directory.CreateDirectory(ProjectPath)
' End If
' '''Console.WriteLine($"到达节点1耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
' ' Dim srcDoc As Document '素材文件
' Dim NewDoc As Document '成平文件
' Dim destLayer As Layer
' Dim shp As Shape = Nothing
' Dim dic As Dictionary(Of String, (Integer, Integer, Integer))
' 'Dim app As New Application() '打开CorelDRAW并显示
' '''Console.WriteLine($"到达节点2耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
' Try
' 'Thread.Sleep(2000)
' 'APP.documents.CloseAll()
' '打开素材文件
' '''Console.WriteLine($"到达节点11耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
' 'Thread.Sleep(500)
' '创建新的成平文件
' NewDoc = APP.CreateDocument()
' '''Console.WriteLine($"到达节点10耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
' '查询素材数据并以键值对保存
' dic = Gettbl_iconlibrary(node.MaterialLibraryName)
' If IsNothing(dic) OrElse dic.Count = 0 Then
' RsNode.Status = RedisSendNode.StatusType.GetMaterialFromDBFail
' RsNode.Msg = $"获取数据库素材失败!"
' RedisPublishMessage(JsonConvert.SerializeObject(RsNode))
' Return False
' End If
' '''Console.WriteLine($"到达节点3耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
' 'Thread.Sleep(500)
' destLayer = NewDoc.Pages(1).Layers(2)
' If queryThenIconTonewDoc(node.TemplateName, dic, G_LibDoc, destLayer, NewDoc.Pages(1)) Then
' '''Console.WriteLine($"到达节点4耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
' For Each item In node.MaterialDic
' If queryThenIconTonewDoc(item.Value, dic, G_LibDoc, destLayer) Then
' '''Console.WriteLine($"到达节点5耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
' If ReplaceTheCorrespondingImage(node.TemplateName, item.Key, item.Value, destLayer) Then
' NewDoc.Close()
' RsNode.Status = RedisSendNode.StatusType.MaterialPositionNotExist
' RsNode.Msg = $"未找到素材放置位置:'{item.Key}' !"
' RedisPublishMessage(JsonConvert.SerializeObject(RsNode))
' gLogNode = New LogNode($"未找到素材放置位置:'{item.Key}' !", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
' gLogNode.SetLogColor(System.Drawing.Color.Red)
' G_Log.AddLogNode(gLogNode)
' Return False
' End If
' Else
' NewDoc.Close()
' RsNode.Status = RedisSendNode.StatusType.MaterialNotExist
' RsNode.Msg = $"未找到素材:'{item.Value}' !"
' RedisPublishMessage(JsonConvert.SerializeObject(RsNode))
' gLogNode = New LogNode($"未找到素材:'{item.Value}' !", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
' gLogNode.SetLogColor(System.Drawing.Color.Red)
' G_Log.AddLogNode(gLogNode)
' Return False
' End If
' Next
' '''Console.WriteLine($"到达节点6耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
' Else
' NewDoc.Close()
' RsNode.Status = RedisSendNode.StatusType.TemplateNotExist
' RsNode.Msg = $"未找到模板'{node.TemplateName}'!!"
' RedisPublishMessage(JsonConvert.SerializeObject(RsNode))
' gLogNode = New LogNode($"未找到模板'{node.TemplateName}'!!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
' gLogNode.SetLogColor(System.Drawing.Color.Red)
' G_Log.AddLogNode(gLogNode)
' Return False
' End If
' SetIconName(node.TemplateName, destLayer)
' destLayer.SelectableShapes.All.Group().Name = node.TemplateName
' '''Console.WriteLine($"到达节点7耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
' ProjectPath = $"{ProjectPath}\{node.TemplateName.Replace("Mode_", "")}_{Now:yyyyMMddHHmmss}.cdr"
' MaterialPath = ProjectPath.Replace(".cdr", ".jpg")
' '// 4) 导出 JPG
' Dim Ef As ExportFilter = NewDoc.ExportBitmap(MaterialPath, VGCore.cdrFilter.cdrPNG)
' Ef.Finish()
' NewDoc.SaveAs(ProjectPath)
' '''Console.WriteLine($"到达节点8耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
' NewDoc.Close()
' RsNode.ImagePath = MaterialPath
' RsNode.CdrPath = ProjectPath
' RsNode.Status = RedisSendNode.StatusType.Success
' RsNode.Msg = "成功"
' RedisPublishMessage(JsonConvert.SerializeObject(RsNode))
' gLogNode = New LogNode($"'{node.TemplateName.Replace("Mode_", "")}'图像文件生成完毕!!!", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
' 'gLogNode.SetLogColor(System.Drawing.Color.Red)
' G_Log.AddLogNode(gLogNode)
' '''Console.WriteLine($"到达节点9耗时:{(Now - oldTime).TotalMilliseconds}毫秒")
' Return True
' Catch ex As Exception
' If Not IsNothing(NewDoc) Then
' ' NewDoc.Close()
' End If
' gLogNode = New LogNode(ex.Message, RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
' gLogNode.SetLogColor(System.Drawing.Color.Red)
' G_Log.AddLogNode(gLogNode)
' Return False
' End Try
' Return True
'End Function
'将hex转为rgb
Public Function HexToRgb(hex As String) As (Integer, Integer, Integer)
Try
If String.IsNullOrEmpty(hex) Then Return (255, 255, 255)
Dim r As Integer = Convert.ToInt32(hex.Substring(1, 2), 16)
Dim g As Integer = Convert.ToInt32(hex.Substring(3, 2), 16)
Dim b As Integer = Convert.ToInt32(hex.Substring(5, 2), 16)
Return (r, g, b)
Catch ex As Exception
Return (255, 255, 255)
End Try
End Function
Public Function Gettbl_iconlibrary(Version As String) As Dictionary(Of String, (Integer, Integer, Integer))
Dim dic As New Dictionary(Of String, (Integer, Integer, Integer))
Dim npgsqldb As DbExecutor = New DbExecutor(DbExecutor.DbTypeEnum.Mysql, LocalConnString)
Dim gLogNode As LogNode
'将列表中的数据库语句组装成事务语句
Dim transStr As String = $"select * from `Cdr_library`.`tbl_iconlibrary` where `Version` ='{Version}';"
'插入数据库
' Using db As New DbExecutor(DbExecutor.DbTypeEnum.npgsql, LocalConnString)
Dim dt As DataTable
Try
npgsqldb.Open()
' npgsqldb.ExecuteDataTable(transStr)
dt = npgsqldb.ExecuteDataTable(transStr)
'遍历行添加数据到dic
For Each row As DataRow In dt.Rows
If Not dic.ContainsKey(row("KeyName").ToString()) Then
dic.Add(row("KeyName").ToString(), (row("PageNumber"), row("LayerNumber"), row("Shapenumber")))
Else
dic.Item(row("KeyName").ToString()) = (row("PageNumber"), row("LayerNumber"), row("Shapenumber"))
End If
Next
npgsqldb.Close()
Catch ex As Exception
If Not IsNothing(npgsqldb) Then
npgsqldb.Close()
End If
'AddLogMessage($"写入酒店日志异常!")
gLogNode = New LogNode($"获取素材失败!{vbCrLf}{ex.Message}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return Nothing
End Try
'gLogNode = New LogNode($"获取素材成功!{vbCrLf}", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
''gLogNode.SetLogColor(System.Drawing.Color.Red)
'G_Log.AddLogNode(gLogNode)
Return dic
End Function
Public Sub SetIconToCentered(page As Page, nshape As Shape)
Dim totalW As Double, totalH As Double
totalW = page.SizeWidth
totalH = page.SizeHeight
Dim docCX As Double, docCY As Double
docCX = totalW / 2
docCY = totalH / 2
nshape.SetPosition(docCX - nshape.SizeWidth / 2, totalH - nshape.SizeHeight / 2)
'nshape.CenterX = page.Width / 2
'nshape.CenterY = page.Height / 2
'nshape.Move(docCX, docCY)
End Sub
'''
'''
'''
''' 被替换的图像
''' 用来替换的图像名
'''
'''
'替换对应图像
Public Function ReplaceTheCorrespondingImage(TemplateName As String, iconnameA As String, iconnameB As String, destLayer As Layer) As Boolean
Dim gLogNode As LogNode
Dim shpA, shpB As Shape
Dim x#, y#, w#, h#
Dim dx As Double, dy As Double
For Each shp As Shape In destLayer.Shapes
'''Console.WriteLine(shp.Name)
If shp.Name.Equals(TemplateName.Trim) Then
For Each shp2 As Shape In shp.Shapes
If shp2.Name.Equals(iconnameA.Trim) Then
shpA = shp2
Exit For
End If
Next
End If
If shp.Name.Equals(iconnameB.Trim) Then
shpB = shp
End If
Next
If shpA Is Nothing Then
Return False
End If
If shpB Is Nothing Then
Return True
End If
x = shpA.CenterX - shpB.CenterX
y = shpA.CenterY - shpB.CenterY
dx = shpA.LeftX
dy = shpA.TopY
'''Console.WriteLine(shpA.Name)
shpB.Move(x, y)
shpA.Delete()
End Function
'设置图像名称
Public Function SetIconName(iconname As String, destLayer As Layer) As Boolean
For Each shp As Shape In destLayer.Shapes
If shp.Name.Equals(iconname.Trim) Then
If shp.Type = cdrShapeType.cdrGroupShape Then
shp.Ungroup()
End If
End If
Next
End Function
'''
''' 查找图像并拷贝到目标图层 中
'''
'''
'''
'''
'''
Public Function queryThenIconTonewDoc(iconname As String, dic As Dictionary(Of String, (Integer, Integer, Integer)), srcDoc As Document, destLayer As Layer, Optional fpage As Page = Nothing) As Boolean
If String.IsNullOrEmpty(iconname) Then Return True
Dim val As (Integer, Integer, Integer)
Dim nshape As Shape
If dic.ContainsKey(iconname.Trim) Then
val = dic(iconname.Trim)
Else
Return False
End If
Dim page As Page = srcDoc.Pages(val.Item1)
Dim layer As Layer = page.Layers(val.Item2)
Dim shape As Shape = layer.Shapes(val.Item3)
' srcDoc.Pages(val.Item1).Layers(val.Item2).Shapes(val.Item3).Copy()
'nshape.Copy()
shape.Copy()
nshape = destLayer.Paste()
If Not IsNothing(fpage) Then
SetIconToCentered(fpage, nshape)
End If
Return True
'遍历素材文件内的所有图层
'For Each nPage As Page In srcDoc.Pages
' '''Console.WriteLine(nPage.Name)
' '遍历图层内的所有图像
' For Each Layer As Layer In nPage.Layers
' '''Console.WriteLine(Layer.Name)
' For Each Shape As Shape In Layer.Shapes
' '''Console.WriteLine(Shape.Name)
' '判断模板图像是否存在
' If Shape.Name.Equals(iconname.Trim) Then
' Shape.Copy()
' nshape = destLayer.Paste()
' If Not IsNothing(fpage) Then
' SetIconToCentered(fpage, nshape)
' End If
' Return True
' End If
' Next
' Next
'Next
'Return False
End Function
'获取系统缓存参数
Public Sub GetSeting()
'刷新系统缓存
My.Settings.Reload()
'获取系统缓存参数
'ComboBox1.Text = My.Settings.SerialPortName
'ComboBox2.Text = My.Settings.BaudRate
If My.Settings.THigh = 0 OrElse My.Settings.TWide = 0 Then
Else
Me.Height = My.Settings.THigh
Me.Width = My.Settings.TWide
End If
G_Subscribe = My.Settings.G_Subscribe
G_Publish = My.Settings.G_Publish
ToolStripTextBox2.Text = G_Subscribe
ToolStripTextBox1.Text = G_Publish
'Dim dic As Dictionary(Of Integer, (String, String, String))
'dic = JsonConvert.DeserializeObject(Of Dictionary(Of Integer, (String, String, String)))(My.Settings.GTable)
'If IsNothing(dic) OrElse dic.Count = 0 Then Return
'JsonConvert.SerializeObject(m_Applicationconfig)
End Sub
'保存系统缓存参数
Public Sub SaveSeting()
'刷新系统缓存
My.Settings.Reload()
'获取系统缓存参数
'My.Settings.SerialPortName = ComboBox1.Text
'My.Settings.BaudRate = ComboBox2.Text
My.Settings.THigh = Me.Height
My.Settings.TWide = Me.Width
My.Settings.G_Subscribe = G_Subscribe
My.Settings.G_Publish = G_Publish
Dim dic As New Dictionary(Of Integer, (String, String, String))
'My.Settings.GTable = JsonConvert.SerializeObject(dic)
My.Settings.Save()
End Sub
Public Sub initRedisPublisher()
If Not IsNothing(G_Redislish) AndAlso G_Redislish.IsConnected Then
G_Redislish.CloseConnection()
End If
' 替换为你的 Redis 连接字符串
'Dim connectionString = "127.0.0.1:6379"
Try
G_Redislish = New RedisSubscriber(M_Redisip, M_Redisport, M_Redispassword)
Catch ex As Exception
MsgBox($"redis发布初始化失败:{ex.Message}")
End Try
End Sub
Public Sub RedisPublishMessage(message As String)
If String.IsNullOrEmpty(G_Publish) Then
MsgBox("未设置发布频道")
Return
End If
If String.IsNullOrEmpty(message) Then
MsgBox("未输入发布内容")
Return
End If
If G_Redislish.IsConnected Then
Dim gLogNode As LogNode
Try
G_Redislish.PublishMessage(G_Publish, message)
gLogNode = New LogNode($"Redis:{G_Publish}: {message}", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
G_Log.AddLogNode(gLogNode)
Catch ex As Exception
'MsgBox($"redis发布失败:{ex.Message}")
gLogNode = New LogNode(ex.Message, RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
End Try
Else
MsgBox("redis未连接")
End If
End Sub
Public Sub RedisPublishMessage1(key As String, message As String)
If String.IsNullOrEmpty(G_Publish) Then
MsgBox("未设置发布频道")
Return
End If
If String.IsNullOrEmpty(message) Then
MsgBox("未输入发布内容")
Return
End If
Dim gLogNode As LogNode
Try
Dim config As ConfigurationOptions = New ConfigurationOptions()
config.EndPoints.Add(M_Redisip, M_Redisport) ' 设置Redis服务器地址和端口
config.Password = M_Redispassword ' 设置Redis密码
config.AbortOnConnectFail = False ' 连接失败时不中止
Dim conn = ConnectionMultiplexer.Connect(config)
Dim db = conn.GetDatabase(0)
db.StringSet(key, message)
gLogNode = New LogNode($"Redis:{G_Publish}: {message}", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
G_Log.AddLogNode(gLogNode)
Catch ex As Exception
'MsgBox($"redis发布失败:{ex.Message}")
gLogNode = New LogNode(ex.Message, RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
End Try
End Sub
Private Sub ToolStripButton4_Click(sender As Object, e As EventArgs) Handles ToolStripButton4.Click
If String.IsNullOrEmpty(ToolStripTextBox2.Text) Then
MsgBox("请输入订阅频道")
Return
Else
G_OldSubscribe = G_Subscribe
G_Subscribe = ToolStripTextBox2.Text.Trim
End If
If String.IsNullOrEmpty(ToolStripTextBox1.Text) Then
MsgBox("请输入发布频道")
Return
Else
G_Publish = ToolStripTextBox1.Text.Trim
End If
initRedisSubscriber(G_Subscribe, G_OldSubscribe)
initRedisPublisher()
End Sub
Public Sub initRedisSubscriber(Subscribe As String, OldSubscribe As String)
If String.IsNullOrEmpty(Subscribe) Then
MsgBox("未设置订阅频道")
Return
End If
If Not IsNothing(G_RedisSub) AndAlso G_RedisSub.IsConnected Then
' 取消订阅并关闭连接
G_RedisSub.UnsubscribeFromChannel(OldSubscribe)
G_RedisSub.CloseConnection()
End If
' 替换为你的 Redis 连接字符串
' Dim connectionString = "127.0.0.1:10079,password="
Try
G_RedisSub = New RedisSubscriber(M_Redisip, M_Redisport, M_Redispassword)
' 定义消息处理程序
Dim messageHandler As Action(Of RedisChannel, RedisValue) = Sub(channel, message)
'将消息输出添加到队列
Dim gLogNode As LogNode
Dim g_CallInfoNode As RedisMsgNode
Try
g_CallInfoNode = JsonConvert.DeserializeObject(Of RedisMsgNode)(message)
Catch ex As Exception
'MsgBox($"消息解析失败:{ex.Message}")
gLogNode = New LogNode(ex.Message, RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End Try
If IsNothing(g_CallInfoNode) Then
gLogNode = New LogNode($"【序列化失败】Redis:{channel}: {message}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
gLogNode = New LogNode($"Redis:{channel}: {message}", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
G_Log.AddLogNode(gLogNode)
M_RedisQueue.Enqueue(g_CallInfoNode)
'RuningLog.OutputLogsToTheControl(RichTextBox1, New RuningLogConfig($"Redis接收到来自 {channel} 的消息: {message}", System.Drawing.Color.DarkOrange, 12), 1)
''''Console.WriteLine($"接收到来自 {channel} 的消息: {message}")
End Sub
' 订阅频道
G_RedisSub.SubscribeToChannel(Subscribe, messageHandler)
Catch ex As Exception
MsgBox($"订阅失败:{ex.Message}")
End Try
'' 发布消息示例
''''Console.WriteLine("发布测试消息...")
'G_RedisSub.PublishMessage("testChannel", "Hello from publisher!")
'' 保持程序运行以接收更多消息
''''Console.WriteLine("按任意键退出...")
'''Console.ReadKey()
End Sub
Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
If RichTextBox1.Lines.Length > 2147000000 Then
RichTextBox1.Clear()
End If
End Sub
' 用于存储文件名和对应id的字典
Private M_FileIdDict As New Dictionary(Of String, Integer)
Private Sub ToolStripComboBox1_DropDown(sender As Object, e As EventArgs) Handles ToolStripComboBox1.DropDown
' 清空下拉列表和字典
ToolStripComboBox1.Items.Clear()
M_FileIdDict.Clear()
Dim npgsqldb As DbExecutor = New DbExecutor(DbExecutor.DbTypeEnum.Mysql, LocalConnString)
Dim gLogNode As LogNode
' 从tbl_cdr_file表查询图库文件名和文件对应id
Dim transStr As String = "select id, filename from `cdr_library`.`tbl_cdr_file`;"
Dim dt As DataTable
Try
npgsqldb.Open()
dt = npgsqldb.ExecuteDataTable(transStr)
' 将查询结果填充到ToolStripComboBox1下拉框中
For Each row As DataRow In dt.Rows
Dim id As Integer = row("id")
Dim filename As String = row("filename")
' 将id和filename存储到字典中
M_FileIdDict.Add(filename, id)
' 下拉框中只显示文件名
ToolStripComboBox1.Items.Add(filename)
Next
npgsqldb.Close()
Catch ex As Exception
If Not IsNothing(npgsqldb) Then
npgsqldb.Close()
End If
gLogNode = New LogNode($"查询图库文件失败!{vbCrLf}{ex.Message}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
End Try
End Sub
Private Sub ToolStripButton3_Click(sender As Object, e As EventArgs) Handles ToolStripButton3.Click
RichTextBox1.Clear()
Dim dic As New Dictionary(Of String, String)
'dic.Add("a", "1")
''将dic 序列化成字符串
'Dim json As String = JsonConvert.SerializeObject(dic)
''控制台输出(json)
''''Console.WriteLine(json)
End Sub
Private Sub CorelDRAW_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
SaveSeting()
RedisClose()
If Not IsNothing(M_EventThread) AndAlso M_EventThread.IsAlive Then
M_EventThread.Abort()
End If
If Not IsNothing(G_Log) Then
G_Log.CloseThread()
End If
End Sub
'关闭redis
Public Sub RedisClose()
If Not IsNothing(G_RedisSub) AndAlso G_RedisSub.IsConnected Then
G_RedisSub.UnsubscribeFromChannel(G_Subscribe)
G_RedisSub.CloseConnection()
End If
If Not IsNothing(G_Redislish) AndAlso G_Redislish.IsConnected Then
G_Redislish.CloseConnection()
End If
End Sub
Private Sub ToolStripButton1_Click_1(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
'打开文件选择器 选择cDR后缀的文件
Dim ServerFilePath As String = M_ServerPath ' "R:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic" ' "D:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic" '
Dim OpenFileDialog1 As New OpenFileDialog()
OpenFileDialog1.Filter = "CorelDRAW Files (*.cdr)|*.cdr"
Dim srcDoc As Document '素材文件
Dim MaterialPath As String
Dim strbuf() As String
Dim li As New List(Of String)
Dim Version As String
Dim Location As String
Dim icontype As Integer
Dim pint, lint, Sint, Locationint, nsint, typeid As Integer
Dim gLogNode As LogNode
Dim ProjectPath As String
Dim SafeFileName As String
Dim errorMessage As String
Dim xvbnode As Shape
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
' 上传前检查文件是否符合规范
If Not CheckLibraryFile(OpenFileDialog1.FileName, errorMessage) Then
gLogNode = New LogNode($"图库文件检测失败:{errorMessage}{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
MessageBox.Show(errorMessage, "文件检测失败", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
Dim fid As Integer = AddFileToSQL(OpenFileDialog1.SafeFileName)
If fid = -1 Then
gLogNode = New LogNode($"获取FId失败,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
'创建以文件名去除后缀 命名的文件夹
SafeFileName = OpenFileDialog1.SafeFileName.Substring(0, OpenFileDialog1.SafeFileName.LastIndexOf("."))
ProjectPath = ServerFilePath & "\" & SafeFileName
If Not Directory.Exists(ProjectPath) Then
Directory.CreateDirectory(ProjectPath)
End If
If Not Directory.Exists(ProjectPath & "\iconlibrary\") Then
Directory.CreateDirectory(ProjectPath & "\iconlibrary\")
End If
MaterialPath = OpenFileDialog1.FileName
srcDoc = APP.OpenDocument(MaterialPath, False)
'Version=文件名称
Version = srcDoc.Name
'遍历素材文件内的所有图层
Dim nshape As Shape
pint = 0
lint = 0
Sint = 0
nsint = 0
Dim xm, hm, wm As Double
Dim modeindex As Integer = 0
'遍历所有页
For Each nPage As Page In srcDoc.Pages
'''Console.WriteLine("PAGE:" & nPage.Name)
pint = pint + 1
lint = 0
'遍历图层内的所有图层
For Each Layer As Layer In nPage.Layers
'''Console.WriteLine("Layer:" & Layer.Name)
lint = lint + 1
Sint = 0
'遍历图层内的所有形状
For Each Shape As Shape In Layer.Shapes
Sint = Sint + 1
If String.IsNullOrEmpty(Shape.Name) Then Continue For
'''Console.WriteLine("Shape:" & Shape.Name)
strbuf = Shape.Name.Split("_")
If strbuf.Length < 2 Then Continue For
Location = $"{pint}_{lint}_{Sint}"
Select Case strbuf(0).ToLower
Case "Mode".ToLower
For i = Shape.Shapes.Count To 1 Step -1
xvbnode = Shape.Shapes.Item(i)
'将子节点中名称带有Effect _ 的节点删除
If xvbnode.Name.Contains("Effect") Then
xvbnode.Visible = False
End If
Next
Dim modepath As String = $"{ProjectPath}\Mode\"
If Not Directory.Exists(modepath) Then
Directory.CreateDirectory(modepath)
End If
Dim Direction As String
Direction = strbuf(1).Replace("连体", "").Trim
If Not Double.TryParse(Direction, xm) Then
gLogNode = New LogNode($"图像{Shape.Name}异常,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
If Not Double.TryParse(strbuf(4), wm) Then
gLogNode = New LogNode($"图像{Shape.Name}异常,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
If Not Double.TryParse(strbuf(5), hm) Then
gLogNode = New LogNode($"图像{Shape.Name}异常,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
If strbuf(2).Equals("横向") OrElse strbuf(2).Equals("竖向") Then
Direction = strbuf(2).Trim
Else
gLogNode = New LogNode($"图像{Shape.Name}异常,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
modepath = $"{SafeFileName}\Mode\{Shape.Name}.png"
nsint = AddModeToSql(Shape.Name, fid, Location, Direction, xm, wm, hm, strbuf(3), modepath)
modepath = $"{ProjectPath}\Mode\{Shape.Name}.png"
If nsint = -1 Then
gLogNode = New LogNode($"图像{Shape.Name}异常,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
Dim schpcolor As New Color
schpcolor.RGBAssign(255, 255, 255)
schpcolor = SetImageStyle1(Shape, True, schpcolor)
Shape.Selected = True
Dim Ef As ExportFilter = srcDoc.ExportBitmap(modepath, VGCore.cdrFilter.cdrPNG, VGCore.cdrExportRange.cdrSelection, VGCore.cdrImageType.cdrRGBColorImage)
Ef.Finish()
SetImageStyle1(Shape, False, schpcolor)
Shape.Selected = False
If modeindex = 0 Then
modeindex = modeindex + 1
'更新 tbl_cdr_file表
Shape.Selected = True
modepath = $"{ProjectPath}\Mode\ShapeName.png"
Dim NEf As ExportFilter = srcDoc.ExportBitmap(modepath, VGCore.cdrFilter.cdrPNG, VGCore.cdrExportRange.cdrSelection, VGCore.cdrImageType.cdrRGBColorImage)
NEf.Finish()
Shape.Selected = False
modepath = $"{SafeFileName}\Mode\ShapeName.png"
Dim sql As String = $"UPDATE `Cdr_library`.`tbl_cdr_file` SET `PreviewPath` = '{modepath.Replace("\", "\\")}' WHERE `ID` = {fid};{vbCrLf}"
li.Add(sql)
End If
Locationint = 0
For Each nshape In Shape.Shapes
Locationint = Locationint + 1
If nshape.Name.Contains("Trench_") Then
Dim cstrbuf As String() = nshape.Name.Split("_")
If Not Double.TryParse(cstrbuf(2), wm) Then
gLogNode = New LogNode($"图像{Shape.Name}异常,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
If Not Double.TryParse(cstrbuf(3), hm) Then
gLogNode = New LogNode($"图像{Shape.Name}异常,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
li.Add($"INSERT INTO `Cdr_library`.`tbl_trench` (`MID`,`TrenchName`,`SizeH`,`SizeW`,`IndexNum`)VALUES({nsint},'{nshape.Name.Trim}',{hm},{wm},{Locationint});{vbCrLf}")
ElseIf nshape.Name.Contains("Logo_") Then
Dim cstrbuf As String() = nshape.Name.Split("_")
If Not Double.TryParse(cstrbuf(3), wm) Then
gLogNode = New LogNode($"图像{Shape.Name}异常,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
If Not Double.TryParse(cstrbuf(4), hm) Then
gLogNode = New LogNode($"图像{Shape.Name}异常,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
'判断 第3个元素 是否为R或L
If cstrbuf(2).Trim.ToLower = "l" Then
li.Add($"UPDATE `Cdr_library`.`tbl_model` SET `LOGO_L` = '{Locationint}',`LOGO_L_W` = {wm},`LOGO_L_H` = {hm} WHERE `ID` = {nsint};{vbCrLf}")
ElseIf cstrbuf(2).Trim.ToLower = "r" Then
'更新 tbl_model 表
li.Add($"UPDATE `Cdr_library`.`tbl_model` SET `LOGO_R` = '{Locationint}',`LOGO_R_W` = {wm},`LOGO_R_H` = {hm} WHERE `ID` = {nsint};{vbCrLf}")
End If
End If
Next
Case "Mono".ToLower
Dim modepath As String = $"{ProjectPath}\Mono"
If Not Directory.Exists(modepath) Then
Directory.CreateDirectory(modepath)
End If
modepath = $"{SafeFileName}\Mono\{Shape.Name}.png"
nsint = AddMonoToSQL(Shape.Name, fid, Location, modepath)
modepath = $"{ProjectPath}\Mono\{Shape.Name}.png"
If nsint = -1 Then
gLogNode = New LogNode($"图像{Shape.Name}异常,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
Dim schpcolor As New Color
schpcolor.RGBAssign(255, 255, 255)
schpcolor = SetImageStyle(Shape, True, schpcolor)
Shape.Selected = True
Dim Ef As ExportFilter = srcDoc.ExportBitmap(modepath, VGCore.cdrFilter.cdrPNG, VGCore.cdrExportRange.cdrSelection, VGCore.cdrImageType.cdrRGBColorImage)
Ef.Finish()
SetImageStyle(Shape, False, schpcolor)
Shape.Selected = False
Dim dic As New Dictionary(Of String, Integer)
Locationint = 0
Dim Keygroup As Integer = 1
Dim KeygroupID As Integer = 0
For Each nshape In Shape.Shapes
Locationint = Locationint + 1
If nshape.Name.Contains("location_") Then
Dim cstrbuf As String() = nshape.Name.Split("_")
If dic.ContainsKey(cstrbuf(2).Trim) Then
KeygroupID = dic(cstrbuf(2).Trim)
Else
Keygroup = Keygroup + 1
KeygroupID = Keygroup
dic.Add(cstrbuf(2).Trim, Keygroup)
End If
If Not Double.TryParse(cstrbuf(3), wm) Then
gLogNode = New LogNode($"图像{Shape.Name}异常,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
If Not Double.TryParse(cstrbuf(4), hm) Then
gLogNode = New LogNode($"图像{Shape.Name}异常,上传素材失败!{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return
End If
typeid = GetIconType(cstrbuf(1).Trim)
If typeid = 3 Then
If cstrbuf.Length > 5 Then
li.Add($"INSERT INTO `Cdr_library`.`tbl_location` (`PID`,`LocationName`,`Type`,`SizeH`,`SizeW`,`IndexNum`,`lineNumber`,`KeyGroup`)VALUES({nsint},'{nshape.Name.Trim}','{typeid}',{hm},{wm},{Locationint},'{cstrbuf(5).Trim}',{KeygroupID});{vbCrLf}")
Else
li.Add($"INSERT INTO `Cdr_library`.`tbl_location` (`PID`,`LocationName`,`Type`,`SizeH`,`SizeW`,`IndexNum`,`KeyGroup`)VALUES({nsint},'{nshape.Name.Trim}','{typeid}',{hm},{wm},{Locationint},{KeygroupID});{vbCrLf}")
End If
Else
li.Add($"INSERT INTO `Cdr_library`.`tbl_location` (`PID`,`LocationName`,`Type`,`SizeH`,`SizeW`,`IndexNum`,`KeyGroup`)VALUES({nsint},'{nshape.Name.Trim}','{typeid}',{hm},{wm},{Locationint},{KeygroupID});{vbCrLf}")
End If
End If
Next
Case "Icon".ToLower
Dim chpcolor As New Color
Dim ShapeName As String = Shape.Name.Trim
ShapeName = ShapeName.Replace("%", "").Replace("/", "").Replace(":", "").Replace("*", "").Replace("?", "").Replace("""", "").Replace("<", "").Replace(">", "").Replace("|", "").Replace("+", "")
chpcolor.RGBAssign(0, 0, 0)
Shape.Fill.ApplyUniformFill(chpcolor)
Dim modepath As String = $"{ProjectPath}\iconlibrary\{ShapeName}.png"
Console.WriteLine(modepath)
Shape.Selected = True
Dim Ef As ExportFilter = srcDoc.ExportBitmap(modepath, VGCore.cdrFilter.cdrPNG, VGCore.cdrExportRange.cdrSelection, VGCore.cdrImageType.cdrRGBColorImage)
Ef.Finish()
Dim KeyNamebuf As String() = Shape.Name.Trim.Split("_")
chpcolor.RGBAssign(255, 255, 255)
Shape.Fill.ApplyUniformFill(chpcolor)
Shape.Selected = False
modepath = $"{SafeFileName}\iconlibrary\{ShapeName}.png"
modepath = modepath.Replace("\", "\\")
'文件名不能包含以下字符:反斜杠(\)、正斜杠(/)、冒号(:)、星号(*)、问号(?)、双引号(")、小于号(<)、大于号(>)、竖线(|),以及点(.)或百分号(%)作为名称。
icontype = 1
li.Add($"INSERT INTO `Cdr_library`.`tbl_iconlibrary` (`IconType`,`KeyName`,`FID`,`Shapenumber`,`PreviewPath`,`NameCN`,`NameEn`)VALUES({icontype},'{Shape.Name.Trim}',{fid},'{Location}','{modepath}','{KeyNamebuf(1) }','{KeyNamebuf(2) }');{vbCrLf}")
Case "Txt".ToLower
Dim chpcolor As New Color
chpcolor.RGBAssign(0, 0, 0)
Shape.Fill.ApplyUniformFill(chpcolor)
Dim modepath As String = $"{ProjectPath}\iconlibrary\{Shape.Name}.png"
Shape.Selected = True
Dim Ef As ExportFilter = srcDoc.ExportBitmap(modepath, VGCore.cdrFilter.cdrPNG, VGCore.cdrExportRange.cdrSelection, VGCore.cdrImageType.cdrRGBColorImage)
Ef.Finish()
chpcolor.RGBAssign(255, 255, 255)
Shape.Fill.ApplyUniformFill(chpcolor)
Shape.Selected = False
modepath = $"{SafeFileName}\iconlibrary\{Shape.Name}.png"
modepath = modepath.Replace("\", "\\")
icontype = 2
li.Add($"INSERT INTO `Cdr_library`.`tbl_iconlibrary` (`IconType`,`KeyName`,`FID`,`Shapenumber`,`PreviewPath`)VALUES({icontype},'{Shape.Name.Trim}',{fid},'{Location}','{modepath}');{vbCrLf}")
Case "TxtEn".ToLower
Dim chpcolor As New Color
chpcolor.RGBAssign(0, 0, 0)
Shape.Fill.ApplyUniformFill(chpcolor)
Dim modepath As String = $"{ProjectPath}\iconlibrary\{Shape.Name}.png"
Shape.Selected = True
Dim Ef As ExportFilter = srcDoc.ExportBitmap(modepath, VGCore.cdrFilter.cdrPNG, VGCore.cdrExportRange.cdrSelection, VGCore.cdrImageType.cdrRGBColorImage)
Ef.Finish()
chpcolor.RGBAssign(255, 255, 255)
Shape.Fill.ApplyUniformFill(chpcolor)
Shape.Selected = False
modepath = $"{SafeFileName}\iconlibrary\{Shape.Name}.png"
modepath = modepath.Replace("\", "\\")
icontype = 3
li.Add($"INSERT INTO `Cdr_library`.`tbl_iconlibrary` (`IconType`,`KeyName`,`FID`,`Shapenumber`,`PreviewPath`)VALUES({icontype},'{Shape.Name.Trim}',{fid},'{Location}','{modepath}');{vbCrLf}")
'Case "IconB".ToLower
' icontype = 5
' li.Add($"INSERT INTO `Cdr_library`.`tbl_iconlibrary` (`IconType`,`KeyName`,`Version`,`Shapenumber`)VALUES({icontype},'{Shape.Name.Trim}','{Version.Trim}','{Location}');{vbCrLf}")
Case "Logo".ToLower
Dim chpcolor As New Color
chpcolor.RGBAssign(0, 0, 0)
Shape.Fill.ApplyUniformFill(chpcolor)
Dim modepath As String = $"{ProjectPath}\iconlibrary\{Shape.Name}.png"
Shape.Selected = True
Dim Ef As ExportFilter = srcDoc.ExportBitmap(modepath, VGCore.cdrFilter.cdrPNG, VGCore.cdrExportRange.cdrSelection, VGCore.cdrImageType.cdrRGBColorImage)
Ef.Finish()
chpcolor.RGBAssign(255, 255, 255)
Shape.Fill.ApplyUniformFill(chpcolor)
Shape.Selected = False
modepath = $"{SafeFileName}\iconlibrary\{Shape.Name}.png"
modepath = modepath.Replace("\", "\\")
icontype = 4
li.Add($"INSERT INTO `Cdr_library`.`tbl_iconlibrary` (`IconType`,`KeyName`,`FID`,`Shapenumber`,`PreviewPath`)VALUES({icontype},'{Shape.Name.Trim}',{fid},'{Location}','{modepath}');{vbCrLf}")
Case Else
Continue For
End Select
If li.Count >= 500 Then
If AddLogMessageToSQL(li) Then
li.Clear()
Else
srcDoc.Close()
Return
End If
End If
Next
Next
Next
If AddLogMessageToSQL(li) Then
li.Clear()
Else
srcDoc.Close()
Return
End If
srcDoc.Close()
End If
End Sub
Private Function SetImageStyle1(Shape As Shape, isTransparent As Boolean, Transparentcolor As Color)
'设置图像背景色为透明
Dim Transparent As Integer
Dim chpcolor As New Color
Dim result As New Color
Dim r, g, b, a As Integer
If isTransparent Then
Transparent = 100
chpcolor.RGBAssign(102, 102, 102)
Else
Transparent = 0
chpcolor.RGBAssign(255, 255, 255)
End If
For i As Integer = 1 To Shape.Shapes.Count
If Shape.Shapes(i).Name.ToLower.Contains("IconB".ToLower) Then
Select Case Shape.Shapes(i).Fill.UniformColor.Type
Case cdrColorType.cdrColorCMYK
Dim C As Double, M As Double, Y As Double, K As Double
C = Shape.Shapes(i).Fill.UniformColor.CMYKCyan
M = Shape.Shapes(i).Fill.UniformColor.CMYKMagenta
Y = Shape.Shapes(i).Fill.UniformColor.CMYKYellow
K = Shape.Shapes(i).Fill.UniformColor.CMYKBlack
result.CMYKAssign(C, M, Y, K)
Case cdrColorType.cdrColorRGB
r = Shape.Shapes(i).Fill.UniformColor.RGBRed
g = Shape.Shapes(i).Fill.UniformColor.RGBGreen
b = Shape.Shapes(i).Fill.UniformColor.RGBBlue
result.RGBAssign(r, g, b)
Case Else
result.RGBAssign(255, 255, 255)
End Select
'Shape.Shapes(i).Transparency.ApplyUniformTransparency(Transparent)
Shape.Shapes(i).Fill.ApplyUniformFill(Transparentcolor)
Else
Shape.Shapes(i).Fill.ApplyUniformFill(chpcolor)
End If
Next
Return result
End Function
'设置图片样式
Private Function SetImageStyle(Shape As Shape, isTransparent As Boolean, Transparentcolor As Color)
'设置图像背景色为透明
Dim Transparent As Integer
Dim chpcolor As New Color
Dim result As New Color
Dim r, g, b, a As Integer
If isTransparent Then
Transparent = 100
chpcolor.RGBAssign(102, 102, 102)
Else
Transparent = 0
chpcolor.RGBAssign(255, 255, 255)
End If
For i As Integer = 1 To Shape.Shapes.Count
If i = Shape.Shapes.Count Then
Select Case Shape.Shapes(i).Fill.UniformColor.Type
Case cdrColorType.cdrColorCMYK
Dim C As Double, M As Double, Y As Double, K As Double
C = Shape.Shapes(i).Fill.UniformColor.CMYKCyan
M = Shape.Shapes(i).Fill.UniformColor.CMYKMagenta
Y = Shape.Shapes(i).Fill.UniformColor.CMYKYellow
K = Shape.Shapes(i).Fill.UniformColor.CMYKBlack
result.CMYKAssign(C, M, Y, K)
Case cdrColorType.cdrColorRGB
r = Shape.Shapes(i).Fill.UniformColor.RGBRed
g = Shape.Shapes(i).Fill.UniformColor.RGBGreen
b = Shape.Shapes(i).Fill.UniformColor.RGBBlue
result.RGBAssign(r, g, b)
Case Else
result.RGBAssign(255, 255, 255)
End Select
'Shape.Shapes(i).Transparency.ApplyUniformTransparency(Transparent)
Shape.Shapes(i).Fill.ApplyUniformFill(Transparentcolor)
Else
Shape.Shapes(i).Fill.ApplyUniformFill(chpcolor)
End If
Next
Return result
End Function
'获取类型信息
Private Function GetIconType(Shapetype As String) As Integer
Select Case Shapetype.ToLower
Case "Icon".ToLower
Return 1
Case "Txt".ToLower
Return 2
Case "TxtEn".ToLower
Return 3
'Case "IconB".ToLower
' Return 5
Case "Logo".ToLower
Return 5
Case Else
Return 0
End Select
End Function
Public Function AddModeToSql(modename As String, fid As Integer, Location As String, Direction As String, xm As Integer, wm As Integer, hm As Integer, Colorstr As String, PreviewPath As String) As Integer
Dim npgsqldb As DbExecutor = New DbExecutor(DbExecutor.DbTypeEnum.Mysql, LocalConnString)
Dim transStr As String
Dim transStr1 As String
Dim dt As DataTable
Dim result As Integer = -1
PreviewPath = PreviewPath.Replace("\", "\\")
transStr = $"INSERT INTO `Cdr_library`.`tbl_model` (`FID`,`ModelName`,`Direction`,`SizeH`,`SizeW`,`Color`,`PanelCount`,`ShapeNumber`,`PreviewPath`)VALUES({fid},'{modename}','{Direction}',{hm},{wm},'{Colorstr}',{xm},'{Location}','{PreviewPath}');{vbCrLf}"
transStr1 = $"select * From `Cdr_library`.`tbl_model` where `FID`={fid} and `ModelName`='{modename}'"
Try
npgsqldb.Open()
npgsqldb.ExecuteNonQuery(transStr)
dt = npgsqldb.ExecuteDataTable(transStr1)
If dt.Rows.Count > 0 Then
result = dt.Rows(0).Item("ID")
End If
npgsqldb.Close()
Catch ex As Exception
If Not IsNothing(npgsqldb) Then
npgsqldb.Close()
End If
End Try
Return result
End Function
Private Function AddMonoToSQL(Mononame As String, Fid As Integer, Location As String, PreviewPath As String) As Integer
Dim npgsqldb As DbExecutor = New DbExecutor(DbExecutor.DbTypeEnum.Mysql, LocalConnString)
Dim strbuf As String() = Mononame.Split("_")
Dim transStr As String
Dim transStr1 As String
Dim dt As DataTable
Dim result As Integer = -1
Dim xm, hm, wm As Double
PreviewPath = PreviewPath.Replace("\", "\\")
If strbuf.Length > 3 Then
If Not Double.TryParse(strbuf(2), wm) Then
Return result
End If
If Not Double.TryParse(strbuf(3), hm) Then
Return result
End If
transStr = $"INSERT INTO `Cdr_library`.`tbl_pattern` (`FID`,`PatternName`,`ShapeNumber`,`SizeW`,`SizeH`,`PreviewPath`)VALUES({Fid},'{Mononame}','{Location}',{wm},{hm},'{PreviewPath}');{vbCrLf}"
Else
Return result
End If
transStr1 = $"select * From `Cdr_library`.`tbl_pattern` where `FID`={Fid} and `PatternName`='{Mononame}'"
Try
npgsqldb.Open()
npgsqldb.ExecuteNonQuery(transStr)
dt = npgsqldb.ExecuteDataTable(transStr1)
If dt.Rows.Count > 0 Then
result = dt.Rows(0).Item("ID")
End If
npgsqldb.Close()
Catch ex As Exception
If Not IsNothing(npgsqldb) Then
npgsqldb.Close()
End If
End Try
Return result
End Function
'录入文件到数据表
Private Function AddFileToSQL(filenmae As String, Optional username As String = "TestUser", Optional Remark As String = "") As Integer
Dim npgsqldb As DbExecutor = New DbExecutor(DbExecutor.DbTypeEnum.Mysql, LocalConnString)
Dim gLogNode As LogNode
Dim strbuf As String() = filenmae.Split("_")
Dim transStr As String
Dim transStr1 As String
Dim transStr2 As String
Dim dt As DataTable
Dim result As Integer = -1
If strbuf.Length > 3 Then
transStr = $"INSERT INTO `Cdr_library`.`tbl_cdr_file` (`Company`,`Series`,`FileName`,`Version`,`Remark`,`User`,`UpdateTime`)VALUES('{strbuf(0)}','{strbuf(1)}','{filenmae}','{strbuf(3)}','{Remark}','{username}','{Now.ToString("yyyy-MM-dd HH:mm:ss") }');{vbCrLf}"
ElseIf strbuf.Length > 4 Then
transStr = $"INSERT INTO `Cdr_library`.`tbl_cdr_file` (`Company`,`Series`,`FileName`,`Version`,`Remark`,`User`,`UpdateTime`,`Remark`)VALUES('{strbuf(0)}','{strbuf(1)}','{filenmae}','{strbuf(3)}','{Remark}','{username}','{Now.ToString("yyyy-MM-dd HH:mm:ss") }','{strbuf(4)}');{vbCrLf}"
Else
transStr = $"INSERT INTO `Cdr_library`.`tbl_cdr_file` (`Company`,`Series`,`FileName`,`Version`,`Remark`,`User`,`UpdateTime`)VALUES('未知','未知','{filenmae}','未知','{Remark}','{username}','{Now.ToString("yyyy-MM-dd HH:mm:ss")}');{vbCrLf}"
End If
transStr1 = $"select * From `Cdr_library`.`tbl_cdr_file` where `FileName`='{filenmae}'"
Try
npgsqldb.Open()
dt = npgsqldb.ExecuteDataTable(transStr1)
If dt.Rows.Count > 0 Then
Return -1
End If
npgsqldb.ExecuteNonQuery(transStr)
dt = npgsqldb.ExecuteDataTable(transStr1)
If dt.Rows.Count > 0 Then
result = dt.Rows(0).Item("ID")
End If
npgsqldb.Close()
Catch ex As Exception
If Not IsNothing(npgsqldb) Then
npgsqldb.Close()
End If
End Try
Return result
End Function
'添加一天数据如果数据超过500条则插入到数据库中
Private Function AddLogMessageToSQL(msglist As List(Of String)) As Boolean
'最大条数 = 500
Dim npgsqldb As DbExecutor = New DbExecutor(DbExecutor.DbTypeEnum.Mysql, LocalConnString)
Dim gLogNode As LogNode
'将列表中的数据库语句组装成事务语句
Dim transStr As String = String.Join("", msglist.ToArray)
'插入数据库
' Using db As New DbExecutor(DbExecutor.DbTypeEnum.npgsql, LocalConnString)
Try
npgsqldb.Open()
npgsqldb.BeginTransaction()
npgsqldb.ExecuteNonQuery(transStr)
npgsqldb.CommitTransaction()
msglist.Clear()
npgsqldb.Close()
Catch ex As Exception
If Not IsNothing(npgsqldb) Then
npgsqldb.RollbackTransaction()
npgsqldb.Close()
End If
'AddLogMessage($"写入酒店日志异常!")
gLogNode = New LogNode($"上传素材失败!{vbCrLf}{ex.Message}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
Return False
End Try
gLogNode = New LogNode($"上传素材成功!{vbCrLf}", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
'gLogNode.SetLogColor(System.Drawing.Color.Red)
G_Log.AddLogNode(gLogNode)
' End Using
'清空列表
Return True
End Function
Public Isdisply As Boolean = False
Private Sub ToolStripButton2_Click(sender As Object, e As EventArgs) Handles ToolStripButton2.Click
Isdisply = Not Isdisply
'Dim srcDoc, destDoc1, destDoc2 As Document '素材文件
'Dim OpenFileDialog1 As New OpenFileDialog()
'OpenFileDialog1.Filter = "CorelDRAW Files (*.cdr)|*.cdr"
'Dim MaterialPath As String
'Dim oldTime As DateTime
'Dim shp, nshp As Shape
'If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
' oldTime = Now
' MaterialPath = OpenFileDialog1.FileName
' srcDoc = APP.OpenDocument(MaterialPath, False)
' shp = srcDoc.Pages(1).Layers(2).Shapes(19)
' ''Console.WriteLine("打开库文件耗时:" & (Now - oldTime).TotalMilliseconds & "ms")
' destDoc1 = APP.OpenDocument(M_MaterialPath & "test1.cdr", False)
' destDoc1.Close()
' ''Console.WriteLine("打开关闭目标文件耗时:" & (Now - oldTime).TotalMilliseconds & "ms")
' destDoc1 = APP.OpenDocument(M_MaterialPath & "test1.cdr", False)
' ''Console.WriteLine("打开目标文件耗时:" & (Now - oldTime).TotalMilliseconds & "ms")
' '循环复制图像到目标文件
' shp.Copy()
' For i = 1 To 10
' destDoc1.Pages(1).Layers(2).Paste()
' Next
' ''Console.WriteLine("复制耗时:" & (Now - oldTime).TotalMilliseconds & "ms")
' destDoc1.Save()
' destDoc1.Close()
' ''Console.WriteLine("保存耗时:" & (Now - oldTime).TotalMilliseconds & "ms")
' destDoc1 = APP.CreateDocument()
' ''Console.WriteLine("创建新文件耗时:" & (Now - oldTime).TotalMilliseconds & "ms")
' For i = 1 To 10
' destDoc1.Pages(1).Layers(2).Paste()
' Next
' ''Console.WriteLine("复制耗时:" & (Now - oldTime).TotalMilliseconds & "ms")
' Dim srcFile1 As String = M_MaterialPath & "test2.cdr"
' destDoc1.SaveAs(srcFile1)
' destDoc1.Close()
' ''Console.WriteLine("保存耗时:" & (Now - oldTime).TotalMilliseconds & "ms")
' srcDoc.Close()
' ''Console.WriteLine("关闭库耗时:" & (Now - oldTime).TotalMilliseconds & "ms")
'End If
End Sub
''把剩余的数据也插入到数据库中
'Private Sub AddLogMessageToSQL(ByRef msglist As List(Of String), npgsqldb As DbExecutor)
' If msglist.Count = 0 Then Return
' Dim transStr As String = String.Join("", msglist.ToArray)
' '插入数据库
' ' Using db As New DbExecutor(DbExecutor.DbTypeEnum.npgsql, LocalConnString)
' npgsqldb.Open()
' Try
' npgsqldb.BeginTransaction()
' npgsqldb.ExecuteNonQuery(transStr)
' npgsqldb.CommitTransaction()
' msglist.Clear()
' Catch ex As Exception
' npgsqldb.RollbackTransaction()
' AddLogMessage($"写入酒店日志异常!")
' gLogNode = New LogNode($"【序列化失败】Redis:{channel}: {Message}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
' gLogNode.SetLogColor(System.Drawing.Color.Red)
' G_Log.AddLogNode(gLogNode)
' End Try
' npgsqldb.Close()
' 'End Using
'End Sub
Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs)
Dim srcDoc As Document
Dim destDoc As Document
Dim destDoc1 As Document
Dim srcLayer As Layer
Dim destLayer As Layer
Dim shp, nshp As Shape
Dim srcFile As String
Dim destFile As String
Dim srPaste As New ShapeRange
Dim boxShape As Shape, sh As Shape
Dim dx As Double, dy As Double
Dim srcFile1 As String = "C:\Canvas\ms_2.cdr"
destFile = "C:\Canvas\ms_1.cdr"
srcFile = "C:\Canvas\Test_3.cdr"
Dim app As New Application()
app.Visible = False
Thread.Sleep(2000)
Dim nn As Integer = 0
Dim x#, y#, w#, h#
'Dim doc As Document = app.OpenDocument(tplPath, False)
'Dim doc1 As Document = app.OpenDocument(imgFolder, False)
Try
srcDoc = app.OpenDocument(srcFile, False)
' '延时(1000)
Thread.Sleep(500)
destDoc = app.OpenDocument(destFile, False)
Thread.Sleep(500)
srcLayer = srcDoc.Pages(1).Layers("Layer_1")
destLayer = destDoc.Pages(1).Layers("Key_8")
If destLayer Is Nothing Then
destLayer = destDoc.Pages(1).Layers.Add("Key_8")
End If
For Each shp In srcLayer.Shapes
'If nn = 0 Then
' nn = nn + 1
' Continue For
'End If
If nn < 8 Then
nn = nn + 1
'''Console.WriteLine(shp.Name)
shp.Copy()
shp = destLayer.Paste()
For Each nshp In destLayer.Shapes
If nshp.Name.Equals($"Kuan_{nn}") Then
x = nshp.CenterX - shp.CenterX
y = nshp.CenterY - shp.CenterY
'w = nshp.SizeWidth
'h = nshp.SizeHeight
'Dim st = destLayer.CreateArtisticText(
' x, y,
' "X=" & Format(x, "0.0") & vbCrLf &
' "Y=" & Format(y, "0.0") & vbCrLf &
' "W=" & Format(w, "0.0") & vbCrLf &
' "H=" & Format(h, "0.0"))
'st.Fill.UniformColor.CMYKAssign(0, 0, 0, 100) '黑色文字
dx = nshp.LeftX
dy = nshp.TopY
shp.Move(x, y)
Thread.Sleep(500)
End If
Next nshp
'shp.MoveToLayer(,)
Else
Exit For
End If
Next shp
destLayer.Shapes.All().Group()
destDoc.SaveAs(srcFile1)
srcDoc.Close()
destDoc.Close()
destDoc1 = app.OpenDocument(srcFile1, False)
'Dim opt As StructExportOptions = New StructExportOptions()
'opt.ImageType = cdrImageType.cdrDuotoneImage
'opt.JPEGQuality = 90
'opt.ResolutionX = 300 ' // 300 dpi
'opt.ResolutionY = 300
'opt.MaintainAspect = True
'opt.AntiAliasing = cdrAntiAliasingType.cdrNormalAntiAliasing
srcFile1 = srcFile1.Replace(".cdr", ".png")
'// 4) 导出 JPG
Dim Ef As ExportFilter = destDoc1.ExportBitmap(srcFile1, VGCore.cdrFilter.cdrPNG)
Ef.Finish()
'destDoc1.Close()
Catch ex As Exception
If srcDoc IsNot Nothing Then srcDoc.Close()
If destDoc IsNot Nothing Then destDoc.Close()
If destDoc1 IsNot Nothing Then destDoc1.Close()
'''Console.WriteLine(ex.Message)
End Try
End Sub
Private Sub ToolStripButton5_Click(sender As Object, e As EventArgs) Handles ToolStripButton5.Click
'删除素材库
Try
' 3. 检查是否选择了素材库
If String.IsNullOrEmpty(ToolStripComboBox1.Text) Then
MsgBox("请先选择要删除的素材库!", vbExclamation, "错误")
Return
End If
' 4. 获取选中的素材库名称
Dim selectedFileName As String = ToolStripComboBox1.Text
' 1. 显示密码输入对话框
Dim password As String = InputBox("请输入密码", $"即将删除:{vbCrLf}{selectedFileName}", "", -1, -1)
' 2. 验证密码
If password <> "123456" Then
MsgBox("密码错误,删除失败!", vbExclamation, "错误")
Return
End If
' 5. 从字典中获取对应的ID
If M_FileIdDict.ContainsKey(selectedFileName) Then
Dim fileId As Integer = M_FileIdDict(selectedFileName)
' 6. 执行数据库删除操作
Dim npgsqldb As DbExecutor = New DbExecutor(DbExecutor.DbTypeEnum.Mysql, LocalConnString)
Try
npgsqldb.Open()
' 7. 开始事务
npgsqldb.BeginTransaction()
' 8. 根据素材库类型执行不同的删除逻辑
If selectedFileName.Contains("图标图库") Then
' 删除图标素材库相关数据
' 删除tbl_iconlibrary中FID一致的数据
Dim deleteIconSql As String = $"DELETE FROM `cdr_library`.`tbl_iconlibrary` WHERE `FID` = {fileId};"
npgsqldb.ExecuteNonQuery(deleteIconSql)
ElseIf selectedFileName.Contains("模型图库") Then
' 删除模型素材库相关数据
' 1. 处理tbl_model相关数据
' 查询tbl_model中FID等于fileId的数据
Dim modelSql As String = $"SELECT `Id` FROM `cdr_library`.`tbl_model` WHERE `FID` = {fileId};"
Dim modelDt As DataTable = npgsqldb.ExecuteDataTable(modelSql)
' 遍历tbl_model表得到的ID
For Each modelRow As DataRow In modelDt.Rows
Dim modelId As Integer = modelRow("Id")
' 删除tbl_trench中MID符合的数据
Dim deleteTrenchSql As String = $"DELETE FROM `cdr_library`.`tbl_trench` WHERE `MID` = {modelId};"
npgsqldb.ExecuteNonQuery(deleteTrenchSql)
' 删除tbl_model中对应ID的数据
Dim deleteModelSql As String = $"DELETE FROM `cdr_library`.`tbl_model` WHERE `ID` = {modelId};"
npgsqldb.ExecuteNonQuery(deleteModelSql)
Next
' 2. 处理tbl_pattern相关数据
' 查询tbl_pattern中FID等于fileId的数据
Dim patternSql As String = $"SELECT `Id` FROM `cdr_library`.`tbl_pattern` WHERE `FID` = {fileId};"
Dim patternDt As DataTable = npgsqldb.ExecuteDataTable(patternSql)
' 遍历tbl_pattern表得到的ID
For Each patternRow As DataRow In patternDt.Rows
Dim patternId As Integer = patternRow("Id")
' 删除tbl_location中MID符合的数据
Dim deleteLocationSql As String = $"DELETE FROM `cdr_library`.`tbl_location` WHERE `PID` = {patternId};"
npgsqldb.ExecuteNonQuery(deleteLocationSql)
' 删除tbl_pattern中对应ID的数据
Dim deletePatternSql As String = $"DELETE FROM `cdr_library`.`tbl_pattern` WHERE `ID` = {patternId};"
npgsqldb.ExecuteNonQuery(deletePatternSql)
Next
End If
' 9. 删除tbl_cdr_file中对应id的数据
Dim deleteFileSql As String = $"DELETE FROM `cdr_library`.`tbl_cdr_file` WHERE `ID` = {fileId};"
npgsqldb.ExecuteNonQuery(deleteFileSql)
' 10. 提交事务
npgsqldb.CommitTransaction()
' 11. 从下拉框中移除已删除的选项
ToolStripComboBox1.Items.Remove(selectedFileName)
' 12. 清空选择
ToolStripComboBox1.Text = ""
' 13. 显示成功消息
MsgBox("素材库删除成功!", vbInformation, "成功")
Catch ex As Exception
' 14. 回滚事务
npgsqldb.RollbackTransaction()
MsgBox($"删除失败:{ex.Message}", vbExclamation, "错误")
Finally
npgsqldb.Close()
End Try
Else
MsgBox("未找到素材库对应的ID!", vbExclamation, "错误")
End If
Catch ex As Exception
MsgBox($"操作失败:{ex.Message}", vbExclamation, "错误")
End Try
End Sub
End Class