乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 52|回复: 18

[编程交流] 我需要一个Lisp程序的语言来改变关闭

[复制链接]

15

主题

68

帖子

53

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
76
发表于 2022-7-6 07:49:31 | 显示全部楼层 |阅读模式
大家好,
 
我有许多绘图需要将闭合多段线转换为直径为0.20的圆
有人能帮我吗?
提前感谢
084931qwb4ihe3cbb3ehq4.png
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 07:55:33 | 显示全部楼层
试试这个。。。
 
  1. (defun c:Test (/ ss i sn pt)
  2. (if (setq ss (ssget "_:L" '((0 . "*POLYLINE") (-4 . "&") (70 . 1))))
  3.    (repeat (setq i (sslength ss))
  4.      (setq sn (ssname ss (setq i (1- i))))
  5.      (vl-remove-if-not
  6.        '(lambda (x)
  7.           (if (eq (car x) 10)
  8.             (setq pt (cons (list (cadr x) (caddr x)) pt))
  9.           )
  10.         )
  11.        (entget sn)
  12.      )
  13.      (entmakex (list '(0 . "CIRCLE")
  14.                      (cons 10
  15.                            (mapcar '(lambda (p q) (/ (+ p q) 2.))
  16.                                    (nth 0 pt)
  17.                                    (nth 2 pt)
  18.                            )
  19.                      )
  20.                      '(40 . 0.2)
  21.                )
  22.      )
  23.      (entdel (cdr (assoc -1 (entget sn))))
  24.    )
  25. )
  26. (princ)
  27. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:58:15 | 显示全部楼层
Quick’n dirty,使用多段线顶点的平均值作为圆心:
 
  1. ([color=BLUE]defun[/color] c:p2c ( [color=BLUE]/[/color] _massoc _pointaverage e i r s )
  2.    ([color=BLUE]setq[/color] r 0.1) [color=GREEN];; Circle Radius[/color]
  3.    ([color=BLUE]defun[/color] _massoc ( k l [color=BLUE]/[/color] p )
  4.        ([color=BLUE]if[/color] ([color=BLUE]setq[/color] p ([color=BLUE]assoc[/color] k l))
  5.            ([color=BLUE]cons[/color] ([color=BLUE]cdr[/color] p) (_massoc k ([color=BLUE]cdr[/color] ([color=BLUE]member[/color] p l))))
  6.        )
  7.    )
  8.    ([color=BLUE]defun[/color] _pointaverage ( l [color=BLUE]/[/color] x )
  9.        ([color=BLUE]setq[/color] x ([color=BLUE]length[/color] l))
  10.        ([color=BLUE]mapcar[/color] '[color=BLUE]/[/color] ([color=BLUE]apply[/color] '[color=BLUE]mapcar[/color] ([color=BLUE]cons[/color] '[color=BLUE]+[/color] l)) ([color=BLUE]list[/color] x x))
  11.    )
  12.    ([color=BLUE]if[/color] ([color=BLUE]setq[/color] s ([color=BLUE]ssget[/color] [color=MAROON]"_:L"[/color] '((0 . [color=MAROON]"LWPOLYLINE"[/color]) (-4 . [color=MAROON]"&="[/color]) (70 . 1))))
  13.        ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] i ([color=BLUE]sslength[/color] s))
  14.            ([color=BLUE]setq[/color] e ([color=BLUE]entget[/color] ([color=BLUE]ssname[/color] s ([color=BLUE]setq[/color] i ([color=BLUE]1-[/color] i)))))
  15.            ([color=BLUE]if[/color] ([color=BLUE]entmake[/color]
  16.                    ([color=BLUE]list[/color]
  17.                       '(0 . [color=MAROON]"CIRCLE"[/color])
  18.                        ([color=BLUE]assoc[/color] 008 e)
  19.                        ([color=BLUE]cons[/color]  010 (_pointaverage (_massoc 10 e)))
  20.                        ([color=BLUE]cons[/color]  040 r)
  21.                        ([color=BLUE]cond[/color] (([color=BLUE]assoc[/color] 006 e)) ('(006 . [color=MAROON]"BYLAYER"[/color])))
  22.                        ([color=BLUE]cond[/color] (([color=BLUE]assoc[/color] 039 e)) ('(039 . 0.0)))
  23.                        ([color=BLUE]cond[/color] (([color=BLUE]assoc[/color] 062 e)) ('(062 . 256)))
  24.                        ([color=BLUE]cond[/color] (([color=BLUE]assoc[/color] 370 e)) ('(370 . -1)))
  25.                        ([color=BLUE]assoc[/color] 210 e)
  26.                        ([color=BLUE]assoc[/color] 410 e)
  27.                    )
  28.                )
  29.                ([color=BLUE]entdel[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] -1 e)))
  30.            )
  31.        )
  32.    )
  33.    ([color=BLUE]princ[/color])
  34. )
假设闭合多段线。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

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

使用道具 举报

15

主题

68

帖子

53

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
76
发表于 2022-7-6 08:03:05 | 显示全部楼层
 
Tharwat,谢谢你的回复。
您的例程仅适用于LWpolyline。带多段线不运行。
回复

使用道具 举报

15

主题

68

帖子

53

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
76
发表于 2022-7-6 08:07:05 | 显示全部楼层
 
 
李,谢谢你的回复
您的例程仅适用于LWpolyline。
 
(如果(setqs(ssget“:L”)((0.“LWPOLYLINE”)(-4.&=“)(70.1)))
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:09:53 | 显示全部楼层
只需使用QSELECT或FILTER选择所有旧类型的多段线(如果有),并调用CONVERTPLY命令来修复它们。然后应用李的套路。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 08:14:27 | 显示全部楼层
 
我可能应该在你的文章中添加相同的符号,但在我所有的尝试中,我没有遇到任何错误或这个用法的崩溃,尽管我不太理解“&”的用法。
 
 
我可能也应该将mapcar与lambda一起使用,这将表现得更好更快,尽管使用vl remove if not函数确实做到了这一点。
 
我通常通过尝试获得或批准函数的使用,这可能是对的,也可能是错的。
 
谢谢
回复

使用道具 举报

15

主题

68

帖子

53

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
76
发表于 2022-7-6 08:16:32 | 显示全部楼层
 
 
使用CONVERTPOLY命令,我可以将多段线转换为LWMOLYLINE,但即使如此,李的例程也无法工作。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:21:53 | 显示全部楼层
出于好奇,这些老式多段线的来源是什么?您的图形是从第三方应用程序导出的还是非常旧的?如果我没记错的话,AutoCAD的内置命令从版本14开始生成LW多段线。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-9 21:29 , Processed in 0.632155 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表