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
00054
00055
00056
00057
00058
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
00077
00078 CigiSymbolCircleDefV3_3::~CigiSymbolCircleDefV3_3(void)
00079 {
00080 }
00081
00082
00083
00084
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
00119
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
00166
00167
00168
00169
00170
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
00212
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
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++;
00233
00234
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
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
00280
00281
00282
00283
00284
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
00302
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