国学公众号推荐:模拟NC程序文件在AutoCAD中画出刀具路径图

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 15:34:29

模拟NC程序文件在AutoCAD中画出刀具路径图

AutoCAD, 刀具, 中画, 路径, 程序   自编自用,大家分享,如果有兴趣喜欢研究的我们一起讨论。
  由于写的过程经历了很长时间,边用边改边改边用的快5年了,有时候看得都眼花了,也许很多变量命名不规范很多命令行都起不到作用(但是又不想删除,反正体积很小),还有很多地方的修改在想不出好办法的时候用了重复再重复的笨方法,要是把源程序公布出来怕大家笑话 ,还是先用用看感受一下吧^_^


使用简介:
本程序使用AutoCAD的开发工具Visual LISP开发,只有在CAD2000以上版本适用。

使用步骤如下
1. 装载程序:进入,工具菜单->加载应用程序,
找到并装载此<.VLX>文件。或者在此界面的启动组中添加该<.VLX>文件,以后只要新建或打开dwg文件的时候将自动加载。
  
-->   ade080515.rar (13.38 KB) ade080515.VLX压缩包,在这里下载。
下载次数: 64
2008-5-15 23:10





2. 在命令行运行命令,三个命令介绍如下:

①<FWV> 命令,导入标准G代码CNC程序文件进行三维图形演示。
原理: 导入G代码命令文件后进行逐条分析,分析所得数据起点、
   终点、形式(直线、圆弧)、圆心、半径等,再以CAD制图
   命令方式自动绘出,给以直观形象,可利用CAD资源,转
   换三维视角、测量尺寸等。
      1.根据提示选择一个将要导入演示的文件;
      2.选择一次装载或单步跟踪(C/G);
         一次性全部自动画完
         按空格键逐条运行,直到CNC程序文件末尾后结束。
   说明:红色线条是G00快进路线,走刀路线的颜色随当前层。
   提示:演示前请关闭[对象捕捉],可能会影响到程序找点。
         不支持函数、循环、变量代换、跳转等语句。
         仅G0、G1、G2、G3等简单模拟,但是已经够用了,像Cimatron等软件自动编程生成的大型程序(NC命令行5万行以上的海量-_-||)基本上全是这4个指令。

②<FWVZ> 命令,导入'XZ' G代码CNC车削程序文件进行
        二维(CAD的 ↓Y-  →X+ 平面模拟机床的 ↓X+  →Z+ 坐标系)图形演示。
       请注意:圆弧编程当前仅支持圆弧R编程,圆心编程方法还未加入,同样是仅G0、G1、G2、G3等简单模拟。
       该命令操作类似命令。

命令,拾取CAD文件上的对象做路径,形成数控程序文本。

      1.根据提示选择目录并输入一个将要导出的文件名;
      
      2.根据提示拾取快进点即安全靠近点;  

      3.根据提示拾取第一个关键点(第一个要当做路径的对象的起始端点);<──────┐
                                                                                                                                 │     
      4.选择圆弧用 I \ J 编程还是用 R 编程,如果包含多义线则多义线部分只用R解释 │
                                                                                                                                   │
      5.从第一个对象开始(刚才关键点为所属对象的起点)顺序选择对象当做路径           │
                                                                                                                                   │
      6. <右键或空格或回车>结束对象选择                                                                    │   
                                                                                                                                   │
      7.按提示选择1或2                                                                                                 │
                                                                                                                                   │      
       ┠─ 1.进行另一块路径编程,    同步骤3至步骤6     ──────────────────┘
       ┃
        ┖─ 2.结束转步骤8        
                  
      8.根据提示拾取最后一个安全结束点。
     
    重要提示:第5步时,顺序千万不能错,否则生成的程序不会正确。
                第5步时,选取的对象只能是直线、圆弧或多义线,多义线要事先确定好起点后合成。

    拾取的小技巧:根据这里的算法,拾取直线的时候,目标点是直线段两端点中距离起点最
              近处的 端点,所以路径直线未必去与起点相连,但端点必须在离起点最远的目标点上,
              如果有很多快进路径重合,建议还是使用多义线先连起来的好。


