简单偏移例程
大家好,我希望在新的一年里你一切顺利。虽然这两个例程都“起作用”,但在运行它们之后,我会出错。
我认为这可能是显而易见的,但对我来说显然并不明显。
我想我可能处理得不对。
版本#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))”
任何帮助都将不胜感激。 第一个例程的问题是,您有一个应该删除的列表,因为您只希望迭代实体名称。
如:
(vl-remove-if 'listp(mapcar 'cadr (ssnamex sset)))
并相应地将代码更新到第二个例程。 啊,现在有道理了。
非常感谢Tharwat! 不客气。 FWIW,可以提高效率,因为当单个循环足够时,不需要在同一数据上循环三次,例如:
(foreach ent (ssnamex sset)
(if (= 'ename (type (cadr ent)))
...
)
)
然而,一般来说,与处理选择集实体的其他方法相比,ssnamex函数相对较慢。
页:
[1]