123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- #pragma once
- #include "stdafx.h"
- #include "PartSTDRuleItem.h"
- #include "XMLSerialization.h"
- #include "OTSFileSys.h"
- #include "Element.h"
- using namespace OTSTools;
- using namespace OTSDATA;
- using namespace xmls;
- std::map<std::string, OTSDATA::CElementPtr>& PartSTDRuleItem::GetMapElements()
- {
- if (m_mapEleItems.size() == 0)
- {
- for (auto ele : m_KeyelementList)
- {
- m_mapEleItems[ele->GetName().GetBuffer()] = ele;
- }
- }
- return m_mapEleItems;
- }
- void PartSTDRuleItem::Serialize(bool isStoring, tinyxml2::XMLDocument* classDoc, tinyxml2::XMLElement* rootNode)
- {
- // name
- xmls::xString xstrName;
- // color
- xmls::xString xsColor;//COLORREF, C# can't access
- xmls::xInt xnSTDId;
- xmls::xString xKeyElementListStr;
- xmls::xString xSubElementListStr;
- xmls::xString xUsingConstants;
- xmls::xString xImgPropertyListStr;
- xmls::xString xOtherPropertyListStr;
- xmls::xString xExpstr;
- //xmls::Collection< CElementRange> xElementRanges;
- xmls::xString xHardness;
- xmls::xString xDensity;
- xmls::xString xElectrical_conductivity;
- xmls::Slo slo;
- slo.Register("StrName", &xstrName);
- slo.Register("Color", &xsColor);
- slo.Register("STDId", &xnSTDId);
- slo.Register("KeyElementList", &xKeyElementListStr);
- slo.Register("SubElementList", &xSubElementListStr);
- slo.Register("UsingConstants", &xUsingConstants);
- slo.Register("UsingImgPropertyList", &xImgPropertyListStr);
- slo.Register("UsingOtherPropertyList", &xOtherPropertyListStr);
- slo.Register("Expression", &xExpstr);
- slo.Register("Hardness", &xHardness);
- slo.Register("Density", &xDensity);
- slo.Register("Electrical_conductivity", &xElectrical_conductivity);
- if (isStoring)
- {
- xstrName = GetName();
- xsColor = GetColor();
- xHardness = m_Hardness;
- xDensity = m_Density;
- xElectrical_conductivity = m_Electrical_conductivity;
- xnSTDId = GetID();
- CString s = "";
- for (auto poElement : m_KeyelementList)
- {
- s += poElement->GetName() + ",";
- }
- s = s.TrimRight(",");
- xKeyElementListStr = s;
- s = "";
- for (auto poElement : m_SubelementList)
- {
- s += poElement->GetName() + ",";
- }
- s = s.TrimRight(",");
- xSubElementListStr = s;
- for (auto pName : m_ImgPropertyList)
- {
- s += pName.c_str();
- s += ",";
- }
- s = s.TrimRight(",");
- xImgPropertyListStr = s;
- for (auto pName : m_OtherpropertyList)
- {
- s += pName.c_str();
- s += ",";
- }
- s = s.TrimRight(",");
- xOtherPropertyListStr = s;
- slo.Serialize(true, classDoc, rootNode);
- }
- else
- {
- slo.Serialize(false, classDoc, rootNode);
- SetName(xstrName.value().c_str());
- SetColor(xsColor.value().c_str());
- SetExpressionStr(xExpstr.value());
- m_Hardness = xHardness.value();
- m_Density = xDensity.value();
- m_Electrical_conductivity = xElectrical_conductivity.value();
- SetID(xnSTDId.value());
- std::vector<string> eles;
- std::string elements = xKeyElementListStr.c_str();
- xmls::SplitString(elements, eles, ",");
- for (int i = 0; i < eles.size(); ++i)
- {
- CString ss = eles[i].c_str();
- m_KeyelementList.push_back(CElementPtr(new CElement(ss)));
- }
- elements = xSubElementListStr.c_str();
- eles.clear();
- xmls::SplitString(elements, eles, ",");
- for (int i = 0; i < eles.size(); ++i)
- {
- CString ss = eles[i].c_str();
- m_SubelementList.push_back(CElementPtr(new CElement(ss)));
- }
- std::vector<string> pNames;
- std::string propertynames = xImgPropertyListStr.c_str();
- xmls::SplitString(propertynames, pNames, ",");
- for (int i = 0; i < pNames.size(); ++i)
- {
- std::string ss = pNames[i];
- m_ImgPropertyList.push_back(ss);
- }
- std::vector<string> pOthers;
- std::string otherPropertynames = xOtherPropertyListStr.c_str();
- xmls::SplitString(otherPropertynames, pOthers, ",");
- for (int i = 0; i < pOthers.size(); ++i)
- {
- std::string ss = pOthers[i];
- m_OtherpropertyList.push_back(ss);
- }
- for (auto ele : m_KeyelementList)
- {
- m_mapEleItems[ele->GetName().GetBuffer()] = ele;
- }
- xmls::SplitString(xUsingConstants.value(), m_usingConstants, ",");
- }
- }
- CElementsList PartSTDRuleItem::GetAllSortedEleList()
- {
- 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.
- //because if we handle short name element first ,we may treat "Cu" as "C" or other have the same character in name element.
- for (auto ele : m_KeyelementList)
- {
- mapEles.insert(std::pair<int, CElementPtr>(ele->GetName().GetLength(), ele));
- }
- for (auto ele : m_SubelementList)
- {
- mapEles.insert(std::pair<int, CElementPtr>(ele->GetName().GetLength(), ele));
- }
- CElementsList eleList;
- for (auto itr = mapEles.rbegin(); itr != mapEles.rend(); itr++)
- {
- eleList.push_back(itr->second);
- }
- return eleList;
- }
- void PartSTDRuleItem::AddXraySpectrum(CPosXrayPtr xray)
- {
- if (m_spectrums.size() < 50)//only memory 50 spectrum for one item.
- {
- m_spectrums.push_back(xray);
- }
-
- }
- double PartSTDRuleItem::CalculateSimilarity(CPosXrayPtr xray)
- {
- double maxSimilarity=0;
- for (auto mySpectrum : m_spectrums)
- {
- double sim=GetCosValue(mySpectrum, xray, GENERALXRAYCHANNELS);
- if (sim > maxSimilarity)
- {
- maxSimilarity = sim;
- }
- }
- return maxSimilarity;
- }
- double PartSTDRuleItem::GetCosValue(CPosXrayPtr posXray, CPosXrayPtr posXray1, int iDataLen1)
- {
- if (posXray->GetChannelsNum() != iDataLen1)
- {
- return 0;
- }
- DWORD* pXrayData = posXray->GetXrayData();
- DWORD* pXrayData1 = posXray1->GetXrayData();
- // ¹«Ê½: (x1y1+x2y2+x3y3+...x2000y2000) / (sqrt(x1^2 + x2^2 + ...x2000^2) * sqrt(y1^2 + y2^2 + ...y2000^2))
- double dotProduct = 0;
- double d1 = 0;
- double d2 = 0;
- for (int i = 0; i < iDataLen1; i++)
- {
- double r1 = pXrayData[i];
- double r2 = pXrayData1[i];
- r1 *= r2;
- dotProduct = dotProduct + r1;
- }
- d1 = posXray->GetXrayDataVectorNorm();
- d2 = posXray1->GetXrayDataVectorNorm();
- return (0 == d1 || 0 == d2) ? 0 : dotProduct / (d1 * d2);
- }
|