明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2863|回复: 8

[源码] [求助]奇怪的align->explode->cmdnames函数

[复制链接]
发表于 2010-10-9 12:15:00 | 显示全部楼层 |阅读模式

众所周知"cmdnames"变量常用于检测当前是否透明指令状态的,在非透明指令状态时,应返回""。

但无意中发现,在lsp中,执行完align命令后(操作对象必须是图块才回出现以下的特殊情况),再执行explode,则会出现在非透明指令状态时,"cmdnames"变量返回"ALIGN",不再是""了。

 

有兴趣的朋友可以试试。

(defun c:test ()
  (setq en (car (entsel "\n请选择图块:")))
  (setq p1 (getpoint "\n原第一点:")
 p2 (getpoint p1 "\n新第一点:")
 p3 (getpoint "\n原第二点:")
 p4 (getpoint p3 "\n新第二点:")
  )
  (command "align" en "" p1 p2 p3 p4 "" "y")
  (command "explode" en)
)

 

 


(getvar "cmdnames")

 

把explode改为以下写法,也是解决不了的。只是把炸开这一步除去,手动执行,才能解决。

;(vla-explode obj)
;(vlax-invoke-method obj 'explode)
;(vlax-invoke obj 'Explode)

左思右想,要同时实现align又explode,同时不影响"cmdnames"该怎么办呢?

我自己起初的思路有二,

1、改写"cmdnames"的返回值

2、用其它方法去代取(command "explode" en)

可惜这两个方法都行不通,请问如何解决?

发表于 2010-10-9 14:38:00 | 显示全部楼层
(defun c:test ()
  (setq en (car (entsel "\n请选择图块:")))
  (setq p1 (getpoint "\n原第一点:")
 p2 (getpoint p1 "\n新第一点:")
 p3 (getpoint "\n原第二点:")
 p4 (getpoint p3 "\n新第二点:")
  )
  (command "_.align" en "" p1 p2 p3 p4 "" "y")  
  (vla-explode(vlax-ename->vla-object en))
  (princ)
)
 楼主| 发表于 2010-10-9 16:27:00 | 显示全部楼层

您太厉害了,问题解决了,非常感谢。

 

我再仔细想您修改的部份,发现是改了两处,且缺一不可,但我想不明白,为什么必须把“align”改为"_.align",以及 用vla-explode取代command "explode"呢?这个是CAD的BUG吗?以前好像没见过有这种状况会影响"cmdnames",当然用command会使程序慢一些。如果方便的话,可以为我解惑吗?谢谢。

 楼主| 发表于 2010-10-11 10:06:00 | 显示全部楼层

您好:又有新问题了,(vla-explode obj)无法分解纵横比例不一致的图块[explmode变量已设为1],用(acet-explode ename)可以炸开不等比块,但(getvar "cmdnames")的值又变为ALIGN了。可以帮我再看看吗?

 

(defun c:test (/ en p1 p2 p3 p4 obj)
  (setq en (car (entsel "\n请选择图块:")))
  (setq p1 (getpoint "\n原第一点:")
 p2 (getpoint p1 "\n新第一点:")
 p3 (getpoint "\n原第二点:")
 p4 (getpoint p3 "\n新第二点:")
  )
  (command "_.align" en "" p1 p2 p3 p4 "" "y")
  (setq obj (vlax-ename->vla-object en))
  (vla-put-YEffectiveScaleFactor obj 1)
  (vla-explode obj) ;运行至此出现“错误: Automation 错误。 输入无效
  (vlax-invoke-method obj 'delete)
  (princ)
)

 

 楼主| 发表于 2010-10-15 10:31:00 | 显示全部楼层
自己实在解决不了,顶一下。
发表于 2010-10-15 17:16:00 | 显示全部楼层
影响cmdname也没有关系啊.这可能是cad的bug造成的.你为什么非要找到原因呢.也许这是一个死胡同.
可以用变通的方法啊.

你看看cad中自带的lisp源码也是用如下代码解决的.参见下面的代码.
(while (not (wcmatch (getvar "cmdnames") "*UNDO*"))
            (command "_.undo")
 )
也是使用如下方法
(while (= (logand (getvar "CmdActive") 1) 1) (command pause))

 楼主| 发表于 2010-10-18 14:39:00 | 显示全部楼层

您好:谢谢您的多次解答。

 

我发现打开一张图,在lisp里,如果累计3次调用align命令,就会造成“致命错误:命令嵌套深度不能超过4层”的产生,究其原因,似乎是"cmdnames"函数引起的,所以想尝试改变这个"cmdnames"

 

;;;此程序执行3次,就会出现“致命错误:命令嵌套深度不能超过4层”

(defun c:test (/ en p1 p2 p3 p4 obj)
  (setq en (car (entsel "\n请选择图块:")))
  (setq p1 (getpoint "\n原第一点:")
 p2 (getpoint p1 "\n新第一点:")
 p3 (getpoint "\n原第二点:")
 p4 (getpoint p3 "\n新第二点:")
  )
  (command "_.align" en "" p1 p2 p3 p4 "" "y")
  (setq obj (vlax-ename->vla-object en))
  (vla-put-YEffectiveScaleFactor obj 1)
  (vl-cmdf "explode" en)
  (princ)
)

发表于 2010-10-19 09:01:00 | 显示全部楼层
测试了一下可能是align的bug.
(vl-cmdf "align") 也不知道如何使用.一直显示不正确。
解决方法可以自己写一个类似align的函数.

或者先炸开再align
(setvar "modemacro" "$(getvar, cmdnames)")

(defun c:test2 (/ en p1 p2 p3 p4 obj)
  (setq en (car (entsel "\n请选择图块:")))
  (setq p1 (getpoint "\n原第一点:")
 p2 (getpoint p1 "\n新第一点:")
 p3 (getpoint "\n原第二点:")
 p4 (getpoint p3 "\n新第二点:")
  )
  (vl-cmdf "explode" en)
  (setq ss (ssget "_P" ))
  (command "_.align" ss "" p1 p2 p3 p4 "" "y")
  (princ)
)

 楼主| 发表于 2010-10-19 11:19:00 | 显示全部楼层

谢谢您的多次解答。

看来是无法偷懒,只能是自己写一个类似align的命令了,谢谢您。

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-23 19:37 , Processed in 0.185095 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表