#pragma once #include "InclutionSTDData.h" #include "OTSParticle.h" using namespace OTSDATA; namespace OTSClassifyEngine { // min sum const double MIN_ELEMENT_SUM = 0.02; const long INC_DEFAULTSIZE = 100; const long INC_ELEMENTSIZE_MIN = 0; const CString STR_CONNECT = _T("-"); const CString STR_FE = _T("Fe"); const CString STR_C = _T("C"); const CString STR_SI = _T("Si"); const CString STR_O = _T("O"); const CString STR_SUL = _T("S"); const CString STR_N = _T("N"); const double SIC_MOLAR_CUTOFF = 85.0; const double FEO_MOLAR_CUTOFF = 85.0; // key element const long INC_KEY_ELEMENT_MAX = 4; const double INC_KEY_ELEMENT_CUT_OFF = 0.02; // weight% const double INC_KEY_ELEMENT_TOTAL_100 = 5.0; // total molar value const CString INC_KEY_ELEMENT_NAMES[INC_KEY_ELEMENT_MAX] = { _T("S"),_T("N"),_T("O"),_T("C") }; // sub element const long INC_SUB_ELEMENT_MAX = 13; const double INC_SUB_ELEMENT_CUT_OFF = 0.02; // weight% const double INC_SUB_ELEMENT_TOTAL_100 = 5.0; // molar value const CString INC_SUB_ELEMENT_NAMES[INC_SUB_ELEMENT_MAX] = { _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") }; // element 100 % molar value mapping cut off const double ELEMENT_MAPPING_100MOLAR = 2.0; // sulfur classification const double MIN_SUL_MOLAR = ELEMENT_MAPPING_100MOLAR; const double MIN_SUL_SUB_MOLAR = ELEMENT_MAPPING_100MOLAR; const long INC_SUL_SUB_ELEMENT_MAX = 5; const CString INC_SUL_SUB_ELEMENT_NAMES[INC_SUL_SUB_ELEMENT_MAX] = { _T("Mn"),_T("Ca"),_T("Mg"),_T("Ce"),_T("La") }; const CString INC_SULFILSES_NAMES[INC_SUL_SUB_ELEMENT_MAX] = { _T("MnS"),_T("CaS"),_T("MgS"),_T("Ce(La)2S3"),_T("Ce(La)2S3") }; const double INC_SULFILSES_MAPPING_RATIO[INC_SUL_SUB_ELEMENT_MAX] = { 1.0, 1.0, 1.0, 1.5, 1.5 }; const double SULFIDE_MOLAR_CUTOFF = 5.0; const CString SULFIDE_STR = _T("Sulfide"); // O classification const long INC_OXIDE_SUB_ELEMENT_MAX = 9; const CString INC_OXIDE_SUB_ELEMENT_NAMES[INC_OXIDE_SUB_ELEMENT_MAX] = { _T("Al"),_T("Mg"),_T("Si"),_T("Mn"),_T("Ca"),_T("Ce"),_T("Cr"),_T("Ti"),_T("La") }; const CString INC_OXIDE_NAMES[INC_OXIDE_SUB_ELEMENT_MAX] = { _T("Al2O3"),_T("MgO"),_T("SiO2"),_T("MnO"),_T("CaO"),_T("CeO"),_T("Oxide"),_T("Oxide"),_T("REOxide") }; const double SIMPLE_OXIDE_MOLAR_CUTOFF = 90.0; const long REOXIDE_KEY_ELEMENT_MAX = 2; const CString REOXIDE_KEY_ELEMENT_NAMES[REOXIDE_KEY_ELEMENT_MAX] = { _T("Ce"),_T("La") }; const CString REOXIDE_STR = _T("REOxide"); const long REALOXIDE_SUB_ELEMENT_MAX = 2; const CString REALOXIDE_SUB_ELEMENT_NAMES[REALOXIDE_SUB_ELEMENT_MAX] = { _T("Si"),_T("Al") }; const double REALOXIDE_ELEMELTS_MOLAR_CUTOFF = 90.0; const CString REALOXIDE_STR = _T("REAlOxide"); const long SPINEL_KEY_ELEMENT_MAX = 2; const double REALOXIDE_ELEMENT_MOLAR_LOW_CUTOFF = 20; const CString SPINEL_KEY_ELEMENT_NAMES[SPINEL_KEY_ELEMENT_MAX] = { _T("Mg"),_T("Al") }; const double SPINEL_KEY_ELEMENT_MOLAR_TOTAL = 90.0; const double SPINEL_ELEMENT_RATIO_MIN = 1.6; const double SPINEL_ELEMENT_RATIO_MAX = 2.4; const CString SPINEL_STR = _T("Spinel"); const CString SILICATE_KEY_ELEMENT_NAME = _T("Si"); const double SILICATE_KEY_ELEMENT_MOLAR_TOTAL_MIN = 10.0; const double SILICATE_KEY_ELEMENT_MOLAR_TOTAL_MAX = 90.0; const CString SILICATE_STR = _T("Silicate"); const long ALUMINATE_KEY_ELEMENT_MAX = 2; const CString ALUMINATE_KEY_ELEMENT_NAME[ALUMINATE_KEY_ELEMENT_MAX] = { _T("Al"),_T("Ca") }; const double ALUMINAT_KEY_ELEMENT_MOLAR_TOTAL_MIN = 10.0; const double ALUMINAT_KEY_ELEMENT_MOLAR_TOTAL_MAX = 90.0; const CString ALUMINATE12CaO_7Al2O3_STR = _T("12CaO-7Al2O3"); const CString ALUMINATE3CaO_Al2O3_STR = _T("3CaO-Al2O3"); const CString ALUMINATE_STR = _T("Aluminate"); const CString Ca_ALUMINATE_STR = _T("Ca-Aluminate"); const CString STR_OXIDE = _T("O"); const double MIN_OXIDE_MOLAR = 5.0; const double MIN_OXIDE_SUB_MOLAR_TOTAL = 5.0; const double MIN_OXIDE_SUB_MOLAR_CUTOFF = ELEMENT_MAPPING_100MOLAR; const CString OXIDE_STR = _T("Oxide"); // nitrogen classification const long INC_NITR_SUB_ELEMENT_MAX = 8; const CString INC_NITR_SUB_ELEMENT_NAMES[INC_NITR_SUB_ELEMENT_MAX] = { _T("Ti"),_T("V"),_T("Nb"),_T("Al"),_T("Zr"),_T("Cr"),_T("La"),_T("Ce") }; const CString INC_NITR_NAMES[INC_NITR_SUB_ELEMENT_MAX] = { _T("TiN"),_T("VN"),_T("NbN"),_T("AlN"),_T("Nitride"),_T("Nitride"),_T("Nitride"),_T("Nitride") }; const double INC_NITR_MAPPING_RATIO[INC_NITR_SUB_ELEMENT_MAX] = { 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0 }; const CString STR_NITR = _T("N"); const CString STR_Nb = _T("Nb"); const double MIN_NITR_MOLAR = ELEMENT_MAPPING_100MOLAR; const double MIN_NITR_SUB_MOLAR = ELEMENT_MAPPING_100MOLAR; const double NITRIDE_MOLAR_CUTOFF = 5.0; const CString NITRIDE_STR = _T("Nitride"); #pragma region ÐÂÌí¼ÓµÄ̼ÄÚÈÝ // carbon classification const long INC_CAR_SUB_ELEMENT_MAX = 1; const CString INC_CAR_SUB_ELEMENT_NAMES[INC_CAR_SUB_ELEMENT_MAX] = { _T("Nb") }; const CString INC_CAR_NAMES[INC_CAR_SUB_ELEMENT_MAX] = { _T("NbC") }; const double INC_CAR_MAPPING_RATIO[INC_CAR_SUB_ELEMENT_MAX] = { 1.0 }; const CString STR_CAR = _T("C"); const double MIN_CAR_MOLAR = ELEMENT_MAPPING_100MOLAR; const double MIN_CAR_SUB_MOLAR = ELEMENT_MAPPING_100MOLAR; const double CARBON_MOLAR_CUTOFF = 5.0; const CString CARBON_STR = _T("Carbon"); #pragma endregion typedef enum class __declspec(dllexport) INC_CLASSIFY_TYPE { INVALID = -1, MIN = 0, SIMPLE_OXIDE = 0, COMPLEX_OXIDE = 1, OXIDE = 2, SUL = 3, NITR = 4, USER = 5, CARBON = 6, MAX = 7 } INC_CLASSIFY_TYPE; typedef enum class __declspec(dllexport) INC_COMMON_CLASSIFY_TYPE { INVALID = -1, MIN = 0, SULFIDE_OXIDE = 0, OXIDE = 1, SULFIDE = 2, NITRIDE = 3, SPINEL = 4, CARBON = 5, MAX = 5 } INC_COMMON_CLASSIFY_TYPE; class __declspec(dllexport) COTSClassifyEng { public: COTSClassifyEng(); // constructor virtual ~COTSClassifyEng(); // detractor static BOOL ClassifyXray(CInclutionSTDDataPtr a_pPartSTDData, STEEL_TECHNOLOGY steelTech, CElementChemistriesList & a_listElementChemistries, int & a_nIncId, int& a_GrpId); // check if the x-ray is an inc x-ray static BOOL IsAnValidIncXRay( CElementChemistriesList& a_listElementChemistries, CElementChemistriesList& a_listElChemsInc, CElementChemistriesList& a_listElChemsIncNoFe, double& a_dMolarSum, double& a_dMolarSumNoFe, OTS_PARTICLE_TYPE& a_nIncId,NOT_INCLUTION_ID& notIncId); // system STD classification static BOOL SystemClassify( CInclutionSTDDataPtr a_pPartSTDData, STEEL_TECHNOLOGY steelTech, CElementChemistriesList& a_listElChemsIncNoFe, double a_dMolarSumNoFe, int& a_nIncId); static BOOL GroupClassify(CInclutionSTDDataPtr a_pPartSTDData,CElementChemistriesList& a_listElChemsIncNoFe,int incId, IDENTIFIED_INC_GRP_ID& a_GrpId); static BOOL GetGroupNameAndColorById(int grpId, std::string& grpName, std::string& grpColor); // sulfides classification static BOOL SulClassify( CInclutionSTDDataPtr a_pPartSTDData, STEEL_TECHNOLOGY steelTech, CElementChemistriesList& a_listElChemsIncNoFe, double a_dMolarSumNoFe, int& a_nIncId); // oxides classification static BOOL OxideClassify( CInclutionSTDDataPtr a_pPartSTDData, CElementChemistriesList& a_listElChemsIncNoFe, double a_dSumNoFe, int& a_nIncId); // nitrides classification static BOOL NitrideClassify( CInclutionSTDDataPtr a_pPartSTDData, CElementChemistriesList& a_listElChemsIncNoFe, double a_dMolarSumNoFe, int& a_nIncId); // carbon classification static BOOL CarbonClassify(CInclutionSTDDataPtr a_pPartSTDData, CElementChemistriesList& a_listElChemsIncNoFe, double a_dMolarSumNoFe, int& a_nIncId); // user STD items classification static BOOL UserClassify( CInclutionSTDDataPtr a_pPartSTDData, CElementChemistriesList& a_listEltChemsInc, double a_dSum, int& a_nIncId); // nominate element chemistries list static BOOL NomiNateElChemsList( CElementChemistriesList& a_listElChemsInc, CElementChemistriesList& a_listNomiElChemsInc); protected: // check if this is a key element static BOOL IsKeyElement(CElementChemistryPtr a_pElChem); // check if this is a sub element static BOOL IsSubElement(CElementChemistryPtr a_pElChem); // get named element chemistry static CElementChemistryPtr GetNamedElementChemistry(CElementChemistriesList& a_listChemistriesElements, const CString a_strElementName); // get classify STD items static BOOL GetClassifySTDItem(CInclutionSTDDataPtr a_pPartSTDDataPtr, INC_CLASSIFY_TYPE a_nClassifyType, CSTDItemsList& a_listSTDItems); // get STD item by name static CSTDItemPtr GetSTDItemByName(CSTDItemsList& a_listSTDItems, CString a_strName); // get STD item name by id static CString GetSTDItemNameById(CSTDItemsList& a_listSTDItems, int a_nItemId); // elements mapping static BOOL ElementsMapping(double a_dMolarSumNoFe, double a_dMappingRadio, CElementChemistryPtr a_pFirstElChem, CElementChemistryPtr a_pSecondElChem, BOOL& a_bMapped); // check if is a simple static BOOL IsASimpleOxide(CElementChemistriesList& a_listElChems, double a_dMolarSum, CString& a_strSimOxName); // check if is a REOxide static BOOL IsAREOxide(CElementChemistriesList& a_listElChems, double a_dMolarSum); // check if is a REAlOxide static BOOL IsAnREAlOxide(CElementChemistriesList& a_listElChems, double a_dMolarSum); // check if is a Spinel static BOOL IsASpinel(CElementChemistriesList& a_listElChems, double a_dMolarSum); // check if is a Silicate static BOOL IsASilicate(CElementChemistriesList& a_listElChems, double a_dMolarSum); // check if is a Aluminate static BOOL IsAnCa_Aluminate(CElementChemistriesList& a_listElChems, double a_dMolarSum, CString& strName); // check if the element chemistries list matching the STD static BOOL MatchingSTD(CElementChemistriesList& a_listElChems, CSTDItemPtr a_pSTDItem, double a_dMolarSum); // calculate 100% value static double Cal100NorValue(double a_dValue, double a_dSumValue); }; }