Files
envi-code/SourceCode/Code2026/tg_shs/shs_kernal/AxisNoParser.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

825 lines
18 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
// del by xlc on 100309 移到Geo去了
// 是否全部为数字
/*
BOOL IsDigital(const TCHAR *pStr)
{
ASSERT(pStr);
int nLen = _tcslen(pStr);
if (!nLen)
return FALSE;
for (int i=0; i<nLen; i++)
{
if (!isdigit(pStr[i]))
return FALSE;
}
return TRUE;
}
*/
/////////////////////////////////////////////////////////////////////////////////
// 字母的向后推导
TCHAR GetNextAxisAlpha(TCHAR cCur)
{
if (cCur == _T('Z')) // 本身已经不合理,但不管
return _T('a');
if (cCur == _T('z')) // 不再往下推导
return cCur;
cCur++;
if (cCur==_T('I') || cCur==_T('i') || cCur==_T('O') || cCur==_T('o'))
cCur++;
else if (cCur == _T('Z'))
cCur = _T('a');
return cCur;
}
/////////////////////////////////////////////////////////////////////////////////
// 如果没有_T('/'),则全部作为分母
// 如果有_T('/'),_T('/')后的部分,作为分母
BOOL XAxisNoParser::GetDenominator(XString &sDenominator) const // 求分母
{
TCHAR *pSep = _tcschr(str, _T('/'));
if (pSep == NULL)
{
sDenominator = str;
}
else
{
TCHAR szTemp[256] = _T("");
StrCpy(szTemp, pSep+1, NULL);
sDenominator = szTemp;
}
return TRUE;
}
// 如果没有_T('/'),则返回FALSE
// 如果有_T('/'),_T('/')前的部分,作为分子
BOOL XAxisNoParser::GetNumerator(XString &sNumerator) const // 求分子
{
TCHAR *pSep = _tcschr(str, _T('/'));
if (pSep == NULL)
{
return FALSE;
}
else
{
TCHAR szTemp[256] = _T("");
StrCpy(szTemp, str, pSep);
sNumerator = szTemp;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////
// 求分区号,分区号用_T('-')分割
// 如:_T("1-A"),回传_T("1")
BOOL XAxisNoParser::GetRegionNo(XString &sRegion) const
{
/*
TCHAR *pSep = _tcschr(str, _T('-'));
if (!pSep)
return FALSE;
TCHAR szPrefix[256]=_T("");
StrCpy(szPrefix, str, pSep);
sRegion = szPrefix;
return TRUE;
*/
// 求分母
XString sDenominator;
GetDenominator(sDenominator);
// 判断分母中是否有分区符号
TCHAR *pSep = _tcschr(sDenominator, _T('-'));
if (pSep == NULL)
return FALSE;
TCHAR szPrefix[256] = _T("");
StrCpy(szPrefix, (const TCHAR *)sDenominator, pSep);
sRegion = szPrefix;
return TRUE;
}
// 求主轴号
// 如:_T("2-2/AB")回传_T("AB")
// 返回值:0--主轴号前有前置标志_T('0');1--正常
int XAxisNoParser::GetMajorNo(XString &sMajorNo) const
{
/*
int nRetCode=1;
TCHAR *pSep = _tcschr(str, _T('-'));
if (!pSep)
pSep=str;
else pSep++;
// 消除了分区号
TCHAR *pBegin=pSep;
pSep = _tcschr(pBegin, _T('/'));
if (!pSep) //没有附加轴线号
pSep = pBegin;
else {
pSep++;
if (*pSep==_T('0')) { // 前置附加轴线号, 如_T("1/0A")应当回传_T("A")
pSep ++;
nRetCode=0;
}
}
sMajorNo=pSep;
return nRetCode;
*/
XString sDenominator, sNumerator, sRetNo;
BOOL bHasNumerator = GetNumerator(sNumerator); // 求分子
GetDenominator(sDenominator); // 求分母
TCHAR *pSep = _tcschr(sDenominator, _T('-'));
if (pSep != NULL)
{
TCHAR szSuffix[256] = _T("");
StrCpy(szSuffix, pSep+1, NULL);
sRetNo = szSuffix;
}
else
{
sRetNo = sDenominator;
}
int nRetCode = 1;
if (bHasNumerator && sRetNo[0]==_T('0')) // 判断分母中是否首位是0
{
sMajorNo = &sRetNo[1];
nRetCode = 0;
}
else
{
sMajorNo = sRetNo;
}
return nRetCode;
}
// 求主轴号中可变的部分(对于双字母)
// 如:_T("1-A"),变前项,回传_T("1");变后项,回传_T("A")
// 如:_T("AB"),变前项,回传_T("A");变后项,回传_T("B")
BOOL XAxisNoParser::GetMajorVarNo(XString &sMajorVar) const
{
XString sMajorNo;
GetMajorNo(sMajorNo); // 求主轴号
// 字母轴号或有字母强制,如:_T("B3")
if (!IsDigital(sMajorNo))
{
if (_tcslen(sMajorNo) < 2) // 单字母
{
ASSERT(!!sMajorNo);
sMajorVar = sMajorNo;
return TRUE;
}
size_t nLen = _tcslen(&sMajorNo[1]); // 从第二个字符开始
if (nLen>1 && !IsDigital(&sMajorNo[1])) // 字母的主轴号超过2个字符
return FALSE;
// 主轴号可变部分是数字或单字母
sMajorVar = &sMajorNo[1];
}
else // 主轴号是数字
{
sMajorVar = sMajorNo;
}
return TRUE;
}
// 求主轴号中不变的部分(对于双字母)
// 如:_T("1-A"),回传_T("A")
// 如:_T("AB"),回传_T("B")
BOOL XAxisNoParser::GetMajorConstNo(XString &sMajorConst) const
{
XString sMajorNo;
GetMajorNo(sMajorNo); // 求主轴号
if (IsDigital(sMajorNo)) // 不存在不变的前缀
return FALSE;
// 字母轴号或有字母前缀如 _T("B3")
if (_tcslen(sMajorNo) < 2) // 单字母
{
return FALSE;
}
size_t nLen = _tcslen(&sMajorNo[1]); // 从第二个字符开始
if (nLen>1 && !IsDigital(&sMajorNo[1])) // 字母的主轴号超过2个字符
return FALSE;
TCHAR szTemp[2] = _T("");
szTemp[0] = sMajorNo[0];
szTemp[1] = EOS;
sMajorConst = szTemp;
return TRUE;
}
// 求附加轴线号(分子),一般为数字
// 如:_T("1/A"),_T("1/0A"),回传_T("1")
// BOOL XAxisNoParser::GetSubNo(XString &sSubNo) const
BOOL XAxisNoParser::GetSubNo(int &nSubNo) const
{
/*
TCHAR *pSep = _tcschr(str, _T('-'));
if (!pSep)
pSep = str;
else
pSep++;
// 消除了分区号
TCHAR *pBegin = pSep;
pSep = _tcschr(pBegin, _T('/'));
if (!pSep)
return FALSE;
TCHAR szTemp[80] = _T("");
StrCpy(szTemp, pBegin, pSep);
*/
XString szTemp;
if (!GetNumerator(szTemp)) // 求分子
{
return FALSE;
}
if (!IsDigital(szTemp)) // 分轴号不是数字,不常见,暂时认为没有分子
{
return FALSE;
}
// sSubNo = szTemp;
nSubNo = _ttoi(szTemp);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////
// sg add 100602,根据8.5的新需求,当字母不够使用时,根据高级选项中的设置,使用字母组合或字母数字组合排列,因此有可能不再是两位
// bChangeOther用于控制是否改变另外一位数
TCHAR XAxisNoParser::GetNextAxisAlpha(TCHAR cCur, bool &bChangeOther) const
{
bChangeOther = true; // 需要改变另外一位
if (cCur == _T('Z') || cCur == _T('Y')) // 单字母已不够使用
{
return _T('A');
}
if (cCur == _T('z') || cCur == _T('y'))
{
return _T('a');
}
cCur++;
bChangeOther = false; // 不需要改变另外一位
if (cCur == _T('I') || cCur == _T('i') || cCur == _T('O') || cCur == _T('o'))
{
cCur++; // 规范中要求,不允许使用下列字母做为轴标
}
return cCur;
}
// 将szNo拆分为前项szFront和后项szBehind
// 返回0:出现错误;返回1:正常解析;返回2:单个字母或全部都是数字
short XAxisNoParser::GetFrontAndBehindNo(XString szNo, XString &szFront, XString &szBehind) const
{
TCHAR *pSep = _tcschr(szNo, _T('-'));
if (pSep != NULL) // 判断是否含有分区轴号
{
TCHAR szFNo[256] = _T("");
StrCpy(szFNo, (const TCHAR *)szNo, pSep);
szFront = szFNo;
TCHAR szBNo[256] = _T("");
StrCpy(szBNo, pSep+1, NULL);
szBehind = szBNo;
return 3;
}
int nLen = (int)_tcslen(szNo);
if (nLen<2 || IsDigital(szNo)) // 单字母,或全部都是数字
{
szFront = szNo;
return 2;
}
nLen = (int)_tcslen(&szNo[1]); // 从第二个字符开始
if (nLen > 1) // 主轴号超过2个字符,如:A10、10A、100B、AB1、AAA、1A1,前三种正确,后三种返回0,不做自动编号
{
XString szTempNo;
szTempNo = &szNo[1];
int nAlphaIndex = -1; // 首个字符的位置
for (int i=0; i<nLen; i++)
{
if (!isdigit(szTempNo[i]))
{
nAlphaIndex = i; // 逐个判断是否是数字,获取出现首个字符的位置
break;
}
}
if (nAlphaIndex != -1) // 出现字母,如:10A、100B、AB1、AAA、1A1
{
if (nAlphaIndex != nLen - 1) // 首个字符的位置只要不出现在最后一位,就不做自动编号处理,如:AB1、AAA、1A1
{
return 0;
}
// 字母之前的数字,全属于szFront,如:10A、100B
TCHAR szFNo[256] = _T("");
for (i=0; i<nLen; i++)
{
szFNo[i] = szNo[i];
}
szFNo[nLen] = EOS;
szFront = szFNo;
TCHAR szBNo[2] = _T("");
szBNo[0] = szNo[nLen];
szBNo[1] = EOS;
szBehind = szBNo;
return 1;
}
}
TCHAR szFTemp[2] = _T("");
szFTemp[0] = szNo[0];
szFTemp[1] = EOS;
szFront = szFTemp;
if (IsDigital(&szNo[1])) // 后面全部是数字
{
szBehind = &szNo[1];
}
else // 后面有字母
{
TCHAR szTemp[2] = _T("");
szTemp[0] = szNo[1];
szTemp[1] = EOS;
szBehind = szTemp;
}
return 1;
}
bool XAxisNoParser::GetNext(XString szOld, XString &szNew) const
{
// 将szOld拆分为前项szFront和后项szBehind
// 注:单个字母,或者全部为数字的情况,都解析到szFront里
XString szFront, szBehind;
short nRet = GetFrontAndBehindNo(szOld, szFront, szBehind);
// 前两位都为字母的情况,如:AB1、AAA、1A1,不处理
if (nRet == 0)
{
return true;
}
if (nRet == 2)
{
GetNextNo(szFront, szNew, 1); // 单个字母,全部是数字
return true;
}
// 判断是否含有分区号_T('-')
XString szRegionNo;
if (nRet == 3)
{
szRegionNo << _T("-");
}
bool bChange = false; // 标记是否出现字母不够使用的情况
XString szTempNext, szBTemp, szFTemp; // 临时使用的保存字符串
if (m_bChangePreNo) // 变前项
{
bChange = GetNextNo(szFront, szFTemp, 0); // 获取变前项的结果
if (!bChange) // 需要变后项
{
bChange = GetNextNo(szBehind, szBTemp, 0);
szTempNext << szFTemp << szRegionNo << szBTemp;
// 后项字母也不够使用,需要增加1位
if (!bChange)
{
if (g_nAfterYAxisStyle == 0) // 自动加字母
{
szTempNext << szRegionNo << _T("A");
}
else // 自动加数字
{
szTempNext << szRegionNo << _T("1");
}
}
}
else // 后前项固定
{
szTempNext << szFTemp << szRegionNo << szBehind;
}
}
else // 变后项
{
bChange = GetNextNo(szBehind, szBTemp, 0); // 获取变后项的结果
if (!bChange) // 需要变前项
{
bChange = GetNextNo(szFront, szFTemp, 0);
szTempNext << szFTemp << szRegionNo << szBTemp;
// 前项字母也不够使用,需要增加1位
if (!bChange)
{
if (g_nAfterYAxisStyle == 0) // 自动加字母
{
szTempNext << szRegionNo << _T("A");
}
else // 自动加数字
{
szTempNext << szRegionNo << _T("1");
}
}
}
else // 前项固定
{
szTempNext << szFront << szRegionNo << szBTemp;
}
}
szNew = szTempNext;
return true;
}
// nType:表示处理方式,0:如果是字母,到Y时,不再处理;1:针对单个字母类,自动处理到szNew中
bool XAxisNoParser::GetNextNo(XString szOld, XString &szNew, int nType) const
{
if (IsDigital(szOld)) // 数字
{
int nVar = _ttoi(szOld);
nVar++;
szNew << nVar;
return true;
}
// 字母
bool bChange = false;
TCHAR cNextAlpha = GetNextAxisAlpha(szOld[0], bChange);
if (!bChange || nType == 0) // 不需要改变另外一位
{
TCHAR szNextStr[2] = _T("");
szNextStr[0] = cNextAlpha;
szNextStr[1] = EOS;
szNew << szNextStr;
return (!bChange || nType!=0);
}
if (nType == 1) // 字母不够用,由一位生为两位
{
TCHAR szNextStr[3] = _T("");
szNextStr[0] = cNextAlpha;
if (g_nAfterYAxisStyle == 0) // 自动加字母
{
szNextStr[1] = _T('A');
}
else // 自动加数字
{
szNextStr[1] = _T('1');
}
szNextStr[2] = EOS;
szNew << szNextStr;
}
return true;
}
/////////////////////////////////////////////////////////////////////////////////
// 求下一根轴号
// bNextIsMajor--下一根性质是主轴线吗
// 如:_T("2-3/AB")回传_T("2-4/AB")或_T("2-AC")
// sg modify 100707,根据8.5需求,进行了整体修改,增加了变前项、变后项等功能
/*
BOOL XAxisNoParser::GetNext(XString &sNextNo, BOOL bNextIsMajor) const
{
if (!(*this)) // 当前轴号位空
{
sNextNo = _T("");
return TRUE;
}
XString sRegionNo, sMajorConst, sMajorVar, sSubNo, sMajorNo;
// 求分区号,分区号用_T('-')分割
BOOL bHasRegionNo = GetRegionNo(sRegionNo);
// 求主轴号中,不可变的部分(对于双字母)
BOOL bHasMajorConst = GetMajorConstNo(sMajorConst);
// 求主轴号中,不可变的部分(对于双字母)
BOOL bHasMajorVar = GetMajorVarNo(sMajorVar);
// 求附加轴线号
BOOL bHasSubNo = GetSubNo(sSubNo);
// 求主轴号
// 含有/0,则返回0,其他,返回1
int nRetCode = GetMajorNo(sMajorNo);
if (!bHasMajorVar) // 不存在可变的主体, 编号有错
{
return FALSE;
}
XString sNextTemp(256);
// if (bHasRegionNo)
// {
// sNextTemp << sRegionNo << _T("-");
// }
XString sRegPrefix;
if (bHasRegionNo)
{
sRegPrefix << sRegionNo << _T("-");
}
if (bHasSubNo) // 有分子,并且分子为数字
{
int nSubNo = _ttoi(sSubNo);
if (nRetCode==0)
{
if (nSubNo==1) // 变主轴号
{
sNextTemp << sRegPrefix << sMajorNo;
}
else
{
nSubNo--; // 前置附加号需要减1
sNextTemp << nSubNo << _T("/") << sRegPrefix << _T("0") << sMajorNo;
}
}
else
{
if (!bNextIsMajor) // 下一个仍然是附加号
{
nSubNo++;
sNextTemp << nSubNo;
sNextTemp << _T("/") << sRegPrefix << sMajorNo; // 主轴号不变
}
else // 下一个是主轴号, 由分轴变主轴
{
sNextTemp << sRegPrefix;
if (bHasMajorConst)
sNextTemp << sMajorConst;
if (IsDigital(sMajorVar)) // 数字
{
int nMajorVar = _ttoi(sMajorVar);
nMajorVar++;
sNextTemp << nMajorVar;
}
else // 字母
{
TCHAR cNextAlpha = GetNextAxisAlpha(sMajorVar[0]);
TCHAR szNextStr[2] = _T("");
szNextStr[0] = cNextAlpha;
szNextStr[1] = EOS;
sNextTemp << szNextStr;
}
}
}
}
else // 无分子,或者分子为字母
{
if (!bNextIsMajor) // 主轴变分轴
{
sNextTemp << _T("1/") << sRegPrefix << sMajorNo;
}
else
{
sNextTemp << sRegPrefix;
XString sNextMajor(256);
if (bHasMajorConst)
sNextMajor << sMajorConst;
if (IsDigital(sMajorVar)) // 数字
{
int nMajorVar=_ttoi(sMajorVar);
nMajorVar++;
sNextMajor << nMajorVar;
}
else // 字母
{
TCHAR cNextAlpha = GetNextAxisAlpha(sMajorVar[0]);
TCHAR szNextStr[2] = _T("");
szNextStr[0] = cNextAlpha;
szNextStr[1] = EOS;
sNextMajor << szNextStr;
}
sNextTemp << sNextMajor;
}
}
sNextNo = sNextTemp;
return TRUE;
}
*/
BOOL XAxisNoParser::GetNext(XString &sNextNo, BOOL bNextIsMajor) const
{
if (!(*this)) // 当前轴号位空
{
sNextNo = _T("");
return TRUE;
}
// 首先判断是否含有附加轴号(分子),分子存在,并且是数字,才返回TRUE
int nSubNo = 0;
BOOL bHasSubNo = GetSubNo(nSubNo);
// 求主轴号,如果含有“/0”,则返回0,其他,返回1
XString szMajorNo;
int nRetCode = GetMajorNo(szMajorNo);
// 求分区号,分区号用_T('-')分割
XString szRegionNo, szRegPrefix;
if (GetRegionNo(szRegionNo))
{
szRegPrefix << szRegionNo << _T("-");
}
XString szTempNext;
if (bHasSubNo) // 当前是附加轴号
{
if (nRetCode == 0) // 分母首位是0
{
if (nSubNo==1 || bNextIsMajor) // 变主轴号
{
szTempNext << szRegPrefix << szMajorNo;
}
else // 前置的附加号,分子自减,分母不变
{
nSubNo--;
szTempNext << nSubNo << _T("/") << szRegPrefix << _T("0") << szMajorNo;
}
}
else if (bNextIsMajor) // 下一个是主轴号,附加轴号变主轴号
{
XString szOld;
szOld << szRegPrefix << szMajorNo;
GetNext(szOld, szTempNext);
}
else // 下一个是附加轴号,分子自加,分母不变
{
nSubNo++;
szTempNext << nSubNo << _T("/") << szRegPrefix << szMajorNo;
}
}
else // 当前是主轴号
{
if (bNextIsMajor) // 下一个是主轴号,变前项,变后项
{
XString szOld;
szOld << szRegPrefix << szMajorNo;
GetNext(szOld, szTempNext);
}
else // 下一个是附加轴号,变为附加轴号
{
szTempNext << _T("1/") << szRegPrefix << szMajorNo;
}
}
sNextNo = szTempNext;
return TRUE;
}
// sg add 100531,求前一根轴号
// bPreIsMajor——前一根性质是主轴线嘛
BOOL XAxisNoParser::GetPre(XString &sPreNo, BOOL bPreIsMajor) const
{
if (!(*this)) // 空号
{
sPreNo = _T("");
return TRUE;
}
// 首先判断是否含有附加轴号(分子),分子存在,并且是数字,才返回TRUE
int nSubVar = 0;
BOOL bHasSubNo = GetSubNo(nSubVar);
// 如果不是附加轴号,根据8.5需求,只对单个字母和单个数字的首个主轴号进行推导,组合形式,返回空
if (!bHasSubNo)
{
INT_PTR nLength = _tcslen(str);
if (!IsDigital(str)) // 根据8.5需求,只对单个字母和单个数字的首个主轴号进行推导,组合形式,返回空
{
if (nLength > 1)
{
sPreNo = _T("");
return TRUE;
}
}
}
// 求主轴号,如果含有“/0”,则返回0,其他,返回1
XString szMajorNo;
int nRetCode = GetMajorNo(szMajorNo);
XString sPreTemp(256);
if (bPreIsMajor) // 前一个为主轴号
{
if (IsDigital(szMajorNo)) // 数字
{
sPreTemp << _T("1");
}
else // 字母
{
sPreTemp << _T("A");
}
}
else // 前一个为附加轴号
{
if (bHasSubNo) // 当前轴号是附加轴号
{
nSubVar++;
sPreTemp << nSubVar << _T("/0") << szMajorNo;
}
else //当前轴号是主轴号
{
sPreTemp << _T("1/0") << szMajorNo;
}
}
sPreNo = sPreTemp;
return TRUE;
}
// 求下一根轴号
// bNextIsMajor--下一根性质是主轴线吗
// 如:_T("2-3/AB")回传_T("2-4/AB")或_T("2-AC")
BOOL XAxisNoParser::GetNext(BOOL bNextIsMajor)
{
XString sNextNo;
if (!GetNext(sNextNo, bNextIsMajor))
return FALSE;
*(XString *)this = sNextNo;
return TRUE;
}
int NextNo()
{
resbuf *rbArgs = ads_getargs();
RBList rbTemp(rbArgs);
if (!rbArgs || rbArgs->restype!=RTSTR)
return RTERROR;
XString sAxisNo;
sAxisNo = rbArgs->resval.rstring;
rbArgs = rbArgs->rbnext;
if (!rbArgs || rbArgs->restype!=RTSHORT)
return RTERROR;
int bMajor = rbArgs->resval.rint;
XAxisNoParser parser(sAxisNo);
if (!parser.GetNext(bMajor))
{
adsout << _T("\nError No");
}
// adsout << _T("\n") << parser;
ads_retstr(parser);
return RTNORM;
}
// add by xly on 100816 判断主轴号是否含有分区
// 如:1——>/01; AA——>/0AA; 1-1——>/1-01; 1-A——>/1-01
bool XAxisNoParser::GetRegion(CString &csMajorAxis)
{
CString csOld = csMajorAxis,csNew;
int iPos = csMajorAxis.Find(_T("-"));
if (iPos > -1)// 含有分区号
{
csMajorAxis = _T("/");
csMajorAxis += csOld.Left(iPos+1);
csMajorAxis += _T("0");
csMajorAxis += csOld.Right(csOld.GetLength()-iPos-1);
return true;
}
// 不含分区号,只有字母或者数字的组合
csMajorAxis = _T("/0");
csMajorAxis += csOld;
return false;
}