如何在一条直线上绘制带有条件的多个圆
问题如图所示,代码如下,后面改咋写,求大佬指点static/image/hrline/1.gif
(defun c:cs()
(setvar "cmdecho" 0) ;关闭普通命令提示信息
(setvar "osmode" 0);关闭对象捕捉状态
(setq d1(getreal "直线的长度为:"))
(SETQ pt0(getpoint "插入点:"))
(setq p1(list (+ (car pt0) d1) (cadr pt0)))
(command "line" pt0 p1 "")
(command "circle" pt0 "d" 10 "")
(command "circle" p1 "d" 10 "")
static/image/hrline/1.gif
(defun c:NM(/ d1 n1 p1 pd1 pt0 pt1)
(setq d1(getreal "直线的长度为:"))
(SETQ pt0(getpoint "插入点:"))
(setq n1(fix(/ d1 75)))
(if(<(* 0.5(- d1(* n1 75)))35)
(setq n1(1- n1))
)
(setq pd1(* 0.5(- d1(* n1 75))))
(setq pt1(polar pt0 0 d1))
(entmake (list '(0 . "LINE") (cons 10 pt0) (cons 11 pt1)))
(setq p1(polar pt0 0 pd1))
(repeat (1+ n1)
(entmake (list '(0 . "CIRCLE") (cons 10 p1) (cons 405)))
(setq p1(polar p1 0 75))
)
(princ)
) xj6019 发表于 2022-8-4 10:08
(defun c:NM(/ d1 n1 p1 pd1 pt0 pt1)
(setq d1(getreal "直线的长度为:"))
(SETQ pt0(getpoint "插入 ...
大佬,你这两个端点没有圆啊,能把端点的两个圆加上吗
(defun c:cs()
(setvar "cmdecho" 0) ;关闭普通命令提示信息
(setvar "osmode" 0);关闭对象捕捉状态
(If (>= (setq d1 (getreal "直线的长度为:")) (+ 35 75 35))
(if (SETQ pt0 (getpoint "插入点:"))
(progn
(setq m (fix (/ d1 75.0)))
(cond ((> (- d1 (* m 75)) 70)
(setq m (1+ m))
)
((< (- d1 (* m 75)) 70)
(setq m (1- m))
)
)
(setq fdcd1 (* 0.5 (- d1 (* m 75))))
(command "._line" pt0 (mapcar '+ pt0 (list d1 0 0)) "")
(command "._circle" pt0 "d" 10 "")
(command "._circle" (mapcar '+ pt0 (list d1 0 0)) "d" 10 "")
(setq pt (mapcar '+ pt0 (list fdcd1 0 0)))
(repeat (1+ m)
(command "._circle" pt "d" 10 "")
(setq pt (mapcar '+ pt (list 75.0 0 0)))
)
)
(alert "未输入插入点!")
)
(alert (strcat "输入的为:" (vl-princ-to-string d1) ",小于(35+75+35),不符合要求!"))
)
(princ)
)
世人皆醉 发表于 2022-8-4 10:31
大佬,你这两个端点没有圆啊,能把端点的两个圆加上吗
最后补俩圆就行
(defun c:NM(/ d1 n1 p1 pd1 pt0 pt1)
(setq d1(getreal "直线的长度为:"))
(setq pt0(getpoint "插入点:"))
(setq n1(fix(/ d1 75)))
(if(<(* 0.5(- d1(* n1 75)))35)
(setq n1(1- n1))
)
(setq pd1(* 0.5(- d1(* n1 75))))
(setq pt1(polar pt0 0 d1))
(entmake (list '(0 . "LINE") (cons 10 pt0) (cons 11 pt1)))
(setq p1(polar pt0 0 pd1))
(repeat (1+ n1)
(entmake (list '(0 . "CIRCLE") (cons 10 p1) (cons 405)))
(setq p1(polar p1 0 75))
)
(entmake (list '(0 . "CIRCLE") (cons 10 pt0) (cons 405)))
(entmake (list '(0 . "CIRCLE") (cons 10 pt1) (cons 405)))
(princ)
) 本帖最后由 llsheng_73 于 2022-8-4 11:04 编辑
(defun tt(e d d1 / n dist);;;e任意曲线,d中间圆间距,d1两端最小距离d1<= 1/2d
(setq dist(vlax-curve-getdistatparam e(vlax-curve-getendparam e))
n(fix(/ dist d))
n(if(>(rem dist d)(+ d1 d1))n(1- n))
d1(-(*(- dist(* n d))0.5)d))
(entmakex(mapcar'cons'(0 10 40)(list"circle"(vlax-curve-getstartpoint e)5)))
(repeat(1+ n)(entmakex(mapcar'cons'(0 10 40)(list"circle"(vlax-curve-getpointatdist e(setq d1(+ d1 d)))5))))
(entmakex(mapcar'cons'(0 10 40)(list"circle"(vlax-curve-getendpoint e)5))))
(tt(car(entsel"任意曲线"))75 33)
这个还是不错的
页:
[1]