学习Lisp“折线宽度”
我还在学习Lisps,需要一个函数。我不会说我需要它做什么,我想试着从这个论坛的输入中编写lisp。我需要知道如何存储用户选择的多段线的多段线宽度。例如,如果我选择一条多段线并运行lisp,反之亦然,lisp将把选定多段线的全局宽度存储到内存中。
(setq PW(ssget“多段线宽度”)
在我得到这些信息后,我会发布我的lisp以及它的功能。之后你们可以分享一下你们会怎么做。这可能会比我的方式更好。
提前谢谢。 假设您引用的是LWMOLYLINE的全局(恒定)宽度,则宽度值与DXF组43相关联:
(defun c:test ( / ent enx )
(if (setq ent (car (entsel)))
(if (= "LWPOLYLINE" (cdr (assoc 0 (setq enx (entget ent)))))
(princ (strcat "\nThe polyline width is " (rtos (cdr (assoc 43 enx)))))
(princ "\nThe selected object is not a polyline.")
)
(princ "\nNo object selected.")
)
(princ)
) 这就是我想要的,也许我可以从这里接受。
我不想输出字符串,而是想将该值放入内存,以便在另一个命令中使用。
让我试试看,如果我想不出来,我会寻求更多帮助。谢谢
谢谢你!我做到了!!!可能没有你做的那么好,但我做到了!
(defun c:px nil
(if (setq ent (car (entsel)))
(if (= "LWPOLYLINE" (cdr (assoc 0 (setq enx (entget ent)))))
(setq pw (rtos (cdr (assoc 43 enx)))))
)
(command "explode" ent)
(command "pedit" "m" "p" "" "w" pw"")
(princ)
)
此lisp在保持宽度的同时对多段线进行XPLOD。
从技术上讲,它获取宽度,将其存储在内存中,分解LWPOLYLINE,将线转换为LWPOLYLINE,然后添加“pw”的宽度
它只是点击,我可能需要添加一个“peditacept”,以防大多数人将其设置为0。
我想知道更好的方法是什么。 与其正确地将其称为save in memory,不如保存一个“全局”变量,以便在同一dwg会话中进一步使用。唯一的问题可能是您编写了另一个使用pw的程序。可以在dwg中保存变量,例如USERI1-5 5整数、USERR1-5 5 reals
但它们同样可以被覆盖。如果保存全局变量,可以使用前缀GLBpw,并在某处保留一个列表,列出您使用过的描述。
(setvar "userr1" 0.25) ; sets userr1 value
(getvar "userr1") ; retrieves the value
(defun c:px ( / ent) ; implies ent is a local variable and will not be saved at end of defun
just me added a space after pw
(command "pedit" "m" "p" "" "w" pw "")
差点忘了,如果你想保存很多变量并在图形中使用它们,然后保存到一个简单的txt文件并根据需要读取。让它成为acaddoc中的库defun。lsp可以在任何时候使用。
谢谢
我仍在学习Lisp,并理解Lisp中的记忆。我用了零,因为我不是百分之百有信心。我确实理解它的重要性,所以我将添加它,以防其他Lisp最终使用“pw”作为变量。
谢谢大家。
做得好!
有许多方法可以进一步开发代码,以解释和缓解每一种可能的错误-最初的改进是解释无效或无效的选择,例如:
但是可以进一步说明锁定层,检查以确保在调用PEDIT命令之前在调用EXPLODE命令之后生成有效对象。 嗨,李,
我很好奇,在不使用以下公式的情况下,是否可以用entsel/entsel方法解释锁定层:
(ssget "_+.:E:S:L")
我认为唯一的方法是访问实体的层定义,并在其状态被锁定时从中检索。因此,上面的一行显示了这个问题简化了多少。我可以想到的另一种方式是:
(setq s (ssadd))
(ssadd (car (entsel "\nSelect entity: ")) s)
(sssetfirst nil s)
(/= 0 (sslength (ssget "_.+:I:L"))); here we can check if the selected entity is on locked layer
(sssetfirst nil nil) 下面是一个示例:
(defun c:px ( / cmd ent enx ped )
(setvar 'errno 0)
(while (/= 52 (getvar 'errno))
(setvar 'errno 0)
(setq ent (car (entsel "\nSelect polyline <exit>: ")))
(cond
( (= 7 (getvar 'errno))
(prompt "\nMissed, try again.")
)
( (null ent)
(prompt "\nExit.")
)
( (/= "LWPOLYLINE" (cdr (assoc 0 (setq enx (entget ent)))))
(prompt "\nSelected object is not an LWPolyline.")
)
( (= 4 (logand 4 (cdr (assoc 70 (tblsearch "layer" (cdr (assoc 8 enx)))))))
(prompt "\nSelected polyline is on a locked layer.")
)
( (setq cmd (getvar 'cmdecho)
ped (getvar 'peditaccept)
)
(setvar 'cmdecho 0)
(setvar 'peditaccept 1)
(command
"_.explode" ent
"_.pedit" "_m" "_p" "" "_w" (cdr (assoc 43 enx)) ""
)
(setvar 'peditaccept ped)
(setvar 'cmdecho cmd)
)
)
)
(princ)
) 谢谢你,李
我刚刚写了一些类似的东西:
(defun C:test ( / e enx )
(while
(not
(and
(setq e (car (entsel "\nSelect LWpolyline on non-locked layer: ")))
(eq (cdr (assoc 0 (setq enx (entget e)))) "LWPOLYLINE")
(/= (cdr (assoc 70 (entget (tblobjname "LAYER" (cdr (assoc 8 enx)))))) 4)
)
)
e
)
(print enx); if successful
(princ)
)
我可能需要更深入地研究这个logand函数,因为这不是我第一次看到它被使用。
我想我今天的代码写完了。
页:
[1]
2