找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: god

[编程申请]:有没有把短线合成长线的工具

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-22 22:22:15 | 显示全部楼层
最初由 aeo 发布
[B]是地形图呀
扫描后矢量化的,都这样的
真有好办法就好了 [/B]


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

使用道具 举报

发表于 2002-11-22 23:00:46 | 显示全部楼层
可以试一下用多段线重描一遍,尔后将碎线删除。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2002-11-23 08:38:11 | 显示全部楼层
最初由 znyjszx 发布
[B]可以试一下用多段线重描一遍,尔后将碎线删除。 [/B]

不要或者很少代码即可:

1 如果是单多义线
xdrx_curve_getpoint 得到起点和终点,用xdrx_line1 连线,entdel多义线,这个可以选择集处理

2 碎线麻烦点,可以先对近似直线的连接,然后按 1 处理
或者用xdrx_entity_box得到最大包围盒,用线上的点连线,然后删除选择集

3 用删除短线命令删除小于一定长度的短线,然后用Pedit的 M 命令,多选,然后用 J 选项输入刚才的长度,也可以做到删除短线并连接的目的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-11-24 13:21:33 | 显示全部楼层
其实它图中的线是单条多段线,只是线条中的各个顶点比较密,而且顶点两两之间的线段长度的角度都不一样,所以只能每隔几个顶点就略去一些顶点,形成与原线条相似的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-25 10:35:56 | 显示全部楼层
上面几位高手说得都有道理。果然是高手啊。
现在只能是每隔几个顶点就略去一些顶点了,其实如果编程的话,更合适的处理方法是计算相邻两线段的夹角,小于某个角度的就转换成一条直线,再继续处理下一段。
我在这看到讨论图形加密的,有的人的方法就是把整张图打断成小碎线,绝了。其实转成光栅文件就行了。
我觉得这不是扫描的图形,要不然不会有这么好的效果吧。我做的矢量化图就达不到这种效果。

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

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

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

使用道具 举报

 楼主| 发表于 2002-11-25 16:22:11 | 显示全部楼层
上面的代码里    For Each EntObj In ThisDrawing.ModelSpace
是遍历ModelSpace,整个图都改了,vba里怎么创建选择集呢?用哪个函数,给个例句好吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-26 16:53:06 | 显示全部楼层
最初由 efan2000 发布
[B]其实就是多段线的顶点太密了,下面的例程是用R2000r的VBA作的,大家可以把它转换成其它语言的。目的是把线中每隔几点的之间的顶点去除。
[CODE]
  
Sub Test()
    Dim EntObj As AcadEntity
... [/B]

应该加上判断,比如按顶点间长度控制,这样有实际意义
不然有的点密,有的梳
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-26 18:24:11 | 显示全部楼层
同意楼上的。
这段代码会使两侧的端点消失,最后多义线越来越短,
我认为更合适的处理方法是计算相邻两线段的夹角,小于某个角度的就转换成一条直线,再继续处理下一段。
如果哪位高手能编段程序就好了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-26 23:09:26 | 显示全部楼层

精简lwpolyline中多余的顶点

用途:精简lwpolyline中多余的顶点

思路:
        方式一:判断相邻顶点的距离,短于给定数值则删除
        方式二:判断相邻线段的夹角,小于给定值则删除中间的顶点

不足:没有对pline中圆弧情况作处理,在圆弧所占比例较大时结果不理想

适合使用范围:
  矢量化扫描图处理
  复杂地形等高线简化
  故意增加节点的图纸

