ARX向CAD发送命令

qq_40611406 2018-12-20 02:20:59
acedCommand()这个函数发送的命令在2015后的版本中均无效,应该怎么处理啊,求教
...全文
476 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
好运萝 2018-12-26
  • 打赏
  • 举报
回复
这.... 这个其实是在近期工程里面刚好有用到的一个功能 其实也是在xd上找到的

下面是选择实体的方法 你也可以对比一下
AcArray<AcDbObjectId> selectedIds;

while(true)
{
ads_name ename;
ads_point pickPt;

acedInitGet(NULL, NULL);
int rc = acedEntSel(_T("\nSelect Entity"), ename, pickPt);

if(rc == RTCAN || rc == RTERROR)
break;

if(rc == RTNORM)
{
AcDbObjectId entId;
acdbGetObjectId(entId, ename);
selectedIds.append(entId);
}
}

if(selectedIds.length() == 0)
return;

qq_40611406 2018-12-25
  • 打赏
  • 举报
回复
额,不是这个原因,批量重复调用时,不是所有的都不起作用,而是总有概率性的不起作用
super_admi 2018-12-25
  • 打赏
  • 举报
回复
命令后面要加一个空格。
qq_40611406 2018-12-25
  • 打赏
  • 举报
回复
嗯,c++的
qq_40611406 2018-12-25
  • 打赏
  • 举报
回复
erase all怎么写,只要删除当前图纸上的所有实体就行了
qq_40611406 2018-12-25
  • 打赏
  • 举报
回复
没有,他总是中间的那个all没传进去,怎么说呢,就是执行erase让选择对象,然后又出现一次erase然后就失败了
Dobzhansky 2018-12-25
  • 打赏
  • 举报
回复
自己写个erase all 也不难吧
Dobzhansky 2018-12-25
  • 打赏
  • 举报
回复
这个就跟你调用时候的上下文有关了,是在摸态命令内调用的吗
qq_40611406 2018-12-25
  • 打赏
  • 举报
回复
可是他发送命令执行会失败,acedCommandS( RTSTR, ConvertToUnicode(_T("_.ERASE")) ,RTSTR, ConvertToUnicode( _T("ALL") ), RTSTR, _T("") , RTNONE );比如这个擦除命令,经常失败
好运萝 2018-12-25
  • 打赏
  • 举报
回复
自己写一个把
获取所有实体id方法
static AcDbObjectIdArray GetAllEntityId()
{
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
resbuf clyr;
acedGetVar(_T("clayer"), &clyr);
TCHAR *layername = clyr.resval.rstring;
AcDbObjectIdArray entIds;
bool bFilterlayer = false;
AcDbObjectId layerId;
if (layername != NULL)
{
AcDbLayerTable *pLayerTbl = NULL;
pDb->getSymbolTable(pLayerTbl, AcDb::kForRead);
if (!pLayerTbl->has(layername))
{
pLayerTbl->close();
return entIds;
}
pLayerTbl->getAt(layername, layerId);
pLayerTbl->close();
bFilterlayer = true;
}
//获得表块
AcDbBlockTable *pBlkTbl = NULL;
pDb->getSymbolTable(pBlkTbl, AcDb::kForRead);
//表块记录
AcDbBlockTableRecord *pBlkTblRcd = NULL;
pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, AcDb::kForRead);
pBlkTbl->close();
//创建遍历器 依次访问模型空间中的每个实体
AcDbBlockTableRecordIterator *it = NULL;
pBlkTblRcd->newIterator(it);
for (it->start(); !it->done(); it->step())
{
AcDbEntity *pEnt = NULL;
Acad::ErrorStatus es = it->getEntity(pEnt, AcDb::kForRead);
if (es == Acad::eOk)
{
if (bFilterlayer)
{
if (pEnt->layerId())
entIds.append(pEnt->objectId());
}
else
{
pEnt->close();
}
}
}
delete it;
pBlkTblRcd->close();
return entIds;
}


最近用过的 获取到了全部实体ID erase一下
Dobzhansky 2018-12-20
  • 打赏
  • 举报
回复
2015 及其以后版本,使用 acedCommandS
qq_40611406 2018-12-20
  • 打赏
  • 举报
回复
acedCommand( RTSTR, ConvertToUnicode(_T("FILEDIA")), RTSTR, ConvertToUnicode(_T("1")), RTNONE );,就是这样简单的命令,但全部无效,在早期版本的CAD中有效果

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