扩展实例:为DXF增加独立的法线跟随页面

阅读目录 · English

第22章在原钻孔页中增加了G196扩孔。本章继续使用那套文件,增加一个独立的“法线跟随”子页面:X、Y沿二维轮廓移动,C轴随轮廓方向改变角度。原来的G81、G82、G83和G196,以及孔表、单孔工艺、筛选、排序、程序头尾、生成和保存载入,仍放在“钻孔与扩孔”页。

本例直接接通软件已有的 dxfContourInit、dxfContour 和 processComplexVerticesMap.js 轮廓分支。开发工作集中在组织页面、定义参数、绑定控件、编写导入和生成脚本。无需修改C++,也无需重写已经具备的法线算法。

下载第22、23章合并学习包 · 示例轮廓图 · 完整生成程序

1.先看这次做出了什么

保留第22章钻孔与扩孔页面,顶部增加两页入口

点击截图可查看原图。

图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节。

2.准备文件,保留第22章的成果

先复制一份软件运行目录作为学习工程。关闭这份软件,将学习包的 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中的相关编号。

3.先确定这一页的加工约定

本页以毫米为单位,在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坐标行与配置实际驱动也是两件事,可结合轴配置阅读。

4.定义新参数:页面选择、子页路径、工艺数据

先把数据的用途分开,再把控件接上去。不要把法线的四个字段直接写进钻孔的十字段或十三字段工艺串。

参数字段 本例用途
#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统一引用参数中的文字。脚本文件名和控件对象名保持不变。

5.搭好双页外框,再放入独立页面

原主界面的 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。

6.切页时,先处理共用的DXF数据

切页脚本先检查是否真的要换页,再检查加工或暂停状态。允许切换时执行以下核心步骤:

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。

这个步骤体现了多页面定制中很实用的一点:页面可以分开,内部数据未必分开。 遇到软件已有的共用数据时,应安排明确的导入、清理和使用顺序。

7.导入DXF:同一个读图入口,换成轮廓初始化

新导入按钮的绑定如下。这里是原生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。

导入示例后,左侧显示L形和半圆,右侧产生两条轮廓记录

点击截图可查看原图。

图3 示例文件包含三条实体:两条相接直线形成一条L形轮廓,另一条圆弧形成第二条轮廓。实体数与轮廓数不一定相同。

示例的两条直线为 (10,10)→(40,10)、(40,10)→(40,30);半圆圆心为 (70,25),半径10,从180°到360°。它们都在 NORMAL 图层内。

当前轮廓识别按图层拼接,调用中采用连接容差0.001、圆弧和圆的离散角度1°。这三个值来自内置调用,本页没有增加对应输入框。画图时应检查单位、端点连接和所在图层,不能把不同图层上看似相接的线直接当成一条轮廓。

8.轮廓表怎样显示,怎样与图形对应

两行轮廓表的放大图,包含加工勾选、起点和终点

点击截图可查看原图。

图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……;这样再次勾选、重复生成时仍对应原图。列表的起终点用于识别原图,不保证就是生成程序的起终点,因为内部排序可能反向轮廓。

9.把输入框连到工艺,再把工艺送给每条轮廓

法线页四个工艺字段的放大图,安全Z10、切削Z负2、进给300、末端修正0

点击截图可查看原图。

图6 本例让所有勾选轮廓共用一组工艺。修改输入框后,点击“生成法线代码”才会重新形成程序。

与钻孔页的“每孔独立设置”不同,本页生成时遍历 #6001,把当前四项工艺统一写入每个 itemdesc。因此导入后再把切削Z改为−3、进给改为450,也能对本次生成的所有分段生效,不必重新导入。

本例将末端修正固定为0,原因在现有后处理本身:非零修正会延长或裁短XY末端,但并不会为修改后的末点重新计算C方向。先使用0,可以保持本章讲解的原始轮廓及方向关系。若以后要开放修正值,应同时补上末端角度处理。

生成前还有四项检查:安全Z不小于0.001,切削Z不大于−0.001,进给不小于1,末端修正必须为0。这既符合本例Z0表面的加工约定,也避开已有JS中 parseFloat(value) || 默认值 对数值0采用默认值的规则。

10.生成按钮:完整脚本要处理哪些事情

生成按钮调用 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

这里有三个容易忽略的地方。

  1. 先清旧输出。 取消全部勾选或输入不合要求时,代码区会清空并给出提示,避免误把上次的成功结果当成本次结果。
  2. 检查的是勾选数量。 有两行记录不等于有两条待加工轮廓,当前蓝色行也不代表加工数量。
  3. 只补程序头。 已有轮廓后处理会在末尾输出安全退刀和M30,本页不能再沿用钻孔页的程序尾去重复追加。

生成按钮把勾选轮廓转成X、Y、Z、C程序,显示在右侧代码区

点击截图可查看原图。

图7 程序头明确G21/G90/G17/G94和G54。图中的轮廓连线帮助查看生成次序,真正的抬刀、定位和切入动作以右侧NC代码为准。

11.底层已有机制:角度从哪里来,JS怎样使用

完整链条可以按四次转换来理解:

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任务遍历。轮廓较多时,尤其编号达到两位数后,不应把表格行号当成最终加工先后。需要严格次序时,应进一步设计编号和后处理排序规则,并检查输出的完整程序。

12.看直角:先抬刀,转向,再继续

程序区放大图,显示L形轮廓在拐点处的抬刀、C转向与重新切入

点击截图可查看原图。

图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”的独立动作。

13.看圆弧:XY变化时C也连续变化

半圆程序的局部放大图,连续G1行同时改变X、Y和C

点击截图可查看原图。

图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°之间;完整圆的角度可持续累加。不要为了数值好看而逐行取余,否则可能在跨界处引入不需要的反转。旋转轴行程、旋转方向与线缆限制要在机型工艺中处理。

14.保存载入,再看原生刀路预览

“保存载入”沿用软件已有的文件保存与程序加载方法,改为读取本页 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)查看刀路。

保存载入后的原生程序页面,左侧显示L形和半圆刀路,中部显示完整NC文件

点击截图可查看原图。

图10 左侧可看到L形、半圆及定位连线,中部代码带C字,顶部为“仿真”。XY刀路用于检查位置;C方向还要结合代码查看,普通刀路线并不等于工具方向模型。

预览时选择轨迹视图和俯视,适当缩放图形。若处于跟随刀具的视图,画面会以工具位置为中心;工具在原点而图形远离原点时,部分轮廓可能在画面之外。

15.切回钻孔,确认原功能如何继续使用

切回钻孔与扩孔页并重新导入后,原孔表、G196工艺区和生成按钮仍然存在

点击截图可查看原图。

图11 回到第22章页面后重新导入四孔图,仍可选择G196并填写D/I/Q,也可在原下拉框选择G81、G82或G83。

这里保留的是原功能和工艺默认值,不是切页之前每个孔的临时编辑记录。重新导入会重新建立孔数据;例如第22章第二孔的Z−7,需要在导入后再设置。程序头尾也应在保存前确认。

若安装后只剩法线页,检查 workbench.ui 是否仍包含两个入口;若G196消失,检查是否误用了第22章扩展之前的UI或JS;若切回后列表还是轮廓起终点,检查切页脚本是否更新了 #6021.itemdesc[0] 并刷新了 dxfContent。

16.学会后,怎样继续定制

想改变什么 应从哪里改 同时考虑什么
改名称、说明、默认工艺 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系统。

上一课:G196扩孔实例 · 返回阅读目录