trystudy 发表于 2010-1-28 23:30:00

[求助]如何将字符串转化成autocad命令运行???

本帖最后由 作者 于 2010-2-1 14:36:03 编辑

目的是将字符串和空格拼成一个长字符串然后就转成autocad命令运行
command函数只支持autocad命令对自定义的用户函数命令无效。
例如下:
(expression (strcat"mycom"" ") );执行自定义函数
返回值
在autocad中运行用户函数命令
而且右键可重复使用命令

有个方法:(eval (read (strcat "(c:" "mycom" ")" )))此方法有问题:转成自定义函数(defun) 右键无效
转成用户命令函数(defunct C:) 还得加""(空格),上面的函数不认空格
这个expression 如何编写呢?我一定思路也没有呀。高手指点一二
不胜感激


第二次修改提出的问题
首先感谢版主和   的耐心帮助。由于本人愚笨,问题尚未解决。
现将我的本意完全表达清楚,望高人再百忙中给予本人指点一二,
不胜感激于痛哭流涕之中于热泪盈眶之里。

完整想法出现的问题,问题较为复杂。
在主程序中调用其他自定义命令mytools,并且在程序执行完毕后可以右键重复执行这mytools,这是重点要解决的问题。防止右键重复使用主程序c:test命令。

以下分成四个部分加以分析,但是下面的语句是不成功。;=========1局部函数(准备部分)=========
(defun myfun (ek);为了调用:mycmd中转自定义命令
(apply '(read "mycmd") ek)
(princ)
)
;===========2中转自定义命令(准备部分)====
(defun c:mycmd(/ ek);中转自定义命令,为了右键可重复
(apply (read (strcat "C:" ek )) nil)
(princ)
)

;=========3自定义命令(调用部分)=========
(defun c:mytools ( / );要调用的自定义命令
    ;...main code...
   (princ)
)
;=======4要执行的主程序================
(defun c:test ( /n)
    ;...main code...
    (if(<1 n)
      (setq ek "mytools" );要调用的自定义命令名赋予变量
   )
    ((princ (strcat "\n命令: " ek ))
    (myfun ek);!!!可以右键重复执行,这是重点要解决的问题。防止右键重复使用c:test命令
    (princ)
)

ZZXXQQ 发表于 2010-1-31 11:20:00

一般必须要先关闭(隐藏)对话框再去执行命令,命令运行完后再显示对话框。
下面是个例子:

;对话框使用方法 明经 ZZXXQQ 2010.1.31
(defun C:ee (/ dcl_id)
(setvar "cmdecho" 0)
(if (> (setq dcl_id (load_dialog "test.dcl")) 0) (progn
(setq result 3)
(while (> result 1)
   (if (new_dialog "test" dcl_id) (progn
    (action_tile "arc" "(done_dialog 2)")
    (action_tile "circle" "(done_dialog 3)")
    (action_tile "line" "(done_dialog 4)")
    (action_tile "pline" "(done_dialog 5)")
    (action_tile "accept" "(done_dialog 1)")
    (action_tile "cancel" "(done_dialog 0)")
    (setq result (start_dialog))
   ) (progn
    (setq result 0)
    (alert "Unable to display dialog box!\n无法显示对话框!")
   ))
   (cond
    ((= result 2) (myarc))
    ((= result 3) (mycircle))
    ((= result 4) (myline))
    ((= result 5) (mypline))
   )
);end while
(unload_dialog dcl_id)
)
(alert "Unable to load dialog box!\n无法装载对话框!")
);end if
(princ)
)
(defun myarc ()
(command ".arc")
(while (not (zerop (getvar "CMDACTIVE"))) (comand pause))
(princ)
)
(defun mycircle ()
(command ".circle")
(while (not (zerop (getvar "CMDACTIVE"))) (comand pause))
(princ)
)
(defun myarc ()
(command ".line")
(while (not (zerop (getvar "CMDACTIVE"))) (comand pause))
(princ)
)
(defun myarc ()
(command ".pline")
(while (not (zerop (getvar "CMDACTIVE"))) (comand pause))
(princ)
)

trystudy 发表于 2010-1-31 21:35:00

<p>先感谢版主回答。可能是我问的问题不准确。答案不理想呀</p><p>问题我已经更正希望得到高手指教啊</p>

Andyhon 发表于 2010-1-31 22:14:00

<p>(defun c:TestA () .....)</p><p>(defun C:TestB ()<br/>&nbsp;&nbsp; ....<br/>&nbsp;&nbsp; (command "Line" '(0 0) '(1 1) "")<br/>&nbsp;&nbsp; (c:TestA)&nbsp;&nbsp; ;&lt;======== 直接这样用 xxxxx(command "TestA"......) xxxxx<br/>)&nbsp;&nbsp; </p><p>是否答对了 or some what?</p>

飞诗(fsxm) 发表于 2010-1-31 22:16:00

本帖最后由 作者 于 2010-2-1 12:24:29 编辑 <br /><br /> <p>用函数名执行:</p><p>(apply (read "MyFun") )</p><p>(apply (read "C:MyCmd") nil)</p><p>如果想能空格重复命令的只能这样了</p><p>(vla-sendcommand *doc* (strcat "MyCmd" " "))</p>你要的是这个效果吧?

trystudy 发表于 2010-2-1 14:49:00

本帖最后由 作者 于 2010-2-1 15:15:45 编辑 <br /><br /> <p><font color="#ff0000">(</font>defun c:表达&nbsp;<strong><font face="Verdana" color="#da2549"><font color="#61b713"> (/ </font><font color="#da2549">fsxm ZZXXQQ <font color="#61b713">Andyhon)</font></font></font></strong></p><p><font face="Verdana" color="#61b713"><strong>&nbsp; </strong><font color="#ff0000">(</font><font color="#0000ff">princ “非常感谢”</font><font color="#ff0000">))</font></font></p><p><font face="Verdana" color="#000000">我把问题重新整理了一下希望我能表达清楚</font></p><p><font face="Verdana">首先这个问题shlisp已经解决(shlisp,玩lisp都知道吧他是谁)</font></p><p><font face="Verdana">但是他把自定义函数封装到了fas文件中,看不到了。只能靠大家帮忙来写了希望能成功。</font></p><p><hr/></p><p>(vla-sendcommand *doc* (strcat "MyCmd" " "));运行结果错误呀</p><p>_2$ <br/>; 错误: 参数类型错误: VLA-OBJECT nil</p><p></p>

trystudy 发表于 2010-2-1 19:35:00

非常感谢fsxm版主:困扰我多天的问题解决了。真的不知说啥了,眼泪哗哗流。
强烈要求明经老总给fsxm版主加奖金。
最后的解决方法
(defun myfun(kk / *acad* *doc*)
(setq *acad* (vlax-get-acad-object)) ;;; 先得到AutoCAD对象
(setq *doc* (vlax-get-property *acad* 'ActiveDocument)) ;;; 然后取当前文档
(vla-sendcommand *doc* (strcatkk " "))
)

布朗运动 发表于 2014-12-13 21:23:23

谢谢飞诗(fsxm)、trystudy,这个·这个问题我也想过,终于在这里解决了。

yaojing38 发表于 2022-12-20 22:36:10

谢谢大神,,,,膜拜
页: [1]
查看完整版本: [求助]如何将字符串转化成autocad命令运行???