找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1613|回复: 10

[原创]:生成边界轮廓线程序,可以支持spline ellipse insert

[复制链接]
发表于 2003-9-14 00:32:56 | 显示全部楼层 |阅读模式

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

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

×
  1. [font=courier]
  2. ;;边界轮廓线
  3. (vl-load-com)
  4. (defun c:yad_outline(/ viewpt maxmin spl2arc ss_add os cor qa ss n pt1 pt2 l_pt dis ent m)
  5.   (defun viewpt(/ a b c d x)
  6.     (setq b (getvar "viewsize") c (car (getvar "screensize")) d (cadr (getvar "screensize"))
  7.           a (* b (/ c d)) x (setq x (getvar "viewctr")) x (trans x 1 2) c (list (- (car x)  (/ a 2.0)) (- (cadr x) (/ b 2.0)) 0.0)
  8.           d (list (+ (car x) (/ a 2.0)) (+ (cadr x) (/ b 2.0)) 0.0) c (trans c 2 1) d (trans d 2 1)
  9.     )
  10.     (list c d)
  11.   )
  12.   (defun maxmin(lst / x n a b c d)
  13.     (setq x (car lst) a (car x) b (cadr x) c (car x) d (cadr x) n 1)
  14.     (repeat (max (- (length lst) 1) 0)
  15.       (setq x (nth n lst) a (min a (car x)) b (min b (cadr x)) c (max c (car x)) d (max d (cadr x)))
  16.       (setq n (1+ n))
  17.     )
  18.     (list (list a b) (list c d))
  19.   )
  20.   (defun spl2arc(ent / obj len num spt ept ss i pt1 pt2 pt3 s)
  21.     (setq obj (vlax-ename->vla-object ent)
  22.           len (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj))
  23.           num (1+ (fix (/ len dis)))
  24.           num (if (= num 1) 2 num)
  25.           spt (vlax-curve-getStartPoint obj)
  26.           ept (vlax-curve-getEndPoint obj)
  27.     )
  28.     (command "_.divide" ent (* 2 num))
  29.     (setvar "cecolor" "1")
  30.     (setq ss (ssget "_p"))
  31.     (if (equal spt ept)
  32.       (setq i 1)
  33.       (setq i 0)
  34.     )
  35.     (setq pt3 spt)
  36.     (setq s (ssadd))
  37.     (repeat num
  38.       (setq pt2 (cdr (assoc 10 (entget (ssname ss i)))))
  39.       (if (/= num (/ (+ i 2) 2))
  40.         (setq pt1 (cdr (assoc 10 (entget (ssname ss (1+ i))))))
  41.         (setq pt1 ept)
  42.       )
  43.       (command "_.arc" pt3 pt2 pt1)
  44.       (ssadd (entlast) s)
  45.       (setq pt3 pt1)
  46.       (setq i (+ 2 i))
  47.     )
  48.     (command "_.erase" ss ent "")
  49.     (setvar "cecolor" "188")
  50.     s
  51.   )
  52.   (defun ss_add(s1 s2 / n)
  53.     (setq n -1)
  54.     (repeat (sslength s1)
  55.       (ssadd (ssname s1 (setq n (1+ n))) s2)
  56.     )
  57.     s2
  58.   )
  59.   (prompt "\n请选择要生成边界轮廓线的所有对象(图块轮廓要闭合):")
  60.   (if (setq ss (ssget '((0 . "line,arc,circle,*polyline,spline,ellipse,insert"))))
  61.     (progn
  62.       (command "_.undo" "_be")
  63.       (setq os (getvar "osmode")
  64.             cor (getvar "cecolor")
  65.             qa (getvar "qaflags")
  66.       )
  67.       (setvar "osmode" 0)
  68.       (setvar "cmdecho" 0)
  69.       (setq n -1)
  70.       (repeat (sslength ss)
  71.         (vla-getboundingbox (vlax-ename->vla-object (ssname ss (setq n (1+ n)))) 'pt1 'pt2)
  72.         (setq l_pt (append l_pt (list (vlax-safearray->list pt1) (vlax-safearray->list pt2))))
  73.       )
  74.       (setq l_pt (maxmin l_pt)
  75.             pt1 (car l_pt)
  76.             pt2 (cadr l_pt)
  77.             dis (/ (distance pt1 pt2) 20)
  78.             pt1 (polar pt1 (angle pt2 pt1) dis)
  79.             pt2 (polar pt2 (angle pt1 pt2) dis)
  80.       )
  81.       (setq l_pt (maxmin (append (viewpt) (list pt1 pt2))))
  82.       (command "_.zoom" "_w" (car l_pt) (cadr l_pt))
  83.       (setvar "cecolor" "188")
  84.       (command "_.rectang" pt1 pt2)
  85.       (setq ent (entlast))
  86.       (command "_.boundary" "_a" "_o" "_r" "_i" "_y" "_b" "_n" ent ss "" "" (polar pt1 (angle pt1 pt2) (/ dis 2)) "")
  87.       (if (equal (entlast) ent)
  88.         (progn
  89.           (entdel ent)
  90.           (prompt "\n没有边界轮廓线!")
  91.         )
  92.         (progn
  93.           (entdel ent)
  94.           (command "_.erase" (ssget "c" pt1 pt1 '((0 . "region") (62 . 188))) "")
  95.           (setq m 0)
  96.           (if (setq ss (ssget "x" '((0 . "region") (62 . 188))))
  97.             (progn
  98.               (command "_.union" ss "")
  99.               (entmod (subst (cons 62 1) (cons 62 188) (entget (setq ent (entlast)))))
  100.               (command "_.explode" ent)
  101.               (setq ss (ssget "_p"))
  102.               (if (= (cdr (assoc 0 (entget (ssname ss 0)))) "REGION")
  103.                 (progn
  104.                   (setvar "qaflags" 1)
  105.                   (command "_.explode" ss "")
  106.                   (setq ss (ssget "_p"))
  107.                 )
  108.               )
  109.               (if (ssget "p" '((0 . "spline,ellipse")))
  110.                 (progn
  111.                   (setq dis (abs (if (setq dis (getreal "\n请输入样条曲线或椭圆的取样距离:<600>")) dis 600.0)))
  112.                   (if (= dis 0.0) (setq dis 600.0))
  113.                 )
  114.               )
  115.               (setq n -1)
  116.               (repeat (sslength ss)
  117.                 (setq ent (ssname ss (setq n (1+ n)))
  118.                       name (cdr (assoc 0 (entget ent)))
  119.                 )
  120.                 (if (or (= name "SPLINE") (= name "ELLIPSE"))
  121.                   (progn
  122.                     (ssdel ent ss)
  123.                     (setq ss (ss_add (spl2arc ent) ss))
  124.                     (setq n (1- n))
  125.                   )
  126.                 )
  127.               )
  128.               (setq n -1)
  129.               (while (setq ent (ssname ss (setq n (1+ n))))
  130.                 (if (entget ent)
  131.                   (progn
  132.                     (command "_.pedit" ent "_y" "_j" ss "" "")
  133.                     (setq m (1+ m))
  134.                   )
  135.                 )
  136.               )
  137.             )
  138.           )
  139.           (if (setq ss (ssget "x" '((0 . "*polyline") (62 . 188))))
  140.             (progn
  141.               (setq n -1)
  142.               (repeat (sslength ss)
  143.                 (entmod (subst (cons 62 1) (cons 62 188) (entget (ssname ss (setq n (1+ n))))))
  144.               )
  145.               (setq m (+ m (sslength ss)))
  146.             )
  147.           )
  148.           (if (= m 0)
  149.             (prompt "\n没有边界轮廓线!")
  150.             (prompt (strcat "\n生成" (itoa m) "条边界轮廓线!"))
  151.           )
  152.         )
  153.       )
  154.       (setvar "osmode" os)
  155.       (setvar "cecolor" cor)
  156.       (setvar "qaflags" qa)
  157.       (command "_.undo" "_e")
  158.     )
  159.   )
  160.   (princ)
  161. )
  162. (prompt "\n***边界轮廓线yad_outline***  YAD建筑")
  163. (princ)
  164. [/font]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-9-14 13:05:22 | 显示全部楼层
有什么用??试试cad自己的命令BOUNDARY
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-9-14 22:09:16 | 显示全部楼层
最初由 aaddff 发布
[B]有什么用??试试cad自己的命令BOUNDARY [/B]


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

使用道具 举报

 楼主| 发表于 2003-9-15 10:08:38 | 显示全部楼层
这只是提供一种实现的lisp途径。
你可以做为片段代码插入你的程序!
当然你如果只是使用且不怕麻烦的话可以用BOUNDARY,
我贴出来只要是因为这里是开发技术讨论!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2003-9-19 15:35:00 | 显示全部楼层
楼主很厉害啊,等我研究研究。楼主最好讲下编写思路?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 35个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 204个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 204个

财富等级: 日进斗金

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 14:21 , Processed in 0.420695 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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