CigiSymbolLineDefV3_3.cpp

Go to the documentation of this file.
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 // Construction/Destruction
00051 // ====================================================================
00052 
00053 // ================================================
00054 // CigiBaseEntityCtrl
00055 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // ~CigiBaseEntityCtrl
00074 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00075 CigiSymbolLineDefV3_3::~CigiSymbolLineDefV3_3(void)
00076 {
00077 }
00078 
00079 // ================================================
00080 // CigiSymbolLineDefV3_3 - Copy constructor
00081 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // Copy operator
00116 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // Pack and Unpack
00163 // ====================================================================
00164 
00165 // ================================================
00166 // Pack
00167 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // Unpack
00209 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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    // Clear the current Vertex Vector
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++;  // Step over packet id
00230 
00231    // Determine variable data size;
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    // Unpack Vertices
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 // Vertex Operation
00277 // ====================================================================
00278 
00279 // ================================================
00280 // AddVertex
00281 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // RemoveVertex
00299 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 

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