高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】layer 0 kbylayer color problem
layer 0 kbylayer color problem
layer 0 kbylayer color problem
in the attached file there are 4 layers defined (layers 0-3). each layer contains a text of different color.
layer 0 - white
layer 1 - red
layer 2 - yellow
layer 3 - green
the colors on layer 1-3 are correct. however, the color of layer 0 returns as black. it should return the color white. is there anything obviously wrong with my code below?
here's the relevant parts of my code...
void dwgdirectreadblock::readentity(oddbdatabase* pdb, oddbblocktablerecordptr pblock,oddbobjectid id, std(ostream) & os)
{
// open the entity
oddbentityptr pent = id.safeopenobject();
// retrieve the registered oddbreadentity object registered
// for this object type.
odsmartptr<oddbreadentity> preadent = pent;
// get the acad entity layer
odstring layerodstring = pent->layer();
oddbobjectid layeroddbobjectid = pent->layerid();
oddblayertablerecordptr layer;
odcmcolor cmlayercolor;
int layernum = getentitylayer(pdb, layerodstring, &layer, &cmlayercolor);
// get the acad entity color
odcmcolor cmcolor = pent->color();
odcmentitycolor::colormethod colormethod = cmcolor.colormethod();
unsigned int odcolor = getentitycolor(pent, colormethod, cmlayercolor);
.
.
.
int dwgdirectreadblock::getentitylayer(oddbdatabase* pdb, odstring layerodstring, oddblayertablerecordptr *player, odcmcolor *pcmlayercolor)
{
// layer table smart pointer, opened for read.
oddblayertableptr players = pdb->getlayertableid().safeopenobject();
// get a new layer table iterator (as a smart pointer)
oddbsymboltableiteratorptr piter = players->newiterator();
int ilayer;
for (piter->start(), ilayer=0; !piter->done(); piter->step(), ilayer++)
{
// layer record smart pointer, opened for read.
*player = piter->getrecordid().safeopenobject();
*pcmlayercolor = (*player)->color();
// search for a match
if( (*player)->getname() == layerodstring)
return ilayer;
return 0;
}
} // end int dwgdirectreadblock::setentitylayer
unsigned int dwgdirectreadblock::getentitycolor(oddbentityptr pent, odcmentitycolor::colormethod colormethod, odcmcolor cmlayercolor)
{
int color = -1;
unsigned int odcolor;
unsigned char r,g,b;
odcmcolor cmcolor = pent->color();
odcmentitycolor cmentitycolor;
switch(colormethod)
{
case odcmentitycolor::kbylayer:
r = cmlayercolor.red();
g = cmlayercolor.green();
b = cmlayercolor.blue();
odcolor = rgb(r,g,b);
break;
case odcmentitycolor::kbyblock:
break;
case odcmentitycolor::kbycolor:
cmentitycolor = cmcolor.entitycolor();
r = cmentitycolor.red();
g = cmentitycolor.green();
b = cmentitycolor.blue();
odcolor = rgb(r,g,b);
break;
case odcmentitycolor::kbyaci: // colorindex()
color = cmcolor.colorindex();
r = acadcolors[color].r;
g = acadcolors[color].g;
b = acadcolors[color].b;
odcolor = rgb(r,g,b);
break;
default:
break;
}
return odcolor;
} // end void dwgdirectreadblock::setentitycolor()
attached files
in attached file layer 0 has color specified by aci 7. color 7 is white on dark background and black on light background. odcmcolor returns rgb for light background.
if you need rgb for dark background see colormapping.h
sergey slezkin
hi sergey,
thanks for your help.
i've one question...
how do you know the colormethod is by aci. odcmentitycolor::colormethod colormethod = cmcolor.colormethod(); statement returns kbylayer, not kbyaci. the statement, odcmentitycolor::colormethod layercolormethod = cmlayercolor.colormethod();, also returns kbylayer.
tia
sergey,
thanks for your help.
my mistake. the statement, odcmentitycolor::colormethod layercolormethod = cmlayercolor.colormethod();, returns kbyaci.
|