PDuMont 发表于 2022-7-5 18:06:09

简单偏移例程

大家好,我希望在新的一年里你一切顺利。
 
虽然这两个例程都“起作用”,但在运行它们之后,我会出错。
我认为这可能是显而易见的,但对我来说显然并不明显。
 
我想我可能处理得不对。
 
版本#1:
 
(defun c:PLO (/ cmde doc sset ent)
(defun *error* (msg)
   (if        (and msg
   (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
)
   (princ (strcat "\nError: " msg))
   )
   (if        cmde
   (setvar 'cmdecho cmde)
   )
   (if        doc
   (vla-endundomark doc)
   )
   (princ)
) ;_ end of defun

(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark doc)
(setq cmde (getvar 'cmdecho))
(setvar 'cmdecho 0)

(if (setq sset (ssget '((0 . "circle") (40 . 0.05))))
   (progn
   (foreach ent (mapcar 'cadr (ssnamex sset))
(command "_.offset" "0.1" ent "0,0" "")
   ) ;_ end of foreach
   ) ;_ end of progn
) ;_ end of if
(setvar 'cmdecho cmde)
(vla-endundomark doc)
(princ)
) ;_ end of defun
(vl-load-com)
 
这会创建偏移量,但会出现错误“未知命令0,0”和“未知命令PLO”。就像它再次执行命令序列一样。
 
 
 
版本#2
 
(defun c:PLO (/ cmde doc sset ent obj )
(defun *error* (msg)
   (if        (and msg
   (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
)
   (princ (strcat "\nError: " msg))
   )
   (if        cmde
   (setvar 'cmdecho cmde)
   )
   (if        doc
   (vla-endundomark doc)
   )
   (princ)
) ;_ end of defun

(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark doc)
(setq cmde (getvar 'cmdecho))
(setvar 'cmdecho 0)

(if (setq sset (ssget '((0 . "circle") (40 . 0.05))))
   (progn
   (foreach ent (mapcar 'cadr (ssnamex sset))
(setq obj (vlax-ename->vla-object ent))
(vla-Offset obj 0.1)
   ) ;_ end of foreach
   ) ;_ end of progn
) ;_ end of if
(setvar 'cmdecho cmde)
(vla-endundomark doc)
(princ)
) ;_ end of defun
(vl-load-com)

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

Tharwat 发表于 2022-7-5 18:32:27

第一个例程的问题是,您有一个应该删除的列表,因为您只希望迭代实体名称。
如:

(vl-remove-if 'listp(mapcar 'cadr (ssnamex sset)))
 
并相应地将代码更新到第二个例程。

PDuMont 发表于 2022-7-5 18:48:20

啊,现在有道理了。
 
非常感谢Tharwat!

Tharwat 发表于 2022-7-5 18:54:16

不客气。

Lee Mac 发表于 2022-7-5 19:18:25

FWIW,可以提高效率,因为当单个循环足够时,不需要在同一数据上循环三次,例如:
(foreach ent (ssnamex sset)
   (if (= 'ename (type (cadr ent)))
       ...
   )
)
 
然而,一般来说,与处理选择集实体的其他方法相比,ssnamex函数相对较慢。
页: [1]
查看完整版本: 简单偏移例程