setVisualStyle没有效果
嗨,社区,我想将“概念”视觉风格设置为一个视点,但它没有效果。
在Autocad上,我发现视口上的标签更改为“概念”,但实体没有更改,仍然是默认样式“2D线框”。
这是我的代码:
void AdjustViewport(const CString& strLayout, int nIndex, const std::vector& vecEnt, const AcGePoint3d& modelCenter)
{
AcDbViewport* pViewport = GetViewport(strLayout, nIndex);
if (pViewport == nullptr)
{
ASSERT(pViewport != nullptr);
return;
}
int nRetActiveLayout = acedCommand(RTSTR, _T("layout"), RTSTR, _T(""), RTSTR, _T("testCopy"), 0);
ASSERT(nRetActiveLayout == RTNORM);
acedMspace();
Acad::ErrorStatus es = acedSetCurrentVPort(pViewport);
ASSERT(es == Acad::eOk);
int nSetSWISO = acedCommand(RTSTR, _T("-view"), RTSTR, _T("_swiso"), 0);
ASSERT(nSetSWISO == RTNORM);
ads_name ssname;
acedSSAdd( NULL, NULL, ssname );
GroupSelect(vecEnt, ssname);
acedSSSetFirst( ssname, NULL );
int nZOOM = acedCommand(
RTSTR, _T("_ZOOM"),
RTSTR, _T("_OBJECT"),
RTPICKS, ssname,
RTSTR, _T(""),
RTNONE);
ASSERT(nZOOM == RTNORM);
acedSSFree(ssname);
acedSSSetFirst( NULL, NULL );
AcDbObjectId vsId = AcDbObjectId::kNull;
AcDbDictionaryPointer pNOD(acdbHostApplicationServices()->workingDatabase()->visualStyleDictionaryId(), AcDb::kForRead);
pNOD->getAt(ACRX_T("Conceptual"), vsId);
Acad::ErrorStatus esSetVS = pViewport->setVisualStyle(vsId);
ASSERT(esSetVS == Acad::eOk);
//SetVisualStyle(vecEnt);
pViewport->updateDisplay();
pNOD->close();
pViewport->close();
}
请帮忙,thx!
**** Hidden Message ***** 不知道如何帮助我?关于我正在寻找的知识,我正在跟进分享这些信息。 简单观察一下:您能否将更改视图设置等的代码从该函数中移到它自己的函数中(即与更改视窗样式无关的所有代码),然后再看看发生了什么?类似下面的(注:未测试!) void SetViewportStyle(const CString & strLayout,int nIndex,string styleName)。
{。
acdb viewport * pview port = get viewport(strLayout,nIndex);// -这个函数在哪里??。
。
if(pview port = = null ptr)。
{。
返回;。
}。
。
AcDbObjectId vsId = AcDbObjectId::kNull;。
AcDbDictionaryPointer pNOD(acdbHostApplicationServices()-> working database()-> visualStyleDictionaryId(),AcDb::kForRead);。
pNOD-> getAt(ACRX _ T(style name),vsId);。
。
if(vsId = = AcDbObjectId::knull)。
{。
返回;。
}。
// -不应该在这里打开视口进行写入吗??。
Acad::error status esse TVs = pview port-> setvisual style(vsId);。
if(esse TVs = = Acad::eOk)。
{。
pview port-> update display();。
。
pNOD-> close();。
pview port-> close();。
}。
}。
实际上,现在仔细看一下,这段代码有许多根本的缺失/错误。您应该使用事务来打开数据库对象,如pNOD等。尝试编写一次只做一件事的函数,在同一个函数中混合其他任务只会增加干扰,使调试更加困难。如果您需要做一些事情,那么从一个函数(比如您的命令函数)中调用较小的函数,如下所示: void my command(){DoThis();然后this(); and this();返回;}。
页:
[1]