📄 paintdoc.cpp
字号:
}
return 0;
}
void CPaintobjDoc::SaveBin(CArchive& ar,UINT ver)
{
char str1='W';
USHORT version=ver;
CTime Time = CTime::GetCurrentTime();
CString str3="GOOD MORNING";
if(ver!=1)
{
ar<<str1;
ar<<version;
ar<<Time;
ar<<str3;
}
ar<<(USHORT) m_Objectsnode.GetSize();
// Load the nodes data one by one
for (USHORT i = 0; i < m_Objectsnode.GetSize(); i++)
{
CNode* pNode = m_Objectsnode[i];
ar << pNode->m_uId;
ar << pNode->m_uType;
if(ver!=1)
{
ar << pNode->m_uExtType;
}
ar << pNode->x;
ar << pNode->y;
if(ver!=1)
{
ar <<pNode->m_fHeading;
}
}
ar << (USHORT) m_Objectspath.GetSize();
// Save the path objects one by one
for (USHORT j = 0; j < m_Objectspath.GetSize(); j++)
{
CPath* pPath = m_Objectspath[j];
// First, Save the type of path
ar << pPath->m_uType;
ar << pPath->m_uId;
ar << pPath->m_uStartNode;
ar << pPath->m_uEndNode;
ar << pPath->m_fVeloLimit;
ar << pPath->m_uGuideType;
if(ver!=1)
{
ar << pPath->m_uExtType;
}
// LINE_TYPE, SPP_TYPE, SPLINE_TYPE, SCP_TYPE, SIDE_TYPE,
// LAZY_S_TYPE,ARC_TYPE
//直线路径
if(pPath->m_uType==LINE_TYPE)
{
ar << ((CLinePath*) pPath)->m_uObstacle;
ar << ((CLinePath*) pPath)->m_uHeading;
}
//圆弧路径
else if(pPath->m_uType==SPP_TYPE || pPath->m_uType==SPLINE_TYPE || pPath->m_uType==ARC_TYPE)
{
ar << ((CArcPath*) pPath)->m_uObstacle;
ar << ((CArcPath*) pPath)->m_uHeading;
ar << ((CArcPath*) pPath)->m_fCenterx;
ar << ((CArcPath*) pPath)->m_fCentery;
ar << ((CArcPath*) pPath)->m_uDirection;
}
//懒-S路径
else if(pPath->m_uType==LAZY_S_TYPE)
{
ar << ((CLazysPath*) pPath)->m_angStart;
}
//其他路径
}
}
void CPaintobjDoc::SaveText(CString name,UINT ver)
{
FILE *fp;
fp=fopen(name,"w");
//ar << m_Objectsnode.GetSize();
CTime Time = CTime::GetCurrentTime();
//CTime t( 1999, 3, 19, 22, 15, 0 );
// 10:15PM March 19, 1999
CString s = Time.Format( "%A, %B %d, %Y, %H : %M : %S" );
if(ver!=1)
{
fprintf(fp,"%s\n","W");
fprintf(fp,"%d\n",ver);
fprintf(fp,"%s\n",s);
fprintf(fp,"%s\n","GOOD MORNING");
}
fprintf(fp,"%d\n",m_Objectsnode.GetSize());
// Load the nodes data one by one
for (USHORT i = 0; i < m_Objectsnode.GetSize(); i++)
{
CNode* pNode = m_Objectsnode[i];
//ar << pNode->m_uId << pNode->m_uType << pNode->m_uExtType
//<< pNode->x << pNode->y<<pNode->m_fHeading;
if(ver==1)
{
fprintf(fp,"%d, %d, %f, %f\n",pNode->m_uId,pNode->m_uType,pNode->x,pNode->y);
}
else
{
fprintf(fp,"%d, %d, %d, %f, %f, %f\n",pNode->m_uId,pNode->m_uType,pNode->m_uExtType,pNode->x,pNode->y,pNode->m_fHeading);
}
}
//ar << m_Objectspath.GetSize();
fprintf(fp,"%d\n",m_Objectspath.GetSize());
// Save the path objects one by one
for (USHORT j = 0; j < m_Objectspath.GetSize(); j++)
{
CPath* pPath = m_Objectspath[j];
// First, Save the type of path
//ar << pPath->m_uType;
fprintf(fp,"%d\n",pPath->m_uType);
if(pPath->m_uType==0)
{
// ar << pPath->m_uId
// << pPath->m_uStartNode
// << pPath->m_uEndNode
// << pPath->m_fVeloLimit
// << pPath->m_uGuideType
// << pPath->m_uExtType
// << ((CLinePath*) pPath)->m_uObstacle
// << ((CLinePath*) pPath)->m_uHeading;
if(ver==1)
{
fprintf(fp,"%d, %d, %d, %f, %d, %d, %d\n",pPath->m_uId,pPath->m_uStartNode,pPath->m_uEndNode,pPath->m_fVeloLimit,pPath->m_uGuideType,((CLinePath*) pPath)->m_uObstacle,((CLinePath*) pPath)->m_uHeading);
}
else
{
fprintf(fp,"%d, %d, %d, %f, %d, %d, %d, %d\n",pPath->m_uId,pPath->m_uStartNode,pPath->m_uEndNode,pPath->m_fVeloLimit,pPath->m_uGuideType,pPath->m_uExtType,((CLinePath*) pPath)->m_uObstacle,((CLinePath*) pPath)->m_uHeading);
}
}
else if(pPath->m_uType==1 || pPath->m_uType==2)
{
// ar <<pPath->m_uId
// << pPath->m_uStartNode
// << pPath->m_uEndNode
// << pPath->m_fVeloLimit
// << pPath->m_uGuideType
// << pPath->m_uExtType
// << ((CArcPath*) pPath)->m_uObstacle
// << ((CArcPath*) pPath)->m_uHeading
// << ((CArcPath*) pPath)->m_fCenterx
// << ((CArcPath*) pPath)->m_fCentery
// << ((CArcPath*) pPath)->m_uDirection;
if(ver==1)
{
fprintf(fp,"%d, %d, %d, %f, %d, %d, %d, %f, %f, %d\n",pPath->m_uId,pPath->m_uStartNode,pPath->m_uEndNode,pPath->m_fVeloLimit,pPath->m_uGuideType,((CLinePath*) pPath)->m_uObstacle,((CLinePath*) pPath)->m_uHeading,((CArcPath*) pPath)->m_fCenterx,((CArcPath*) pPath)->m_fCentery,((CArcPath*) pPath)->m_uDirection);
}
else
{
fprintf(fp,"%d, %d, %d, %f, %d, %d, %d, %d, %f, %f, %d\n",pPath->m_uId,pPath->m_uStartNode,pPath->m_uEndNode,pPath->m_fVeloLimit,pPath->m_uGuideType,pPath->m_uExtType,((CLinePath*) pPath)->m_uObstacle,((CLinePath*) pPath)->m_uHeading,((CArcPath*) pPath)->m_fCenterx,((CArcPath*) pPath)->m_fCentery,((CArcPath*) pPath)->m_uDirection);
}
}
}
fclose(fp);
}
void CPaintobjDoc::Create(CArchive& ar)
{
int count;
// Blank the node base if neccessary
m_Objectsnode.RemoveAll();
// Load the total number of nodes
ar >> count;
// Load the nodes data one by one
for (USHORT i = 0; i < count; i++)
{ m_pNode= new CNode;
ar >> m_pNode->m_uId;
ar>> m_pNode->m_uType;
ar>> m_pNode->m_uExtType;
ar>> m_pNode->x;
ar>> m_pNode->y;
ar>> m_pNode->m_fHeading;
m_Objectsnode.Add(m_pNode);
//delete m_pNode;
m_pNode = NULL;
}
// Clear the old path base
m_Objectspath.RemoveAll();
ar >> count;
// Init the path objects one by one
for (USHORT j = 0; j <count; j++)
{
CPath* pPath;
USHORT uType;
// First, load the type of path
ar >> uType;
// Init the other path object data, according to the path type
if(uType==0)
{
pPath = new CLinePath;
ar >> pPath->m_uId
>> pPath->m_uStartNode
>> pPath->m_uEndNode
>> pPath->m_fVeloLimit
>> pPath->m_uGuideType
>> pPath->m_uExtType
>> ((CLinePath*) pPath)->m_uObstacle
>> ((CLinePath*) pPath)->m_uHeading;
pPath->m_uType = uType;
m_Objectspath.Add(pPath);
//delete pPath;
pPath = NULL;
}
else if(uType==1)
{
pPath = new CArcPath;
ar >>pPath->m_uId
>> pPath->m_uStartNode
>> pPath->m_uEndNode
>> pPath->m_fVeloLimit
>> pPath->m_uGuideType
>> pPath->m_uExtType
>> ((CArcPath*) pPath)->m_uObstacle
>> ((CArcPath*) pPath)->m_uHeading
>> ((CArcPath*) pPath)->m_fCenterx
>> ((CArcPath*) pPath)->m_fCentery
>> ((CArcPath*) pPath)->m_uDirection;
pPath->m_uType = uType;
m_Objectspath.Add(pPath);
//delete pPath;
pPath = NULL;
}
}
}
void CPaintobjDoc::OnOutputSaveoutdata()
{
// TODO: Add your command handler code here
GetData();
//m_bSaveOutdata= TRUE;
char szFilter[]="其它格式文件 (*.*)|*.*|地图数据文件 1.0 (*.bin1)|*.bin1|地图数据文件 2.0 (*.bin2)|*.bin2||";
CMyFileDialog myfiledialog(FALSE, "", "world.bin1",
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
szFilter,
AfxGetMainWnd());
myfiledialog.m_ofn.lpstrTitle="存储地图数据文件";
if(myfiledialog.DoModal()==IDOK)
{
CString extname;
myfiledialog.m_filetitle=myfiledialog.GetFileTitle();
myfiledialog.m_fileextname=myfiledialog.GetFileExt();
extname=myfiledialog.m_fileextname;
extname.MakeLower();
UINT ver=0;
if(extname=="bin1")
{
ver=1;
}
else if(extname=="bin2")
{
ver=2;
}
else
{
AfxMessageBox("请重新选择规定的数据文件格式,此次操作不成功!");
return;
}
CString name=myfiledialog.m_filetitle+"."+myfiledialog.m_fileextname;
CString name1=myfiledialog.m_filetitle+".txt";
SaveText(name1,ver);//文本方式存储
CFile f;
if(!f.Open(name, CFile::modeCreate|CFile::modeWrite))
{
AfxMessageBox("打开文件不成功!");
return;
}
CArchive ar1( &f, CArchive::store);
SaveBin(ar1,ver);//二进制方式存储
ar1.Close();
f.Close();
}
}
void CPaintobjDoc::OnToolClockwisearc()
{
/* // TODO: Add your command handler code here
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSelectedTool = ID_TOOL_CLOCKWISEARC;
GenerateTool();
*/
}
void CPaintobjDoc::OnToolAnticlockwisearc()
{
/* // TODO: Add your command handler code here
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSelectedTool = ID_TOOL_ANTICLOCKWISEARC;
GenerateTool();
*/
}
BOOL CPaintobjDoc::WriteClipBoard()
{
int n_Num[2];//存放各图形元素的数量
int n_Long[2];//每类图形元素形成的字符串长度
LONG LongChar;//用来存放字符串总的长度
char *p_Char;
//double m_minx,m_miny,m_maxx,m_maxy;//用于得到插入基点
double minx,miny;//用于得到插入基点
//为剪裁板注册一个数据格式DrawFormat
DrawFormat=::RegisterClipboardFormat("MyAppText");
HGLOBAL HMem;
char *pMem;
n_Long[0]=125;//每个直线对象占用的字符串长度
n_Long[1]=218;//每个圆弧对象占用的字符串长度
n_Num[0]=0;
n_Num[1]=0;
//得到选中图形中各类图形元素的数目
for(int i=0;i<m_nGraphSelect;i++)
n_Num[GraphSelect[i].Type]++;
LongChar=10+26;//存放图形元素的数目和插入基点坐标需要的字节
//得到存放所有图形元素需要的字节
for(i=0;i<2;i++)
LongChar+=n_Long[i]*n_Num[i];
//以下得到所有选中图形元素的矩形边界并得到插入基点
for(i=0;i<m_nGraphSelect;i++)
{ double minx1,miny1,maxx1,maxy1;
CPainted* pPainted;
pPainted =GetShape(GraphSelect[i].Index);
pPainted->GetBoundingRect(minx1,miny1,maxx1,maxy1);
if(i==0)//如果是第一个图形元素
{ minx=minx1;
miny=miny1;
}
else//不是第一个图形元素,比较得到插入基点
{
if(minx>minx1) minx=minx1;
if(miny>miny1) miny=miny1;
}
}
//分配LongChar+1字节长的全局堆
HMem=(char *)::GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE,LongChar+1);
if(HMem==NULL)
return FALSE;
p_Char=new char[LongChar+1];//分配LongChar+1字节长的字符串
if(p_Char==NULL)
{
HMem=0;
return FALSE;
}
//将各图形元素数目转变成字符串并加入到p_Char中
char p1[11];
sprintf(p1,"%4d,%4d\n",n_Num[0],n_Num[1]);
strcpy(p_Char,p1);
//将插入基点坐标转变成字符串并加入到p_Char中
char p2[27];
sprintf(p2,"%12.4f,%12.4f\n",minx,miny);
lstrcat(p_Char,p2);
//对各图形元素循环,调用各自toChar函数转变数据成员到字符串
for(int j=0;j<2;j++)
{
for(i=0;i<m_nGraphSelect;i++)
{
CPainted* pPainted;
if(GraphSelect[i].Type==0&&j==0)//直线
{
pPainted =GetShape(GraphSelect[i].Index);
pPainted->toChar(p_Char);
}
else if(GraphSelect[i].Type==1&&j==1)//圆弧
{
pPainted =GetShape(GraphSelect[i].Index);
pPainted->toChar(p_Char);
}
}
}
pMem=(char *)::GlobalLock(HMem);//锁定并得到全局内存块的字符指针
if(pMem==NULL)
{
delete []p_Char;
return FALSE;
}
::lstrcpy(pMem,p_Char);//将字符串拷贝到全局内存块
::GlobalUnlock(HMem);//打开对句柄的锁定
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -