shailujp 发表于 2022-7-5 23:17:06

两者的区别是什么

我看到有时在SSGET中使用INSERT,有时使用BLOCK来捕获块。这两者与它需要使用的任何特定应用程序有什么区别?
 
请导游。

MSasu 发表于 2022-7-5 23:23:46

块是块的定义,而插入是实例(即它在图形中的插入)实体。

shailujp 发表于 2022-7-5 23:28:50

米尔恰,
 
我不确定我是否理解你解释的内容。我的英语不好应该受到责备

(tblsearch "BLOCK" "SW_TABLEANNOTATION_0")

(setq swbom (ssget "_x" '((0 . "INSERT")(2 . "SW_TABLEANNOTATION_0"))))

 
你能解释一下吗?Tblsearch使用BLOCK,SSGET使用INSERT?这个可以切换并且仍然是一样的吗?

Bhull1985 发表于 2022-7-5 23:33:51

不是Msasu,但我想我可以为你回答这个问题。
 
每个块都有一个定义和一个参考。
块定义是图形文件块名中的定义。DWG,假设块名插入到空白图形中,则如果要在每次新插入块名时反映出所做的更改,您将修改它。
 
如果将此新块定义“BLOCKNAME”插入到已具有块“BLOCKNAME”的图形中,但在修改之前,由于图形中当前存在的定义,新插入的“BLOCKNAME”将显示为旧的“BLOCKNAME”。该定义是在您对块进行更改之前将其放置在那里存储的,换句话说:第一次插入该块时,除非另有说明,否则图形认为所有这些块的外观都是这样的。以下是您的做法:
 
您要做的只是确保所有相应的块参照都已从dwg中删除,通常通过清除方法完成。一旦不再引用BLOCKNAME,您可以插入新的“BLOCKNAME”定义,块现在将以图形方式显示为“BLOCKNAME”图形文件中的定义,因为图形中仍然没有对旧块名的引用来阻止其拾取新更改。
 
通过编程方式,在命令行中,您可以清除前面提到的所有内容以解决此问题,但也可以使用lisp的形式:
 
BlockNEW是BlockOLD修改的,好吗?
你有一个现有的block,你刚刚做了一些更改,所以现在你有BlockOLD和BlockNEW。
在空白图形中插入BlockNEW时,效果良好。
将BlockNEW插入到已放入BlockOLD的图形中(并且可见或不可见地驻留在dwg数据库中,这就是为什么使用清除)时,BlockNEW将显示为BlockOLD,因为该图形中的引用尚未更新。
为此,可以使用以下lisp命令:

(command "insert" "BlockOLD=BlockNEW")

键入的内容与此完全相同,其中BlockOLD位于图形中,而BlockNEW位于autocad搜索路径中的标准目录中。
显然,BlockOLD和BlockNEW是我用的变量名,如果需要这一点信息,那么lisping可能不是阅读本文的人往下读的正确途径,但我添加这句话只是为了确保任何阅读本文的人在我说“完全像那样”时都不会接受我的专业知识。我的意思当然是用括号、引号和等号。
 
如果您有任务,例如,在25个新图形中插入BlockNEW。。。。。在你将BlockNEW插入第一个空白图形,然后意识到你在线型、图层或其他方面搞砸了。。。
您可以对块定义进行更改,保存它们,然后返回到第一个空白图形,这就是您更新BlockNEW以反映刚刚修复的更改的方式。
方法一是清除。。。。擦除块,然后清除它。再次插入BlockNEW后,它看起来应该是这样的(只需更改线型、图层等)
或者,可以使用lisp更新块参照,方法是使用类似的代码行。

(command "insert" "BlockNEW=")

就这样。它将通过重新定义其引用将旧块更新为新块。
 
HTH和足够清晰和正确,值得一试。

Bhull1985 发表于 2022-7-5 23:38:56

在我的回复中,我没有触及TBLSEARCH,因为我认为Msasu会来为我们澄清它,以及它如何与定义和引用相关。
一、 e.我认为,因为TBLSEARCH通过字典进行搜索,字典包含在每个单独的图形中,所以TBLSEARCH将定位引用,而不是定义。
但我认为,Msasu会最好地解释,或者另一位大师。只是想帮助一些人。

cwake 发表于 2022-7-5 23:43:01

当您想要访问定义而不是图形中的插入引用时,可以使用tblsearch(或者tblnext或tblobjname)。
“BLOCK”只是表的名称。还有其他几个表格用于线型、图层、文字样式等。
这可能有助于。。。http://www.afralisp.net/autolisp/tutorials/into-the-database.php或请参阅Autodesk的《DXF参考指南》。这些将帮助您了解表的结构和访问方式。
 
相反,正如Brandon和Mircea所解释的那样,插入是指图纸中块的参考。

shailujp 发表于 2022-7-5 23:49:37

Mircea、Brandon和Clint,
 
非常感谢你的帮助。
 
我还有一个关于AND和NOT的问题。在代码#1中,仅使用一次,而不是每行使用一次。为什么我不能按照代码#2来做,其中不包括所有3行。我问这个问题是因为我为我的一个任务编写了代码#2,但它不起作用,但仍然不确定为什么它不起作用。
 
代码#1

(if (and   
       (tblsearch "LAYER" "AM_0")
       (tblsearch "LAYER" "AM_3")
       (tblsearch "LAYER" "AM_7")


      (not (tblsearch "LAYER" "FORMAT"))
      (not (tblsearch "LAYER" "OBJECT_LINE"))
      (not (tblsearch "LAYER" "PHANTOM"))
    )
(progn...

 
代码#2

(if (and   
       (tblsearch "LAYER" "AM_0")
       (tblsearch "LAYER" "AM_3")
       (tblsearch "LAYER" "AM_7")
   
      
      (not (tblsearch "LAYER" "FORMAT")
             (tblsearch "LAYER" "OBJECT_LINE")
             (tblsearch "LAYER" "PHANTOM")
      )
    )
(progn...

cwake 发表于 2022-7-5 23:55:29

“not”函数只接受一个参数,而不是三个。在发布的代码中,它正在检查三个层中的每一个都不存在。因此它寻找第一个,如果它不在那里,它将返回nil,'not函数将其计算为T,然后处理转到下一行。如果存在,它将返回一个列表,'not函数将其计算为nil。如果发生这种情况,则'和函数的评估结束。

shailujp 发表于 2022-7-6 00:01:52

 
如果三条线合并在一条线上,这有关系吗?这样地。。。
 

(not (tblsearch "LAYER" "FORMAT") (tblsearch "LAYER" "OBJECT_LINE") (....) )

还有什么替代方法可以一次验证,而不是三行验证?

MSasu 发表于 2022-7-6 00:02:48

您应该使用允许多个参数的函数,因为NOT只接受一个参数:
(not (and (tblsearch "LAYER" "FORMAT")
         (tblsearch "LAYER" "OBJECT_LINE")
         (tblsearch "LAYER" "PHANTOM")))
页: [1] 2
查看完整版本: 两者的区别是什么