zzyong00 发表于 2014-9-3 15:05:10

ll_j 发表于 2014-9-3 10:15 static/image/common/back.gif
很久不动了,动起来还有点困难,凑了一段框架,支持宽度,你看看:

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

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

      (repeat (sslength SS)
        (setq et (entget (ssname SS I)))

        (setq
          es (vl-remove-if
             '(lambda (x) (member (car x) '(10 40 41 42 91 210)))
             et
             )                                ;实体头
          ee (assoc 210 et)                ;实体尾,拉伸方向,保证在空间的轻多段线不至于变形
          em (vl-remove-if-not
             '(lambda (x) (member (car x) '(10 40 41 42)))
             et
             )                                ;顶点、宽度、凸度
        )
        (setq nem (cdddr (reverse em))
              nem (mapcar
                  '(lambda (x)
                     (cond
                       ((= (car x) 40) ;首尾宽度转换       
                          (cons 41 (cdr x))
                       )
                       ((= (car x) 41)
                          (cons 40 (cdr x))
                       )
                       ((= (car x) 42) ;凸度反转
                          (cons 42 (- (cdr x)))
                       )
                       (t x)
                     )
                     )
                  nem
                  )
        )
        (setq et (append es nem (list ee)))
        (entmod et)
        (setq I (1+ I))

      )
    )
    (princ ">>>图内没有二维多段线")
)

(princ)
)

zzyong00 发表于 2014-9-3 15:09:55

我第一次用lisp写程序,感觉lisp思想和其它高级语言差距挺大

zzyong00 发表于 2014-9-3 15:23:54

zzyong00 发表于 2014-9-3 15:05 static/image/common/back.gif
非常感谢ll_j,您isp水平真是不一般!

组码91是干什么的,前面去掉了,后面也没加上

zzyong00 发表于 2014-9-3 23:44:19

本帖最后由 zzyong00 于 2014-9-5 19:17 编辑

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

;;反转PL线-----zzyong00

(defun C:RevPL (/ SS)
(princ "\n反转PL线")
(if (setq SS (ssget '((0 . "LWPOLYLINE"))))
    (progn
      (setq I 0)
      (repeat (sslength SS)
      (setq ENT (entget (ssname SS I)))
      ;;取得pl头部(反向)
      (setq
          ENT_Head (member (assoc 39 (reverse ENT)) (reverse ENT))

      )

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

      (foreach N ENT
          (if (= (car N) 10)
            (setq LST_PT (cons N LST_PT))
          )
          (if (= (car N) 40)
            (setq LST_W1 (cons (cons 41 (cdr N)) LST_W1))
          )
          (if (= (car N) 41)
            (setq LST_W2 (cons (cons 40 (cdr N)) LST_W2))
          )
          (if (= (car N) 42)
            (setq
            LST_Bulge      (cons (cons 42 (- (cdr N))) LST_Bulge)
            )
          )
      )
      (setq LST_W1 (cdr LST_W1))      ;去掉
      (setq LST_W2 (cdr LST_W2))
      (setq LST_Bulge (cdr LST_Bulge))
      (setq LST '())                        ;顶点,宽度,凸度
      (setq j 0)
      (repeat      (length LST_PT)
          (if (nth j LST_W2)
            (setq LST (append LST
                              (list (nth j LST_PT)
                                    (nth j LST_W2)
                                    (nth j LST_W1)
                                    (nth j LST_Bulge)
                              )
                      )
            )
            (setq LST (append LST (list (nth j LST_PT))))
          )
          (setq j (1+ j))
      )

      (setq ENT_Head (reverse ENT_Head))
      (setq ENT_Head
               (append ENT_Head lst (list (assoc 210 ENT)))
      )
      (entmod ENT_Head)

      (setq I (1+ I))
      )                                        ;repeat
    )                                        ;progn
    (princ ">>>图内没有二维多段线")
)                                        ;if
(princ)
)

ll_j 发表于 2014-9-4 09:09:26

zzyong00 发表于 2014-9-3 23:44 static/image/common/back.gif
又一个思路,不知道组码91是干吗的,直接无视

91组码是高版本dxf增加的,解释为“顶点标识符”,具体有什么作用也不清楚,因为10组码就是顶点。
不是所有组码都是生成实体必须的,所有对有些组码可以忽略操作,系统会自动加上默认的。
对平面多段线来说,210组码是比较重要的,不可忽略,你这段程序在结尾加上'(210 0 0 1)也是不对的,LW多段线虽然是平面的,但可能是在空间中与常用的平面(世界坐标系)不平行,当多段线所在平面与世界坐标系有夹角时,210组码的值就不是这样,贸然加上'(210 0 0 1)就将多段线移到世界坐标系了,多段线实际上就已经不是原来的样子了。

zzyong00 发表于 2014-9-4 11:34:29

本帖最后由 zzyong00 于 2014-9-4 11:35 编辑

ll_j 发表于 2014-9-4 09:09 static/image/common/back.gif
91组码是高版本dxf增加的,解释为“顶点标识符”,具体有什么作用也不清楚,因为10组码就是顶点。
不是所 ...
哪么应该取原pl线的210组码的值,反向后,是不是各向量都应该取负呢?你的代码直接用原来pl的210组码

ll_j 发表于 2014-9-4 12:24:35

zzyong00 发表于 2014-9-4 11:34 static/image/common/back.gif
哪么应该取原pl线的210组码的值,反向后,是不是各向量都应该取负呢?你的代码直接用原来pl的210组码

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

czcxxx 发表于 2015-10-23 11:06:17

页: 1 [2]
查看完整版本: 反转多线段源码,求指点