马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
关于xdrx_polyline_removeVertexAt用法的讨论
- xdrx_polyline_removeVertexAt
- 功 能:移去一个顶点
- 调用格式:(xdrx_polyline_removeVertexAt <LWPOLYLINE实体名> <index索引值>)
- (xdrx_polyline_removeVertexAt <index索引值>)
- 返 回 值:成功T 失败NIL
- 说 明:移去一个定点,意味着该顶点后的曲线段也移去
复制代码
今天想写一个Pline简化的程序,程序的核心就是利用xdrx_polyline_removeVertexAt
函数把pline不需要的顶点删除:
起初的程序代码是这样的:
- (defun pline_check (ent_in dist_in / ent_nam pt pt_lst pto ptx n)
- (if ent_in
- (setq ent_nam (cdr (assoc 0 (entget ent_in))))
- );if
- (if (= ent_nam "LWPOLYLINE")(progn
- (xdrx_SetEntToDb ent_in)
- (while (setq pt (xdrx_getpolyvtx))
- (setq pt_lst (cons pt pt_lst))
- );while
- (setq n 2)
- (setq pte (car pt_lst)
- pt_lst (cdr pt_lst)
- pt_lst (reverse pt_lst)
- pto (car pt_lst)
- pt_lst (cdr pt_lst))
-
- (foreach ptx pt_lst
- (if (< (distance ptx pto) dist_in)
- (xdrx_polyline_removeVertexAt ent_in n)
- (setq pto ptx)
- );if
- (setq n (1+ n))
- );foreach
- ));if
- );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生成新的曲线快多了
附录:更新后的相应代码:
- (defun pline_check (ent_in dist_in / ent_nam pt pt_lst pto ptx n)
- (if ent_in
- (setq ent_nam (cdr (assoc 0 (entget ent_in))))
- );if
-
- (if (= ent_nam "LWPOLYLINE")(progn
- (xdrx_SetEntToDb ent_in)
- (while (setq pt (xdrx_getpolyvtx))
- (setq pt_lst (cons pt pt_lst))
- );while
- (setq n 2)
- (setq pte (car pt_lst)
- pt_lst (cdr pt_lst)
- pt_lst (reverse pt_lst)
- pto (car pt_lst)
- pt_lst (cdr pt_lst))
-
- (foreach ptx pt_lst
- (if (< (distance ptx pto) dist_in)
- (progn
- (xdrx_polyline_removeVertexAt ent_in n)
-
- (setq n (1- n));;;***索引序号相应减1
- )
- (setq pto ptx)
- );if
- (setq n (1+ n))
- );foreach
- ));if
- );end
|