PartSTDRuleItem.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #pragma once
  2. #include "stdafx.h"
  3. #include "PartSTDRuleItem.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. std::map<std::string, OTSDATA::CElementPtr>& PartSTDRuleItem::GetMapElements()
  11. {
  12. if (m_mapEleItems.size() == 0)
  13. {
  14. for (auto ele : m_KeyelementList)
  15. {
  16. m_mapEleItems[ele->GetName().GetBuffer()] = ele;
  17. }
  18. }
  19. return m_mapEleItems;
  20. }
  21. void PartSTDRuleItem::Serialize(bool isStoring, tinyxml2::XMLDocument* classDoc, tinyxml2::XMLElement* rootNode)
  22. {
  23. // name
  24. xmls::xString xstrName;
  25. // color
  26. xmls::xString xsColor;//COLORREF, C# can't access
  27. xmls::xInt xnSTDId;
  28. xmls::xString xKeyElementListStr;
  29. xmls::xString xSubElementListStr;
  30. xmls::xString xUsingConstants;
  31. xmls::xString xImgPropertyListStr;
  32. xmls::xString xOtherPropertyListStr;
  33. xmls::xString xExpstr;
  34. //xmls::Collection< CElementRange> xElementRanges;
  35. xmls::xString xHardness;
  36. xmls::xString xDensity;
  37. xmls::xString xElectrical_conductivity;
  38. xmls::Slo slo;
  39. slo.Register("StrName", &xstrName);
  40. slo.Register("Color", &xsColor);
  41. slo.Register("STDId", &xnSTDId);
  42. slo.Register("KeyElementList", &xKeyElementListStr);
  43. slo.Register("SubElementList", &xSubElementListStr);
  44. slo.Register("UsingConstants", &xUsingConstants);
  45. slo.Register("UsingImgPropertyList", &xImgPropertyListStr);
  46. slo.Register("UsingOtherPropertyList", &xOtherPropertyListStr);
  47. slo.Register("Expression", &xExpstr);
  48. slo.Register("Hardness", &xHardness);
  49. slo.Register("Density", &xDensity);
  50. slo.Register("Electrical_conductivity", &xElectrical_conductivity);
  51. if (isStoring)
  52. {
  53. xstrName = GetName();
  54. xsColor = GetColor();
  55. xHardness = m_Hardness;
  56. xDensity = m_Density;
  57. xElectrical_conductivity = m_Electrical_conductivity;
  58. xnSTDId = GetID();
  59. CString s = "";
  60. for (auto poElement : m_KeyelementList)
  61. {
  62. s += poElement->GetName() + ",";
  63. }
  64. s = s.TrimRight(",");
  65. xKeyElementListStr = s;
  66. s = "";
  67. for (auto poElement : m_SubelementList)
  68. {
  69. s += poElement->GetName() + ",";
  70. }
  71. s = s.TrimRight(",");
  72. xSubElementListStr = s;
  73. for (auto pName : m_ImgPropertyList)
  74. {
  75. s += pName.c_str();
  76. s += ",";
  77. }
  78. s = s.TrimRight(",");
  79. xImgPropertyListStr = s;
  80. for (auto pName : m_OtherpropertyList)
  81. {
  82. s += pName.c_str();
  83. s += ",";
  84. }
  85. s = s.TrimRight(",");
  86. xOtherPropertyListStr = s;
  87. slo.Serialize(true, classDoc, rootNode);
  88. }
  89. else
  90. {
  91. slo.Serialize(false, classDoc, rootNode);
  92. SetName(xstrName.value().c_str());
  93. SetColor(xsColor.value().c_str());
  94. SetExpressionStr(xExpstr.value());
  95. m_Hardness = xHardness.value();
  96. m_Density = xDensity.value();
  97. m_Electrical_conductivity = xElectrical_conductivity.value();
  98. SetID(xnSTDId.value());
  99. std::vector<string> eles;
  100. std::string elements = xKeyElementListStr.c_str();
  101. xmls::SplitString(elements, eles, ",");
  102. for (int i = 0; i < eles.size(); ++i)
  103. {
  104. CString ss = eles[i].c_str();
  105. m_KeyelementList.push_back(CElementPtr(new CElement(ss)));
  106. }
  107. elements = xSubElementListStr.c_str();
  108. eles.clear();
  109. xmls::SplitString(elements, eles, ",");
  110. for (int i = 0; i < eles.size(); ++i)
  111. {
  112. CString ss = eles[i].c_str();
  113. m_SubelementList.push_back(CElementPtr(new CElement(ss)));
  114. }
  115. std::vector<string> pNames;
  116. std::string propertynames = xImgPropertyListStr.c_str();
  117. xmls::SplitString(propertynames, pNames, ",");
  118. for (int i = 0; i < pNames.size(); ++i)
  119. {
  120. std::string ss = pNames[i];
  121. m_ImgPropertyList.push_back(ss);
  122. }
  123. std::vector<string> pOthers;
  124. std::string otherPropertynames = xOtherPropertyListStr.c_str();
  125. xmls::SplitString(otherPropertynames, pOthers, ",");
  126. for (int i = 0; i < pOthers.size(); ++i)
  127. {
  128. std::string ss = pOthers[i];
  129. m_OtherpropertyList.push_back(ss);
  130. }
  131. for (auto ele : m_KeyelementList)
  132. {
  133. m_mapEleItems[ele->GetName().GetBuffer()] = ele;
  134. }
  135. xmls::SplitString(xUsingConstants.value(), m_usingConstants, ",");
  136. }
  137. }
  138. CElementsList PartSTDRuleItem::GetAllSortedEleList()
  139. {
  140. std::multimap<int, CElementPtr> mapEles;// sorted all the using elements by the name's length,so that we can always handle the longer name element first.
  141. //because if we handle short name element first ,we may treat "Cu" as "C" or other have the same character in name element.
  142. for (auto ele : m_KeyelementList)
  143. {
  144. mapEles.insert(std::pair<int, CElementPtr>(ele->GetName().GetLength(), ele));
  145. }
  146. for (auto ele : m_SubelementList)
  147. {
  148. mapEles.insert(std::pair<int, CElementPtr>(ele->GetName().GetLength(), ele));
  149. }
  150. CElementsList eleList;
  151. for (auto itr = mapEles.rbegin(); itr != mapEles.rend(); itr++)
  152. {
  153. eleList.push_back(itr->second);
  154. }
  155. return eleList;
  156. }
  157. void PartSTDRuleItem::AddXraySpectrum(CPosXrayPtr xray)
  158. {
  159. if (m_spectrums.size() < 50)//only memory 50 spectrum for one item.
  160. {
  161. m_spectrums.push_back(xray);
  162. }
  163. }
  164. double PartSTDRuleItem::CalculateSimilarity(CPosXrayPtr xray)
  165. {
  166. double maxSimilarity=0;
  167. for (auto mySpectrum : m_spectrums)
  168. {
  169. double sim=GetCosValue(mySpectrum, xray, GENERALXRAYCHANNELS);
  170. if (sim > maxSimilarity)
  171. {
  172. maxSimilarity = sim;
  173. }
  174. }
  175. return maxSimilarity;
  176. }
  177. double PartSTDRuleItem::GetCosValue(CPosXrayPtr posXray, CPosXrayPtr posXray1, int iDataLen1)
  178. {
  179. if (posXray->GetChannelsNum() != iDataLen1)
  180. {
  181. return 0;
  182. }
  183. DWORD* pXrayData = posXray->GetXrayData();
  184. DWORD* pXrayData1 = posXray1->GetXrayData();
  185. // ¹«Ê½: (x1y1+x2y2+x3y3+...x2000y2000) / (sqrt(x1^2 + x2^2 + ...x2000^2) * sqrt(y1^2 + y2^2 + ...y2000^2))
  186. double dotProduct = 0;
  187. double d1 = 0;
  188. double d2 = 0;
  189. for (int i = 0; i < iDataLen1; i++)
  190. {
  191. double r1 = pXrayData[i];
  192. double r2 = pXrayData1[i];
  193. r1 *= r2;
  194. dotProduct = dotProduct + r1;
  195. }
  196. d1 = posXray->GetXrayDataVectorNorm();
  197. d2 = posXray1->GetXrayDataVectorNorm();
  198. return (0 == d1 || 0 == d2) ? 0 : dotProduct / (d1 * d2);
  199. }