找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 827|回复: 11

[求助] vla-sendcommand 参数问题

[复制链接]

已领礼包: 4个

财富等级: 恭喜发财

发表于 2021-1-14 20:07:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 Five丨遗忘 于 2021-1-15 11:19 编辑

请教一下各位大佬,vla-sendcommand如何才能识别为变量的参数?多方查资料还是没得到相应的答案。
以下是代码,大佬们帮忙看看如何才能运行
  1. (defun c:test ()
  2.   (vl-load-com)
  3.   (setvar "filedia" 0)
  4.   (setvar "CMDECHO" 0)
  5.   (setq ss (ssget))
  6.   (setq i 0)
  7.   (while (setq e (ssname ss i))
  8.     (setq tcname (cdr (assoc 8 (entget e))));获取图元的图层名称
  9.     (setq obj (vlax-ename->vla-object e))
  10.     (setq *doc (vla-get-activedocument(vlax-get-acad-object)))
  11.       (cond
  12.         ((= tcname "水田")(vla-sendcommand *doc "tian 211100 \n !obj \n"))         ((= tcname "旱地")(vla-sendcommand *doc "tian 211200 \n !obj \n"))
  13.       )
  14.   (setq i (1+ i))
  15.   )
  16.   (setvar "filedia" 1)
  17.   (setvar "CMDECHO" 1)
  18. )

程序的目的是批量进行植被填充,"tian" 是CASS的命令,可以正常调用,"211100"是地类编码,obj无法识别
以下是对应的cad文件
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:test.rar 
下载次数:4  文件大小:5.19 KB 
下载权限: 不限 以上  [免费赚D豆]









论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2021-1-14 20:20:09 | 显示全部楼层
本帖最后由 Five丨遗忘 于 2021-1-15 11:22 编辑

((= tcname "水田")(vla-sendcommand *doc "tian 211100 \n obj \n"))         ((= tcname "旱地")(vla-sendcommand *doc "tian 211200 \n obj \n"))  
去掉前边的!也不行,还有说obj前加0,0 的,试过了,也不行
烦请大佬帮忙看一看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2021-1-15 17:39:39 | 显示全部楼层
Five丨遗忘 发表于 2021-1-14 20:20
((= tcname "水田")(vla-sendcommand *doc "tian 211100 \n obj \n"))         ((= tcname "旱地")(vla-sen ...

你自己在命令行交互的

sendcommand发送一个整体的字符串到命令行
所以你要确保这一个整体的字符串是一次交互

按你说的理解,tian是一个命令,你发送 tian 后应该加回车
但是执行tian命令后,接管了命令行,在执行命令,那sendcommand 后面的字符串发送不到命令里面,

你先把tian后加个 \n 试试。

这个命令没有函数版本吗?例如 (tian 211100 obj....) 这样的

不清楚说的你理解没
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2021-1-15 20:39:54 | 显示全部楼层
Lisphk 发表于 2021-1-15 17:39
你自己在命令行交互的

sendcommand发送一个整体的字符串到命令行

tian是加密函数,我看不到,他的执行提示是这样的

命令: tian
输入区域编码:211100
输入线上编码:(可以不用输入,直接回车)
请选择填充方式:(1)区域填充(2)线上分布 <1>1
请选择要填充的封闭复合线
选择对象:   找到 1 个
填充成功!




tian和211100之间的空格已经代表了回车,

目前程序执行的结果是


命令: tian
输入区域编码:211200
输入线上编码:
请选择填充方式:(1)区域填充(2)线上分布 <1>
请选择要填充的封闭复合线!obj #<VLA-OBJECT IAcadLWPolyline 03f1a2c4>
请选择要填充的封闭复合线

目前程序执行到这里就执行不下去了,就是识别不了变量obj,



换个CAD自带的命令也是一样,如:

  1. ((= tcname "水田")(vla-sendcommand *doc "_explode !obj \n"))


也是提示如下:
命令: _explode
选择对象: !obj #<VLA-OBJECT IAcadLWPolyline 03f1a2c4>
选择对象:
未找到对象。





论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2021-1-15 22:19:47 | 显示全部楼层
最后那个你用explode炸开vla对象不合适吧 ?  这个用ssget选择对象直接用explode可以展开。话说你啊个tian命令到底接受的是什么对象 你用vla对象合适么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2021-1-15 22:28:21 | 显示全部楼层
Five丨遗忘 发表于 2021-1-15 20:39
tian是加密函数,我看不到,他的执行提示是这样的

命令: tian

ACAD的LISP函数和命令,对于对象的参数要求是实体名
你就别用VLA对象了

也就是你的代码
(setq obj (vlax-ename->vla-object e)) 去掉
下面OBJ的地方,用 e

去试试
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2021-1-16 15:35:08 | 显示全部楼层
Lisphk 发表于 2021-1-15 22:28
ACAD的LISP函数和命令,对于对象的参数要求是实体名
你就别用VLA对象了


谢谢指点,查到了原因,vla-sendcommand支持点变量函数和(entlast),请问如何将当前循环中的图元 e 转换为(entlast)可选取的对象?

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2021-1-16 15:41:04 | 显示全部楼层
muwind 发表于 2021-1-15 22:19
最后那个你用explode炸开vla对象不合适吧 ?  这个用ssget选择对象直接用explode可以展开。话说你啊个tian ...

只为单纯的举例说明,并非要这样操作。接受的应该图元名吧,刚才图元名测试通过了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2021-1-16 16:00:50 | 显示全部楼层
Five丨遗忘 发表于 2021-1-16 15:35
谢谢指点,查到了原因,vla-sendcommand支持点变量函数和(entlast),请问如何将当前循环中的图元 e 转 ...

以前你用的是!obj,  
现在用 !e   试试
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2021-1-16 17:31:07 | 显示全部楼层
Lisphk 发表于 2021-1-16 16:00
以前你用的是!obj,  
现在用 !e   试试

!e和!obj均测试不通过,但将!e换成(entlast)测试就可以完整的执行完一个vla-sendcommand,(entlast)返回的是最后未删除的图元名称,对循环我例子里的循环不起作用,所以我是想将(setq e (ssname ss i)获取到的当前图元名转换为(entlast)可直接获取的图元名,不知如何办到?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2021-1-16 18:43:32 | 显示全部楼层
好奇你为啥要用!e,不直接用e
!不就是获取变量的值么 直接用变量不挺好?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2021-1-16 18:53:32 | 显示全部楼层
muwind 发表于 2021-1-16 18:43
好奇你为啥要用!e,不直接用e
!不就是获取变量的值么 直接用变量不挺好?

不懂其意,照猫画的虎
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 08:24 , Processed in 0.280445 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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