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!