DXF专题:DXF页面与导入 → 孔位表与工艺 → DXF后处理 → G196扩孔实例
按上一章开启DXF并导入四个圆后,原页面已经有了图形、孔位表和当前孔的参数区。本章重点看这三个区域怎样通过同一个孔号配合。
从原四孔图开始,跟着圆心40,10的NO.2操作:单独修改孔深,从图形选孔,再调整行顺序和筛选。后续生成程序的主例使用G81,这一孔的孔底Z为−7,其他孔为−5。
点击截图可查看原图。
这里有一个值得掌握的表格技巧:表格第几行与原来第几个孔分开保存。 上移、下移以后,工艺仍然跟着原来的孔走。
先把显示行记为 r,原始孔编号记为 p:
p = #6001.itemversion[r]
这只是帮助阅读的关系式,r、p不是要求你直接粘贴运行的脚本变量。
| 数据位置 | 本页中的用途 |
|---|---|
#6001.itemnum |
导入的孔总数 |
#6001.itemversion[r] |
显示行r对应哪个原始孔 |
#6001.itemmin[p] |
孔p是否勾选:1参加加工,0不参加 |
#6001.itemtitle[p] |
孔p的圆心与半径文字 |
#6001.itemdesc[p] |
生成代码前整理好的孔p工艺文字 |
#9048.version |
当前选中的原始孔编号 |
#6001.channel |
列表点击或移动脚本记录的显示行;在图形中选孔时不会自动同步 |
在这里,itemversion用于排列顺序,itemmin用于勾选状态。不要按字段名称把它们误解成“软件版本”或“孔的最小尺寸”。这些字段的具体用途,由引用它们的脚本和控件决定。
孔位表圆心列的点击属性为:
-事件: (clickedEvent:/env/dxf/selectDrillItem[1](#9048version=#6001itemversion%%<<#6001channel=%%))
%%代表该行。点击时,先把原始孔号和显示行写入上述参数,再调用 selectDrillItem。当前这个脚本文件为空,选孔却仍能生效,因为关键的赋值已经写在事件属性中。
右侧孔底输入框接着使用:
-T(#6007item[#9048version])
-D
选NO.2时,#9048.version=1,这个输入框就读写 #6007.item[1]。把它改成−7,其他孔的−5不会跟着改变。以后调换显示行,也仍然修改同一个原始孔。
entityTable 是一个原生 QTableWidget,它的属性定义表头和“每一行按什么规则创建”,而不是预先放好四行。行段中的:
-rows:#6001itemnum
-serial:0
让行数跟随孔数,行内的 %% 从0开始。四列分别这样取数据:
| 列 | 原属性中的关键表达式 | 起到的作用 |
|---|---|---|
| 选择 | -T11(#6001itemmin[#6001itemversion%%]<<"NO."<<%%+1) |
明确创建勾选框;值按原始孔号保存,NO.按当前行显示 |
| 圆心 | -参数(#6001itemtitle[#6001itemversion%%]*")"/"(") |
从标题文字中截取括号内的圆心 |
| 孔径 | -参数(#6001itemtitle[#6001itemversion%%]/","/":") |
从同一标题中截取尺寸文字;当前实际是半径 |
| 加工方式 | -参数(#6003item[#6001itemversion%%]) |
按该子项的输入类型创建编辑控件;现有定义生成G81/G82/G83下拉框 |
例如标题为 center(40.000,10.000),arc radius:2.000,圆心列显示40.000,10.000,孔径列显示2.000。这里的字符串拆分是页面的显示方法;生成XY时,内置操作取的是读图得到的圆心数据,不是把这段标题重新当作几何文件。
加工方式列的 itemtype 指定选项类型,itemunit 提供三个名称,item 保存0、1或2。选择改变时,通用控件处理会直接写回该孔的 #6003.item[p],无需另写一份“保存加工方式”脚本。表头则取自 #1110.itemtitle[11..14],所以中英文名称由语言包提供。
行内还用 #9048version==#6001itemversion%% 判断是否为当前孔,形成选中行的显示效果。勾选加工、选中某孔编辑、改变加工方式是三个独立动作。 修改某行的加工方式后,如果右侧仍显示另一个孔,点击目标行的圆心或孔径,使 #9048.version 指向它。
这套写法可以沿用到其他“列表选择一个对象,旁边编辑它的参数”的页面。关键是所有列和右侧输入统一使用原始对象编号,不能一部分按显示行、一部分按原始编号。
这里的“焦点”可以理解为当前正在查看、准备编辑的孔。它由 #9048.version 记录。列表高亮、图形高亮和右侧输入区都围绕这个原始孔号工作。
先看上一章图3的页面状态:点击列表中圆心为40,10的单元格后,NO.2整行变成蓝底,左侧对应圆周显示红紫色高亮,右侧孔底Z显示−7。接着,在Windows版左侧视图中,把鼠标移到圆心为10,35的圆周线附近,不必按住鼠标键,选孔就会切换:
点击截图可查看原图。
图2 这是原页面上三个区域的连续截图。左上圆、圆心10,35这一行,以及右侧−5.000,指向同一个原始孔2;列表显示NO.3,因为显示编号从1开始。可点击图片放大查看。
两条选孔路线最后落到同一个参数上:
点击列表圆心或孔径 → itemversion把显示行换成原始孔号 ─┐
├→ #9048.version
鼠标移到图形圆周 → 内置选取找到该圆的原始孔号 ─────┘
↓
圆周高亮、对应行高亮、右侧孔参数
列表到图形。 前面的点击属性已经给 #9048.version 赋值。内置绘图区按这个编号突出显示对应圆周,因此不需要在空的 selectDrillItem 中再写一段“给圆变色”的脚本。读图后的绘制记录保留了原始孔号,绘图区能把该孔的各段圆周线一起找到。
图形到列表。 Windows版绘图区开启了鼠标跟踪;鼠标经过圆周时,内置选取处理把找到的孔号写回 #9048.version。表格每行已有下面的原属性:
-C1(#9048version==#6001itemversion%%)
-C0(1)
-D
这几行让每一行都问同一个问题:“我的原始孔号是否等于当前孔号?”相等时使用1号显示样式,当前标准配色为蓝底;其他行使用0号样式。-D 使显示随参数更新。右侧孔底输入同样读取 #6007.item[#9048.version],所以图形选孔之后也会切换工艺。
图形选取还由内置部分记录绘图序列 #9047.permission;本页初始化绘制圆时使用序列0。这里的 #9048.version 是绘图区共用的选取字段,在DXF钻孔页中承载孔号,不能另作自定义临时变量。 这种设计的分工是:内置功能完成图形选取与绘制,组态属性完成列表颜色和输入绑定。
把原NO.2置顶后,前两行的对应关系变为:
| 显示行,以下标计 | #6001.itemversion[行] |
圆心 |
|---|---|---|
| 0 | 1 | 40,10 |
| 1 | 0 | 10,10 |
这时从视图选中10,10的圆,得到的仍是原始孔号0,即 #9048.version=0。表格高亮第二行,因为该行的 itemversion 为0;右侧读取 #6007.item[0],仍是−5。选取结果没有变成“当前第一行”,孔深也不会串到40,10的孔上。
还有一个扩展时容易忽略的细节:图形选孔只改变选取编号,不会同时把 #6001.channel 更新为对应显示行,也不会调用 selectDrillItem。例如刚完成置顶时,#6001.channel 为0;随后从图形选中10,10的圆,它仍可能是0,而当前孔实际在第二行。
因此原“上移/下移/置顶”脚本会先从 itemversion 中查找当前孔,再记录找到的显示行,之后才移动。原 uppath 的查找条件就是:
IF#6001.itemversion[#6001.permission]==#9048.versionGOTO1
找到后执行 #6001.channel=#6001.permission。完整过程可对照上移脚本。自定义移动、删除或插入操作时,也应先按当前孔号找行,不能把旧 #6001.channel 当成图形最新选中的行。
#6001.itemmin[p]。从图形选孔不会自动勾选或取消勾选。#9048.version;图形选孔时,表格内部当前行可以不变。颜色联动也不等于自动滚动到该行,孔多时可滚动列表查看。#9048.version 取孔数据,并检查 0≤孔号<#6001.itemnum。只在 selectDrillItem 中写更新动作,只能覆盖列表点击这一条路线。这样,列表负责让用户按文字找孔,视图负责让用户按几何位置找孔;两种操作都编辑同一份每孔参数。
| 默认值 | 每孔值,p为原始孔号 | 用途与生成内容 |
|---|---|---|
#6002.item[0] |
#6003.item[p] |
0=G81,1=G82,2=G83 |
#6002.item[1] |
#6004.item[p] |
刀具编号 |
#6002.item[2] |
#6005.item[p] |
主轴转速,形成S值 |
#6002.item[3] |
#6006.item[p] |
初始平面=0,形成G98;R平面=1,形成G99 |
#6002.item[4] |
#6007.item[p] |
孔底Z坐标 |
#6002.item[5] |
#6008.item[p] |
R平面 |
#6002.item[6] |
#6009.item[p] |
G82停留时间;后处理乘1000写入P |
#6002.item[7] |
#6010.item[p] |
G83每次啄孔深度,形成Q |
#6002.item[8] |
#6011.item[p] |
G83啄孔间隙,形成K |
#6002.item[9] |
#6012.item[p] |
进给,形成F |
本例使用G81,刀号0、主轴转速1000、孔底Z=−5、R=2、进给600,“钻孔完成时停留位置”选初始平面,对应数值0。先选一个孔填写这些值,点保存参数,再重新导入四孔图,就能让四个孔都从这组默认值开始。随后单独把NO.2的孔底Z改为−7。若首次选孔后停留位置框为空白,先按下面的方法刷新,再填写参数。
点击截图可查看原图。
图3 “钻孔完成时停留位置”显示“初始平面”,对应当前孔的 #6006.item[1]=0,生成时使用G98;选择“R平面”则写入1,生成时使用G99。
这个下拉框的原属性为:
-T(#6006item[#9048version])
-D
#9048.version 指向当前孔。控件创建时,从 #6006.itemunit[p] 读取 初始平面<<R平面,建立两个选项;显示及修改时,读写 #6006.item[p] 中的0或1。导入脚本会把默认设置 #6002.itemunit[3] 的选项文字复制到各孔。
如果页面创建时还没有有效选孔,控件就没有取得这两个选项。以后选孔,-D 会更新当前值,却不会重新建立选项列表。这时需要在选中一个孔后重新载入原DXF页面。
在生成程序之前,先点击孔表中的一个圆心,再按脚本输入窗口的方法打开开发者模式主脚本,保留原有草稿后执行:
IF[#9048.version<0]+[#9048.version>=#6001.itemnum]GOTO1
widgetFunc["QFrame","dxfframe","refresh",""]
N1
第一行检查选孔下标;没有有效选孔时跳过刷新。第二行让主界面的 dxfframe 重新读取 #899 指定的原 env/dxf/dxf.ui,此时各孔的选项已经存在,新建的下拉框便能显示文字。关闭输入窗口,返回DXF页即可继续设置。完整脚本也可查看刷新示例。
这是整页重新载入,应在生成程序前使用。 宏参数中的孔深、进给和停留位置等值会保留,但“生成G代码”下面的程序文字区会被清空。如果已经生成或手改了程序,先保存文字,再刷新;需要时重新生成。原 selectDrillItem 文件仍为空,上面是手动刷新示例,不是每次选孔都会自动执行的动作。
这里的Z是孔底坐标,不能照搬加工向导中“填写正的底深度”的习惯。DXF圆所在平面的Z也不会自动成为钻孔深度;输出Z取自本表的工艺参数。
“保存参数”的核心只有这一条复制关系,循环执行十次:
#6002.item[#6002]=#[6003+#6002].item[#9048.version]
所以这三个动作要分清:
“保存参数”按钮本身不弹出文件保存框,也不保存NC文件。这里的示例数值仅用于观察数据关系,实际转速、进给、R平面和孔底坐标应按机台、刀具及工件确定。
原 dxf.ui 已放置三个参数区,并用条件决定显示哪一个:
| 加工方式值 | 原控件 | 额外显示的工艺输入 |
|---|---|---|
| 0:G81钻孔 | frame_4 |
基本钻孔参数 |
| 1:G82钻孔 | frame_5 |
孔底停留时间,绑定 #6009.item[p] |
| 2:G83钻孔 | frame_6 |
每次啄孔深度和啄孔间隙,绑定 #6010.item[p]、#6011.item[p] |
以G82参数区为例,原显示规则是:
-C(#9048version>=0&⍘version<#6001itemnum&ᝳitem[#9048version]==1)
-V0
前两项保证选孔有效,最后一项判断该孔的加工方式。表格下拉框一旦写入1,这块区域就满足显示条件。切换的是已有区域的显示,不是每次重新加载一份UI。 三块区域里的刀号、转速、孔底Z等都绑定同一组每孔参数,所以切换方式不会另复制一套孔深和进给。
下图沿用原NO.2的40,10、Z=−7、R=2、进给600,停留位置仍为初始平面。在“加工方式”选G82钻孔,点击该行圆心,再输入停留时间1.5并按回车。
点击截图可查看原图。
图4 新出现的输入框是原 lineEdit_17,绑定 #6009.item[#9048.version]。后处理把1.5乘1000,写入P1500。
再把同一孔改为G83钻孔,每次啄孔深度填2,啄孔间隙填0.5。
点击截图可查看原图。
图5 原 lineEdit_18、lineEdit_19 分别绑定 #6010、#6011 中的当前孔,后处理输出Q2.000和K0.500。
点击“生成G代码”后,这一个孔的钻孔行分别是:
G98G81X40.000Y10.000Z-7.000R2.000F600.000
G98G82X40.000Y10.000Z-7.000R2.000P1500F600.000
G98G83X40.000Y10.000Z-7.000R2.000Q2.000K0.500F600.000
这三行是三次选择的结果对照,不是要求同一个孔连续执行三种循环。可查看各次的完整G82文本和完整G83文本。下一章的完整程序恢复使用G81。
生成操作会把 #9048.version 和 #6001.channel 设回−1,因此右上参数区会隐藏。需要继续改孔时,重新点击目标孔的圆心即可,不必重新导入。这个变化是生成入口的既有行为,不是孔参数被删除了。
勾选决定加工哪些孔。 左边的选择框绑定:
-T11(#6001itemmin[#6001itemversion%%]<<"NO."<<%%+1)
显示文字按行编号,但勾选值写回原始孔。取消勾选不删除几何,也不删除这孔的工艺参数。
这一组控件使用 #6000 的四个子项。定制页面时,需要保持选项的数值与处理脚本一致:
| 子项 | 控件 | 当前数值约定 |
|---|---|---|
#6000.item[0] |
comboBox,排序策略 |
0=Y向扫描,1=X向扫描,2=最短路径,3=最优路径,4=不排序 |
#6000.item[1] |
comboBox_3,蛇形排序 |
0=否,1=是;供扫描排序使用 |
#6000.item[2] |
comboBox_2,筛选条件 |
0=>,1=>=,2===,3=<=,4=< |
#6000.item[3] |
lineEdit,筛选尺寸 |
与标题中取出的半径比较 |
改语言包中的名称可以换显示文字;如果调整选项先后次序,控件写入的数值也会改变,必须同步调整读取这些数值的处理。不能只把第三个选项改名,就认为它对应的算法也变了。
筛选批量改写勾选。 本例选择“等于”,在“孔位筛选直径”输入 2,再点“孔位筛选”。按当前实现,它比较半径,结果前三个半径2的孔参加加工,半径3的孔不参加。每次筛选都会重新计算所有孔的勾选状态,不是在旧勾选上继续缩小范围。
排序决定处理次序。 如果希望手工排列,就选择“不排序”,再使用上移、下移、置顶。本例把原NO.2置顶,再做上述筛选。
点击截图可查看原图。
图6 第一行圆心为40,10,仍然保留−7的孔深;NO.1这个显示序号现在属于第一行,而不是固定指向最初的第一个圆。
| 排序选项 | 如何理解 |
|---|---|
| Y向扫描/X向扫描 | 按相应坐标分组和扫描,蛇形选项控制相邻扫描行的方向 |
| 最短路径 | 从起点按最近邻选择后续孔 |
| 最优路径 | 在最近邻结果上继续做路径交换改进 |
| 不排序 | 使用当前传入的孔次序,适合学习手动排列 |
界面里的“最短/最优”是选项名称,不表示数学上保证全局最短。“置顶”当前是将选中行与第一行交换,并非把中间所有行依次向后推。
生成时还存在两层顺序处理:内置操作会把选中的孔集中到前面,按所选策略整理;JavaScript又按刀号由小到大组织输出。因此,不同刀号时,手动显示顺序不一定就是最终NC顺序。此外,底层以字符串键传递 drill0、drill1 等任务,孔数达到两位数后,字符串次序也会影响同刀号任务;对顺序有要求时,应直接检查生成代码中的XY次序。
| 现象 | 优先检查 |
|---|---|
| 改了一个孔,其他孔没变 | 这是每孔输入;保存默认值也不会立即覆盖其他孔 |
| 重新导入后单孔参数恢复 | 导入重新按 #6002 建立每孔工艺 |
| 按直径筛选没有选中预期孔 | 当前字段实际按半径比较,先用已知尺寸圆确认数值 |
| 移动行后参数对应错了 | 是否误用显示行索引;应先通过 itemversion取得原始孔号 |
| 从图形选孔后,自定义按钮操作了另一行 | 是否直接使用了旧 #6001.channel;先按 #9048.version 在 itemversion 中查找当前行 |
| 列表点击能更新新增说明区,图形选孔却不能 | 是否只在 selectDrillItem 写了更新动作;可改为由当前孔号驱动的显示绑定 |
| 钻孔完成时停留位置显示空白 | 先选中一个孔,再按本章第5节刷新原DXF页面;已有程序文字时先保存,刷新会清空该文字区 |
| 生成后右上参数区消失 | 生成入口清除了当前选孔;重新点击孔的圆心,不用重新导入 |
现在,勾选、当前孔、排列顺序和每孔工艺已经分清。下一章沿原NO.2的−7继续追踪,看它怎样进入工艺字符串,并成为G代码中的Z值。