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


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » DirectDWG
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2009-05-05, 11:33 AM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】getting the extents

getting the extents.
getting the extents.
using dwgdirect c++, how can i duplicate the adrawextentssizes function of opendwg toolkit\viewkit to get the same extents values?
regards,
sijmen.
to give you a little more background, i originally created a program using the opendwg toolkit\viewkit to create wmf files from dwg\dxf drawings. now i have to recreate the program using the dwgdirect c++ class library to do the same thing, so that it will work with the autocad 2004 drawings.
in both instances i have code to get the extents of the drawing, and scale it up so that the longest extent relates to 10000 device units.
my problem is that for a sample drawing the extents returned to me from the opendwg toolkkit\viewkit using adrawextentssizes (400.016, 318.361) are different to the extents returned from the dwgdirect c++ library (409.726, 318.319).
as a result the wmf canvas that i draw to is different: (10000, 7958) for opendwg tookkit\viewkit, and (10000, 7769) for dwgdirect c++ library, causing the drawings to be slightly offset from each other.
using the dwgdirect c++ framework, how can i get the same extents that opendwg toolkit\viewkit returned.
all help would be appreciated, as this is a very serious problem for me.
regards,
sijmen grunbauer.
hi,
what operation do you use for that? oddbblocktablerecord::getgeomextents()?
probably the extents are ok, but the conversion after that is a little bit different?
best regards
chudomir
oddbblocktablerecord::getgeomextents() returns world extents but some entities can have viewport-dependent geometry which depends on view direction, view size, render mode etc.
dd 1.13 to be release this week will contain simple method to get view-dependent extents.
sergey slezkin
when i originally created the dgw to wmf conversion program using the opendwg toolkit\viewkit, i used the following code to get the extents of the active layout, and work out the canvas size that the wmf would be drawn on:
code:
// create a drawing window, set to minimum size to calaculate the true extents.
rectlong winrect;
winrect.xmin = 0;
winrect.ymin = 0;
winrect.xmax = 1;
winrect.ymax = 1;
// intialize vectoring in opendwg viewkit.
ad_objhandle psblockhandle;
adhanclear(psblockhandle);
ad_view_parms adviewparms;
rectlong dlrect;
short sretval;
::zeromemory(&dlrect, sizeof(dlrect));
sretval = adinitvectorize(m_hdrawing, &adviewparms, &winrect, &dlrect, psblockhandle);
// get the true extents, which is used as a basis for the window aspect ratio.
double extsx, extsy;
adrawextentssizes(m_hdrawing, &extsx, &extsy);
// calculate the scale so the drawing will fit inside a 10,000 x 10,000 window.
double dscale = (extsx >= extsy) ? (10000.0 / extsx) : (10000.0 / extsy);
// set the wmf canvas size based on the extents size.
winrect.xmin = 0;
winrect.ymin = 0;
winrect.xmax = static_cast<long>(extsx * dscale);
winrect.ymax = static_cast<long>(extsy * dscale);
// save the canvas size.
setwindowrect(&winrect);
the adrawextentssizes(m_hdrawing, &extsx, &extsy); gives me extents of (400.016, 318.361) for my sample drawing, which then translates to a canvas of (10000, 7958).
the dwgdirect c++ code that i am using to get the extents is as follows:
code:
// get the drawing extents for the active view.
double extsx = 0.0;
double extsy = 0.0;
odgsview* pview = pdevice->viewat(0);
oddbextents ext;
ext.addblockext(oddbblocktablerecordptr(pdb->getactivelayoutbtrid().safeopenobject()), pview->viewingmatrix());
if (ext.isvalidextents())
{
odgepoint3d targ = pview->target();
odgevector3d dirfromtarg = pview->position() - targ;
// set target to center of the view and keep the view direction.
targ = ext.minpoint() + (ext.maxpoint() - ext.minpoint()) / 2.0;
targ.transformby(pview->viewingmatrix().invert());
if(pview->isfrontclipped() || pview->isbackclipped())
{
// keep distance from target to front & back planes.
targ = targ.orthoproject(odgeplane(pview->target(), dirfromtarg));
}
// get the extents and increase by 2% for margin around drawing.
extsx = ext.maxpoint().x - ext.minpoint().x;
extsy = ext.maxpoint().y - ext.minpoint().y;
pview->setview(targ + dirfromtarg, targ, pview->upvector(), extsx * 1.02, extsy * 1.02);
}
// calculate the scale so the drawing will fit inside a 10,000 x 10,000 window.
double dscale = (extsx >= extsy) ? (10000.0 / extsx) : (10000.0 / extsy);
// set the drawing window to the true extents size.
odgsdcrect winrect(0, static_cast<long>(extsx * dscale), 0, static_cast<long>(extsy * dscale));
pdwgvectorizedevice->onsize(winrect);
this code gives me the extents as (409.726, 318.319) for my sample drawing, which then translates to a canvas of (10000, 7769), when i need it to be (10000, 7958) for backward compatibility.
any assistance would be appreciated.
regards,
sijmen.
the question is which extents are correct?
if new toolkit returns incorrect extents, we'll fix it.
if old toolkit returns incorrect extents - they will differ and where is no way to get the same result with new toolkit.
sergey slezkin
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭

相似的主题
主题 主题发起者 论坛 回复 最后发表
【转帖】get extents of drawing yang686526 DirectDWG 0 2009-05-05 11:15 AM
【转帖】dwg extension in world coordinates yang686526 DirectDWG 0 2009-05-05 08:01 AM
【转帖】drawing extents changes after adding te yang686526 DirectDWG 0 2009-05-04 08:08 PM
【转帖】calculating extents draw yang686526 DirectDWG 0 2009-05-04 05:17 PM
【转帖】bad extents computing yang686526 DirectDWG 0 2009-05-04 04:35 PM


所有的时间均为北京时间。 现在的时间是 07:17 AM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多