![]() |
【转帖】exploding 3dsolid access violates
exploding 3dsolid access violates
exploding 3dsolid access violates opendwg'ers the attached file access violates on the line "solid3dptr->explode(primitives);" please let me know if i have done something wrong, or how i can work around this. my code for testing this is as simple as follows: :dinitialize(&dwgsvcs); :drxinitwinntcrypt(); odrx_init_static_module_map(); { oddbdatabaseptr dwgdb = dwgsvcs.readfile( "p:\\drawings\\downloads\\3d_objects\\fur studio furniture\\x-3d62fur.dwg", false, false, oda::ksharedenyno ); oddbblocktablerecordptr blocktableptr = dwgdb->getmodelspaceid().safeopenobject(); oddbobjectiteratorptr entityiteratorptr = blocktableptr->newiterator(); while( !entityiteratorptr->done() ) { oddbentityptr entityptr = entityiteratorptr->entity(oddb::kforread); oddbobjectid entityid = entityptr->objectid(); oddbhandle hentity = entityid.gethandle(); oddbobjectptr objectptr = entityid.openobject(); odrxobjectptrarray primitives; if (entityptr->isa() == aecdbwall::desc()) { aecdbwallptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbdoor::desc()) { aecdbdoorptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbwindow::desc()) { aecdbwindowptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbslab::desc() ) { aecdbslabptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbopening::desc() ) { aecdbopeningptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbspace::desc() ) { aecdbspaceptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbstair::desc() ) { aecdbstairptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbroof::desc() ) { aecdbroofptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbpolygon::desc() ) { aecdbpolygonptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbrailing::desc() ) { aecdbrailingptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbroofslab::desc() ) { aecdbroofslabptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbspaceboundary::desc() ) { aecdbspaceboundaryptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdblayoutgrid3d::desc() ) { aecdblayoutgrid3dptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdblayoutgrid2d::desc() ) { aecdblayoutgrid2dptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdblayoutcurve::desc() ) { aecdblayoutcurveptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbcurtainwalllayout::desc()) { aecdbcurtainwalllayoutptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbwindowassembly::desc()) { aecdbwindowassemblyptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbcolumngrid::desc()) { aecdbcolumngridptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecdbmasselem::desc()) { aecdbmasselemptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == aecsdbmember::desc()) { aecsdbmemberptr adtptr = entityptr; adtptr->explode(primitives); } else if (entityptr->isa() == oddb3dsolid::desc()) { oddb3dsolidptr solid3dptr = entityptr; if( solid3dptr->isnull() == false ) { odrxobjectptrarray primitives; solid3dptr->explode(primitives); // crashes here odrxobjectptrarray::iterator iter = primitives.begin(); } } entityiteratorptr->step(); } } :drxuninitwinntcrypt(); :duninitialize(); cheers jason attached files hi, thank you for attachment. i have found problems in our explode code. fixes will be available in next release. please, use try {} catch(...) {} block as temporary fix. |
所有的时间均为北京时间。 现在的时间是 05:48 AM. |