raimo 发表于 2024-8-22 11:34:37

自己写了个插件,失灵时不灵。求助大佬给指点一下哪里有问题

本帖最后由 raimo 于 2024-8-22 11:49 编辑

我写了一个小插件工作用的。就是通过选择上下左右四个最边界的位置,自动绘制一个四边出头的线框,但
代码不稳定,老是错误输出。求助大佬给指点一下哪里有问题

(defun c:ctx()
(setq oldcolor (getvar "cecolor"))
(setq sb (getvar "blipmode"))
(setq temp (getvar "osmode"))
(setvar "cecolor" "8")
(setvar "blipmode" 0)
(setvar "osmode" 16383)
(setvar "cmdecho" 0)

;;根据全局比例设置出头线段长度,即 50比例的 6倍为长度 300
(setq aa(getvar "dimscale"))
(setq CTLenth (* aa 6))
;调试显示长度值
(print CTLenth)

;;根据选择,确认图纸的边界范围,左下x1y1 右上x2y2
(setq ptleft (getpoint "\n选择最左点:"))
(set 'x1 (car ptleft))
(print x1)

(setq ptright (getpoint "\n选择最右点:"))
(set 'x2 (car ptright))
(print x2)

(setq ptbottom (getpoint "\n选择最底点:"))
(set 'y1 (cadr ptbottom))
(print y1)

(setq pttop (getpoint "\n选择最顶点:"))
(set 'y2 (cadr pttop))
(print y2)

(COMMAND "LINE" (list (- x1 CTLenth) y1) (list (+ x2 CTLenth) y1) "")
(COMMAND "LINE" (list (- x1 CTLenth) y2) (list (+ x2 CTLenth) y2) "")
(COMMAND "LINE" (list x1 (- y1 CTLenth)) (list x1 (+ y2 CTLenth)) "")
(COMMAND "LINE" (list x2 (- y1 CTLenth)) (list x2 (+ y2 CTLenth)) "")

(setvar "cecolor" oldcolor)
(setvar "blipmode" sb)
(setvar "osmode" temp)
(setvar "cmdecho" 1)
(princ)
)



想要达到的效果如下图。


自己检查和改动很多次了。就是不知道为什么失灵时不灵。是否参数定义上有问题?


附上测试文件, 反正就是不能稳定保证线段能正常出头。

飞雪神光 发表于 2024-8-22 11:52:22

本帖最后由 飞雪神光 于 2024-8-22 11:58 编辑

用command 绘图要关闭捕捉 你却都打开 要是改为包围盒只需要框选一下就可以 不用指定四点
(defun c:ctx(/ aa ctlenth ptbottom ptleft ptright pttop sb x1 x2 y1 y2)
(setq sb (getvar "blipmode"))
(setvar "blipmode" 0)
(setvar "cmdecho" 0)

;;根据全局比例设置出头线段长度,即 50比例的 6倍为长度 300
(setq aa(getvar "dimscale"))
(setq CTLenth (* aa 6))
;调试显示长度值
(print CTLenth)

;;根据选择,确认图纸的边界范围,左下x1y1 右上x2y2
(setq ptleft (getpoint "\n选择最左点:"))
(setq x1 (car ptleft))
(print x1)

(setq ptright (getpoint "\n选择最右点:"))
(setq x2 (car ptright))
(print x2)

(setq ptbottom (getpoint "\n选择最底点:"))
(setq y1 (cadr ptbottom))
(print y1)

(setq pttop (getpoint "\n选择最顶点:"))
(setq y2 (cadr pttop))
(print y2)
(entmake (list '(0 . "LINE")(cons 62 8)(cons 10 (list (- x1 CTLenth) y1))(cons 11 (list (+ x2 CTLenth) y1))))
(entmake (list '(0 . "LINE")(cons 62 8)(cons 10 (list (- x1 CTLenth) y2))(cons 11 (list (+ x2 CTLenth) y2))))
(entmake (list '(0 . "LINE")(cons 62 8)(cons 10 (list x1 (- y1 CTLenth)))(cons 11 (list x1 (+ y2 CTLenth)))))
(entmake (list '(0 . "LINE")(cons 62 8)(cons 10 (list x2 (- y1 CTLenth)))(cons 11 (list x2 (+ y2 CTLenth)))))
(setvar "blipmode" sb)
(princ)
)

xyp1964 发表于 2024-8-22 13:40:18

本帖最后由 xyp1964 于 2024-8-22 13:41 编辑

(defun c:ctx (/ aa bb co dl ll os rr tt x1 x2 y1 y2)
(defun line (p1 p2)(entmakex (list '(0 . "line") (cons 10 p1) (cons 11 p2))))
(setq co (getvar "cecolor"))
(setq os (getvar "osmode"))
(setvar "cecolor" "8")
(setvar "osmode" 39)
(setvar "cmdecho" 0)
(setq aa (getvar "dimscale"))
(setq dl (* aa 6))
(if (and (setq tt (getpoint "\n选择最顶点: "))
         (setq bb (getpoint "\n选择最底点: "))
         (setq ll (getpoint "\n选择最左点: "))
         (setq rr (getpoint "\n选择最右点: "))
      )
    (progn
      (setq x1 (car ll)
            x2 (car rr)
            y1 (cadr bb)
            y2 (cadr tt)
      )
      (line (list (- x1 dl) y1) (list (+ x2 dl) y1))
      (line (list (- x1 dl) y2) (list (+ x2 dl) y2))
      (line (list x1 (- y1 dl)) (list x1 (+ y2 dl)))
      (line (list x2 (- y1 dl)) (list x2 (+ y2 dl)))
    )
)
(setvar "cecolor" co)
(setvar "osmode" os)
(setvar "cmdecho" 1)
(princ)
)

xtjd 发表于 2024-8-22 14:09:14

(defun c:ctx(/ dd gbo mkl p1 p2 p3 p4 ps pxa pxb pya pyb ss)
(setvar "cmdecho" 0)
(defun gbo(obj / p1 p2)(vla-getboundingbox obj 'p1 'p2)(mapcar 'vlax-safearray->list (list p1 p2)))
(defun mkl(p1 p2)(entmakex(list'(0 . "LINE")'(62 . 8)(cons 10 p1)(cons 11 p2))))
(if(setq ss(ssget '((0 . "*LINE,ARC,CIRCLE"))))
    (progn
      (setq
      dd(*(getvar "dimscale")6)
      ps(mapcar 'gbo(mapcar 'vlax-ename->vla-object(vl-remove-if 'listp(mapcar 'cadr(ssnamex ss)))))
      pxa(apply 'min(mapcar 'caar ps))
      pya(apply 'min(mapcar 'cadar ps))
      pxb(apply 'max(mapcar 'caadr ps))
      pyb(apply 'max(mapcar 'cadadr ps))
      p1(list pxa pya)
      p2(list pxb pya)
      p3(list pxb pyb)
      p4(list pxa pyb)
      )
      (mkl(polar p1 pi dd)(polar p2 0 dd))
      (mkl(polar p2(* pi 1.5)dd)(polar p3(* pi 0.5)dd))
      (mkl(polar p3 0 dd)(polar p4 pi dd))
      (mkl(polar p4(* pi 0.5)dd)(polar p1(* pi 1.5)dd))
    )
)
(prin1)
)

raimo 发表于 2024-8-22 12:26:38

飞雪神光 发表于 2024-8-22 11:52
用command 绘图要关闭捕捉 你却都打开 要是改为包围盒只需要框选一下就可以 不用指定四点

因为是图纸,外边界情况会比较复杂,有时候还有标注线啥的。所以我目前就只想到选择四点比较方便

飞雪神光 发表于 2024-8-22 12:29:10

raimo 发表于 2024-8-22 12:26
因为是图纸,外边界情况会比较复杂,有时候还有标注线啥的。所以我目前就只想到选择四点比较方便

可以过滤掉 只取 直线 多段线

raimo 发表于 2024-8-22 13:13:45

飞雪神光 发表于 2024-8-22 12:29
可以过滤掉 只取 直线 多段线
还是先谢谢,我是不知道command的这个设定,难怪老出问题。
过滤掉的话,还会有弧形墙的情况,也可以做到吗。
另外如果可能,有可能实现自动填充的功能吗?思路是咋样的?

飞雪神光 发表于 2024-8-22 13:47:21

raimo 发表于 2024-8-22 13:13
还是先谢谢,我是不知道command的这个设定,难怪老出问题。
过滤掉的话,还会有弧形墙的情况,也可以做 ...

都可以 就是填充比较难了

xyp1964 发表于 2024-8-22 13:47:42

;; 框选方式更简洁高效


raimo 发表于 2024-8-22 14:14:13

xyp1964 发表于 2024-8-22 13:47
;; 框选方式更简洁高效

版主,你发这个不是框选吧?
页: [1] 2
查看完整版本: 自己写了个插件,失灵时不灵。求助大佬给指点一下哪里有问题