232 lines
5.0 KiB
C++
232 lines
5.0 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);
|
|
} |