[求助]如何不用偏移命令,来取得偏移后的图元的顶点表
<p>如何不用偏移命令,来取得偏移后的图元的顶点表?</p><p>因为直接用偏移命令或vla-offset,对于数量比较多的实体。速度会很慢。</p><p>我现在要偏移的目的只是起辅助作用,最终目的是取得偏移后的图元的顶点表。</p><p>特此求助</p> <p>曲线类型,如果能达到任意的当然好。。。</p><p>不行的话,能实现LINE,ARC,LWPOLYLINE也行</p><p>如果对弧段比较难,那就退而求其次,直线段能实现也可。</p> 本帖最后由 作者 于 2009-3-25 22:09:32 编辑 <br /><br /> <p>实现基本功能容易,实现全部的要麻烦很多</p><p>计算麻烦</p><p>尤其遇到一些偏移量过大、自相交的线等意外情况</p><p>需要大量的测试和判断</p> 用entget函数可以获得。 <p>只支持LINE和LWPOLYLINE的直线段的情况呢。。。</p><p>LINE是最简单的</p><p>LWPOLYLINE的直线段偏移后的点位计算。</p><p>没找到好思路</p> <p>那就简单多了</p><p>PL偏移一般可以按照相交两线(或圆弧)结合部分的切向角夹角的中心线为延伸方向</p><p>简单说:</p><p>两线夹角的一半作为偏移点的方向,距离应该是该角度的余弦值比偏移距离(自己再算算)</p><p>然后把所有的点按原有的PL重新连接成为新的PL即可</p><p></p> <p>用 vlax-curve-getFirstDeriv 求出各个点的法线角度,</p><p>然后再求交点</p> caoyin发表于2009-3-27 14:47:00static/image/common/back.gif用 vlax-curve-getFirstDeriv 求出各个点的法线角度,然后再求交点<p><table class="tableborder2" cellspacing="1" cellpadding="3" width="98%" align="center" border="0" style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all; TEXT-ALIGN: left;"><tbody><tr><td class="tablebody2" valign="middle">-- 作者:nonsmall <br/>-- <br/><p>那就简单多了</p><p>PL偏移一般可以按照相交两线(或圆弧)结合部分的切向角夹角的中心线为延伸方向</p><p>简单说:</p><p>两线夹角的一半作为偏移点的方向,距离应该是该角度的余弦值比偏移距离(自己再算算)</p><p>然后把所有的点按原有的PL重新连接成为新的PL即可</p></td></tr></tbody></table></p><p></p><p></p><p>好主意,谢谢两位</p> 这是我写的一个函数,还有不少的问题,而且没有处理闭合的多段线
;;;--------------------------------------------------------
;;;函数: hj:offsetPline #pts-offset dist-off
;;;--------------------------------------------------------
;;;说明:求点列表偏移一个距离后的坐标表
;;;备注:
;;;--------------------------------------------------------
(defun hj:offsetPline (#pts-offset dist-off / #PTS-INTERS #PTS2 #PTS3 DIST-OFF RIANGLE X Y Z)
;;还无法达到像CAD一样的偏移效果,当偏出来的多段线自相交时,如何处理?
;;;(if (minusp dist-off)
;;; (setq riAngle (* -1 (/ pi 2)))
;;; (setq riAngle (/ pi 2))
;;; )
(setq riAngle (/ pi 2))
(setq z (length #pts-offset))
;;将每一段偏移,求出段集合
(setq #pts2 (HJ:LIST->EDGE #pts-offset nil))
(setq #pts3(mapcar '(lambda(x) (list
(polar (car x) (+ (angle (car x)(cadr x)) riAngle) dist-off)
(polar (cadr x) (+ (angle (car x)(cadr x)) riAngle) dist-off)
)
)
#pts2)
)
;;求各段之交点
(setq #pts-inters
(mapcar '(lambda(x y)(INTERS (car x)(cadr x)(car y)(cadr y) nil))
(REVERSE (cdr (REVERSE #pts3)))
(cdr #pts3)
))
(setq #pts3 (vl-remove nil #pts3))
(setq #pts-inters (append (list (caar #pts3)) #pts-inters (list (last (last #pts3)))))
(vl-remove nil #pts-inters)
)
;;子函数
;;;--------------------------------------------------------
;;;函数: hj:list->edge e
;;;--------------------------------------------------------
;;;说明:将点列表(point list)组合为分段集合.
;;;备注:(1 2 3 4 5 6)==>((1 2)(2 3)(3 4)(4 5)(5 6))
;;;--------------------------------------------------------
(defun hj:list->edge (#edge closed / edgeLst)
(setq edgeLst (mapcar '(lambda( x y)(list x y)) #edge (append (cdr #edge) (list (car #edge)))))
(if (not closed)
(REVERSE(cdr (REVERSE edgeLst)))
edgeLst
)
)
<strong><font face="Verdana" color="#da2549">caoyin</font></strong>能否写一下?我也遇到了这个 问题,但是对VLA又不怎么熟
页:
[1]
2