![]() |
【转帖】how should i draw a blockref
how should i draw a blockref?
how should i draw a blockref? when i am about to draw a block reference (i am iterating through all entities in a dwg drawing) i first call odgibasedrawobject-setattributes(blockref) folowing by odgibasedrawobject-pushmodeltransform(blockref->blocktransform()). then i simply call odgibasedrawobject-draw() for every object in the block. at the and i call odgibasedrawobject-popmodeltransform(). all objects appears fine only they do not have the right properties (color, layer, etc.) and are not transformed correctly. is there other way to draw a block reference? note: i am handling block references on higher level (before they are sent to worlddraw) because i have to create sort of a group of it in the environment i am importing into. arno歵 in yourdrawobject::draw() method you can simply call odgibasedrawobject::draw(). it will tale care about entity traits, push byblock traits for compound object etc. btw, oddbblockreference::worlddraw() pushes model transform and calls draw(blocktablerecord). sergey slezkin sergey, you were right. i do not know about the traits yet, but calling oddbblockreference::worlddraw() indeed pushes and pops the correct transformation. but - there's always a but - the transformation is not applied to gi entitites (the ones i receive in my geometry implementations - such as pline, worldline, etc.) do i have to get the model transform and apply it manualy in all my geometry functions? i hoped i would receive already transformed points. that's also why i thought no trasformations were pushed in for my blocks. thanks primitives come untransformed. in dd 1.10 it would be possible to get them transformed and even projected on plane (ellipse instead of rotated circle for example). sergey slezkin thanks. that explains it. until 1.10 i will deal with the transforms manually. it looks to me though it is better not to call blockref::worlddraw() but iterate through the block entities, let them be transformed, and then call draw() for each of them separatelly. this way, the transformations are much simplier then in gi procs where i have to deal mostly with individual points. as far as the traits go, i do not see that blockref::worlddraw() sets the right traits. in my gi functions, whenever i receive the primitives of a block, they have set their original properties and not the properties of the block reference. i am using efectivetraits, since the name looks like it should be used in cases like this. thanks 1. transforming db entities. not every entity can be transformed by any matrix. you need to get transformed copy to leave entities in database unchanged. but even gettransformedcopy() can't transform all entities by any matrix. and transforming db entities leads to overhead. 2. to draw block reference setattributes() should be called before worlddraw. but even calling setattributes() will not take care about properties "byblock". so i would recommend to use draw(blockref) or better draw(layoutblocktablerecord) instead of iterating through entities manually. sergey slezkin 1. i do create copies of db entities. i have to bacause i open the db in read-only mode. 2. i do call setattributes, but i had to override setupforentity because if i didn't, i got wrong properties (namely colors) for entities inside block. 3. unfortunatelly i cannot simply call draw(layoutblocktablerecord). i need to handle some of the original entities (hatch, dims, blocks, etc.) and not only those basic primitives i would get in geometry functions. thanks for your kind response arno歵 |
所有的时间均为北京时间。 现在的时间是 06:09 PM. |