434939575 发表于 2013-12-24 21:15:00

请教热i心的朋友们.一个圆排列的问题。

;排列圆.以半径为距离排列圆.有问题.
目的。
    (defun c:tt()
    (princ " \n 点选圆");
   (setvar "CMDECHO" 0);_关闭命令提示
    (Setvar "osmode" 0);_关闭捕捉
          (if (setq ss (ssget '((0 . "circle"))))
          (progn
          (setqpt0 (getpoint "排列起始点"));可运行成功
            (setq i 0)
            (repeat (sslength ss)
            (setq ss0 (ssname ss i)
                   en (entget ss0)
                cen-10(cdr (assoc 10 en)) ;pt=圆心坐标
                rad-40(cdr (assoc 40 en)) ;pt=圆半径
            i (1+ i)
            ); (setq ss0
;------------------------------------------------------------------
   (setqptz(polarpt0pirad-40 ) );圆左边点。         
   (setqpty (polarpt00rad-40 ) );圆右边点。
         (setqpt0    ptz );圆左边点赋值给pt0 。
;------------------------------------------------------------------
      ( command"move"
                  ss0
                  ""
             cen-10
                  pty
                  ""
                   );command
          ); (repeat
   )
      )
       )
   

xyp1964 发表于 2013-12-24 23:06:43

;; 需要e派工具箱(XCAD)的支持:http://yunpan.cn/QXQKsW9gAPmpF

(defun c:tt ()
(princ " \n选择圆: ")
(if (and (setq ss (ssget '((0 . "circle"))))
           (setq pt0 (getpoint "排列起始点: "))
      )
    (progn
      (setq lst (xyp-ss2list ss)
          lst        (mapcar '(lambda (x) (list x (xyp-DXF 40 x))) lst)
          lst        (vl-sort lst '(lambda (x y) (< (cadr x) (cadr y))))
      )
      (foreach a lst
        (setq s1(car a)
              rr(cadr a)
              pt(xyp-DXF 10 s1)
              pt0 (xyp-Pt2X pt0 rr)
        )
        (xyp-move s1 pt pt0)
        (setq pt0 (xyp-Pt2X pt0 rr))
      )
    )
)
(princ)
)

434939575 发表于 2013-12-25 09:27:40

xyp1964 发表于 2013-12-24 23:06 static/image/common/back.gif


谢谢院长的指导。这么晚了。还出手相助。真的很感动!

edata 发表于 2013-12-25 10:51:59

434939575 发表于 2013-12-25 09:27 static/image/common/back.gif
谢谢院长的指导。这么晚了。还出手相助。真的很感动!

;排列圆.以半径为距离排列圆.有问题.
;modfiy by edata @2013-12-25 10:51:17
    (defun c:tt(/ CEN-10 EN I O_CMD O_OS PT0 PTY RAD-40 SS SS0);局部变量要设置
    (princ " \n 按大小点选圆");无排序函数,按选择排序
      (setq o_cmd (getvar "CMDECHO"));保存要更改的变量值
      (setq o_os (getvar "osmode"));保存要更改的变量值
   (setvar "CMDECHO" 0);_关闭命令提示
    (Setvar "osmode" 0);_关闭捕捉
          (if (setq ss (ssget '((0 . "circle"))))
          (progn
          (setqpt0 (getpoint "排列起始点"));可运行成功
            (setq i 0)
            (repeat (sslength ss)
            (setq ss0 (ssname ss i)
                   en (entget ss0)
                cen-10(cdr (assoc 10 en)) ;pt=圆心坐标
                rad-40(cdr (assoc 40 en)) ;pt=圆半径
            i (1+ i)
            ); (setq ss0
;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-算法更改=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
              (setq pty(polar cen-10 0 rad-40));获得原来圆的右面点   
              (setq pt0(polar pt0 0 (+ rad-40 rad-40)));设置新的右边点
;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-算法更改=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;;;;------------------------------------------------------------------
;;;   (setqptz(polarpt0pirad-40 ) );圆左边点。         
;;;   (setqpty (polarptz0    (* rad-402)) );圆右边点。
;;;         (setqpt0    pty );圆左边点赋值给pt0 。
;------------------------------------------------------------------
      (command "move" ss0 "" pty pt0 "") ;command
          ); (repeat
   )
      )
      (and o_cmd (setvar "CMDECHO" o_cmd));恢复更改的变量值
      (and o_os (setvar "osmode" o_os));恢复更改的变量值
       )

434939575 发表于 2013-12-25 15:44:44

edata 发表于 2013-12-25 10:51 static/image/common/back.gif


谢谢这位朋友热心的帮助。乃冬日里的阳光。再次感谢!

edata 发表于 2013-12-31 22:36:25

434939575 发表于 2013-12-25 15:44 static/image/common/back.gif
谢谢这位朋友热心的帮助。乃冬日里的阳光。再次感谢!

;排列圆.以半径为距离排列圆.有问题.
;modfiy by edata @2013-12-25 10:51:17
;modfiy by edata @2013-12-31 22:32:28
    (defun c:tt(/ CEN-10 EN I O_CMD O_OS PT0 PTY RAD-40 SS SS0);局部变量要设置
    (princ " \n 按大小点选圆");无排序函数,按选择排序
      (setq o_cmd (getvar "CMDECHO"));保存要更改的变量值
      (setq o_os (getvar "osmode"));保存要更改的变量值
   (setvar "CMDECHO" 0);_关闭命令提示
    (Setvar "osmode" 0);_关闭捕捉      
          (if (setq ss (ssget '((0 . "circle"))))
          (progn
          (setqpt0 (getpoint "\n排列起始点"));可运行成功
          (setq sk_gds(getdist "\n指定圆间距:"))
          (or sk_gds (setq sk_gds 10))
            (setq i 0)
            (repeat (sslength ss)
            (setq ss0 (ssname ss i)
                   en (entget ss0)
                cen-10(cdr (assoc 10 en)) ;pt=圆心坐标
                rad-40(cdr (assoc 40 en)) ;pt=圆半径
            i (1+ i)
            ); (setq ss0
;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-算法更改=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
            (setq pty(polar cen-10 0 rad-40));获得原来圆的右面点   
            (setq pt0(polar pt0 0 (+ (+ rad-40 rad-40) sk_gds)));设置新的右边点
;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-算法更改=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;;;;------------------------------------------------------------------
;;;   (setqptz(polarpt0pirad-40 ) );圆左边点。         
;;;   (setqpty (polarptz0    (* rad-402)) );圆右边点。
;;;         (setqpt0    pty );圆左边点赋值给pt0 。
;------------------------------------------------------------------
      (command "move" ss0 "" pty pt0 ) ;command 我的cad2006 move后无需""结尾
          ); (repeat
   )
      )
      (and o_cmd (setvar "CMDECHO" o_cmd));恢复更改的变量值
      (and o_os (setvar "osmode" o_os));恢复更改的变量值
      (princ)
       )

edata 发表于 2013-12-31 22:38:51

增加13行 14行
更正32行command函数调用move的语句,我的cad2006无需""结尾
相对增加了全局变量名 sk_gds 默认是10,可以自己更改。
其他暂无调整

434939575 发表于 2014-1-1 12:26:21

edata 发表于 2013-12-31 22:38 static/image/common/back.gif
增加13行 14行
更正32行command函数调用move的语句,我的cad2006无需""结尾
相对增加了全局变量名 sk_gd ...

谢谢再次指导。
页: [1]
查看完整版本: 请教热i心的朋友们.一个圆排列的问题。