孔位表:让列表、图形和加工参数配合起来

阅读目录 · English

DXF专题:DXF页面与导入 → 孔位表与工艺 → DXF后处理 → G196扩孔实例

按上一章开启DXF并导入四个圆后,原页面已经有了图形、孔位表和当前孔的参数区。本章重点看这三个区域怎样通过同一个孔号配合。

从原四孔图开始,跟着圆心40,10的NO.2操作:单独修改孔深,从图形选孔,再调整行顺序和筛选。后续生成程序的主例使用G81,这一孔的孔底Z为−7,其他孔为−5。

1.一行孔位,怎样找到它自己的加工参数

图1:孔位表局部,可以直接选择每个孔的加工方式

点击截图可查看原图。

这里有一个值得掌握的表格技巧:表格第几行与原来第几个孔分开保存。 上移、下移以后,工艺仍然跟着原来的孔走。

先把显示行记为 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不会跟着改变。以后调换显示行,也仍然修改同一个原始孔。

2.孔位表为什么不用为每个孔单独放控件

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 指向它。

这套写法可以沿用到其他“列表选择一个对象,旁边编辑它的参数”的页面。关键是所有列和右侧输入统一使用原始对象编号,不能一部分按显示行、一部分按原始编号。

3.列表与视图,怎样互相选中同一个孔

这里的“焦点”可以理解为当前正在查看、准备编辑的孔。它由 #9048.version 记录。列表高亮、图形高亮和右侧输入区都围绕这个原始孔号工作。

先看上一章图3的页面状态:点击列表中圆心为40,10的单元格后,NO.2整行变成蓝底,左侧对应圆周显示红紫色高亮,右侧孔底Z显示−7。接着,在Windows版左侧视图中,把鼠标移到圆心为10,35的圆周线附近,不必按住鼠标键,选孔就会切换:

图2:从视图选中左上方的圆,列表NO.3同步高亮,右侧孔底Z变为−5

点击截图可查看原图。

图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钻孔页中承载孔号,不能另作自定义临时变量。 这种设计的分工是:内置功能完成图形选取与绘制,组态属性完成列表颜色和输入绑定。

4.排序之后,为什么仍能选对孔

把原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 当成图形最新选中的行。

定制这种交互时,保留哪些规则

这样,列表负责让用户按文字找孔,视图负责让用户按几何位置找孔;两种操作都编辑同一份每孔参数。

5.默认工艺与每孔工艺,分别存在哪里

默认值 每孔值,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: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平面和孔底坐标应按机台、刀具及工件确定。

6.G81、G82、G83怎样切换右侧输入区

原 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&&#9048version<#6001itemnum&&#6003item[#9048version]==1)
-V0

前两项保证选孔有效,最后一项判断该孔的加工方式。表格下拉框一旦写入1,这块区域就满足显示条件。切换的是已有区域的显示,不是每次重新加载一份UI。 三块区域里的刀号、转速、孔底Z等都绑定同一组每孔参数,所以切换方式不会另复制一套孔深和进给。

下图沿用原NO.2的40,10、Z=−7、R=2、进给600,停留位置仍为初始平面。在“加工方式”选G82钻孔,点击该行圆心,再输入停留时间1.5并按回车。

图4:原G82参数区,孔底停留时间为1.500

点击截图可查看原图。

图4 新出现的输入框是原 lineEdit_17,绑定 #6009.item[#9048.version]。后处理把1.5乘1000,写入P1500。

再把同一孔改为G83钻孔,每次啄孔深度填2,啄孔间隙填0.5。

图5:原G83参数区,每次啄孔深度为2.000,啄孔间隙为0.500

点击截图可查看原图。

图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,因此右上参数区会隐藏。需要继续改孔时,重新点击目标孔的圆心即可,不必重新导入。这个变化是生成入口的既有行为,不是孔参数被删除了。

7.勾选、筛选和排序,是三件不同的事

勾选决定加工哪些孔。 左边的选择框绑定:

-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:原NO.2已经移到第一行;半径3的孔取消勾选

点击截图可查看原图。

图6 第一行圆心为40,10,仍然保留−7的孔深;NO.1这个显示序号现在属于第一行,而不是固定指向最初的第一个圆。

排序选项 如何理解
Y向扫描/X向扫描 按相应坐标分组和扫描,蛇形选项控制相邻扫描行的方向
最短路径 从起点按最近邻选择后续孔
最优路径 在最近邻结果上继续做路径交换改进
不排序 使用当前传入的孔次序,适合学习手动排列

界面里的“最短/最优”是选项名称,不表示数学上保证全局最短。“置顶”当前是将选中行与第一行交换,并非把中间所有行依次向后推。

生成时还存在两层顺序处理:内置操作会把选中的孔集中到前面,按所选策略整理;JavaScript又按刀号由小到大组织输出。因此,不同刀号时,手动显示顺序不一定就是最终NC顺序。此外,底层以字符串键传递 drill0、drill1 等任务,孔数达到两位数后,字符串次序也会影响同刀号任务;对顺序有要求时,应直接检查生成代码中的XY次序。

8.遇到问题,先检查这些位置

现象 优先检查
改了一个孔,其他孔没变 这是每孔输入;保存默认值也不会立即覆盖其他孔
重新导入后单孔参数恢复 导入重新按 #6002 建立每孔工艺
按直径筛选没有选中预期孔 当前字段实际按半径比较,先用已知尺寸圆确认数值
移动行后参数对应错了 是否误用显示行索引;应先通过 itemversion取得原始孔号
从图形选孔后,自定义按钮操作了另一行 是否直接使用了旧 #6001.channel;先按 #9048.version 在 itemversion 中查找当前行
列表点击能更新新增说明区,图形选孔却不能 是否只在 selectDrillItem 写了更新动作;可改为由当前孔号驱动的显示绑定
钻孔完成时停留位置显示空白 先选中一个孔,再按本章第5节刷新原DXF页面;已有程序文字时先保存,刷新会清空该文字区
生成后右上参数区消失 生成入口清除了当前选孔;重新点击孔的圆心,不用重新导入

现在,勾选、当前孔、排列顺序和每孔工艺已经分清。下一章沿原NO.2的−7继续追踪,看它怎样进入工艺字符串,并成为G代码中的Z值。

上一课:DXF页面与导入 · 阅读目录 · 下一课:DXF后处理