学习成果!!!!!
根据大神的建议拿工作中的实例进行研究学习,经过大神的指点结合自己的理解最终把这个视图给画出来了。在写这个程序的过程中有些困惑,首先1、图层在绘制过程中如何进行切换,我画的时候是根据课本上“(command-s "layer" "M" "02LH-加工-孔位" "c" 1 "" "")”一下再进行画。这样每次画图都需要写一段这个代码,实际编程中真正的图层切换也是这样的么?2、有些程序我感觉是重复的,我这个画左孔、左圆、左方框还有右侧的,程序格式都是参考楼梯梯步格式,这个是不是可以编写一个共用的子程序,调用一下就行了,我研究了下没研究明白,有大神能给优化下看看么。
3、这个程序不是很大100来行,但是由于是用循环画圆孔,导致的执行起来卡顿。这个能优化么?
4、目前也看了一下各位大神给得代码,还是看不懂,不光代码看不懂,程序结构也看不懂,特别一些子程序。
还在不断的学习中,这次不知道能坚持多长时间
;;鼠标点选P1P2P3然后就画图如下图所示的图形
;;C槽高度默认是150,可以输入更改尺寸。
;;圆中心线是水平竖直的,没有按照平行两个alf1、alf2写的不影响效果。
;;孔线、圆、矩形完全是参考画楼梯的例题写的(谢谢"liuhe"大神的建议)
;;尽量画的尺寸不要超过1米,超过1米了就会很慢。目前不知道如何优化。
(defun C:qq(/ p1 p2 p3 p4 p5 p6 P61 P62 P63 kx1 kx2 n1 n2 wk alf1 alf2 pp pn pn1 pn2 pnn pm pm1pm2 pmm h v old quxian p6j1 p6j2 p6j3 p6j4 p6jm)
;;;;;;;;;;;;;;;;;;;;;;;;;以下是计算点位;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setvar "CMDECHO" 0) ;不显示命令操作
(setq p1 (getpoint "\n输入沾灰面P1点:"))
(setq p2 (getpoint p1"\n输入沾灰面P2点:"))
(grdraw p1 p2 6) ;绘 (粉红色=6) 暂时线
(setq p3 (getpoint p2"\n输入沾灰面P3点:"))
(grdraw p2 p3 6) ;绘 (粉红色=6) 暂时线
(setq h (getdist"\n输入C槽水平高度:"))
(if (= h nil) (setq h 150)) ;设置默认值
(setq alf1 (angle p1 p2)) ;极角
(setq alf2 (angle p3 p2)) ;极角
(setq pm (polar p1 (+ alf1(* 1.5 pi))65))
(setq p6 (polar p1 (+ alf1(* 1.5 pi))h))
(setq pn (polar p3 (+ alf2(* 0.5 pi))65))
(setq p4 (polar p3 (+ alf2(* 0.5 pi))h))
(setq old(getvar 'osmode ))
(setvar 'osmode 0) ;关闭捕捉
(setq pp (inters pm (polar pm (angle p1 p2) 1) pn (polar pn (angle p2 p3) 1) nil)) ;交点坐标
(setq p5 (inters p6 (polar p6 (angle p1 p2) 1) p4 (polar p4 (angle p2 p3) 1) nil)) ;交点坐标
(setq n1 (1- (fix(/ (distance p6 p5) 50)))) ;计算左孔位线数量
(setq n2 (1- (fix(/ (distance p4 p5) 50)))) ;计算右孔位线数量
(setq pm1 (polar p1 (+ alf1(* 1.5 pi))40))
(setq pn1 (polar p3 (+ alf2(* 0.5 pi))40))
;;;;;;;;;;;;;;;;;;;;;;;;;以下是画轮廓;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(command-s "layer" "M" "02LH-加工-轮廓线" "c" 7 "" "")
(command-s "pline" p1 p2 p3 p4 P5p6 "c")
(command-S "pline" P2 P5 "")
(command-s "pline" pmPP pn"")
(command-s "pline" pmP6 p5 p4 pn"")
(setq quxian(entlast))
(vla-Offset (vlax-ename->vla-object quxian) -8)
(entdel quxian)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;画左孔位线;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq p66 p6)
(repeatn1
(setq p61 (polar p66alf1 50))
(setq p62 (polar p61(+ alf1(* 0.5 pi)) 20))
(setq p63 (polar p61(+ alf1(* 1.5 pi)) 10))
(command-s "layer" "M" "02LH-加工-孔位" "c" 1 "" "")
(command-s "pline" p62 p63 "")
(setq p66 p61)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;画左矩形孔;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq p6j p6)
(repeatn1
(setq p6jm (polar p6jalf1 50))
(setq p6j1 (polar p6jm(+ alf1 pi) 8.25))
(setq p6j2 (polar p6jm alf18.25))
(setq p6j3 (polar p6j2(+ alf1(* 0.5 pi)) 8))
(setq p6j4 (polar p6j1(+ alf1(* 0.5 pi)) 8))
(command-s "layer" "M" "02LH-加工-轮廓线" "c" 7 "" "")
(command-s "pline" p6j1 p6j2 p6j3 p6j4 "c")
(command "SOLID" p6j1 p6j2 p6j4 p6j3 "")
(setq p6j p6jm)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;画右矩形孔;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq p4j p4)
(repeatn2
(setq p4jm (polar p4jalf250))
(setq p4j1 (polar p4jm alf2 8.25))
(setq p4j2 (polar p4jm alf2-8.25))
(setq p4j3 (polar p4j2(+ alf2(* 0.5 pi)) -8))
(setq p4j4 (polar p4j1(+ alf2(* 0.5 pi)) -8))
(command-s "layer" "M" "02LH-加工-轮廓线" "c" 7 "" "")
(command-s "pline" p4j1 p4j2 p4j3 p4j4 "c")
(command "SOLID" p4j1 p4j2 p4j4 p4j3 "")
(setq p4j p4jm)
)
;;;;;;;;;;;;;;;;;;;;;;;;;画右孔位线;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq p44 p4)
(repeatn2
(setq p41 (polar p44alf2 50))
(setq p42 (polar p41(+ alf2(* 0.5 pi)) 10))
(setq p43 (polar p41(+ alf2(* 1.5 pi)) 20))
(command-s "layer" "M" "02LH-加工-孔位" "c" 1 "" "")
(command-s "pline" p42 p43 "")
(setq p44 p41)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;画左圆并加中心线;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq pmm pm1)
(repeat (+ 1 n1)
(setq pm2 (polar pmmalf1 50))
(setq r 8.25)
(command-s "layer" "M" "02LH-加工-轮廓线" "c" 7 "" "")
(command-s "circle" pm2 r)
(zxx)
(setq pmm pm2)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;画右圆并加中心线;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq pn1 (polar p3 (+ alf2(* 0.5 pi))40))
(setq pnn pn1)
(repeat (+ 1 n2)
(setq pn2 (polar pnnalf2 50))
(setq r 8.25)
(command-s "layer" "M" "02LH-加工-轮廓线" "c" 7 "" "")
(command-s "circle" pn2 r)
(zxx)
(setq pnn pn2)
)
(setvar 'osmode old)
(prin1)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;圆画中心线;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun zxx()
(command-s "layer" "M" "02LH-加工-孔位" "c" 1 "" "")
(if (and(setq ename(entlast))
(setq elist(entget ename) )
(setq pt(cdr(assoc 10 elist)))
(setq dist(cdr(assoc 40 elist)))
)
(progn
(setq dist1 (+ dist 8))
(setq pt_up(polar pt(* 0.5 pi)dist1)
pt_down(polar pt(* 1.5 pi)dist1)
pt_left(polar pt pi dist1)
pt_right(polar pt 0 dist1)
)
(command "._line" "none" pt_up "none" pt_down "")
(command "._line" "none" pt_left "none" pt_right "")
)
)
(princ)
)
(prompt "\n 运行命令<< qq>>")
(princ)
;;167.1 [功能] Entmake直线
(defun EntmakeLine (p1 p2)
(entmakeX (list '(0 . "LINE") (cons 10 p1) (cons 11 p2)))
)
;;167.3 [功能] Entmake点表生成多段线
(defun
Make-LWPOLYLINE (lst / PT)
(entmakeX
(append
(list '(0 .
"LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 .
"AcDbPolyline")
(cons 90 (length lst))
)
(mapcar
'(lambda (pt) (cons 10 pt)) lst)
)
)
)1.图层创建不要重复,创建之前进行判断图层是否存在,如果存在就不要创建了
2.用entmakex代替command
3.看葵花宝典的entmakex 函数 里面有很多案例
同样刚入门断断续续在学习,楼主的问题解答不了,不过最近有个小经验分享下,开头结尾可以加上(command "undo" "be")和(command "undo" "e"),这样可以一步撤销到命令前。图层命令我一般是提前建立,然后用到的时候changelayer。 zhangcan0515 发表于 2023-8-22 23:12
建议楼主把关闭捕捉写上去。不然在打开捕捉时候程序就发生错误。
关闭捕捉写了,前期画点的时候是打开的,后期程序运行就关了,然后运行完就又打开了。
用entmake代替command可以明显提速 建议楼主把关闭捕捉写上去。不然在打开捕捉时候程序就发生错误。 写得挺好,下载下来学习一下。 哥们厉害,学习一下 ;; 对话框版本
支持支持~~~~~~~
页:
[1]
2