高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】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
|