很久不动了,动起来还有点困难,凑了一段框架,支持宽度,你看看:
非常感谢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)
) 我第一次用lisp写程序,感觉lisp思想和其它高级语言差距挺大 zzyong00 发表于 2014-9-3 15:05 static/image/common/back.gif
非常感谢ll_j,您isp水平真是不一般!
组码91是干什么的,前面去掉了,后面也没加上 本帖最后由 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)
) 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:35 编辑
ll_j 发表于 2014-9-4 09:09 static/image/common/back.gif
91组码是高版本dxf增加的,解释为“顶点标识符”,具体有什么作用也不清楚,因为10组码就是顶点。
不是所 ...
哪么应该取原pl线的210组码的值,反向后,是不是各向量都应该取负呢?你的代码直接用原来pl的210组码 zzyong00 发表于 2014-9-4 11:34 static/image/common/back.gif
哪么应该取原pl线的210组码的值,反向后,是不是各向量都应该取负呢?你的代码直接用原来pl的210组码
就取原组码值,不能反向,不反向是原有平面,反向代表平面反向,换句话说,就是从“背面”来看了,这显然不是我们所要的结果。
页:
1
[2]