我需要一个口齿不清的语言来改变关闭
大家好,我有许多绘图需要将闭合多段线转换为直径为0.20的圆
有人能帮我吗?
提前感谢
试试这个。。。
(defun c:Test (/ ss i sn pt)
(if (setq ss (ssget "_:L" '((0 . "*POLYLINE") (-4 . "&") (70 . 1))))
(repeat (setq i (sslength ss))
(setq sn (ssname ss (setq i (1- i))))
(vl-remove-if-not
'(lambda (x)
(if (eq (car x) 10)
(setq pt (cons (list (cadr x) (caddr x)) pt))
)
)
(entget sn)
)
(entmakex (list '(0 . "CIRCLE")
(cons 10
(mapcar '(lambda (p q) (/ (+ p q) 2.))
(nth 0 pt)
(nth 2 pt)
)
)
'(40 . 0.2)
)
)
(entdel (cdr (assoc -1 (entget sn))))
)
)
(princ)
)
Quick’n dirty,使用多段线顶点的平均值作为圆心:
(defun c:p2c ( / _massoc _pointaverage e i r s )
(setq r 0.1) ;; Circle Radius
(defun _massoc ( k l / p )
(if (setq p (assoc k l))
(cons (cdr p) (_massoc k (cdr (member p l))))
)
)
(defun _pointaverage ( l / x )
(setq x (length l))
(mapcar '/ (apply 'mapcar (cons '+ l)) (list x x))
)
(if (setq s (ssget "_:L" '((0 . "LWPOLYLINE") (-4 . "&=") (70 . 1))))
(repeat (setq i (sslength s))
(setq e (entget (ssname s (setq i (1- i)))))
(if (entmake
(list
'(0 . "CIRCLE")
(assoc 008 e)
(cons010 (_pointaverage (_massoc 10 e)))
(cons040 r)
(cond ((assoc 006 e)) ('(006 . "BYLAYER")))
(cond ((assoc 039 e)) ('(039 . 0.0)))
(cond ((assoc 062 e)) ('(062 . 256)))
(cond ((assoc 370 e)) ('(370 . -1)))
(assoc 210 e)
(assoc 410 e)
)
)
(entdel (cdr (assoc -1 e)))
)
)
)
(princ)
)
假设闭合多段线。 Tharwat,如果可以的话,我想问几个关于你代码的问题:
1)
您允许用户同时选择LW多段线和多段线,但是,您的程序将无法正确处理多段线。
2)
如果不是在这里,我无法理解您使用vl remove,因为您没有以任何方式使用此函数的返回,而是在迭代列表时构造输出?
Tharwat,谢谢你的回复。
您的例程仅适用于LWpolyline。带多段线不运行。
李,谢谢你的回复
您的例程仅适用于LWpolyline。
(如果(setqs(ssget“:L”)((0.“LWPOLYLINE”)(-4.&=“)(70.1))) 只需使用QSELECT或FILTER选择所有旧类型的多段线(如果有),并调用CONVERTPLY命令来修复它们。然后应用李的套路。
我可能应该在你的文章中添加相同的符号,但在我所有的尝试中,我没有遇到任何错误或这个用法的崩溃,尽管我不太理解“&”的用法。
我可能也应该将mapcar与lambda一起使用,这将表现得更好更快,尽管使用vl remove if not函数确实做到了这一点。
我通常通过尝试获得或批准函数的使用,这可能是对的,也可能是错的。
谢谢
使用CONVERTPOLY命令,我可以将多段线转换为LWMOLYLINE,但即使如此,李的例程也无法工作。 出于好奇,这些老式多段线的来源是什么?您的图形是从第三方应用程序导出的还是非常旧的?如果我没记错的话,AutoCAD的内置命令从版本14开始生成LW多段线。
页:
[1]
2