明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3245|回复: 19

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

[复制链接]
发表于 2018-1-19 13:19 | 显示全部楼层 |阅读模式
1明经币
选中圆,按直径大小替换成块,自己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)
)


附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

查看完整内容

(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") ...
发表于 2018-1-19 13:19 | 显示全部楼层
本帖最后由 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值改成文字比對即可

回复

使用道具 举报

发表于 2018-1-19 13:30 | 显示全部楼层
相应的LSPD6.dwg等图块是否存在?
回复

使用道具 举报

发表于 2018-1-19 13:31 | 显示全部楼层
  1. (defun c:thy ()
  2.   (princ "\n根据圆直径替换成块: ")
  3.   (if (setq ss (ssget '((0 . "circle"))))
  4.     (progn
  5.       (setq i  -1
  6.             ss1(ssadd)
  7.       )
  8.       (while (setq s1 (ssname ss (setq i (1+ i))))
  9.         (setq ent (entget s1)
  10.               pt  (cdr (assoc 10 ent))
  11.               rr  (cdr (assoc 40 ent))
  12.               bn  (cond ((= rr 3) "LSPD6")
  13.                         ((= rr 4) "LSPD8")
  14.                         ((= rr 5) "LSPD10")
  15.                         ((= rr 6) "LSPD12")
  16.                         ((= rr 8) "LSPD16")
  17.                         ((= rr 10) "LSPD20")
  18.                         (t nil)
  19.                   )
  20.         )
  21.         (if bn
  22.           (progn (command "insert" bn pt 1 1 0) (ssadd s1 ss1))
  23.         )
  24.       )
  25.       (command "erase" ss1 "")
  26.     )
  27.   )
  28.   (princ)
  29. )
回复

使用道具 举报

 楼主| 发表于 2018-1-19 14:21 | 显示全部楼层

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

使用道具 举报

发表于 2018-1-19 14:47 | 显示全部楼层
(= rr 4)
==>
(equal rr 4 1e-9)

全改用容差
回复

使用道具 举报

 楼主| 发表于 2018-1-19 15:01 | 显示全部楼层
Andyhon 发表于 2018-1-19 14:47
(= rr 4)
==>
(equal rr 4 1e-9)

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

使用道具 举报

 楼主| 发表于 2018-1-19 15:12 | 显示全部楼层
Andyhon 发表于 2018-1-19 14:47
(= rr 4)
==>
(equal rr 4 1e-9)

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

使用道具 举报

发表于 2018-1-19 15:54 | 显示全部楼层
AutoLISP Functions     
trans

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

(trans pt from to [disp])   
...
回复

使用道具 举报

发表于 2018-1-20 12:43 | 显示全部楼层
本帖最后由 llsheng_73 于 2018-1-20 12:45 编辑

  1. (defun c:thy(/ ss bns bn e en i)
  2.   (princ "\n根据圆直径替换成块: ")
  3.   (if(and(setq bns(vl-remove-if-not'(lambda(x)(TBLSEARCH"block"(last x)))
  4.                       '(("3" "LSPD6")("4" "LSPD8")("5" "LSPD10")
  5.                         ("6" "LSPD12")("8" "LSPD16")("10" "LSPD20"))));;检测图块是否存在
  6.          (setq ss(ssget '((0 . "circle")))))
  7.     (repeat(setq i(sslength ss))
  8.       (setq i(1- i)
  9.             e(ssname ss i)
  10.             en(entget e))
  11.       (if(setq bn(last(assoc(rtos(+(cdr(assoc 40 en))0.5)2 0)bns)))
  12.         (entmakex(list'(0 . "INSERT")(cons 2 bn)(assoc 10 en)))
  13.         (ssdel e ss))))
  14.   (command"reas1"ss"")
  15.   )
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-3-29 16:07 , Processed in 0.194700 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表