chq168168 发表于 2023-8-22 17:44:08

学习成果!!!!!

根据大神的建议拿工作中的实例进行研究学习,经过大神的指点结合自己的理解最终把这个视图给画出来了。在写这个程序的过程中有些困惑,首先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)

liuhe 发表于 2023-8-23 08:34:26

;;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 函数 里面有很多案例

HAZEL 发表于 2023-8-23 10:42:25

同样刚入门断断续续在学习,楼主的问题解答不了,不过最近有个小经验分享下,开头结尾可以加上(command "undo" "be")和(command "undo" "e"),这样可以一步撤销到命令前。图层命令我一般是提前建立,然后用到的时候changelayer。

chq168168 发表于 2023-8-23 18:11:52

zhangcan0515 发表于 2023-8-22 23:12
建议楼主把关闭捕捉写上去。不然在打开捕捉时候程序就发生错误。

关闭捕捉写了,前期画点的时候是打开的,后期程序运行就关了,然后运行完就又打开了。

cghdy 发表于 2023-8-22 17:53:56

用entmake代替command可以明显提速

zhangcan0515 发表于 2023-8-22 23:12:17

建议楼主把关闭捕捉写上去。不然在打开捕捉时候程序就发生错误。

marcoyuwen 发表于 2023-8-23 08:37:23

写得挺好,下载下来学习一下。

maccht 发表于 2023-8-23 10:35:48

哥们厉害,学习一下

xyp1964 发表于 2023-8-23 13:06:16

;; 对话框版本


spp_wall 发表于 2023-8-23 16:41:23

支持支持~~~~~~~
页: [1] 2
查看完整版本: 学习成果!!!!!