世人皆醉 发表于 2022-8-4 09:35:34

如何在一条直线上绘制带有条件的多个圆

问题如图所示,代码如下,后面改咋写,求大佬指点
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


xj6019 发表于 2022-8-4 09:35:35

(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)
)

世人皆醉 发表于 2022-8-4 10:31:10

xj6019 发表于 2022-8-4 10:08
(defun c:NM(/ d1 n1 p1 pd1 pt0 pt1)
(setq d1(getreal "直线的长度为:"))
      (SETQ pt0(getpoint "插入 ...
大佬,你这两个端点没有圆啊,能把端点的两个圆加上吗

yshf 发表于 2022-8-4 10:36:19


(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)
)

xj6019 发表于 2022-8-4 10:44:15

世人皆醉 发表于 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 10:47:19

本帖最后由 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)

lml2023 发表于 2023-11-7 19:11:40

这个还是不错的
页: [1]
查看完整版本: 如何在一条直线上绘制带有条件的多个圆