#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>(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<-1) { TPatData *pLine=new TPatData; *pLine<>(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<IsEmpty()) delete pPat; else pats<>(CStdioFile&ar)//ok { for(pats.MoveToFirst();!pats.IsOut();pats.MoveToNext()) pats.GetCurPData()>>ar; } //在pat文件中指定某个填充模式进行比例缩放 BOOL TARCH_EXP ChPatternScale(const TCHAR *szFile, const TCHAR *szPattern, double nScale) { CStdioFile file; if(!file.Open(szFile,CFile::modeReadWrite)) return FALSE; TPats pats; 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); }