找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 6431|回复: 36

[求助] [求助]:怎样清除多义线(lwpolyline)上的重复点?

[复制链接]
发表于 2005-9-26 09:02:44 | 显示全部楼层 |阅读模式

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

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

×
http://www.xdcad.net/forum/showthread.php?s=&threadid=465098
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-9-26 10:28:13 | 显示全部楼层 |阅读模式

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

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

×
我的做法是:
得到多义线的所有节点,去掉重复点后,重画。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2005-9-26 14:57:22 | 显示全部楼层
[QUOTE]最初由 PLgis 发布
[B]我的做法是:
得到多义线的所有节点,去掉重复点后,重画。 [/B][/QUOTE

你的方法对于我不适用,我现在已经从图形中提出了顶点总数和顶点坐标,顶点总数是187个,但是顶点坐标提出来是186个。我发现有两个顶点坐标是一样的,但是,提取顶点坐标时,把重复的点只提取了一个坐标。我现在要计算去掉重复点后点的总数和坐标!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-27 10:34:07 | 显示全部楼层
petertian: 我不知道你是如何提取的顶点坐标。如果不做特殊处理,应该会把所有顶点(包括坐标重复的顶点)的坐标都提取出来的,正因为如此,我们才知道有重复的顶点。
如果“提取顶点坐标时,把重复的点只提取了一个坐标。”,不正好达到了“我现在要计算去掉重复点后点的总数和坐标!”的目的了吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-27 13:13:07 | 显示全部楼层
最初由 petertian 发布
[B][QUOTE]最初由 PLgis 发布
[B]我的做法是:
得到多义线的所有节点,去掉重复点后,重画。 [/B][/QUOTE

你的方法对于我不适用,我现在已经从图形中提出了顶点总数和顶点坐标,顶点总数是187个,但是顶点?.. [/B]

可以参考下面这个程序:
  1. [FONT=courier new];;;加载通用函数
  2. ;;;下载:[url]http://www.xdcad.net/forum/showthread.php?s=&threadid=325268[/url]
  3. (load "xyp_lib")

  4. ;|
  5. ;;;功能 : 多义线顶点序号及坐标标注,可输出坐标数据到文本文件。
  6. 适用于 POLYLINE 及 LWPOLYLINE 图元 <lmf97231>
  7. 多义线编号--起始点随意选
  8. 在对管线(多义线)用LISP程序进行自动编号和座标计算时,有时需要编号顺时针递增,
  9. 有时又需要编号逆时针递增,在选取多义线时,通过选取点来确定编号方向,也就是说当
  10. 选取左半部分时从左往右开始,选取右半部分时从右往左开始。
  11. 2005.02.26 根据<xxming>的要求,修改标注闭合多义线存在的问题
  12. 2005.04.29 增加输出坐标数据到文本文件功能
  13. |;
  14. (defun c:test065 ()
  15.   (CMDLA0)
  16.   (setbl)
  17.   (jzhz)
  18.   (setq        tx1 (UKWORD 1 "1 2" "\n确定顶点顺序 : 1-正向/2-反向" tx1)
  19.         tx2 (UKWORD 1 "Y N" "\n是否输出顶点坐标数据:Y-是/N-否" tx2)
  20.   )
  21.   (if (= tx2 "Y")
  22.     (setq ffn (getfiled "\n保存的坐标文件" "坐标" "txt" 1)
  23.           ff  (open ffn "w")
  24.     )
  25.   )
  26.   (while (setq s1 (entsel "\n选择对象<退出> : "))
  27.     (setq en (car s1))
  28.     (if        (or (= (DXF 0 (entget en)) "POLYLINE")
  29.             (= (DXF 0 (entget en)) "LWPOLYLINE")
  30.         )
  31.       (progn
  32.         (setq eobj (vlax-ename->vla-object en)
  33.               i           -1
  34.         )
  35.         (if (= tx1 "1")                        ;正向
  36.           (progn
  37.             (while
  38.               (setq pt0 (vlax-curve-getPointAtParam eobj (setq i (1+ i))))
  39.                (princ)
  40.             )
  41.             (if        (or (= (DXF 70 (entget en)) 1)
  42.                     (equal (vlax-curve-getEndPoint en)
  43.                            (vlax-curve-getstartPoint en)
  44.                     )
  45.                 )
  46.               (setq n (- i 1))
  47.               (setq n i)
  48.             )
  49.             (setq i -1)
  50.             (repeat n
  51.               (setq pt0 (vlax-curve-getPointAtParam eobj (setq i (1+ i))))
  52.               (MKLA "坐标编号" 1)
  53.               (command "text"
  54.                        "j"
  55.                        "mr"
  56.                        (polar pt0 (* pi 0.75) (* sc 200))
  57.                        (* sc 400)
  58.                        "0"
  59.                        (rtos (+ 1 i) 2 0)
  60.               )
  61.               (MKLA "坐标" 3)
  62.               (X_zb pt0)
  63.               (if (= tx2 "Y")
  64.                 (wr-tx pt0 ff)
  65.               )
  66.             )
  67.           )
  68.           ;;反向
  69.           (progn
  70.             (while
  71.               (setq pt0 (vlax-curve-getPointAtParam eobj (setq i (1+ i))))
  72.                (princ)
  73.             )
  74.             (if        (or (= (DXF 70 (entget en)) 1)
  75.                     (equal (vlax-curve-getEndPoint en)
  76.                            (vlax-curve-getstartPoint en)
  77.                     )
  78.                 )
  79.               (setq n (- i 1))
  80.               (setq n i)
  81.             )
  82.             (setq i -1)
  83.             (repeat n
  84.               (setq pt0 (vlax-curve-getPointAtParam eobj (setq i (1+ i))))
  85.               (MKLA "坐标编号" 1)
  86.               (command "text"
  87.                        "j"
  88.                        "mr"
  89.                        (polar pt0 (* pi 0.75) (* sc 200))
  90.                        (* sc 400)
  91.                        "0"
  92.                        (rtos n 2 0)
  93.               )
  94.               (setq n (1- n))
  95.               (MKLA "坐标" 3)
  96.               (X_zb pt0)
  97.               (if (= tx2 "Y")
  98.                 (wr-tx pt0 ff)
  99.               )
  100.             )
  101.           )
  102.         )
  103.       )
  104.     )
  105.   )
  106.   (if (= tx2 "Y")
  107.     (progn
  108.       (close ff)
  109.       (princ (strcat "\n 坐标写至=>" ffn))
  110.     )
  111.   )
  112.   (CMDLA1)
  113. )
  114. (defun wr-tx (point filename / tx)
  115.   (setq        tx (strcat (rtos (car point) 2)
  116.                    " "
  117.                    (rtos (cadr point) 2)
  118.                    " "
  119.                    (rtos (caddr point) 2)
  120.            )
  121.   )
  122.   (write-line tx filename)
  123. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

 楼主| 发表于 2005-9-27 18:57:16 | 显示全部楼层
最初由 xyp1964 发布
[B][QUOTE]最初由 petertian 发布
[B][QUOTE]最初由 PLgis 发布
[B]我的做法是:
得到多义线的所有节点,去掉重复点后,重画。 [/B][/QUOTE

你的方法对于我不适用,我现在已经从图形中提出了顶点总... [/B]


回斑竹,我现在又出现新的问题了,他们需要我的图内lwpolyline不能有重复顶点,我还得删掉lwpolyline上的重复顶点,我用lisp怎么解决?谢谢斑竹!集!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-27 20:51:59 | 显示全部楼层
  1. [FONT=courier new](defun c:test (/ ss i s1)
  2.   (setq        ss (ssget "X" '((0 . "*POLYLINE") (70 . 0)))
  3.         i  -1
  4.   )
  5.   (if ss
  6.     (repeat (sslength ss)
  7.       (setq s1 (ssname ss (setq i (1+ i))))
  8.       (if (equal (vlax-curve-getEndPoint s1)
  9.                  (vlax-curve-getstartPoint s1)
  10.           )
  11.         (command "pedit" s1 "c" "")
  12.       )
  13.     )
  14.   )
  15.   (princ)
  16. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2005-9-28 10:47:52 | 显示全部楼层
最初由 xyp1964 发布
[B][CODE](defun c:test (/ ss i s1)
  (setq        ss (ssget "X" '((0 . "*POLYLINE") (70 . 0)))
        i  -1
  )
  (if ss
    (repeat (sslength ss)
      (setq s1 (ssname ss (setq i (1+ i))))
... [/B]


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

使用道具 举报

发表于 2005-9-28 11:14:56 | 显示全部楼层
试一下这个:
[PHP]
(defun hy_delcfvetex(en / o1list o1listx pos);;删除重复顶点
  (if (setq o1list (hy_listdoublep (entget en) t))
     (progn (foreach item o1list (if (= (car item) 10)
                  (progn (setq pos (vl-position item (entget en)))
                     (setq o1listx (hy_addnth item pos (vl-remove item (entget en))))
                )
                )
       )
       (entmod o1listx)
     )
     )
  )

(defun hy_listdoublep(lip do / u item nlist);;判断列表重复项
  (if (/= lip nil)
    (progn
   (setq nlist nil)
  (setq u 0)
  (repeat (length lip)
    (setq item (nth u lip))
    (if (< (length(vl-remove item lip))
       (- (length lip) 1)
       )
        (setq nlist (cons item nlist))
      )
    (setq u (1+ u))
    )
    (if do (hy_erasedouble (reverse nlist))
      (reverse nlist))
    )
  )
  )
(defun hy_erasedouble(nlist / needlist);;;?删除表重复项保留一项
  (setq needlist nlist)
  (foreach item nlist (setq needlist (append (list item) (vl-remove item needlist)))
    )
  (reverse needlist))
(defun hy_addnth(new n oldlist / alist blist);;在指定位置插入项
  (setq alist nil)
  (setq i 0)
  (repeat n
    (setq alist (cons (nth i oldlist) alist))
    (setq i (1+ i))
    )
  (setq alist (reverse alist))
  (setq i n)
  (setq blist nil)
  (repeat (- (length oldlist) n)
    (setq blist (cons (nth i oldlist) blist))
    (setq i (1+ i))
    )
  (setq blist (reverse blist))
  (append alist (list new) blist)
  )
[/PHP]
执行(hy_delcfvetex EN)EN为需要删除顶点的复线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2005-9-28 11:20:56 | 显示全部楼层
提个相关的问题:
如果多义线中有一段较长的直线,被分成许多小段,如何去掉这些中间点让他成为一根长的直线段。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-28 11:23:11 | 显示全部楼层
最初由 舟自横 发布
[B]试一下这个:
[PHP]
(defun hy_delcfvetex(en / o1list o1listx pos);;删除重复顶点
  (if (setq o1list (hy_listdoublep (entget en) t))
     (progn (foreach item o1list (if (= (car item) 10)
        ... [/B]


舟自横大虾,您好,您的程序还是不行,我的lwpolyline是封闭的,并且压缩后有7兆,想将实验数据传上去还不行(太大),您能否告诉我您的QQ号码或邮箱,我将实验数据发给您!

舟自横大虾,您好,您的程序对于闭合多义线(lwpolyline)不起作用,删除不掉重复顶点!只对不闭合的lwpolyline可以取掉重复顶点!闭合的lwpolyline怎么办?谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-28 12:52:23 | 显示全部楼层
我见过一个。。。。。先占个座位,回头在理会:)

来拉~~~~。在网上掏的,看看效果

多义线瘦身程序: simpl
支持 删除重复点,
支持 距离阈值(阈值内的顶点合并或取消)
支持 角度阈值 (阈值内有角度偏差的自动拉直)
对宽度变化的部分跳过不处理(认为是外形不同)
类似闭合的线自动闭合,并消除最后一个顶点。


点击链接看清楚
http://www.xdcad.net/article/upl ... 928185651_simpl.swf


[swf w=600 h=450]http://www.xdcad.net/article/upload/file/194606_20050928185651_simpl.swf[/swf]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-28 14:04:04 | 显示全部楼层
最初由 petertian 发布
[B][QUOTE]最初由 舟自横 发布
[B]试一下这个:
[PHP]
(defun hy_delcfvetex(en / o1list o1listx pos);;删除重复顶点
  (if (setq o1list (hy_listdoublep (entget en) t))
     (progn (foreach item o1... [/B]

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 12:05 , Processed in 0.221228 second(s), 62 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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