查看单个帖子
旧 2009-05-05, 09:29 AM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】entity function getosnappoints

entity function "getosnappoints"
entity function "getosnappoints"
hi everyone...
i can't understand the behaviour of the "getosnappoints" function...
looking at the documentation i see that this function is defined almost for every oddbentity derived class, for example it is defined also for oddbblockreference class...
but if i try to import a block and try to get osnap points of this block reference, this function returns 0 snap points...
for an entity of tyle oddbline the snap points are returned correctly...
why ?
do i miss anything ???
thank you very muck,
carlo comino.
grippoints module (examples/grippoints) is responsible for grip and osnap points functionality.
it's only a sample illustrating how it can be implemented at client side.
it contains implementation for a few simple entities only.
ok, so this module is responsible of handling osnap points...
but when i create for example a line, i create an oddbline object...
how this module is responsible of handling this line osnap points ?
do i have to create a different entity type ??
i know this is a stupid question, but i can't understand how to use/modify this sample...
could you help me a bit ?
thank you very much !!!
below is implementation of oddbentity::getosnappoints(). it tries to get odgrippointspe protocol extension from the entity and calls it to do the job.
grippoints module being loaded adds impementation of grip and snap points functionality to some entities. try to search grippoints sources for oddbline for example to get the idea how it works.
code:
odresult oddbentity::getosnappoints(oddb:snapmode osnapmode,
int gsselectionmark,
const odgepoint3d& pickpoint,
const odgepoint3d& lastpoint,
const odgematrix3d& xworldtoeye,
odgepoint3darray& snappoints) const
{
oddbgrippointspeptr grips = oddbgrippointspe::cast( this );
if ( !grips.isnull() )
return grips->getosnappoints( this, osnapmode, gsselectionmark, pickpoint, lastpoint, xworldtoeye, snappoints );
return enotimplemented;
thank you very much!!!
as usual, you have been very useful!

quote:
originally posted by sslezkin
below is implementation of oddbentity::getosnappoints(). it tries to get odgrippointspe protocol extension from the entity and calls it to do the job.
grippoints module being loaded adds impementation of grip and snap points functionality to some entities. try to search grippoints sources for oddbline for example to get the idea how it works.
code:
odresult oddbentity::getosnappoints(oddb:snapmode osnapmode,
int gsselectionmark,
const odgepoint3d& pickpoint,
const odgepoint3d& lastpoint,
const odgematrix3d& xworldtoeye,
odgepoint3darray& snappoints) const
{
oddbgrippointspeptr grips = oddbgrippointspe::cast( this );
if ( !grips.isnull() )
return grips->getosnappoints( this, osnapmode, gsselectionmark, pickpoint, lastpoint, xworldtoeye, snappoints );
return enotimplemented;
}
hi again...
i tried to modify the grippoints dll, but now i face this problem:
i modifed the blockreference file to obtain blockreference grip points, but it doesn't work:
the function getosnappoints is never called, the oddbentitygrippointspe::getosnappoints is called instead...
this is the class declaration:
class oddbblockreferencegrippointspe : public oddbgrippointspe
{
public:
virtual odresult getgrippoints( const oddbentity* pentity, odgepoint3darray& grippoints ) const;
virtual odresult movegrippointsat( oddbentity* pentity, const odintarray& indices, const odgevector3d& offset );
virtual odresult getstretchpoints( const oddbentity* pentity, odgepoint3darray& stretchpoints ) const;
virtual odresult movestretchpointsat( oddbentity* pentity, const odintarray& indices, const odgevector3d& offset );
virtual odresult getosnappoints(
const oddbentity* pentity,
oddb:snapmode osnapmode,
int gsselectionmark,
const odgepoint3d& pickpoint,
const odgepoint3d& lastpoint,
const odgematrix3d& xworldtoeye,
odgepoint3darray& snappoints) const;
};
and the function definition:
odresult oddbblockreferencegrippointspe::getosnappoints(con st oddbentity* ent,
oddb:snapmode osnapmode,
int gsselectionmark,
const odgepoint3d& pickpoint,
const odgepoint3d& lastpoint,
const odgematrix3d& xworldtoeye,
odgepoint3darray& snappoints) const
{
oddbblockreferenceptr blockref = ent;
odgepoint3d position;
position = blockref->position();
switch ( osnapmode )
{
case oddb::kosmodeend:
break;
case oddb::kosmodemid:
break;
case oddb::kosmodeperp:
break;
case oddb::kosmodenear:
break;
case oddb::kosmodeins:
snappoints.append( position );
break;
}
return eok;
}
why this strange behaviour ???
in odamfcapp (osnapmanager.cpp) snapping is implemented in such manner that getosnappoints() functions are called not for block reference but for entities inside the block.
if the block contains only lines for example, you'll get into oddblinegrippointspe::getosnappoints() several times.
getting into oddbentitygrippointspe::getosnappoints means that block contains some entities without getosnappoints implemented.
btw, in autocad snapping works in similar manner - not to block reference insertion point but to the entities inside the block.
mmm, so if i have a 3d block made by many faces, and i want to snap olny to the block reference insertion point how (and above all where) can i modify my sources ?
thanks
code working with grip and snap points resides in application not in the library.
in our sample odamfcapp its osnapmanager.cpp
grip points are displayed for block reference entity and for snapping block entities are invoked to return snap points.
set a breakpoint in getosnappoints() and examine the stack.
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)