Files
envi-code/SourceCode/Code2026/tg_shs/shs_kernal/AxisNoParser.cpp
T

824 lines
17 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#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;
}