找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2426|回复: 9

[原创] [炫翔]--{元旦礼物}---批量半径驱动圆,圆弧中心线(源码)

[复制链接]

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2013-12-31 13:12:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 炫翔 于 2013-12-31 13:15 编辑

2.gif

  1. (defun c:xx ( / co enlst i p1 p2 r r1 s1 ss sss x)
  2.   (coma)
  3.   (xx-princa "批量半径驱动圆,圆弧中心线")
  4.   (xx-princ "圆,圆弧对象")
  5.   (xx-ax-load-ltypes '("center"))
  6.   (mapcar 'xx-setv '("osmode" "celtype" "cecolor"  "celtscale") '(0 "center" "1" 1000))
  7.   (setq r (xx-dist "新半径" r 10))
  8.   (setq ss (ssget '((0 . "arc,circle"))))
  9.   (setq i (sslength ss))
  10.   (while (setq s1 (ssname ss (setq i (1- i))))
  11.     (setq co (xx-get-dxf 10 s1))
  12.     (setq r1 (xx-get-dxf 40 s1))
  13.     (setq p1(mapcar '+ co '(1 1))
  14.           p2(mapcar '- co '(1 1))
  15.     )
  16.     (if(setq sss(ssget "f" (list p1 p2) '((0 . "line"))))
  17.      (progn
  18.        (setq enlst(xx-ss-enlst sss))
  19.        (foreach x enlst
  20.          (if(equal(xx-curve-mid x)co 0.001)
  21.           (vl-cmdf "_.erase" (list x (getvar "viewctr")) "")
  22.          )
  23.        )
  24.        (xx-put-dxf s1 40 r)
  25.        (xx-mk-cir co r)
  26.       )
  27.       (progn
  28.        (xx-put-dxf s1 40 r)
  29.        (xx-mk-cir co r)
  30.       )
  31.      )
  32.     )
  33. (comb)
  34. )

  35. ;画中心线
  36. (defun xx-mk-cir (co r1 / p1 p2 p3 p4 rr)
  37.   (setq rr (+ r1 (* 0.1 r1)))
  38.   (setq p1 (polar co (* pi 0.5) rr)
  39.   p2 (polar co (* 1.5 pi) rr)
  40.   p3 (polar co pi rr)
  41.   p4 (polar co 0 rr)
  42.   )
  43.   (xx-mk-line p1 p2)
  44.   (xx-put-dxf (entlast) 48 r1)
  45.   (xx-mk-line p3 p4)
  46.   (xx-put-dxf (entlast) 48 r1)
  47. )
  48. (defun xx-mk-line (p1 p2)
  49. (entmake(list '(0 . "line")(cons 10 p1)(cons 11 p2)))
  50. )

  51. (defun xx-put-dxf (ss code new / ent i s1 tp)
  52.     (setq tp (type ss))
  53.   (cond
  54.     ((= tp 'ENAME);判断是否是图元
  55.        (setq ent (entget ss))
  56.      (if (and (= (type code) 'list) (= (type new) 'list));判断是否是表
  57.        (mapcar (function (lambda (x y) (xx-put-dxf ss x y))) code new);表循环取得每个表值,并替换更新
  58.       (progn
  59.         (if (= (xx-get-dxf code ss) nil);为空时
  60.           (entmod (append ent (list (cons code new))));替换为原来的(不变)
  61.           (entmod (subst (cons code new) (assoc code ent) ent));替换成新的对象
  62.         )
  63.        (entupd ss);更新对象
  64.       )
  65.      )
  66.     )
  67.    ((= tp 'PICKSET);判断是否是选择集
  68.       (setq i -1)
  69.     (while (setq s1 (ssname ss (setq i (1+ i))))
  70.        (xx-put-dxf s1 code new)
  71.     )
  72.    )
  73.    ((= tp 'list);判断是否是表
  74.     (foreach x ss (xx-put-dxf x code new));循环递归到更新
  75.    )
  76.    (t (princ "\n xx-put-dxf  错了!"))
  77.   )
  78. ss
  79. )

  80. (defun xx-get-dxf (code s1 / ent lst)
  81.   (if (= (type code) 'list);判断是否是表
  82.     (progn
  83.       (setq ent(entget s1);提取串列
  84.             lst '();设表为空
  85.       )
  86.       (foreach a code ;利用foreach函数循环提取表中各值
  87.         (setq lst (cons (list a (cdr(assoc a ent))) lst));表中串列以后循环加入表
  88.       )
  89.       (reverse lst);将表的元素顺序倒置后返回
  90.     )
  91.     (if (= code -3)  
  92.       (cdr(assoc code (entget s1 '("*"))));提取扩展数据
  93.       (cdr(assoc code (entget s1)))
  94.     )
  95.    )
  96. )

  97. (defun xx-dist (msg def chushi / inp)
  98.   (if (= def nil) (setq def chushi))
  99.   (setq msg (strcat "\n->请确定" msg "(或直接点两点量取) <" (rtos def) ">:"))
  100.   (setq inp(getdist msg))
  101.   (if inp inp def)
  102. )

  103. (defun xx-Curve-Mid (curve / d)
  104.   (setq d (* (vlax-curve-getDistAtParam curve (vlax-curve-getEndParam curve)) 0.5))
  105.   (vlax-curve-getPointAtDist curve d)
  106. )
  107. (defun xx-ss-EnLst (ss / e el i)
  108.   (setq i (sslength ss))
  109.   (while (setq e (ssname ss (setq i (1- i))))
  110.     (setq el (cons e el))
  111.   )
  112.   el
  113. )
  114. (defun xx-ax-load-Ltypes ( lts / aclin XX-Str-Feng-Zhi)
  115. (defun XX-Str-Feng-Zhi (Str del / pos lst)
  116.       (while (setq pos (vl-string-search del str))
  117.   (setq lst (cons (substr str 1 pos) lst)
  118.         str (substr str (+ pos 1 (strlen del)))
  119.   )
  120.       )
  121.       (if (= " " Del)
  122.   (vl-remove "" (reverse (cons str lst)))
  123.   (reverse (cons str lst))
  124.       )
  125. )
  126.   (setq aclin
  127.     (apply 'append
  128.       (mapcar '(lambda ( directory ) (vl-directory-files directory "*.lin" 1))
  129.         (XX-Str-Feng-Zhi  ;将具有分隔符的字符串解析为列表
  130.           (vla-get-SupportPath (vla-get-Files (vla-get-Preferences (xx-acad)))) ";"
  131.         )
  132.       )
  133.     )
  134.   )
  135.   (apply 'and
  136.     (mapcar
  137.       (function
  138.         (lambda ( lt )
  139.           (or (tblsearch "LTYPE" lt)
  140.             (vl-some
  141.               (function
  142.                 (lambda ( lin )
  143.                   (vl-catch-all-apply 'vla-load
  144.                    (list (vla-get-linetypes (vla-get-activedocument (xx-acad)))lt lin)
  145.                    )
  146.                  (tblsearch "LTYPE" lt)
  147.                 )
  148.               )
  149.               aclin
  150.             )
  151.           )
  152.         )
  153.       )
  154.       lts
  155.     )
  156.   )  
  157. )

  158. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  159. ;程序开始
  160. (defun coma()
  161. (if (> (atof (getvar "acadver")) 15.)
  162.    (vl-load-com)
  163. )
  164.   (xx-VlaPu);用VLA选集时事先清理
  165.   (xx-StartUndo);标记开始
  166.   (setq  *x-r*  *error*
  167.   *error*  *x-er*
  168.   )
  169.   t
  170. )

  171. ;设变量
  172. ;(xx-setv "osmode" 0)
  173. (defun xx-setv (name value / odv)
  174.   (setq odv (getvar name))
  175.   (if (not (assoc name *syl*));判断是否有
  176.     (setq *syl* (append *syl* (list (cons name odv))))
  177.   )
  178.   (setvar name value)
  179.   odv
  180. )

  181. ;程序结束
  182. (defun comb ()
  183.   (xx-unsetvars)
  184.   (setq *error* *x-r*)
  185.   (xx-EndUndo);标记结束
  186.   (princ)
  187. )

  188. ;错误处理
  189. (defun *x-er*(msg)
  190.   (if(and msg (/= msg "Function cancelled"))
  191.     (prompt (strcat "Error: " msg))
  192.     (princ)
  193.   )
  194.   (comb)
  195.   (princ)
  196. )

  197. ;还原变量
  198. (defun xx-unsetvars ()
  199.   (foreach v *syl* (setvar (car v) (cdr v)))
  200. )
  201. ;标记开始
  202. (defun xx-StartUndo ()
  203.   (vla-startundomark (xx-doc))
  204. )
  205. ;标记结束
  206. (defun xx-EndUndo nil
  207.   (vla-endundomark (xx-doc))
  208. )

  209. ;CAD对象
  210. (defun xx-acad nil
  211.   (eval (list 'defun 'xx-acad 'nil (vlax-get-acad-object)))
  212.   (xx-acad)
  213. )
  214. ;当前激活的文档
  215. (defun xx-doc  nil
  216.   (eval  (list 'defun 'xx-doc 'nil(vla-get-activedocument (xx-acad))))
  217.   (xx-doc)
  218. )

  219. ;清除前一选择集
  220. (defun xx-VlaPu (/ x)
  221.   (if(not(vl-catch-all-error-p(setq x(vl-catch-all-apply 'vla-item
  222.        (list (vla-get-selectionsets (vla-get-activedocument (xx-acad))) "CURRENT")))))
  223.     (vla-delete x)
  224.   )
  225.   (princ)
  226. )

  227. ;程序开头用
  228. ;(xx-princA txt);txt为要显示的部分内容  例如:(xx-princA "坐标标注")
  229. ;字符用了表转字符串,再用字符串转表的方法
  230. (defun xx-princA (txt)
  231.   (princ
  232.    (strcat
  233.     (vl-list->string '(10 161 190 236 197 207 232 67 65 68 178 229 188 254 161 191 45 45 45))
  234.       txt
  235.     (vl-list->string '(185 166 196 220 32))
  236.     (vl-list->string '(32 32 32 81 81 58 50 51 54 51 54 55 51 53 51 52))
  237.    )
  238.   )
  239. )
  240. ;命令行显示
  241. ;(xx-princ txt);txt为要显示功能
  242. (defun xx-princ (txt)
  243. (princ (strcat "\n-->请确定" txt ":"))
  244. (princ)
  245. )

  246. ;程序结束用
  247. ;(xx-princB txt1 txt2);txt1为要显示功能  txt2为要显示命令
  248. ;(xx-princB "标注" "AD")
  249. ;字符用了表转字符串,再用字符串转表的方法
  250. (defun xx-princB (txt1 txt2 / txt)
  251.   (princ
  252.     (strcat
  253.      (vl-list->string '(10 161 190 236 197 207 232 67 65 68 178 229 188 254 161 191 45 45 45 185 166 196 220 58))
  254.        txt1
  255.      (vl-list->string '(44 40 195 252 193 238 58))
  256.        txt2
  257.      (vl-list->string '(41 44 215 247 213 223 58 161 190 236 197 207 232 161 191 163 172 81 81 58 50 51 54 51 54 55 51 53 51 52))
  258.     )
  259.   )
  260. (princ)
  261. )
  262. (princ)




论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-12-31 13:21:23 | 显示全部楼层
好东西,学习下{:soso_e113:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-12-31 13:57:28 | 显示全部楼层
硬改硬算啊!   

点评

一时的思路,欢迎提供更好的思路,反应器除外  详情 回复 发表于 2013-12-31 14:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-12-31 13:59:23 | 显示全部楼层
画圆中心线的代码不用这么长吧,这个有什么特别之处?

点评

这个只是个例子,模仿反应器用,图元与图元之间的关系  详情 回复 发表于 2013-12-31 15:56
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-12-31 14:02:34 | 显示全部楼层
好长呀...{:soso_e127:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

 楼主| 发表于 2013-12-31 14:57:33 | 显示全部楼层

一时的思路,欢迎提供更好的思路,反应器除外
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-12-31 15:06:45 | 显示全部楼层
flyfox1048 发表于 2013-12-31 13:59
画圆中心线的代码不用这么长吧,这个有什么特别之处?

后面的是通用函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

 楼主| 发表于 2013-12-31 15:56:48 | 显示全部楼层
flyfox1048 发表于 2013-12-31 13:59
画圆中心线的代码不用这么长吧,这个有什么特别之处?

这个只是个例子,模仿反应器用,图元与图元之间的关系
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

发表于 2014-1-31 12:58:42 | 显示全部楼层
新年礼物@:D
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2014-4-16 15:26:55 | 显示全部楼层
好程序,感谢分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-1 21:37 , Processed in 0.455377 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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