antistar 发表于 2022-7-6 07:49:31

我需要一个口齿不清的语言来改变关闭

大家好,
 
我有许多绘图需要将闭合多段线转换为直径为0.20的圆
有人能帮我吗?
提前感谢

Tharwat 发表于 2022-7-6 07:55:33

试试这个。。。
 

(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)
)

Lee Mac 发表于 2022-7-6 07:58:15

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)
)
假设闭合多段线。

Lee Mac 发表于 2022-7-6 07:59:38

Tharwat,如果可以的话,我想问几个关于你代码的问题:
 
1)
 
您允许用户同时选择LW多段线和多段线,但是,您的程序将无法正确处理多段线。
 
2)
 
如果不是在这里,我无法理解您使用vl remove,因为您没有以任何方式使用此函数的返回,而是在迭代列表时构造输出?

antistar 发表于 2022-7-6 08:03:05

 
Tharwat,谢谢你的回复。
您的例程仅适用于LWpolyline。带多段线不运行。

antistar 发表于 2022-7-6 08:07:05

 
 
李,谢谢你的回复
您的例程仅适用于LWpolyline。
 
(如果(setqs(ssget“:L”)((0.“LWPOLYLINE”)(-4.&=“)(70.1)))

MSasu 发表于 2022-7-6 08:09:53

只需使用QSELECT或FILTER选择所有旧类型的多段线(如果有),并调用CONVERTPLY命令来修复它们。然后应用李的套路。

Tharwat 发表于 2022-7-6 08:14:27

 
我可能应该在你的文章中添加相同的符号,但在我所有的尝试中,我没有遇到任何错误或这个用法的崩溃,尽管我不太理解“&”的用法。
 
 
我可能也应该将mapcar与lambda一起使用,这将表现得更好更快,尽管使用vl remove if not函数确实做到了这一点。
 
我通常通过尝试获得或批准函数的使用,这可能是对的,也可能是错的。
 
谢谢

antistar 发表于 2022-7-6 08:16:32

 
 
使用CONVERTPOLY命令,我可以将多段线转换为LWMOLYLINE,但即使如此,李的例程也无法工作。

MSasu 发表于 2022-7-6 08:21:53

出于好奇,这些老式多段线的来源是什么?您的图形是从第三方应用程序导出的还是非常旧的?如果我没记错的话,AutoCAD的内置命令从版本14开始生成LW多段线。
页: [1] 2
查看完整版本: 我需要一个Lisp程序的语言来改变关闭