乐筑天下

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

[编程交流] 改进的Break-LISP例程

[复制链接]

95

主题

477

帖子

383

银币

后起之秀

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

铜币
475
发表于 2022-7-5 18:02:07 | 显示全部楼层 |阅读模式
我有一个关于lisp例程的快速问题,该例程试图将break要素线和break命令组合成一个命令。我不熟悉Visual Lisp和Auto Lisp,所以我不确定它是否有类似VBA的else if语句(我更喜欢将else if用于break命令)。我的代码在下面,目前不工作,所以我很确定我在做一些愚蠢的事情。我假设我的错误在if语句中,但我不确定如何修复它。我通过结合我的两个中断对象的例程来创建代码。
 
  1. (defun c:break2 ( / ent)
  2. (setq ent (entsel "\nSelect Object: ")); Has user select object
  3. (if
  4.      (and ent (= "Pline" ))
  5. (princ "Break Point")
  6. (command "_.break" pause "_f")
  7.   (princ "\nBreak point: ")
  8.   (command pause "@")
  9.   )
  10. (if
  11.      (and ent (= "Feature Line" ))
  12. (princ "._AeccBreakFeatures")
  13. (command "_.break" pause "_f")
  14. (princ "\nBreak point: ")
  15. (command pause "@")
  16. )
  17. (princ)
  18. )
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-5 18:10:04 | 显示全部楼层
从这里开始:
 
  1. (defun c:break2 ( / ent)
  2. (setq ent (car (entsel "\nSelect Object: "))); Has user select object
  3. (if (= (setq enttype (cdr (assoc 0 (entget ent)))) "LWPOLYLINE")
  4.   (progn
  5. (princ "Break Point")
  6. (command "_.break" pause "_f")
  7.   (princ "\nBreak point: ")
  8.   (command pause "@")
  9.   )
  10. (if (= enttype "AECC_FEATURE_LINE")
  11. (princ "._AeccBreakFeatures")
  12. (command "_.break" pause "_f")
  13. (princ "\nBreak point: ")
  14. (command pause "@")
  15. )
  16.   )
  17. (princ)
  18. )
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

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

铜币
475
发表于 2022-7-5 18:13:00 | 显示全部楼层
 
非常感谢你的帮助!不幸的是,我在运行它时遇到了语法错误。我有几个关于它是如何工作的快速问题,因为我想理解它。
1) (if(=(setq enttype(cdr(assoc 0(entget ent))))“LWPOLYLINE”)的“car”和cdr部分具体做什么?
2) 为什么代码的第二部分需要(=enttype),而第一部分不需要?
3) 当代码甚至没有加载时(尝试使用vlide,但它说有很多参数),我该如何调试代码?
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 18:16:21 | 显示全部楼层
broncos15,
 
(entget ent)返回实体ent的整个dxfcode列表。
(assoc 0(entget-ent))返回形式为(0)“LWPOLYLINE”或您选择的任何类型的实体的关联列表。
因此(cdr(0。“LWPOLYLINE”))只返回“LWPOLYLINE”
 
您需要熟悉实体的dxfcode。entsel只返回entityname(实际上只是一个数字)。
entget为您提供了有关实体的每个细节的列表。
 
ymg公司
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

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

铜币
475
发表于 2022-7-5 18:22:07 | 显示全部楼层
 
 
谢谢你的信息,很高兴知道。如果我理解正确的话,entget是一个功能强大得多的函数,尤其是对于If语句,因为它返回所选实体的特定类型?此外,在LISP的if语句中,您是否能够包括多个实体,如VBA(即if“LWPOLYLINE”“LINE”“ARC”)等,还是必须为每种不同类型的实体分别编写if语句?
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

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

铜币
475
发表于 2022-7-5 18:23:13 | 显示全部楼层
所以我对代码做了一些修改,以便合并break的所有函数(我决定将其切换为条件语句,而不是if),但仍然存在一些问题。代码运行时,允许我选择一个对象,然后它有几个QUINK。1) 它让我再次选择对象,如果它是一条直线,然后它说错误:坏函数:T。但是它确实破坏了它。然而,如果它是一个功能线,它将根本不起作用。
  1. (defun c:break2 ( / ent)
  2. (setq ent (car (entsel "\nSelect Object: "))); Has user select object
  3. (cond (= enttype "AECC_FEATURE_LINE")
  4. (princ "._AeccBreakFeatures")
  5. (command "_.break" pause "_f")
  6. (princ "\nBreak point: ")
  7. (command pause "@")
  8. )
  9. (t   
  10. (princ "Break Point")
  11. (command "_.break" pause "_f")
  12.   (princ "\nBreak point: ")
  13.   (command pause "@")
  14.   )
  15. )
  16. (princ)
  17. )
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 18:28:38 | 显示全部楼层
brocos15,
 
您正在显示的最后一个代码无法工作。
 
您从哪里获得enttype的值???
 
同样在你的例子中,我不认为需要条件测试
由于这两种情况都执行相同的命令。
 
唯一不同的是你选择的对象的类型。
 
要获取类型,需要(cdr(assoc 0(entget ent))语句。
 
此外,如果您检查(entsel)语句的返回,您将看到
您将得到一个包含2项的列表。第一个是实体名称(不要将其与实体类型混淆),
第二个是拾取实体的点。
 
因此,如果你设置了osnap,你可以想出一种方法,通过一次选择来实现休息。
 
ymg公司
回复

使用道具 举报

17

主题

1274

帖子

25

银币

后起之秀

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

铜币
260
发表于 2022-7-5 18:32:19 | 显示全部楼层
在CUI快捷菜单下的“我的线对象”菜单中,我添加了宏:
名称:打断线@
宏:^C^C^P(setq ss(ssget))(命令“\u break”ss);\@^C^C^P(progn(setq ss nil)(princ))
 
它也包含在我的LPline对象菜单和Arc对象菜单中。
因此,我可以选择一条直线、多段线或圆弧,单击鼠标右键,选择“Break line@”,然后选择“Break point”。如果一行行在另一行之上,用(entsel)选择正确的一行可能会很困难。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:34:13 | 显示全部楼层
broncos15对DXF代码做了一些家庭工作,这些代码与assoc和entmake一起使用,另一种方法是使用VLlisp,您可以通过名称获取属性,例如“assoc 8”是一个层名称Vl使用“get layer”
 
car cadr caddr等(8。“layer2”)car=8,cadr=“layer2”(123.45 678.90)car 123.45,cadr 678.90
 
一个简单的dxf代码示例(princ(entget(car(entsel)))拾取各种对象,看看所有信息,有些信息会很明显
回复

使用道具 举报

55

主题

402

帖子

357

银币

后起之秀

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

铜币
274
发表于 2022-7-5 18:38:17 | 显示全部楼层
试试这个:-
 
  1. (defun c:brk (/ a b)
  2. (if (setq a (car (entsel "\nSelect Object : ")))
  3.    (progn
  4.      (setq b (cdr (assoc 0 (entget a))))
  5.      (cond ((eq b "LWPOLYLINE")
  6.      (command "_.break" a pause "@")
  7.     )
  8.     [color="red"][b]([/b][/color]t (command "_.break" a pause "@")[color="red"][b])[/b][/color] [b][color="blue"]; edit here as per your requirement[/color][/b]
  9.      )
  10.    )
  11. )
  12. (princ)
  13. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 23:28 , Processed in 0.443617 second(s), 83 queries .

© 2020-2025 乐筑天下

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