OTSClassifyEng.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #pragma once
  2. #include "InclutionSTDData.h"
  3. #include "OTSParticle.h"
  4. using namespace OTSDATA;
  5. namespace OTSClassifyEngine
  6. {
  7. // min sum
  8. const double MIN_ELEMENT_SUM = 0.02;
  9. const long INC_DEFAULTSIZE = 100;
  10. const long INC_ELEMENTSIZE_MIN = 0;
  11. const CString STR_CONNECT = _T("-");
  12. const CString STR_FE = _T("Fe");
  13. const CString STR_C = _T("C");
  14. const CString STR_SI = _T("Si");
  15. const CString STR_O = _T("O");
  16. const CString STR_SUL = _T("S");
  17. const CString STR_N = _T("N");
  18. const CString STR_CR = _T("Cr");
  19. const double SIC_MOLAR_CUTOFF = 85.0;
  20. const double FEO_MOLAR_CUTOFF = 85.0;
  21. // key element
  22. const long INC_KEY_ELEMENT_MAX = 4;
  23. const double INC_KEY_ELEMENT_CUT_OFF = 0.02; // weight%
  24. const double INC_KEY_ELEMENT_TOTAL_100 = 5.0; // total molar value
  25. const CString INC_KEY_ELEMENT_NAMES[INC_KEY_ELEMENT_MAX] =
  26. {
  27. _T("S"),_T("N"),_T("O"),_T("C")
  28. };
  29. // sub element
  30. const long INC_SUB_ELEMENT_MAX = 12;
  31. const double INC_SUB_ELEMENT_CUT_OFF = 0.02; // weight%
  32. const double INC_SUB_ELEMENT_TOTAL_100 = 5.0; // molar value
  33. const CString INC_SUB_ELEMENT_NAMES[INC_SUB_ELEMENT_MAX] =
  34. {
  35. _T("Mg"),_T("Al"),_T("Si"),_T("Ca"),_T("Ti"),_T("V"),_T("Mn"),_T("Zr"),_T("Nb"),_T("Mo"),_T("Ce"),_T("La")
  36. };
  37. // element 100 % molar value mapping cut off
  38. const double ELEMENT_MAPPING_100MOLAR = 2.0;
  39. // sulfur classification
  40. const double MIN_SUL_MOLAR = ELEMENT_MAPPING_100MOLAR;
  41. const double MIN_SUL_SUB_MOLAR = ELEMENT_MAPPING_100MOLAR;
  42. const long INC_SUL_SUB_ELEMENT_MAX = 5;
  43. const CString INC_SUL_SUB_ELEMENT_NAMES[INC_SUL_SUB_ELEMENT_MAX] =
  44. {
  45. _T("Mn"),_T("Ca"),_T("Mg"),_T("Ce"),_T("La")
  46. };
  47. const CString INC_SULFILSES_NAMES[INC_SUL_SUB_ELEMENT_MAX] =
  48. {
  49. _T("MnS"),_T("CaS"),_T("MgS"),_T("Ce(La)2S3"),_T("Ce(La)2S3")
  50. };
  51. const double INC_SULFILSES_MAPPING_RATIO[INC_SUL_SUB_ELEMENT_MAX] =
  52. {
  53. 1.0, 1.0, 1.0, 1.5, 1.5
  54. };
  55. const double SULFIDE_MOLAR_CUTOFF = 5.0;
  56. const CString SULFIDE_STR = _T("Sulfide");
  57. // O classification
  58. const long INC_OXIDE_SUB_ELEMENT_MAX = 9;
  59. const CString INC_OXIDE_SUB_ELEMENT_NAMES[INC_OXIDE_SUB_ELEMENT_MAX] =
  60. {
  61. _T("Al"),_T("Mg"),_T("Si"),_T("Mn"),_T("Ca"),_T("Ce"),_T("Cr"),_T("Ti"),_T("La")
  62. };
  63. const CString INC_OXIDE_NAMES[INC_OXIDE_SUB_ELEMENT_MAX] =
  64. {
  65. _T("Al2O3"),_T("MgO"),_T("SiO2"),_T("MnO"),_T("CaO"),_T("CeO"),_T("Oxide"),_T("Oxide"),_T("REOxide")
  66. };
  67. const double SIMPLE_OXIDE_MOLAR_CUTOFF = 90.0;
  68. const long REOXIDE_KEY_ELEMENT_MAX = 2;
  69. const CString REOXIDE_KEY_ELEMENT_NAMES[REOXIDE_KEY_ELEMENT_MAX] =
  70. {
  71. _T("Ce"),_T("La")
  72. };
  73. const CString REOXIDE_STR = _T("REOxide");
  74. const long REALOXIDE_SUB_ELEMENT_MAX = 2;
  75. const CString REALOXIDE_SUB_ELEMENT_NAMES[REALOXIDE_SUB_ELEMENT_MAX] =
  76. {
  77. _T("Si"),_T("Al")
  78. };
  79. const double REALOXIDE_ELEMELTS_MOLAR_CUTOFF = 90.0;
  80. const CString REALOXIDE_STR = _T("REAlOxide");
  81. const long SPINEL_KEY_ELEMENT_MAX = 2;
  82. const double REALOXIDE_ELEMENT_MOLAR_LOW_CUTOFF = 20;
  83. const CString SPINEL_KEY_ELEMENT_NAMES[SPINEL_KEY_ELEMENT_MAX] =
  84. {
  85. _T("Mg"),_T("Al")
  86. };
  87. const double SPINEL_KEY_ELEMENT_MOLAR_TOTAL = 90.0;
  88. const double SPINEL_ELEMENT_RATIO_MIN = 1.6;
  89. const double SPINEL_ELEMENT_RATIO_MAX = 2.4;
  90. const CString SPINEL_STR = _T("Spinel");
  91. const CString SILICATE_KEY_ELEMENT_NAME = _T("Si");
  92. const double SILICATE_KEY_ELEMENT_MOLAR_TOTAL_MIN = 10.0;
  93. const double SILICATE_KEY_ELEMENT_MOLAR_TOTAL_MAX = 90.0;
  94. const CString SILICATE_STR = _T("Silicate");
  95. const long ALUMINATE_KEY_ELEMENT_MAX = 2;
  96. const CString ALUMINATE_KEY_ELEMENT_NAME[ALUMINATE_KEY_ELEMENT_MAX] =
  97. {
  98. _T("Al"),_T("Ca")
  99. };
  100. const double ALUMINAT_KEY_ELEMENT_MOLAR_TOTAL_MIN = 10.0;
  101. const double ALUMINAT_KEY_ELEMENT_MOLAR_TOTAL_MAX = 90.0;
  102. const CString ALUMINATE12CaO_7Al2O3_STR = _T("12CaO-7Al2O3");
  103. const CString ALUMINATE3CaO_Al2O3_STR = _T("3CaO-Al2O3");
  104. const CString ALUMINATE_STR = _T("Aluminate");
  105. const CString Ca_ALUMINATE_STR = _T("Ca-Aluminate");
  106. const CString STR_OXIDE = _T("O");
  107. const double MIN_OXIDE_MOLAR = 5.0;
  108. const double MIN_OXIDE_SUB_MOLAR_TOTAL = 5.0;
  109. const double MIN_OXIDE_SUB_MOLAR_CUTOFF = ELEMENT_MAPPING_100MOLAR;
  110. const CString OXIDE_STR = _T("Oxide");
  111. // nitrogen classification
  112. const long INC_NITR_SUB_ELEMENT_MAX = 8;
  113. const CString INC_NITR_SUB_ELEMENT_NAMES[INC_NITR_SUB_ELEMENT_MAX] =
  114. {
  115. _T("Ti"),_T("V"),_T("Nb"),_T("Al"),_T("Zr"),_T("Cr"),_T("La"),_T("Ce")
  116. };
  117. const CString INC_NITR_NAMES[INC_NITR_SUB_ELEMENT_MAX] =
  118. {
  119. _T("TiN"),_T("VN"),_T("NbN"),_T("AlN"),_T("Nitride"),_T("Nitride"),_T("Nitride"),_T("Nitride")
  120. };
  121. const double INC_NITR_MAPPING_RATIO[INC_NITR_SUB_ELEMENT_MAX] =
  122. {
  123. 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0
  124. };
  125. const CString STR_NITR = _T("N");
  126. const CString STR_Nb = _T("Nb");
  127. const double MIN_NITR_MOLAR = ELEMENT_MAPPING_100MOLAR;
  128. const double MIN_NITR_SUB_MOLAR = ELEMENT_MAPPING_100MOLAR;
  129. const double NITRIDE_MOLAR_CUTOFF = 5.0;
  130. const CString NITRIDE_STR = _T("Nitride");
  131. #pragma region ÐÂÌí¼ÓµÄ̼ÄÚÈÝ
  132. // carbon classification
  133. const long INC_CAR_SUB_ELEMENT_MAX = 1;
  134. const CString INC_CAR_SUB_ELEMENT_NAMES[INC_CAR_SUB_ELEMENT_MAX] =
  135. {
  136. _T("Nb")
  137. };
  138. const CString INC_CAR_NAMES[INC_CAR_SUB_ELEMENT_MAX] =
  139. {
  140. _T("NbC")
  141. };
  142. const double INC_CAR_MAPPING_RATIO[INC_CAR_SUB_ELEMENT_MAX] =
  143. {
  144. 1.0
  145. };
  146. const CString STR_CAR = _T("C");
  147. const double MIN_CAR_MOLAR = ELEMENT_MAPPING_100MOLAR;
  148. const double MIN_CAR_SUB_MOLAR = ELEMENT_MAPPING_100MOLAR;
  149. const double CARBON_MOLAR_CUTOFF = 5.0;
  150. const CString CARBON_STR = _T("Carbon");
  151. #pragma endregion
  152. typedef enum class __declspec(dllexport) INC_CLASSIFY_TYPE
  153. {
  154. INVALID = -1,
  155. MIN = 0,
  156. SIMPLE_OXIDE = 0,
  157. COMPLEX_OXIDE = 1,
  158. OXIDE = 2,
  159. SUL = 3,
  160. NITR = 4,
  161. USER = 5,
  162. CARBON = 6,
  163. MAX = 7
  164. } INC_CLASSIFY_TYPE;
  165. typedef enum class __declspec(dllexport) INC_COMMON_CLASSIFY_TYPE
  166. {
  167. INVALID = -1,
  168. MIN = 0,
  169. SULFIDE_OXIDE = 0,
  170. OXIDE = 1,
  171. SULFIDE = 2,
  172. NITRIDE = 3,
  173. SPINEL = 4,
  174. CARBON = 5,
  175. MAX = 5
  176. } INC_COMMON_CLASSIFY_TYPE;
  177. class __declspec(dllexport) COTSClassifyEng
  178. {
  179. public:
  180. COTSClassifyEng(); // constructor
  181. virtual ~COTSClassifyEng(); // detractor
  182. static BOOL ClassifyXray(CInclutionSTDDataPtr a_pPartSTDData, STEEL_TECHNOLOGY steelTech, CElementChemistriesList & a_listElementChemistries, int & a_nIncId, int& a_GrpId);
  183. // check if the x-ray is an inc x-ray
  184. static BOOL IsAnValidIncXRay( CElementChemistriesList& a_listElementChemistries,
  185. CElementChemistriesList& a_listElChemsInc,
  186. CElementChemistriesList& a_listElChemsIncNoFe,
  187. double& a_dMolarSum,
  188. double& a_dMolarSumNoFe,
  189. OTS_PARTICLE_TYPE& a_nIncId,NOT_INCLUTION_ID& notIncId);
  190. // system STD classification
  191. static BOOL SystemClassify( CInclutionSTDDataPtr a_pPartSTDData,
  192. STEEL_TECHNOLOGY steelTech,
  193. CElementChemistriesList& a_listElChemsIncNoFe,
  194. double a_dMolarSumNoFe,
  195. int& a_nIncId);
  196. static BOOL GroupClassify(CInclutionSTDDataPtr a_pPartSTDData,CElementChemistriesList& a_listElChemsIncNoFe,int incId, IDENTIFIED_INC_GRP_ID& a_GrpId);
  197. static BOOL GetGroupNameAndColorById(int grpId, std::string& grpName, std::string& grpColor);
  198. // sulfides classification
  199. static BOOL SulClassify( CInclutionSTDDataPtr a_pPartSTDData,
  200. STEEL_TECHNOLOGY steelTech,
  201. CElementChemistriesList& a_listElChemsIncNoFe,
  202. double a_dMolarSumNoFe,
  203. int& a_nIncId);
  204. // oxides classification
  205. static BOOL OxideClassify( CInclutionSTDDataPtr a_pPartSTDData,
  206. CElementChemistriesList& a_listElChemsIncNoFe,
  207. double a_dSumNoFe,
  208. int& a_nIncId);
  209. // nitrides classification
  210. static BOOL NitrideClassify( CInclutionSTDDataPtr a_pPartSTDData,
  211. CElementChemistriesList& a_listElChemsIncNoFe,
  212. double a_dMolarSumNoFe,
  213. int& a_nIncId);
  214. // carbon classification
  215. static BOOL CarbonClassify(CInclutionSTDDataPtr a_pPartSTDData,
  216. CElementChemistriesList& a_listElChemsIncNoFe,
  217. double a_dMolarSumNoFe,
  218. int& a_nIncId);
  219. // user STD items classification
  220. static BOOL UserClassify( CInclutionSTDDataPtr a_pPartSTDData,
  221. CElementChemistriesList& a_listEltChemsInc,
  222. double a_dSum,
  223. int& a_nIncId);
  224. // nominate element chemistries list
  225. static BOOL NomiNateElChemsList( CElementChemistriesList& a_listElChemsInc,
  226. CElementChemistriesList& a_listNomiElChemsInc);
  227. protected:
  228. // check if this is a key element
  229. static BOOL IsKeyElement(CElementChemistryPtr a_pElChem);
  230. // check if this is a sub element
  231. static BOOL IsSubElement(CElementChemistryPtr a_pElChem);
  232. // get named element chemistry
  233. static CElementChemistryPtr GetNamedElementChemistry(CElementChemistriesList& a_listChemistriesElements, const CString a_strElementName);
  234. // get classify STD items
  235. static BOOL GetClassifySTDItem(CInclutionSTDDataPtr a_pPartSTDDataPtr, INC_CLASSIFY_TYPE a_nClassifyType, CSTDItemsList& a_listSTDItems);
  236. // get STD item by name
  237. static CSTDItemPtr GetSTDItemByName(CSTDItemsList& a_listSTDItems, CString a_strName);
  238. // get STD item name by id
  239. static CString GetSTDItemNameById(CSTDItemsList& a_listSTDItems, int a_nItemId);
  240. // elements mapping
  241. static BOOL ElementsMapping(double a_dMolarSumNoFe, double a_dMappingRadio, CElementChemistryPtr a_pFirstElChem, CElementChemistryPtr a_pSecondElChem, BOOL& a_bMapped);
  242. // check if is a simple
  243. static BOOL IsASimpleOxide(CElementChemistriesList& a_listElChems, double a_dMolarSum, CString& a_strSimOxName);
  244. // check if is a REOxide
  245. static BOOL IsAREOxide(CElementChemistriesList& a_listElChems, double a_dMolarSum);
  246. // check if is a REAlOxide
  247. static BOOL IsAnREAlOxide(CElementChemistriesList& a_listElChems, double a_dMolarSum);
  248. // check if is a Spinel
  249. static BOOL IsASpinel(CElementChemistriesList& a_listElChems, double a_dMolarSum);
  250. // check if is a Silicate
  251. static BOOL IsASilicate(CElementChemistriesList& a_listElChems, double a_dMolarSum);
  252. // check if is a Aluminate
  253. static BOOL IsAnCa_Aluminate(CElementChemistriesList& a_listElChems, double a_dMolarSum, CString& strName);
  254. // check if the element chemistries list matching the STD
  255. static BOOL MatchingSTD(CElementChemistriesList& a_listElChems, CSTDItemPtr a_pSTDItem, double a_dMolarSum);
  256. // calculate 100% value
  257. static double Cal100NorValue(double a_dValue, double a_dSumValue);
  258. };
  259. }