自己写的插件:快速填充圆

 版权声明:本文为博主原创文章,转载请注明出处。https://blog.csdn.net/qq_33839952/article/details/94392966


在边界线中填充圆,由用户自己定义填充方式(横向等边三角/竖向等边三角/正方形等)、圆心距、半径,并将圆心位于边界线外的圆删除。


;;;程序目的:快速填充圆圈
;;;程序结构:由用户输入半径、圆心间距、排列方式等,
;;;快速填充圆。
;;; HF 2019/07/01 QQ1556899790
;;;可根据需要添加默认值。

;;;程序开始:
(defun c:kshy();kshy for 快速画圆
  (alert "注意:尽量在空图纸上操作")
  (setq arg (getint "\n排布类型\n<0>等边三角形\n<1>正方形\n请选择:"))
  ;arg for arrangement
  (setq rad (getreal "\n输入半径:"))
  ;rad for radius
  (setq csp (getreal "\n输入圆心间距:"))
  ;csp for circle spacing
  (setq cpt (getpoint "\n选取起始圆心位置:"))
  ;cpt for center point
  (setq ept (getpoint "\n选取中线终点:"))
  ;ept for ending point
  (setq upt (getpoint "\n选取上边界点:"))
  ;upl for upper point
  (setq lpt (getpoint "\n选取下边界点:"))
  ;lpl for lower point
  (setq upline (car (entsel "\n选取上边界线:")))
  (setq lpline (car (entsel "\n选取下边界线:")))
  (cond
    ((= arg 0) (etri));etri for equilateral triangle
    ((= arg 1) (squa));squa for square
    )
  (delc);delc for delete circle, 去除圆心在边界以外的点。
  (alert "      **绘制结束**")
)
*******************************************************************
;子程序:等边三角形画圆
(defun etri()
  (setq cdi (getint "\n选择三角形边的方向\n<0>水平向<1>竖直向:"))
  (cond
    ((= cdi 0) (vecp));vecp for vertical copy
    ((= cdi 1) (hrcp));hrcp for horizontal copy
    )
)
********************
(defun vecp();在竖向。向上向下复制,以上下边界点y坐标为界限。
  (setq osmode_num (getvar "osmode"))
  ;记住捕捉设置,后面便于还原
  (setvar "osmode" 0)
  ;清空捕捉模式
  (setq xdis (*(sin(/(* 30 pi)180))csp));X方向变更间距
  (setq ydis (*(cos(/(* 30 pi)180))csp));y方向变更间距
  (setq upnum (atoi(rtos(/(-(cadr upt)(cadr cpt))ydis))));向上复制的次数
  (setq lonum (atoi(rtos(/(-(cadr cpt)(cadr lpt))ydis))));向下复制的次数
  (command "circle" cpt 0.0001)
  (setq a (entlast))
  (command "array" a "" "R" "" (atoi(rtos (/(-(car ept)(car cpt))csp)2 0)) csp "")
  (setq aa (cons 40 0.0001))
  (setq aaa (ssget "X" (list aa)))
  (command "copybase" cpt aaa "");完成以首行,起点圆心为基点的复制
  (setq i 1)
  ;复制过程中,y坐标始终加/减相同间距,但X要交替加减。
  ;使用(setq i (* i -1)),对X交替加减。
  (setq npt (list (+(car cpt)(* xdis i))(+ (cadr cpt) ydis)))
  (repeat upnum
    (command "pasteclip" npt)
    (setq npt (list (+(car npt)(* xdis i))(+ (cadr npt) ydis)))
    (setq i (* i -1))
    )
  (setq i 1)
  (command "copybase" cpt aaa "");完成以首行,起点圆心为基点的复制
  (setq npt (list (+(car cpt)(* xdis i))(- (cadr cpt) ydis)))
  (repeat lonum
    (command "pasteclip" npt)
    (setq npt (list (+(car npt)(* xdis i))(- (cadr npt) ydis)))
    (setq i (* i -1))
    )
  (setvar "osmode" osmode_num)
  ;还原捕捉设置
  )
