找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1420|回复: 6

[LISP程序]:重叠arc合并的初步调试代码!请指正!

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-6-8 10:26:53 | 显示全部楼层 |阅读模式

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

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

×
大体算法为从一列同心弧中0度开始从小到大逆时针搜索
如有重叠就更新对应表中数据没有重叠就表中数据用更新图元!

算法漏洞:比如0~1/2圆与3/4~1/4圆不能合并!
请各位大哥指点一二提供思路感激不尽!

  1. (defun dxf (x en)
  2.   (cdr (assoc x (entget en)))
  3. )
  4. (defun aona (a b)                        ;共圆识别
  5.   (and (equal (dxf 40 a) (dxf 40 b) 0.0001)
  6.        (equal (dxf 10 a) (dxf 10 b) 0.0001)
  7.   )
  8. )
  9. ;;由arc图元名->(图元名 点弧1 点弧2)
  10. (defun a->ap1p2        (a / ed sd)
  11.   (setq ed (dxf 51 a))
  12.   (setq sd (dxf 50 a))
  13.   (list        a
  14.         sd
  15.         (if (< ed sd)
  16.           (+ ed (* 2 pi))
  17.           ed
  18.         )
  19.   )
  20. )
  21. (defun list-list (a b)                        ;a表与表b之差
  22.   (foreach tmp b (setq a (vl-remove tmp a)))
  23. )
  24. (defun lst-a (lsta / a1 a1lst a2lst lstxy on-a1)
  25.   (while (setq a1 (car lsta))
  26.     (setq on-a1        (cons a1
  27.                       (vl-remove-if-not
  28.                         '(lambda (x) (aona a1 x))
  29.                         (cdr lsta)
  30.                       )
  31.                 )
  32.     )
  33.     ;;on-a1 是与a1共圆的一列表
  34.     (setq lsta (list-list lsta on-a1))
  35.     (setq a1lst (mapcar 'a->ap1p2 on-a1))
  36.     (setq a2lst (vl-sort a1lst '(lambda (a b) (< (cadr a) (cadr b)))))
  37.     (a+a a2lst)
  38.   )
  39. )
  40. ;;以新的(arc p1 p2) 来更新arc
  41. (defun entmodlist (ap1p2 / a51 a50 alist ass51)
  42.   (setq a51 (caddr ap1p2))
  43.   (setq a50 (cadr ap1p2))
  44.   (setq alist (entget (car ap1p2)))
  45.   (if (> (- a51 a50) (* 2 pi))
  46.     (progn
  47.       (entdel (car ap1p2))
  48.       (entmakex
  49.         (cons
  50.           '(0 . "circle")
  51.           (mapcar 'assoc '(8 10 40) (list alist alist alist))
  52.         )
  53.       )
  54.     )
  55.     (progn
  56.       (if (> a51 (* 2 pi))
  57.         (setq a51 (rem a51 (* 2 pi)))
  58.       )
  59.       (setq a51          (cons 51 (caddr ap1p2))
  60.             alist (entget (car ap1p2))
  61.             ass51 (assoc 51 alist)
  62.             alist (subst a51 ass51 alist)
  63.       )
  64.       (entmod alist)
  65.     )
  66.   )
  67.   (setq md 0)
  68. )
  69. ;;处理一系列共圆对像列表
  70. (defun a+a (aplis / als b ea eb k sb)
  71.   (setq k 0)
  72.   (setq als (car aplis))
  73.   (repeat (1- (length aplis))
  74.     (setq b (nth (setq k (1+ k)) aplis))
  75.     (setq ea (caddr als)
  76.           sa (cadr als)
  77.           sb (cadr b)
  78.           eb (caddr b)
  79.     )
  80.     (cond
  81.       ((> (- sb ea) 1e-5)
  82.        (if
  83.          (= md 1)
  84.           (entmodlist als)
  85.        )
  86.        (setq als b)
  87.       )
  88.       ((< ea eb)
  89.        (setq als (subst (caddr b) (caddr als) als)
  90.              md         1
  91.        )
  92.        (entdel (car b))
  93.       )
  94.       ((>= ea eb)
  95.        (entdel (car b))
  96.       )
  97.     )
  98.   )
  99.   (if (= md 1)
  100.     (entmodlist als)
  101.   )
  102. )
  103. (defun c:aanda (/ en n ss ssarc t1 time)
  104.   (setq ss (ssget '((0 . "arc"))))
  105.   (setq t1 (getvar "date"))
  106.   (setq n 0)
  107.   (repeat (sslength ss)
  108.     (setq en (ssname ss n))
  109.     (setq ssarc (cons en ssarc))
  110.     (setq n (1+ n))
  111.   )
  112.   (command ".undo" "be")
  113.   (lst-a ssarc)
  114.   (setq time (rtos (- (getvar "date") t1) 2 16))
  115.   (command ".undo" "e")
  116.   (if (= time "0")
  117.     (princ " > 程序太快了啦没啥用时啦!")
  118.     (princ (strcat " > 用时:"
  119.                    (menucmd (strcat "m=$(edtime,"
  120.                                     time
  121.                                     ",hh:mm:ss:msec)"
  122.                             )
  123.                    )
  124.            )
  125.     )
  126.   )
  127.   (princ)
  128. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-6-10 12:45:58 | 显示全部楼层
程序确实对大部分的重叠圆弧是可以的。
我认为这个不能合并的主要问题出在:圆弧角度定义的特殊性,跨越0度线会有些意外
当圆跨越x轴,比如起始是300度,终点是10度的时候,它会把终点定为370度,此时
(< ea eb)就不一定成立
必须增加一些改进措施来对这些穿过0度线的圆弧角度进行修正,应该就可以的。
否则这种情况下,会产生md=0而无法进行更新的情况。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-6-10 21:52:06 | 显示全部楼层
重叠圆弧首先要圆心重叠,半径相等,然后就是判断角度。ARC 用的是ECS,而且角度总是逆时针
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

 楼主| 发表于 2006-6-13 11:08:09 | 显示全部楼层
雨箭风刀  兄你的测试图我试过了请用我最新发布的:合并重元
http://www.xdcad.net/forum/showthread.php?s=&threadid=567208

命令: xz
指定直线合并时允许座标间隙<0.001>:
指定圆弧合并时允许角度间隙<1°>:
选择对象: 指定对角点: 找到 18 个

选择对象:

选取了:< 18 >合并了:< 13 > 用时:00:00:00:050

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 10:31 , Processed in 0.494484 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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