self.ico.ClearLayer()
# self.ico.DispWork(sig_layer)
# self.ico.DispLayer(sm_layer)
# self.ico.DispLayer(dat_layer)
self.__renderPDF(sig_layer) #在找到的那一层操作,正面或背面
self.ico.DelLayer(self.tmpLays)
mes = f'输出目录:{self.filePath},继续将打开PDF'
ans = messageBox.showMessage(
bitmap='information', title='PDF输出完成', message=mes, buttons=['退出', '继续'])
if ans == '继续':
os.system(f"/usr/bin/evince {self.filePath} &")
self.incam.COM('disp_on')
# TODO 转换成png 放到output里面
self.__pdf2PNG()
return 0
def __pdf2PNG(self):
cmd = f"convert -density 120 -quality 80 -background white -alpha remove {self.filePath} {self.imgPath}"
os.system(cmd)
def __renderPDF(self, sig_lay):
"""
渲染PDF:设置文档结构并构建内容
"""
canv = ReportCanvas(self.filePath, pagesize=self.pageSize)
self.canvas = canv
self.drawingParams = self.__setTemplateParams() # 设置模板的默认参数
self.bgTemp = DrawingTemplate(
canv, A4[0], A4[1], self.drawingParams)
lM = 0
rM = 0
tM = 0
bM = 0
self.doc = SimpleDocTemplate(self.filePath, pagesize=self.pageSize, topMargin=tM,
bottomMargin=bM, leftMargin=lM, rightMargin=rM, title="MI-13",
author=self.userCN)#filePath:最终存放路径; pageSize:画布大小
self.__setPageFrame(self.doc)
story = []
story.append(NextPageTemplate('p1'))
g2c = self.__createGerber(sig_lay)
story.append(FrameBreak())
story.append(g2c)
story.append(PageBreak())
self.doc.build(story) #
def __setPageFrame(self, doc: SimpleDocTemplate):
"""设置每一页框架分布 """
frames = []
fh = doc.height / 3
padX = self.drawingParams['padx']
padY = self.drawingParams['pady']
tableFrame = Frame(x1=padX, y1=padY + fh * 2,
width=doc.width, height=fh, id='f1')
gerberFrame = Frame(
x1=padX, y1=padY, width=doc.width, height=fh * 2, id='f2')
frames.append(tableFrame)
frames.append(gerberFrame)
doc.addPageTemplates([PageTemplate(id='p1', frames=frames)])
def getMergeLay(self, lay):
""" 将lay备份并将备份层合并为surface """
mergeLay = f'{lay}_merge'
self.ico.DelLayer(mergeLay)
self.ico.ClearAll()
self.ico.DispWork(lay, number=1)
self.incam.COM(
f'sel_copy_other,dest=layer_name,target_layer={mergeLay},invert=no,dx=0,dy=0,size=0,x_anchor=0,y_anchor=0')
self.ico.DispWork(mergeLay, number=1)
self.incam.COM(
'sel_cont_resize,accuracy=25.4,break_to_islands=yes,island_size=0,hole_size=0,drill_filter=no,corner_ctl=no')
return mergeLay
def getDnxSigLayMapping(self, lay: str):
"""
获取dnx孔层与其钻带的起始信号层之间的映射关系(1:1)
:param dnxLayers:线路层
:return:起始终止是线路层的所有钻孔
"""
dnxSigLayMapping = []
for drl in self.ico.GetLayerMatrix()['drlAllLay']:
startLay = self.ico.GetLayerMatrix()['drlThrough'][drl]['start']
endLay = self.ico.GetLayerMatrix()['drlThrough'][drl]['end']
if startLay == lay or endLay == lay:
dnxSigLayMapping.append(drl)
return dnxSigLayMapping
# 分析创建光绘的关键部分
def __createGerber(self, sigLay):
layerMatrix = self.ico.GetLayerMatrix()
sig_out_list = layerMatrix['sigOutLay']
sm_lay_list = layerMatrix['smAllLay']
toRead = []
# 1. 合并信号层为 surface
mergeSigLay = self.getMergeLay(sigLay)
self.tmpLays.append(mergeSigLay)
mergeSigLayFilePath = self.ico.getFeatureFile(self.JOB, self.workStep, mergeSigLay)
toRead.append(Feature(mergeSigLayFilePath, layerType='signal'))
# 3. 添加阻焊层
idx = sig_out_list.index(sigLay)
# 获取对应的阻焊层
sm_layer = sm_lay_list[idx]
maskFilePath = self.ico.getFeatureFile(self.JOB, self.workStep, sm_layer)
toRead.append(Feature(maskFilePath, layerType='solder_mask'))
# 2. 添加钻孔层
drlSet = self.getDnxSigLayMapping(sigLay)
for drl in drlSet:
drlFilePath = self.ico.getFeatureFile(self.JOB, self.workStep, drl)
toRead.append(Feature(drlFilePath, layerType='document'))
# === 创建高亮圆圈层 ===
highlight_layer = "pofv_highlight_circle"
if self.ico.IsLayerExist([highlight_layer]):
self.ico.DelLayer([highlight_layer])
self.ico.CreateOrEmptyLay(layer_list=[highlight_layer])
# 获取要高亮的孔坐标(只标第一个)
if sigLay not in self.sigDimension or not self.sigDimension[sigLay]['point_x']:
# 没有坐标,跳过画圈
pass
else:
x = float(self.sigDimension[sigLay]['point_x'][0])
y = float(self.sigDimension[sigLay]['point_y'][0])
self.ico.ClearLayer()
self.ico.DispWork(highlight_layer)
self.incam.COM(f"add_pad,symbol=r180,polarity=positive,x={x},y={y},mirror=no,angle=0,direction=ccw,resize=0,xscale=1,yscale=1")
self.incam.COM("sel_feat2outline,width=3.0,location=on_edge,offset=0.1,polarity=as_feature,keep_original=no,text2limit=no")# 轮廓线
self.incam.COM("arc2lines,arc_line_tol=1")
self.ico.DelLayer(highlight_layer + '+++')
self.ico.ClearLayer()
# sys.exit(0)
# 高亮层也导出为 Gerber Feature
self.tmpLays.append(highlight_layer) # 确保后续清理"
hlight_path = self.ico.getFeatureFile(self.JOB, self.workStep, highlight_layer)
toRead.append(Feature(hlight_path, layerType='signal', strokeColor = "#fcfcf6"))
# === 计算尺寸和偏移 ===
unitSizeX, unitSizeY = self.ico.GetStepSize(self.workStep)[0:2]
gbWidth = self.doc.width * 0.6
gbHeigth = self.doc.height * 2 / 3 * 0.6
offsetX = self.getOffsetXY(gbWidth, gbHeigth, unitSizeX, unitSizeY, pagesize=(
self.doc.width, self.doc.height * 2 / 3))[0]
# 创建绘图对象
g2c = Gerber2Canvas(
gbWidth, gbHeigth,
unitSizeX, unitSizeY,
offsetX, 0.1,
Origin.leftdown,
self.canvas,
toRead,
rotate=0
)
# === 添加标注箭头===
dimension = []
if sigLay in self.sigDimension and self.sigDimension[sigLay]['point_x']:
pointX = self.sigDimension[sigLay]['point_x'][0]
pointY = self.sigDimension[sigLay]['point_y'][0]
dimensionSingle = Dimension(
x0=unitSizeX / 2,
y0=unitSizeY * 1.2,
x1=float(pointX),
y1=float(pointY),
direct=Direct.one_arrow,
dist='POFV孔铜厚度测量位置',
dimColor="#0400FF", #
dimLineColor="#0800FF" #
)
dimension.append(dimensionSingle)
if dimension:
g2c.addDimension(dimension)
return g2c
@staticmethod
def getOffsetXY(gbWidth: float, gbHeight: float, unitSizeX: float, unitSizeY: float,
pagesize: tuple = (A4[0], A4[1])):
"""
获取使Gerber在PDF中居中显示的偏移量
:param gbWidth: pdf中 gerber宽度
:param gbHeight: pdf中 gerber长度
:param unitSizeX: unit宽
:param unitSizeY: unit长
:param pagesize: PDF宽和长
:return: x,y的偏移量
# 创建绘图对象
g2c = Gerber2Canvas(gbWidth,gbHeight,unitSizeX,unitSizeY,offsetX, offsetY,
Origin.leftdown,self.canvas,toRead, rotate=0)
"""
scale1 = math.ceil(gbWidth / unitSizeX)
scale2 = math.ceil(gbHeight / unitSizeY)
scale = scale1 if scale1 < scale2 else scale2
offsetX = (pagesize[0] - unitSizeX * scale) / (2 * scale)
offsetY = (pagesize[1] - unitSizeY * scale) / (2 * scale)
return offsetX, offsetY
还有个问题,# === 正确添加阻焊层 ===
sm_layer = sm_lay_list[idx]
maskFilePath = self.ico.getFeatureFile(self.JOB, self.workStep, sm_layer)
toRead.append(Feature(maskFilePath, layerType='solder_mask')) #
在绘制阻焊层的时候,在整体顺时针转了90度
最新发布