乐筑天下

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

图形缓存和动画

[复制链接]

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-6-8 08:38:31 | 显示全部楼层 |阅读模式
下面的代码开始是为了修复一些图形缓存问题的测试,后来
在动画循环中更新了图形。在另一个项目中,我正在编写一个模拟器
在AutoCAD中运行,并且需要在动画循环中更新图形。问题
首先是缓存被打乱,其次是图形直到
应用程序完成后才更新。我想我已经解决了代码be的问题,但是我想知道
queueForGraphicsFlush()、flushGraphics()和acedUpdateDisplay是否正确实现。
它似乎可以工作,但是我不确定我是否正确地实现了它(参见代码末尾)。
谢谢,
Paul
运行代码:
创建一个新项目,并用下面的代码替换“acrxEntryPoint.cpp”的内容。
编译并运行,在AutoCAD命令行中键入RUNIT(可能需要最大化显示
并再次运行)。
  1. // Animate the circle 1000 times
  2. // Written by Paul Kohut, June 8, 2009
  3. // paulkohut@hotmail.com
  4. // Implements a fairly smooth aniniation loop within AutoCAD.
  5. //-----------------------------------------------------------------------------
  6. //----- acrxEntryPoint.h
  7. //-----------------------------------------------------------------------------
  8. #include "StdAfx.h"
  9. #include "resource.h"
  10. #define _USE_MATH_DEFINES 1
  11. #include
  12. #define index(x, y, c) (y * c + x)
  13. //-----------------------------------------------------------------------------
  14. #define szRDS _RXST("nav")
  15. #pragma comment(linker, "/export:_acrxGetApiVersion,PRIVATE")
  16. //#pragma comment(linker, "/export:_acrxEntryPoint,PRIVATE")
  17. //-----------------------------------------------------------------------------
  18. //----- ObjectARX EntryPoint
  19. class CBadGraphicsApp : public AcRxArxApp {
  20. public:
  21.         CBadGraphicsApp () : AcRxArxApp () {}
  22.         virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  23.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  24.                 return (retCode) ;
  25.         }
  26.         virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  27.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  28.                 return (retCode) ;
  29.         }
  30.         virtual void RegisterServerComponents () {
  31.         }
  32.         static void EraseAllEntity(AcDbBlockTableRecordPointer & pBtr)
  33.         {
  34.                 AcDbBlockTableRecordIterator * pIter;
  35.                 pBtr->newIterator(pIter);
  36.                 for(pIter->start(); !pIter->done(); pIter->step()) {
  37.                         AcDbObjectId entId;
  38.                         if(pIter->getEntityId(entId) == Acad::eOk) {
  39.                                 AcDbObject *pEnt;
  40.                                 if(actrTransactionManager->getObject(pEnt, entId, AcDb::kForWrite) == Acad::eOk)
  41.                                 {
  42.                                         pEnt->erase();
  43.                                 }
  44.                         }
  45.                 }
  46.         }
  47.         // draws a checker board, grid lines, and animates a circle.
  48.         static void DrawGraphics(void)
  49.         {
  50.                 int nMapSizeX = 8;
  51.                 int nMapSizeY = 8;
  52.                 double dGridSizeX = 1.0, dGridSizeY = 1.0;
  53.                 AcCmColor colorBlack;               
  54.                 AcCmColor colorGrid;
  55.                 AcCmColor colorWhite;
  56.                 AcCmColor colorRed;
  57.                 colorBlack.setRGB(0, 0, 0);
  58.                 colorGrid.setRGB(91, 91, 91);
  59.                 colorWhite.setRGB(255, 255, 255);
  60.                 colorRed.setRGB(255, 0, 0);
  61.                 double x = 0.0, y = 0.0;
  62.                 // Draw the checker board layout
  63.                 AcDbDatabase * pDb = acdbHostApplicationServices()->workingDatabase();
  64.                 AcDbBlockTableRecordPointer pRcd(ACDB_MODEL_SPACE, pDb, AcDb::kForWrite);
  65.                 if(pRcd.openStatus() == Acad::eOk) {
  66.                         EraseAllEntity(pRcd);                       
  67.                         for(int j = 0; j setColor((index(i, j, nMapSizeX) + j) % 2 ? colorBlack : colorWhite);
  68.                                         AcDbObjectId objId;
  69.                                         if(pRcd->appendAcDbEntity(objId, pSolid) == Acad::eOk)
  70.                                         {
  71.                                                 actrTransactionManager->addNewlyCreatedDBRObject(pSolid);
  72.                                                 pSolid->draw();
  73.                                         }
  74.                                         else
  75.                                                 delete pSolid;
  76.                                         x += dGridSizeX;
  77.                                 }
  78.                                 y -= dGridSizeY;
  79.                         }               
  80.                         // Draw vertical grid lines
  81.                         x = 0.0;
  82.                         y = 0.0;
  83.                         double gridLineWidth = 0.05;
  84.                         for(int i = 0; i addVertexAt(pPline->numVerts(), AcGePoint2d(x, y), 0.0, gridLineWidth, gridLineWidth);
  85.                                 pPline->addVertexAt(pPline->numVerts(), AcGePoint2d(x, y - (dGridSizeY * nMapSizeY)), 0.0, gridLineWidth, gridLineWidth);
  86.                                 pPline->setColor(colorGrid);
  87.                                 AcDbObjectId objId;
  88.                                 if(pRcd->appendAcDbEntity(objId, pPline) == Acad::eOk)
  89.                                 {
  90.                                         actrTransactionManager->addNewlyCreatedDBRObject(pPline);
  91.                                         pPline->draw();
  92.                                 }
  93.                                 else
  94.                                         delete pPline;
  95.                                 x += dGridSizeX;
  96.                         }
  97.                         // Draw horizontal grid lines
  98.                         x = 0.0;
  99.                         y = 0.0;
  100.                         for(int i = 0; i addVertexAt(pPline->numVerts(), AcGePoint2d(x, y), 0.0, gridLineWidth, gridLineWidth);
  101.                                 pPline->addVertexAt(pPline->numVerts(), AcGePoint2d(x + (dGridSizeX * nMapSizeX), y), 0.0, gridLineWidth, gridLineWidth);
  102.                                 pPline->setColor(colorGrid);                       
  103.                                 if(pRcd->appendAcDbEntity(pPline) == Acad::eOk)
  104.                                 {
  105.                                         actrTransactionManager->addNewlyCreatedDBRObject(pPline);
  106.                                         pPline->draw();
  107.                                 }
  108.                                 else
  109.                                         delete pPline;
  110.                                 y -= dGridSizeY;
  111.                         }
  112.                         // Animate a circle going in a circle
  113.                         static double stepp = M_PI_2 / 180.0;
  114.                         static double x1 = nMapSizeX * dGridSizeX * 0.5;
  115.                         static double y1 = -nMapSizeY * dGridSizeY * 0.5;
  116.                         static double ang = 0.0;
  117.                         AcDbCircle * pCircle = new AcDbCircle();
  118.                         pCircle->setCenter(AcGePoint3d(cos(ang) * 2.0 + x1, sin(ang) * 2.0 + y1, 0.0));
  119.                         pCircle->setRadius(0.25);
  120.                         pCircle->setColor(colorRed);
  121.                         if(pRcd->appendAcDbEntity(pCircle) == Acad::eOk)
  122.                         {
  123.                                 actrTransactionManager->addNewlyCreatedDBRObject(pCircle);                       
  124.                         }
  125.                         else
  126.                                 delete pCircle;
  127.                         ang += stepp;
  128.                 }
  129.         }
  130.         // call when the user types RUNIT from the AutoCAD command line.
  131.         // Questions??? Is the queueing, flushing, and updating of the
  132.         // graphics done correctly? It works, but is this the right way?
  133.         static void navBadGraphicsRunIt(void)
  134.         {
  135.                 AcTransaction * pTrans = actrTransactionManager->startTransaction();               
  136.                 actrTransactionManager->enableGraphicsFlush(kTrue);
  137.                 for(int i = 0; i queueForGraphicsFlush();
  138.                         actrTransactionManager->flushGraphics();
  139.                         acedUpdateDisplay();
  140.                 }
  141.                 actrTransactionManager->endTransaction();
  142.         }
  143. } ;
  144. //-----------------------------------------------------------------------------
  145. IMPLEMENT_ARX_ENTRYPOINT(CBadGraphicsApp)
  146. ACED_ARXCOMMAND_ENTRY_AUTO(CBadGraphicsApp, navBadGraphics, RunIt, RunIt, ACRX_CMD_TRANSPARENT, NULL)

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

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

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-6-8 11:09:17 | 显示全部楼层
嗨,Paul,
这些是强制更新的步骤。
需要这个吗:
actrTransactionManager-> enableGraphicsFlush(k true);?
为什么不放置:
draw graphics();
之后?也许吧
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-6-8 11:18:39 | 显示全部楼层

可能不需要enableGraphicsFlush(kTrue)将在一段时间内将其取出并进行测试,
否则它是实验的遗留代码
您的意思是“之后绘制图形”是什么?你是说把它放在函数<br>navBadGraphicsRunIt之后?现在的方式不再需要转发DrawGraphics的引用。
谢谢
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-6-8 11:31:50 | 显示全部楼层

在调用acedDragGen()之前,我已经在一个函数中使用了这个函数;这就是为什么
我指的是这个……它和你现在的方式一样-但我不太了解它。
  1. actrTransactionManager->queueForGraphicsFlush();
  2. actrTransactionManager->flushGraphics();
  3. acedUpdateDisplay();
  4. DrawGraphics();

回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-6-8 11:59:36 | 显示全部楼层

啊,我明白你在说什么了。否,需要先调用DrawGraphics函数,然后排队,然后更改并强制重画。否则,
显示的图形元素不同步一步。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-6 00:52 , Processed in 0.226863 second(s), 62 queries .

© 2020-2025 乐筑天下

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