找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3008|回复: 25

[求助]:求闭合多义线不同段有不同偏移值的更好的方法!

[复制链接]
发表于 2002-11-5 13:30:28 | 显示全部楼层 |阅读模式

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

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

×
我自己做了一个,但在方法不太好,不是直接纯计算点表来做的,最后还是用了CAD中的BO命令。谁有比较好的算法!教教我?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-11-5 13:38:53 | 显示全部楼层
能不能把你的代码贴出来让大家看看有改进的方法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-5 13:45:51 | 显示全部楼层

Re: [求助]:求闭合多义线不同段有不同偏移值的更好的方法!

最初由 黄卫文 发布
[B]我自己做了一个,但在方法不太好,不是直接纯计算点表来做的,最后还是用了CAD中的BO命令。谁有比较好的算法!教教我? [/B]


卫文,贴个图吧,什么叫不同的不同偏移?贴个图看看效果。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-5 13:59:57 | 显示全部楼层
就是闭合多义线往内或外OFFSET,对闭合线每一段能用不同的偏移值!
可用在规划地块的退红线上。我的方法是:
1、先求Lw的端点表。如果是顺时针就把它改不逆时针(用了你的面积正负来判断)
2、用退线数与线段的点组表。
3、通过偏移和求线段的交点形成新的点表。
4、通过选择新的点表生成的PL和原PL的质心点用BO命令生成完整的PL线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-5 14:04:52 | 显示全部楼层
最初由 黄卫文 发布
[B]就是闭合多义线往内或外OFFSET,对闭合线每一段能用不同的偏移值!
可用在规划地块的退红线上。我的方法是:
1、先求Lw的端点表。如果是顺时针就把它改不逆时针(用了你的面积正负来判断)
2、用退线数与线段的点... [/B]


那偏移后,每段就是单独的线了吧? 你还是截个图上来吧。

多个段,怎么交互输入,分别指定具体的偏移值?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-5 14:11:05 | 显示全部楼层
ptlist是原PL线的顶点表下面一段是:2、用退线数与线段的点组表。

  1. (repeat (length ptlist)
  2.       (if (/= (- (length ptlist) 1) j)
  3.         (grdraw (nth j ptlist) (nth (1+ j) ptlist) 3 1)
  4.         (grdraw (nth j ptlist) (nth 0 ptlist) 3 1)
  5.       )
  6.       (while
  7.         (not (setq tx_dist (getreal "\n请给出该段线段的退线距离:")))
  8.       )
  9.       (if (/= (- (length ptlist) 1) j)
  10.         (progn (setq tx_ptlist
  11.                       (cons
  12.                         (list (nth j ptlist) (nth (1+ j) ptlist) tx_dist)
  13.                         tx_ptlist
  14.                       )
  15.                )
  16.                (grdraw (nth j ptlist) (nth (1+ j) ptlist) 1 1)
  17.         )
  18.         (progn (setq tx_ptlist
  19.                       (cons (list (nth j ptlist) (nth 0 ptlist) tx_dist)
  20.                             tx_ptlist
  21.                       )
  22.                )
  23.                (grdraw (nth j ptlist) (nth 0 ptlist) 1 1)
  24.         )
  25.       )
  26.       (setq j (1+ j))
  27.     )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-5 14:11:57 | 显示全部楼层
下面的一段是:3、通过偏移和求线段的交点形成新的点表。



  1. (if        tx_ptlist
  2.       (progn
  3.         (setq tx_ptlist         (reverse tx_ptlist)
  4.               new_ptlist nil
  5.         )
  6.         (foreach pt_list tx_ptlist
  7.           (if (not new_ptlist)
  8.             (setq pt1             (polar (nth 0 pt_list)
  9.                                     (+ (* 0.5 pi)
  10.                                        (angle (nth 0 pt_list) (nth 1 pt_list))
  11.                                     )
  12.                                     (nth 2 pt_list)
  13.                              )
  14.                   pt2             (polar (nth 1 pt_list)
  15.                                     (+ (* 0.5 pi)
  16.                                        (angle (nth 0 pt_list) (nth 1 pt_list))
  17.                                     )
  18.                                     (nth 2 pt_list)
  19.                              )
  20.                   new_ptlist (list pt2 pt1)                 
  21.             )
  22.             (setq pt1             (polar (nth 0 pt_list)
  23.                                     (+ (* 0.5 pi)
  24.                                        (angle (nth 0 pt_list) (nth 1 pt_list))
  25.                                     )
  26.                                     (nth 2 pt_list)
  27.                              )
  28.                   pt2             (polar (nth 1 pt_list)
  29.                                     (+ (* 0.5 pi)
  30.                                        (angle (nth 0 pt_list) (nth 1 pt_list))
  31.                                     )
  32.                                     (nth 2 pt_list)
  33.                              )
  34.                   pt1 (inters pt1 pt2 (nth 1 new_ptlist)(nth 0 new_ptlist) nil)
  35.                   new_ptlist (cdr new_ptlist)
  36.                   new_ptlist (cons pt1 new_ptlist)
  37.                   new_ptlist (cons pt2 new_ptlist)
  38.             )
  39.           )
  40.         );for
  41.         (setq pt1 (inters (nth (1- (length new_ptlist)) new_ptlist)
  42.                           (nth (- (length new_ptlist) 2) new_ptlist)
  43.                           (nth 1 new_ptlist)
  44.                           (nth 0 new_ptlist)
  45.                           nil
  46.                   )
  47.               new_ptlist (cdr new_ptlist)
  48.               new_ptlist (cdr (reverse new_ptlist))
  49.               new_ptlist (cons pt1 new_ptlist)
  50.         )
  51.        
  52.       )
  53.     )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-5 14:13:55 | 显示全部楼层
