乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 193|回复: 11

消除重复的直线、圆弧

[复制链接]

49

主题

141

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
338
发表于 2015-8-4 19:55:00 | 显示全部楼层 |阅读模式
对直线的消除重线算法,会将直线转换为了f(x)=kx+b的形式;对于由多个圆心及半径相同的圆弧而组成的圆形,消除重线时会出现错误的效果(正确的应该是组成一个完整的圆),Express中的Overkill命令也有这个问题,这里给出的不是完善的源码,已完善的程序已集成在中。
;;; *****消除重线 程序开始*****
(defun C:T1 ()
  (princ
    "\n★功能:删除重复的直线、圆弧.\n提示:只可删除在相同图层的重线!"
  )
  (setvar "cmdecho" 0)
  (setvar "plinewid" 0)
  (command "undo" "be")
  (vl-load-com)
  (setq ss (ssget '((0 . "ARC,LINE"))))
  (princ "\n--->程序进行中,请稍后...\n")
  (if ss
    (hbzhx ss)
    (progn (princ "\n提示:未选取对象.") (exit))
  )
  (command "undo" "e")
  (alert "\n提示:消除重线完成!\n")
  (princ)
)
(defun cs_pross        (to i / CS_TEXT MYI)
  (setq cs_text ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
  (setq        myi        (fix (/ (* (strlen cs_text) i) to))
        cs_text        (substr cs_text 1 myi)
  )
  (grtext -2 cs_text)
)
(defun hbzhx (ss /)
  (grtext -2 "正在整理数据")
  (initget 4)
  (if (not (setq jd (getreal "\n输入精度要求:\n")))
    (setq jd 1e-4)
  )
  (setq        i 0
        line_list '()
        arc_list '()
  )
  (repeat (sslength ss)
    (setq ent (ssname ss i)
          i   (1+ i)
    )
    (setq obj (vlax-ename->vla-object ent))
    (if        (> (vlax-curve-getdistatparam obj (vlax-curve-getendparam obj))
           jd
        )
      (if (= "LINE" (cdr (assoc 0 (entget ent))))
        (setq line_list (cons (line_data ent) line_list))
        (setq arc_list (cons (arc_data ent) arc_list))
      )
    )
  )
  (setq        line_list
         (vl-sort
           line_list
           '(lambda (e1 e2)
              (if (equal (car e1) (car e2) jd)
                (if (equal (cadr e1) (cadr e2) jd)
                  (if (equal (car (caddr e1)) (car (caddr e2)) jd)
                    ( (length line_list) 0)
    (setq xuhao (1+ xuhao))
    (cs_pross zongshu xuhao)
    (setq line_a    (car line_list)
          line_list (cdr line_list)
          biaoji    t
          k            (car line_a)
          b            (cadr line_a)
          p1            (caddr line_a)
          p2            (cadddr line_a)
          ent            (last line_a)
          lay            (cdr (assoc 8 (entget ent)))
    )
    (while (and        biaoji
                (> (length line_list) 0)
           )
      (setq line_b (car line_list))
      (cond
        ((and (equal k (car line_b) jd)
              (equal b (cadr line_b) jd)
              (= lay (cdr (assoc 8 (entget (last line_b)))))
         )
         (setq p3 (caddr line_b)
               p4 (cadddr line_b)
               p5 (vl-sort (list p1 p2 p3 p4)
                           '(lambda (e1 e2)
                              (if (equal (car e1) (car e2) jd)
                                ( (length arc_list) 0)
    (setq xuhao (1+ xuhao))
    (cs_pross zongshu xuhao)
    (setq arc_a           (car arc_list)
          arc_list (cdr arc_list)
          biaoji   t
          bj           (car arc_a)
          pc           (list (cadr arc_a) (caddr arc_a))
          sangl           (cadddr arc_a)
          eangl           (nth 4 arc_a)
          ent           (last arc_a)
          lay           (cdr (assoc 8 (entget ent)))
    )
    (while (and        biaoji
                (> (length arc_list) 0)
           )
      (setq arc_b (car arc_list)
      )
      (cond
        ((and (equal bj (car arc_b) jd)
              (equal pc (list (cadr arc_b) (caddr arc_b)) jd)
              (= lay (cdr (assoc 8 (entget (last arc_b)))))
         )
         (setq sangl1 (cadddr arc_b)
               eangl1 (nth 4 arc_b)
               p5     (vl-sort (list sangl eangl sangl1 eangl1)
                               '(lambda        (e1 e2)
                                  (vla-object ent)
   p1 (vlax-curve-getstartpoint obj)
        p2 (vlax-curve-getendpoint obj)
  )
  (if (equal (car p1) (car p2) jd)
    (setq k nil
          b (car p1)
    )
    (setq k (/ (- (cadr p2) (cadr p1))
               (- (car p2) (car p1))
            )
          b (- (cadr p1) (* (car p1) k))
    )
  )
  (setq        p2 (vl-sort (list p1 p2)
                    '(lambda (e1 e2)
                       (if (equal (car e1) (car e2) jd)
                         (演示

nz5ybjyxy5w.gif

nz5ybjyxy5w.gif

回复

使用道具 举报

1

主题

3

帖子

3

银币

初来乍到

Rank: 1

铜币
7
发表于 2017-11-17 11:39:00 | 显示全部楼层
这个有个问题,能否先把短线直接删除,而不是用点坐标判断后再附值到一根线中?
回复

使用道具 举报

2

主题

17

帖子

2

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-4-17 12:09:00 | 显示全部楼层
挺好用得,大佬能帮忙改下下吗?不管是不是同一个图层都能除去重复的。谢谢您
回复

使用道具 举报

74

主题

1603

帖子

24

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1906
发表于 2017-11-18 11:21:00 | 显示全部楼层
;; 直线共线合并是不是也算消重?

vii5fhdhvcq.gif

vii5fhdhvcq.gif


回复

使用道具 举报

1

主题

13

帖子

3

银币

初来乍到

Rank: 1

铜币
48
发表于 2022-7-26 10:15:00 | 显示全部楼层
高级顶顶高级顶顶
回复

使用道具 举报

0

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
3
发表于 2022-4-18 15:48:00 | 显示全部楼层
感谢,,,学习学习了
回复

使用道具 举报

8

主题

39

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
71
发表于 2021-11-19 21:23:00 | 显示全部楼层

谢谢楼主分享
回复

使用道具 举报

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
6
发表于 2020-9-20 08:57:00 | 显示全部楼层
我也编了一个这样的程序,只是只限于直线,这个程序更牛
回复

使用道具 举报

1

主题

20

帖子

6

银币

初来乍到

Rank: 1

铜币
24
发表于 2020-9-19 23:05:00 | 显示全部楼层
学习一下 111
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
1
发表于 2020-6-10 17:21:00 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 01:20 , Processed in 0.471305 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表