利用AutoLISP 和DCL实现动态插入Word文档格式.docx
《利用AutoLISP 和DCL实现动态插入Word文档格式.docx》由会员分享,可在线阅读,更多相关《利用AutoLISP 和DCL实现动态插入Word文档格式.docx(5页珍藏版)》请在冰豆网上搜索。
笔者所在单位采用AutoCAD作为绘图平台进行工程设计和开发,在工程绘图过程中,经常会用到明细表的生成,如果明细表很多则需要一条一条地画出,这样将大大降低绘图效率,为了能实现一次可将明细表画出并准确插入到标题栏上,笔者在工作中尝试用AutoLISP语言和DCL对话框实现上了上述功能,从而大大提高了绘图效率。
命令运行时,系统将出现提示对话框。
用户只要输入明细表的起、止序号和比例,确认后即可将所需的标准明细表自动画出,并插入到标题栏的准确位置。
画明细表的LISP程序如下:
;
画明细表外边框及各横线:
(defundrawl()
(setvar″cmdecho″0)
(setvar″osmode″0)
(command″layer″″m″″lll″″c″red″″)
(setqinp(getpoint″\n请输入明细表插入点(右下角):
″))
(setqnum1(atoiaa))
(setqnum2(atoibb))
(while(>
num1num2)
(alert″输入错误(结束序号必须大于起始序号),\n要重新输入起始序号和结束序号,\n请按回车键重新调用对话框。
″)
(exit))
(setqnum(+1(-num2num1)))
(setqx(atofab))
(if(not*x)(setq*x1))
(setqptx2(carinp))
(setqptx1(-(carinp)180.0))
(setqn0)
(setqp1(polarinppi180))
(setqp2(polarp1(/pi2)(+10.0(*8num))))
(setqp3(polarp20180))
(setqpty0(+10.0(cadrinp)))
(setqp4(listptx1pty0))
(setqp5(listptx2pty0))
(setqscal(/(getvar″dimtxt″)5))
(command″pline″inp″w″(*0.7scal)(*0.7scal)p1p2p3″c″″″line″p4p5″)
numn)
(setqn(+1n))
(setqpy(*8n))
(setqpty(+pypty0))
(setqpt1(listptx1pty))
(setqpt2(listptx2pty))
(command″line″pt1pt2″)))
画明细表内竖线:
(defuncon()
(setqptx1(+8.0(-(carinp)180)))
(setqptx2(+50.0(-(carinp)180)))
(setqptx3(+90.0(-(carinp)180)))
(setqptx4(+98.0(-(carinp)180)))
(setqptx5(+140.0(-(carinp)180)))
(setqptx6(+160.0(-(carinp)180)))
(setqptx7(+150.0(-(carinp)180)))
(setqpty1(cadrinp))
(setqpty2(+pty0(*8num)))
(setqptl1(listptx1pty1))
(setqptl2(listptx1pty2))
(setqptl3(listptx2pty1))
(setqptl4(listptx2pty2))
(setqptl5(listptx3pty1))
(setqptl6(listptx3pty2))
(setqptl7(listptx4pty1))
(setqptl8(listptx4pty2))
(setqptl9(listptx5pty1))
(setqptl10(listptx5pty2))
(setqptl11(listptx6pty1))
(setqptl12(listptx6pty2))
(setqptl13(listptx7pty0))
(setqptl14(listptx7pty2))
(command″line″ptl1ptl2″"
″line″ptl3ptl4″"
″line″ptl5ptl6″"
″line″ptl7ptl8″"
″line″ptl9ptl10″"
″line″ptl11ptl12″"
″line″ptl13ptl14″"
))
添加明细表表头及书写序号:
(defunte()v(getvar″textsize″)
(setqwordnum2)
(setqnunum1)
(setqpty01(+2.0pty0))
(command″insert″″/autocadr14/kaifa/mxb/btlt″inp11″0″);
明细表表头利用插块方式插入。
(repeatnum
(setqptt(list(-ptx14)(+pty01(*8(-num2nu)))))
(command″text″″j″″c″ptt3.5″word″)
(setqword(1-word))
(setqnu(1+nu)))
(setqt(ssget″x″′((8.″lll″))))
(if(notx)(setqx*x)(setq*xx))
(command″scale″t″inpx″))
;
用于取得由对话框输入的关键值
(defunma()
(setqaa(get_tile″n1″))
(setqbb(get_tile″n2″))
(setqab(get_tile″qa″))
(done_dialog))
主程序
(defunc:
mxb()
(setqdcl_id(load_dialog″mxb.dcl″))
(if(not(new_dialog″xb″dcl_id))
(exit))
(action_tile″accept″″(ma)″)
(action_tile″cancel″″(done_dialog)″)
(start_dialog)
(drawl)(con)(te)(redraw)
(setvar″osmode″32)
(command″layer″″s″″thick-solid″″)
(unload_dialogdcl_id))
DCL对话框程序(mxb.dcl):
xb:
dialog{label=/*MSG*/″插入明细表″;
key=″sd″;
:
boxed_column{:
row{
edit_box{key=″n1″;
label=″输入明细表开始序号:
″;
}
}:
row{:
edit_box{key=″n2″;
label=″输入明细表结束序号:
}}
row{:
edit_box{key=″qa″;
label=″请输入比例:
ok_cancel;
}}