乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 20|回复: 13

[编程交流] 错误的参数类型:我想我&#

[复制链接]

13

主题

55

帖子

42

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-5 14:59:45 | 显示全部楼层 |阅读模式
大家好,
 
我正在编写一个小的lisp,遇到了以下问题:
 
如果我将选择集的名称直接放入sslength,它工作正常,但我处于循环中,因此我想放入一个变化的变量,但它不接受它。请参见下面的AutoCAD响应。
 
  1. Command: (sslength SELC2)
  2. 41
  3. Command: (sslength (read(strcat "SEL" ENT)))
  4. ; Error: Bad argument type: lselsetp SELC2
  5. Command: !ENT
  6. "C2"

从我有限的理解来看,这两种表达应该给出相同的结果,但事实显然并非如此。我需要做什么改变才能实现它?
 
谢谢你的帮助!
回复

使用道具 举报

15

主题

315

帖子

361

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 15:08:18 | 显示全部楼层
sslength需要一个ssget对象。(read不提供这一点。
 
我知道你在做什么了:制作一个拼写SELC2的字符串,希望它引用变量SELC2。
 
(注意:您可以在php中执行此操作,他们称之为“variable variable”。
$myvar=“你好,世界!”$a=“myvar”;打印$$a;=>将打印“你好,世界!”)
 
我不知道如何在lisp中这样做。如果有人有答案,我想自己知道。
 
你能告诉我们更多关于这个循环的信息吗?你在做什么?可能还有其他解决方案
回复

使用道具 举报

13

主题

55

帖子

42

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-5 15:12:21 | 显示全部楼层
嗯,这有点难以解释。我试图计算图形中块的出现次数,并将结果存储到单个变量中。该变量稍后用于将其放入表中。但不幸的是,我在计算foreach循环中发生的事情的第一步就吃力了。下面是代码:
 
  1. (defun C:TEST ()
  2. (setq CCLIST (list "C2" "CC" "CS1" "OFF" "PS1" "PS2" "SO"))
  3. (foreach ENT CCLIST
  4. (set (read(strcat "SEL" ENT)) (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat "*_" ENT "_*")))))
  5. (set (read(strcat "NO" ENT)) (sslength (read(strcat "SEL" ENT))))
  6. )
  7. )

 
 
如果它像我期望的那样工作,我就可以打字了!NOC2或!进入AutoCAD中的命令栏,获取图形中名称中包含字符串“C2”和“OFF”的块的数量。这些变量将在稍后编写的代码中使用
回复

使用道具 举报

13

主题

55

帖子

42

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-5 15:14:25 | 显示全部楼层
我想我的问题可能是列表中有一些值无法找到相应的块,因此ssget为零。这使得sslength成为一个问题。我会继续测试。
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 15:21:13 | 显示全部楼层
为什么不将这些值存储在列表中?你采取的方法非常非典型。
  1. (defun c:test (/ r s)
  2. (foreach str '("C2" "CC" "CS1" "OFF" "PS1" "PS2" "SO")
  3.    (setq r
  4.    (cons (cons str
  5.                (if (setq s (ssget "_X" (list '(0 . "INSERT") (cons 2 (strcat "*_" str "_*")))))
  6.                  (sslength s)
  7.                  0
  8.                )
  9.          )
  10.          r
  11.    )
  12.    )
  13. )
  14. (if r
  15.    (print (reverse r))
  16.    (print "No data...")
  17. )
  18. (princ)
  19. )
  20. ;; Returns
  21. ;; (("C2" . 0) ("CC" . 0) ("CS1" . 0) ("OFF" . 0) ("PS1" . 0) ("PS2" . 0) ("SO" . 0))
回复

使用道具 举报

13

主题

55

帖子

42

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-5 15:23:22 | 显示全部楼层
我将把变量NOxx的名称存储在一个列表中,以防它被创建。正如我所说,这只是一个较长宏的开始,我使用以下代码解决了我的问题。
 
 
 
  1. (defun C:CABIN ()
  2. (setq CCLIST (list "C2" "CC" "CS1" "OFF" "PS1" "PS2" "SO"))
  3. (foreach ENT CCLIST
  4. (if (setq SSENT (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat "*_" ENT "_*")))))
  5. (progn
  6. (set (read(strcat "NO" ENT)) (sslength SSENT))
  7. );progn
  8. );if
  9. );foreach
  10. );defun

 
 
现在我将把其他东西放入progn容器中继续
 
谢谢你的建议。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 15:29:01 | 显示全部楼层
与设置变量相比,使用ronjonp列表方法更好。在读取列表时,只需使用addrow方法将所有细节放入表中,即简单的双N。如果您需要有关表格位柱的帮助。在项目任意块上工作的旁注任意数量的属性动态表宽度不计算并支持多达2个深度属性总计门银把手5=10 v的门银把手6=8
 
你可以发布一个示例dwg我需要一些真正的dwg工作。可以把我的ssget换成你的。
 
给你一个开始
  1. (defun addsels (  ss1 / x)
  2. (repeat (setq x (sslength ss1))
  3. (setq ss  (ssadd (ssname ss1 (setq x (- x 1) ))ss))
  4. )
  5. )
  6. ; to be
  7. ; 4 choices a hard code list
  8. ; a select from all blocks dcl
  9. ; select from file
  10. ; pick block-s
  11. (setq CCLIST (list "C2" "CC" "CS1" "OFF" "PS1" "PS2" "SO" "aaa" "BBB")) ; aaa BBB for testing
  12. (setq ss  (ssadd))
  13. (foreach ENT CCLIST
  14. (if  (=(setq SSENT (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat "*_" ENT "_*")))))nil)
  15. (alert  (strcat "missing " ent))
  16. (addsels ssent )
  17. )
  18. )
  19. ;;;;;; starts here
  20. (setq lst '())
  21. ;(setq ss (ssget '((0 . "insert"))))
  22. (repeat (setq  x (sslength ss))
  23. (setq lst2 '())
  24. (setq obj (vlax-ename->vla-object (ssname ss (setq x (- x 1)))))
  25. (if (and (vlax-property-available-p obj "hasattributes")
  26. (setq atts (vlax-invoke obj "getattributes"))
  27. )
  28. (progn
  29. (setq lst2 (cons (vla-get-EffectiveName obj) lst2))
  30. (foreach att atts
  31. (setq lst2 (cons (vla-get-textstring att) lst2))
  32. )
  33. (setq lst (cons (reverse lst2) lst))
  34. )
  35. )
  36. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 15:32:10 | 显示全部楼层
 
  1. (sslength (eval (read (strcat "SEL" ENT))))
回复

使用道具 举报

15

主题

315

帖子

361

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 15:39:51 | 显示全部楼层
啊,酷。LISP也有eval
 
只知道有些人不是最大的粉丝
155948oy25u2577yj1qfjq.jpg
 
我甚至找到了一件lisp(不是Autocad)T恤
155949fiuo41l141nhlitz.jpg
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 15:43:57 | 显示全部楼层
 
你熟悉ASSOC吗?
  1. ;; Simple helper function
  2. (defun _get (key l)(cdr (assoc key l)))
  3. (setq l '(("C2" . 0) ("CC" . 0) ("CS1" . 0) ("OFF" . 88) ("PS1" . 0) ("PS2" . 0) ("SO" . 0)))
  4. (_get "OFF" l)
  5. ;; Returns 88
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 00:49 , Processed in 2.092091 second(s), 74 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表