![]() |
【转帖】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 |
所有的时间均为北京时间。 现在的时间是 01:37 AM. |