乐筑天下

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

[编程交流] 学习Lisp“折线宽度”

[复制链接]

10

主题

46

帖子

36

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 17:14:22 | 显示全部楼层 |阅读模式
我还在学习Lisps,需要一个函数。我不会说我需要它做什么,我想试着从这个论坛的输入中编写lisp。
 
我需要知道如何存储用户选择的多段线的多段线宽度。例如,如果我选择一条多段线并运行lisp,反之亦然,lisp将把选定多段线的全局宽度存储到内存中。
 
(setq PW(ssget“多段线宽度”)
 
在我得到这些信息后,我会发布我的lisp以及它的功能。之后你们可以分享一下你们会怎么做。这可能会比我的方式更好。
 
提前谢谢。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:20:49 | 显示全部楼层
假设您引用的是LWMOLYLINE的全局(恒定)宽度,则宽度值与DXF组43相关联:
  1. (defun c:test ( / ent enx )
  2.    (if (setq ent (car (entsel)))
  3.        (if (= "LWPOLYLINE" (cdr (assoc 0 (setq enx (entget ent)))))
  4.            (princ (strcat "\nThe polyline width is " (rtos (cdr (assoc 43 enx)))))
  5.            (princ "\nThe selected object is not a polyline.")
  6.        )
  7.        (princ "\nNo object selected.")
  8.    )
  9.    (princ)
  10. )
回复

使用道具 举报

10

主题

46

帖子

36

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 17:23:07 | 显示全部楼层
这就是我想要的,也许我可以从这里接受。
我不想输出字符串,而是想将该值放入内存,以便在另一个命令中使用。
让我试试看,如果我想不出来,我会寻求更多帮助。谢谢
回复

使用道具 举报

10

主题

46

帖子

36

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 17:27:07 | 显示全部楼层
 
谢谢你!我做到了!!!可能没有你做的那么好,但我做到了!
 
  1. (defun c:px nil
  2.    (if (setq ent (car (entsel)))
  3.        (if (= "LWPOLYLINE" (cdr (assoc 0 (setq enx (entget ent)))))
  4.            (setq pw (rtos (cdr (assoc 43 enx)))))
  5.    )
  6. (command "explode" ent)
  7. (command "pedit" "m" "p" "" "w" pw"")
  8.    (princ)
  9. )

 
此lisp在保持宽度的同时对多段线进行XPLOD。
从技术上讲,它获取宽度,将其存储在内存中,分解LWPOLYLINE,将线转换为LWPOLYLINE,然后添加“pw”的宽度
 
它只是点击,我可能需要添加一个“peditacept”,以防大多数人将其设置为0。
 
我想知道更好的方法是什么。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:30:02 | 显示全部楼层
与其正确地将其称为save in memory,不如保存一个“全局”变量,以便在同一dwg会话中进一步使用。唯一的问题可能是您编写了另一个使用pw的程序。可以在dwg中保存变量,例如USERI1-5 5整数、USERR1-5 5 reals
但它们同样可以被覆盖。如果保存全局变量,可以使用前缀GLBpw,并在某处保留一个列表,列出您使用过的描述。
 
  1. (setvar "userr1" 0.25) ; sets userr1 value
  2. (getvar "userr1") ; retrieves the value

 
  1. (defun c:px ( / ent) ; implies ent is a local variable and will not be saved at end of defun
  2. just me added a space after pw
  3. (command "pedit" "m" "p" "" "w" [color=red]pw ""[color=red])[/color]
  4. [/color]

 
差点忘了,如果你想保存很多变量并在图形中使用它们,然后保存到一个简单的txt文件并根据需要读取。让它成为acaddoc中的库defun。lsp可以在任何时候使用。
回复

使用道具 举报

10

主题

46

帖子

36

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 17:30:38 | 显示全部楼层
 
谢谢
我仍在学习Lisp,并理解Lisp中的记忆。我用了零,因为我不是百分之百有信心。我确实理解它的重要性,所以我将添加它,以防其他Lisp最终使用“pw”作为变量。
 
谢谢大家。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:36:06 | 显示全部楼层
 
做得好!
 
 
有许多方法可以进一步开发代码,以解释和缓解每一种可能的错误-最初的改进是解释无效或无效的选择,例如:
但是可以进一步说明锁定层,检查以确保在调用PEDIT命令之前在调用EXPLODE命令之后生成有效对象。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:37:23 | 显示全部楼层
嗨,李,
我很好奇,在不使用以下公式的情况下,是否可以用entsel/entsel方法解释锁定层:
  1. (ssget "_+.:E:S:L")

我认为唯一的方法是访问实体的层定义,并在其状态被锁定时从中检索。因此,上面的一行显示了这个问题简化了多少。我可以想到的另一种方式是:
  1. (setq s (ssadd))
  2. (ssadd (car (entsel "\nSelect entity: ")) s)
  3. (sssetfirst nil s)
  4. (/= 0 (sslength (ssget "_.+:I:L"))); here we can check if the selected entity is on locked layer
  5. (sssetfirst nil nil)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:39:48 | 显示全部楼层
下面是一个示例:
  1. (defun c:px ( / cmd ent enx ped )
  2.    (setvar 'errno 0)
  3.    (while (/= 52 (getvar 'errno))
  4.        (setvar 'errno 0)
  5.        (setq ent (car (entsel "\nSelect polyline <exit>: ")))
  6.        (cond
  7.            (   (= 7 (getvar 'errno))
  8.                (prompt "\nMissed, try again.")
  9.            )
  10.            (   (null ent)
  11.                (prompt "\nExit.")
  12.            )
  13.            (   (/= "LWPOLYLINE" (cdr (assoc 0 (setq enx (entget ent)))))
  14.                (prompt "\nSelected object is not an LWPolyline.")
  15.            )
  16.            (   (= 4 (logand 4 (cdr (assoc 70 (tblsearch "layer" (cdr (assoc 8 enx)))))))
  17.                (prompt "\nSelected polyline is on a locked layer.")
  18.            )
  19.            (   (setq cmd (getvar 'cmdecho)
  20.                      ped (getvar 'peditaccept)
  21.                )
  22.                (setvar 'cmdecho 0)
  23.                (setvar 'peditaccept 1)
  24.                (command
  25.                    "_.explode" ent
  26.                    "_.pedit" "_m" "_p" "" "_w" (cdr (assoc 43 enx)) ""
  27.                )
  28.                (setvar 'peditaccept ped)
  29.                (setvar 'cmdecho cmd)
  30.            )
  31.        )
  32.    )
  33.    (princ)
  34. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:43:11 | 显示全部楼层
谢谢你,李
我刚刚写了一些类似的东西:
  1. (defun C:test ( / e enx )
  2. (while
  3.         (not
  4.                 (and
  5.                         (setq e (car (entsel "\nSelect LWpolyline on non-locked layer: ")))
  6.                         (eq (cdr (assoc 0 (setq enx (entget e)))) "LWPOLYLINE")
  7.                         (/= (cdr (assoc 70 (entget (tblobjname "LAYER" (cdr (assoc 8 enx)))))) 4)
  8.                 )
  9.         )
  10.         e
  11. )
  12. (print enx); if successful
  13. (princ)
  14. )

我可能需要更深入地研究这个logand函数,因为这不是我第一次看到它被使用。
我想我今天的代码写完了。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-24 09:51 , Processed in 5.131911 second(s), 73 queries .

© 2020-2025 乐筑天下

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