Lee Mac 发表于 2022-7-6 15:22:29

Cond语句问题

好的,我在试验LOGAND命令,只是作为一个学习练习。
 
我试着构建这个LISP:
 

(defun c:BXLister (/ BX_Ans BX_Ent BX_List)
   (initget "Blocks Xrefs")
   (setq BX_Ans (getkword "\nList Blocks or XRefs? <Both> : "))
   (cond
   ((= BX_Ans "Blocks")
    (setq BX_Ent(tblnext "BLOCK" T)
          BX_List "Blocks: \n"
    ) ;_end setq
    (while    BX_Ent
      (if (eq 0 (logand 0 (cdr (assoc 70 BX_Ent))))
      (setq BX_List (strcat BX_List (cdr (assoc 2 BX_Ent)) "\n"))
      ) ;_end if
      (setq BX_Ent (tblnext "BLOCK"))
    ) ;_end while
   )
   ((= BX_Ans "XRefs")
    (setq BX_Ent(tblnext "BLOCK" T)
          BX_List "XRefs: \n"
    ) ;_end setq
    (while    BX_Ent
      (if (eq 4 (logand 4 (cdr (assoc 70 BX_Ent))))
      (setq BX_List (strcat BX_List (cdr (assoc 2 BX_Ent)) "\n"))
      ) ;_end if
      (setq BX_Ent (tblnext "BLOCK"))
    ) ;_end while
   )
   ((/= BX_Ans "XRefs" "Blocks")
    (setq BX_Ent(tblnext "BLOCK" T)
          BX_List "Blocks & XRefs: \n"
    ) ;_end setq
    (while    BX_Ent
      (setq BX_List (strcat BX_List (cdr (assoc 2 BX_Ent)) "\n"))
      (setq BX_Ent (tblnext "BLOCK"))
    ) ;_end while
   )
   ) ;_end cond
   (alert BX_List)
   (princ)
) ;_end defun


 
我打算根据用户的输入列出外部参照或块。
 
然而,事实上,我遇到的问题并不是logand函数-问题发生在用户输入以列出外部参照时-程序将列出块和外部参照。
 
我认为cond语句有错误,但我看不出是什么
 
提前谢谢各位。

Lee Mac 发表于 2022-7-6 15:33:41

好啊
 
我以不同的方式执行了相同的任务-为了每个人的利益发布:
 

(defun c:BXLister (/ BX_Ent BX_BList BX_XList)
   (setq BX_Ent   (tblnext "BLOCK" T)
   BX_BList "Blocks: \n"
   BX_XList "Xrefs: \n"
   ) ;_end setq
   (while BX_Ent
   (if (eq 0 (logand 0 (cdr (assoc 70 BX_Ent))))
       (setq BX_BList (strcat BX_BList (cdr (assoc 2 BX_Ent)) "\n"))
   ) ;_end if
   (if (eq 4 (logand 4 (cdr (assoc 70 BX_Ent))))
       (setq BX_XList (strcat BX_XList (cdr (assoc 2 BX_Ent)) "\n"))
   ) ;_end if
   (setq BX_Ent (tblnext "BLOCK"))
   ) ;_end while
   (alert (strcat BX_BList "\n" BX_XList))
   (princ)
) ;_end defun

David Bethel 发表于 2022-7-6 15:37:16

李,
 
单步遍历非图形表的最简单方法是(while)调用:
 
 
大卫

Lee Mac 发表于 2022-7-6 15:42:18

了不起的大卫,
 
我在使用while进行操作之前先使用cond,这让我觉得很尴尬。
 
我喜欢你的Lisp程序-谢谢。

CALCAD 发表于 2022-7-6 15:51:07

嗨,李,
关于您使用COND的第一个代码示例,我还没有对其进行足够的研究,以完全理解您在做什么,但我确实注意到了这句话
(/=BX_Ans“XRefs”“Blocks”)。我的参考文献中说,不等于函数的定义没有两个以上的参数。这可能是个问题。奇怪的是,在参考手册中,函数是写的(/=atom-atom…),提出两个以上的论点!我猜是打字错误。

Lee Mac 发表于 2022-7-6 15:55:32

我的印象是这些功能:
 
=,/=,=可以接受任意数量的参数。
 
如果键入:
 

(/= 4 5 6)

在命令行中,它返回T。
 
谢谢你的时间。

Lee Mac 发表于 2022-7-6 16:03:13

大卫,
 
只是出于好奇,你是在发帖时手动为每个括号指定不同的颜色,还是有一个程序可以帮你这么做?

CAB 发表于 2022-7-6 16:04:58

我喜欢大卫的。
对此修改输出:
4

CALCAD 发表于 2022-7-6 16:15:21

李,
我对不相等函数的研究很少,结果发现了我的两个参考文献中的错误或遗漏
在Autolisp中,该函数的非标准行为(对我来说)令人惊讶。您可能希望测试Autocad 2004,看看它是否
符合以下要求:
从Autocad 2008联机帮助文件中提取:
.... 如果没有两个连续参数的值相同,则返回T;否则为零。如果只提供了一个参数,/=返回T。
注意,/=的行为并不完全符合其他LISP方言。如果列表中没有两个参数具有相同的值,则标准行为是返回T。在AutoLISP中,如果没有连续参数具有相同的值,则/=返回T;请参阅下面的示例。
示例
(/=10 20)返回T
(/=“you”“you”)返回nil
(/=5.43 5.44)返回T
(/=10 20 10 20)返回零
(/=10 20)返回T
注意:在最后一个示例中,虽然列表中有两个参数具有相同的值,但它们并不跟随在一起;因此/=计算为T。

David Bethel 发表于 2022-7-6 16:18:34

(/=)函数一直都很脆弱,文档编写得很糟糕。我不惜一切代价避免它,因为它几乎没有实际价值。
 
李,
 
我写了一个程序,可以读取。LSP文件并将其格式化为HTML很早以前。不久前,当CADTutor更改了格式并对其进行了一些调整时,我将其重新编辑为BBC的输出。我一直认为彩色编码的paraenthisis是一个很好的校对工具。也是一个很好的学习工具。
 
我不太喜欢结尾评论;如果结束
 
我在开发一个非常拉格雷罗图因时不时使用它们,但在最终版本中省略了它们-大卫
页: [1] 2
查看完整版本: Cond语句问题