#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; i1 && !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 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; }