高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】paperspace with multiple viewports using odvectorizee
paperspace with multiple viewports using odvectorizeex
paperspace with multiple viewports using odvectorizeex
hello
i have extended the odvectorizeex example into my application to retrieve geometric data, i can read the model fine, but the paperspace layout reads again the model(a 3d model) in 2d, the paperspace is supposed to contain 3 viewports with different views of the 3d model.
what do i need to do to get the paperspace with the right viewports.
thank you
krishna
hi,
i had the same problem. please have a look at the thread "vectorizeex and viewports" to see how i solved it.
torsten
torsten,
thank you for the quick reply, i tried setting poverallview, but i ended with a drawing that has all the viewports sitting on each other instead of thier respective locations also the model itslef has all these viewports duplicated as part of the model.
since you have already accomplished this, is it possible to send a code snippet(or further guidance ), that acheives this.
thank you
krishna
hi krishna,
please find below the modified sample code for odvectorizeex:
odvectorizeex.cpp
code:
// global defintion for poveralview
odgsviewptr poveralview;
int main(int argc, char* argv[])
{
...
// prepare the device to render the active layout in this database.
pdevice = oddbgsmanager::setupactivelayoutviews(pdevice, pdwgcontext);
odgspaperlayouthelperptr ppaperhelper = odgspaperlayouthelper::cast( pdevice );
if( ppaperhelper.get() ) // paper space is active
{
poveralview = ppaperhelper->overallview();
}
else
{
poveralview = null;
}
// set the screen size for the generated geometry.
odgsdcrect screenrect(odgsdcpoint(0, 0), odgsdcpoint(10000, 10000));
pdevice->onsize(screenrect);
...
}
exgssimpledevice.cpp
code:
// external global defintion for poveralview
extern odgsviewptr poveralview;
void exsimpleview::update()
{
device()->setdrawcontext(drawcontext());
odgematrix3d xmodel2paperspace = poveralview->objecttodevicematrix().inverse() *
objecttodevicematrix() * geteyetoworldtransform();
seteyetooutputtransform( xmodel2paperspace );
// perform viewport clipping in eye coordinates:
...
}
with these two functions modified you should be able to receive the coordinates of all entities either in modelspace or paperspace coords.
torsten
hi torsten,
thank you for the code sample, i actually had figured it out during the weekend, the code, works perfectly for the paperspace layout, but in the model layout i still get components from the paperspace layout( stuff like the frame in drawings ), i cant seem to figure what i am doing wrong, to turn these off, did you run into a similar problem? if not can someone on the list advice me on how to work around it?
thank you
krishna
hi krishna,
since i am using the odvectorizeex example only for paperspace drawings, i didn't test it for modelspace drawings.
first i found a bug in my code: in exgssimpledevice.cpp, the function "void exsimpleview::update()" should check whether the drawing was saved in modelspace or not before calling "seteyetooutputtransform(..)".
if it is a modelspace drawing, you should use
seteyetooutputtransform( geteyetoworldtransform() );
otherwise the code i posted earlier in this thread shoud be used.
after i fixed this, i checked modelspace files, and everything is ok: no paperspace elements are read. i also checked the original example without any modifications, and the result is the same: only modelspace elements are read. maybe you did some changes to the code so that paperspace elements are always read?
torsten
hi torsten,
thank you for all the help, i have finally been able to figure out what was wrong.
here is what i was doing,
// create the vectorization context.
odgicontextfordbdatabaseptr pdwgcontext = odgicontextfordbdatabase::createobject();
// create the custom rendering device and set the output stream for the device.
odgsdeviceptr pdevice = exgssimpledevice::createobject( this );
// set the database to be vectorized.
pdwgcontext->setdatabase(m_poddb);
// obtain the layout dictionary
oddbdictionaryptr playoutdict = m_poddb->getlayoutdictionaryid().safeopenobject();
oddbdictionaryiteratorptr poveralliter = playoutdict->newiterator();
while (!poveralliter->done())
{
oddbobjectid layoutid = poveralliter->objectid();
oddblayoutptr playout = layoutid.safeopenobject();
// prepare the device to render the active layout in this database.
odgslayouthelperptr playouthelper = oddbgsmanager::setuplayoutviews( layoutid, pdevice, pdwgcontext );
// get the paper layout for overall view
odgspaperlayouthelperptr ppaperhelper = odgspaperlayouthelper::cast( playouthelper );
if( ppaperhelper.get() )
{
m_poveralview = ppaperhelper->overallview();
break;
}
// initiate vectorization.
playouthelper->update();
// end vectorization.
poveralliter->next();
}
i was trying to reuse the same "pdevice" for all the redraws for each layout and finally the model, this was apparently casuing problems, instead
i created a new pdevice for each layout/model and that seems to have fixed all my issues.
regards
krishna
|