明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6709|回复: 8

[原创]executeInApplicationContext及appContextNewDocument

[复制链接]
发表于 2009-11-25 10:32:00 | 显示全部楼层 |阅读模式
昨天看了2个帖子,都是关于executeInApplicationContext的,初初觉得这个比较麻烦,但后来发现并不那么神秘。
以下是源码:
  1. static void RaLfAATest_sss(void)
  2. {
  3.   Acad::ErrorStatus es;
  4.   AcDbDatabase *pNewDB = creatNewDB();//根据函数返回新建数据库指针
  5.   
  6.   if ( pNewDB == NULL )
  7.   {
  8.    acutPrintf( L"Failed To Create A New DataBase!");
  9.    delete pNewDB;
  10.    return;
  11.   }
  12.   AcApDocument *pNewDoc = acDocManager->document( pNewDB );//获取当前数据库的文档指针
  13.   es = acDocManager->lockDocument( pNewDoc );//重要,锁定新建文档
  14.   
  15.   if ( es != Acad::eOk )
  16.   {
  17.    acutPrintf(L"Failed to Lock the Document Associated with the New DataBase!" );
  18.    delete pNewDB;
  19.    return;
  20.   }//状态判断
  21.   AcDbBlockTable *pBT = NULL;
  22.   es = pNewDB->getBlockTable( pBT, AcDb::kForRead );
  23.   if ( es != Acad::eOk )
  24.   {
  25.    acutPrintf(ACRX_T("Failed to Get the BlockTable in the New DataBase! \nError code: %s"), acadErrorStatusText( es ) );
  26.    delete pNewDB;
  27.    return;
  28.   }//状态判断
  29.   AcDbBlockTableRecord *pBTR = NULL;
  30.   es = pBT->getAt( ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite );
  31.   if ( es != Acad::eOk )
  32.   {
  33.    acutPrintf(ACRX_T("Failed to Get the ModalSpace in BlockTableRecord in the New DataBase! \nError code: %s"), acadErrorStatusText( es ) );
  34.    pBT->close();
  35.    delete pNewDB;
  36.    return;
  37.   }//状态判断
  38.   pBT->close();
  39.   AcDbLine *pLine = new AcDbLine( AcGePoint3d(0,0,0), AcGePoint3d(100,100,100) );
  40.   es = pBTR->appendAcDbEntity( pLine );
  41.   if ( es != Acad::eOk )
  42.   {
  43.    acutPrintf(ACRX_T("Failed to Get the ModalSpace in BlockTableRecord in the New DataBase! \nError code: %s"), acadErrorStatusText( es ) );
  44.    pBT->close();
  45.    pBTR->close();
  46.    pLine->close();
  47.    delete pNewDB;
  48.    return;
  49.   }//状态判断
  50.   pLine->close();
  51.   pBTR->close();
  52.    
  53.   acDocManager->unlockDocument( pNewDoc );//对新数据库操作完毕,及时释放锁定的文档
  54.   pNewDoc->transactionManager()->flushGraphics();//刷新文档,似乎没用
  55. }
  56. AcDbDatabase *creatNewDB()
  57. {
  58. Acad::ErrorStatus es;
  59. AcDbDatabase* pNewDb=NULL;
  60. static ACHAR pData[] =L"acad.dwt";
  61. acDocManager->executeInApplicationContext(CreateDoc,(void *)pData);
  62. int docCount = acDocManager->documentCount();
  63. AcApDocument* npDoc;
  64. AcApDocumentIterator *pDocItr = acDocManager->newAcApDocumentIterator();
  65. //获取新建立文档的指针
  66. for ( int i = 0 ; !pDocItr->done(); pDocItr->step(), i++ )
  67. {
  68.   if ( i == docCount-1 )
  69.   {
  70.    npDoc = pDocItr->document();
  71.    break;
  72.   }
  73. }
  74. delete pDocItr;
  75. pNewDb = npDoc->database();//获取新建立文档的数据库指针
  76. if(!pNewDb) return  NULL; //如果创建失败,数据库为NULL,我认为这个可以省略
  77. return  pNewDb;
  78. }
  79. void CreateDoc( void *pData)
  80. {
  81. Acad::ErrorStatus es;
  82. AcApDocument* pDoc = acDocManager->mdiActiveDocument(); //记录当前文档
  83. if (acDocManager->isApplicationContext())
  84. {
  85.   es = acDocManager->appContextNewDocument((const ACHAR *)pData);
  86.   es = acDocManager->activateDocument( pDoc );//这里将文档切换回原来的文档,以便该文档继续执行代码
  87. }
  88. }
复制代码
发表于 2009-11-25 16:12:00 | 显示全部楼层
谢谢!最近正研究不明白这呢!强顶!
发表于 2009-11-25 16:48:00 | 显示全部楼层

可是Lz为甚麽创建的图形并不显示出来,保存后再打开才显示?能不能打开dwg文件读写数据库后会立即显示图形?

 楼主| 发表于 2009-11-25 17:13:00 | 显示全部楼层

哎,剩下的你去琢磨吧,我已经研究了1天了

发表于 2009-11-26 08:59:00 | 显示全部楼层
哦,呵呵!还是谢谢你!
发表于 2010-10-11 17:20:00 | 显示全部楼层
很强啊 困扰了我好久啊
发表于 2011-11-21 20:41:12 | 显示全部楼层
c:\Users\Administrator\Documents\Visual Studio Projects\zcapp50\acrxEntryPoint.cpp(210): error C2664: “AcApDocManager::executeInApplicationContext” : 不能将参数 1 从“void (void)”转换为“void (__cdecl *)(void *)”
发表于 2011-11-21 20:41:47 | 显示全部楼层
acDocManager->executeInApplicationContext(CreateDoc,(void*)pData);
发表于 2012-6-27 21:07:50 | 显示全部楼层
ws_ong123 发表于 2011-11-21 20:41
c:\Users\Administrator\Documents\Visual Studio Projects\zcapp50\acrxEntryPoint.cpp(210): error C2664 ...

查资料到此处,解决此问题的方法是把CreateDoc这个函数设置为静态函数即可
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 09:33 , Processed in 0.171160 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表