diff --git a/CorelDRAW.vb b/CorelDRAW.vb index e1a66f9..1b1e612 100644 --- a/CorelDRAW.vb +++ b/CorelDRAW.vb @@ -11,16 +11,16 @@ Imports VGCore Public Class CorelDRAW Public M_Redisip As String = "127.0.0.1" - Public M_Redisport As Integer = 6379 ' 10079 '10079 ' 10079 - Public M_Redispassword As String = "" '"blw@redis-ser@123" ' "blw@redis-ser@123" ' "" ' + 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 = "D:\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_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 = "D:\Canvas\material\" ' "R:\Canvas\material\" ' "R:\Canvas\material\" ' + 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 @@ -52,7 +52,7 @@ Public Class CorelDRAW 'End If APP = New Application() Thread.Sleep(300) - APP.Visible = True + 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") @@ -75,7 +75,7 @@ Public Class CorelDRAW DisposeRedisMsgNode1(MsgNode) Case 2 Dim MsgNode = JsonConvert.DeserializeObject(Of PreviewRoomTypePanel)(item.MsgNode.ToString) - DisposeRedisMsgNode3(MsgNode) + DisposeOverviewRedisMsgNode(MsgNode) 'DisposeRedisMsgNode2(MsgNode) End Select @@ -387,7 +387,7 @@ Public Class CorelDRAW End Try End Sub - Sub DisposeRedisMsgNode3(node As PreviewRoomTypePanel) + Sub DisposeOverviewRedisMsgNode(node As PreviewRoomTypePanel) Dim gLogNode As LogNode Dim filedir As String = M_ServerPath ' "D:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic" @@ -398,7 +398,7 @@ Public Class CorelDRAW Dim RMNode As New RedisMsgNode RMNode.MsgType = 2 RMNode.MsgNode = RsNode - Dim hotelText, hotelnodeText As Shape + Dim hotelText, hotelnodeText, kuang_lin As Shape Dim nodeText As String Dim bProject As Project = Nothing Dim remark As String() = {"思源黑体", "36"} @@ -425,8 +425,9 @@ Public Class CorelDRAW 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 @@ -470,75 +471,82 @@ Public Class CorelDRAW '设置总览框图形原点 为垂直居上水平居中 ZcdrDoc.Close() - '查找hotelText中名称为 Frame_Blv_Overview 的形状 - For Each shape As Shape In hotelText.Shapes - If shape.Name.ToLower.Equals("Project_Title".ToLower) Then - '遍历其子形状,查找名称为 PreviewBox 的形状 + '查找hotelText中名称为 Project_Title 的形状 + hotelText.Ungroup() - For Each childShape As Shape In shape.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 - Exit For + 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}中的图像!!" @@ -553,41 +561,46 @@ Public Class CorelDRAW End If + InpotMessage1("4、标题信息处理完成") - Dim currentY As Double = hotelText.CenterY - 20 ' 标题底部向下50mm - 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 - roomGroups.Add(panel.room_name, New List(Of Panel)()) + 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) + '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 = {"思源黑体", "28"} + remark = {"思源黑体", "38"} 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 + roomText.LeftX = startX ' 房型标题左对齐到起始X + ' 房型标题下方留出空间 + currentY = roomText.CenterY - (roomText.OriginalHeight / 2) - 10 - - - currentY = roomText.CenterY - (roomText.OriginalHeight / 2) - 10 ' 房型标题底部向下30mm - Dim currentX As Double = 0 ' 当前行的X坐标 - Dim maxHeight As Double = 0 ' 当前行最高图像的高度 + 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) @@ -607,6 +620,22 @@ Public Class CorelDRAW 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 @@ -673,12 +702,19 @@ Public Class CorelDRAW quantityText.Selected = False - InpotMessage1("更新X坐标,为下一个图像留出50mm间距") InpotMessage1("计算当前行的最大高度") If group.OriginalHeight > maxHeight Then maxHeight = group.OriginalHeight End If - currentX += pastedShape.SizeWidth + 50 + + 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}中的图像!!" @@ -717,6 +753,20 @@ Public Class CorelDRAW 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 @@ -725,11 +775,20 @@ Public Class CorelDRAW 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) @@ -825,6 +884,59 @@ Public Class CorelDRAW 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 + ''' ''' 检查单个图像名称是否符合规范 ''' @@ -1681,8 +1793,8 @@ Public Class CorelDRAW G_LibDoc = APP.OpenDocument(MaterialPath, True) MLibDoc = APP.CreateDocument() End Try - 'APP.EventsEnabled = False - 'APP.Optimization = True + APP.EventsEnabled = False + APP.Optimization = True 'APP.EventsEnabled = True 'APP.Optimization = False @@ -2002,9 +2114,9 @@ Public Class CorelDRAW InpotMessage1($"14、开始将整个图像移动至中心位置") SetIconToCentered(npage, fshp) 'Dim sel As ShapeRange = APP.ActiveSelectionRange - 'APP.EventsEnabled = True - 'APP.Optimization = False - 'APP.Refresh() + APP.EventsEnabled = True + APP.Optimization = False + APP.Refresh() 'fshp.SetSize(Math.Abs(fshp.SizeWidth) * 10000, Math.Abs(fshp.SizeHeight) * 10000) InpotMessage1($"15、开始保存图像成文件") diff --git a/TestSortFunction.vb b/TestSortFunction.vb new file mode 100644 index 0000000..98b75ae --- /dev/null +++ b/TestSortFunction.vb @@ -0,0 +1,47 @@ +Imports System +Imports System.Collections.Generic +Imports System.Linq + +' 测试类,用于验证SortPanelListBySize函数的功能 +Public Class TestSortFunction + Public Shared Sub Main() + ' 创建测试用的Panel对象 + Dim panel1 As New Panel() + panel1.model_type = "Mode_2连体_竖向_灰色_104_189.5" ' w:104, h:189.5 + + Dim panel2 As New Panel() + panel2.model_type = "Mode_3连体_横向_白色_156_94.75" ' w:156, h:94.75 + + Dim panel3 As New Panel() + panel3.model_type = "Mode_1连体_竖向_黑色_52_189.5" ' w:52, h:189.5 + + Dim panel4 As New Panel() + panel4.model_type = "Mode_2连体_横向_灰色_104_94.75" ' w:104, h:94.75 + + ' 创建初始列表 + Dim panelList As New List(Of Panel)() + panelList.Add(panel1) + panelList.Add(panel2) + panelList.Add(panel3) + + ' 直接调用静态排序函数,无需创建实例 + Dim sortedList As List(Of Panel) = CorelDRAW.SortPanelListBySize(panelList, panel4) + + ' 输出排序结果 + Console.WriteLine("排序后的Panel列表(按最小高度优先、最小宽度优先):") + For Each panel As Panel In sortedList + Dim parts() As String = panel.model_type.Split("_") + Dim width As Double = 0.0 + Dim height As Double = 0.0 + + If parts.Length >= 6 Then + Double.TryParse(parts(parts.Length - 2), width) + Double.TryParse(parts(parts.Length - 1), height) + End If + + Console.WriteLine($"model_type: {panel.model_type}, 宽度: {width}, 高度: {height}") + Next + + Console.ReadKey() + End Sub +End Class \ No newline at end of file