OTSClassifyEng.h 9.5 KB

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