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