明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4398|回复: 17

[讨论] 反转多线段源码,求指点

[复制链接]
发表于 2014-9-1 23:24 | 显示全部楼层 |阅读模式
  1. ;;反转PL线-----zzyong00

  2. (defun C:RevPL (/ SS)
  3.   (princ "\n反转PL线,假设只有直线段")
  4.   (if (setq SS (ssget '((0 . "LWPOLYLINE"))))
  5.     (progn
  6.       (setq I 0)
  7.       (repeat (sslength SS)
  8.         (setq ENT (entget (ssname SS I)))
  9.         ;;得到顶点表
  10.         (setq LST_PT '())
  11.         (foreach N ENT
  12.           (if (= (car N) 10)
  13.             (setq LST_PT (cons N LST_PT))
  14.           )
  15.         )

  16.         (foreach I '(10)
  17.           (setq
  18.             ENT        (vl-remove-if
  19.                   '(lambda (N) (= (car N) I))
  20.                   ENT
  21.                 )
  22.           )
  23.         )
  24.         (setq ENT (append ENT LST_PT))
  25.         (entmod ENT)


  26.         ;;
  27.         (setq I (1+ I))
  28.       )                                        ;repeat
  29.     )                                        ;progn
  30.     (princ ">>>图内没有二维多段线")
  31.   )                                        ;if
  32.   (princ)
  33. )


反转多线段,和AutoCAD的命令reverse 相差甚远,请教一下,有圆弧的,该如何反转呢?


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-9-2 08:55 | 显示全部楼层
发表于 2014-9-2 09:00 | 显示全部楼层
本帖最后由 ll_j 于 2014-9-2 09:17 编辑

很久以前搞过,现在已经找不到了,依稀记得点思路,不妨说给你试试。
有圆弧的多段线,实际上就是有一个凸度的42组码,而多段线的最后一点的凸度是表达“趋势”的,没有实际用途,所以可以忽略,同时,形状相同方向相反的圆弧,凸度也是反的,基于这个道理,可以通过点和凸度配对的方法反向多段线,具体做法如下:
取多段线的顶点10和凸度42构成的表,反向,把最前的42组码(原是最后)调整到最后,把所有不为0的凸度组码取负值,加上实体表头和210组码对原实体表进行替换。
 楼主| 发表于 2014-9-2 22:06 | 显示全部楼层
本帖最后由 zzyong00 于 2014-9-2 22:45 编辑
ll_j 发表于 2014-9-2 09:00
很久以前搞过,现在已经找不到了,依稀记得点思路,不妨说给你试试。
有圆弧的多段线,实际上就是有一个凸 ...



谢谢 ll_j,按你说的,我重新修改了代码
另一问题:210组码需要改吗?我发现reverse也没修改这个组码的内容,这个组码改与不改有什么区别吗?
 楼主| 发表于 2014-9-2 22:19 | 显示全部楼层
本帖最后由 zzyong00 于 2014-9-2 22:44 编辑

有错误,圆弧反转后变直线了
  1. [code=lisp];;反转PL线-----zzyong00

  2. (defun C:RevPL (/ SS)
  3.   (princ "\n反转PL线,假设只有直线段")
  4.   (if (setq SS (ssget '((0 . "LWPOLYLINE"))))
  5.     (progn
  6.       (setq I 0)
  7.       (repeat (sslength SS)
  8.   (setq ENT (entget (ssname SS I)))
  9.   ;;得到顶点表
  10.   (setq LST_PT '())
  11.   ;;得到凸度表
  12.   (setq LST_Bulge '())
  13.           ;取多段线的顶点10和凸度42构成的表,反向,把最前的42组码(原是最后)调整到最后,把所有不为0的凸度组码取负值,加上实体表头和210组码对原实体表进行替换。
  14.   (foreach N ENT
  15.     (if (= (car N) 10)
  16.       (setq LST_PT (cons N LST_PT))
  17.     )
  18.     (if (= (car N) 42)
  19.       (progn
  20.         (if (not (eq (cdr N) 0.0))
  21.     (setq
  22.       LST_Bulge (cons (cons 42 (- (cdr N))) LST_Bulge)
  23.     )
  24.     (setq LST_Bulge (cons N LST_Bulge))
  25.         )
  26.       )
  27.     )
  28.   )
  29.   (foreach L '(10)
  30.     (setq
  31.       ENT  (vl-remove-if
  32.       '(lambda (N) (= (car N) L))
  33.       ENT
  34.     )
  35.     )
  36.   )
  37.   (foreach L '(42)
  38.     (setq
  39.       ENT  (vl-remove-if
  40.       '(lambda (N) (= (car N) L))
  41.       ENT
  42.     )
  43.     )
  44.   )
  45.   (setq ENT (append ENT LST_PT LST_Bulge))
  46.   (entmod ENT)


  47.   ;;
  48.   (setq I (1+ I))
  49.       )          ;repeat
  50.     )          ;progn
  51.     (princ ">>>图内没有二维多段线")
  52.   )          ;if
  53.   (princ)
  54. )
[/code]
发表于 2014-9-2 22:20 来自手机 | 显示全部楼层
已有reverse命令
 楼主| 发表于 2014-9-2 22:46 | 显示全部楼层
ivde 发表于 2014-9-2 22:20
已有reverse命令

我知道啊!...............
 楼主| 发表于 2014-9-2 23:29 | 显示全部楼层
  1. ;;反转PL线-----zzyong00

  2. (defun C:RevPL (/ SS)
  3.   (princ "\n反转PL线,假设只有直线段")
  4.   (if (setq SS (ssget '((0 . "LWPOLYLINE"))))
  5.     (progn
  6.       (setq I 0)
  7.       (repeat (sslength SS)
  8.         (setq ENT (entget (ssname SS I)))
  9.         ;;得到顶点表
  10.         (setq LST_PT '())
  11.         ;;得到凸度表
  12.         (setq LST_Bulge '())
  13.                                         ;取多段线的顶点10和凸度42构成的表,反向,把最前的42组码(原是最后)调整到最后,把所有不为0的凸度组码取负值,加上实体表头和210组码对原实体表进行替换。
  14.         (setq J 0)
  15.         (foreach N ENT
  16.           (if (= (car N) 10)
  17.             (setq LST_PT (cons N LST_PT))
  18.           )
  19.           (if (not (= J 0))
  20.             (if        (= (car N) 42)
  21.               (progn
  22.                 (if (not (eq (cdr N) 0.0))
  23.                   (setq
  24.                     LST_Bulge (cons (cons 42 (- (cdr N))) LST_Bulge)
  25.                   )
  26.                   (setq LST_Bulge (cons N LST_Bulge))
  27.                 )
  28.               )
  29.             )
  30.           )
  31.           (setq J (1+ J))
  32.         )
  33.         (setq LST_Bulge (append LST_Bulge '((42 . 0.0))))

  34.         (foreach L '(10)
  35.           (setq
  36.             ENT        (vl-remove-if
  37.                   '(lambda (N) (= (car N) L))
  38.                   ENT
  39.                 )
  40.           )
  41.         )
  42.         (foreach L '(42)
  43.           (setq
  44.             ENT        (vl-remove-if
  45.                   '(lambda (N) (= (car N) L))
  46.                   ENT
  47.                 )
  48.           )
  49.         )
  50.         (setq ENT (append ENT LST_PT LST_Bulge))
  51.         (entmod ENT)
  52.         ;(entmake ent)

  53.         ;;
  54.         (setq I (1+ I))
  55.       )                                        ;repeat
  56.     )                                        ;progn
  57.     (princ ">>>图内没有二维多段线")
  58.   )                                        ;if
  59.   (princ)
  60. )
再改,还是有问题!圆弧变直线了。。
发表于 2014-9-3 09:56 | 显示全部楼层
zzyong00 发表于 2014-9-2 23:29
再改,还是有问题!圆弧变直线了。。

http://bbs.xdcad.net/forum.php?m ... 918&pid=2557172
发表于 2014-9-3 10:15 | 显示全部楼层
zzyong00 发表于 2014-9-2 23:29
再改,还是有问题!圆弧变直线了。。

很久不动了,动起来还有点困难,凑了一段框架,支持宽度,你看看:
  1. (defun c:tt()
  2.   (setq en(entsel)
  3.         et(entget (car en))
  4.         es(vl-remove-if '(lambda(x)(member (car x) '(10 40 41 42 91 210))) et) ;实体头
  5.         ee(assoc 210 et)         ;实体尾,拉伸方向,保证在空间的轻多段线不至于变形
  6.         em(vl-remove-if-not '(lambda(x)(member (car x) '(10 40 41 42))) et) ;顶点、宽度、凸度
  7.   )
  8.   (setq nem(cdddr (reverse em))
  9.         nem(mapcar
  10.              '(lambda(x)
  11.                 (cond
  12.                   ((= (car x) 40)   ;首尾宽度转换
  13.                    (cons 41 (cdr x))
  14.                   )
  15.                   ((= (car x) 41)
  16.                    (cons 40 (cdr x))
  17.                   )
  18.                   ((= (car x) 42)   ;凸度反转
  19.                    (cons 42 (- (cdr x)))
  20.                   )
  21.                   (t x)
  22.                 )
  23.               )
  24.              nem
  25.            )
  26.   )
  27.   (setq et (append es nem (list ee)))
  28.   (entmod et)
  29. )

评分

参与人数 1明经币 +1 收起 理由
zzyong00 + 1 赞一个!

查看全部评分

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

本版积分规则

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

GMT+8, 2024-4-27 00:43 , Processed in 0.813294 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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