如何更新AcDbViewport对象?
static void Test_x1(void){
// -- Get Layer's ObjectId for Freeze;
AcDbObjectId FrzLay = acdbHostApplicationServices()->workingDatabase()->clayer();
// -- Make to a array for freezeLayer use
AcDbObjectIdArray FrzArray;
FrzArray.removeAll();
FrzArray.append(FrzLay);
// -- get all the viewport's objectId, but not paperSpace.
AcDbObjectIdArray vps;
vps.removeAll(); // -- clear it;
Acad::ErrorStatus es = Acad::eInvalidInput;
es = acdbHostApplicationServices()->workingDatabase()->getViewportArray(vps, false);
if (es != Acad::eOk)
{
acutPrintf(_T("\nError(getViewportArray): %s"), acadErrorStatusText(es));
return;
}
if (vps.isEmpty())
{
acutPrintf(_T("\nError(Viewport's IdArray): none viewport in it."));
return;
}
for (int i = 0; i freezeLayersInViewport(FrzArray);
if (es != Acad::eOk)
{
acutPrintf(_T("\nError(FrzInVp): %s"), acadErrorStatusText(es));
pEnt->close();
continue;
}
/* UpdataDisplay? but it no work. this viewport have no change. */
pEnt->updateDisplay();
pEnt->close();
}
}
我已将此代码写入所有视口上的冻结当前层。但没有我认为的工作。
命令完成时视口不会更新数据。
但是,如果我复制一个视口,层(我想要冻结的)已经在副本上冻结了......
查看Gif:
**** Hidden Message ***** “LAYOUTREGENCTL”设置为什么?
此外,您可能需要记录为视窗修改的图形。
(getvar "LAYOUTREGENCTL ")和/或代码中的等效代码。
控制切换到布局时布局的显示行为。
0每次切换到布局选项卡时,都会重新生成
1模型,最后一个布局选项卡会缓存到内存中
2选项卡的初始显示是唯一一次重新生成,其他任何时候激活选项卡时,都会从保存在注册表中的缓存中读取
;初始值2
谢谢。
将此 var 的值设置为“0”可以看到修改后的值。
有没有其他方法?不要改变系统变量的值?
也许是重生? 只是猜测..
您是否尝试过(在代码中)
读取并保存变量
将变量设置为0
您的mojo
是否将变量重置为以前保存的值。
抱歉,我帮不上什么忙。
前段时间遇到了这个问题,在多个视口中更新图层更改的成功有限。然后发现了我认为是一个未记录的函数。希望这有助于
// declarations
//
void __stdcall acedRegenLayers(class AcArray > const &,int);
void applyLayerChanges();
Acad::ErrorStatus getLayerObjectIdArray();
// Implementation
//
// Usage applies changes to Layer Table forcing update and regen
//
void applyLayerChanges(void)
{
applyCurDwgLayerTableChanges();
if ( acdbHostApplicationServices()->workingDatabase()->tilemode() )
ads_regen(); // Modelspace
else {
AcDbObjectIdArray layerIds;
getLayerObjectIdArray(layerIds);
acutPrintf(_T("Regenerating layout"));
acedRegenLayers(layerIds, 0);
}
return;
}
// Usage return AcDbObjectIdArray of pDb LayerTable
Acad::ErrorStatus getLayerObjectIdArray(AcDbObjectIdArray& objIds, bool External, AcDbDatabase* pDb)
{
if ( pDb == NULL ) pDb =acdbHostApplicationServices()->workingDatabase();
Acad::ErrorStatus es = Acad::eOk;
AcDbLayerTable* pTable = 0;
es = pDb->getSymbolTable(pTable, AcDb::kForRead);
if ( es != Acad::eOk ) return es;
// Interate layers
//
AcDbLayerTableIterator* pIter = 0;
es = pTable->newIterator(pIter);
if ( es != Acad::eOk ) {
pTable->close();
return es;
}
for (pIter->start();!pIter->done();pIter->step())
{
AcDbLayerTableRecord* pRecord = 0;
es = pIter->getRecord(pRecord, AcDb::kForRead);
if( es == Acad::eOk ) {
if ( pRecord->isDependent() ) {
if (External == true)
objIds.append(pRecord->objectId());
}
else
objIds.append(pRecord->objectId());
}
pRecord->close();
}
delete pIter;
pIter = 0;
// Close layer table
pTable->close();
pTable = 0;
return es;
}
从未找到任何关于函数int调用的信息,除了尝试和错误。
关于,
MJG MJG,这是一个伟大的发现,谢谢分享!
感谢您的帮助。
如果我保存变量并重置它,那是非常繁忙的代码。(例如,如果我插入一个Xref对象,可能有10-50个layerRecord,所以,如果保存和重置变量.........)
现在,在Arx init(On_kInitAppMsg())中,将变量设置为0:
问题是:如果这个变量设置为0,任何Model或Paper开关都会调用GraphicModify......
MJG的代码给我一些启发,谢谢。
谢谢~
页:
[1]
2