ljpnb 发表于 2011-6-25 14:40:17

daidong013 发表于 2011-6-25 13:59 static/image/common/back.gif
回复 ZZXXQQ 的帖子

非常感谢大侠!~~画完后感觉还是6楼的好用些,因为四面的线都是段开的!~~


ZZXXQQ版编得多么简捷,你还觉得不好用,6#的简单型有改过了,你试试,升级版也出来过,不过不完美,改好再说。。。

zhynt 发表于 2011-6-25 15:04:38

本帖最后由 zhynt 于 2011-6-25 15:12 编辑

再来个组合版的:(简版去掉了四边框线)
将;(progn
    ;(command "_.rectang" nk_pt1 nk_pt3)
      (setvar "clayer" "nk_line")
    ;)
的"号去掉为有框线

(defun err (s)
(if (and
      (/= s "console break")
      (/= s "Function cancelled")
      (/= s "quit/exit abort")
      )
    (progn
      (setvar "LUPREC" oldlup)
      (setvar "LUNITS" oldlun)
      (setvar "osmode" oldos)
      (setvar "cmdecho" oldcmd)
      (setvar "clayer" oldlay)
      (setq *error* olderr)
      (princ (strcat "\n程序出错或用户退出:" s))
    )
)
)
(defun c:ldf (/                wk_pt1          wk_pt2    wk_pt3    wk_pt4
            nk_pt1      nk_pt2          nk_pt3    nk_pt4    olds
            oldcmd      oldlup          oldlay    nk_n      nk_kd
            ptax      ptay          ptaz            ptbx      ptby
            ptbz      l_pt1_pt4 l_pt2_pt3 l_n            ang_pt1_pt4
             )
(setq oldos (getvar "osmode"))
(if (< oldos 16384)
    (setvar "osmode" (+ oldos 16384))
)
(setq      oldcmd      (getvar "cmdecho")
      oldlun      (getvar "LUNITS")
      oldlup      (getvar "LUPREC")
      olderr      *error*
      *error*      err
      oldlay      (getvar "clayer")
)
(setvar "cmdecho" 0)
(setvar "LUPREC" 8)
(setvar "LUNITS" 2)
(if (= (TBLOBJNAME "LAYER" "wk_line") nil)
    (command "layer" "m" "wk_line" "c" "2" "" "")
)
(if (= (TBLOBJNAME "LAYER" "nk_line") nil)
    (command "layer" "m" "nk_line" "c" "1" "" "")
)
(setvar "clayer" "wk_line")
(setq      wk_pt1 (getpoint "\n指定第一角点")
      wk_pt3 (getcorner wk_pt1 "\n指定第二角点:")
      nk_n   (getint "\n请输入大于零的等分数:")
      wk_kd(getreal "\n输入边框宽度:输入0为简版<20mm>:")
)
(if (= wk_kd nil)
    (setq wk_kd 20.0)
)
(setq      ptax (car wk_pt1)
      ptay (cadr wk_pt1)
      ptbx (car wk_pt3)
      ptby (cadr wk_pt3)
)
(setq      wk_pt2 (list ptax ptby)
      wk_pt4 (list ptbx ptay)
)
(if (/= wk_kd 0)
    (progn
      (setq nk_pt1
             (polar wk_pt1
                  (/ (- (angle wk_pt1 wk_pt2) (angle wk_pt1 wk_pt4)) 2.0)
                  (* wk_kd (* 2 (sqrt 2)))
             )
      )
      (setq nk_pt3
             (polar wk_pt3
                  (+ (/ (- (angle wk_pt3 wk_pt2) (angle wk_pt3 wk_pt4)) 2.0)
                     (/ (* pi 3.0) 2.0)
                  )
                  (* wk_kd (* 2 (sqrt 2)))
             )
      )
      (setq ptax (car nk_pt1)
            ptay (cadr nk_pt1)
            ptbx (car nk_pt3)
            ptby (cadr nk_pt3)
      )
      (setq nk_pt2 (list ptax ptby)
            nk_pt4 (list ptbx ptay)
      )
    )
    (setq nk_pt1 wk_pt1
          nk_pt2 wk_pt2
          nk_pt3 wk_pt3
          nk_pt4 wk_pt4
    )
)
(setq      l_pt1_pt4   (distance nk_pt1 nk_pt4)
      l_pt1_pt2   (distance nk_pt1 nk_pt2)
      ang_pt1_pt4 (angle nk_pt1 nk_pt4)
      l_n            (/ l_pt1_pt4 nk_n)
)
(if (/= wk_kd 0)
    (progn
      (command "_.rectang" wk_pt1 wk_pt3)
      (setvar "clayer" "nk_line")
      (command "_.rectang" nk_pt1 nk_pt3)
    )
   ; (progn
   ;   (command "_.rectang" nk_pt1 nk_pt3)
      (setvar "clayer" "nk_line")
   ; )
)   
(setq      n_pt1 nk_pt1
      n_pt2 nk_pt2
)
(repeat (- nk_n 1)
    (setq n_pt3      (polar n_pt1 ang_pt1_pt4 l_n)
          n_pt4      (polar n_pt3 (+ ang_pt1_pt4 (/ pi 2.0)) l_pt1_pt2)
    )
    (command "_.line" n_pt1 n_pt4 n_pt3 n_pt2 "")
    (setq n_pt1      n_pt3
          n_pt2      n_pt4
    )
)
(command "_.line" n_pt1 nk_pt3 "")
(command "_.line" nk_pt4 n_pt2 "")
(setvar "osmode" oldos)
(setvar "cmdecho" oldcmd)
(setvar "clayer" oldlay)
(setvar "LUPREC" oldlup)
(setvar "LUNITS" oldlun)
(princ)
)