说明:需配合XDRX API使用


  1. (defun c:plclean (/ ss key n num ent1)
  2.   (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
  3.     (progn
  4.       (initget "D A")
  5.       (setq key (getkword "\n选择优化方式[按照距离(D)/按照角度(A)]<D>: "))
  6.       (if (not key)(setq key "D"))
  7.       (cond
  8.         (  (= key "D")
  9.           (while (not num)
  10.             (setq num (getdist "\n  输入最小点距: "))
  11.           );while
  12.           (setq n 0)
  13.           (repeat (sslength ss)
  14.             (setq ent1 (ssname ss n))
  15.             (pline_checkdist ent1 num)
  16.             (setq n (1+ n))
  17.           );repeat
  18.         )
  19.         (  (= key "A")
  20.           (while (not num)
  21.             (setq num (getangle "\n  输入最小夹角: "))
  22.           );while
  23.           (setq n 0)
  24.           (repeat (sslength ss)
  25.             (setq ent1 (ssname ss n))
  26.             (pline_checkang ent1 num)
  27.             (setq n (1+ n))
  28.           );repeat
  29.         )
  30.       );cond
  31.       (princ "\n  共清理了")(princ (sslength ss))(princ "条多义线")
  32.     );progn
  33.   );if
  34.   (princ)
  35. );end

  36. (defun pline_checkdist (ent_in dist_in / ent_nam pt pt_lst pto ptx n pte)
  37.   (if ent_in
  38.     (setq ent_nam (cdr (assoc 0 (entget ent_in))))
  39.   );if
  40.   
  41.   (if (= ent_nam "LWPOLYLINE")(progn
  42.     (xdrx_SetEntToDb ent_in)
  43.     (while (setq pt (xdrx_getpolyvtx))
  44.         (setq pt_lst (cons pt pt_lst))
  45.     );while

  46.     (setq n 1)
  47.     (setq pt_lst (cdr pt_lst)
  48.           pt_lst (reverse pt_lst)
  49.           pto (car pt_lst)
  50.           pt_lst (cdr pt_lst))
  51.     (foreach ptx pt_lst
  52.       (if (< (distance ptx pto) dist_in)
  53.         (progn
  54.           (xdrx_polyline_removeVertexAt ent_in n)
  55.           (setq n (1- n))
  56.         )
  57.         (setq pto ptx)
  58.       );if
  59.       (setq n (1+ n))
  60.     );foreach
  61.   ));if
  62. );end

  63. (defun pline_checkang (ent_in ang_in / ent_nam pt pt_lst n m angr pat ptb ptc
  64.                        ang1 ang2 angc)
  65.   (if ent_in
  66.     (setq ent_nam (cdr (assoc 0 (entget ent_in))))
  67.   );if
  68.   
  69.   (if (= ent_nam "LWPOLYLINE")(progn
  70.     (xdrx_SetEntToDb ent_in)
  71.     (while (setq pt (xdrx_getpolyvtx))
  72.         (setq pt_lst (cons pt pt_lst))
  73.     );while
  74.    
  75.     (setq pt_lst (reverse pt_lst))
  76.     (setq n 0 m 1)
  77.     ;(setq angr (/ (* pi ang_in) 180))
  78.     (setq angr (- pi ang_in))
  79.     (setq pta (nth n pt_lst))
  80.    
  81.     (setq len1 (- (length pt_lst) 2))
  82.     (repeat len1
  83.       (setq ptc (nth (1+ n) pt_lst)
  84.             ptb (nth (+ n 2) pt_lst)
  85.             ang1 (angle ptc pta)
  86.             ang2 (angle ptc ptb)
  87.             angc (abs(- ang2 ang1)))

  88.       (if (> angc angr)
  89.         (progn
  90.           (xdrx_polyline_removeVertexAt ent_in m)
  91.         );progn
  92.         (setq m (1+ m)
  93.               pta ptc)
  94.       );if
  95.       (setq n (1+ n))
  96.     );repeat
  97.   ));if
  98. );end
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-27 16:45:40 | 显示全部楼层
高手!
要vba编的话可先把点放到ARRY( )中
剩下的就是数学问题了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-29 23:41:57 | 显示全部楼层
见expresstools里头的overkill的Numeric fuzz 值。

The Numeric Fuzz value allows you to control the precision with which OVERKILL makes numeric comparisons. If this value is 0, the two objects being compared must match before OVERKILL will delete or modify one of them. On the other hand, if the fuzz value is higher than 0, the two objects being compared do not have to match for one of them to be deleted or modified
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-12-2 19:27:28 | 显示全部楼层
高,实在是高,

原来这个主题移到 ※VBA、COM-ActiveX Interfaces 开发技术※ 里面去了, 后面的跟帖一直没有邮件通知,我还不知道有高手已经解决了这个问题呢。
建议斑竹检查一下是什么原因。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2002-12-3 10:05:05 | 显示全部楼层
不过A方式处理有点问题,看这个由line组成的园的处理,控制夹角是1度,变成了半圆了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 22:25 , Processed in 0.278984 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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