Code sample Home

Storing extra data in entities

In order to locate the entity with extra data we use its key value (property LC_PROP_ENT_KEY) .

// sample data structure
struct ENTXDATA {
  int    Num;
  bool   bCW;
  double Weight;
  double Prm[10];
  WCHAR  Name[32];
  int    Year;
};

//-----------------------------------------------
// Save information
//-----------------------------------------------
void DemoEntXDataPut (HANDLE hBlock)
{
  HANDLE   hEnt;
  int      Key, Size, Id, Flags;
  WCHAR*   szText = L"This string is stored in entity"; 
  ENTXDATA MyData;

  Key = 101;
  hEnt = lcDrwGetEntByKey( hBlock, Key );
  if (hEnt){
    // write text data into the entity
    lcPropPutStr( hEnt, LC_PROP_ENT_XSTR, szText );
  }

  // set fields of 'MyData' structure
  Size = sizeof(ENTXDATA);
  memset( &MyData, 0, Size );
  MyData.Num = 15;
  MyData.bCW = true;
  MyData.Weight = 1000.0;
  MyData.Prm[0] = 5.6;
  MyData.Prm[1] = 7.8;
  MyData.Prm[2] = 9.123;
  wcscpy( MyData.Name, L"Samsung" );
  MyData.Year = 2017;
  
  Key = 102;
  hEnt = lcDrwGetEntByKey( hBlock, Key );
  if (hEnt){
    // write binary data into the entity
    // allocate memory inside of the entity
    Id = 32;
    Flags = 9002;
    if (lcEntXData( hEnt, Id, Flags, Size )){
      // write 'MyData' contents into the entity
      lcPropPutHandle( hEnt, LC_PROP_ENT_XDATA, &MyData );
    }
  }
  
  // write binary data into entity using lcXData... functions
  Key = 103;
  hEnt = lcDrwGetEntByKey( hBlock, Key );
  if (hEnt){
    hData = lcXDataBegin();
    lcPropPutBool( hData, LC_PROP_XDATA_BOOL, MyData.bCW );
    lcPropPutInt( hData, LC_PROP_XDATA_INT, MyData.Num );
    lcPropPutFloat( hData, LC_PROP_XDATA_FLOAT, MyData.Weight );
    lcPropPutFloat( hData, LC_PROP_XDATA_FLOAT, MyData.Prm[0] );
    lcPropPutFloat( hData, LC_PROP_XDATA_FLOAT, MyData.Prm[1] );
    lcPropPutFloat( hData, LC_PROP_XDATA_FLOAT, MyData.Prm[2] );
    lcPropPutStr( hData, LC_PROP_XDATA_STR, MyData.Name );
    lcPropPutInt( hData, LC_PROP_XDATA_INT, MyData.Year );
    Size = lcXDataEnd( hData);
    // allocate memory inside of the entity
    Id = 33;
    Flags = 9003;
    if (lcEntXData( hEnt, Id, Flags, Size )){
      // write temporary buffer (hData) into the entity
      lcPropPutHandle( hEnt, LC_PROP_ENT_XDATA, hData );
    }
    // free temporary buffer
    lcXDataClear( hData);
  }
}

//-----------------------------------------------
// Retrieve information
//-----------------------------------------------
void DemoEntXDataGet (HANDLE hBlock)
{
  HANDLE   hEnt;
  int      Key, Size, Size2, Id, Flags;
  BOOL     bXStr;
  WCHAR    szText[256];
  ENTXDATA MyData;

  Key = 101;
  hEnt = lcDrwGetEntByKey( hBlock, Key );
  if (hEnt){
    // retrieve text data from the entity
    // check if XData contains text string
    bXStr = lcPropGetBool( hEnt, LC_PROP_ENT_XSTR );
    if (bXStr){
      // check if the size fits our buffer
      Size = lcPropGetInt( hEnt, LC_PROP_ENT_XDATASIZE );
      if (0<Size && Size<256){
        wcscpy( szText, lcPropGetStr( hEnt, LC_PROP_ENT_XSTR ) );
        // now variable 'szText' contains stored text
      }
    }
  }

  Key = 102;
  hEnt = lcDrwGetEntByKey( hBlock, Key );
  if (hEnt){
    // retrieve binary data from the entity
    Id = lcPropGetInt( hEnt, LC_PROP_ENT_XDATAID );
    Flags = lcPropGetInt( hEnt, LC_PROP_ENT_XDATAFLAGS );
    Size = lcPropGetInt( hEnt, LC_PROP_ENT_XDATASIZE );
    Size2 = sizeof(ENTXDATA);
    if (Size == Size2){
      memcpy( &MyData, lcPropGetHandle( hEnt, LC_PROP_ENT_XDATA ), Size );
      // now variable 'MyData' contains stored data
    }
  }
  
  // retrieve binary data from entity using lcXDataSet
  Key = 103;
  hEnt = lcDrwGetEntByKey( hBlock, Key );
  if (hEnt){
    Size = sizeof(ENTXDATA);
    memset( &MyData, 0, Size );
    Id = lcPropGetInt( hEnt, LC_PROP_ENT_XDATAID );
    Flags = lcPropGetInt( hEnt, LC_PROP_ENT_XDATAFLAGS );
    Size = lcPropGetInt( hEnt, LC_PROP_ENT_XDATASIZE );
    hData = lcPropGetHandle( hEnt, LC_PROP_ENT_XDATA );
    lcXDataSet( hData );
    // get data
    MyData.bCW = lcPropGetBool( hData, LC_PROP_XDATA_BOOL );
    MyData.Num = lcPropGetInt( hData, LC_PROP_XDATA_INT );
    MyData.Weight = lcPropGetFloat( hData, LC_PROP_XDATA_FLOAT );
    MyData.Prm[0] = lcPropGetFloat( hData, LC_PROP_XDATA_FLOAT );
    MyData.Prm[1] = lcPropGetFloat( hData, LC_PROP_XDATA_FLOAT );
    MyData.Prm[2] = lcPropGetFloat( hData, LC_PROP_XDATA_FLOAT );
    wcscpy( MyData.Name, lcPropGetStr( hData, LC_PROP_XDATA_STR ));
    MyData.Year = lcPropGetInt( hData, LC_PROP_XDATA_INT );
  }
}