最初由 黄卫文 发布
[B]ptlist是原PL线的顶点表下面一段是:2、用退线数与线段的点组表。

(repeat (length ptlist)
      (if (/= (- (length ptlist) 1) j)
        (grdraw (nth j ptlist) (nth (1+ j) ptlist) 3 1)
        (grdraw (nth j ptli... [/B]


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

使用道具 举报

 楼主| 发表于 2002-11-5 14:42:17 | 显示全部楼层
就这图
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-5 14:49:02 | 显示全部楼层
最初由 黄卫文 发布
[B]就这图 [/B]


如何和用户交互,指定哪段偏移多少?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-5 15:10:16 | 显示全部楼层
我在第6帖中有一这过程。只是我的方法自己感觉不是太好。想知道更好算法!象上图中如果
偏移值大的话在CAD中就会生成两个物体。而我自己的只能适用于退线较小的情况。当然在实际运用中通常不会出现我说的那特殊情况。如果出现只能没有办法!:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-5 15:16:35 | 显示全部楼层
最初由 黄卫文 发布
[B]我在第6帖中有一这过程。只是我的方法自己感觉不是太好。想知道更好算法!象上图中如果
偏移值大的话在CAD中就会生成两个物体。而我自己的只能适用于退线较小的情况。当然在实际运用中通常不会出现我说的那特殊情况... [/B]


卫文,我再问,你如何得到那些用户输入的不同段的偏移值,是让用户一个段一个段的输入吗?你回答这个先。

外偏没有问题,内偏,如果上面的偏移后在下面的偏移的内部,那肯定要不正确的。想让程序完美话,判断下吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-5 15:34:21 | 显示全部楼层
最初由 XDSoft 发布
[B][QUOTE]最初由 黄卫文 发布
[B]我在第6帖中有一这过程。只是我的方法自己感觉不是太好。想知道更好算法!象上图中如果
偏移值大的话在CAD中就会生成两个物体。而我自己的只能适用于退线较小的情况。当然在?.. [/B]


对,在程序中加亮一段给出一段。我只考虑往里面偏的情况。我用在规划退红线上。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-5 16:41:09 | 显示全部楼层
最初由 黄卫文 发布
[B][QUOTE]最初由 XDSoft 发布
[B][QUOTE]最初由 黄卫文 发布
[B]我在第6帖中有一这过程。只是我的方法自己感觉不是太好。想知道更好算法!象上图中如果
偏移值大的话在CAD中就会生成两个物体。而我自... [/B]


有好办法啊,你在ACAD手工交互,怎么做? 程序模拟出STRETCH就可以了。

另外,可以自己求出那些点,然后自己生成一个POLYLINE。

这几天写了一个工具,看看下面演示:


下载地址:http://www.xdcad.net/tech/segoffset.swf

<embed src=http://www.xdcad.net/tech/segoffset.swf quality=high width=512 height=482 loop=true type="application/x-shockwave-flash">
</embed>

下面是LISP程序,主要算法的代码不多。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-8 15:08:14 | 显示全部楼层
上面LISP的主要算法:


  1. [FONT=courier new]
  2. 1、用户交互,获得每段偏移值到表:((段1 偏移值)....(段N 偏移值))
  3. 2、根据总段数,循环处理,按照该段的偏移值得到偏移后的该段的起点、终点,到表 ((段1 起点 终点)...(段N 起点 终点))
  4. 3、循环处理2的表,把得到前后相邻的两个段的交点,得到新的顶点,结果:(点1....点n)
  5. 4、根据3结果,绘制PL线
  6. [/FONT]
复制代码


程序的核心函数是:xdrx_curve_offset 该函数可以偏移一个曲线(不生成新实体)得到偏移后的顶点表。


  1. [FONT=courier new]

  2. XDRX_CURVE_OFFSET

  3. 功能:获得AcDbCurve 曲线(line,polyline,lwpolyline,arc,circle,ellipse,spline)   
  4.      OFFSET给定距离后的,曲线点表,可以控制模拟后曲线的精度。
  5.      或者返回给定参考点到OFFSET曲线后,曲线实体上的最近点。
  6.      
  7. 调用格式:1.(xdrx_getoffsetcurve <AcDbCurve实体名> <偏移距离> [控制精度])
  8.          2.(xdrx_getoffsetcurve <AcDbCurve实体名> <偏移距离> [参考点] [控制精度])     
  9.          
  10. 返回值:1. LISP表,实体偏移后的曲线的模拟顶点表,顶点见距离由控制精度决定。
  11.        2. 返回点。
  12.       
  13. 说明:参数[控制精度]对曲线有效,单位是距离。对于曲线上的直线段不起作用,
  14.      每个直线段返回两个顶点。
  15.      例如:对于POLYLINE和LWPOLYLINE,由LINE和ARC组成,控制精度(距离)对模拟的ARC有效。
  16.           直线段不需要模拟。
  17.          
  18.      参数[控制精度]若不提供,系统默认使用当前绘图屏幕的viewsize变量的1/15处理。
  19. [/FONT]
复制代码


另外,用户交互时候,可以变色显示选定段,使用了用XDRX_API定义的通用LISP函数:$XDLSP_PolyLine_getSegAt


  1. [FONT=courier new]
  2. ;|
  3.    用法:($XDLSP_PolyLine_getSegAt <多义线实体名> <测试点>)
  4.    获得一个*POLYLINE线上指定一点处的“段”的信息。
  5.    对于直线段返回:(顶点索引 "kLine" 起点 终点)
  6.    对于弧线段返回:(顶点索引 "kArc" 起点 凸度 终点)
  7.    所有返回点在UCS下。
  8. |;
  9. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-1 07:14 , Processed in 0.470677 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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