📄 baseview.cpp
字号:
// BaseView.cpp : implementation of the CBaseView class
//
#include "stdafx.h"
#include "SlsPrj.h"
#include "MainFrm.h"
#include "ChildFrm.h"
#include "StlDoc.h"
#include "BaseView.h"
#include "ManuOption.h"
#include <time.h>
#include <conio.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBaseView
IMPLEMENT_DYNCREATE(CBaseView, CView)
BEGIN_MESSAGE_MAP(CBaseView, CView)
//{{AFX_MSG_MAP(CBaseView)
ON_COMMAND(ID_STOP, OnStop)
ON_UPDATE_COMMAND_UI(ID_STOP, OnUpdateStop)
ON_COMMAND(ID_VIEW_TWIN, OnViewTwin)
ON_UPDATE_COMMAND_UI(ID_VIEW_TWIN, OnUpdateViewTwin)
ON_COMMAND(ID_VIEW_SINGLE, OnViewSingle)
ON_UPDATE_COMMAND_UI(ID_VIEW_SINGLE, OnUpdateViewSingle)
ON_COMMAND(ID_MANUOPTION, OnManuOption)
ON_COMMAND(ID_MANU, OnManu)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBaseView construction/destruction
int CBaseView::m_CurLayerNum = 0;
CBaseView::CBaseView()
{
m_bStop=FALSE;
m_bStartup=FALSE;
time( &m_prevTime );
m_scanSpeed=120;
m_laserPower=15;
}
CBaseView::~CBaseView()
{
}
BOOL CBaseView::PreCreateWindow(CREATESTRUCT& cs)
{
//The return value is a pointer to a static buffer.
m_className = AfxRegisterWndClass(
CS_HREDRAW | CS_VREDRAW,
AfxGetApp()->LoadStandardCursor(IDC_ARROW),
(HBRUSH)::GetStockObject(BLACK_BRUSH),
0);
cs.lpszClass = m_className;
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CBaseView drawing
void CBaseView::OnDraw(CDC* pDC)
{
CStlDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//绘制背景
CRect logRect = m_clientRect;
pDC->DPtoLP( &logRect ); //逻辑坐标
pDC->FillSolidRect(&logRect, RGB(0, 0, 0));
}
/////////////////////////////////////////////////////////////////////////////
// CBaseView diagnostics
#ifdef _DEBUG
void CBaseView::AssertValid() const
{
CView::AssertValid();
}
void CBaseView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CStlDoc* CBaseView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CStlDoc)));
return (CStlDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CBaseView message handlers
void CBaseView::OnViewSingle()
{
CStlDoc* pDoc=GetDocument();
pDoc->UpdateAllViews(NULL, ID_HINT_ONEVIEW);
}
void CBaseView::OnUpdateViewSingle(CCmdUI* pCmdUI)
{
CChildFrame* pParentWnd = (CChildFrame* )GetParent();
pCmdUI->SetCheck( pParentWnd->m_viewOption == ONEVIEW);
}
void CBaseView::OnViewTwin()
{
CStlDoc* pDoc=GetDocument();
pDoc->UpdateAllViews(NULL, ID_HINT_TWOVIEWS);
}
void CBaseView::OnUpdateViewTwin(CCmdUI* pCmdUI)
{
CChildFrame* pParentWnd = (CChildFrame* )GetParent();
pCmdUI->SetCheck( pParentWnd->m_viewOption == TWOVIEWS);
}
BOOL CBaseView::CreateNewWindow(CDocTemplate * pTemplate)
{
CStlDoc* pDoc=GetDocument( );
ASSERT(pDoc);
CFrameWnd* pMDIChildWnd=GetParentFrame( );
ASSERT(pMDIChildWnd);
CFrameWnd* pChildFrame = pTemplate->CreateNewFrame(pDoc,pMDIChildWnd);
if (pChildFrame == NULL)
{
AfxMessageBox("Warning: failed to create new frame!\n");
return FALSE;
}
pTemplate->InitialUpdateFrame(pChildFrame, pDoc);
return TRUE;
}
void CBaseView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CChildFrame* pParentWnd = (CChildFrame* )GetParent();
switch(lHint)
{
case ID_HINT_ONEVIEW:
pParentWnd->m_viewOption = ONEVIEW;
pParentWnd->SetViewSize();
break ;
case ID_HINT_TWOVIEWS:
pParentWnd->m_viewOption = TWOVIEWS;
pParentWnd->SetViewSize();
break ;
}
}
CPoint CBaseView::GetLogicCoordinate( const C2DPoint& pt )
{
CStlDoc* pDoc = GetDocument();
ASSERT(pDoc);
//物理坐标---->规格化坐标
double diameter;
double sizeX = pDoc->m_pathData.m_Solid.m_xMax-
pDoc->m_pathData.m_Solid.m_xMin;
double sizeY = pDoc->m_pathData.m_Solid.m_yMax-
pDoc->m_pathData.m_Solid.m_yMin;
double centerX = (pDoc->m_pathData.m_Solid.m_xMax+
pDoc->m_pathData.m_Solid.m_xMin)/2.0;
double centerY = (pDoc->m_pathData.m_Solid.m_yMax+
pDoc->m_pathData.m_Solid.m_yMin)/2.0;
diameter = sqrt(sizeX * sizeX + sizeY * sizeY);
double originX = centerX - diameter/2.0;
double originY = centerY - diameter/2.0;
double xVal = (pt.m_dX - originX)/diameter;
double yVal = (pt.m_dY - originY)/diameter;
//规格化坐标---->逻辑坐标
CPoint logPt;
logPt.x = int(xVal * ZoomRatio);
logPt.y = int(yVal * ZoomRatio);
return logPt;
}
void CBaseView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
CStlDoc* pDoc = GetDocument();
ASSERT(pDoc);
//设置影射方式
if(pDoc->m_pathData.m_Solid.m_bInitialized)
{
CPoint centroPt;
SIZE viewportExt;
GetClientRect( &m_clientRect ); //设备坐标
centroPt.x=(m_clientRect.left+m_clientRect.right)/2;
centroPt.y=(m_clientRect.bottom+m_clientRect.top)/2;
viewportExt.cx = m_clientRect.Size().cx;
viewportExt.cy = m_clientRect.Size().cy;
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(ZoomRatio, -ZoomRatio);
pDC->SetViewportExt(viewportExt);
pDC->SetWindowOrg(ZoomRatio/2, ZoomRatio/2);
pDC->SetViewportOrg(centroPt);
}
else
{
CView::OnPrepareDC(pDC, pInfo);
}
}
void CBaseView::ReadParamFromAppIniFile()
{
CSlsApp* pSlsApp = ( CSlsApp* )AfxGetApp();
TCHAR strSysSettings[] = _T("System settings");
TCHAR strEntitySettings[] = _T("Entity settings");
TCHAR strBaseParmSettings[] = _T("BaseParm settings");
//Read system settings from the application's INI file
m_scanSpeedX=atof(pSlsApp->GetProfileString(strSysSettings,_T("ScanSpeedX")));
m_scanSpeedY=atof(pSlsApp->GetProfileString(strSysSettings,_T("ScanSpeedY")));
m_zeroSpeed=atof(pSlsApp->GetProfileString(strSysSettings,_T("ZeroSpeed")));
m_platformDown=atof(pSlsApp->GetProfileString(strSysSettings,_T("PlatformDown")));
m_powderUp=atof(pSlsApp->GetProfileString(strSysSettings,_T("PowderUp")));
m_scanWidth=atof(pSlsApp->GetProfileString(strSysSettings,_T("ScanWidth")));
m_layerThickness=atof(pSlsApp->GetProfileString(strSysSettings,_T("LayerThickness")));
m_rotateAngle=atof(pSlsApp->GetProfileString(strSysSettings,_T("RotateAngle")));
m_laserPowerXDir=atof(pSlsApp->GetProfileString(strSysSettings,_T("LaserPowerXDir")));
m_laserPowerYDir=atof(pSlsApp->GetProfileString(strSysSettings,_T("LaserPowerYDir")));
//Read entity settings from the application's INI file
m_centerPosX=atof(pSlsApp->GetProfileString(strEntitySettings,_T("CenterPosX")));
m_centerPosY=atof(pSlsApp->GetProfileString(strEntitySettings,_T("CenterPosY")));
m_startHeight=atof(pSlsApp->GetProfileString(strEntitySettings,_T("StartHeight")));
m_endHeight=atof(pSlsApp->GetProfileString(strEntitySettings,_T("EndHeight")));
//Read base parameters into the application's INI file
m_height=atof(pSlsApp->GetProfileString(strBaseParmSettings,_T("Height")));
}
void CBaseView::InitializePathParam()
{
pathParam pathInitInfo;
CStlDoc* pDoc = GetDocument();
//Read system settings from the application's INI file
pathInitInfo.m_ScanWidth=m_scanWidth;
pathInitInfo.m_LayerThickness=m_layerThickness;
pathInitInfo.m_RotateAngle=m_rotateAngle*PI/180.;
pathInitInfo.m_ScanSpeed=(DWORD)(m_scanSpeed*30000);
pathInitInfo.m_ZeroSpeed=(DWORD)(m_zeroSpeed*30000);
pathInitInfo.m_LaserPower=(((CalculateLaserPower(m_laserPower)) & 0xffffff)|0x3000000);
pathInitInfo.m_PowderUp=(DWORD)(m_powderUp*400);
pathInitInfo.m_PlatformDown=(DWORD)(m_platformDown*400);
pDoc->m_pathData.SetPathParam(pathInitInfo);
}
void CBaseView::OnStop()
{
CStlDoc* pDoc=GetDocument( );
ASSERT(pDoc);
if(AfxMessageBox("停止 ? ", MB_YESNO | MB_ICONSTOP) == IDYES)
{
m_bStop=TRUE;
pDoc->m_pathData.m_IPInfo.SetFlagBit(4);
}
else
{
m_bStop=FALSE;
}
}
void CBaseView::OnUpdateStop(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bStop && m_bStartup);
}
void CBaseView::OnManuOption()
{
CManuOption manuOption;
CSlsApp* pSlsApp = ( CSlsApp* )AfxGetApp();
TCHAR strManuOption[] = _T("Manu option");
manuOption.m_manuOption =
pSlsApp->GetProfileInt(strManuOption,_T("Manu option"),-1);
if(manuOption.DoModal() == IDOK)
{
pSlsApp->WriteProfileInt(strManuOption,_T("Manu option"),
manuOption.m_manuOption);
}
}
void CBaseView::OnManu()
{
CStlDoc* pDoc=GetDocument();
ASSERT(pDoc);
if(!pDoc->m_pathData.m_Solid.m_bInitialized)
return ;
CSlsApp* pSlsApp = ( CSlsApp* )AfxGetApp();
TCHAR strManuOption[] = _T("Manu option");
int manuOption = pSlsApp->GetProfileInt(strManuOption,
_T("Manu option"),-1);
switch(manuOption)
{
case 0:
m_manuMode = SINGLE;
break;
case 1:
m_manuMode = LAMINATEDMANU;
break;
case 2:
m_manuMode = MANUBASE;
break;
case 3:
m_manuMode = SIMULATION;
break;
default:
return;
}
ManuManager(pDoc);
}
void CBaseView::PathLayout()
{
CStlDoc* pDoc=GetDocument();
ASSERT(pDoc);
//修改路径参数
ReadParamFromAppIniFile();
if( (pDoc->m_pathData.m_IPInfo.GetFlagBit(3)) &&
(pDoc->m_pathData.m_IPInfo.GetFlagBit(2)) )
{
bool retVal;
if(pDoc->m_pathData.m_IPInfo.GetFlagBit(9))
{
retVal=CreateBaseData(pDoc->m_pathData.m_scanPath,
++m_CurLayerNum);
}
else
{
retVal=pDoc->m_pathData.CreatePathData(++m_CurLayerNum);
}
if(!retVal)
{
if(pDoc->m_pathData.m_IPInfo.GetFlagBit(9))
{
//基底制造--->叠层制造
m_manuMode = AUTOMANU;
ManuManager(pDoc);
}
else
{
pDoc->m_pathData.m_IPInfo.ResetFlagBit(2);
pDoc->m_pathData.m_IPInfo.ResetFlagBit(3);
pDoc->m_pathData.m_IPInfo.SetFlagBit(5);
}
}
else
{
if(!pDoc->m_pathData.m_IPInfo.GetFlagBit(7))
{
pDoc->m_pathData.m_IPInfo.ResetFlagBit(3);
pDoc->m_pathData.m_IPInfo.SetFlagBit(5);
}
pDoc->m_pathData.m_IPInfo.SetFlagBit(0);
pDoc->m_pathData.m_IPInfo.SetFlagBit(1);
pDoc->m_pathData.m_IPInfo.ResetFlagBit(2);
pDoc->m_pathData.m_IPInfo.SetFlagBit(8);
pDoc->m_pathData.m_IPInfo.m_1thIP = 0;
pDoc->m_pathData.m_IPInfo.m_2thIP = 0;
pDoc->m_pathData.m_IPInfo.m_3thIP = 0;
}
}
//设定X向和Y向扫描速度
if(m_CurLayerNum%2) //Y向扫描
{
m_scanSpeed=m_scanSpeedY;
m_laserPower=m_laserPowerYDir;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -