issues with reading/translating points
issues with reading/translating points
ok experts, hopefully you can shed some light onthis issues for me, as it has driven me insane.
i'm using dwgdirect 2.3.0 (latest release) and i'm attempting to do some simple transformations. basically, i'm importing 3 copies of the same drawing into one master drawing, each in their own block. by default i insert them @ 0,0,0.
limiting the scope of the transformations to the x/y plane about the z axis:
each child drawing comes from the same initial drawing, a square of size 6 x 6, with an offset of (2,2) such that points ll(2,2) lr(8,2), ul(2,8), and ur(8,8) exist. [ll = lower left, lr = lower right, ul = upper left, ur = upper right].
what i want to do is to move these blocks so that points overlap, in effect, connecting them. initially, what i need to do is enumerate the blockreference of the child drawing, to find the named block reference, and get it's origin. i then need to translate that point from block space coords to model space coords. here's the function that i am using to accomplish this.
code:
oddbblocktablerecordptr opendwgdrawing::findreferencepoint(const char* refpointname,
odgematrix3d& blocktransformmatrix,
oddbblocktablerecordptr precord,
odgepoint3d& modelspacepoint)
{
printf("findreferencepoint [%s] \n", refpointname);
oddbobjectiteratorptr pentiter = precord->newiterator();
for (; !pentiter->done(); pentiter->step())
{
if( !oddbblockreference::cast(pentiter->objectid().safeopenobject()).isnull() )
{
oddbblockreferenceptr pblkrefa = pentiter->objectid().safeopenobject();
oddbblocktablerecordptr precordsub = pblkrefa->blocktablerecord().safeopenobject();
const odchar* pname = precordsub->getname().c_str();
odstring oname(pname);
// need a case insensitve compare here!
if(oname.icompare(odstring(refpointname)) != 0)
{
oddbblocktablerecordptr precordfound =
findreferencepoint(refpointname,blocktransformmatrix,precordsub, modelspacepoint);
if (!precordfound.isnull())
{
// translate it?
odgepoint3d poriginsrp = pblkrefa->position();
odgematrix3d pointtransformmatrix = pblkrefa->blocktransform();
pointtransformmatrix *= odgematrix3d::translation(odgepoint3d::korigin - poriginsrp);
blocktransformmatrix *= pointtransformmatrix;
modelspacepoint.transformby(blocktransformmatrix);
return precordfound;
}
}else
{
odgepoint3d poriginsrp = pblkrefa->position();
odgematrix3d pointtransformmatrix = pblkrefa->blocktransform();
pointtransformmatrix *= odgematrix3d::translation(odgepoint3d::korigin - poriginsrp);
blocktransformmatrix = pointtransformmatrix;
modelspacepoint = poriginsrp.transformby(blocktransformmatrix);
return precordsub;
}
}
}
return oddbblocktablerecordptr();
}
my present issue is, once i find the 2 points, i attempt to transform one block reference so that it's reference point aligns up with the other. i've tried it both with using the blockreferenceptr->setposition as well as using a transformation matrix, but no matter what i do, when i ask the block again for the coords of the "reference point" in model space coords, it always stays the same...
what am i missing?
last edited by
jacob.hoover@greenheck.com; 13th april 2007 at 10:55 amfff">.
sorry,
i found my error in the calling function not taking in to effect the translation matrix of it's block.