308上位机VC MFC数据库与CAD接口SCR DXF结合使用
数据库与CAD接口SCR DXF结合使用
功能展示
有时从数据库读取的数据要保存为CAD接口文件,CAD的接口文件有DXF 及SCR,我们当前例程实现从数据库读取文件,然后将读取的数据保存为DXF文件或SCR文件,效果如图,点击<生成DXF文件>或<生成SCR文件>可以生成对应的CAD接口文件,点击<绘制图形>可以将当前记录集字段信息绘制到例程界面右侧;
要点提示
1.CAD接口的两接口,DXF及SCR都有详细的格式介绍说明手册,我们例程就不作介绍,大家可以网络下载,或直接向我索取;
2. Cpen等对象要多次调用创建数如CreatePen(),记得事先调用DeleteObject()函数,不然程序会报错;
3.另外ofstream 的使用得包含其所在头文件#include <fstream.h>
实现功能
1.利用例程根目录数据库文件DXF_SCR_DATABASE.MDB创建一数据源ZhouCheng;
2.新建一基于事先创建的数据源单文档应用程序,记录集选Basic,具体参数视频演示;
3.stdafx.h头文件中包含#include <fstream.h>,按照例程界面,依次添加五编辑框,关联数据库对应字段,添加三按钮<生成DXF文件><生成 SCR文件><绘制 图形>关联按钮对应点击函数
void CGkbc8View::OnPaintDxf()
{
long d,D,b;
D=m_pSet->m_D1;//从数据库中取出数据
d=m_pSet->m_d2;//从数据库中取出数据
b=m_pSet->m_b;//从数据库中取出数据
//<>开始绘图打开文件
FILE *fp;
fp=fopen("轴承.dxf","w");
fprintf(fp," 0\nSECTION\n 2\nENTITIES\n");//写入DXF文件区域头
//<>
line(fp,-b/2+30,D/2,b/2+30,D/2);//绘外径投影线
line(fp,-b/2+30,d/2,b/2+30,d/2);//绘内径投影线
line(fp,-b/2+30,-d/2,b/2+30,-d/2);//绘左垂直线
line(fp,-b/2+30,-D/2,b/2+30,-D/2);//绘右垂直线
line(fp,-b/2+30,D/2,-b/2+30,-D/2);//绘内径投影线
line(fp,b/2+30,D/2,b/2+30,-D/2);//绘外径投影线
//<>绘上十字
line(fp,30-3,d/2+(D/2-d/2)/2,30+3,d/2+(D/2-d/2)/2);
line(fp,30,d/2+(D/2-d/2)/2-3,30,d/2+(D/2-d/2)/2+3);
//<>绘下十字
line(fp,30-3,-(d/2+(D/2-d/2)/2),30+3,-(d/2+(D/2-d/2)/2));
line(fp,30,-(d/2+(D/2-d/2)/2)-3,30,-(d/2+(D/2-d/2)/2)+3);
fprintf(fp," 0\nENDSEC\n 0\nEOF\n"); //<>关闭文件
fclose(fp);
}
void CGkbc8View::OnPaintScr()
{
long d,D,b;
D=m_pSet->m_D1;//从数据库中取出数据
d=m_pSet->m_d2;//从数据库中取出数据
b=m_pSet->m_b;//从数据库中取出数据
//<>
ofstream file;//文件指针
file.open("轴承.scr",ios:ut);//生成或打开文件
//确定绘图界限
file<<"LIMITS"<<' '<<-0.0<<','<<-50.0<<' '<<60.0<<','<<50.0<<'\n';
//全屏显示
file<<"ZOOM"<<' '<<"A"<<'\n';
file<<"LINE"<<' '<<-b/2+30<<','<<D/2<<' '<<b/2+30<<','<<D/2<<'\n'<<'\n';//绘外径投影线
file<<"LINE"<<' '<<-b/2+30<<','<<d/2<<' '<<b/2+30<<','<<d/2<<'\n'<<'\n';//绘内径投影线
file<<"LINE"<<' '<<-b/2+30<<','<<-d/2<<' '<<b/2+30<<','<<-d/2<<'\n'<<'\n';//绘左垂直线
file<<"LINE"<<' '<<-b/2+30<<','<<-D/2<<' '<<b/2+30<<','<<-D/2<<'\n'<<'\n';//绘右垂直线
file<<"LINE"<<' '<<-b/2+30<<','<<D/2<<' '<<-b/2+30<<','<<-D/2<<'\n'<<'\n';//绘内径投影线
file<<"LINE"<<' '<<b/2+30<<','<<D/2<<' '<<b/2+30<<','<<-D/2<<'\n'<<'\n';//绘外径投影线
//<>绘上十字
file<<"LINE"<<' '<<30-3<<','<<d/2+(D/2-d/2)/2<<' '<<30+3<<','<<d/2+(D/2-d/2)/2<<'\n'<<'\n';
file<<"LINE"<<' '<<30<<','<<d/2+(D/2-d/2)/2-3<<' '<<30<<','<<d/2+(D/2-d/2)/2+3<<'\n'<<'\n';
//绘下十字
file<<"LINE"<<' '<<30-3<<','<<-(d/2+(D/2-d/2)/2)<<' '<<30+3<<','<<-(d/2+(D/2-d/2)/2)<<'\n'<<'\n';
file<<"LINE"<<' '<<30<<','<<-(d/2+(D/2-d/2)/2)-3<<' '<<30<<','<<-(d/2+(D/2-d/2)/2)+3<<'\n'<<'\n';
//关闭文件
file.close();
}
void CGkbc8View::OnDrawdxf()
{
long d,D,b;
D=m_pSet->m_D1*4;//取出数据库中轴承数据适当放大
d=m_pSet->m_d2*4;
b=m_pSet->m_b*4;
CDC*pDC=GetDC();//获取设备
CBrush Brush;//定义画刷
Brush.CreateSolidBrush(RGB(255,255,255));//创建画刷并置白色色
pDC->SelectObject(Brush);//选择白色画刷
pDC->Rectangle(600,0,200,500);//把此范围内的背景刷为白色
CPen Pen;//定义画笔
Pen.CreatePen(PS_DASH,1,RGB(255,0,0));//创建画笔并置红色
pDC->SelectObject(Pen);//选择画笔
pDC->SetViewportOrg(300,150);//确定绘图中心点
pDC->MoveTo(0,120);//把画笔移动到
pDC->LineTo(0,-120);//画线
pDC->MoveTo(-120,0);//移动画笔
pDC->LineTo(120,0);//画线
Pen.DeleteObject();//删除画笔
Pen.CreatePen(PS_SOLID,2,RGB(55,55,255));//创建画笔并置兰色
pDC->SelectObject(Pen);//选择画笔
pDC->MoveTo(-b/2,-D/2);//移动
pDC->LineTo(b/2,-D/2);//画线
pDC->LineTo(b/2,D/2);
pDC->LineTo(-b/2,D/2);
pDC->LineTo(-b/2,-D/2);
pDC->MoveTo(-b/2,-d/2);
pDC->LineTo(b/2,-d/2);
pDC->MoveTo(-b/2,d/2);
pDC->LineTo(b/2,d/2);
//画第一个十字
pDC->MoveTo(-5,d/2+(D/2-d/2)/2);
pDC->LineTo(5,d/2+(D/2-d/2)/2);
pDC->MoveTo(0,d/2+(D/2-d/2)/2+5);
pDC->LineTo(0,d/2+(D/2-d/2)/2-5);
//画第二个十字
pDC->MoveTo(-5,-(d/2+(D/2-d/2)/2));
pDC->LineTo(5,-(d/2+(D/2-d/2)/2));
pDC->MoveTo(0,-(d/2+(D/2-d/2)/2)+5);
pDC->LineTo(0,-(d/2+(D/2-d/2)/2)-5);
Pen.DeleteObject(); //删除画笔
Brush.DeleteObject();
}
上面按钮函数中还调用了一自定义函数line (),函数体可以例程查看
我们来演示下功能实现的整个过程
|