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

几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 (http://www.dimcax.com/hust/index.php)
-   DirectDWG (http://www.dimcax.com/hust/forumdisplay.php?f=89)
-   -   【转帖】exploding 3dsolid access violates (http://www.dimcax.com/hust/showthread.php?t=16198)

yang686526 2009-05-05 10:16 AM

【转帖】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.