明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2616|回复: 11

[求助]如何不用偏移命令,来取得偏移后的图元的顶点表

  [复制链接]
发表于 2009-3-25 16:26:00 | 显示全部楼层 |阅读模式

如何不用偏移命令,来取得偏移后的图元的顶点表?

因为直接用偏移命令或vla-offset,对于数量比较多的实体。速度会很慢。

我现在要偏移的目的只是起辅助作用,最终目的是取得偏移后的图元的顶点表。

特此求助

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2009-3-25 16:43:00 | 显示全部楼层

曲线类型,如果能达到任意的当然好。。。

不行的话,能实现LINE,ARC,LWPOLYLINE也行

如果对弧段比较难,那就退而求其次,直线段能实现也可。

发表于 2009-3-25 17:19:00 | 显示全部楼层
本帖最后由 作者 于 2009-3-25 22:09:32 编辑

实现基本功能容易,实现全部的要麻烦很多

计算麻烦

尤其遇到一些偏移量过大、自相交的线等意外情况

需要大量的测试和判断

发表于 2009-3-25 21:30:00 | 显示全部楼层
用entget函数可以获得。
 楼主| 发表于 2009-3-26 13:38:00 | 显示全部楼层

只支持LINE和LWPOLYLINE的直线段的情况呢。。。

LINE是最简单的

LWPOLYLINE的直线段偏移后的点位计算。

没找到好思路

发表于 2009-3-26 20:14:00 | 显示全部楼层

那就简单多了

PL偏移一般可以按照相交两线(或圆弧)结合部分的切向角夹角的中心线为延伸方向

简单说:

两线夹角的一半作为偏移点的方向,距离应该是该角度的余弦值比偏移距离(自己再算算)

然后把所有的点按原有的PL重新连接成为新的PL即可

发表于 2009-3-27 14:47:00 | 显示全部楼层

用 vlax-curve-getFirstDeriv 求出各个点的法线角度,

然后再求交点

 楼主| 发表于 2009-3-27 19:41:00 | 显示全部楼层
caoyin发表于2009-3-27 14:47:00用 vlax-curve-getFirstDeriv 求出各个点的法线角度,然后再求交点

--  作者:nonsmall
--  

那就简单多了

PL偏移一般可以按照相交两线(或圆弧)结合部分的切向角夹角的中心线为延伸方向

简单说:

两线夹角的一半作为偏移点的方向,距离应该是该角度的余弦值比偏移距离(自己再算算)

然后把所有的点按原有的PL重新连接成为新的PL即可

好主意,谢谢两位

发表于 2009-4-10 11:00:00 | 显示全部楼层
这是我写的一个函数,还有不少的问题,而且没有处理闭合的多段线
  1. ;;;--------------------------------------------------------
  2. ;;;函数: hj:offsetPline #pts-offset dist-off  
  3. ;;;--------------------------------------------------------
  4. ;;;说明:求点列表偏移一个距离后的坐标表
  5. ;;;备注:
  6. ;;;--------------------------------------------------------
  7. (defun hj:offsetPline (#pts-offset dist-off / #PTS-INTERS #PTS2 #PTS3 DIST-OFF RIANGLE X Y Z)
  8.   ;;还无法达到像CAD一样的偏移效果,当偏出来的多段线自相交时,如何处理?
  9. ;;;  (if (minusp dist-off)
  10. ;;;    (setq riAngle (* -1 (/ pi 2)))
  11. ;;;    (setq riAngle (/ pi 2))
  12. ;;;    )
  13.   (setq riAngle (/ pi 2))
  14.   (setq z (length #pts-offset))  
  15.   ;;将每一段偏移,求出段集合
  16.   (setq #pts2 (HJ:LIST->EDGE #pts-offset nil))
  17.   (setq #pts3(mapcar '(lambda(x) (list
  18.        (polar (car x) (+ (angle (car x)(cadr x)) riAngle) dist-off)
  19.        (polar (cadr x) (+ (angle (car x)(cadr x)) riAngle) dist-off)
  20.        )
  21.    )
  22.        #pts2)
  23. )
  24.   ;;求各段之交点
  25.   (setq #pts-inters
  26.   (mapcar '(lambda(x y)(INTERS (car x)(cadr x)(car y)(cadr y) nil))
  27.    (REVERSE (cdr (REVERSE #pts3)))
  28.    (cdr #pts3)
  29.    ))
  30.   (setq #pts3 (vl-remove nil #pts3))
  31.   (setq #pts-inters (append (list (caar #pts3)) #pts-inters (list (last (last #pts3)))))
  32.   (vl-remove nil #pts-inters)
  33.   )
  34. ;;子函数
  35. ;;;--------------------------------------------------------
  36. ;;;函数: hj:list->edge e   
  37. ;;;--------------------------------------------------------
  38. ;;;说明:将点列表(point list)组合为分段集合.
  39. ;;;备注:(1 2 3 4 5 6)==>((1 2)(2 3)(3 4)(4 5)(5 6))
  40. ;;;--------------------------------------------------------
  41. (defun hj:list->edge (#edge closed / edgeLst)
  42.   (setq edgeLst (mapcar '(lambda( x y)(list x y)) #edge (append (cdr #edge) (list (car #edge)))))
  43.   (if (not closed)
  44.     (REVERSE(cdr (REVERSE edgeLst)))
  45.     edgeLst
  46.     )  
  47.   
  48.   )
发表于 2009-7-29 16:31:00 | 显示全部楼层
caoyin能否写一下?我也遇到了这个 问题,但是对VLA又不怎么熟
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-10-1 09:36 , Processed in 0.182105 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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