乐筑天下

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

[编程交流] 简单偏移例程

[复制链接]

16

主题

99

帖子

83

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-5 18:06:09 | 显示全部楼层 |阅读模式
大家好,我希望在新的一年里你一切顺利。
 
虽然这两个例程都“起作用”,但在运行它们之后,我会出错。
我认为这可能是显而易见的,但对我来说显然并不明显。
 
我想我可能处理得不对。
 
版本#1:
 
  1. (defun c:PLO (/ cmde doc sset ent)
  2. (defun *error* (msg)
  3.    (if        (and msg
  4.      (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
  5. )
  6.      (princ (strcat "\nError: " msg))
  7.    )
  8.    (if        cmde
  9.      (setvar 'cmdecho cmde)
  10.    )
  11.    (if        doc
  12.      (vla-endundomark doc)
  13.    )
  14.    (princ)
  15. ) ;_ end of defun
  16. (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  17. (vla-startundomark doc)
  18. (setq cmde (getvar 'cmdecho))
  19. (setvar 'cmdecho 0)
  20. (if (setq sset (ssget '((0 . "circle") (40 . 0.05))))
  21.    (progn
  22.      (foreach ent (mapcar 'cadr (ssnamex sset))
  23. (command "_.offset" "0.1" ent "0,0" "")
  24.      ) ;_ end of foreach
  25.    ) ;_ end of progn
  26. ) ;_ end of if
  27. (setvar 'cmdecho cmde)
  28. (vla-endundomark doc)
  29. (princ)
  30. ) ;_ end of defun
  31. (vl-load-com)

 
这会创建偏移量,但会出现错误“未知命令0,0”和“未知命令PLO”。就像它再次执行命令序列一样。
 
 
 
版本#2
 
  1. (defun c:PLO (/ cmde doc sset ent obj )
  2. (defun *error* (msg)
  3.    (if        (and msg
  4.      (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
  5. )
  6.      (princ (strcat "\nError: " msg))
  7.    )
  8.    (if        cmde
  9.      (setvar 'cmdecho cmde)
  10.    )
  11.    (if        doc
  12.      (vla-endundomark doc)
  13.    )
  14.    (princ)
  15. ) ;_ end of defun
  16. (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  17. (vla-startundomark doc)
  18. (setq cmde (getvar 'cmdecho))
  19. (setvar 'cmdecho 0)
  20. (if (setq sset (ssget '((0 . "circle") (40 . 0.05))))
  21.    (progn
  22.      (foreach ent (mapcar 'cadr (ssnamex sset))
  23. (setq obj (vlax-ename->vla-object ent))
  24. (vla-Offset obj 0.1)
  25.      ) ;_ end of foreach
  26.    ) ;_ end of progn
  27. ) ;_ end of if
  28. (setvar 'cmdecho cmde)
  29. (vla-endundomark doc)
  30. (princ)
  31. ) ;_ end of defun
  32. (vl-load-com)

 
这会创建偏移量,但我得到“错误:错误的参数类型:lentyp(0(-3.41352 31.3948 0.0))”
 
任何帮助都将不胜感激。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 18:32:27 | 显示全部楼层
第一个例程的问题是,您有一个应该删除的列表,因为您只希望迭代实体名称。
如:
  1. (vl-remove-if 'listp(mapcar 'cadr (ssnamex sset)))

 
并相应地将代码更新到第二个例程。
回复

使用道具 举报

16

主题

99

帖子

83

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-5 18:48:20 | 显示全部楼层
啊,现在有道理了。
 
非常感谢Tharwat!
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 18:54:16 | 显示全部楼层
不客气。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:18:25 | 显示全部楼层
FWIW,可以提高效率,因为当单个循环足够时,不需要在同一数据上循环三次,例如:
  1. (foreach ent (ssnamex sset)
  2.    (if (= 'ename (type (cadr ent)))
  3.        ...
  4.    )
  5. )

 
然而,一般来说,与处理选择集实体的其他方法相比,ssnamex函数相对较慢。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 20:11 , Processed in 1.007904 second(s), 62 queries .

© 2020-2025 乐筑天下

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