高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】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.
|