MFC-Simulator/TestSimulator/BlockOut.cpp
2023-02-03 10:07:52 +08:00

163 lines
4.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdafx.h"
#include "BlockOut.h"
#define PIN_RADIUS 8 //Pin半徑
#define GOLD RGB (255, 215, 0) //Pin腳顏色
#define BLACK RGB (0, 0, 0) //連線顏色
#define NO_VALUE -10 //不存在輸入訊號
#define NO_BLOCK_HEAD -14 //不存在連接Block
#define BLK_OUT 2 //Block種類編號
CBlockOut::CBlockOut ()
{
m_rcPinIn = CRect ();
m_iBlkHeadSize = (int) m_vcBlkHeadPtr.size ();
}
CBlockOut::~CBlockOut ()
{
}
void CBlockOut::SetBlkRect (CPoint ptCenter, int iWidth, int iHeight)
{
CBlockBasis::SetBlkRect (ptCenter, iWidth, iHeight);
m_rcPinIn.left = m_rcBlk.CenterPoint ().x - PIN_RADIUS;
m_rcPinIn.top = m_rcBlk.top - PIN_RADIUS;
m_rcPinIn.right = m_rcBlk.CenterPoint ().x + PIN_RADIUS;
m_rcPinIn.bottom = m_rcBlk.top + PIN_RADIUS;
}
CRect CBlockOut::GetPinIn1Rect () const
{
return m_rcPinIn;
}
CBlockBasis* CBlockOut::GetBlkHead1Ptr (int iIndex) const
{
//回傳指定index的連接指標
if (iIndex < m_iBlkHeadSize)
return m_vcBlkHeadPtr[iIndex];
else
return NULL;
}
void CBlockOut::SetBlkHead1Ptr (CBlockBasis* pBlkHead)
{
m_vcBlkHeadPtr.push_back (pBlkHead); //新增連接指標
}
void CBlockOut::DeleteBlkHead1Ptr (int iIndex)
{
m_vcBlkHeadPtr.erase (m_vcBlkHeadPtr.begin () + iIndex); //清除指定index的連接指標
}
int CBlockOut::GetBlkHead1Num (int iIndex) const
{
//回傳指定index的連接Block編號
if (iIndex < m_iBlkHeadSize)
return m_vcBlkHeadNum[iIndex];
else
return NO_BLOCK_HEAD;
}
void CBlockOut::SetBlkHead1Num (int iHeadBlkNum)
{
m_vcBlkHeadNum.push_back (iHeadBlkNum); //新增連接Block編號
}
void CBlockOut::ClearBlkHead1Num ()
{
std::vector <int> ().swap (m_vcBlkHeadNum); //清空連接編號vector
}
int CBlockOut::GetBlkHeadSize () const
{
return m_iBlkHeadSize; //回傳輸入channel數目
}
void CBlockOut::SetBlkHeadSize (int iFlag)
{
//設定輸入channel數目
if (iFlag == FALSE) //當flag為FALSE時依連接編號vector大小設定
m_iBlkHeadSize = (int) m_vcBlkHeadNum.size ();
else if (iFlag == TRUE) //當flag為TRUE時依連接指標vector大小設定
m_iBlkHeadSize = (int) m_vcBlkHeadPtr.size ();
}
double CBlockOut::GetBlkValue (int iIndex) const
{
//取得指定channel的Block值
if (!m_vcBlkHeadPtr.empty () && iIndex < m_iBlkHeadSize)
return m_vcBlkHeadPtr[iIndex]->GetBlkValue ();
else
return NO_VALUE;
}
int CBlockOut::GetValueFlag (int iIndex) const
{
//取得指定channel的Value旗標
if (!m_vcBlkHeadPtr.empty () && iIndex < m_iBlkHeadSize)
return m_vcBlkHeadPtr[iIndex]->GetValueFlag ();
else
return NO_VALUE;
}
void CBlockOut::Move (CPoint ptCursor)
{
CBlockBasis::Move (ptCursor);
m_rcPinIn.left = m_rcBlk.CenterPoint ().x - PIN_RADIUS;
m_rcPinIn.top = m_rcBlk.top - PIN_RADIUS;
m_rcPinIn.right = m_rcBlk.CenterPoint ().x + PIN_RADIUS;
m_rcPinIn.bottom = m_rcBlk.top + PIN_RADIUS;
}
void CBlockOut::Draw (CDC* pDC)
{
CBrush brushPin (GOLD), * pbrushOld;
pbrushOld = pDC->SelectObject (&brushPin);
pDC->Ellipse (m_rcPinIn);
pDC->SelectObject (pbrushOld);
CBlockBasis::Draw (pDC);
pDC->DrawTextA (_T ("OUT"), -1, &m_rcBlk, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
void CBlockOut::DrawLine (CDC* pDC)
{
if (!m_vcBlkHeadPtr.empty ())
{
CPen penLine (PS_SOLID, 5, BLACK);
CPen* pOldPen;
pOldPen = pDC->SelectObject (&penLine);
for (int i = 0; i < m_iBlkHeadSize; i++)
{
CPoint ptStart = m_vcBlkHeadPtr[i]->GetPinOutRect ().CenterPoint (); //連線起點為輸入Block的輸出Pin腳中心點
CPoint ptEnd = m_rcPinIn.CenterPoint (); //連線終點為此Block的輸入Pin腳中心點
int iGrid = (int) (m_rcBlk.Height () / 2. + 0.5); //垂直格點間隔
int iCornerGridY = (int) (((ptStart.y + ptEnd.y) / 2. - ptStart.y) / iGrid + 0.5); //計算連線轉折處距離輸入Block幾個隔點
int iCornerY = iCornerGridY * iGrid + ptStart.y; //連線轉折處Y座標位置
pDC->MoveTo (ptStart);
pDC->LineTo (CPoint (ptStart.x, iCornerY));
pDC->MoveTo (CPoint (ptStart.x, iCornerY));
pDC->LineTo (CPoint (ptEnd.x, iCornerY));
pDC->MoveTo (CPoint (ptEnd.x, iCornerY));
pDC->LineTo (ptEnd);
}
pDC->SelectObject (pOldPen);
}
}
int CBlockOut::BlkTypeIs () const
{
return BLK_OUT;
}