查看单个帖子
旧 2009-05-06, 02:58 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】how to locate path names of underlay files

how to locate path names of underlay files
how to locate path names of underlay files
in the docs i see oddbunderlaydefinition and references, but i dont see anything specifying how to locate these objects. are they in the header? on a layout? in a dictionary?
is there a sample with how to read them? the dumper does not have anything i can see.
thanks
solved it my self - see my poorly formatted example
// iterate through attached images (jpg, tif, etc) and dgn/dwf underlays
//select the named objects dictionary
oddbobjectid obj = m_pdb->getnamedobjectsdictionaryid();
//open it before allocating an iterator
oddbdictionaryptr pnamedobjectsdictionary = obj.safeopenobject();
oddbdictionaryiteratorptr piter = pnamedobjectsdictionary->newiterator();
for (; !piter->done(); piter->next())
{
if((! stricmp(piter->name(), "acad_dwfdefinitions"))
|| (! stricmp(piter->name(), "acad_dgndefinitions")))
{
//located the image definitions dictionary, now iterate through it
oddbdictionaryptr pdictobject = piter->objectid().safeopenobject();
oddbdictionaryiteratorptr pdoiter = pdictobject->newiterator();
for (; !pdoiter->done(); pdoiter->next())
{
oddbobjectptr pobj = pdoiter->objectid().safeopenobject();
oddbunderlaydefinition * pu = (oddbunderlaydefinition*)pobj->queryx(oddbunderlaydefinition::desc());
//if ptr to underlay is valid, ok to do something with it
if(pu)
{
//for example, get "block name" and path to file
odstring pname = pu->getitemname();
odstring ppath = pu->getsourcefilename();
//release after totally done with object so
//its pointers are not invalidated
pu->release();
}
}
}
underlays are like images. there is underlay reference entity inserted in block, that has insertion point, scale, color adjustment and a reference to the underlay definition. underlay definition id may be obtained via oddbunderlayreference::definitionid()
if you only need a list of referenced files, then you may just traverse correspondent dictionaries (as you did).
btw: using raw pointers and queryx() looks a bit queer and is unsafe. the equivalent smart-pointer notation looks like this:
code:
oddbunderlaydefinitionptr pu = oddbunderlaydefinition::cast(pdoiter->objectid().safeopenobject());
if (!pu.isnull())
{
...
}
vladimir
thanks vladimir
i appreciate the tip - im a dusty old c++ guy, so these fancy smart pointers arent my area of expertise.
if using the code in your example in a loop, what would be the requirements for freeing the resources allocated to the smart pointer?
would it be released every time it was re used to test a new entry?
and when it went out of scope?
ie;
while(some condition)
{
oddbunderlaydefinitionptr pu = oddbunderlaydefinition::cast(pdoiter->objectid().safeopenobject());
if (!pu.isnull())
{
...
}
}
your code is ok.
pointee->release() is called in smartpointer destructor.
code:
while(some condition)
{
oddbunderlaydefinitionptr pu = oddbunderlaydefinition::cast(pdoiter->objectid().safeopenobject());
if (!pu.isnull())
{
...
}
<--- pointer destructor is called here
}
vladimir
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)