*******************
(defun hrcp();在横向复制,以中线起止点x坐标为界限。
  (setq osmode_num (getvar "osmode"))
  ;记住捕捉设置,后面便于还原
  (setvar "osmode" 0)
  ;清空捕捉模式
  (setq xdis (*(cos(/(* 30 pi)180))csp));x方向变更间距
  (setq ydis (* 0.5 csp));y方向变更间距
  (setq xnum (atoi(rtos (/(-(car ept)(car cpt))xdis)2 0)));横向复制的次数
  (setq uanum (atoi(rtos (/(-(cadr upt)(cadr cpt))csp)2 0)));向上阵列的次数
  (setq lanum (atoi(rtos (/(-(cadr cpt)(cadr lpt))csp)2 0)));向下阵列的次数
  (command "circle" cpt 0.0001)
  (setq a (entlast))
  (command "array" a "" "R" uanum "" csp "");向上阵列
  (command "array" a "" "R" lanum "" (* -1 csp) "");向下阵列
  (setq aa (cons 40 0.0001))
  (setq aaa (ssget "X" (list aa)));全选第一列绘制的圆
  (command "copybase" cpt aaa "");完成以首列,起点圆心为基点的复制
  (setq i 1)
  (setq npt (list (+(car cpt)xdis)(+ (cadr cpt)(* ydis i))));第一个粘贴的点
  (repeat xnum
    (command "pasteclip" npt)
    (setq npt (list (+(car npt)xdis)(+ (cadr npt)(* ydis i))))
    (setq i (* i -1))
    )
  (setvar "osmode" osmode_num)
  ;还原捕捉设置
  )
*********************************************************************
;子程序:正方形排布画圆;用横向复制而不是阵列,避免与环境变量MaxArray冲突。
(defun squa()
  (setq osmode_num (getvar "osmode"))
  ;记住捕捉设置,后面便于还原
  (setvar "osmode" 0)
  ;清空捕捉模式
  (setq xdis csp)
  (setq xnum (atoi(rtos (/(-(car ept)(car cpt))xdis)2 0)));横向复制的次数
  (command "circle" cpt 0.0001)
  (setq a (entlast))
  (command "array" a "" "R" uanum "" csp "");向上阵列
  (command "array" a "" "R" lanum "" (* -1 csp) "");向下阵列
  (setq aa (cons 40 0.0001))
  (setq aaa (ssget "X" (list aa)));全选第一列绘制的圆
  (command "copybase" cpt aaa "");完成以首列,起点圆心为基点的复制
  (setq i 1)
  (setq npt (list (+(car cpt)(* xdis i))(cadr cpt)));第一个粘贴的点
  (repeat (+ xnum 1)
    (command "pasteclip" npt)
    (setq npt (list (+(car cpt)(* xdis i))(cadr cpt)))
    (setq i (1+ i))
    )
  (setvar "osmode" osmode_num)
  ;还原捕捉设置
  )
*********************************************************************
;子程序:去掉边界线外的圆
;程序结构:利用围交wp,将选中的圆半径改为rad;再次使用ssget选中半径小的
;圆,删除。
(defun delc()
  (setq osmode_num (getvar "osmode"))
  ;记住捕捉设置,后面便于还原
  (setvar "osmode" 0)
  ;清空捕捉模式
  (setq ent (entget upline))
  (setq upts nil)
  ;循环次数为列表长度
  (setq i 0)
  (repeat (length ent)
  ;多段线的群码10对应节点坐标,从联合属性列表的第一个
  ;元素开始,循环向后判断群码是否等于10,赋值给pts.
  ;nth:the nth element of lst.
  (if (= (car (nth i ent)) 10)
    (setq upts (append upts (list (cdr (nth i ent)))))
    )
  (setq i (1+ i))
    );获得上边界节点列表upts
  (setq ent (entget lpline))
  (setq lpts nil)
  (setq i 0)
  (repeat (length ent)
  (if (= (car (nth i ent)) 10)
    (setq lpts (append lpts (list (cdr (nth i ent)))))
    )
  (setq i (1+ i))
    );获得下边界节点列表lpts
  (setq lpts (reverse lpts));反转lpts
  (setq pts (append upts lpts))
  (command "zoom" "e")
  (setq cc (ssget "wp" pts '((0 . "CIRCLE"))))
  (setq ccnum (sslength cc))
  (setq i 0)
  (repeat (- ccnum 1)
    (setq entname (ssname cc i))
    (setq entdata (entget entname))
    (setq entdata (subst (cons 40 rad) (assoc 40 entdata) entdata))
    (entmod entdata)
    (setq i (1+ i))
    )
  (setq ccdel (ssget "X" '((0 . "CIRCLE")(40 . 0.0001))))
  (command "erase" ccdel "")
  (setvar "osmode" osmode_num)
  ;还原捕捉设置
  )

**********************************************************************
;;; 程序结束, kshy使用。 
;;; ©2019 H.France. All Rights Reserved.

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值