⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 baseview.cpp

📁 快速原型制造分层切片源代码,适用于高温合金.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -