zfsaaa 发表于 2010-4-17 10:22:00

网上下的这个程序不能用,如何改动呢?

<p>网上下的这个程序不能用,如何改动呢?</p><p>;;;删除线上点;;;;<br/>(defun c:delpoint (/ ensel ename object point width points new)<br/>&nbsp; (if (setq ensel (entsel "\n请选择一根线:"))<br/>&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "cmdecho" 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "undo" "g")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ename (car ensel))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq object (vlax-ename-&gt;vla-object ename))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (= (vla-get-entityname object) "AcDbPolyline")<br/>&nbsp;(while (progn (setvar "osmode" 1) (setq point (getpoint "\n请选择将要删除的点:")))<br/>&nbsp;&nbsp; (setq point (list (car point) (cadr point)))<br/>&nbsp;&nbsp; (setq width (car (vla-getWidth object 0 'StartWidth, 'EndWidth)))<br/>&nbsp;&nbsp; (setq points (poly_pts (vla-get-coordinates object)))<br/>&nbsp;&nbsp; (if (setq new (delpt))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn (vla-put-coordinates object new) (command "pedit" ename "w" width ""))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (print "只有两个点已不能再删除了!")<br/>&nbsp;&nbsp; )<br/>&nbsp;)<br/>&nbsp;(princ "\n这个程序只支持LWPOLYLINE!")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vlax-release-object object)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "undo" "e")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (prin1)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>)<br/>(defun delpt (/ m n del return pt)<br/>&nbsp; (setq m (length points))<br/>&nbsp; (setq n 0)<br/>&nbsp; (repeat m<br/>&nbsp;&nbsp;&nbsp; (setq pt (nth n points)<br/>&nbsp;&nbsp; n&nbsp; (1+ n)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (if&nbsp;del<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq return (append return pt))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (equal pt point)<br/>&nbsp;(setq del t)<br/>&nbsp;(setq return (append return pt))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (if (&gt; (length return) 3)<br/>&nbsp;&nbsp;&nbsp; return<br/>&nbsp; )<br/>)</p><p>&nbsp;</p>

fansmax 发表于 2010-4-17 11:59:00

<p>缺少了子函数,我重写了子函数,你试试。</p><p>;;;删除线上点;;;;<br/>(defun c:delpoint (/ ensel ename object point width points new)<br/>&nbsp; (if (setq ensel (entsel "\n请选择一根线:"))<br/>&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "cmdecho" 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "undo" "g")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ename (car ensel))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq object (vlax-ename-&gt;vla-object ename))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (= (vla-get-ObjectName object) "AcDbPolyline")<br/>&nbsp;(while (progn (setvar "osmode" 1) (setq point (getpoint "\n请选择将要删除的点:")))<br/>&nbsp;&nbsp; (setq point (list (car point) (cadr point)))<br/>&nbsp;&nbsp; (setq width (car (vla-getWidth object 0 'StartWidth, 'EndWidth)))<br/>&nbsp;&nbsp; (setq points (poly_pts (vla-get-coordinates object)))<br/>&nbsp;&nbsp; (if (setq new (delpt))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn (vla-put-coordinates object new) (command "pedit" ename "w" width))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (print "只有两个点已不能再删除了!")<br/>&nbsp;&nbsp; )<br/>&nbsp;)<br/>&nbsp;(princ "\n这个程序只支持LWPOLYLINE!")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vlax-release-object object)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "undo" "e")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (prin1)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>)</p><p>(defun delpt (/ m n del return pt pnts)<br/>&nbsp; (setq m (length points))<br/>&nbsp; (setq n 0)<br/>&nbsp; (repeat m<br/>&nbsp;&nbsp;&nbsp; (setq pt (nth n points)<br/>&nbsp;&nbsp; n&nbsp; (1+ n)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (if&nbsp;del<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq return (append return pt))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (equal pt point)<br/>&nbsp;(setq del t)<br/>&nbsp;(setq return (append return pt))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (if (&gt; (length return) 3)<br/>&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq pnts (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length return)))))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vlax-safearray-fill pnts return)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pnts<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>)</p><p>(defun poly_pts (num / lst i% lst_n)<br/>&nbsp; (setq lst (vlax-safearray-&gt;list (variant-value num)))<br/>&nbsp; (setq i% 0)<br/>&nbsp; (repeat (/ (length lst) 2)<br/>&nbsp;&nbsp;&nbsp; (setq lst_n (cons (list (nth i% lst) (nth (1+ i%) lst)) lst_n))<br/>&nbsp;&nbsp;&nbsp; (setq i% (+ 2 i%))<br/>&nbsp; )<br/>&nbsp; (setq lst_n (reverse lst_n))<br/>)<br/></p>

zfsaaa 发表于 2010-4-17 21:34:00

谢谢楼上大侠,这个程序基本可用,但遇到圆弧还有缺陷,对圆弧和直接组成的多边形,删点时就乱了套,不知谁能完善,谢谢!

fansmax 发表于 2010-4-19 11:44:00

<p>呵呵,个人认为对于复合线中连续弧段的节点删除要实现理想效果是不可能的,因为可能出现有几种解,程序无法知道你具体需要哪一种解法。</p><p>例如:把连续弧段中的某个节点删除了,哪是该用一段直线作修补?还是作正方向弧作修补?还是用反方向弧作修补?</p><p>按以上的逻辑去思考是无法得出具种情况下的正解。</p>

zfsaaa 发表于 2010-4-20 19:48:00

fansmax发表于2010-4-19 11:44:00static/image/common/back.gif呵呵,个人认为对于复合线中连续弧段的节点删除要实现理想效果是不可能的,因为可能出现有几种解,程序无法知道你具体需要哪一种解法。例如:把连续弧段中的某个节点删除了,哪是该用一段直线作

<p>谢谢!我还真没想那么多</p>
页: [1]
查看完整版本: 网上下的这个程序不能用,如何改动呢?