版权声明:本文为博主原创文章,转载请注明出处。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.