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

几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 (http://www.dimcax.com/hust/index.php)
-   DirectDWG (http://www.dimcax.com/hust/forumdisplay.php?f=89)
-   -   【转帖】block attribute iterator problem (http://www.dimcax.com/hust/showthread.php?t=15229)

yang686526 2009-05-04 04:45 PM

【转帖】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.