ljpnb 发表于 2011-6-25 15:28:13

;;;拉框N等分加边距 在ZZXXQQ基础上扩展的
(defun c:tt ()
(setvar "CMDECHO" 0)
(command "undo" "g")
(setq oldos (getvar "OSMODE"))
(if (and(setq p1 (getpoint "\n第一角点 :"))
           (setq p2 (getcorner p1 "\n另一角点 :"))
           (setq n (getint "\n等分数 :"))
           (or (setq d (getreal "\n输入边框宽度:<20mm>:"))
             (setq d 20.)
           )
      )
   
    (progn
      (setvar "OSMODE" 0)
      (setq dx1        (abs (- (car p2) (car p1)))
          dy1        (abs (- (cadr p2) (cadr p1)))
      )
      (setq ptm        (list (min (car p1) (car p2)) (min (cadr p1) (cadr p2)))
          p2        (list (max (car p1) (car p2)) (max (cadr p1) (cadr p2)))
          p01        ptm
      )
      (setq p1        (list (+ (car p01) d) (+ (cadr p01) d))
          p00        p1
      )
      ;;内基准点
      (setq dx (- dx1 (* d 2))
          dy (- dy1 (* d 2))
      )
      (if (> dx dy)
        (progn
          (setq dd (/ dx n))
          (repeat n
          (setq p3 (polar p1 0 dd)
                  p4 (polar p1 (/ pi 2) dy)
                  p5 (polar p4 0 dd)
          )
          (command "_.LINE" p1 p5 p3 "")
          (setq ent (entlast))
          (command "_.LINE" p3 p4 "")
          (setq p1 p3)
          )
        )
        (progn
          (setq dd (/ dy n))
          (repeat n
          (setq p3 (polar p1 (/ pi 2) dd)
                  p4 (polar p1 0 dx)
                  p5 (polar p3 0 dx)
          )
          (command "_.LINE" p1 p5 p3 "")
          (setq ent (entlast))
          (command "_.LINE" p3 p4 "")
          (setq p1 p3)
          )
        )
      )
      (entdel ent)
      (command "RECTANG" p00 p5)
      (setvar "OSMODE" oldos)
    )
)
(command "undo" "e")
(setvar "CMDECHO" 1)
(princ)
)

daidong013 发表于 2011-6-25 15:49:07

回复 zhynt 的帖子

大侠!不错不错,不过怎么没有捕捉呢!!~~

daidong013 发表于 2011-6-25 15:55:55

回复 ljpnb 的帖子

真厉害!~~这就是我想要的效果!~~~!~~
不过最外面的外框矩形可以选择有或者没有要怎么改一下!~~
【zhynt】大侠的组合版有最外面的矩形外框!~~

ljpnb 发表于 2011-6-25 16:08:22

如果加外框,可以在(command "RECTANG" p00 p5)
之后再加一句(command "RECTANG" ptm p2)

daidong013 发表于 2011-6-25 16:14:02

回复 ljpnb 的帖子

万分感谢!~~终于完美了!~~~

zhynt 发表于 2011-6-25 16:18:07

