ParticleSTD.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. #pragma once
  2. #include "stdafx.h"
  3. #include "ParticleSTD.h"
  4. #include "XMLSerialization.h"
  5. #include "OTSFileSys.h"
  6. #include "Element.h"
  7. using namespace OTSTools;
  8. using namespace OTSDATA;
  9. using namespace xmls;
  10. const CString strPathName = ".\\Config\\SysData\\OTSParticleSTD.xml" ;
  11. std::vector<PartSTDItemPtr> ParticleSTD::GetSTDItems()
  12. {
  13. return m_stdItems;
  14. }
  15. ZeroElementRuleList ParticleSTD::GetZeroRules()
  16. {
  17. return m_zeroRules;
  18. }
  19. MaxEDSRuleList ParticleSTD::GetMaxEDSRules()
  20. {
  21. return m_MaxRules;
  22. }
  23. bool ParticleSTD::LoadItemsFromFile()
  24. {
  25. tinyxml2::XMLDocument doc;
  26. if (COTSFileSys::Exists(strPathName))
  27. {
  28. doc.LoadFile(strPathName);//ÔØÈëxmlÎļþ
  29. }
  30. tinyxml2::XMLElement *rootNode;
  31. rootNode = doc.FirstChildElement(RootClassName);
  32. Serialize(false, &doc, rootNode);
  33. for (auto itm : m_stdItems)
  34. {
  35. std::string exp = itm->GetExpressionStr();
  36. for (auto s : itm->GetUsingConstants())
  37. {
  38. xmls::ReplaceAll(exp, s, std::to_string(m_mapConstants[s]));
  39. }
  40. itm->SetExpressionStr(exp);
  41. }
  42. return true;
  43. }
  44. void ParticleSTD::PartSTDItemListClear()
  45. {
  46. m_stdItems.clear();
  47. }
  48. void ParticleSTD::ZeroElementRuleListClear()
  49. {
  50. m_zeroRules.clear();
  51. }
  52. void ParticleSTD::MaxEDSRuleListClear()
  53. {
  54. m_MaxRules.clear();
  55. }
  56. void ParticleSTD::ConstantsMapClear()
  57. {
  58. m_mapConstants.clear();
  59. }
  60. void ParticleSTD::setSTDList(PartSTDItemList listSTDItem)
  61. {
  62. m_stdItems.insert(m_stdItems.end(), listSTDItem.begin(), listSTDItem.end());
  63. }
  64. void ParticleSTD::setZeroElementRuleList(ZeroElementRuleList listZeroElementRuleItem)
  65. {
  66. m_zeroRules.insert(m_zeroRules.end(), listZeroElementRuleItem.begin(), listZeroElementRuleItem.end());
  67. }
  68. void ParticleSTD::setMaxEDSRuleList(MaxEDSRuleList listMaxEDSRuleItem)
  69. {
  70. m_MaxRules.insert(m_MaxRules.end(), listMaxEDSRuleItem.begin(), listMaxEDSRuleItem.end());
  71. }
  72. void ParticleSTD::setConstantsMap(map<std::string, double> listConstantsItem)
  73. {
  74. map<string, double>::iterator it;
  75. for (it = listConstantsItem.begin(); it != listConstantsItem.end(); it++)
  76. {
  77. m_mapConstants[it->first]=it->second;
  78. }
  79. }
  80. std::map<std::string,double>& ParticleSTD::GetMapConstants()
  81. {
  82. return m_mapConstants;
  83. }
  84. void ParticleSTD::Serialize(bool isStoring, tinyxml2::XMLDocument *classDoc, tinyxml2::XMLElement *rootNode)
  85. {
  86. xmls::Slo slo;
  87. xmls::Collection<PartSTDItem> xstds;
  88. xmls::Collection<MaxEDSRule> xMaxEDSRules;
  89. xmls::Collection<ZeroElementRule> xZeroRules;
  90. xmls::Slo xConstants;
  91. xmls::xString xConstantsStr;
  92. xConstants.Register("value", &xConstantsStr);
  93. slo.Register("Constants", &xConstants);
  94. slo.Register("MaxEDSRules", &xMaxEDSRules);
  95. slo.Register("ZeroElementRules", &xZeroRules);
  96. slo.Register("STDList", &xstds);
  97. if (isStoring)
  98. {
  99. slo.Serialize(true, classDoc, rootNode);
  100. }
  101. else
  102. {
  103. slo.Serialize(false, classDoc, rootNode);
  104. }
  105. m_stdItems.clear();
  106. for (unsigned int i = 0; i < xstds.size(); i++)
  107. {
  108. m_stdItems.push_back(PartSTDItemPtr(xstds.getItem(i)));
  109. }
  110. for (unsigned int i = 0; i < xMaxEDSRules.size(); i++)
  111. {
  112. m_MaxRules.push_back(MaxEDSRulePtr(xMaxEDSRules.getItem(i)));
  113. }
  114. for (unsigned int i = 0; i < xZeroRules.size(); i++)
  115. {
  116. m_zeroRules.push_back(ZeroElementRulePtr(xZeroRules.getItem(i)));
  117. }
  118. std::string constantsstr = xConstantsStr.value();
  119. std::vector<std::string> strs;
  120. xmls::SplitString(constantsstr, strs, ",");
  121. for (std::string s : strs)
  122. {
  123. std::vector<std::string> oneExp;
  124. xmls::SplitString(s, oneExp, "=");
  125. m_mapConstants[oneExp[0]] =std::atof( oneExp[1].c_str());
  126. }
  127. }
  128. PartSTDItemPtr ParticleSTD::GetSTDItemById(int id)
  129. {
  130. for (auto itm : m_stdItems)
  131. {
  132. if (itm->GetID() == id)
  133. {
  134. return itm;
  135. }
  136. }
  137. return nullptr;
  138. }
  139. std::map<std::string, OTSDATA::CElementPtr>& PartSTDItem::GetMapElements()
  140. {
  141. if (m_mapEleItems.size() == 0)
  142. {
  143. for (auto ele : m_KeyelementList)
  144. {
  145. m_mapEleItems[ele->GetName().GetBuffer()] = ele;
  146. }
  147. }
  148. return m_mapEleItems;
  149. }
  150. void PartSTDItem::Serialize(bool isStoring, tinyxml2::XMLDocument *classDoc, tinyxml2::XMLElement *rootNode)
  151. {
  152. // name
  153. xmls::xString xstrName;
  154. // color
  155. xmls::xString xsColor;//COLORREF, C# can't access
  156. xmls::xInt xnSTDId;
  157. xmls::xString xKeyElementListStr;
  158. xmls::xString xSubElementListStr;
  159. xmls::xString xUsingConstants;
  160. xmls::xString xImgPropertyListStr;
  161. xmls::xString xOtherPropertyListStr;
  162. xmls::xString xExpstr;
  163. //xmls::Collection< CElementRange> xElementRanges;
  164. xmls::xString xHardness;
  165. xmls::xString xDensity;
  166. xmls::xString xElectrical_conductivity;
  167. xmls::Slo slo;
  168. slo.Register("StrName", &xstrName);
  169. slo.Register("Color", &xsColor);
  170. slo.Register("STDId", &xnSTDId);
  171. slo.Register("KeyElementList", &xKeyElementListStr);
  172. slo.Register("SubElementList", &xSubElementListStr);
  173. slo.Register("UsingConstants", &xUsingConstants);
  174. slo.Register("UsingImgPropertyList", &xImgPropertyListStr);
  175. slo.Register("UsingOtherPropertyList", &xOtherPropertyListStr);
  176. slo.Register("Expression", &xExpstr);
  177. slo.Register("Hardness", &xHardness);
  178. slo.Register("Density", &xDensity);
  179. slo.Register("Electrical_conductivity", &xElectrical_conductivity);
  180. if (isStoring)
  181. {
  182. xstrName = GetName();
  183. xsColor = GetColor();
  184. xHardness = m_Hardness;
  185. xDensity = m_Density;
  186. xElectrical_conductivity = m_Electrical_conductivity;
  187. xnSTDId = GetID();
  188. CString s = "";
  189. for (auto poElement : m_KeyelementList)
  190. {
  191. s += poElement->GetName()+",";
  192. }
  193. s = s.TrimRight(",");
  194. xKeyElementListStr = s;
  195. s = "";
  196. for (auto poElement : m_SubelementList)
  197. {
  198. s += poElement->GetName() + ",";
  199. }
  200. s = s.TrimRight(",");
  201. xSubElementListStr = s;
  202. for (auto pName : m_ImgPropertyList)
  203. {
  204. s += pName.c_str() ;
  205. s += ",";
  206. }
  207. s = s.TrimRight(",");
  208. xImgPropertyListStr = s;
  209. for (auto pName : m_OtherpropertyList)
  210. {
  211. s += pName.c_str();
  212. s += ",";
  213. }
  214. s = s.TrimRight(",");
  215. xOtherPropertyListStr = s;
  216. slo.Serialize(true, classDoc, rootNode);
  217. }
  218. else
  219. {
  220. slo.Serialize(false, classDoc, rootNode);
  221. SetName(xstrName.value().c_str());
  222. SetColor(xsColor.value().c_str());
  223. SetExpressionStr(xExpstr.value());
  224. m_Hardness=xHardness.value() ;
  225. m_Density= xDensity.value();
  226. m_Electrical_conductivity=xElectrical_conductivity.value();
  227. SetID(xnSTDId.value());
  228. std::vector<string> eles;
  229. std::string elements = xKeyElementListStr.c_str();
  230. xmls::SplitString(elements, eles, ",");
  231. for (int i = 0; i < eles.size(); ++i)
  232. {
  233. CString ss = eles[i].c_str();
  234. m_KeyelementList.push_back(CElementPtr(new CElement(ss)));
  235. }
  236. elements = xSubElementListStr.c_str();
  237. eles.clear();
  238. xmls::SplitString(elements, eles, ",");
  239. for (int i = 0; i < eles.size(); ++i)
  240. {
  241. CString ss = eles[i].c_str();
  242. m_SubelementList.push_back(CElementPtr(new CElement(ss)));
  243. }
  244. std::vector<string> pNames;
  245. std::string propertynames = xImgPropertyListStr.c_str();
  246. xmls::SplitString(propertynames, pNames, ",");
  247. for (int i = 0; i < pNames.size(); ++i)
  248. {
  249. std::string ss = pNames[i];
  250. m_ImgPropertyList.push_back(ss);
  251. }
  252. std::vector<string> pOthers;
  253. std::string otherPropertynames = xOtherPropertyListStr.c_str();
  254. xmls::SplitString(otherPropertynames, pOthers, ",");
  255. for (int i = 0; i < pOthers.size(); ++i)
  256. {
  257. std::string ss = pOthers[i];
  258. m_OtherpropertyList.push_back(ss);
  259. }
  260. for (auto ele : m_KeyelementList)
  261. {
  262. m_mapEleItems[ele->GetName().GetBuffer()] = ele;
  263. }
  264. xmls::SplitString(xUsingConstants.value(), m_usingConstants ,",");
  265. }
  266. }
  267. void ZeroElementRule::Serialize(bool isStoring, tinyxml2::XMLDocument *classDoc, tinyxml2::XMLElement *rootNode)
  268. {
  269. xmls::xString xUsingElementListStr;
  270. xmls::xString xUsingConstants;
  271. xmls::xString xImgPropertyListStr;
  272. xmls::xString xOtherPropertyListStr;
  273. xmls::xString xExpstr;
  274. xmls::xString xZeroEleName;
  275. xmls::Slo slo;
  276. slo.Register("ZeroElement", &xZeroEleName);
  277. slo.Register("UsingElementList", &xUsingElementListStr);
  278. slo.Register("UsingConstants", &xUsingConstants);
  279. slo.Register("UsingImgPropertyList", &xImgPropertyListStr);
  280. slo.Register("UsingOtherPropertyList", &xOtherPropertyListStr);
  281. slo.Register("Expression", &xExpstr);
  282. if (isStoring)
  283. {
  284. xZeroEleName= m_ZeroElementName;
  285. CString s = "";
  286. for (auto poElement : m_UsingelementList)
  287. {
  288. s += poElement->GetName() + ",";
  289. }
  290. s = s.TrimRight(",");
  291. xUsingElementListStr = s;
  292. s = "";
  293. for (auto pName : m_ImgPropertyList)
  294. {
  295. s += pName.c_str();
  296. s += ",";
  297. }
  298. s = s.TrimRight(",");
  299. xImgPropertyListStr = s;
  300. s = "";
  301. for (auto pName : m_OtherpropertyList)
  302. {
  303. s += pName.c_str();
  304. s += ",";
  305. }
  306. s = s.TrimRight(",");
  307. xOtherPropertyListStr = s;
  308. slo.Serialize(true, classDoc, rootNode);
  309. }
  310. else
  311. {
  312. slo.Serialize(false, classDoc, rootNode);
  313. SetExpressionStr(xExpstr.value());
  314. m_ZeroElementName = xZeroEleName.value();
  315. std::vector<string> eles;
  316. std::string elements = xUsingElementListStr.c_str();
  317. xmls::SplitString(elements, eles, ",");
  318. for (int i = 0; i < eles.size(); ++i)
  319. {
  320. CString ss = eles[i].c_str();
  321. m_UsingelementList.push_back(CElementPtr(new CElement(ss)));
  322. }
  323. std::string propertynames = xImgPropertyListStr.c_str();
  324. xmls::SplitString(propertynames, m_ImgPropertyList, ",");
  325. std::string otherPropertynames = xOtherPropertyListStr.c_str();
  326. xmls::SplitString(otherPropertynames, m_OtherpropertyList, ",");
  327. xmls::SplitString(xUsingConstants.value(), m_usingConstants, ",");
  328. }
  329. }
  330. void MaxEDSRule::Serialize(bool isStoring, tinyxml2::XMLDocument *classDoc, tinyxml2::XMLElement *rootNode)
  331. {
  332. xmls::xString xElementListStr;
  333. xmls::xString xUsingConstants;
  334. xmls::xString xImgPropertyListStr;
  335. xmls::xString xOtherPropertyListStr;
  336. xmls::xString xExpstr;
  337. xmls::xDouble xEdsTime;
  338. xmls::Slo slo;
  339. slo.Register("EDSTime", &xEdsTime);
  340. slo.Register("UsingElementList", &xElementListStr);
  341. slo.Register("UsingConstants", &xUsingConstants);
  342. slo.Register("UsingImgPropertyList", &xImgPropertyListStr);
  343. slo.Register("UsingOtherPropertyList", &xOtherPropertyListStr);
  344. slo.Register("Expression", &xExpstr);
  345. if (isStoring)
  346. {
  347. xEdsTime = m_MaxEDSTime;
  348. CString s = "";
  349. for (auto poElement : m_elementList)
  350. {
  351. s += poElement->GetName() + ",";
  352. }
  353. s = s.TrimRight(",");
  354. xElementListStr = s;
  355. for (auto pName : m_ImgPropertyList)
  356. {
  357. s += pName.c_str();
  358. s += ",";
  359. }
  360. s = s.TrimRight(",");
  361. xImgPropertyListStr = s;
  362. for (auto pName : m_OtherpropertyList)
  363. {
  364. s += pName.c_str();
  365. s += ",";
  366. }
  367. s = s.TrimRight(",");
  368. xOtherPropertyListStr = s;
  369. slo.Serialize(true, classDoc, rootNode);
  370. }
  371. else
  372. {
  373. slo.Serialize(false, classDoc, rootNode);
  374. m_expressionStr = xExpstr.value();
  375. m_MaxEDSTime = xEdsTime.value();
  376. std::vector<string> eles;
  377. std::string elements = xElementListStr.c_str();
  378. xmls::SplitString(elements, eles, ",");
  379. for (int i = 0; i < eles.size(); ++i)
  380. {
  381. CString ss = eles[i].c_str();
  382. m_elementList.push_back(CElementPtr(new CElement(ss)));
  383. }
  384. std::string propertynames = xImgPropertyListStr.value();
  385. xmls::SplitString(propertynames, m_ImgPropertyList, ",");
  386. std::string otherPropertynames = xOtherPropertyListStr.value();
  387. xmls::SplitString(otherPropertynames, m_OtherpropertyList, ",");
  388. xmls::SplitString(xUsingConstants.value(), m_usingConstants, ",");
  389. }
  390. }