乐筑天下

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

[编程交流] 绘制特定集团的BBox

[复制链接]

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:49:59 | 显示全部楼层 |阅读模式
大家好,
 
我正在尽全力,但仍然不明白为什么会出现这样的错误:
  1. Error: too many arguments

 
代码假设通过名为“VLD\uРАМКАКАV2”的特定动态块过滤选择,然后围绕每个具有该名称的选定块对象绘制边界框:
 
  1. ; Make a selection and filter certain block by its effective name
  2. ; Get and draw the boundingbox around each block object
  3. (defun c:test (/ blkname found objs ss name blk vlst ovar minpt maxpt crds)
  4. (if
  5.         (and
  6.                 (not
  7.                         (setq blkname "VLD_РАМКА_V2") ;<-BLOCK NAME
  8.                         (princ "\nSelect objects" )
  9.                         (setq found (tblsearch "BLOCK" blkname))
  10.                         (setq objs (ssadd))
  11.                         (setq ss   (ssget "_:L" '((0 . "INSERT"))))
  12.                 );not
  13.         );and
  14.         (progn
  15.                 (repeat
  16.                         (setq i (sslength ss))
  17.                         (setq name (vla-get-effectivename
  18.                                 (vlax-ename->vla-object
  19.                                         (setq blk (ssname ss (setq i (1- i))))
  20.                                 )
  21.                         )
  22.                         )
  23.                         (if (eq (strcase blkname) (strcase name))
  24.                                 (ssadd blk objs)
  25.                         )
  26.                 )
  27.                 (if objs
  28.                         (progn
  29.                                 (sssetfirst nil objs) ; is this required ?
  30.                                 (setq vlst '("CMDECHO" "OSMODE" "DIMASSOC")
  31.                                 ovar (mapcar 'getvar vlst))
  32.                                 (mapcar 'setvar vlst '(0 0 2))
  33.                                 (foreach obj  (mapcar 'vlax-ename->vla-object
  34.                                 (vl-remove-if 'listp (mapcar 'cadr (ssnamex objs))))
  35.                                 (vla-getboundingbox obj 'minpt 'maxpt)
  36.                                 (setq crds (mapcar 'vlax-safearray->list (list minpt maxpt)))
  37.                                
  38.                                 (command "_.rectangle" (car crds) (cadr crds))
  39.                                
  40.                                 (mapcar 'setvar vlst ovar)
  41.                                 );foreach
  42.                                 (princ (strcat "\nSelected " (itoa (sslength objs)) " blocks "))
  43.                         );progn
  44.                 ); if objs
  45.         );progn
  46.        
  47.         (cond
  48.                 ((null ss)
  49.                         (princ "\nEmpty Selection!") ;(C:test)
  50.                 )
  51.                 ((not blkname)
  52.                         (princ "\n Missed name of block ***")
  53.                 )
  54.                 ((not found)
  55.                         (princ "\n Block not found in drawing !!!")
  56.                 )
  57.                 (t
  58.                         (princ "\n couldn't find any block !!! ")
  59.                 )
  60.         );cond
  61. );if
  62. (princ)
  63. );defun
回复

使用道具 举报

1

主题

116

帖子

115

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 18:01:47 | 显示全部楼层
我从这里开始
http://help.autodesk.com/view/ACD/2015/ENU/?guid=GUID-991AD6A0-61AA-45C9-8C27-CADF9F36BE71
 
请注意,“not”函数只接受一个参数。你现在有五个。
 
我还要看看你的条件
符号“objs”指向上一个setq中的选择集。
即使选择集没有添加新实体,它仍将返回非nil值。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:09:25 | 显示全部楼层
早上好
 
除了克林特指出的,让我向你们展示一些你们可能不清楚的潜在错误。
 
测试此代码:
  1. ([color="blue"]if[/color] ([color="blue"]setq [/color]objs ([color="blue"]ssadd[/color]))
  2. ([color="blue"]alert [/color][color="magenta"]"Variable objs has values"[/color])
  3. ([color="blue"]alert [/color][color="magenta"]"Variable objs doesn't have any value"[/color])
  4. )

 
上述代码永远不会返回nil,因为函数ssadd总是有一个值,您可能会认为它只是一个变量声明,如果实体名称与您的条件匹配,则向其添加实体名称,因此您在项目中的语句(如果objs….永远不会等于nil,这被认为是获得代码预期结果的错误且不正确的方法。
 
因此,在这种情况下,您需要检查变量“objs”的值是否不止一个,因为函数ssadd的第一次返回将有一个选择集。
 
包含在cond函数中的代码永远不会返回nil,因为变量“blkname”的值是原始块名(字符串类型),因此永远不会到达cond函数的下一个表达式。
  1. (([color="blue"]not [/color]blkname) ......

 
foreach函数中包含以下代码,这意味着只有第一个边界框将正确绘制到其位置,其余边界框不会正确绘制到其位置,因为系统变量OSMODE将返回到其原始设置。
  1. (mapcar '[color="blue"]setvar [/color]vlst ovar)

 
最后一件需要注意的事情是,当您检查块名称时,您已经拥有了vla对象,因此只需将实体名称的vla对象添加到变量中,而不是使用ssnamex函数再次检索它们,ssnamex函数是相同对象的额外迭代,您可以不用它。
 
希望这不会让你失望,但会鼓励你在下一个项目中意识到它们。
 
快乐的编码。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:17:34 | 显示全部楼层
谢谢大家!
根据克林特的建议,我设法解决了主要问题。
 
嗨,塔瓦
  1. (if (setq objs (ssadd))
  2. (alert "Variable objs has values")
  3. (alert "Variable objs doesn't have any value")
  4. )

 
那么支票必须变成这样
  1. (if (> (sslength objs) 1)
  2. (alert "Variable objs has values")
  3. (alert "Variable objs doesn't have any value")
  4. )

 
谢谢你的其他建议,但我不完全理解:
老实说,在将对象转换为实体以及将实体转换为对象的过程中,我有点不知所措。我只是从您/LM的代码中提取一些部分并重用它们(很抱歉,但我尝试从最好的代码中学习)。
 
你有什么例子说明这是怎么回事吗?我的意思是,如果使用entsel/entsel或ssget,我们会得到什么类型的对象?什么时候需要转换以用于其他功能?我只是不知道该去哪里了解整个过程。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:22:07 | 显示全部楼层
最好检查它是否大于零而不是一,实际上我只是想告诉你,当你调用函数ssadd时,它将有值,为了检查是否有任何对象添加到我们第一个构建的ssadd中,我们需要检查其变量的数量是否大于零,正如你在上面的示例中所示,尽管你在程序中根本不需要它。
 
 
看看下面的MOD;
 
  1. (repeat (setq i (sslength ss))
  2. (setq vla-obj (vlax-ename->vla-object (setq blk (ssname ss (setq i (1- i)))))
  3.        name    (vla-get-effectivename vla-obj)        
  4.        )
  5. (if (eq (strcase blkname) (strcase name))
  6.    (setq lst (cons vla-obj lst))
  7.    )
  8. )
  9. (if lst
  10. (progn
  11.    (setq vlst '("CMDECHO" "OSMODE" "DIMASSOC")
  12.          ovar (mapcar 'getvar vlst)
  13.          )
  14.    (mapcar 'setvar vlst '(0 0 2))
  15.    (foreach obj lst
  16.      (vla-getboundingbox obj 'minpt 'maxpt)
  17.      (setq crds (mapcar 'vlax-safearray->list (list minpt maxpt)))
  18.      (command "_.rectangle" "_non" (car crds) "_non" (cadr crds))
  19.      )
  20.    (mapcar 'setvar vlst ovar)
  21.    )
  22. )

 
 
您可以在此链接中找到所有AutoLISP函数
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:27:42 | 显示全部楼层
谢谢,塔瓦!
 
我查一下:
ssname ssnamex vlax ename->vla对象和vlax vla对象->ename
功能。
 
如果我理解正确,只有这两种类型:
 
实体名称(ename)
  1. 10

VLA对象
  1. 10

类似于代码中的“物理对象”,可以在其他函数中作为参数接受
(正如我所见,vla get effectivename需要vla obj
entget需要ename)。
 
对不起,如果我写的是废话。很难理解它是如何工作的。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:39:12 | 显示全部楼层
是的,我同意你提到的。
使用纯AutoLISP时,不需要任何转换,但必须处理Vlisp和Active-X对象。
 
当你使用长而大的程序时,你会注意到这两种类型之间的速度。DXF是纯AutoLISP,比Vlisp代码更快、更平滑。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:44:10 | 显示全部楼层
在没有任何离题的情况下,我将继续阅读您在这个论坛上发布了几次的LISP库。
我认为,通过检查每个“未知”函数的参数和返回,我可能会跳过最常见的错误。
祝你晚上愉快!
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:50:26 | 显示全部楼层
专注于您正在阅读或使用的任何函数的返回值,因为这将帮助您了解程序打算采用的方式。
 
谢谢你也是。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 23:48 , Processed in 0.424678 second(s), 81 queries .

© 2020-2025 乐筑天下

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