1 //#************************************************************** 2 //# 3 //# filename: elementdata.h 4 //# 5 //# author: Gerstmayr Johannes 6 //# 7 //# generated: March 2010 8 //# description: Utilities for general data structure ElementData and ElementDataContainer 9 //# 10 //# remarks: 11 //# 12 //# Copyright (c) 2003-2013 Johannes Gerstmayr, Linz Center of Mechatronics GmbH, Austrian 13 //# Center of Competence in Mechatronics GmbH, Institute of Technical Mechanics at the 14 //# Johannes Kepler Universitaet Linz, Austria. All rights reserved. 15 //# 16 //# This file is part of HotInt. 17 //# HotInt is free software: you can redistribute it and/or modify it under the terms of 18 //# the HOTINT license. See folder 'licenses' for more details. 19 //# 20 //# bug reports are welcome!!! 21 //# WWW: www.hotint.org 22 //# email: bug_reports@hotint.org or support@hotint.org 23 //#************************************************************** 24 25 #ifndef ELEMENTDATA__H 26 #define ELEMENTDATA__H 27 28 class mystr; 29 30 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 31 //++++++++ data exchance interface for element data ++++++++++++++++++++++++++++++++ 32 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 33 class ElementDataContainer; 34 35 class ElementData 36 { 37 public: 38 ElementData(); 39 40 ElementData(const ElementData& e); 41 42 ElementData& operator=(const ElementData& ed) 43 { 44 if (this == &ed) {return *this;} 45 CopyFrom(ed); 46 return *this; 47 } 48 GetCopy()49 virtual ElementData* GetCopy() const 50 { 51 ElementData* ed = new ElementData(); 52 ed->CopyFrom(*this); 53 return ed; 54 } 55 56 virtual void CopyFrom(const ElementData& e); 57 58 virtual void Reset(); 59 ~ElementData()60 virtual ~ElementData() 61 { 62 Reset(); 63 } 64 65 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 66 //functions to define the ElementData for specific data type: SetBool(int num,const char * name)67 virtual void SetBool(int num, const char* name) 68 { 69 Reset(); 70 SetDataName(name); 71 type = 16; 72 idata = num; 73 } SetBool(int num)74 virtual void SetBool(int num) //only change value! 75 { 76 idata = num; 77 } SetBoolGroup(int num,int group,const char * name)78 virtual void SetBoolGroup(int num, int group, const char* name) 79 { 80 Reset(); 81 SetDataName(name); 82 type = 16+512; 83 idata = num; 84 groupnum = group; 85 } SetGroup(int groupnumI)86 virtual void SetGroup(int groupnumI) {groupnum = groupnumI; type = type|512;} //only add group number 87 SetVariableLength()88 virtual void SetVariableLength() {type = type|4096;} //vectors of variable length (editable) 89 SetInt(int num)90 virtual void SetInt(int num) //only change value! 91 { 92 idata = num; 93 } 94 virtual void SetInt(int num, const char* name, int minvalI=1, int maxvalI=0, bool onlyLowerBorder=0, bool onlyUpperBorder=0); 95 SetDouble(double num)96 virtual void SetDouble(double num) //only change value! 97 { 98 vdata[0] = num; 99 } 100 virtual void SetDouble(double num, const char* name, double minvalI=1, double maxvalI=0, bool onlyLowerBorder=0, bool onlyUpperBorder=0) 101 { 102 Reset(); 103 SetDataName(name); 104 type = 2; 105 vdatalen = 1; 106 vdata = new double[vdatalen]; 107 vdata[0] = num; 108 SetMinMaxVal(minvalI, maxvalI, onlyLowerBorder, onlyUpperBorder); 109 } 110 SetVectorLen(int i)111 virtual void SetVectorLen(int i) //only change length! 112 { 113 if (vdatalen != 0 && vdata != 0) 114 { 115 delete[] vdata; 116 vdata = 0; 117 } 118 119 vdatalen = i; 120 vdata = new double[vdatalen]; 121 } SetVectorVal(int i,double v)122 virtual void SetVectorVal(int i, double v) //only change value! 123 { 124 vdata[i-1] = v; 125 } 126 127 virtual void SetVector2D(double vx, double vy, const char* name, double minvalI=1, double maxvalI=0, bool onlyLowerBorder=0, bool onlyUpperBorder=0); 128 virtual void SetVector3D(double vx, double vy, double vz, const char* name, double minvalI=1, double maxvalI=0, bool onlyLowerBorder=0, bool onlyUpperBorder=0); 129 virtual void SetVector(double* v, int len, const char* name, double minvalI=1, double maxvalI=0, bool onlyLowerBorder=0, bool onlyUpperBorder=0); 130 virtual void SetMatrix(double* v, int rows, int cols, const char* name); 131 virtual void SetVector2DList(double* v, int n, const char* name); 132 SetText(const char * textdata,const char * name)133 virtual void SetText(const char* textdata, const char* name) 134 { 135 Reset(); 136 SetDataName(name); 137 type = 8; 138 139 size_t length = strlen(textdata); 140 tdata = new char[length + 1]; 141 strcpy(tdata, textdata); 142 } 143 144 //virtual void SetEDC(ElementDataContainer* edcI, mystr name); 145 virtual void SetEDC(ElementDataContainer* edcI, const char* name); 146 147 //same as SetEDC, but do not copy edcI (just set reference); be careful with usage!!! 148 virtual void SetEDCno_copy(ElementDataContainer* edcI, const char* name); 149 SetWCDriverAction(int action,int option,int value,const char * name)150 virtual void SetWCDriverAction(int action, int option, int value, const char* name) 151 { 152 Reset(); 153 SetDataName(name); 154 type = 128; 155 idata = action; 156 idata2 = option; 157 idata3 = value; 158 } 159 SetCompAction(int action,int option,int value,const char * name)160 virtual void SetCompAction(int action, int option, int value, const char* name) 161 { 162 Reset(); 163 SetDataName(name); 164 type = 256; 165 idata = action; 166 idata2 = option; 167 idata3 = value; 168 } 169 170 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 171 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 172 173 GetType()174 virtual int GetType() const {return type;} SetType(int typeI)175 virtual void SetType(int typeI) {type = typeI;} 176 IsLocked()177 virtual int IsLocked() const {return locked;} SetLocked(int flag)178 virtual void SetLocked(int flag) {locked = flag;} HasToolTip()179 virtual int HasToolTip() const {return hastooltip;} SetToolTipText(const char * text)180 virtual void SetToolTipText(const char* text) 181 { 182 if (tooltiptext != 0) delete[] tooltiptext; 183 184 hastooltip = 1; 185 size_t length = strlen(text); 186 tooltiptext = new char[length + 1]; 187 strcpy(tooltiptext, text); 188 } GetToolTipText()189 virtual const char* GetToolTipText() const {return tooltiptext;} 190 IsElementInfo()191 virtual int IsElementInfo() const {return (type&64) != 0;} IsBool()192 virtual int IsBool() const {return (type&16) != 0;} IsInt()193 virtual int IsInt() const {return (type&1) != 0;} IsDouble()194 virtual int IsDouble() const {return (type&2) != 0;} IsVector()195 virtual int IsVector() const {return (type&4) != 0;} IsVectorXYZ()196 virtual int IsVectorXYZ() const {return (type&32) != 0;} IsText()197 virtual int IsText() const {return (type&8) != 0;} IsWCDriverAction()198 virtual int IsWCDriverAction() const {return (type&128) != 0;} IsCompAction()199 virtual int IsCompAction() const {return (type&256) != 0;} IsGroup()200 virtual int IsGroup() const {return (type&512) != 0;} IsMatrix()201 virtual int IsMatrix() const {return (type&1024) != 0;} IsValuesInt()202 virtual int IsValuesInt() const {return (type&2048) != 0;} //vector/matrix values are integer! IsVariableLength()203 virtual int IsVariableLength() const {return (type&4096) != 0;} //vectors of variable length (editable) IsEDC()204 virtual int IsEDC() const {return (type&8192) != 0;} //pointer to other ElementData IsColumnNumberFixed()205 virtual int IsColumnNumberFixed() const {return (type&16384) != 0;} 206 207 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 208 //functions that get element data: GetDataName()209 virtual char* GetDataName() const {return dataname;} SetDataName(const char * name)210 virtual void SetDataName(const char* name) 211 { 212 size_t length = strlen(name); 213 dataname = new char[length + 1]; 214 strcpy(dataname, name); 215 } 216 GetInt()217 virtual int GetInt() const {return idata;} GetMinMaxVal(double & min,double & max,bool & justoneLimit)218 virtual int GetMinMaxVal(double& min, double& max, bool& justoneLimit) {min = minval; max = maxval; justoneLimit = oneLimit; return (min <= max);} 219 virtual void SetMinMaxVal(double min, double max, bool onlyLowerBorder, bool onlyUpperBorder); //$ DR 2012-11 added 220 GetBool()221 virtual int GetBool() const {return idata;} GetGroup()222 virtual int GetGroup() const {return groupnum;} GetDouble()223 virtual double GetDouble() const {return vdata[0];} GetVector()224 virtual double* GetVector() const {return vdata;} GetVector(double & vx,double & vy)225 virtual void GetVector(double& vx, double& vy) const 226 { 227 vx = vdata[0]; 228 vy = vdata[1]; 229 } GetVector(double & vx,double & vy,double & vz)230 virtual void GetVector(double& vx, double& vy, double& vz) const 231 { 232 vx = vdata[0]; 233 vy = vdata[1]; 234 vz = vdata[2]; 235 } GetVectorLen()236 virtual int GetVectorLen() const {return vdatalen;} GetVectorVal(int i)237 virtual double GetVectorVal(int i) const {return vdata[i-1];} 238 GetMatrix()239 virtual double* GetMatrix() const {return vdata;} GetMatrixRows()240 virtual int GetMatrixRows() const {return idata;} GetMatrixCols()241 virtual int GetMatrixCols() const {return idata2;} 242 GetMatrixVal(int row,int col)243 virtual double GetMatrixVal(int row, int col) const //row and col are 1-based!!! 244 { 245 return vdata[(row-1)*idata2 + col-1]; 246 } 247 GetText()248 virtual char* GetText() const {return tdata;} 249 GetWCDriverAction(int & action,int & option,int & value)250 virtual void GetWCDriverAction(int& action, int& option, int& value) const 251 { 252 action = idata ; 253 option = idata2; 254 value = idata3; 255 } 256 GetCompAction(int & action,int & option,int & value)257 virtual void GetCompAction(int& action, int& option, int& value) const 258 { 259 action = idata ; 260 option = idata2; 261 value = idata3; 262 } 263 264 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 265 //set some data, but do not change type of ElementData SetText(const char * textdata)266 virtual void SetText(const char* textdata) //only change value! 267 { 268 if (tdata != 0) 269 { 270 delete[] tdata; 271 tdata = 0; 272 } 273 274 size_t length = strlen(textdata); 275 tdata = new char[length + 1]; 276 strcpy(tdata, textdata); 277 } 278 279 virtual ElementDataContainer* GetEDC(); 280 virtual const ElementDataContainer* GetEDC() const; 281 282 //virtual const ElementDataContainer* GetEDC() const; 283 SetValuesInt()284 virtual void SetValuesInt() {type = type|2048;} //vector/matrix values are integer! 285 SetMatrixSize(int rows,int cols)286 virtual void SetMatrixSize(int rows, int cols) 287 { 288 if (vdatalen != 0 && vdata != 0) 289 { 290 delete[] vdata; 291 vdata = 0; 292 } 293 294 idata = rows; 295 idata2 = cols; 296 vdatalen = rows*cols; 297 298 if (vdatalen > 0) 299 vdata = new double[vdatalen]; 300 } SetMatrixVal(int row,int col,double value)301 virtual void SetMatrixVal(int row, int col, double value) //row and col are 1-based!!! 302 { 303 vdata[(row-1)*idata2 + col-1] = value; 304 } 305 306 private: 307 char* dataname; //name of data unit: name that appears in dialog window 308 int type; //type 1==int, 2==double, 4==vector, 8==text, 16==BOOL, 32==vector2D/3D, 309 ; // 64==elementtype, 128==actionDialogFunctionWCdriver, 256=actionCompFunction 310 ; // 512==checkgroup=idata2, 1024==matrix, 2048==vdata is integer, 4096==variable length vector, 311 ; // 8192==ElementDataContainer, 16384==matrix with fixed number of columns 312 int hastooltip; //data has additional tooltiptext 313 char* tooltiptext; //tooltip text to be displayed in dialogs 314 int locked; //data can not be changed 315 int groupnum; //number of group where data belongs 316 317 int idata; //integer data (for action: action_number) 318 int idata2; //integer data2 (for action: option) 319 int idata3; //integer data3 (for action: value) 320 double minval, maxval; 321 bool oneLimit; 322 // 4 cases for boundaries are possible: 323 // oneLimit = 0: 324 // minval<=maxval upper and lower boundary are active: [...] 325 // minval >maxval no boundary is active: ... 326 // onLimit = 1: 327 // minval<=maxval only upper boundary is active: ...] 328 // minval >maxval only lower boundary is active: [... 329 330 double* vdata; //double/vector3D/vector data 331 int vdatalen; //vector len 332 char* tdata; //text data 333 ElementDataContainer* edc; 334 }; 335 336 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 337 338 class ElementDataContainer 339 { 340 public: ElementDataContainer()341 ElementDataContainer():elemdata() 342 { 343 type = 1; //standard==element data 344 SetEDCWarningLevel(1); 345 //defaultint = 0; 346 //defaultdouble = 0.; 347 //defaultchar = 0; 348 } ElementDataContainer(const ElementDataContainer & ed)349 ElementDataContainer(const ElementDataContainer& ed):elemdata() 350 { 351 CopyFrom(ed); 352 }; 353 ElementDataContainer& operator=(const ElementDataContainer& ed) 354 { 355 if (this == &ed) {return *this;} 356 CopyFrom(ed); 357 return *this; 358 } 359 //To be overwritten in derived class: GetCopy()360 virtual ElementDataContainer* GetCopy() const 361 { 362 ElementDataContainer* ec = new ElementDataContainer(); 363 ec->CopyFrom(*this); 364 return ec; 365 } 366 CopyFrom(const ElementDataContainer & e)367 virtual void CopyFrom(const ElementDataContainer& e) 368 { 369 elemdata.SetLen(0); 370 for (int i=1; i <= e.elemdata.Length(); i++) 371 { 372 elemdata.Add(e.elemdata(i)->GetCopy()); 373 } 374 type = e.type; 375 flag_warning_level = e.flag_warning_level; 376 //defaultint = e.defaultint; 377 //defaultdouble = e.defaultdouble; 378 //defaultchar = e.defaultchar; 379 } 380 ~ElementDataContainer()381 virtual ~ElementDataContainer() 382 { 383 Reset(); 384 } 385 Reset()386 virtual void Reset() 387 { 388 for (int i=1; i <= elemdata.Length(); i++) 389 { 390 if (elemdata(i) != 0) delete elemdata(i); 391 elemdata(i) = 0; 392 } 393 elemdata.SetLen(0); 394 type = 1; 395 flag_warning_level = 1; 396 } 397 GetType()398 virtual int GetType() const {return type;} 399 Length()400 virtual int Length() const {return elemdata.Length();} 401 402 //find in list of edc, not hierarchically; return index of ElementData 403 virtual int Find(const char* name) const; 404 virtual void FindAll(const char* name, TArray<int>& indices) const;// find all indices in an EDC of entries with same name. 405 406 //find an element in tree, name is e.g. "root.child1.child2.leave"; the name of the found object is "leave" 407 //return pointer to ElementData 408 virtual const ElementData* TreeFind(const char* name) const; 409 virtual ElementData* TreeFind(const char* name); 410 411 //delete an element in tree, name is e.g. "root.child1.child2.leave"; the name of the deleted object is "leave" 412 virtual void TreeDelete(const char* name); 413 414 //find element, assume that it is double; if not exists use default value 415 virtual double TreeGetDouble(const char* name, double default_val = 0.) const; 416 //find element, assume that it is int; if not exists use default value 417 virtual int TreeGetInt(const char* name, int default_val = 0) const; 418 //find element, assume that it is bool; if not exists use default value (int and bool are internally the same!) 419 virtual int TreeGetBool(const char* name, int default_val = 0) const; 420 //find element, assume that it is char*; if not exists use default value 421 virtual const char* TreeGetString(const char* name, char* default_val = "") const; 422 //find element, assume that it is Vector3D; if not exists use 423 virtual int TreeGetVector3D(const char* name, double& vx, double& vy, double& vz) const; 424 //find element, assume that it is Vector2D; if not exists use 425 virtual int TreeGetVector2D(const char* name, double& vx, double& vy) const; 426 //find element, assume that it is Vector; if not exists use 427 virtual int TreeGetVector(const char* name, double** v, int& len) const; 428 //find element, assume that it is Matrix; if not exists use 429 virtual int TreeGetMatrix(const char* name, double** v, int& rows, int& cols) const; 430 //find element, assume that it is Matrix; if not exists use 431 virtual int TreeGetVector2DList(const char* name, double** v, int& n) const; 432 433 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 434 //add or replace element in EDC: double; e.g. name="tree1.leave2.data" 435 virtual void TreeSetDouble(const char* name, double val); 436 //add or replace element in EDC: int; e.g. name="tree1.leave2.data" 437 virtual void TreeSetInt(const char* name, int val); 438 //add or replace element in EDC: bool; e.g. name="tree1.leave2.data" (int and bool are internally the same!) 439 virtual void TreeSetBool(const char* name, int val); 440 //add or replace element in EDC: string; e.g. name="tree1.leave2.data" 441 virtual void TreeSetString(const char* name, const char* val); 442 443 //add or replace element in EDC: vector 444 virtual void TreeSetVectorC(const char* name, double* v, int len, const char* comment); 445 //add or replace element in EDC with COMMENT: double; e.g. name="tree1.leave2.data" 446 virtual void TreeSetDoubleC(const char* name, double val, const char* comment); 447 //add or replace element in EDC with COMMENT: double; e.g. name="tree1.leave2.data" 448 virtual void TreeSetIntC(const char* name, int val, const char* comment); 449 //add or replace element in EDC with COMMENT: double; e.g. name="tree1.leave2.data" 450 virtual void TreeSetBoolC(const char* name, int val, const char* comment); 451 //add or replace element in EDC with COMMENT: double; e.g. name="tree1.leave2.data" 452 virtual void TreeSetStringC(const char* name, const char* val, const char* comment); 453 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 454 455 //split hierarchical name into tree and elementname; e.g. name="tree1.leave2.data"; tree may also be empty ("") 456 virtual void SplitIntoTreeAndElementName(const char* name, mystr& tree, mystr& elementname); 457 458 //add an element to list of edc, not hierarchically! 459 virtual int Add(const ElementData& ed); 460 461 //replace edc-data (i.e., replace common, add new, and keep old edc-data) 462 void TreeReplaceEDCDataWith(const ElementDataContainer* edc_new, int warn_if_items_dont_exist=0, mystr warn_str=""); 463 464 private: 465 //full pathname (for warnings) 466 mystr local_warn_tree; 467 468 //called by public method TreeReplaceEDCDataWith(ElementDataContainer* edc_new, int warn_if_items_dont_exist) 469 void TreeReplaceEDCDataWithRecursive(const ElementDataContainer* edc_new, int warn_if_items_dont_exist); 470 471 public: 472 //set the value of private member local_warn_tree; SetLocalWarnTree(mystr tree_str)473 void SetLocalWarnTree(mystr tree_str) {local_warn_tree = tree_str;} 474 475 //add an element into the tree of edc; the tree is given e.g. as "root.child1" 476 //virtual void TreeAdd(mystr tree, const ElementData& ed); 477 // virtual void TreeAdd(mystr tree, const ElementData& ed); 478 virtual void TreeAdd(const char* tree, const ElementData& ed); 479 480 //set an element in the tree of edc; if the tree does not exist, build the tree and insert data; if the data exists: replace the data 481 void TreeSet(const char* tree, const ElementData& ed, int warn_if_items_dont_exist=0,int copy_ToolTipText=1); 482 Get(int i)483 virtual const ElementData& Get(int i) const {return *(elemdata(i));} //get element number i Get(int i)484 virtual ElementData& Get(int i) {return *(elemdata(i));}//get element number i GetPtr(int i)485 virtual ElementData* GetPtr(int i) {return elemdata(i);}//get element* number i GetPtr(int i)486 virtual const ElementData* GetPtr(int i) const {return elemdata(i);}//get element* number i 487 Last()488 virtual const ElementData& Last() const {return *(elemdata(Length()));} //get last element Last()489 virtual ElementData& Last() {return *(elemdata(Length()));}//get last element 490 Delete(int i)491 virtual void Delete(int i) 492 { 493 delete elemdata(i); 494 for (int j=i; j < elemdata.Length(); j++) 495 { 496 elemdata(j) = elemdata(j+1); 497 } 498 elemdata.SetLen(elemdata.Length()-1); 499 } 500 EDCWarningLevel()501 int EDCWarningLevel() const 502 { 503 if (flag_warning_level > 0) 504 { 505 flag_warning_level--; 506 return 1; // popup 507 } 508 else if (flag_warning_level == 0) 509 { 510 return 0; // text output 511 } 512 else //if (flag_warning_level < 0) 513 { 514 return -1; // no warning 515 } 516 } GetEDCWarningLevel()517 int GetEDCWarningLevel() { return flag_warning_level; } SetEDCWarningLevel(int flag)518 void SetEDCWarningLevel(int flag) { flag_warning_level = flag; } 519 520 //void PrintEDCRecursive(mystr filename); //$ DR 2012-06-27 521 void PrintEDCRecursive(ofstream &outstr); //$ DR 2012-06-27 522 523 private: 524 TArray<ElementData*> elemdata; 525 int type; //1==element data, 2==node data, 4==MBS data, 8==element initvector, 16==element actual DOF state 526 // 32==GeomObject, 64==force 527 528 mutable int flag_warning_level; // can be changed via EDCWarningLevel() - !const! 529 //int defaultint; //only default return value, don't use!!!!! 530 //double defaultdouble; //only default return value, don't use!!!!! 531 //char* defaultchar; //only default return value, don't use!!!!! 532 533 }; 534 535 536 537 538 539 540 541 #endif 542 //ELEMENTDATA__H 543 544