flopo 发表于 2022-7-6 09:13:19

结合2个LISP选择最后一个

大家好,
我在这个网站上找到了一个lisp(loo.lsp),它允许我选择最后绘制的n个实体。我编写了自己的lisp(curve.lisp)来绘制管道对象-曲线。我想插入loo。曲线中的lsp。lsp能够移动使用曲线绘制的所有对象。lsp-(13个对象、直线和圆弧-在本例中)。需要帮忙吗?
 
谢谢
 
 
 
 
曲线。LSP
 
 
(defun c:曲线()
(setq DIA(getreal“\nDN:”))
(setq RC(getreal“\nRadius:”))
(SETQ UNGHI(getreal“\ nAngle:”))
(SETQ ANG(/(*UNGHI pi)180))
(SETQ ANG/2(*ANG 0.5))
(defun DTR(deg)(*deg(/PI 180)))
 
(if(=直径50)(setq di 0.0603))
(if(=直径80)(setq di 0.0889))
(if(=直径100)(setq di 0.1143))
(if(=直径150)(setq di 0.1683))
(if(=直径200)(setq di 0.2190))
(if(=直径250)(setq di 0.273))
(if(=直径300)(setq di 0.3239))
(if(=直径350)(setq di 0.3556))
(if(=直径400)(setq di 0.4064))
(if(=直径450)(setq di 0.4572))
(if(=直径500)(setq di 0.508))
(if(=直径600)(setq di 0.6096))
(if(=直径700)(setq di 0.710))
(if(=直径800)(setq di 0.813))
(if(=直径900)(setq di 0.914))
(setq PCEN(getpoint“\n中心点:”)
(SETQ PC1(极性PCEN(DTR 270)(+RC(/DI 2)))
(SETQ PC2(极性PC1(DTR 180)0.5))
(SETQ PC3(极性PC2(DTR 90)DI))
(SETQ PC4(极性PC1(DTR 90)DI))
(SETQ PCI1(极性PC1(DTR 90)(/DI 2)))
 
(SETQ DPCIPCI1(*RC(/(SIN ANG/2)(COS ANG/2)))
(setq PCI(极性PCI1(DTR 0)DPCIPCI1))
(setq PCI2(极性PCI(DTR UNGHI)DPCIPCI1))
 
(setq PC5(极性PCI2(DTR(+270 UNGHI))(/DI 2)))
(setq PC6(极性PC5(DTR UNGHI)0.5))
(setq PC7(极性PC6(DTR(+90 UNGHI))DI))
(setq PC8(极性PCI2(DTR(+90 UNGHI))(/DI 2)))
(SETQ PCI11(极性PCI1(DTR 180)0.5))
(SETQ PCI22(极性PCI2(DTR UNGHI)0.5))
(命令“CLAYER”“CONTUR”)
(命令“-COLOR”“BYLAYER”“”)
(命令行“PC1 PC2 PC3 PC4 PC1”)
(命令行“PC5 PC6 PC7 PC8 PC5”)
(命令“ARC”“C”PCEN PC4 PC8”)
(命令“ARC”“C”PCEN PC1 PC5”)
 
(命令“CLAYER”“AXE”)
(命令“-COLOR”“BYLAYER”“”)
(命令“ARC”“C”PCEN PCI1 PCI2“”)
(命令行“PCI11 PCI1”)
(命令行“PCI2 PCI22”)
 
 
 
;(命令“loo”13)。。。。。????????
;(命令“move”“p”。。。。。。。???????????
(普林斯)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
鲁。LSP
(defun lastn(INT2/SS2-SSL2);定义函数以获取1个参数
(setq SS2(ssadd));将SS2设置为空选择集
(重复INT2;重复INT2次
(if(entlast)
(程序
(ssadd(entlast)SS2);将最后一个未删除的对象添加到选择集
(entdel(entlast));删除最后一个未删除的对象
)
)
)
(setq SSL2(1-(sslength SS2));将SSL2设置为小于选择集大小的1
(而(>=SSL2 0);当SSL2大于或等于零时
(entdel(ssname SS2 SSL2));取消删除选择集中的SSL2'th对象
(setq SSL2(1-SSL2));减量SL2
)
SS2;将选择集返回到调用函数
)                                                      ;结束(lastn)函数
(defun C:loo(/COUNT2);定义函数
;将COUNT2设置为对象数
(setq COUNT2(getint“\n输入对象数:”)
(如果(=0(getvar“CMDACTIVE”));如果没有其他命令处于活动状态
(程序;其他
(命令“_SELECT”(lastn COUNT2)”;运行SELECT命令和(lastn)
(普林斯);悄悄退出
)
(lastn COUNT2);带参数的call(lastn)函数
)
)

BlackBox 发表于 2022-7-6 09:23:54

Flopo-
 
首先,请记住使用
在运行代码之前键入StoreLast。然后键入CheckLast,它会显示创建了多少个实体并将其选中。
 
顺便说一句,我不久前做过类似的东西。这叫做“结果选择”。附件。它需要在开始时加载(我通常只是通过acaddoc.lsp或MNL文件或任何方式加载)。然后,您应该有一个新的命令结果,可以通过在单引号的结果前面加前缀来透明地发出该结果。这允许您选择在前5个命令中创建的实体。如果需要更多,请修改存储在lisp第19行的$Result-Length变量中的数字。
 
编辑:我真的需要开始研究lisp变量/函数命名的一些标准化!当我注意到$前缀时,我才意识到多年来我的“偏好”是如何自我调整的
选择结果。lsp

irneb 发表于 2022-7-6 09:40:44

Flopo,我宁愿用这个帖子回复,也不愿用PM。也许其他人也可以学习。
我选择了保留最后一个想法。select result是一段更为comlpex的代码,它可以与acad中的任何命令一起工作——在lisp例程中使用起来并不那么简单。
 
顺便说一句,我还想把你的变量添加为局部变量。。。但在第一轮之后就放弃了。本地化lisp变量总是一个好主意。尽管有这么多人,这会让人痛苦!你能试着重用代码中的一些变量而不是每次都创建一个新的吗?它还可能有助于减少代码的RAM需求。
 
编辑:只是为了对自己学究气。。。ssadd不需要设置。它实际上修改了选择集,而不是创建一个新的选择集。因此,这应该执行完全相同的操作:
这里我再次用这些前缀和后缀!现在是下划线!世界跆拳道联盟?我想我的个性分裂了!最近有人听到我用不同的声音说话吗?

irneb 发表于 2022-7-6 09:48:03

谢谢,太好了!

flopo 发表于 2022-7-6 09:55:04

另一个建议是,你可能会编写更多涉及管道直径的例程,我会将第二个直径大小拉到一个单独的defun,以这种方式自动加载,任何未来的例程都可以利用它,同样,如果你有新的管道,你只需添加到一个例程。例如450p 450s 450g塑料、钢、玻璃reo。
 
(getnewdia dia)返回DI

BIGAL 发表于 2022-7-6 10:04:13

是的,当你更多地使用这些defuns时,你会注意到你不断地重复输入相同的东西。这通常是开始创建一些库函数的好时机,因此您可以简单地调用它们,而不是重写/复制粘贴。
 
不过我很高兴它对你有用。快乐的Lisp程序!

irneb 发表于 2022-7-6 10:14:03

页: [1]
查看完整版本: 结合2个LISP选择最后一个