高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】get extents of drawing
get extents of drawing
get extents of drawing
we had been doing the following to get the extents of the drawing:
==================================================
// create a database and load the drawing into it.
oddbdatabaseptr pdb;
pdb = svcs.readfile( szinput, false, false, oda::ksharedenyno );
if (!pdb.isnull())
{
// attempt at zooming to extents
oddbviewporttableptr pvptbl = pdb->getviewporttableid().safeopenobject();
oddbobjectid id = pvptbl->getactiveviewportid();
if (id)
{
oddbviewporttablerecordptr prec = id.safeopenobject(oddb::kforwrite);
prec->zoomextents();
}
/* this code gets the extents of the drawing */
oddbextents ext;
ext.addblockext(oddbblocktablerecordptr(pdb->getactivelayoutbtrid().safeopenobject()));
==================================================
since the oddbextents class no longer exists, i'm trying to figure out how to do the same thing using other classes, and i guess i'm not exactly sure which class would be comparable to what we were doing before. i'm pretty new to all of this.
i tried replacing the last chunk of code with this:
/* this code gets the extents of the drawing */
odgeextents3d ext;
oddbblocktablerecordptr btrptr = pdb->getactivelayoutbtrid().safeopenobject();
btrptr->getgeomextents(ext);
for some files, this seems to give me the same extents or very close, but for other files it gives very different results. does this code just need to be tweaked a bit, or should i be doing something completely different?
thank you.
getting extents from block table record and from viewport may give different results for example because some layers are frozen in the viewport. block table record is not aware of viewport context.
all view-related classes have abstractviewpe protocol extension which provides the same interface for oddbviewport, oddbviewporttablerecord etc.
see abstractviewpe.h
sergey slezkin
thank you for the response sergey.
could somebody please give me the specific code that will do for us what we were doing before? i hate to ask that, but i know very little about any of this stuff, including autocad, so i have no idea about viewports and block table records, etc. i'm just totally stabbing in the dark, looking for some example that's similar to what i need to do.
i tried the following using abstractviewpe, and some files that were getting the incorrect extents now get the correct extents, but other files still get incorrect extents:
/* this code gets the extents of the drawing */
odgeextents3d ext;
odabstractviewpeptr pvppe(prec);
odgeboundblock3d bbox;
bool bbboxvalid = pvppe->viewextents(prec, bbox);
if(bbboxvalid )
{
// extents not empty
bbox.transformby(pvppe->eyetoworld(prec));
}
else
{
// empty
}
odgepoint3d p1;
odgepoint3d p2;
bbox.getminmaxpoints(p1,p2);
//set the extents to the value of the bbox
ext.set(p1,p2);
what extents do you need?
the first example of your code using addblockextents() was getting extents of active layout block table record (model space or active paper space).
btw, it's not clear to me what was the purpose of calling viewport's zoomextents() before calling addblockextents().
does zoom extents in odamfcapp work correctly for files you have problems with?
note that in a few releases of dd calculating extents might be changed (regarding special cases like empty texts, hatches with invalid boundary etc.)
sergey slezkin
what i need are the autocad geometry extents of the file, when zoomed to extents.
actually, the first thing i was trying,
oddbblocktablerecordptr btrptr = pdb->getactivelayoutbtrid().safeopenobject();
btrptr->getgeomextents(ext);
seems to be working on almost all files. there are a small number of files where one of the 4 values is coming out very different. maybe it could be a bug, or maybe there is some reason it is different.
i'm having trouble getting odamfcapp to build, so i can't try zoomextents there. i did try building allexamples, and on odamfcapp i still get a link error on mfc42u.lib, which i can't find anywhere on my machine.
i found another problem i need to look into more urgently... i'll get back to you later if this turns out to be a big problem for me.
thank you for your help.
mfc42u.lib is unicode mfc runtime library. it's not installed by default while installing vc6. you need to check this option while installation.
(it's installed by default while installing vc 2005)
binary distribution contains already built odamfcapp. but binary zips for vc contain its dll version which will not run without mfc42u.dll.
sergey slezkin
|