第22章在原钻孔页中增加了G196扩孔。本章继续使用那套文件,增加一个独立的“法线跟随”子页面:X、Y沿二维轮廓移动,C轴随轮廓方向改变角度。原来的G81、G82、G83和G196,以及孔表、单孔工艺、筛选、排序、程序头尾、生成和保存载入,仍放在“钻孔与扩孔”页。
本例直接接通软件已有的 dxfContourInit、dxfContour 和 processComplexVerticesMap.js 轮廓分支。开发工作集中在组织页面、定义参数、绑定控件、编写导入和生成脚本。无需修改C++,也无需重写已经具备的法线算法。
下载第22、23章合并学习包 · 示例轮廓图 · 完整生成程序
点击截图可查看原图。
图1 DXF入口仍在主界面原来的位置。右侧新增“钻孔与扩孔”“法线跟随”两页入口;下方仍是第22章的孔表及G196工艺区。
两页各自使用一个UI文件。切换入口只更换右侧下方的内容,主界面左侧的原生绘图区继续共用。
| 功能 | 钻孔与扩孔页 | 法线跟随页 |
|---|---|---|
| 从图形取什么 | 圆心等孔位 | 连接后的二维轮廓 |
| 表格显示什么 | 孔位、加工方式、每孔参数 | 是否加工、起点、终点 |
| 工艺在哪里保存 | 沿用第22章的每孔参数与 #6002 默认值 |
新增 #6022,本页勾选轮廓共用工艺 |
| 生成入口 | dxfDrill |
dxfContour |
| 输出 | G81/G82/G83/G196 | G0、G1组成的X/Y/Z/C程序 |
两页可以来回切换,但切换时会清空当前图形和未保存程序,需要重新导入DXF。 工艺默认值分别保留。原因是软件内部只有一份当前DXF实体数据,两个初始化函数也共用 #6001。把两页的UI分开,还需要把这份共用数据的使用顺序安排好,详见第6节。
先复制一份软件运行目录作为学习工程。关闭这份软件,将学习包的 package/env、package/extScripts 合并到副本中。安装后重新启动,从宏参数窗口把 #929.item[12] 设为1,再进入“DXF”。启用方法见DXF页面与导入。
已有定制工程应按文件合并。特别是 processComplexVerticesMap.js:使用第22章已经包含G196分支的版本,保留自己原有的其他修改。不要再用早期仅含三种钻孔方式的JS覆盖它。
| 文件或目录 | 本章如何处理 | 用途 |
|---|---|---|
env/dxfpage |
保留第22章初始化,改接双页外框 | DXF总入口 |
env/dxf/dxf.ui |
原样保留第22章版本 | 钻孔与扩孔页面 |
env/dxf/dxfloader、generatecode |
原样保留第22章版本 | 原钻孔导入与生成 |
env/slib-dxf-custom.nc |
原样保留 | G196对应的O9196 |
extScripts/processComplexVerticesMap.js |
原样保留第22章版本 | 同时具备三种钻孔、G196和已有轮廓分支 |
env/dxf-normal/workbench.ui |
新增 | 两个入口及子页容器 |
env/dxf-normal/normal.ui |
新增 | 法线轮廓表、工艺区、代码区和按钮 |
env/dxf-normal/switch-page |
新增 | 清理共用数据并换页 |
env/dxf-normal/import-contours |
新增 | 导入、识别轮廓、初始化列表 |
env/dxf-normal/generate |
新增 | 校验工艺、生成完整程序 |
env/dxf-normal/save-load |
新增 | 保存并载入程序页面 |
env/dxf-normal/empty.dxf |
新增 | 切页时清空内部图形数据的空图 |
env/dxf-normal/init 是便于对照的初始化原文,内容已经直接放进 dxfpage;不需要再增加一次启动调用。第22章的 env/dxf-custom/init 同样保留为对照文件。
本例使用 #6020~#6022。安装到已有定制工程前,检查这三个参数是否已被使用;第22章的 #6013~#6015、G196/O9196也应保留原分配。新编号并非软件永久保留号,如有冲突,应统一替换脚本和UI中的相关编号。
本页以毫米为单位,在G54的XY平面上生成程序,工件表面为Z0。X/Y是轮廓坐标,Z控制抬刀和切入,C控制方向。
| 输入框 | 参数 | 示例值 | 对程序的作用 |
|---|---|---|---|
| 安全高度 Z | #6022.item[0] |
10 | 每个分段开始前、程序结束时退到Z10 |
| 切削高度 Z | #6022.item[1] |
−2 | 定位后以G1切入Z−2 |
| 轮廓进给 F | #6022.item[2] |
300 | 切入时给出F300,后续轮廓行沿用 |
| 末端修正(固定0) | #6022.item[3] |
0 | 保留原轮廓长度,本例只读 |
这是一层固定Z的轮廓程序。它没有分层切深,也不自动输出换刀、主轴启动或G43刀长补偿。使用前应装好适用工具、建立工件坐标,并按具体加工工艺安排主轴或其他工具动作。安全高度必须高于转移路径上的工件和夹具。
C采用现有JS的固定关系:
C = 轮廓切向角 − 90°
沿+X运动时C为−90°,沿+Y运动时C为0°。这取的是行进方向右侧的法线约定,不会自动判断封闭轮廓的内侧或外侧。C的机械零位、正方向、允许角度以及实际轴映射必须与此约定配套;显示C坐标行与配置实际驱动也是两件事,可结合轴配置阅读。
先把数据的用途分开,再把控件接上去。不要把法线的四个字段直接写进钻孔的十字段或十三字段工艺串。
| 参数字段 | 本例用途 |
|---|---|
#6020 |
当前页:0为钻孔与扩孔,1为法线跟随 |
#6020.version |
本次点击请求切换到哪一页 |
#6020.description |
本例初始化标记 DXF_NORMAL_V1 |
#6020.itemtitle[0~19] |
两页入口、按钮、表头和提示语 |
#6021.itemdesc[0] |
当前子页面的UI路径 |
#6021.channel |
子页布局使用的通道字段,本例设为0 |
#6022.item[0~3] |
四个工艺值 |
#6022.itemtitle[0~3]、itemtype、itemunit |
输入框名称、类型和单位 |
#6022.description |
当前导入文件的路径 |
#6022.unit |
本例借用作页面提示文字 |
#6022.itemdesc[0] |
生成的完整NC文本 |
#6022.itemdesc[1] |
四项工艺拼成的字符串 |
#6022.permission、#6022.channel |
生成时的循环下标、已勾选数量 |
最后两行是本例对字段的用法,不能据字段名称理解为登录权限或NC解释器通道。初始化的核心如下;完整内容见init。
#6020.itemnum=20
#6021.itemnum=1
#6022.itemnum=4
#6020.description="DXF_NORMAL_V1"
#6022.item[0]=10
#6022.item[1]=-2
#6022.item[2]=300
#6022.item[3]=0
#6022.itemtype[0]=2
#6022.itemtype[1]=2
#6022.itemtype[2]=1
#6022.itemtype[3]=2
这里类型2用于实数,类型1用于整数。完整初始化只在首次使用时填入工艺默认值,随后重新进入DXF也不会把刚输入的工艺覆盖掉。已有本例标记时继续使用原值;首次安装遇到三个参数中任意一个已有子项时,会提示编号冲突。
中英文名称同样在这里定义。先写中文,再根据 #9980.item[2]==1 写入英文;UI统一引用参数中的文字。脚本文件名和控件对象名保持不变。
原主界面的 dxfframe 通过 #899 装入DXF页面。我们保留这个外层入口,只将它装入的文件改为:
#899.itemdesc[0]="/env/dxf-normal/workbench.ui"
widgetFunc["QFrame","dxfframe","refresh",""]
在Qt Designer中,外框文件的结构如下。对象名需要与脚本一致;布局负责随窗口伸缩。
workbench.ui
└─ 垂直布局
├─ dxfNavigation:水平布局
│ ├─ drillTab:QLabel,钻孔与扩孔
│ └─ normalTab:QLabel,法线跟随
├─ switchNotice:QLabel,切页提示
└─ dxfContent:QFrame,装入当前子页面
给 dxfContent 的 accessibleDescription 填入:
-T(6021)
初始化时设置 #6021.itemdesc[0]="/env/dxf/dxf.ui",因此第一次进入仍然看到第22章页面。点击另一个入口时,将路径改为 /env/dxf-normal/normal.ui,刷新 dxfContent 即可。
“法线跟随”标签 normalTab 的完整绑定是:
-T(#6020itemtitle1)
-A:(clickedEvent:/env/dxf-normal/switch-page[0](#6020version=1))
-C1(#6020==1)
-C0(1)
-D
第一行取文字;点击先把请求页写成1,再调用切页脚本;两条条件决定选中与未选中的样式;-D让显示随参数更新。“钻孔与扩孔”的对应值改为0。
两个入口必须放在 dxfContent 外面。 刷新QFrame会销毁其中旧的子页控件,再创建新页。入口留在外框中,用户始终可以切回来,也避免刷新掉正在处理点击事件的按钮。
点击截图可查看原图。
图2 切换后的独立页面。空表和空绘图区表示还没有导入本页轮廓;钻孔页并未被删除。
新建 normal.ui 时沿用原DXF页面的样式和控件类型,主要对象如下。
| 对象名 | Qt控件 | 做什么 |
|---|---|---|
normalTable |
QTableWidget | 三列轮廓表 |
normalSafe、normalCut、normalFeed、normalEnd |
QLineEdit | 四个工艺输入,最后一项只读 |
normalBody |
QPlainTextEdit | 显示和编辑生成程序 |
normalImport |
QPushButton | 导入轮廓DXF |
normalGenerate |
QPushButton | 生成法线代码 |
normalLoad |
QPushButton | 保存载入 |
normalSource、normalStatus |
QLabel | 文件路径和提示文字 |
例如安全高度输入框使用 -T(#6022item0) 和 -D;状态标签使用 -T(#6022unit) 和 -D。完整UI见normal.ui。
切页脚本先检查是否真的要换页,再检查加工或暂停状态。允许切换时执行以下核心步骤:
widgetFunc["readDxf","env/dxf-normal/empty.dxf","",0]
#6001.itemnum=0
#6001.channel=-1
#9048.version=-1
#6022.description=""
#6022.itemdesc[0]=""
#6022.unit=#6020.itemtitle[11]
#6020=#6020.version
#6021.itemdesc[0]="/env/dxf/dxf.ui"
IF#6020==0GOTO10
#6021.itemdesc[0]="/env/dxf-normal/normal.ui"
N10
widgetFunc["QFrame","dxfContent","refresh",""]
readDxf会清除旧绘图和内部DXF实体。这里读入一个合法但没有实体的DXF,使内部图形与空列表保持一致;只把 #6001.itemnum 改为0并不能完成这件事。
随后清除选中编号、文件名和旧输出,再更新页面路径、刷新子页。#6002的钻孔默认值与 #6022.item[0~3]的法线工艺不在清空范围内。完整脚本见switch-page。
这个步骤体现了多页面定制中很实用的一点:页面可以分开,内部数据未必分开。 遇到软件已有的共用数据时,应安排明确的导入、清理和使用顺序。
新导入按钮的绑定如下。这里是原生QPushButton释放鼠标时调用脚本,事件名使用 MouseButtonRelease。
-T(#6020itemtitle7)
-A:(MouseButtonRelease:/env/dxf-normal/import-contours[0])
-C(#319item3==1||#319item7==1)
-E0
-D
加工忙或暂停时,按钮按原组态习惯禁用。用户选择文件后,脚本的核心是:
IFwidgetFunc["readDxf",#100,"",0]!=0GOTO90
#6022.itemdesc[1]=#6022.item[0]+":"+#6022.item[1]+":"+#6022.item[2]+":"+#6022.item[3]
widgetFunc["dxfContourInit","","","\""+#6022.itemdesc[1]+"\""]
IF#6001.itemnum==0GOTO90
#6022.description=#100
#6022.unit=#6020.itemtitle[10]
#9048.version=0
#6001.channel=0
widgetFunc["QTableWidget","normalTable","refresh",0]
readDxf负责读实体,dxfContourInit负责识别连接后的轮廓并建立 #6001。原钻孔页在这里使用的是 dxfDrillInit,两者不能只换名字而保留同一种表格和工艺串。
四项工艺按下面的次序传入:
安全Z:切削Z:进给:末端修正
10:-2:300:0
实际串中可能带有小数尾零,例如 10.0000:-2.000:300:0.000,含义相同。dxfContourInit还会解析一次第四参数中的文本表达式,因此这里特意在整个串的两端拼上双引号。省略这一层引号,不能视为与钻孔初始化等价。
文件对话框取消时保留当前内容;确认新文件后才清除旧输出。读图失败或未识别到轮廓时,清空列表并提示检查文件。完整脚本见import-contours。
点击截图可查看原图。
图3 示例文件包含三条实体:两条相接直线形成一条L形轮廓,另一条圆弧形成第二条轮廓。实体数与轮廓数不一定相同。
示例的两条直线为 (10,10)→(40,10)、(40,10)→(40,30);半圆圆心为 (70,25),半径10,从180°到360°。它们都在 NORMAL 图层内。
当前轮廓识别按图层拼接,调用中采用连接容差0.001、圆弧和圆的离散角度1°。这三个值来自内置调用,本页没有增加对应输入框。画图时应检查单位、端点连接和所在图层,不能把不同图层上看似相接的线直接当成一条轮廓。
点击截图可查看原图。
图4 起点、终点用于识别原始轮廓。第一列的勾选决定是否生成加工程序,蓝色行表示当前查看对象。
初始化后,各字段的关系是:
| 字段 | 含义 |
|---|---|
#6001.itemnum |
轮廓数 |
#6001.itemtitle[p] |
文字形式的 contour(起点)->(终点) |
#6001.itemmin[p] |
是否加工:1为勾选 |
#6001.itemdesc[p] |
当前轮廓的四项工艺串 |
#6001.itemversion[row] |
表格行对应的原始轮廓编号 |
#9048.version |
绘图区当前突出显示的原始编号 |
#6001.channel |
表格当前行 |
借用第20章的表格方法,第一列绑定勾选与编号:
-T11(#6001itemmin[#6001itemversion%%]<<"NO."<<%%+1)
-C1(#9048version==#6001itemversion%%)
-C0(1)
-D
%%是当前行号,先通过 itemversion 取得原始编号,再读写对应的勾选值。显示的NO.1对应内部编号0。
起点列从标题中截取第一对括号里的文字:
-参数(#6001itemtitle[#6001itemversion%%]*")"/"(")
-事件:(clickedEvent:/env/dxf/selectDrillItem[1](#9048version=#6001itemversion%%<<#6001channel=%%))
-C1(#9048version==#6001itemversion%%)
-C0(1)
-D
终点列先跳过 ->,再取括号中的文字。点击坐标格时,事件参数直接写入选中编号和行号;本例复用现有空的 selectDrillItem 事件入口,实际选择动作由这两次赋值完成。
点击截图可查看原图。
图5 点击第二行坐标格后,当前查看对象变为半圆。两行仍都勾选,因此生成时仍包含两条轮廓。
当前查看与参与加工要分开理解。 选中一行不会自动排除其他已勾选轮廓。只想生成L形,应取消第二行的“加工”勾选。
本页保持导入列表的顺序。生成函数内部会重新排列轮廓并改写 itemversion,因此生成前后都将映射恢复成 0、1、2……;这样再次勾选、重复生成时仍对应原图。列表的起终点用于识别原图,不保证就是生成程序的起终点,因为内部排序可能反向轮廓。
点击截图可查看原图。
图6 本例让所有勾选轮廓共用一组工艺。修改输入框后,点击“生成法线代码”才会重新形成程序。
与钻孔页的“每孔独立设置”不同,本页生成时遍历 #6001,把当前四项工艺统一写入每个 itemdesc。因此导入后再把切削Z改为−3、进给改为450,也能对本次生成的所有分段生效,不必重新导入。
本例将末端修正固定为0,原因在现有后处理本身:非零修正会延长或裁短XY末端,但并不会为修改后的末点重新计算C方向。先使用0,可以保持本章讲解的原始轮廓及方向关系。若以后要开放修正值,应同时补上末端角度处理。
生成前还有四项检查:安全Z不小于0.001,切削Z不大于−0.001,进给不小于1,末端修正必须为0。这既符合本例Z0表面的加工约定,也避开已有JS中 parseFloat(value) || 默认值 对数值0采用默认值的规则。
生成按钮调用 env/dxf-normal/generate。它依次完成:清除旧输出 → 检查参数和勾选 → 写入各轮廓工艺 → 调用内置生成 → 恢复表格编号 → 添加程序头 → 显示文本。
下面是学习包中的完整生成脚本。先看每一段的目的,再逐行对照。
IF#6020!=1GOTO99
#6022.itemdesc[0]=""
widgetFunc["PlainTextEdit","normalBody","clear",""]
IF#6001.itemnum==0GOTO90
IF#6022.item[0]<0.001GOTO91
IF#6022.item[1]>-0.001GOTO91
IF#6022.item[2]<1GOTO91
IF#6022.item[3]!=0GOTO91
#6022.itemdesc[1]=#6022.item[0]+":"+#6022.item[1]+":"+#6022.item[2]+":"+#6022.item[3]
#6022.permission=0
#6022.channel=0
WHILE#6022.permission<#6001.itemnumDO1
#6001.itemversion[#6022.permission]=#6022.permission
#6001.itemdesc[#6022.permission]=#6022.itemdesc[1]
IF#6001.itemmin[#6022.permission]==1THEN#6022.channel=#6022.channel+1
#6022.permission=#6022.permission+1
END1
IF#6022.channel==0GOTO90
#6022.itemdesc[0]=widgetFunc["dxfContour","","",0]
; This page presents source contour order; generation may change itemversion.
#6022.permission=0
WHILE#6022.permission<#6001.itemnumDO2
#6001.itemversion[#6022.permission]=#6022.permission
#6022.permission=#6022.permission+1
END2
widgetFunc["QTableWidget","normalTable","refresh",0]
IF#6022.itemdesc[0]==""GOTO92
#6022.itemdesc[0]="G21G90G17G40G49G80G94G15\nG54\n"+#6022.itemdesc[0]
widgetFunc["PlainTextEdit","normalBody","insertText",#6022.itemdesc[0]]
#6022.unit=#6020.itemtitle[12]
GOTO99
N90
#6022.unit=#6020.itemtitle[14]
GOTO93
N91
#6022.unit=#6020.itemtitle[13]
GOTO93
N92
#6022.unit=#6020.itemtitle[16]
N93
widgetFunc["messageBox",#6020.itemtitle[1],#6022.unit,""]
N99
这里有三个容易忽略的地方。
点击截图可查看原图。
图7 程序头明确G21/G90/G17/G94和G54。图中的轮廓连线帮助查看生成次序,真正的抬刀、定位和切入动作以右侧NC代码为准。
完整链条可以按四次转换来理解:
readDxf
图纸实体
↓ dxfContourInit
连接后的轮廓 + #6001列表 + 四项工艺
↓ dxfContour
勾选轮廓 → 排列方向 → 按方向变化分段
↓ splitPointsByAngleChange
每个点:x、y为位置,z临时存放切向角
↓ processComplexVerticesMap.js / processNonDrillKey
C=z−90;实际切削Z来自工艺串
现有角度计算根据相邻XY点求 atan2(ΔY,ΔX),再换算为度。相邻方向差会折算到 (-180°,180°] 并累加,使角度跨越±180°时能够连续变化。方向突变大于10°时拆成新的段;折点同时作为前段终点和后段起点。
传给JS的数据大致如下,表示L形的一条轮廓被分成两个方向段:
// 表示数据含义的简化写法;该对象由软件内部传入,不由页面手工构造。
dataMap = {
"contour0:10:-2:300:0": [
[{x:10, y:10, z:0}, {x:40, y:10, z:0}],
[{x:40, y:10, z:90}, {x:40, y:30, z:90}]
]
};
outputFlag = "GCode";
这里的点z是角度,不是切削深度。 processNonDrillKey把点复制为 z-90,输出时将这一值写成C;Z−2则从键中的第二个工艺值取得。误把点z输出成机床Z,会破坏这一约定。
这也解释了为什么本章不新增第二份后处理文件:第22章的JS仍按 drill… 处理孔位,其他轮廓键进入已有轮廓分支。独立页面决定调用哪个内置入口,从而决定传给JS的是哪一种数据。
本页没有增加加工次序编辑器。内置函数会对轮廓排序,可能反向;其结果又经过按字符串键保存和JS任务遍历。轮廓较多时,尤其编号达到两位数后,不应把表格行号当成最终加工先后。需要严格次序时,应进一步设计编号和后处理排序规则,并检查输出的完整程序。
点击截图可查看原图。
图8 第一段C−90,第二段C0。C转向之前已经退到Z10。
实际生成的关键代码如下:
G0Z10.000
G0X10.000Y10.000C-90.000
G1Z-2.000F300
G1X40.000Y10.000C-90.000
G0Z10.000
G0X40.000Y10.000C0.000
G1Z-2.000F300
G1X40.000Y30.000C0.000
第一段从 (10,10) 沿+X走到 (40,10),C保持−90°。直角变化超过内置10°分段条件,因此这里结束第一段。第二段先退到安全高度,再在同一XY位置把C转到0°,切入后沿+Y走到 (40,30)。
它并不是带刀在尖角处连续旋转。对不允许抬刀、需要圆角过渡或需要专门转角工艺的任务,应在此基础上另做工艺设计。重新定位行同时包含X/Y/C,跨轮廓时会在安全Z上一起定位;本例没有增加“先转C,再走XY”的独立动作。
点击截图可查看原图。
图9 圆弧已经离散成短直线,右侧C数值随这些点连续改变。
示例半圆起始部分为:
G0Z10.000
G0X60.000Y25.000C-179.500
G1Z-2.000F300
G1X60.002Y24.825C-178.500
G1X60.006Y24.651C-177.500
G1X60.014Y24.477C-176.500
这里生成的是 G1X…Y…C… 点列,不是 G2/G3 圆弧指令。圆弧按1°取点,再以相邻点求方向,因此C使用的是离散线段方向。起点出现−179.5°,以及后续角度末位的微小变化,都应从这一计算方式理解,不能擅自把它改成整度。
平滑段之间没有像直角那样反复抬刀。当前算法也不会自动把累计C角度限制在−180°到180°之间;完整圆的角度可持续累加。不要为了数值好看而逐行取余,否则可能在跨界处引入不需要的反转。旋转轴行程、旋转方向与线缆限制要在机型工艺中处理。
“保存载入”沿用软件已有的文件保存与程序加载方法,改为读取本页 normalBody 的文本。因此在代码区手工编辑后,保存的是当前可见文本。
其主要步骤是:读取文本 → 非空检查 → 选择NC文件名 → savefile → 更新 #334 加工文件列表、#9047 代码显示文件和 #403 加工文件 → 将 #810.permission 置0,返回程序页面。完整脚本见save-load。
#6022.itemdesc[0]=widgetFunc["PlainTextEdit","normalBody","plainText",0]
IF#6022.itemdesc[0]==""GOTO90
#100=""
widgetFunc["saveFileName","*.nc","",100]
IF#100==""GOTO1
widgetFunc["savefile",#100,"",#6022.itemdesc[0]]
本页不在保存后自动启动加工或仿真。保存为 dxf-normal.nc 后,可在原“程序→刀路预览”页面查看文件,再点击原功能键区的“仿真”(图中F3)查看刀路。
点击截图可查看原图。
图10 左侧可看到L形、半圆及定位连线,中部代码带C字,顶部为“仿真”。XY刀路用于检查位置;C方向还要结合代码查看,普通刀路线并不等于工具方向模型。
预览时选择轨迹视图和俯视,适当缩放图形。若处于跟随刀具的视图,画面会以工具位置为中心;工具在原点而图形远离原点时,部分轮廓可能在画面之外。
点击截图可查看原图。
图11 回到第22章页面后重新导入四孔图,仍可选择G196并填写D/I/Q,也可在原下拉框选择G81、G82或G83。
这里保留的是原功能和工艺默认值,不是切页之前每个孔的临时编辑记录。重新导入会重新建立孔数据;例如第22章第二孔的Z−7,需要在导入后再设置。程序头尾也应在保存前确认。
若安装后只剩法线页,检查 workbench.ui 是否仍包含两个入口;若G196消失,检查是否误用了第22章扩展之前的UI或JS;若切回后列表还是轮廓起终点,检查切页脚本是否更新了 #6021.itemdesc[0] 并刷新了 dxfContent。
| 想改变什么 | 应从哪里改 | 同时考虑什么 |
|---|---|---|
| 改名称、说明、默认工艺 | init及 dxfpage 中同一段初始化 |
中英文名称、已有参数是否应保留 |
| 增加本页输入项 | normal.ui、参数定义、生成脚本 |
字段顺序、单位、校验和JS读取方式必须一致 |
| 不同轮廓使用不同工艺 | 新增每轮廓参数及选择回填 | 不能继续在生成时把所有 itemdesc 覆盖为同一串 |
| C轴改用另一个旋转轴 | 轮廓后处理的轴字输出 | 对应轴的零位、方向、映射和角度约定,不只是替换界面标签 |
| 增加转角动作或分层 | 轮廓后处理 | 抬刀、转向、切入、下一层和最终退刀的完整顺序 |
| 开放末端延长或裁短 | 现有修正分支及其角度处理 | XY末端改变后重新求方向,避免只移动点而沿用旧C |
| 严格指定轮廓顺序 | 列表编号、生成键与JS排序 | 轮廓反向、两位数编号、C的连续性和安全转移 |
常见问题可按下表定位。
| 现象 | 检查位置 |
|---|---|
| 没有DXF入口 | 宏参数窗口中的 #929.item[12] |
| 新页面没有文字 | dxfpage是否先完成本例参数初始化,UI编号是否一致 |
| 点击导入按钮无动作 | 对象名与 MouseButtonRelease 绑定、脚本路径 |
| 能读图但轮廓表为空 | dxfContourInit调用、第四参数引号、DXF实体与连接关系 |
| 取消勾选后仍有旧程序 | 生成脚本是否先清旧输出,是否重新点击生成 |
| 改工艺后输出未变化 | 是否在生成前把四项工艺写入 #6001.itemdesc |
| 法线角度与刀具朝向相反 | C机械零位、正向、路径方向及 C=切向角−90° 约定 |
| 圆弧代码很长 | 现有链路按角度离散成G1点列,这是当前输出形式 |
| 文件中出现两个M30 | 是否又追加了钻孔页的程序尾 |
本例完成了从已有功能到独立工艺页的接法:外框负责选页,参数负责存值,控件负责输入和显示,脚本负责调用顺序,已有后处理负责输出NC。继续扩展时,可沿这些位置逐一修改,而不必重新搭建整个CNC系统。