OTSClassifyEng.h 10 KB

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