改进的Break-LISP例程
我有一个关于lisp例程的快速问题,该例程试图将break要素线和break命令组合成一个命令。我不熟悉Visual Lisp和Auto Lisp,所以我不确定它是否有类似VBA的else if语句(我更喜欢将else if用于break命令)。我的代码在下面,目前不工作,所以我很确定我在做一些愚蠢的事情。我假设我的错误在if语句中,但我不确定如何修复它。我通过结合我的两个中断对象的例程来创建代码。(defun c:break2 ( / ent)
(setq ent (entsel "\nSelect Object: ")); Has user select object
(if
(and ent (= "Pline" ))
(princ "Break Point")
(command "_.break" pause "_f")
(princ "\nBreak point: ")
(command pause "@")
)
(if
(and ent (= "Feature Line" ))
(princ "._AeccBreakFeatures")
(command "_.break" pause "_f")
(princ "\nBreak point: ")
(command pause "@")
)
(princ)
) 从这里开始:
(defun c:break2 ( / ent)
(setq ent (car (entsel "\nSelect Object: "))); Has user select object
(if (= (setq enttype (cdr (assoc 0 (entget ent)))) "LWPOLYLINE")
(progn
(princ "Break Point")
(command "_.break" pause "_f")
(princ "\nBreak point: ")
(command pause "@")
)
(if (= enttype "AECC_FEATURE_LINE")
(princ "._AeccBreakFeatures")
(command "_.break" pause "_f")
(princ "\nBreak point: ")
(command pause "@")
)
)
(princ)
)
非常感谢你的帮助!不幸的是,我在运行它时遇到了语法错误。我有几个关于它是如何工作的快速问题,因为我想理解它。
1) (if(=(setq enttype(cdr(assoc 0(entget ent))))“LWPOLYLINE”)的“car”和cdr部分具体做什么?
2) 为什么代码的第二部分需要(=enttype),而第一部分不需要?
3) 当代码甚至没有加载时(尝试使用vlide,但它说有很多参数),我该如何调试代码? broncos15,
(entget ent)返回实体ent的整个dxfcode列表。
(assoc 0(entget-ent))返回形式为(0)“LWPOLYLINE”或您选择的任何类型的实体的关联列表。
因此(cdr(0。“LWPOLYLINE”))只返回“LWPOLYLINE”
您需要熟悉实体的dxfcode。entsel只返回entityname(实际上只是一个数字)。
entget为您提供了有关实体的每个细节的列表。
ymg公司
谢谢你的信息,很高兴知道。如果我理解正确的话,entget是一个功能强大得多的函数,尤其是对于If语句,因为它返回所选实体的特定类型?此外,在LISP的if语句中,您是否能够包括多个实体,如VBA(即if“LWPOLYLINE”“LINE”“ARC”)等,还是必须为每种不同类型的实体分别编写if语句? 所以我对代码做了一些修改,以便合并break的所有函数(我决定将其切换为条件语句,而不是if),但仍然存在一些问题。代码运行时,允许我选择一个对象,然后它有几个QUINK。1) 它让我再次选择对象,如果它是一条直线,然后它说错误:坏函数:T。但是它确实破坏了它。然而,如果它是一个功能线,它将根本不起作用。
(defun c:break2 ( / ent)
(setq ent (car (entsel "\nSelect Object: "))); Has user select object
(cond (= enttype "AECC_FEATURE_LINE")
(princ "._AeccBreakFeatures")
(command "_.break" pause "_f")
(princ "\nBreak point: ")
(command pause "@")
)
(t
(princ "Break Point")
(command "_.break" pause "_f")
(princ "\nBreak point: ")
(command pause "@")
)
)
(princ)
) brocos15,
您正在显示的最后一个代码无法工作。
您从哪里获得enttype的值???
同样在你的例子中,我不认为需要条件测试
由于这两种情况都执行相同的命令。
唯一不同的是你选择的对象的类型。
要获取类型,需要(cdr(assoc 0(entget ent))语句。
此外,如果您检查(entsel)语句的返回,您将看到
您将得到一个包含2项的列表。第一个是实体名称(不要将其与实体类型混淆),
第二个是拾取实体的点。
因此,如果你设置了osnap,你可以想出一种方法,通过一次选择来实现休息。
ymg公司 在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)选择正确的一行可能会很困难。 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)))拾取各种对象,看看所有信息,有些信息会很明显 试试这个:-
(defun c:brk (/ a b)
(if (setq a (car (entsel "\nSelect Object : ")))
(progn
(setq b (cdr (assoc 0 (entget a))))
(cond ((eq b "LWPOLYLINE")
(command "_.break" a pause "@")
)
(t (command "_.break" a pause "@")) ; edit here as per your requirement
)
)
)
(princ)
)
页:
[1]
2