数控车床 >> 行业动态 >> 基于组件的三维CAD系统开发的关键技术研究
基于组件的三维CAD系统开发的关键技术研究
1 概述
美国Autodesk公司开发的AutoCAD系统自1982年推出以来,以其使用方便、功能强大和系统开放性一直独领风骚。成为各工程领域首选的CAD系统。 水利水电工程领域利用AutoCAD平台进行二次开发也取得了一系列成果,如90年代以来陆续开发的水电站地面厂房CAD系统、重力坝CAD系统、隧洞CAD系统、水机油汽水CAD系统、地质柱状图CAD等均取得了较好的应用效果。但水电工程设计的复杂性决定了任何现成的CAD软件都有其局限性,设计过程中许多问题还只能用原始的方法解决。本文通过几个实例对AutoCAD二次开发常用的Li 语言在水电工程设计中的应用进行了初步探讨,希望能够起到抛砖引玉的作用。 VisualLi 语言是AutoCADR14版本以后提供的全新的开发环境,是嵌于AutoCAD内部,将Li 语言与AutoCAD相结合的产物,是一种智能型语言。利用AutoLi 可以灵活方便地增加AutoCAD新命令,几乎无限地扩展AutoCAD新功能, 2 应用实例 2 .1 坐标画线 利用已知坐标点画线是设计工作中经常遇到的问题,如河道、堤防等实测断面、水位流量关系曲线、堰面曲线等数据的处理,均可归结为坐标画线问题。对于堰面曲线等有函数方程的曲线可以利用EXCEL按照期望的步长自动生成一系列坐标点。对于测量常用的起点距-高程形式的数据,也可以利用EXCEL转化成坐标点形式。 (1)利用脚本文件(.SCR) 利用任何文本编辑器如Note、Uedit、Word、Excel等建立纯文本文件EX1.SCR,注意文本文件后缀必须为.SCR,坐标之间用半角逗号分开,文件中不允许出现空格,文件最后一行必须为空回车。文件建立时,可以直接把 EXCEL或其他文件中的坐标表利用拷贝、粘贴功能加入脚本文件中。 Pline 345.66,238.65 213.45,124.56 128.44,235.66 文件保存后,执行AutoCAD中“工具”下的“运行脚本”,在显示的窗口中查找并选中EX1.SCR,屏幕上会立即显示所绘线条。 (2)利用L 程序 建立坐标表文件EX2.DAT,后缀任意,可以依次输入多段曲线,中间用曲线名称分开,程序自动绘制多条曲线并可标注坐标表。“曲线1” 213.45,124.56 128.44,235.66 345.66,231.78 “曲线2” 433.34,567.23 434.12,464.12
利用AutoCAD中“工具”菜单下的“VisulLi 编辑器”建立DRLINE.L 文件如下
(defun C:drline() (if fn (setq fn (getfiled "坐标点文件名" fn "" 2)) (setq fn (getfiled "坐标点文件名" "" "" 2)) ) (setq f (open fn "r")) (setq p0 (getpoint "/n画线起点:")) (setq bz 0 mm 1) (command "pline") (while (/= bz 1) (setq md (read-line f)) (if (/= md nil) (setq z (read md)) (setq bz 1) ) (setq dx (car z ) dy (cadr z )) (setq p1 (list (+ dx (car p0)) (+ dy (cadr p0))) ) (command p1) (setq mm (1+ mm)) ) (command "") (close f) )
文件存盘后,加载运行,相当于新增加了坐标画线命令DRLINE,按提示选中存放坐标表的文件即可实现自动绘制曲线。 2 .2 地形切剖面 水电工程设计中经常遇到在地形图上切剖面的问题,借助Visual Li 可以实现快速切剖面。 (1) 初始地形图处理 把带z坐标的地形平面图进行变换,变换后z坐标值成为层名,为加快切剖面运行速度,把“LWPOLYLINE”和” LINE”均转化为”LINE“线,程序如下
(defun c:pltol() ;LWPOLYLINE转化为LINE (setq n 0) (setq e ( get"X" (list (co 0 "LWPOLYLINE")))) (setq sh ( length e)) (if e (while (< n sh) (setq e1 ( ame e n)) (command "pedit" e1 "d" "") (setq x (entget e1)) (setq ngc (atof (setq la (fld 8 x)))) (command "explode" e1) (setq n (+ n 1)) ) ) ) (defun fld (num lst) (cdr (a oc num lst)) ) (defun c: ltol () ; LINE转化为LINE (setq n 0) (setq e ( get "X" (list (co 0 " LINE")))) (setq sh ( length e)) (if e (while (< n sh) (setq x (entget (setq e1 ( ame e n)))) (setq nla (itoa (fix (caddr (fld 10 x))))) (if (= (fld 0 x) " LINE") (progn (command "layer" "n" nla "c" "6" nla "s" nla "") (command"line") (setq nm (length x) dz (fld 73 x) dzs1 (fld 74 x)) (while (> nm 5) (if (= (car (nth nm x)) 10) (prog
