shopping200 发表于 2018-1-19 13:19:17

选中圆,按直径大小替换成块,自己画的圆可以替换,3D转的圆不能替换

选中圆,按直径大小替换成块,自己CAD画的圆可以替换,3D图转的圆不能替换,还有圆必须在世界坐标系下才能转,怎么改在任意位置都能替换在当前院校位置,下面是院长的程序:
(defun c:THY ()
(princ "\n根据圆直径替换成块: ")
(if (setq ss (ssget '((0 . "circle"))))
    (progn
      (setq i      -1
            ss1      (ssadd)
      )
      (while (setq s1 (ssname ss (setq i (1+ i))))
      (setq ent (entget s1)
            pt(cdr (assoc 10 ent))
            rr(cdr (assoc 40 ent))
      )
      (cond ((= rr 3)
               (command "insert" "LSPD6" pt 1 1 0)
               (ssadd s1 ss1)
            )
            ((= rr 4)
               (command "insert" "LSPD8" pt 1 1 0)
               (ssadd s1 ss1)
            )
            ((= rr 5)
               (command "insert" "LSPD10" pt 1 1 0)
               (ssadd s1 ss1)
            )
            ((= rr 6)
               (command "insert" "LSPD12" pt 1 1 0)
               (ssadd s1 ss1)
            )
            ((= rr 8)
               (command "insert" "LSPD16" pt 1 1 0)
               (ssadd s1 ss1)
            )
            ((= rr 10)
               (command "insert" "LSPD20" pt 1 1 0)
               (ssadd s1 ss1)
            )
      )
      )
      (command "erase" ss1 "")
    )
)
(princ)
)


bssurvey 发表于 2018-1-19 13:19:18

本帖最后由 bssurvey 于 2018-1-19 16:11 编辑

(defun c:THY ()
   (princ "\n根據圓直徑替換成塊: ")
   (if (setq ss (ssget '((0 . "circle"))))
   (progn
       (setq i      -1
             ss1      (ssadd)
       )
       (while (setq s1 (ssname ss (setq i (1+ i))))
         (setq ent (entget s1)
               pt(cdr (assoc 10 ent))
               rr(cdr (assoc 40 ent))
         )
         (cond ((= (rtos rr 2 0) "3")
                (command "insert" "LSPD6" pt 1 1 0)
                (ssadd s1 ss1)
               )
               ((= (rtos rr 2 0) "4")
                (command "insert" "LSPD8" pt 1 1 0)
                (ssadd s1 ss1)
               )
               ((= (rtos rr 2 0) "5")
                (command "insert" "LSPD10" pt 1 1 0)
                (ssadd s1 ss1)
               )
               ((= (rtos rr 2 0) "6")
                (command "insert" "LSPD12" pt 1 1 0)
                (ssadd s1 ss1)
               )
               ((= (rtos rr 2 0) "7")
                (command "insert" "LSPD16" pt 1 1 0)
                (ssadd s1 ss1)
               )
               ((= (rtos rr 2 0) "8")
                (command "insert" "LSPD20" pt 1 1 0)
                (ssadd s1 ss1)
               )
         )
       )
       (command "erase" ss1 "")
   )
   )
   (princ)
)
 把 RR值改成文字比對即可

xyp1964 发表于 2018-1-19 13:30:26

相应的LSPD6.dwg等图块是否存在?

xyp1964 发表于 2018-1-19 13:31:35

(defun c:thy ()
(princ "\n根据圆直径替换成块: ")
(if (setq ss (ssget '((0 . "circle"))))
    (progn
      (setq i-1
            ss1(ssadd)
      )
      (while (setq s1 (ssname ss (setq i (1+ i))))
      (setq ent (entget s1)
            pt(cdr (assoc 10 ent))
            rr(cdr (assoc 40 ent))
            bn(cond ((= rr 3) "LSPD6")
                        ((= rr 4) "LSPD8")
                        ((= rr 5) "LSPD10")
                        ((= rr 6) "LSPD12")
                        ((= rr 8) "LSPD16")
                        ((= rr 10) "LSPD20")
                        (t nil)
                  )
      )
      (if bn
          (progn (command "insert" bn pt 1 1 0) (ssadd s1 ss1))
      )
      )
      (command "erase" ss1 "")
    )
)
(princ)
)

shopping200 发表于 2018-1-19 14:21:49

xyp1964 发表于 2018-1-19 13:31


院长秒回呀,太感谢了。没有用呀3D转的图纸还是替换不了,自己画的圆就可以。LSPD6图纸都有,太多了我只是用LSPD8一个做个说明。

Andyhon 发表于 2018-1-19 14:47:19

(= rr 4)
==>
(equal rr 4 1e-9)

全改用容差

shopping200 发表于 2018-1-19 15:01:04

Andyhon 发表于 2018-1-19 14:47
(= rr 4)
==>
(equal rr 4 1e-9)


感谢,确实是这样的。(equal rr 4 1e-9) 替换 (= rr 4)

shopping200 发表于 2018-1-19 15:12:14

Andyhon 发表于 2018-1-19 14:47
(= rr 4)
==>
(equal rr 4 1e-9)


还有割问题,替换在世界坐标下可以。自设坐标系后,替换就位置跑偏了,该怎么改在用户坐标系下依然可以替换

Andyhon 发表于 2018-1-19 15:54:50

AutoLISP Functions   
trans

Translates a point (or a displacement) from one coordinate system to another

(trans pt from to )   
...

llsheng_73 发表于 2018-1-20 12:43:18

本帖最后由 llsheng_73 于 2018-1-20 12:45 编辑

(defun c:thy(/ ss bns bn e en i)
(princ "\n根据圆直径替换成块: ")
(if(and(setq bns(vl-remove-if-not'(lambda(x)(TBLSEARCH"block"(last x)))
                      '(("3" "LSPD6")("4" "LSPD8")("5" "LSPD10")
                        ("6" "LSPD12")("8" "LSPD16")("10" "LSPD20"))));;检测图块是否存在
         (setq ss(ssget '((0 . "circle")))))
    (repeat(setq i(sslength ss))
      (setq i(1- i)
            e(ssname ss i)
            en(entget e))
      (if(setq bn(last(assoc(rtos(+(cdr(assoc 40 en))0.5)2 0)bns)))
      (entmakex(list'(0 . "INSERT")(cons 2 bn)(assoc 10 en)))
      (ssdel e ss))))
(command"reas1"ss"")
)
页: [1] 2
查看完整版本: 选中圆,按直径大小替换成块,自己画的圆可以替换,3D转的圆不能替换