乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 65|回复: 3

acedvPLayer不工作,崩溃

[复制链接]

3

主题

9

帖子

1

银币

初来乍到

Rank: 1

铜币
21
发表于 2017-9-18 02:28:40 | 显示全部楼层 |阅读模式
嗨,社区,
我有两个布局和多层A & B视窗。我想只激活视口A上的图层A,只激活视口B上的图层B。
但是,由于这不起作用,视口A冻结所有图层,视口B只解冻图层B,这是正确的。为什么会有这种差异?
我发现它在退出autocad时会崩溃。

以下是我的代码:
  1. void ActiveLayerOnly(const CString& strLayout, int nViewportIndex, const CString& strLayer)
  2. {
  3.         AcDbViewport* pViewport = GetViewport(strLayout, nViewportIndex);
  4.         if (pViewport == nullptr)
  5.         {
  6.                 ASSERT(pViewport != nullptr);
  7.                 return;
  8.         }
  9.         int nRetActiveLayout = acedCommand(RTSTR, _T("layout"), RTSTR, _T(""), RTSTR, strLayout, 0);
  10.         ASSERT(nRetActiveLayout == RTNORM);
  11.         acedMspace();
  12.         Acad::ErrorStatus esSC = acedSetCurrentVPort(pViewport);
  13.         ASSERT(es == Acad::eOk);
  14.         AcDbLayerTable*        pLayerTable        = nullptr;
  15.         acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTable, kForWrite);
  16.         AcDbObjectIdArray        vlayerIDFreeze;
  17.         AcDbObjectIdArray        vlayerIDThaw;
  18.         AcDbLayerTableIterator*        pItrLayer = nullptr;
  19.         if (pLayerTable->newIterator(pItrLayer) == Acad::eOk && pItrLayer)
  20.         {
  21.                 for (pItrLayer->start(); !pItrLayer->done(); pItrLayer->step())
  22.                 {
  23.                         AcDbLayerTableRecord*        pRcd = nullptr;
  24.                         if (pItrLayer->getRecord(pRcd, AcDb::kForRead) == Acad::eOk && pRcd)
  25.                         {
  26.                                 AcDbObjectId id = pRcd->objectId();
  27.                                 const ACHAR*        pName = nullptr;
  28.                                 pRcd->getName(pName);
  29.                                 if (pName && CString(pName) != strLayer)
  30.                                 {
  31.                                         vlayerIDFreeze.append(id);
  32.                                 }
  33.                                 pRcd->close();
  34.                         }
  35.                 }
  36.                 delete pItrLayer;
  37.         }
  38.         auto idid = pViewport->objectId();
  39.         pViewport->close();
  40.         auto esse = acedVPLayer(idid, vlayerIDFreeze, AcDb::kFreeze);
  41.         pLayerTable->close();
  42. }

请帮忙,谢谢!

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

3

主题

9

帖子

1

银币

初来乍到

Rank: 1

铜币
21
发表于 2017-9-18 05:05:44 | 显示全部楼层

我没有尝试你的代码...但是你可以尝试AcDbViewport::freezeLayersInViewport
回复

使用道具 举报

3

主题

9

帖子

1

银币

初来乍到

Rank: 1

铜币
21
发表于 2017-9-18 05:23:55 | 显示全部楼层
如果我没记错的话,处理布局缓存可能会有问题。
有一些奇怪的功能有所帮助,我不记得了...acedVportTableRecords2Vports 或别的什么
回复

使用道具 举报

3

主题

9

帖子

1

银币

初来乍到

Rank: 1

铜币
21
发表于 2017-9-19 22:18:40 | 显示全部楼层
https://forums.autodesk.com/t5/objectarx/acedvplayer-doesnt-t-work-and-crash/m-p/7391089#M36236
这个链接,我好家伙发现我的问题。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-4-29 04:33 , Processed in 1.272839 second(s), 60 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表