CigiSymbolCircleDefV3_3.cpp

Go to the documentation of this file.
00001 
00043 #define _EXPORT_CCL_
00044 
00045 
00046 #include "CigiSymbolCircleDefV3_3.h"
00047 #include "CigiSwapping.h"
00048 #include "CigiExceptions.h"
00049 
00050 using namespace std;
00051 
00052 // ====================================================================
00053 // Construction/Destruction
00054 // ====================================================================
00055 
00056 // ================================================
00057 // CigiBaseEntityCtrl
00058 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00059 CigiSymbolCircleDefV3_3::CigiSymbolCircleDefV3_3(void)
00060 {
00061    PacketID = CIGI_SYMBOL_CIRCLE_DEFINITION_PACKET_ID_V3_3;
00062    PacketSize = CIGI_SYMBOL_CIRCLE_DEFINITION_PACKET_SIZE_V3_3;
00063    Version = 3;
00064    MinorVersion = 3;
00065    VariableDataSize = 0;
00066 
00067    SymbolID = 0;
00068    DrawingStyle = Line;
00069    StipplePattern = 0;
00070    LineWidth = 0.0f;
00071    StipplePatternLen = 0.0f;
00072 
00073 }
00074 
00075 // ================================================
00076 // ~CigiBaseEntityCtrl
00077 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00078 CigiSymbolCircleDefV3_3::~CigiSymbolCircleDefV3_3(void)
00079 {
00080 }
00081 
00082 // ================================================
00083 // CigiSymbolCircleDefV3_3 - Copy constructor
00084 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00085 CigiSymbolCircleDefV3_3::CigiSymbolCircleDefV3_3(const CigiSymbolCircleDefV3_3 &BaseIn)
00086 : CigiBaseSymbolCircleDef((CigiBaseSymbolCircleDef &)BaseIn)
00087 {
00088    PacketID = CIGI_SYMBOL_CIRCLE_DEFINITION_PACKET_ID_V3_3;
00089    PacketSize = CIGI_SYMBOL_CIRCLE_DEFINITION_PACKET_ID_V3_3;
00090    Version = 3;
00091    MinorVersion = 3;
00092 
00093    VariableDataSize = 0;
00094 
00095    SymbolID = BaseIn.SymbolID;
00096    DrawingStyle = BaseIn.DrawingStyle;
00097    StipplePattern = BaseIn.StipplePattern;
00098    LineWidth = BaseIn.LineWidth;
00099    StipplePatternLen = BaseIn.StipplePatternLen;
00100 
00101    CigiCircleSymbolDataV3_3 *NewCircle = NULL;
00102    CigiCircleSymbolDataV3_3 *pCircle;
00103    vector<CigiBaseCircleSymbolData *>::const_iterator iCircle;
00104    for(iCircle=BaseIn.Circles.begin();iCircle!=BaseIn.Circles.end();iCircle++)
00105    {
00106       pCircle = (CigiCircleSymbolDataV3_3 *)*iCircle;
00107       if(pCircle != NULL)
00108       {
00109          NewCircle = new CigiCircleSymbolDataV3_3;
00110          *NewCircle = *pCircle;
00111          Circles.push_back((CigiBaseCircleSymbolData *)NewCircle);
00112          VariableDataSize += CIGI_CIRCLE_SYMBOL_DATA_SIZE_V3_3;
00113       }
00114    }
00115 }
00116 
00117 // ================================================
00118 // Copy Operator
00119 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00120 CigiSymbolCircleDefV3_3 & CigiSymbolCircleDefV3_3::operator=(const CigiSymbolCircleDefV3_3 &BaseIn)
00121 {
00122    PacketID = CIGI_SYMBOL_CIRCLE_DEFINITION_PACKET_ID_V3_3;
00123    PacketSize = CIGI_SYMBOL_CIRCLE_DEFINITION_PACKET_ID_V3_3;
00124    Version = 3;
00125    MinorVersion = 3;
00126 
00127    CigiBaseCircleSymbolData *pbCircle;
00128    vector<CigiBaseCircleSymbolData *>::iterator ibCircle;
00129    for(ibCircle=Circles.begin();ibCircle!=Circles.end();ibCircle++)
00130    {
00131       pbCircle = *ibCircle;
00132       if(pbCircle != NULL)
00133          delete pbCircle;
00134    }
00135    Circles.clear();
00136    VariableDataSize = 0;
00137 
00138    SymbolID = BaseIn.SymbolID;
00139    DrawingStyle = BaseIn.DrawingStyle;
00140    StipplePattern = BaseIn.StipplePattern;
00141    LineWidth = BaseIn.LineWidth;
00142    StipplePatternLen = BaseIn.StipplePatternLen;
00143 
00144    CigiCircleSymbolDataV3_3 *NewCircle = NULL;
00145    CigiCircleSymbolDataV3_3 *pCircle;
00146    vector<CigiBaseCircleSymbolData *>::const_iterator iCircle;
00147    for(iCircle=BaseIn.Circles.begin();iCircle!=BaseIn.Circles.end();iCircle++)
00148    {
00149       pCircle = (CigiCircleSymbolDataV3_3 *)*iCircle;
00150       if(pCircle != NULL)
00151       {
00152          NewCircle = new CigiCircleSymbolDataV3_3;
00153          *NewCircle = *pCircle;
00154          Circles.push_back((CigiBaseCircleSymbolData *)NewCircle);
00155          VariableDataSize += CIGI_CIRCLE_SYMBOL_DATA_SIZE_V3_3;
00156       }
00157    }
00158 
00159    return(*this);
00160 }
00161 
00162 
00163 
00164 // ====================================================================
00165 // Pack and Unpack
00166 // ====================================================================
00167 
00168 // ================================================
00169 // Pack
00170 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00171 int CigiSymbolCircleDefV3_3::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00172 {
00173    PackPointer CDta;
00174 
00175    CigiSymbolCircleDefV3_3 * Data =
00176       ( CigiSymbolCircleDefV3_3 *)Base;
00177 
00178    CDta.c = Buff;
00179 
00180    *CDta.c++ = PacketID;
00181    *CDta.c++ = (PacketSize + Data->VariableDataSize);
00182 
00183    *CDta.s++ = Data->SymbolID;
00184 
00185    *CDta.c++ = (Data->DrawingStyle != 0) ? 1 : 0;
00186 
00187    *CDta.c++ = 0;
00188 
00189    *CDta.s++ = Data->StipplePattern;
00190    *CDta.f++ = Data->LineWidth;
00191    *CDta.f++ = Data->StipplePatternLen;
00192 
00193    int Cnt;
00194    CigiCircleSymbolDataV3_3 *pCircle;
00195    vector<CigiBaseCircleSymbolData *>::iterator iCircle;
00196    for(iCircle=Data->Circles.begin();iCircle!=Data->Circles.end();iCircle++)
00197    {
00198       pCircle = (CigiCircleSymbolDataV3_3 *)*iCircle;
00199       if(pCircle != NULL)
00200       {
00201          Cnt = pCircle->Pack((CigiBaseCircleSymbolData *)pCircle,CDta.c);
00202          CDta.c += Cnt;
00203       }
00204    }
00205 
00206    return(PacketSize + Data->VariableDataSize);
00207 
00208 }
00209 
00210 // ================================================
00211 // Unpack
00212 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00213 int CigiSymbolCircleDefV3_3::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00214 {
00215    PackPointer CDta;
00216    unsigned char HDta = 0;
00217 
00218    CDta.c = Buff;
00219 
00220    // Clear the current Circle Vector
00221    CigiBaseCircleSymbolData *pbCircle;
00222    vector<CigiBaseCircleSymbolData *>::iterator ibCircle;
00223    for(ibCircle=Circles.begin();ibCircle!=Circles.end();ibCircle++)
00224    {
00225       pbCircle = *ibCircle;
00226       if(pbCircle != NULL)
00227          delete pbCircle;
00228    }
00229    Circles.clear();
00230    VariableDataSize = 0;
00231 
00232    CDta.c++;  // Step over packet id
00233 
00234    // Determine variable data size;
00235    int PcktRemain = *CDta.c++;
00236    PcktRemain -= CIGI_SYMBOL_CIRCLE_DEFINITION_PACKET_SIZE_V3_3;
00237    VariableDataSize = PcktRemain;
00238 
00239    if(!Swap)
00240    {
00241       SymbolID = *CDta.s++;
00242       HDta = *CDta.c++;
00243       CDta.c++;
00244       StipplePattern = *CDta.s++;
00245       LineWidth = *CDta.f++;
00246       StipplePatternLen = *CDta.f++;
00247    }
00248    else
00249    {
00250       CigiSwap2(&SymbolID, CDta.s++);
00251       HDta = *CDta.c++;
00252       CDta.c++;
00253       CigiSwap2(&StipplePattern, CDta.s++);
00254       CigiSwap4(&LineWidth, CDta.f++);
00255       CigiSwap4(&StipplePatternLen, CDta.f++);
00256    }
00257 
00258    DrawingStyle = (HDta != 0) ? Fill : Line ;
00259 
00260    // Unpack Circles
00261    int cnt = 0;
00262    CigiCircleSymbolDataV3_3 *pCircle;
00263    while(PcktRemain >= CIGI_CIRCLE_SYMBOL_DATA_SIZE_V3_3)
00264    {
00265       pCircle = new CigiCircleSymbolDataV3_3;
00266       Circles.push_back((CigiBaseCircleSymbolData *)pCircle);
00267       cnt = pCircle->Unpack(CDta.c,Swap);
00268       PcktRemain -= cnt;
00269       CDta.c += cnt;
00270    }
00271 
00272    return(PacketSize + VariableDataSize);
00273 
00274 }
00275 
00276 
00277 
00278 // ====================================================================
00279 // Circle Operation
00280 // ====================================================================
00281 
00282 // ================================================
00283 // AddCircle
00284 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00285 CigiBaseCircleSymbolData * CigiSymbolCircleDefV3_3::AddCircle(void)
00286 {
00287    CigiCircleSymbolDataV3_3 *NewCircle = NULL;
00288    int Cnt = Circles.size();
00289 
00290    if(Cnt < 10)
00291    {
00292       NewCircle = new CigiCircleSymbolDataV3_3;
00293       Circles.push_back((CigiBaseCircleSymbolData *)NewCircle);
00294       VariableDataSize += CIGI_CIRCLE_SYMBOL_DATA_SIZE_V3_3;
00295    }
00296 
00297    return((CigiBaseCircleSymbolData *)NewCircle);
00298 }
00299 
00300 // ================================================
00301 // RemoveCircle
00302 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00303 int CigiSymbolCircleDefV3_3::RemoveCircle(int CircleIndex, bool bndchk)
00304 {
00305    int stat = CIGI_SUCCESS;
00306 
00307    int Cnt = Circles.size();
00308 
00309    if((CircleIndex >= 0) && (CircleIndex < Cnt))
00310    {
00311       vector<CigiBaseCircleSymbolData *>::iterator iCircle = Circles.begin();
00312 
00313       iCircle += CircleIndex;
00314 
00315       CigiCircleSymbolDataV3_3 *pCircle =
00316          (CigiCircleSymbolDataV3_3 *)*iCircle;
00317       if(pCircle != NULL)
00318          delete pCircle;
00319 
00320       Circles.erase(iCircle);
00321 
00322       VariableDataSize -= CIGI_CIRCLE_SYMBOL_DATA_SIZE_V3_3;
00323       if(VariableDataSize < 0)
00324          VariableDataSize = 0;
00325 
00326    }
00327    else
00328    {
00329 #ifndef CIGI_NO_BND_CHK
00330       if(bndchk)
00331       {
00332 #ifndef CIGI_NO_EXCEPT
00333          throw CigiValueOutOfRangeException("CircleIndex", (int)CircleIndex,0,Cnt);
00334 #endif
00335          stat = CIGI_ERROR_VALUE_OUT_OF_RANGE;
00336       }
00337 #endif
00338    }
00339 
00340    return(stat);
00341 }
00342 
00343 
00344 

Generated on Wed Apr 29 08:59:59 2009 for CCL by  doxygen 1.4.7