Files
DP/temp_backup/Server_redundant/tempdemo/psmark/Tab5.py
zuowei1216 12395d8eca newrun
2025-12-30 14:46:22 +08:00

449 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QLabel, QPushButton, QFileDialog, \
QLineEdit, QScrollArea, QGroupBox, QHBoxLayout, QMessageBox, QProgressDialog
from PyQt5.QtGui import QIntValidator
from PyQt5.QtCore import QTimer
import re
import os
import ezdxf
import ezdxf.tools
import ezdxf.bbox
import ezdxf.units
import ezdxf.math
from coreldraw_checker import is_coreldraw_running
from functools import partial
import win32com.client
import os
import shutil
import threading
from clear_folder import another_function
class YourMainWindow5(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("多码混排")
layout = QVBoxLayout()
self.button1 = QPushButton("DXF文件路径")
self.button1.setFixedWidth(200)
self.button1.clicked.connect(self.showDxfFileDialog)
self.button2 = QPushButton("PLT文件路径")
self.button2.setFixedWidth(200)
self.button2.clicked.connect(self.showPltFileDialog)
self.initial_button1_text = self.button1.text()
self.initial_button2_text = self.button2.text()
panel1 = QGroupBox("文件路径")
panel1_layout = QVBoxLayout(panel1)
panel1_layout.setSpacing(10)
panel1_layout.setContentsMargins(10, 10, 10, 10)
panel1_layout.addWidget(self.button1)
panel1_layout.addWidget(self.button2)
layout.addWidget(panel1)
self.label5 = QLabel('单码片数')
self.lineEdit3 = QLineEdit()
self.lineEdit3.setValidator(QIntValidator())
self.lineEdit3.setFixedSize(120, 30)
layout.addWidget(self.label5)
layout.addWidget(self.lineEdit3)
self.scrollWidget = QWidget()
self.scrollWidgetLayout = QVBoxLayout(self.scrollWidget)
self.scrollArea = QScrollArea()
self.scrollArea.setWidget(self.scrollWidget)
self.scrollArea.setWidgetResizable(True)
layout.addWidget(self.scrollArea)
self.clearButton = QPushButton("清空信息")
self.clearButton.clicked.connect(self.clearScrollArea)
layout.addWidget(self.clearButton)
confirm_button = QPushButton("分割")
confirm_button.clicked.connect(self.updateScrollArea)
#confirm_button.clicked.connect(self.freezeAndParse) # 连接按钮点击事件
layout.addWidget(confirm_button)
central_widget = QWidget()
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
self.dxfLineEdits = {}
self.allowButtonActions = True # 标志变量,控制是否允许按钮行为
def run_coreldraw_macros(self):
try:
dogms = win32com.client.DispatchEx("CorelDRAW.Application.23")
macros_to_run = [
"RUN.OpenDXFFilesInFolder",
"RUN.RotateSelectionClockwise",
"RUN.DeleteUnnamedSublayers",
"RUN.StToFront",
"RUN.IterateSublayerNames",
]
for macro in macros_to_run:
dogms.GMSManager.RunMacro("RUNDXF", macro)
except Exception as e:
QMessageBox.warning(self, "警告", "缺少CDR模块请载入CDR模块", QMessageBox.Ok)
# print("缺少CDR模块请载入CDR模块")
def showPltFileDialog(self):
options = QFileDialog.Options()
file_path, _ = QFileDialog.getOpenFileName(self, "选择PLT文件", "", "PLT Files (*.plt);;All Files (*)",
options=options)
if file_path:
print("Selected PLT file:", file_path)
extracted_content = self.extract_content_from_plt_path(file_path)
print(extracted_content)
self.sizes = self.fill_sizes_from_extracted_content(extracted_content)
# 更新尺寸字典后,清空并填充滚动区域
self.clearScrollArea()
self.populateScrollArea()
self.initial_plt_path = file_path # 更新初始路径而不更新按钮文本
else:
print("No PLT file selected")
QMessageBox.warning(self, "警告", "没有选择文件夹。请重新选择文件夹。", QMessageBox.Ok)
pass
def showDxfFileDialog(self):
options = QFileDialog.Options()
file_path, _ = QFileDialog.getOpenFileName(self, "选择DXF文件", "", "DXF Files (*.dxf);;All Files (*)",
options=options)
if file_path:
print("Selected DXF file:", file_path)
self.initial_dxf_path = file_path # 更新初始路径而不更新按钮文本
else:
print("No DXF file selected")
QMessageBox.warning(self, "警告", "没有选择文件夹。请重新选择文件夹。", QMessageBox.Ok)
# 在此处添加提醒逻辑,例如使用 QMessageBox 提示用户没有选择文件
def extract_content_from_plt_path(self, plt_path):
match = re.search(r'\((.*?)\)', plt_path)
if match:
extracted_content = match.group(1)
return extracted_content
else:
return "No content in parentheses found"
def fill_sizes_from_extracted_content(self, extracted_content):
sizes = extracted_content.split("+")
size_dict = {}
for size in sizes:
size_dict[size] = ""
return size_dict
def process_dxf_file(self, file_path, extracted_content):
doc = ezdxf.readfile(file_path)
msp = doc.modelspace()
mspBox = ezdxf.bbox.extents(msp)
print("=====", os.path.basename(file_path))
print("左上角坐标:", mspBox.extmin)
print("画布宽:", mspBox.size[0], "画布高:", mspBox.size[1])
print()
for entity in msp.query():
if entity.dxftype() == "INSERT":
temp = []
rotation = None
block = doc.blocks[entity.dxf.name]
for e in block:
if e.dxftype() != "TEXT":
temp.append(e)
else:
rotation = e.dxf.rotation
if rotation is not None:
rotation %= 360
if 45 <= rotation < 135:
rotation = 90
elif 135 <= rotation < 225:
rotation = 180
elif 225 <= rotation < 315:
rotation = -90
else:
rotation = 0
print("=====", entity.dxf.name)
print("大小:", ezdxf.bbox.extents(temp).size)
print("文字角度:", rotation)
center = ezdxf.bbox.extents(temp).center
center = (center.x, mspBox.extmax.y - center.y) # 调整center y值
print("中心坐标:", center)
center = (center[1], mspBox.size[0] - center[0]) # 旋转后中心坐标
print("旋转后中心坐标:", center)
separator = "_" # 分隔符
entity.dxf.name += separator + str(rotation)
block.name += separator + str(rotation)
new_file_path = os.path.join(r"D:\marktemp", "{}.dxf".format(extracted_content))
doc.saveas(new_file_path)
def getSinglePieceCount(self):
return self.lineEdit3.text()
def recreate_folders(self):
# 定义文件夹路径
folder_paths = [r"D:\PSMARKtemp", r"D:\marktemp"]
# 删除文件夹及其内容
for folder_path in folder_paths:
if os.path.exists(folder_path):
shutil.rmtree(folder_path)
print(f"Deleted folder: {folder_path}")
# 重新创建文件夹
for folder_path in folder_paths:
os.makedirs(folder_path)
print(f"Recreated folder: {folder_path}")
def freezeAndParse(self):
self.parse_button.setEnabled(False) # 冻结按钮
QTimer.singleShot(10000, self.unfreezeButton) # 10秒后解冻按钮
def unfreezeButton(self):
self.parse_button.setEnabled(True) # 解冻按钮
def updateScrollArea(self):
another_function()
if not is_coreldraw_running():
QMessageBox.warning(self, "警告", "CorelDRAW未运行无法执行操作。")
return
plt_file_path = self.initial_plt_path
# 获取DXF文件路径
dxf_file_path = self.initial_dxf_path
extracted_content = self.extract_content_from_plt_path(plt_file_path)
if dxf_file_path:
# 去掉括号内内容后的PLT文件名作为DXF文件名
plt_filename = os.path.basename(plt_file_path)
# dxf_filename = re.sub(r'\(.*?\)', '', plt_filename)
self.process_dxf_file(dxf_file_path, extracted_content) # 调用解析函数并传入单码片数和新的DXF文件名
print("DXF文件解析完成")
else:
QMessageBox.warning(self, "警告", "没有选择DXF文件。请先选择一个DXF文件。", QMessageBox.Ok)
print()
self.run_coreldraw_macros()
single_code_pieces = int(self.getSinglePieceCount()) # 获取单码片数
print(single_code_pieces)
# 打印滚动区域中的输入框内容
code_quantities = {} # 创建一个新的字典用于存储数据
for label, line_edit in self.dxfLineEdits.items():
text = line_edit.text()
# print(f"Label: {label}, Text: {text}")
if text.isdigit():
value = int(text) # 尝试将文本转换为整数
else:
try:
value = float(text) # 尝试将文本转换为浮点数
except ValueError:
print(f"Invalid value for {label}: {text}")
continue # 转换失败,跳过当前循环迭代
code_quantities[label] = value # 存储转换后的数字到字典
# print(line_edit)
print(code_quantities)
keys_list = list(code_quantities.keys())
values_list = list(code_quantities.values())
# length = len(code_quantities)
# print(length) # 输出 3因为字典中有三对键值对
# 将text中的每个元素与code对应位置的元素相乘
result = [txt * single_code_pieces for txt in values_list]
# 使用zip函数将label和result对应组合
combined = zip(keys_list, result)
# 利用列表推导式生成结果数组
results2 = [lbl for lbl, txt in combined for _ in range(txt)]
# 打印结果数组
print(results2)
###############debug
corel_app = win32com.client.Dispatch("CorelDRAW.Application.23")
# 获取当前活动文档
active_document = corel_app.ActiveDocument
# 获取当前页面中所有图层的名称,排除特定名称的图层
layer_names = [layer.Name for layer in active_document.ActivePage.Layers
if layer.Name not in ["辅助线", "1", "0", "Defpoints"]]
p_numbers = [] # 初始化存储 P 数字的列表
for code, quantity in code_quantities.items():
for i in range(1, single_code_pieces + 1):
p_numbers.extend([f"P{i}"] * int(quantity))
print(p_numbers)
# 循环遍历不同的码
# p_numbers = [] # 初始化存储 P 数字的列表
#
# for code, quantity in code_quantities.items():
# for i in range(1, single_code_pieces + 1):
# # 根据码的数量分别生成对应数量的 P 数字,并添加到列表中
# p_numbers.extend([f"P{i}"] * quantity)
# print(p_numbers)
new_layer_names = []
index = 0
for old_name in layer_names:
parts = old_name.split("-") # 根据"-"分割字符串
if len(parts) > 1:
new_name = f"{p_numbers[index]}-{parts[1]}-{results2[index]}" # 使用数组中的 P 数字
new_layer_names.append(new_name)
index += 1
# 在新的图层名数组中遍历,对图层进行修改
modified_names = [] # 创建一个列表来存储修改后的名称
modified_names2 = []
for i, new_name in enumerate(new_layer_names):
active_document.ActivePage.Layers(layer_names[i]).Name = new_name
modified_names2.append(new_name)
modified_names.append(new_name)
print(f"Modified: {layer_names[i]} -> {new_name}")
dogms = win32com.client.DispatchEx("CorelDRAW.Application.23")
#
dogms.GMSManager.RunMacro("RUNDXF", "RUN.RUNPDF")
#
dogms.GMSManager.RunMacro("RUNDXF", "RUN.ActiveDocumentClose")
###############debug
# print(modified_names)
######### ######### ######### ######### #########这里是对多码的功能 这里是删除的功能
# def delete_layers_by_names(names_to_delete, active_document):
# corel_app = win32com.client.Dispatch("CorelDRAW.Application.23")
#
# # 获取当前活动文档
# active_document = corel_app.ActiveDocument
# for target_layer_name in names_to_delete:
# for layer in active_document.ActivePage.Layers:
# if layer.Name == target_layer_name:
# layer.Delete()
# break # 找到目标图层后中断循环
#
#
#
# modified_names_list = [] # 用于存储每次循环中的 modified_names 列表
# ######### ######### ######### ######### #########这里是对多码的功能 这里是导出PSD的功能 我这边要混排就对功能进行封禁
# Index = 0
# for code in code_quantities:
# quantity = code_quantities[code]
# total_pieces = quantity * single_code_pieces
#
# # 获取数组的前 total_pieces 个元素
# newmodified_names_filtered = modified_names[:total_pieces]
# # print(newmodified_names_filtered)
#
# result_array = [fruit for fruit in modified_names2 if fruit not in newmodified_names_filtered]
# result_array_length = len(result_array)
# print(result_array_length)
#
# delete_layers_by_names(result_array, active_document.ActivePage)
# # modified_names_list.append(modified_names) # 将 modified_names 添加到数组中
#
#
# dogms = win32com.client.DispatchEx("CorelDRAW.Application.23")
#
# dogms.GMSManager.RunMacro("RUNDXF", "RUN.ExportSelectionToPSD", Index)
#
# dogms.GMSManager.RunMacro("RUNDXF", "RUN.HOURUN", result_array_length)
#
# modified_names = modified_names[total_pieces:]
#
# Index += 1
#
#
# corel_app = win32com.client.Dispatch("CorelDRAW.Application.23")
#
# corel_app .GMSManager.RunMacro("RUNDXF", "RUN.ActiveDocumentClose")
#
# QMessageBox.warning(self, "提醒", "分割完成,请进行裁片套版操作。")
def updateLineEditsFromSizes(self):
for size_label, line_edit in self.dxfLineEdits.items():
self.sizes[size_label] = line_edit.text()
def populateScrollArea(self):
self.clearScrollArea()
for size_label, size_text in self.sizes.items():
size_layout = QHBoxLayout()
size_layout.addWidget(QLabel(size_label))
line_edit = QLineEdit()
line_edit.setValidator(QIntValidator())
line_edit.setFixedSize(100, 30)
line_edit.setText(size_text)
self.dxfLineEdits[size_label] = line_edit
size_layout.addWidget(line_edit)
self.scrollWidgetLayout.addLayout(size_layout)
def clearScrollArea(self):
for i in reversed(range(self.scrollWidgetLayout.count())):
item = self.scrollWidgetLayout.itemAt(i)
if isinstance(item, QHBoxLayout) or isinstance(item, QVBoxLayout):
while item.count():
widget = item.takeAt(0).widget()
if widget:
widget.deleteLater()
self.dxfLineEdits.clear() # 清空部件引用
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = YourMainWindow5()
mainWindow.show()
sys.exit(app.exec_())