Dream.Fei 发表于 2007-12-26 11:14:12

如何更新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 *****

Dream.Fei 发表于 2007-12-26 14:40:01

“LAYOUTREGENCTL”设置为什么?
此外,您可能需要记录为视窗修改的图形。

Kerry 发表于 2007-12-27 01:19:47


(getvar "LAYOUTREGENCTL ")和/或代码中的等效代码。
控制切换到布局时布局的显示行为。
0每次切换到布局选项卡时,都会重新生成
1模型,最后一个布局选项卡会缓存到内存中
2选项卡的初始显示是唯一一次重新生成,其他任何时候激活选项卡时,都会从保存在注册表中的缓存中读取
;初始值2

Dream.Fei 发表于 2007-12-27 01:29:33


谢谢。
将此 var 的值设置为“0”可以看到修改后的值。
有没有其他方法?不要改变系统变量的值?

Kerry 发表于 2007-12-27 01:39:40


也许是重生?

Dream.Fei 发表于 2007-12-27 01:54:57

只是猜测..
您是否尝试过(在代码中)
读取并保存变量
将变量设置为0
您的mojo
是否将变量重置为以前保存的值。
抱歉,我帮不上什么忙。

Kerry 发表于 2007-12-27 02:33:43

前段时间遇到了这个问题,在多个视口中更新图层更改的成功有限。然后发现了我认为是一个未记录的函数。希望这有助于

// 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

mjguzik 发表于 2007-12-27 03:34:59

MJG,这是一个伟大的发现,谢谢分享!

Dream.Fei 发表于 2007-12-27 11:55:53

感谢您的帮助。

Dream.Fei 发表于 2007-12-28 11:54:35


如果我保存变量并重置它,那是非常繁忙的代码。(例如,如果我插入一个Xref对象,可能有10-50个layerRecord,所以,如果保存和重置变量.........)
现在,在Arx init(On_kInitAppMsg())中,将变量设置为0:
问题是:如果这个变量设置为0,任何Model或Paper开关都会调用GraphicModify......
MJG的代码给我一些启发,谢谢。
谢谢~
页: [1] 2
查看完整版本: 如何更新AcDbViewport对象?