mwade93 发表于 2022-7-5 16:44:12

条件块插入

我想我已经接近这个代码了。在发布这部分lisp之前,代码设置了MFRMODEL和ORN变量。我想要做的是让LISP插入现有块(如果可用)。如果该块不可用,请根据之前输入的ORN变量选择要插入的块,然后按照命令操作。问题是,此代码仅在图形中当前存在块时有效。我的所有块都作为外部DWG文件定位,它们不会插入。任何帮助都将不胜感激。
 
(if (tblsearch "BLOCK" MFRMODEL)
   (command "layer" "s" "QF-EQPM" "" "insert" MFRMODEL pause "1" "1" pause "setvar" "clayer" CL)
   (
       (cond
         ((wcmatch ORN "PLAN")(command "layer" "s" "QF-EQPM" "" "insert" "GTC005P" pause "1" "1" pause "setvar" "clayer" CL "rename" "block" "GTC005P" MFRMODEL))
         ((wcmatch ORN "ELEV")(command "layer" "s" "QF-EQPM" "" "insert" "GTC005E" pause "1" "1" pause "setvar" "clayer" CL "rename" "block" "GTC005E" MFRMODEL))
         ((wcmatch ORN "SIDE")(command "layer" "s" "QF-EQPM" "" "insert" "GTJ011S" pause "1" "1" pause "setvar" "clayer" CL "rename" "block" "GTJ011S" MFRMODEL))
         ((wcmatch ORN "3D")(command "layer" "s" "QF-EQPM" "" "insert" "GTC0053" pause "1" "1" pause "setvar" "clayer" CL "rename" "block" "GTC0053" MFRMODEL))
       )
   )
)

mwade93 发表于 2022-7-5 16:48:27

我现在大部分时间都在工作。然而,一旦到达重命名部分,它就会崩溃。必须在区块名称周围加引号。

David Bethel 发表于 2022-7-5 16:52:22

当目标块名称已存在于数据库中时,重命名阻止。
 
MFRMODEL也应该用引号括起来吗?
(tblsearch "BLOCK" MFRMODEL)
-大卫

mwade93 发表于 2022-7-5 16:57:43

如果我上面有这些就不行了。在发出命令的LISP部分之前设置MFRMODEL。
 
如果这些块已经存在,则不应重命名或插入它们。块将插入tblsearch的真实部分。

Grrr 发表于 2022-7-5 16:59:18

为什么使用附加语法?

(if (tblsearch "BLOCK" MFRMODEL)
(command "layer" "s" "QF-EQPM" "" "insert" MFRMODEL pause "1" "1" pause "setvar" "clayer" CL)
(
   (cond
   ((wcmatch ORN "PLAN")(command "layer" "s" "QF-EQPM" "" "insert" "GTC005P" pause "1" "1" pause "setvar" "clayer" CL "rename" "block" "GTC005P" MFRMODEL))
   ((wcmatch ORN "ELEV")(command "layer" "s" "QF-EQPM" "" "insert" "GTC005E" pause "1" "1" pause "setvar" "clayer" CL "rename" "block" "GTC005E" MFRMODEL))
   ((wcmatch ORN "SIDE")(command "layer" "s" "QF-EQPM" "" "insert" "GTJ011S" pause "1" "1" pause "setvar" "clayer" CL "rename" "block" "GTJ011S" MFRMODEL))
   ((wcmatch ORN "3D")(command "layer" "s" "QF-EQPM" "" "insert" "GTC0053" pause "1" "1" pause "setvar" "clayer" CL "rename" "block" "GTC0053" MFRMODEL))
   )
)
)
 
然而,尝试一下这样的[未经测试的](我记得出于某种原因,你不喜欢setq):
 

(
(lambda ( nbnm obnm nlyr olyr cmd )
   (cond
   ( (not (tblsearch "LAYER" nlyr)) (princ (strcat "\nLayer \"" nlyr "\" does not exist.")) )
   ( (not olyr) (princ "\nInvalid \"CL\" symbol.") )
   ( (not (tblsearch "LAYER" olyr)) (princ (strcat "\nLayer \"" olyr "\" does not exist.")) )
   (
       (setvar 'cmdecho 0)(setvar 'clayer nlyr)
       (cond
         ( (not nbnm) (princ "\nInvalid \"MFRMODEL\" symbol.") )
         ( (tblsearch "BLOCK" nbnm) (not (command "_.INSERT" nbnm "\\" "1" "1" "\\")) )
         ( (not obnm) (princ "\nInvalid \"ORN\" symbol.") )
         ( (not (tblsearch "BLOCK" obnm)) (princ (strcat "\nBlock \"" obnm "\" does not exist.")) )
         (T (not (command "_.INSERT" obnm "\\" "1" "1" "\\")) (command "_.RENAME" "block" obnm nbnm) )
       )
       (setvar 'clayer olyr)(setvar 'cmdecho cmd)
   )
   )
   (princ)
)
(if (and (eq 'STR (type MFRMODEL)) (snvalid MFRMODEL)) MFRMODEL)
(cdr (assoc ORN '(("PLAN" . "GTC005P") ("ELEV" . "GTC005E") ("SIDE" . "GTJ011S") ("3D" . "GTC0053"))))
"QF-EQPM"
(if (and (eq 'STR (type CL)) (snvalid CL)) CL)
(getvar 'cmdecho)
)
 
P、 别评判我,罗伊!

mwade93 发表于 2022-7-5 17:04:23

谢谢您的邮件Grrr。第二组引号是因为这是tblsearch的错误声明。对不起,我不知道你发布的第二个代码是什么。我决不是这方面的专家。我发布的代码花了我大约一整天的时间才达到这一点。
 

Grrr 发表于 2022-7-5 17:09:38

您应该会得到错误:错误函数:。。。如果if函数的测试表达式为false(我的意思是nil)。
 
应与您的行为相同,等待MFRMODEL或CL符号输入并运行“INSERT”命令,否则指出无效输入。

mwade93 发表于 2022-7-5 17:14:03

它似乎运行良好。谢谢Grrr
 
我有一些其他模型,但我想我知道在哪里修改代码。这就是我需要改变的那一行,对吗?列为以下内容的行:
 
cdr (assoc ORN '(("PLAN" . "GTC005P") ("ELEV" . "GTC005E") ("SIDE" . "GTJ011S") ("3D" . "GTC0053"))))

Grrr 发表于 2022-7-5 17:15:21

 
是的,这个协会列表可以替代你使用的cond。
顺便说一句,我在帖子中修改了代码(有很多拼写错误)。

mwade93 发表于 2022-7-5 17:20:33

我们必须对此进行一点调查。只是没有动力深入研究这个问题。谢谢你的帮助
页: [1] 2
查看完整版本: 条件块插入