OTSClassifyEng.h 10.0 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("Ce2S3"),_T("La2S3")
  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("Ca-Aluminate");
  104. const CString STR_OXIDE = _T("O");
  105. const double MIN_OXIDE_MOLAR = 5.0;
  106. const double MIN_OXIDE_SUB_MOLAR_TOTAL = 5.0;
  107. const double MIN_OXIDE_SUB_MOLAR_CUTOFF = ELEMENT_MAPPING_100MOLAR;
  108. const CString OXIDE_STR = _T("Oxide");
  109. // nitrogen classification
  110. const long INC_NITR_SUB_ELEMENT_MAX = 8;
  111. const CString INC_NITR_SUB_ELEMENT_NAMES[INC_NITR_SUB_ELEMENT_MAX] =
  112. {
  113. _T("Ti"),_T("V"),_T("Nb"),_T("Al"),_T("Zr"),_T("Cr"),_T("La"),_T("Ce")
  114. };
  115. const CString INC_NITR_NAMES[INC_NITR_SUB_ELEMENT_MAX] =
  116. {
  117. _T("TiN"),_T("VN"),_T("NbN"),_T("AlN"),_T("Nitride"),_T("Nitride"),_T("Nitride"),_T("Nitride")
  118. };
  119. const double INC_NITR_MAPPING_RATIO[INC_NITR_SUB_ELEMENT_MAX] =
  120. {
  121. 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0
  122. };
  123. const CString STR_NITR = _T("N");
  124. const CString STR_Nb = _T("Nb");
  125. const double MIN_NITR_MOLAR = ELEMENT_MAPPING_100MOLAR;
  126. const double MIN_NITR_SUB_MOLAR = ELEMENT_MAPPING_100MOLAR;
  127. const double NITRIDE_MOLAR_CUTOFF = 5.0;
  128. const CString NITRIDE_STR = _T("Nitride");
  129. #pragma region ÐÂÌí¼ÓµÄ̼ÄÚÈÝ
  130. // carbon classification
  131. const long INC_CAR_SUB_ELEMENT_MAX = 1;
  132. const CString INC_CAR_SUB_ELEMENT_NAMES[INC_CAR_SUB_ELEMENT_MAX] =
  133. {
  134. _T("Nb")
  135. };
  136. const CString INC_CAR_NAMES[INC_CAR_SUB_ELEMENT_MAX] =
  137. {
  138. _T("NbC")
  139. };
  140. const double INC_CAR_MAPPING_RATIO[INC_CAR_SUB_ELEMENT_MAX] =
  141. {
  142. 1.0
  143. };
  144. const CString STR_CAR = _T("C");
  145. const double MIN_CAR_MOLAR = ELEMENT_MAPPING_100MOLAR;
  146. const double MIN_CAR_SUB_MOLAR = ELEMENT_MAPPING_100MOLAR;
  147. const double CARBON_MOLAR_CUTOFF = 5.0;
  148. const CString CARBON_STR = _T("Carbon");
  149. #pragma endregion
  150. typedef enum class __declspec(dllexport) INC_CLASSIFY_TYPE
  151. {
  152. INVALID = -1,
  153. MIN = 0,
  154. SIMPLE_OXIDE = 0,
  155. COMPLEX_OXIDE = 1,
  156. OXIDE = 2,
  157. SUL = 3,
  158. NITR = 4,
  159. USER = 5,
  160. CARBON = 6,
  161. MAX = 7
  162. } INC_CLASSIFY_TYPE;
  163. typedef enum class __declspec(dllexport) INC_COMMON_CLASSIFY_TYPE
  164. {
  165. INVALID = -1,
  166. MIN = 0,
  167. SULFIDE_OXIDE = 0,
  168. OXIDE = 1,
  169. SULFIDE = 2,
  170. NITRIDE = 3,
  171. SPINEL = 4,
  172. CARBON = 5,
  173. MAX = 5
  174. } INC_COMMON_CLASSIFY_TYPE;
  175. class __declspec(dllexport) COTSClassifyEng
  176. {
  177. public:
  178. COTSClassifyEng(); // constructor
  179. virtual ~COTSClassifyEng(); // detractor
  180. static BOOL ClassifyXray(CInclutionSTDDataPtr a_pPartSTDData, STEEL_TECHNOLOGY steelTech, CElementChemistriesList & a_listElementChemistries, int & a_nIncId, int& a_GrpId);
  181. // check if the x-ray is an inc x-ray
  182. static BOOL IsAnValidIncXRay( CElementChemistriesList& a_listElementChemistries,
  183. CElementChemistriesList& a_listElChemsInc,
  184. CElementChemistriesList& a_listElChemsIncNoFe,
  185. double& a_dMolarSum,
  186. double& a_dMolarSumNoFe,
  187. OTS_PARTICLE_TYPE& a_nIncId,NOT_INCLUTION_ID& notIncId);
  188. // system STD classification
  189. static BOOL SystemClassify( CInclutionSTDDataPtr a_pPartSTDData,
  190. STEEL_TECHNOLOGY steelTech,
  191. CElementChemistriesList& a_listElChemsIncNoFe,
  192. double a_dMolarSumNoFe,
  193. int& a_nIncId);
  194. static BOOL GroupClassify(CElementChemistriesList& a_listElChemsIncNoFe, IDENTIFIED_INC_GRP_ID& a_GrpId);
  195. static BOOL GetGroupNameAndColorById(int grpId, std::string& grpName, std::string& grpColor);
  196. // sulfides classification
  197. static BOOL SulClassify( CInclutionSTDDataPtr a_pPartSTDData,
  198. STEEL_TECHNOLOGY steelTech,
  199. CElementChemistriesList& a_listElChemsIncNoFe,
  200. double a_dMolarSumNoFe,
  201. int& a_nIncId);
  202. // oxides classification
  203. static BOOL OxideClassify( CInclutionSTDDataPtr a_pPartSTDData,
  204. CElementChemistriesList& a_listElChemsIncNoFe,
  205. double a_dSumNoFe,
  206. int& a_nIncId);
  207. // nitrides classification
  208. static BOOL NitrideClassify( CInclutionSTDDataPtr a_pPartSTDData,
  209. CElementChemistriesList& a_listElChemsIncNoFe,
  210. double a_dMolarSumNoFe,
  211. int& a_nIncId);
  212. // carbon classification
  213. static BOOL CarbonClassify(CInclutionSTDDataPtr a_pPartSTDData,
  214. CElementChemistriesList& a_listElChemsIncNoFe,
  215. double a_dMolarSumNoFe,
  216. int& a_nIncId);
  217. // user STD items classification
  218. static BOOL UserClassify( CInclutionSTDDataPtr a_pPartSTDData,
  219. CElementChemistriesList& a_listEltChemsInc,
  220. double a_dSum,
  221. int& a_nIncId);
  222. // nominate element chemistries list
  223. static BOOL NomiNateElChemsList( CElementChemistriesList& a_listElChemsInc,
  224. CElementChemistriesList& a_listNomiElChemsInc);
  225. protected:
  226. // check if this is a key element
  227. static BOOL IsKeyElement(CElementChemistryPtr a_pElChem);
  228. // check if this is a sub element
  229. static BOOL IsSubElement(CElementChemistryPtr a_pElChem);
  230. // get named element chemistry
  231. static CElementChemistryPtr GetNamedElementChemistry(CElementChemistriesList& a_listChemistriesElements, const CString a_strElementName);
  232. // get classify STD items
  233. static BOOL GetClassifySTDItem(CInclutionSTDDataPtr a_pPartSTDDataPtr, INC_CLASSIFY_TYPE a_nClassifyType, CSTDItemsList& a_listSTDItems);
  234. // get STD item by name
  235. static CSTDItemPtr GetSTDItemByName(CSTDItemsList& a_listSTDItems, CString a_strName);
  236. // get STD item name by id
  237. static CString GetSTDItemNameById(CSTDItemsList& a_listSTDItems, int a_nItemId);
  238. // elements mapping
  239. static BOOL ElementsMapping(double a_dMolarSumNoFe, double a_dMappingRadio, CElementChemistryPtr a_pFirstElChem, CElementChemistryPtr a_pSecondElChem, BOOL& a_bMapped);
  240. // check if is a simple
  241. static BOOL IsASimpleOxide(CElementChemistriesList& a_listElChems, double a_dMolarSum, CString& a_strSimOxName);
  242. // check if is a REOxide
  243. static BOOL IsAREOxide(CElementChemistriesList& a_listElChems, double a_dMolarSum);
  244. // check if is a REAlOxide
  245. static BOOL IsAnREAlOxide(CElementChemistriesList& a_listElChems, double a_dMolarSum);
  246. // check if is a Spinel
  247. static BOOL IsASpinel(CElementChemistriesList& a_listElChems, double a_dMolarSum);
  248. // check if is a Silicate
  249. static BOOL IsASilicate(CElementChemistriesList& a_listElChems, double a_dMolarSum);
  250. // check if is a Aluminate
  251. static BOOL IsAnCa_Aluminate(CElementChemistriesList& a_listElChems, double a_dMolarSum, CString& strName);
  252. // check if the element chemistries list matching the STD
  253. static BOOL MatchingSTD(CElementChemistriesList& a_listElChems, CSTDItemPtr a_pSTDItem, double a_dMolarSum);
  254. // calculate 100% value
  255. static double Cal100NorValue(double a_dValue, double a_dSumValue);
  256. };
  257. }