Files
envi-code/SourceCode/Code2026/tg_shs/shs_utility/PatEdit.cpp
T
2026-09-28 15:28:50 +08:00

232 lines
4.9 KiB
C++

#include "stdafx.h"
#include "patedit.h"
void TPatData::CheckLength()//ok
{
long len=0;
for(data.MoveToFirst();!data.IsOut();data.MoveToNext())
len+=data.GetCurData().GetLength();
len+=data.GetLastIndex();//add _T(',')
if(len<81)
return;
data.MoveToFirst();
if(data.IsOut())
return;
data.GetCurData()=CString(_T(";;?"))+data.GetCurData();
AfxMessageBox(_T("一个数据行的长度超过了80个字符,该行起始处已加上“;;?”标志,\
\n请找到出现“;;?”标志的数据行,手动调整数据精度使长度不超过80个字符,\
\n最后去掉“;;?”标志!"));
}
void TPatData::Scale(double s)//ok
{
for(data.MoveTo(1);!data.IsOut();data.MoveToNext())
{
CString &curData=data.GetCurData();
double d=_tstof(curData);
curData.Format(_T("%.10f"),d*s);
//优化长度
for(int i=curData.GetLength()-1;i>0;i--)
{
if(curData[i]==_T('.'))//last
{
i--;
break;
}
else if(curData[i]==_T('0'))//continue
continue;
else//end
break;
}
//总长最大10个字符,除非数据大于等于1E10
if(i>9&&d<1E10)
i=9;
if(i<curData.GetLength()-1)
curData=curData.Left(i+1);
}
}
void TPatData::operator>>(CStdioFile&ar)//ok
{
CheckLength();
CString s;
data.MoveToFirst();
s+=data.GetCurData();
for(data.MoveToNext();!data.IsOut();data.MoveToNext())
s+=CString(_T(","))+data.GetCurData();
ar.WriteString(s);
ar.WriteString(_T("\n"));
}
void TPatData::operator<<(const CString&s)//ok
{
data.Clear();
long startPos=0;
bool bContinue=true;
while(bContinue)
{
long endPos=s.Find(_T(','),startPos);
if(endPos==-1)
{
endPos=s.GetLength();
bContinue=false;
}
data.AddTail(s.Mid(startPos,endPos-startPos));
startPos=endPos+1;
}
}
void TPatData::AppendListCtrl(CListCtrl&list)//ok
{
long i=list.GetItemCount();
list.InsertItem(i,_T(""));
for(data.MoveToFirst();!data.IsOut();data.MoveToNext())
if(data.GetCur()<7)
list.SetItemText(i,data.GetCur(),data.GetCurData());
}
void TPat::Scale(double s)//ok
{
for(lines.MoveToFirst();!lines.IsOut();lines.MoveToNext())
lines.GetCurPData().Scale(s);
}
bool TPat::operator<<(const CString&s)//ok
{
if(s.Find(_T(';'))>-1||s.Find(_T('*'))>-1)//注释或名称描述
{
if(!name.IsEmpty())
return false;
else
name<<s;
}
else if(s.Find(_T(','))>-1)
{
TPatData *pLine=new TPatData;
*pLine<<s;
lines<<pLine;
}
return true;
}
void TPat::operator>>(CStdioFile &ar)//ok
{
name>>ar;
for(lines.MoveToFirst();!lines.IsOut();lines.MoveToNext())
lines.GetCurPData()>>ar;
}
void TPat::Update(CListCtrl& list)//ok
{
list.DeleteAllItems();
for(lines.MoveToFirst();!lines.IsOut();lines.MoveToNext())
{
TPatData& line=lines.GetCurPData();
line.AppendListCtrl(list);
}
}
void TPats::operator<<(CStdioFile&ar)//ok
{
CString temp;
TPat *pPat=new TPat;
while(ar.ReadString(temp))
{
if(!(*pPat<<temp))
{
pats<<pPat;
pPat=new TPat;
*pPat<<temp;
}
}
if(pPat->IsEmpty())
delete pPat;
else
pats<<pPat;
}
void TPats::operator>>(CStdioFile&ar)//ok
{
for(pats.MoveToFirst();!pats.IsOut();pats.MoveToNext())
pats.GetCurPData()>>ar;
}
//在pat文件中指定某个填充模式进行比例缩放
BOOL TUTIL_IMPEXP ChPatternScale(const TCHAR *szFile, const TCHAR *szPattern, double nScale)
{
CStdioFile file;
if(!file.Open(szFile,CFile::modeReadWrite))
return FALSE;
TPats pats;
pats<<file;//load
long i=pats.Find(szPattern);
if(i==NOT_FOUND)
return FALSE;
pats[i].Scale(nScale);
file.SetLength(0);
pats>>file;//store
return TRUE;
}
int ChPattern()
{
XString sPattern;
double nScale=0.0;
resbuf *rbArg=ads_getargs();
RBList rb(rbArg);
if(!rbArg || rbArg->restype!=RTSTR)
return RTERROR;
else sPattern=rbArg->resval.rstring;
resbuf *rbNext=rbArg->rbnext;
if(!rbNext)
return RTERROR;
if(rbNext->restype==RTREAL)
nScale=rbNext->resval.rreal;
else if(rbNext->restype==RTSHORT)
nScale=rbNext->resval.rint;
else if(rbNext->restype==RTLONG)
nScale=rbNext->resval.rlong;
else
return RTERROR;
if(fabs(nScale)<1.0E-6)
return RTERROR;
XString sFile1, sFile2;
if(FindFile(_T("acad.pat"), sFile1)) {
ChPatternScale(sFile1, sPattern, nScale);
XPathParser paser(sFile1);
sFile2 << paser.m_sDir << paser.m_sDir << _T("acadiso.pat");
CopyFile(sFile1, sFile2, FALSE);
}
return RTNORM;
}
BOOL MakeNewPat(const TCHAR *sPatName,int type)//新建直排图案,sPatName代表图案名,typ=1代表直排,type=0代表斜排
{
int code=type==0?RTNIL:RTT;
RBList rbCmd=ads_buildlist(RTSTR, _T("c:MakePat"), RTSTR, sPatName,code,NULL);
resbuf *rbRes=NULL;
if(ads_invoke(rbCmd, &rbRes)==RTNORM)
{
if(rbRes!=NULL)
ads_relrb(rbRes);
return TRUE;
}
return FALSE;
}
void ErasePat(const TCHAR *sPatName)//删除图案,sPatName代表图案名
{
RBList rbCmd=ads_buildlist(RTSTR, _T("c:ErasePat"), RTSTR, sPatName,NULL);
resbuf *rbRes=NULL;
if(ads_invoke(rbCmd, &rbRes)==RTNORM)
{
if(rbRes!=NULL)
ads_relrb(rbRes);
}
}
BOOL RemakePat(const TCHAR *sPatName,int type)//重建图案,参数含义同MakeNewPat
{
ErasePat(sPatName);
return MakeNewPat(sPatName,type);
}