找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 716|回复: 0

[日积月累]:关于xdrx_polyline_removeVertexAt用法的讨论

[复制链接]
发表于 2002-11-26 00:32:20 | 显示全部楼层 |阅读模式

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

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

×
关于xdrx_polyline_removeVertexAt用法的讨论


  1. xdrx_polyline_removeVertexAt
  2. 功    能:移去一个顶点
  3. 调用格式:(xdrx_polyline_removeVertexAt <LWPOLYLINE实体名> <index索引值>)
  4.           (xdrx_polyline_removeVertexAt <index索引值>)
  5. 返 回 值:成功T 失败NIL
  6. 说    明:移去一个定点,意味着该顶点后的曲线段也移去
复制代码


今天想写一个Pline简化的程序,程序的核心就是利用xdrx_polyline_removeVertexAt
函数把pline不需要的顶点删除:

起初的程序代码是这样的:

  1. (defun pline_check (ent_in dist_in / ent_nam pt pt_lst pto ptx n)
  2.   (if ent_in
  3.     (setq ent_nam (cdr (assoc 0 (entget ent_in))))
  4.   );if
  5.   (if (= ent_nam "LWPOLYLINE")(progn
  6.     (xdrx_SetEntToDb ent_in)
  7.     (while (setq pt (xdrx_getpolyvtx))
  8.         (setq pt_lst (cons pt pt_lst))
  9.     );while

  10.     (setq n 2)
  11.     (setq pte (car pt_lst)
  12.           pt_lst (cdr pt_lst)
  13.           pt_lst (reverse pt_lst)
  14.           pto (car pt_lst)
  15.           pt_lst (cdr pt_lst))
  16.    
  17.     (foreach ptx pt_lst
  18.       (if (< (distance ptx pto) dist_in)
  19.         (xdrx_polyline_removeVertexAt ent_in n)
  20.         (setq pto ptx)
  21.       );if
  22.       (setq n (1+ n))
  23.     );foreach

  24.   ));if
  25. );end


运行后,AutoCAD出错退出。
想不出原因,于是向函数作者求救,下面是讨论的过程:

qlin 说:
请教个问题
qlin 说:
xdrx_polyline_removeVertexAt 第二个参数是不是顶点的序号?
XDSoft 说:
嗯,索引
qlin 说:
这个索引怎么理解?
XDSoft 说:
从0开始
XDSoft 说:
顶点
qlin 说:
对应于顶点表的位置?
XDSoft 说:

qlin 说:
我一用这个函数AutoCAD就崩溃
XDSoft 说:
我看看
XDSoft 说:
正常啊
qlin 说:
我是连续删除很多顶点
XDSoft 说:
你单独用如何?
qlin 说:
可以
XDSoft 说:
那就可能是论坛有人说过的
XDSoft 说:
数据库还没有刷新
qlin 说:
能否强迫刷新?
XDSoft 说:
中间用下redraw
qlin 说:
我试试
qlin 说:
还是不行
qlin 说:
xdrx_polyline_removeVertexAt能否改动一下,让它可以输入索引列表,那样一次删除多个顶点,不用每次刷新数据库?
XDSoft 说:
我看看ARX帮助
qlin 说:
ARX我不熟
XDSoft 说:
不行
XDSoft 说:
(ARX)也是单独删除一个
XDSoft 说:
我要改,也是循环
XDSoft 说:
对了
XDSoft 说:
你代码有问题
qlin 说:
哪里的问题?
XDSoft 说:
你删除一个顶点后
XDSoft 说:
其他顶点就变了
XDSoft 说:
不是原来你的值了
qlin 说:
索引?
XDSoft 说:

XDSoft 说:
比如 你要删除 2 、4
XDSoft 说:
有5个顶点
XDSoft 说:
2删除完了
XDSoft 说:
4就不是4了
XDSoft 说:
应该是3了
qlin 说:
谢谢!我再试试
qlin 说:
调试通过!谢谢!
qlin 说:
速度很快,比用command生成新的曲线快多了


附录:更新后的相应代码:

  1. (defun pline_check (ent_in dist_in / ent_nam pt pt_lst pto ptx n)
  2.   (if ent_in
  3.     (setq ent_nam (cdr (assoc 0 (entget ent_in))))
  4.   );if
  5.   
  6.   (if (= ent_nam "LWPOLYLINE")(progn
  7.     (xdrx_SetEntToDb ent_in)
  8.     (while (setq pt (xdrx_getpolyvtx))
  9.         (setq pt_lst (cons pt pt_lst))
  10.     );while

  11.     (setq n 2)
  12.     (setq pte (car pt_lst)
  13.           pt_lst (cdr pt_lst)
  14.           pt_lst (reverse pt_lst)
  15.           pto (car pt_lst)
  16.           pt_lst (cdr pt_lst))
  17.    
  18.     (foreach ptx pt_lst
  19.       (if (< (distance ptx pto) dist_in)
  20.         (progn
  21.           (xdrx_polyline_removeVertexAt ent_in n)
  22.          
  23.           (setq n (1- n));;;***索引序号相应减1
  24.         )
  25.         (setq pto ptx)
  26.       );if
  27.       (setq n (1+ n))
  28.     );foreach
  29.   ));if
  30. );end

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

本版积分规则

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

GMT+8, 2024-12-20 13:51 , Processed in 0.167409 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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