明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: zzyong00

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

[复制链接]
 楼主| 发表于 2014-9-3 15:05 | 显示全部楼层
ll_j 发表于 2014-9-3 10:15
很久不动了,动起来还有点困难,凑了一段框架,支持宽度,你看看:

非常感谢ll_j,您isp水平真是不一般!
  1. (defun c:RevPL ()

  2.   (princ "\n反转PL线")
  3.   (if (setq SS (ssget '((0 . "LWPOLYLINE"))))
  4.     (progn
  5.       (setq I 0)

  6.       (repeat (sslength SS)
  7.         (setq et (entget (ssname SS I)))

  8.         (setq
  9.           es (vl-remove-if
  10.                '(lambda (x) (member (car x) '(10 40 41 42 91 210)))
  11.                et
  12.              )                                ;实体头
  13.           ee (assoc 210 et)                ;实体尾,拉伸方向,保证在空间的轻多段线不至于变形
  14.           em (vl-remove-if-not
  15.                '(lambda (x) (member (car x) '(10 40 41 42)))
  16.                et
  17.              )                                ;顶点、宽度、凸度
  18.         )
  19.         (setq nem (cdddr (reverse em))
  20.               nem (mapcar
  21.                     '(lambda (x)
  22.                        (cond
  23.                          ((= (car x) 40) ;首尾宽度转换       
  24.                           (cons 41 (cdr x))
  25.                          )
  26.                          ((= (car x) 41)
  27.                           (cons 40 (cdr x))
  28.                          )
  29.                          ((= (car x) 42) ;凸度反转
  30.                           (cons 42 (- (cdr x)))
  31.                          )
  32.                          (t x)
  33.                        )
  34.                      )
  35.                     nem
  36.                   )
  37.         )
  38.         (setq et (append es nem (list ee)))
  39.         (entmod et)
  40.         (setq I (1+ I))

  41.       )
  42.     )
  43.     (princ ">>>图内没有二维多段线")
  44.   )

  45.   (princ)
  46. )
 楼主| 发表于 2014-9-3 15:09 | 显示全部楼层
我第一次用lisp写程序,感觉lisp思想和其它高级语言差距挺大
 楼主| 发表于 2014-9-3 15:23 | 显示全部楼层
zzyong00 发表于 2014-9-3 15:05
非常感谢ll_j,您isp水平真是不一般!

组码91是干什么的,前面去掉了,后面也没加上
 楼主| 发表于 2014-9-3 23:44 | 显示全部楼层
本帖最后由 zzyong00 于 2014-9-5 19:17 编辑

又一个思路,不知道组码91是干吗的,直接无视

  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.         ;;取得pl头部(反向)
  10.         (setq
  11.           ENT_Head (member (assoc 39 (reverse ENT)) (reverse ENT))

  12.         )

  13.         ;;得到顶点表
  14.         (setq LST_PT '())
  15.         ;;得到凸度表
  16.         (setq LST_Bulge '())
  17.                                         ;宽度
  18.         (setq LST_W1 '())
  19.         (setq LST_W2 '())
  20.                                         ;取多段线的顶点10和凸度42构成的表,反向,把最前的42组码(原是最后)调整到最后,把所有不为0的凸度组码取负值,加上实体表头和210组码对原实体表进行替换。

  21.         (foreach N ENT
  22.           (if (= (car N) 10)
  23.             (setq LST_PT (cons N LST_PT))
  24.           )
  25.           (if (= (car N) 40)
  26.             (setq LST_W1 (cons (cons 41 (cdr N)) LST_W1))
  27.           )
  28.           (if (= (car N) 41)
  29.             (setq LST_W2 (cons (cons 40 (cdr N)) LST_W2))
  30.           )
  31.           (if (= (car N) 42)
  32.             (setq
  33.               LST_Bulge        (cons (cons 42 (- (cdr N))) LST_Bulge)
  34.             )
  35.           )
  36.         )
  37.         (setq LST_W1 (cdr LST_W1))        ;去掉
  38.         (setq LST_W2 (cdr LST_W2))
  39.         (setq LST_Bulge (cdr LST_Bulge))
  40.         (setq LST '())                        ;顶点,宽度,凸度
  41.         (setq j 0)
  42.         (repeat        (length LST_PT)
  43.           (if (nth j LST_W2)
  44.             (setq LST (append LST
  45.                               (list (nth j LST_PT)
  46.                                     (nth j LST_W2)
  47.                                     (nth j LST_W1)
  48.                                     (nth j LST_Bulge)
  49.                               )
  50.                       )
  51.             )
  52.             (setq LST (append LST (list (nth j LST_PT))))
  53.           )
  54.           (setq j (1+ j))
  55.         )

  56.         (setq ENT_Head (reverse ENT_Head))
  57.         (setq ENT_Head
  58.                (append ENT_Head lst (list (assoc 210 ENT)))
  59.         )
  60.         (entmod ENT_Head)

  61.         (setq I (1+ I))
  62.       )                                        ;repeat
  63.     )                                        ;progn
  64.     (princ ">>>图内没有二维多段线")
  65.   )                                        ;if
  66.   (princ)
  67. )
发表于 2014-9-4 09:09 | 显示全部楼层
zzyong00 发表于 2014-9-3 23:44
又一个思路,不知道组码91是干吗的,直接无视

91组码是高版本dxf增加的,解释为“顶点标识符”,具体有什么作用也不清楚,因为10组码就是顶点。
不是所有组码都是生成实体必须的,所有对有些组码可以忽略操作,系统会自动加上默认的。
对平面多段线来说,210组码是比较重要的,不可忽略,你这段程序在结尾加上'(210 0 0 1)也是不对的,LW多段线虽然是平面的,但可能是在空间中与常用的平面(世界坐标系)不平行,当多段线所在平面与世界坐标系有夹角时,210组码的值就不是这样,贸然加上'(210 0 0 1)就将多段线移到世界坐标系了,多段线实际上就已经不是原来的样子了。
 楼主| 发表于 2014-9-4 11:34 | 显示全部楼层
本帖最后由 zzyong00 于 2014-9-4 11:35 编辑
ll_j 发表于 2014-9-4 09:09
91组码是高版本dxf增加的,解释为“顶点标识符”,具体有什么作用也不清楚,因为10组码就是顶点。
不是所 ...

哪么应该取原pl线的210组码的值,反向后,是不是各向量都应该取负呢?你的代码直接用原来pl的210组码
发表于 2014-9-4 12:24 | 显示全部楼层
zzyong00 发表于 2014-9-4 11:34
哪么应该取原pl线的210组码的值,反向后,是不是各向量都应该取负呢?你的代码直接用原来pl的210组码

就取原组码值,不能反向,不反向是原有平面,反向代表平面反向,换句话说,就是从“背面”来看了,这显然不是我们所要的结果。

点评

谢谢  发表于 2014-9-4 13:40
发表于 2015-10-23 11:06 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-7 18:48 , Processed in 0.141777 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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