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