![]() |
【转帖】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::open(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! |
所有的时间均为北京时间。 现在的时间是 07:59 AM. |