3. CNC文本文件的指令行(是指一整行)首位是符号< / >或< ( >时,该行将当作注释行而不作解释
使用这里可以作为调试程序时添加注释符以忽略本行。
4.本程序还包含了其它几个实用性命令,具体方法可以打命令参看帮助。

6.由于我对对话框的设计不是很明白,这里的交互方式都是命令行格式


   

[ 本帖最后由 delupy 于 2008-5-16 20:31 编辑 ]

q3.JPG (176.47 KB)

下载次数:2

2008-5-15 10:45

 

车削

q4.jpg (115.66 KB)

下载次数:2

2008-5-15 10:45

 

加工中心

  数控中国温馨提示:本站不支持“迅雷”等下载软件下载附件,下载本站资源需要流量,点击这里用学习卷兑换流量
收藏到: 收藏 分享 评分 回复 引用

订阅 报告 TOP

blulian611
  • 发短消息
  • 加为好友

blulian611 当前离线

UID
83114 
帖子
20 
精华
积分
阅读权限
20 
在线时间
2 小时 
注册时间
2008-3-9 
最后登录
2008-6-8 

数控人(正式会员)

2# 高手,没能力看明白,纯支持。 数控中国温馨提示:本站不支持“迅雷”等下载软件下载附件,下载本站资源需要流量,点击这里用学习卷兑换流量
收藏到: 回复 引用

报告 TOP

delupy
  • 发短消息
  • 加为好友

delupy 当前离线

UID
93127 
帖子
22 
精华
积分
阅读权限
20 
来自
江苏 
在线时间
114 小时 
注册时间
2008-5-13 
最后登录
2009-1-12 

数控人(正式会员)

3# 发表于 2008-8-24 21:36 | 只看该作者

模拟程序的解说

;;;可以把此三篇文字复制到记事本后命名为ABC.LSP,保存在一个易找的目录下,
;;;;工具菜单->加载应用程序--加载刚刚的LSP文件,
;;;;;在命令提示符下执行定义的命令函数FWV,根据提示找到要演示的文件…………



;;;;;//////////////////////////////////////////////主函数[fwv]开始〕
(defun c:fwv ()
;;;;;;;;defun c: 定义命令函数,[fwv]
  (setq fname2 (findfile "c:\\cnccad.fw"))
;;;;;;;[c:\cnccad.fw]这个文件记录了打开文件的位置, 赋值给变量fname2
  (if (= NIL fname2) (writef2))
;;;;;如果fname2为空,即没有找到那个记录文件,则运行(writef2)子程序来建立它
  (findf);;;;;;;;;;;;;;;;;;;;;执行子程序(findf),找到所记录的位置
  (setq fi (getfiled "请选择文件:" f_drv "txt;*" 0))
;;;;;;;;;由(getfiled title default ext flags)函数获取CNC程序文件位置以及文件名
;;;;;;;;;(getfiled)函数解释如下:
;;;;;;;;;参数title     对话框标签字符,以作提示用
;;;;;;;;;参数default   缺省的定位路径,即对话框一打开时所定位的位置
;;;;;;;;;参数ext       文件扩展名限制,若多种形式则以分号分隔
;;;;;;;;;参数flags     控制对话框行为,此处0表示一般限制的搜索
;;;;;;;;;此时,被选择到的文件已经赋值到变量fi                                 

  (writef);;;;;;;;;;;;;;;;;;;;该子程序提当前所选文件的取路并且把位置记录下来
  (setq lstcmd "G1");;;;;;;;;;赋值[G1]到变量lstcmd,它用来记录最近一次的G动作命令

  (prompt "*** 命令,CNC程序文件刀具中心轨迹演示。")
  (prompt
      "已经选择完将要导入演示的文件;接下来将选择一次装载或单步跟踪(C/G);
         选项,一次性全部自动画完
         选项,按空格键逐条运行,直到CNC程序文件末尾后结束。"
  )
;;;;;;;;;;;;;;(prompt string)函数的作用是在命令提示区显示信息string,
  (setq cmd_type "");;;;;;;;cmd_type是为了区分另一个模式调用,此处用不着
  (initget 1 "C G");;;;;;;;;;;创建关键字列表[C与G],1表示后面的(getkword)输入只能局限在此列表中
  (setq cmd1 (getkword "\n 现在请选择(C/G):"));;;;;;转义字符[\n]表示换行符
;;;;(getkword MSG)函数,等待用户输入一个关键字,MSG是提示信息,
;;;;并且赋值到临时变量cmd1中
  (setq cmd1 (strcase cmd1));;;;;;;strcase的作用是将字符转化为大写
  (setq var_os (getvar "osmode"));;;;;;;;此处保存用户在CAD中选择的对象捕捉模式,
  (setvar "osmode" 0);;;;;;;;;;;;;;;;;;;;设置为0表示关闭所有的捕捉模式,端点的捕捉会由影响

  (setq f (open fi "r"));;;;;;;;;;;;;;;;;;;;打开文件用于读操作,并赋于文件句柄到f变量
  (setq strn (read-line f));;;;;;;;;;;;;;;;;读入一行数据并赋值给变量strn
  (setq ptbf (list 80 80 120));;;;;;;;;;;;;;预定义起点在X80Y80Z120处
;;;;;;;;;;;;;;;;;;(list)函数是把后面三个数字组合成一个表

  (while (/= strn nil)
;;;;;;;;;;;;;;;;;;;;;;读文文循环..........................................
;;;;;;;;;;;;;;;;;;;;;;此处判断条件是strn数据不为空,空则表示已达到文件末尾
    (setq strn (strcase strn));;;;;;;;全部转化为大写
    (FW_CK strn);;;;;;;;;;;;;;;;;;;;;;该子函数用来处理读入的数据行
    (setq strn (read-line f));;;;;;;;;再次读入一行数据并赋值给变量strn
  );;;;;;;;;;;;;;;;;;;读文件循环..........................................

  (CLOSE F)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;关闭文件
  (setvar "osmode" var_os)
;;;;;;;;;;;;;;;;;;;;;;;;;恢复用户的对象捕捉模式

  (prompt
    " 说明:
      红色线条是G00路线,走刀路线的颜色随层,您可以事先改变当前图层的颜色以示区别。\n"
  )
  (prompt "OK!!运行完毕,需要帮助请打命令 \n")
)
;;;;;;;;;;;;;;;;;;;;;/////////////////////////////主函数[fwv]结束

;;;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>分隔符>>>>>>>>>>>>>>>>>>>>>
;;;;;;;;;;;;;;;;;下面的是一些子程序

;;;--------------------------------
(defun writef2 ()
  (setq fname (open "c:\\cnccad.fw" "w"))
;;;;;;;;;;;打开[c:\cnccad.fw]文件用于写操作,如果文件不存在则会建立该文件并打开
;;;;;;;;;;;反斜杠[\]作为转义字符标识,不能直接写它,需要写成[\\]
  (setq sss "d:\\")
;;;;;;;;;;;;;;赋值[D:\]到sss变量,现在把初始位置设定在了D盘根目录
  (write-line sss fname);;;;;;;;写入变量[fname]对应的文件中
  (close fname);;;;;;;;;;;;;;;;;关闭文件
)
;;---------------------------------
;;;================================
(defun findf ()
  (setq fname (open "c:\\cnccad.fw" "r"));;;打开[c:\cnccad.fw]文件用于读操作
  (setq f_drv (read-line fname));;;;;;;由(read-line fname)读入一行数据并赋值给了变量f_drv
  (close fname);;;;;;;;;;;;;;;;;;;;;;;;关闭文件
)
;;;=================================

;;;++++++++++++++++++++++++++++++++++++
(defun writef ();;;;;;;;;;;;;;;;;;;;把刚刚所选文件的位置记录下来
  (if (= fi nil) (EXIT) (prompt fi))
;;;;;;;如果fi为空,即对话框选择文件被取消了,则退出,主函数终结
  (setq fname (open "c:\\cnccad.fw" "w"));;;打开[c:\cnccad.fw]文件用于写操作,
  (setq sss (strcat (vl-filename-directory fi) "\\"))
;;;;从fi变量中提取路径并赋值到变量sss
;;;;;;;;;;;;;;;;;;;;;(vl-filename-directory fi)从fi变量中提取路径
;;;;;;;;;;;;;;;;;;;;;(strcat A B C)函数为合并ABC字符串函数, 此处合并了 路径字符+[\]
  (write-line sss fname);;;;;;写入文件
  (close fname);;;;;;;;;;;;;;;关闭文件
)
;;+++++++++++++++++++++++++++++++++++++

;;;
;;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;;;;;;;>>>>>>>>>>>>>>>>>>>>>>>>>>>FW_CK开始<<<<<<<<<<<<<<<<<<<<<<<<<<
(DEFUN FW_CK (str1)
;;;;;;;;;数据行处理子函数定义
  (setq currentb str1)
;;;;;把本行数据赋值给currentb 做临时备份,一会显示的时候要用
  (setq str2 (vl-string-trim " " str1));;;删除字符串头尾的" ",即截取掉空字符

  (setq cm1 (substr str2 1 1));;;;;取出str2串中第1位开始的后面1个字符赋值给cm1

  (while (/= cm1 "/");;;;;;;;;;;;;;;;;;;;;;;;;;;非注释行条件<<<<<<<<<
;;;;;;;;;;;;;;如果首字符为[/],则该数据行当作注释行,不需做处理,即不运行此处的程序段
 
    (setq cx1 (vl-string-position (ascii "/") str2));;;;;;;查找该数据行中[/]的位置
    (if (/= cx1 nil)  (setq str1 (substr str2 1 cx1)) (setq str1 str2) )
;;;;;;;;;;;;;;;;;;;;如果发现[/],则把[/]位置后面的所谓注释字符都截取并删除掉。
;;;;;;;;;;;;;;;;;;;;把有用的数据赋值到str1


    (setq c_dmfx str1);;;;;;;;;;赋值给c_dmfx 做备份
    (setq n_gcode (vl-string-position (ascii "G") c_dmfx))                       
;;;;;;;;;查找该行中的[G]字符位置
;;;;;G90G1X300;;;字串例子(vl-string-position)
;;;;;012345678;;;位置编号(vl-string-position)
;;;;对应位置编号如上,找到第一个G字符位置为0

    (setq ng0 nil)
    (setq ng1 nil)
    (setq ng2 nil)
    (setq ng3 nil)
;;;;;;;把这4个变量清空,这里仅处理G代码0 1 2 3

   (while (/= n_gcode nil);;该段提取G代码类型,分离0,1,2,3
     (setq c_dmfx (substr c_dmfx (+ n_gcode 2)));;;从n_gcode+2位置处开始提取字符
;;;;;;;;;;;;;;;;;如0+2=2,substr提取的是第2个开始的后面全部,即[90G1X300]
     (setq n_code (atof c_dmfx));;;(atof)函数将字符转化为数值并赋值给 n_code
;;;;;;;;;;;;;;;;;[90G1X300]转化为数字是90,后面的[G]是字母不能转换所以开始忽略
      (if (= n_code 0) (setq ng0 T));;;;判断n_code是0则给ng0赋值T
      (if (= n_code 1) (setq ng1 T));;;;判断n_code是1则给ng1赋值T
      (if (= n_code 2) (setq ng2 T));;;;判断n_code是2则给ng2赋值T
      (if (= n_code 3) (setq ng3 T));;;;判断n_code是3则给ng3赋值T
;;;;;;这里只有一个可能被赋值T,其余的仍然保持为nil,也许全部都仍然是nil
      (setq n_gcode (vl-string-position (ascii "G") c_dmfx))
;;;;;;;;;;;;;;继续从剩下的字符串里面寻找[G]的位置进行分离判断,
;;;;;;;;;;;;;比如例子中的剩下[90G1X300]则还要循环,最终记录为〔ng1=T〕
    );;;;;;;;;;;;;;;;;;;;;;;;提取G代码类型,分离0,1,2,3
;;;;;;;;;;;;;;;;直到发现不了[G],才结束此段的G代码判断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;寻找[XYZIJR]等字符的位置
    (setq cxx (vl-string-position (ascii "X") str1))
    (setq cxy (vl-string-position (ascii "Y") str1))
    (setq cxz (vl-string-position (ascii "Z") str1))
    (setq cxi (vl-string-position (ascii "I") str1))
    (setq cxj (vl-string-position (ascii "J") str1))
    (setq cxr (vl-string-position (ascii "R") str1))
;;;;;;;;;;;;;;;对应cxx,cxy,cxz,cxi,cxjx,cxr;;;;;;;;;;找到的就赋值找不到的就是空值
    (setq n_codepp (not (or ng0 ng1 ng2 ng3)))
;;;;;;;;;如果没有发现G 0123中的切削代码,则给n_codepp赋值T
    (setq n_codexyz (or cxx cxy cxz cxi cxj cxr))
;;;;;;;;;判断该行中是否含有XYZIJR字符,只要有就是T,没有则不合法
    (setq b_chk T);;预定义参数等于T是为了保证执行第一次循环后的可控制性
    (while (and n_codepp n_codexyz b_chk);;;;;;;;;;;;;无G0123代码的处理段||||||
;;;;;;;;;判断最近一次的G命令代码,跳转相应的处理段
      (IF (= lstcmd "G0") (fw_g0 str1));;;
      (IF (= lstcmd "G1") (fw_g1 str1));;;
      (IF (= lstcmd "G2") (fw_g2 str1));;;
      (IF (= lstcmd "G3") (fw_g3 str1));;;
      (setq b_chk nil);;;;;置为nil,表示不再循环此段
     );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;无G0123代码的处理段||||||

    (while (not n_codepp);;;;;;;发现G0123字符
      (IF ng0 (fw_g0 str1))
      (IF ng1 (fw_g1 str1))
      (IF ng2 (fw_g2 str1))
      (IF ng3 (fw_g3 str1))
      (setq n_codepp 18);;;;;n_codepp置为一个数字表示即不为T也不为空,则不再循环此段
    );;;;;;;;;;;;;;;;;;;;;;;;;;;发现G0123字符
    (prompt "\n Current G_CODE: << ")
    (prompt currentb);;;;;;;;;;;显示本段数据信息
    (prompt ">> Finished....")
    (if (= cmd1 "G") (getstring "请按空格键继续....\n") )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;若前面选择了G项,则暂停处理等待用户按键干预

    (setq cm1 "/");;;;;;;把cm1置为[/]表示不再循环此段中的非注释行处理
  );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;非注释行件>>>结束>>>>>>>

);;;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FW_CK>>>结束<<<<<<<<<<<<<<<<<<< 数控中国温馨提示:本站不支持“迅雷”等下载软件下载附件,下载本站资源需要流量,点击这里用学习卷兑换流量
收藏到: 回复 引用

报告 TOP

delupy
  • 发短消息
  • 加为好友

delupy 当前离线

UID
93127 
帖子
22 
精华
积分
阅读权限
20 
来自
江苏 
在线时间
114 小时 
注册时间
2008-5-13 
最后登录
2009-1-12 

数控人(正式会员)

4# 发表于 2008-8-24 21:38 | 只看该作者

模拟程序的解说2

;;;;;;;;;;;;;;;;;;;;;;;<><><><><><><><><><><>><><><><><><><><><><><><><>
;;;;;;;;;;;;;;;;;;;;;FW_G0开始<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
(DEFUN FW_G0 (BK)
;;;;;;;;包含G00代码的作图处理
  (setq cx1 (vl-string-position (ascii "X") BK))
  (setq cy1 (vl-string-position (ascii "Y") BK))
  (setq cz1 (vl-string-position (ascii "Z") BK))
;;;;;;;;;;;;;;;;;寻找XYZ的位置
  (setq gxz09 "a")
;;;;;
;;;;;;;gxz是指模拟车床xz坐标的转化用,这里不起作用
;;;;;;;现在讲得是加工中心xyz

  (if (= cx1 nil) (setq gx (car ptbf)) )
;;;;;;;ptbf是当前坐标的表
;;;;;;;若该段中找不到X,则提取当前的X坐标数值到gx
;;;;;;;(car 表)返回表中的第一个元素,即获取X坐标值
  (if (= cx1 nil) (setq gxz09 "bx"));;;;不起作用
  (while (/= cx1 nil);;;;;;;;;;;;;;;;;;;;;;;;分离X后面的数值
    (setq cx2 (substr BK (+ cx1 2)))
    (setq gx (atof cx2));;;;;;;;;;;;;;;
    (setq cx1 nil);;;;;;;;;;;;;;;;;;;;置空则准备结束此段循环
  );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;分离X后面的数值
  (if (= cy1 nil) (setq gy (cadr ptbf)))
;;;;;;;ptbf是当前坐标的表
;;;;;;;若该段中找不到Y,则提取当前的Y坐标数值到gy
;;;;;;;(cadr 表)返回表中的第2个元素,即获取Y坐标值
  (while (/= cy1 nil);;;;;;;;;;;;;;;;;;;;;;;;分离Y后面的数值
    (setq cy2 (substr BK (+ cy1 2)))
    (setq gy (atof cy2))
    (setq cy1 nil)
  );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;分离Y后面的数值
  (if (= cz1 nil) (setq gz (caddr ptbf)))
;;;;;;ptbf是当前坐标的表
;;;;;;若该段中找不到Z,则提取当前的Z坐标数值到gz
;;;;;;(caddr 表)返回表中的第3个元素,即获取Z坐标值
  (if (= cz1 nil) (setq gxz09 "bz"));;;;;;;;不起作用
  (while (/= cz1 nil);;;;;;;;;;;;;;;;;;;;分离Z后面的数值>>>>>>
    (setq cz2 (substr BK (+ cz1 2)))
    (setq gz (atof cz2))
    (setq cz1 nil)
  )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;分离Z后面的数值>>>>>>
  (setq gxzx gz);;;;;;;;;;;;;不起作用
  (setq gxzy (/ gx -2));;;;;;不起作用
  (if (= gxz09 "bx") (setq gxzy (cadr ptbf)));;;;;;;;;不起作用
  (if (= gxz09 "bz") (setq gxzx (car ptbf)));;;;;;;;;;不起作用
  (if (= cmd_type "xz") (setq gx gxzx));;;;;;;;;;;;;;;不起作用
  (if (= cmd_type "xz") (setq gy gxzy));;;;;;;;;;;;;;;不起作用
  (if (= cmd_type "xz") (setq gz 0));;;;;;;;;;;;;;;;;;不起作用
  (setq pt1 (list gx gy gz))
;;;;;;;;;;把目标点数值建成表形成坐标值
;;;;;;;;;;复制到变量pt1
  (command "color" "r");;;;;;;;;;;把当前层的颜色改为红色
  (command "line" ptbf pt1 "");;;;执行画直线命令,两端点分别为pt1与ptbf
  (command "color" "byl");;;;;;;;;把当前层的颜色改回原来的随层颜色
  (setq ptbf pt1);;;;;;;;;;;;;;;;;把保存当前点坐标的变量用目标点坐标置换
  (setq lstcmd "G0");;;;;;;;;;;;;;把保存最近一次的G命令字符的变量赋值为[G0]
)
;;;;;;;;;;;;;;;;FW_G0结束<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;;;;;;;;;;;;;;;;;;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
;;;;;;;;;;;;;;;;;;;;;;;<><><><><><><><><><><>><><><><><><><><><><><><><>
;;;;;;;;;;;;;;;;;;;;;FW_G1开始<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
(DEFUN FW_G1 (BK)
;;;;;;;;包含G01代码的作图处理
;;;;;;;;;;;;;;;;;;除了后面作图时的颜色层以及记录lstcmd为[G1]外,其余没有改变,与00的处理命令完全相同,
  (setq cx1 (vl-string-position (ascii "X") BK))
  (setq cy1 (vl-string-position (ascii "Y") BK))
  (setq cz1 (vl-string-position (ascii "Z") BK))
;;;;;;;;;;;;;;;;;寻找XYZ的位置
  (setq gxz09 "a");;;;;gxz是指模拟xz坐标的转化用,这里不起作用
  (if (= cx1 nil) (setq gx (car ptbf)))
;;;;;;;ptbf是当前坐标的表
;;;;;;;若该段中找不到X,则提取当前的X坐标数值到gx
;;;;;;;(car 表)返回表中的第一个元素,即获取X坐标值
  (if (= cx1 nil) (setq gxz09 "bx"));;;;不起作用
  (while (/= cx1 nil);;;;;;;;;;;;;;;;;;;;;;;;分离X后面的数值
    (setq cx2 (substr BK (+ cx1 2)))
    (setq gx (atof cx2))
    (setq cx1 nil);;;;;;;;;;;;;;;;;;;;置空则准备结束此段循环
  );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;分离X后面的数值
  (if (= cy1 nil) (setq gy (cadr ptbf)))
;;;;;;;ptbf是当前坐标的表
;;;;;;;若该段中找不到Y,则提取当前的Y坐标数值到gy
;;;;;;;(cadr 表)返回表中的第2个元素,即获取Y坐标值
  (while (/= cy1 nil);;;;;;;;;;;;;;;;;;;;;;分离Y后面的数值
    (setq cy2 (substr BK (+ cy1 2)))
    (setq gy (atof cy2))
    (setq cy1 nil)
  );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;分离Y后面的数值
  (if (= cz1 nil) (setq gz (caddr ptbf)))
;;;;;;ptbf是当前坐标的表
;;;;;;若该段中找不到Z,则提取当前的Z坐标数值到gz
;;;;;;(caddr 表)返回表中的第3个元素,即获取Z坐标值

  (if (= cz1 nil) (setq gxz09 "bz"));;;;;;;;;不起作用
  (while (/= cz1 nil);;;;;;;;;;;;;;;;;;;;;;;分离Z后面的数值
    (setq cz2 (substr BK (+ cz1 2)))
    (setq gz (atof cz2))
    (setq cz1 nil)
  );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;分离Z后面的数值
  (setq gxzx gz);;;;;;;;;;;;;不起作用
  (setq gxzy (/ gx -2));;;;;;不起作用
  (if (= gxz09 "bx") (setq gxzy (cadr ptbf)));;;;;;;;;不起作用
  (if (= gxz09 "bz") (setq gxzx (car ptbf)));;;;;;;;;;不起作用
  (if (= cmd_type "xz") (setq gx gxzx));;;;;;;;;;不起作用
  (if (= cmd_type "xz") (setq gy gxzy));;;;;;;;;;不起作用
  (if (= cmd_type "xz") (setq gz 0));;;;;;;;;;;;;不起作用
  (setq pt1 (list gx gy gz))
;;;;;;;;;;把目标点数值建成表,形成坐标值
;;;;;;;;;;复制到变量pt1
  (command "line" ptbf pt1 "");;;;;;;;;;;执行画直线命令,两端点分别为pt1与ptbf
  (setq ptbf pt1);;;;;;;;;;;;;;;;;;;;;;;;把保存当前点坐标的变量用目标点坐标置换
  (setq lstcmd "G1");;;;;;;;;;;;;;;;;;;;;把保存最近一次的G命令字符的变量赋值为[G1]
)
;;;;;;;;;;;;;;;;FW_G1结束<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;;;;;;;;;;;;;;;;;;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 数控中国温馨提示:本站不支持“迅雷”等下载软件下载附件,下载本站资源需要流量,点击这里用学习卷兑换流量
收藏到: 回复 引用

报告 TOP

delupy
  • 发短消息
  • 加为好友

delupy 当前离线

UID
93127 
帖子
22 
精华
积分
阅读权限
20 
来自
江苏 
在线时间
114 小时 
注册时间
2008-5-13 
最后登录
2009-1-12 

数控人(正式会员)

5# 发表于 2008-8-24 21:39 | 只看该作者

模拟程序的解说3

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(DEFUN FW_G2 (BK);;;;;;;;[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;FW_G2开始|||||||||||||||||||||||||||||
;;;;;;;;;;G02顺圆处理
  (if (= ptbf nil) (alert "起始点没有定义!"));;;;;;;没有起点不能画圆,终止
  (if (= ptbf nil) (close f))
  (if (= ptbf nil) exit)  (setq ci1 (vl-string-position (ascii "I") BK))
  (setq cj1 (vl-string-position (ascii "J") BK))
  (setq cr1 (vl-string-position (ascii "R") BK))
;;;;;;;;;;;;;;;;;;;;;;;;;查找IJR的位置
  (setq b_chk T);;;用于控制跳出循环
  (while (and (not cr1) b_chk);;;;;cr1为空,即找不到R,表示有IJ圆心;;;;;;;;;圆心定义+++++
    (setq ptbfx (car ptbf));;;;;获取起点的X值坐标
    (setq ptbfy (cadr ptbf));;;;获取起点的Y值坐标
    (setq ci2 (rtos ptbfx));;;;;数字转字符
    (setq cj2 (rtos ptbfy));;;;;数字转字符
    (if (/= ci1 nil) (setq ci2 (substr BK (+ ci1 2))));;;;;;;;;;;;;;获取I后面的数值
    (if (/= cj1 nil) (setq cj2 (substr BK (+ cj1 2))));;;;;;;;;;;;;;获取J后面的数值
;;;;这里前面先给cj2赋值了,如果没有对应的I或J数据,则不做修改而默认前面的赋值
    (setq gi (atof ci2));;;转数字
    (setq gj (atof cj2));;;转数字
    (setq cx1 (vl-string-position (ascii "X") BK));;;;;;;;;;;查找X的位置
    (setq cy1 (vl-string-position (ascii "Y") BK));;;;;;;;;;;查找Y的位置

    (setq cx2 (rtos ptbfx));;;数字转字符
    (setq cy2 (rtos ptbfy));;;数字转字符
    (if (/= cx1 nil)  (setq cx2 (substr BK (+ cx1 2))));;;;;;;;;;;;;;获取X后面的数值
    (if (/= cy1 nil)  (setq cy2 (substr BK (+ cy1 2))));;;;;;;;;;;;;;获取Y后面的数值
    (setq gx (atof cx2));;;X坐标字符转数字
    (setq gy (atof cy2));;;Y坐标字符转数字
    (setq gi (+ gi ptbfx));;;;;;;;;;;;;;;;;;;起点位置X坐标加上圆心偏移量I值,就等于圆心的绝对X坐标
    (setq gj (+ gj ptbfy));;;;;;;;;;;;;;;;;;;起点位置Y坐标加上圆心偏移量J值,就等于圆心的绝对Y坐标
    (setq pt1 (list gx gy (caddr ptbf)));;;;;;;;把目标点数值建成表,形成目标坐标值
    (setq ptij (list gi gj (caddr ptbf)));;;;;;;把圆心点数值建成表,形成圆心坐标值
    (command "arc" "CE" ptij pt1 ptbf);;;;;;;利用CAD的ARC命令绘圆弧
    (setq ptbf pt1);;;;;;;;;;;;;;;;;;;;;把保存当前点坐标的变量用目标点坐标置换
    (setq b_chk nil);;;;;置空b_chk以跳出循环
  );;;;;;;;;;;;;;;;;;;;;;;;;;圆心定义结束+++++++++++++++++++++++++++++

  (setq b_chk T)
  (while (and cr1 b_chk);;;;;;;;;;;;在段中找到了R;;;;;;;;;;;;;;;;;;;半径定义《《《《《《《《《
    (setq cr2 (substr BK (+ cr1 2)));;;;;;;;;;;;;获取R后面的数值      
    (setq gr (atof cr2));;;;;;;;;;;;;;;;;;;;;;;;;字符转数字
    (setq cx1 (vl-string-position (ascii "X") BK));;;;;;;查找X的位置
    (setq cy1 (vl-string-position (ascii "Y") BK));;;;;;;查找Y的位置
    (if (= cmd_type "xz") (setq cz1 (vl-string-position (ascii "Z") BK)));;;;;;不起作用
    (setq ptbfx (car ptbf));;;;获取起点的X值坐标
    (setq ptbfy (cadr ptbf));;;获取起点的Y值坐标
    (setq cx2 (rtos ptbfx));;;数字转字符
    (setq cy2 (rtos ptbfy));;;数字转字符
    (if (/= cx1 nil) (setq cx2 (substr BK (+ cx1 2))));;;;;;;;;;;;;获取X后面的数值
    (if (/= cy1 nil) (setq cy2 (substr BK (+ cy1 2))));;;;;;;;;;;;;获取Y后面的数值
    (if (= cmd_type "xz") (setq cz2 (substr BK (+ cz1 2))));;;;;;;;不起作用
    (setq gx (atof cx2));;;;;;;;;;;;;;X坐标字符转数字
    (setq gy (atof cy2));;;;;;;;;;;;;;Y坐标字符转数字
    (if (= cmd_type "xz") (setq gz (atof cz2)));;;;;;不起作用
    (setq gxzx gz);;;;;;;;;;;;;不起作用
    (setq gxzy (/ gx -2));;;;;;不起作用
    (if (= cmd_type "xz") (setq gx gxzx));;;;;;不起作用
    (if (= cmd_type "xz") (setq gy gxzy));;;;;;不起作用
    (if (= cmd_type "xz") (setq gz 0) );;;;;;;;;不起作用
    (setq pt1 (list gx gy (caddr ptbf)));;;;;;;;;把目标点数值建成表,形成坐标值
    (if (/= cmd_type "xz") (command "arc" pt1 "en" ptbf "R" gr));;利用CAD的ARC命令绘圆弧
    (if (= cmd_type "xz")  (command "arc" ptbf "en" pt1 "R" gr));;不起作用
    (setq ptbf pt1);;;;;;;;;;;;;;;;;;;;;;把保存当前点坐标的变量用目标点坐标置换
    (setq b_chk nil);;;;;置空b_chk以跳出循环
  );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;半径定义《《《《《《《《《《
  (setq lstcmd "G2");;;;;;;;;;;;;;;;;;;;;;;把保存最近一次的G命令字符的变量赋值为[G2]
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;FW_G2结束||||||||||||||||||||
;;;;;;;;;;;;;;[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][

;;;;;;;;;;;;;;;;---------------------------------------------------------------------
;;;;;;;;;;;;;;;;pppppppppppppppppppppppppppppppppppppppppppp FW_G3开始 pppppppppppppp
(DEFUN FW_G3 (BK)
;;;;;;;;;;;;;;;;;;G03逆圆处理,除了最后一步绘制圆弧的方向不同外计算方法与G02顺圆相同
   (setq ci1 (vl-string-position (ascii "I") BK))
   (setq cj1 (vl-string-position (ascii "J") BK))
   (setq cr1 (vl-string-position (ascii "R") BK))
   (setq b_chk T)
   (while (and (not cr1) b_chk);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;圆心定义+++++++++++++
     (setq ptbfx (car ptbf))
     (setq ptbfy (cadr ptbf))
     (setq ci2 (rtos ptbfx))
     (setq cj2 (rtos ptbfy))
     (if (/= ci1 nil) (setq ci2 (substr BK (+ ci1 2))))
     (if (/= cj1 nil) (setq cj2 (substr BK (+ cj1 2))))
     (setq gi (atof ci2))
     (setq gj (atof cj2))
     (setq cx1 (vl-string-position (ascii "X") BK))
     (setq cy1 (vl-string-position (ascii "Y") BK))
     (setq cx2 (rtos ptbfx))
     (setq cy2 (rtos ptbfy))
     (if (/= cx1 nil) (setq cx2 (substr BK (+ cx1 2))))
     (if (/= cy1 nil) (setq cy2 (substr BK (+ cy1 2))))
     (setq gx (atof cx2))
     (setq gy (atof cy2))
     (setq gi (+ gi ptbfx))
     (setq gj (+ gj ptbfy))
     (setq pt1 (list gx gy (caddr ptbf)))
     (setq ptij (list gi gj (caddr ptbf)))
     (command "arc" "CE" ptij ptbf pt1)
     (setq ptbf pt1)
     (setq b_chk nil)
   );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;圆心定义结束++++++++++++++++++

   (setq b_chk T)
   (while (and cr1 b_chk);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;半径定义//////////////////////
     (setq cr2 (substr BK (+ cr1 2)))
     (setq gr (atof cr2))
     (setq cx1 (vl-string-position (ascii "X") BK))
     (setq cy1 (vl-string-position (ascii "Y") BK))
     (if (= cmd_type "xz") (setq cz1 (vl-string-position (ascii "Z") BK)));;;不起作用
     (setq ptbfx (car ptbf))
     (setq ptbfy (cadr ptbf))
     (setq cx2 (rtos ptbfx))
     (setq cy2 (rtos ptbfy))
     (if (/= cx1 nil) (setq cx2 (substr BK (+ cx1 2))))
     (if (/= cy1 nil) (setq cy2 (substr BK (+ cy1 2))))
     (if (= cmd_type "xz") (setq cz2 (substr BK (+ cz1 2))));;;;;;不起作用
     (setq gx (atof cx2))
     (setq gy (atof cy2))
     (if (= cmd_type "xz")  (setq gz (atof cz2)))
     (setq gxzx gz);;;;;;;;;;;;;不起作用
     (setq gxzy (/ gx -2));;;;;;不起作用
     (if (= cmd_type "xz") (setq gx gxzx));;;;;;不起作用
     (if (= cmd_type "xz") (setq gy gxzy));;;;;;不起作用
     (if (= cmd_type "xz") (setq gz 0));;;;;;;;;不起作用
     (setq pt1 (list gx gy (caddr ptbf)))
     (if (= cmd_type "xz") (command "arc" pt1 "en" ptbf "R" gr))
     (if (/= cmd_type "xz") (command "arc" ptbf "en" pt1 "R" gr));;;;;;不起作用
     (setq ptbf pt1);;;;;;;;;;;;;;;;把保存当前点坐标的变量用目标点坐标置换
   (setq b_chk nil)
);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;半径定义结束////////////////////
  (setq lstcmd "G3");;;;;;;;;;;;;;把保存最近一次的G命令字符的变量赋值为[G3]
);;;;;;;;;;;;;;;;pppppppppppppppppppppppppppppppppppppppppppp FW_G3结束 ppppppppppppppppppppppppppppppppp
;;;;;;;;;;;;;;;;------------------------------------------------------------------------------------------ 数控中国温馨提示:本站不支持“迅雷”等下载软件下载附件,下载本站资源需要流量,点击这里用学习卷兑换流量
收藏到: 回复 引用

报告 TOP

delupy
  • 发短消息
  • 加为好友

delupy 当前离线

UID
93127 
帖子
22 
精华
积分
阅读权限
20 
来自
江苏 
在线时间
114 小时 
注册时间
2008-5-13 
最后登录
2009-1-12 

数控人(正式会员)

6# 发表于 2008-8-24 22:14 | 只看该作者 //现在给出下面一段NC程序,保存字符到文件(如NC_exp1.txt)后,使用上面的FWV命令调用该TXT文件演示
//演示完毕后,使用系统的_3dorbit命令,即三维动态观察器来转化多种视角查看轨迹
//////////////////////////////
G00X-59.95 Y-16.5
Z5.
Z-4.
G01 Z-12. F80
G01 X-59.947 Y-16.6 F150
G01 X-54.1 Y-16.6
X-54.1 Y-16.4
X-59.95 Y-16.4
G00 Z20.
G00 X-62.05 Y-6.9
Z-4.
G01 Z-12. F80
G01 X-62.05 Y-9. F150
X-43.85 Y-9.
X-43.85 Y-6.9
X-62.05 Y-6.9
G00 Z20.
G00 X-62.05 Y1.1
Z-4.
G01 Z-12. F80
G01 X-62.05 Y-1. F150
X-43.85 Y-1.
X-43.85 Y1.1
X-62.05 Y1.1
G00 Z20.
G00 X-62.1 Y9.05
Z-4.
G01 Z-12. F80
G01 X-62.1 Y6.95 F150
X-43.9 Y6.95
X-43.9 Y9.05
X-62.1 Y9.05
G00 Z20.
G00 X-59.95 Y16.5
Z-4.
G01 Z-12. F80
G01 X-59.95 Y16.4 F150
X-54.1 Y16.4
X-54.1 Y16.6
X-59.947 Y16.6
G00 Z20.
G00 X-42.9595 Y20.4894
Z-4.
G01 Z-12. F80
G01 X-42.96 Y21.795 F150
G03 X-44.265 Y23.1  R1.305
G01 X-49.772 Y23.1
X-26.123 Y3.01
G02 X-26.123 Y-3.01  R3.95
G01 X-49.772 Y-23.1
X-36.9 Y-23.1
X-36.9 Y-21.9
X-37.396 Y-21.9
G02 X-39.306 Y-16.702  R2.95
G01 X-21.9 Y-1.916
X-21.9 Y1.916
X-39.306 Y16.702
G02 X-37.396 Y21.9  R2.95
G01 X-36.9 Y21.9
X-36.9 Y23.1
X-44.265 Y23.1
G00 Z20.
G00 X-10.7933 Y17.1376
Z-4.
G01 Z-12. F80
G01 X-9.912 Y17.786 F150
G03 X-10.354 Y19.591  R1.445
G01 X-20.6 Y27.1
X-28.1 Y27.1
X-28.1 Y25.95
X-24.553 Y25.95
G02 X-22.218 Y25.186  R3.95
G01 X-14.715 Y19.687
G02 X-13.1 Y16.501  R3.95
G01 X-13.1 Y14.9
X-6.95 Y14.9
X-6.95 Y17.096
X-10.354 Y19.591
G00 Z20.
G00 X10.8505 Y17.0621
Z-4.
G01 Z-12. F80
G01 X9.912 Y17.786 F150
G03 X8.058 Y17.908  R1.445
G01 X6.95 Y17.096
X6.95 Y14.9
X13.1 Y14.9
X13.1 Y16.501
G02 X14.715 Y19.687  R3.95
G01 X22.218 Y25.186
G02 X24.553 Y25.95  R3.95
G01 X28.1 Y25.95
X28.1 Y27.079
X20.6 Y27.1
X8.058 Y17.908
G00 Z20.
G00 X42.9595 Y20.4894
Z-4.
G01 Z-12. F80
G01 X42.96 Y21.795 F150
G03 X41.654 Y23.1  R1.305
G01 X36.9 Y23.1
X36.9 Y21.9
X37.396 Y21.9
G02 X39.306 Y16.702  R2.95
G01 X21.9 Y1.916
X21.9 Y-1.916
X39.306 Y-16.702
G02 X37.396 Y-21.9  R2.95
G01 X36.9 Y-21.9
X36.9 Y-23.1
X49.772 Y-23.1
X26.123 Y-3.01
G02 X26.123 Y3.01  R3.95
G01 X49.772 Y23.1
X41.654 Y23.1
G00 Z20.
G00 X54.1 Y16.5
Z-4.
G01 Z-12. F80
G01 X54.1 Y16.4 F150
X59.95 Y16.4
X59.947 Y16.6
X54.1 Y16.6
G00 Z20.
G00 X43.9 Y9.05
Z-4.
G01 Z-12. F80
G01 X43.9 Y6.95 F150
X62.1 Y6.95
X62.1 Y9.05
X43.9 Y9.05
G00 Z20.
G00 X43.85 Y1.1
Z-4.
G01 Z-12. F80
G01 X43.85 Y-1. F150
X62.05 Y-1.
X62.05 Y1.1
X43.85 Y1.1
G00 Z20.
G00 X43.85 Y-6.9
Z-4.
G01 Z-12. F80
G01 X43.85 Y-9. F150
X62.05 Y-9.
X62.05 Y-6.9
X43.85 Y-6.9
G00 Z20.
G00 X54.1 Y-16.5
Z-4.
G01 Z-12. F80
G01 X54.1 Y-16.6 F150
X59.947 Y-16.6
X59.947 Y-16.4
X54.1 Y-16.4
G00 Z20.
G00 X10.7933 Y-17.1376
Z-4.
G01 Z-12. F80
G01 X9.912 Y-17.786 F150
G03 X10.354 Y-19.591  R1.445
G01 X20.6 Y-27.1
X28.1 Y-27.1
X28.1 Y-25.95
X24.553 Y-25.95
G02 X22.218 Y-25.186  R3.95
G01 X14.715 Y-19.687
G02 X13.1 Y-16.501  R3.95
G01 X13.1 Y-14.9
X6.95 Y-14.9
X6.95 Y-17.096
X10.354 Y-19.591
G00 Z20.
G00 X-10.7933 Y-17.1376
Z-4.
G01 Z-12. F80
G01 X-9.912 Y-17.786 F150
G03 X-8.058 Y-17.908  R1.445
G01 X-6.95 Y-17.096
X-6.95 Y-14.9
X-13.1 Y-14.9
X-13.1 Y-16.501
G02 X-14.715 Y-19.687  R3.95
G01 X-22.218 Y-25.186
G02 X-24.553 Y-25.95  R3.95
G01 X-28.1 Y-25.95
X-28.1 Y-27.079
X-20.6 Y-27.1
X-8.058 Y-17.908
G01 X-8.2 Y-17.595
G01 Z0.
G00 Z150.
///////////////////////////////////