![]() |
【转帖】block attribute iterator problem
block attribute iterator problem
block attribute iterator problem hi, sorry, this may already be in the forum, but i am having no luck with searching? is this not implemented in the new forum yet? anyway, i have a problem when i try to get the attributeiterator() from a block reference pointer. the block is already defined in the file with attributes, and when i add a new instance of it to the database, the attributeiterator() returns no attributes, but the hasattributedefinations() from the oddbblocktablerecord is true! how do i get to the attributes, is there any sample code for this? thanks, quincy blocktablerecord contains attribute definitions not attributes. when you add blocktablereference (block insertion) you have to append non-constant attributes to it "manually" by oddbblocktablereference::appendattribute(). sergey slezkin quote: originally posted by sergey slezkin blocktablerecord contains attribute definitions not attributes. when you add blocktablereference (block insertion) you have to append non-constant attributes to it "manually" by oddbblocktablereference::appendattribute(). ok, i think i see what you are talking about. my question is, in a pre-defined block can i get to these attributes/definitions, so i can change them when i insert the block? i have already defined them (with autocad) in dwg, that i load then copy the block. when i insert the block i need to get to these attributes? can i do this? thanks, quincy hope this helps. code: void oddbutils::appendattributestoblockref(oddbblockreference *pblkref, oddbobjectid insblkid) { // check for attribute definition odgematrix3d xform = pblkref->blocktransform(); oddbblocktablerecordptr pinsblock = insblkid.safeopenobject(); // correct transform matrix by base point oddbblocktablerecordptr pbr = pblkref->blocktablerecord().openobject(); odgepoint3d basept(pbr->origin()); xform *= odgematrix3d::translation(odgepoint3d::korigin - basept); // walk through the block and looking for att.def if (pinsblock->hasattributedefinitions()) { // get attribute entities from this block oddbobjectiteratorptr pit = pinsblock->newiterator(); while (!pit->done()) { oddbentityptr pentity = pit->entity(); if ( pentity->iskindof(oddbattributedefinition::desc()) ) { oddbattributedefinitionptr pattdef; pattdef = pentity; if (!pattdef->isconstant()) { oddbattributeptr pattr = oddbattribute::createobject(); pattr->setattributefromblock(pattdef, xform); pblkref->appendattribute(pattr); } } pit->step(); } // end of while (!pit->done()) } // end of if (pinsblock->hasattributedefinitions()) return; } sergey slezkin thank you! i was trying something similar to this last night very late, however i was looking for kindof(oddbattribute)! stupid me... i will try this out, one last question... where is odutils declared? i was just curios what all other functions where in this class. thanks oddbutils class is used internaly by dwgdirect. appendattributestoblockref() is called by dwgdirectx. for c++ users it's not very efficient because after calling it you'll need to iterate through created attributes once more to set their values. sergey slezkin |
所有的时间均为北京时间。 现在的时间是 07:33 AM. |