几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » DirectDWG
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


 
 
主题工具 搜索本主题 显示模式
旧 2009-05-04, 06:36 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】crash on update90 and draw90

crash on update() and draw()
crash on update() and draw()
hi!
i'm trying to build an application that renders a dwg to our home-made viewer. i'm using the dwgdirect rendering features to tesselate & triangulate the geometry.
i've created myself a "fake" device & view in order to get the triangulated geometry (mostly inspired by the exgssimpledevice example).
code:
class cjcmbviewervectorizedevice : public odgsbasevectorizedevice,
public odgigeometrysimplifier
{
// ...
}
class cjcmbviewervectorizeview : public odgsbasevectorizeview
{
// ...
}
the problem is when i call update() on my view, or draw() with an entity, i get strange exceptions (floating point, first chance exception, etc..) and dwgdirect crashes. here is the call stack when it crashes :
code:
***crash***
jcmbviewer2.ocx!odgilinetyperimpl::setlinetype()
jcmbviewer2.ocx!odgsbasevectorizeview::affecttraits()
jcmbviewer2.ocx!odgibasevectorizer::effectivetraits()
jcmbviewer2.ocx!odgibasevectorizer::draw()
jcmbviewer2.ocx!cjcmbviewervectorizeview::draw(const odgidrawable * d=0x08a6f898)
jcmbviewer2.ocx!oddbblocktablerecord::worlddraw()
jcmbviewer2.ocx!odgibasevectorizer::draw()
jcmbviewer2.ocx!cjcmbviewervectorizeview::draw(const odgidrawable * d=0x08a6f690)
jcmbviewer2.ocx!blockholder::worlddraw()
jcmbviewer2.ocx!odgibasevectorizer::draw()
jcmbviewer2.ocx!cjcmbviewervectorizeview::draw(const odgidrawable * d=0x0ba58a48)
jcmbviewer2.ocx!odgsbasevectorizeview::update()
jcmbviewer2.ocx!cjcmbviewervectorizeview::update()
jcmbviewer2.ocx!cdwgfiledd:pen(atl::cstringt<char,strtraitmfc_dll<char,atl::chtraitscrt<char> > > filename={...}, int mode=0x00000000)
here is the call stack when it crashes on draw(entity) :
code:
***crash***
jcmbviewer2.ocx!odgilinetyperimpl::setlinetype()
jcmbviewer2.ocx!odgsbasevectorizeview::affecttraits()
jcmbviewer2.ocx!odgibasevectorizer::effectivetraits()
jcmbviewer2.ocx!odgibasevectorizer::draw()
jcmbviewer2.ocx!cjcmbviewervectorizeview::draw(const odgidrawable * d=0x08a6f898)
jcmbviewer2.ocx!cdwgfiledd::createallfilelists()
am i forgetting to set something before rendering ? what is wrong with my code ???
help me!!!
mat
i'm kind of in a rush, so if you need more code or explanation on the problem, please let me know. i really need a fix.
mat
since nobody is helping me, i might as well reply to myself. so here is an update.
i managed to make the update() work.
but still, i cannot get to draw entities one-by-one using the odgsview->draw() method. why ?
code:
odinitialize(&g_dwgservices);
//
// dwg file open.
//
m_pdb = g_dwgservices.readfile(filename);
// association the data with the odgicontextfordbdatabase.
odgicontextfordbdatabase::setdatabase(m_pdb.get());
// create the vectorization device
m_pdevice = odrxobjectimpl<cjcmbviewervectorizedevice>::createobject();
m_pdevice->setlogicalpalette(odcmacadlightpalette(), 256);
m_pdevice->setusergicontext(this);
//
// setup the rendering device & views.
//
// create a view on our device.
m_pdevicehelper = oddbgsmanager::setupactivelayoutviews(m_pdevice.get(), this);
// get a pointer to the new view.
m_pview = m_pdevice->viewat(0);
// we center the view at (0,0) looking straight on the z axis (z=1.0).
// we use a bogus field view.
m_pview->setview(odgepoint3d(0,0,1), odgepoint3d(0,0,0), m_pview->upvector(), 1, 1);
// that works.
m_pdevicehelper->update(0);
// ************ that doesnt work (why ?) *************
// make sure the file is open and we have a rendering device.
if (m_pdb.isnull() || m_pdevice.isnull())
return false;
// get a pointer to the model space.
oddbblocktablerecordptr pmodelspace = m_pdb->getmodelspaceid().safeopenobject();
oddbobjectiteratorptr pentityiterator = pmodelspace->newiterator();
// for each entity in the block
for (; !pentityiterator->done(); pentityiterator->step())
{
oddbentityptr e = pentityiterator->objectid().safeopenobject();
static_cast<cjcmbviewervectorizeview*> (m_pview.get())->draw(e.get());
}
// *********** end "doesnt work" part. ***********
thank you very much.
mat
last edited by bleubleu_@hotmail.co; 16th june 2004 at 12:09 pmfff">.
hi mat,
i wander why you don't do so
code:
// get a pointer to the model space.
oddbblocktablerecordptr pmodelspace =
m_pdb->getmodelspaceid().safeopenobject();
m_pview->add(pmodelspace.get());
m_pdevice->update(0);
m_pview->erase(pmodelspace.get());
anyway this way it should work
code:
// get a pointer to the model space.
oddbblocktablerecordptr pmodelspace =
m_pdb->getmodelspaceid().safeopenobject();
oddbobjectiteratorptr pentityiterator = pmodelspace->newiterator();
cjcmbviewervectorizeview* pcjcmbviewerview =
static_cast<cjcmbviewervectorizeview*>(m_pview.get());
pcjcmbviewerview->beginviewvectorization();
// for each entity in the block
for (; !pentityiterator->done(); pentityiterator->step())
{
oddbentityptr e = pentityiterator->objectid().safeopenobject();
pcjcmbviewerview->draw(e.get());
}
pcjcmbviewerview->endviewvectorization();
thanks!
it worked!
yeah!
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
 


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 04:40 AM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多