将关闭捕捉的位置调整了一下:
(defun err (s)
(if (and
        (/= s "console break")
        (/= s "Function cancelled")
        (/= s "quit/exit abort")
      )
    (progn
      (setvar "LUPREC" oldlup)
      (setvar "LUNITS" oldlun)
      (setvar "osmode" oldos)
      (setvar "cmdecho" oldcmd)
      (setvar "clayer" oldlay)
      (setq *error* olderr)
      (princ (strcat "\n程序出错或用户退出:" s))
    )
)
)
(defun c:ldf (/                nk_pt1          nk_pt2    nk_pt3    nk_pt4
              olds        oldcmd          oldlup    oldlay    nk_n
              nk_kd        ptax          ptay          ptaz      ptbx
              ptby        ptbz          l_pt1_pt4 l_pt2_pt3 l_n
              ang_pt1_pt4
             )
(setq oldos (getvar "osmode"))
(setq        oldcmd        (getvar "cmdecho")
        oldlun        (getvar "LUNITS")
        oldlup        (getvar "LUPREC")
        olderr        *error*
        *error*        err
        oldlay        (getvar "clayer")
)
(setvar "cmdecho" 0)
(setvar "LUPREC" 8)
(setvar "LUNITS" 2)
(if (= (TBLOBJNAME "LAYER" "wk_line") nil)
    (command "layer" "m" "wk_line" "c" "2" "" "")
)
(if (= (TBLOBJNAME "LAYER" "nk_line") nil)
    (command "layer" "m" "nk_line" "c" "1" "" "")
)
(setvar "clayer" "wk_line")
(setq        wk_pt1 (getpoint "\n指定第一角点")
        wk_pt3 (getcorner wk_pt1 "\n指定第二角点:")
        nk_n   (getint "\n请输入大于零的等分数:")
        wk_kd(getreal "\n输入边框宽度:输入0为简版<20mm>:")
)
(if (= wk_kd nil)
    (setq wk_kd 20.0)
)
(setq        wk_ptn (list (min (car wk_pt1) (car wk_pt3))
                     (min (cadr wk_pt1) (cadr wk_pt3))
             )
        wk_pt3 (list (max (car wk_pt1) (car wk_pt3))
                     (max (cadr wk_pt1) (cadr wk_pt3))
             )
        wk_pt1 wk_ptn
)
(setq        ptax (car wk_pt1)
        ptay (cadr wk_pt1)
        ptbx (car wk_pt3)
        ptby (cadr wk_pt3)
)
(setq        wk_pt2 (list ptax ptby)
        wk_pt4 (list ptbx ptay)
)
(if (/= wk_kd 0)
    (progn
      (setq nk_pt1
             (polar wk_pt1
                  (/ pi 4)
                  (* wk_kd (* 2 (sqrt 2)))
             )
      )
      (setq nk_pt3
             (polar wk_pt3
                  (/ (* pi 5) 4)
                  (* wk_kd (* 2 (sqrt 2)))
             )
      )
      (setq ptax (car nk_pt1)
          ptay (cadr nk_pt1)
          ptbx (car nk_pt3)
          ptby (cadr nk_pt3)
      )
      (setq nk_pt2 (list ptax ptby)
          nk_pt4 (list ptbx ptay)
      )
    )
    (setq nk_pt1 wk_pt1
          nk_pt2 wk_pt2
          nk_pt3 wk_pt3
          nk_pt4 wk_pt4
    )
)
(setq        l_pt1_pt4   (distance nk_pt1 nk_pt4)
        l_pt1_pt2   (distance nk_pt1 nk_pt2)       
        ang_pt1_pt4 (angle nk_pt1 nk_pt4)
        l_n          (/ l_pt1_pt4 nk_n)
)
(if (< oldos 16384)
    (setvar "osmode" (+ oldos 16384))
)
(if (/= wk_kd 0)
    (progn
      (command "_.rectang" wk_pt1 wk_pt3)
      (setvar "clayer" "nk_line")
      (command "_.rectang" nk_pt1 nk_pt3)
    )
    (progn (command "_.rectang" nk_pt1 nk_pt3)
           (setvar "clayer" "nk_line")
    )
)
(setq        n_pt1 nk_pt1
        n_pt2 nk_pt2
)
(repeat (- nk_n 1)
    (setq n_pt3        (polar n_pt1 ang_pt1_pt4 l_n)
          n_pt4        (polar n_pt3 (+ ang_pt1_pt4 (/ pi 2.0)) l_pt1_pt2)
    )
    (command "_.line" n_pt1 n_pt4 n_pt3 n_pt2 "")
    (setq n_pt1        n_pt3
          n_pt2        n_pt4
    )
)
(command "_.line" n_pt1 nk_pt3 "")
(command "_.line" nk_pt4 n_pt2 "")
(setvar "osmode" oldos)
(setvar "cmdecho" oldcmd)
(setvar "clayer" oldlay)
(setvar "LUPREC" oldlup)
(setvar "LUNITS" oldlun)
(princ)
)

daidong013 发表于 2011-6-25 17:52:52

本帖最后由 daidong013 于 2011-6-25 18:09 编辑

回复 zhynt 的帖子

现在好了,不错不错!~二合为一!~~感谢!~~
只不过只能识别一个方向的等分,不是识别长边为基础!~~
这样竖向画的时候就有问题!~~

ZZXXQQ 发表于 2011-6-25 21:09:44

7楼和13楼的可竖画。
页: 1 [2] 3 4 5 6 7 8
查看完整版本: 【求助】请大侠门来编一个这样的程序!