1 #pragma once 2 #include <afxwin.h> 3 #include <memory> 4 #include "project_scjd/YwEmpDataControl.h" 5 #include "cg/fyq_interpreter.h" 6 #include "cg/File_TbCatalog2017.h" 7 class CFyqEntity; 8 class CRuleNodeEntity; 9 class CPositionNodeEntity; 10 class CArrowEntity; 11 class CNodeEntity; 12 typedef shared_ptr<CFyqEntity> EntityPtr; 13 typedef shared_ptr<CRuleNodeEntity> RuleNodePtr; 14 typedef shared_ptr<CPositionNodeEntity> PointNodePtr; 15 typedef shared_ptr<CArrowEntity> ArrowPtr; 16 typedef shared_ptr<CNodeEntity> BaseNodeEntity; 17 18 typedef std::vector<EntityPtr> VecEntity; 19 typedef std::vector<RuleNodePtr> VecRule; 20 typedef std::vector<PointNodePtr> VecPointNode; 21 #define radius 7 22 #define SelectedColor RGB(111, 111, 0) 23 #define NoSelectedColor RGB(118, 238, 0) 24 enum EntityGrade { 25 EG_Arrow, EG_Axis, EG_RuleNode, EG_PositionNode 26 }; 27 enum MenuID { MI_Edit = 1, MI_Delete, MI_AddPositionNode }; 28 29 #define MI_Edit_Tip "编辑" 30 #define MI_Delete_Tip "删除" 31 #define MI_AddPositionNode_Tip "添加坐标" 32 33 class CFyqEntity 34 { 35 36 public: 37 CFyqEntity(); 38 ~CFyqEntity(); 39 virtual int GetGrade() 40 { 41 return -1; 42 } 43 virtual CRect GetBoundingBox() 44 { 45 return m_rect; 46 } 47 virtual void OnDraw(CDC* pDC); 48 virtual void DrawBoundingBox(CDC* pDC); 49 virtual bool UpdateInfo(CWnd* pWnd); 50 virtual vecInt GetMenuIDvec() 51 { 52 vecInt vec; 53 return vec; 54 } 55 public: 56 void SetSelected(bool val); 57 bool bSelected(); 58 bool m_bSelected; 59 CPoint m_Origin;//原点 60 CRect m_rect;//轮廓 61 CString m_sContent;//显示内容 62 }; 63 64 65 class CArrowEntity : public CFyqEntity 66 { 67 public: 68 CArrowEntity(CPoint& origin, CPoint& uppoint, CPoint& downpoint) 69 { 70 m_originPoint = origin; 71 m_upPoint = uppoint; 72 m_downPoint = downpoint; 73 } 74 void SetPoint(CPoint& origin, CPoint& uppoint, CPoint& downpoint) 75 { 76 m_originPoint = origin; 77 m_upPoint = uppoint; 78 m_downPoint = downpoint; 79 m_rect.SetRect(m_upPoint.x, m_upPoint.y, m_originPoint.x, m_downPoint.y); 80 } 81 public: 82 virtual int GetGrade() { return EG_Arrow; } 83 virtual CRect GetBoundingBox(); 84 virtual void OnDraw(CDC* pDC); 85 public: 86 CPoint m_upPoint; 87 CPoint m_downPoint; 88 CPoint m_originPoint; 89 90 }; 91 92 class CAxisEntity : public CFyqEntity 93 { 94 public: 95 CAxisEntity(CPoint& start, CPoint& end); 96 virtual int GetGrade() { return EG_Axis; } 97 virtual CRect GetBoundingBox(); 98 virtual void OnDraw(CDC* pDC); 99 virtual vecInt GetMenuIDvec(); 100 101 public: 102 void SetStartPoint(CPoint &pt); 103 void SetEndPoint(CPoint &pt); 104 void SetArrow(ArrowPtr arrow); 105 private: 106 CPoint m_start; 107 CPoint m_end; 108 ArrowPtr m_Arrow; 109 }; 110 111 class CNodeEntity : public CFyqEntity 112 { 113 public: 114 CNodeEntity(); 115 public: 116 virtual int GetGrade() = 0; 117 virtual CRect GetBoundingBox(); 118 virtual void OnDraw(CDC* pDC); 119 public: 120 void SetRect(CPoint pt1, CPoint pt2); 121 void SetContent(CString val); 122 CString GetContent(); 123 CRect GetRect(); 124 bool GetUpdate() 125 { 126 return m_bupdate; 127 } 128 void SetUpdate(int flag) 129 { 130 m_bupdate = flag; 131 } 132 protected: 133 bool m_bupdate; 134 }; 135 136 class CRuleNodeEntity : public CNodeEntity 137 { 138 public: 139 CRuleNodeEntity(); 140 CRuleNodeEntity(PointNodePtr leftnode,PointNodePtr rightnode,CString& str,int high, int low,int SheetMaxH); 141 ~CRuleNodeEntity(); 142 virtual int GetGrade() { return EG_RuleNode; } 143 virtual void OnDraw(CDC* pDC); 144 virtual bool UpdateInfo(CWnd* pWnd); 145 virtual vecInt GetMenuIDvec(); 146 PointNodePtr GetleftNode() { 147 return m_pleftNode; 148 } 149 PointNodePtr GetRightNode() { 150 return m_pRightNode; 151 } 152 void Sethigh(int x) 153 { 154 m_nhigh = x; 155 m_sContent.Format("%d高,%d低", m_nhigh, m_nlow); 156 } 157 void Setlow(int x) 158 { 159 m_nlow = x; 160 m_sContent.Format("%d高,%d低", m_nhigh, m_nlow); 161 } 162 int Gethigh() 163 { 164 return m_nhigh; 165 } 166 int Getlow() 167 { 168 return m_nlow; 169 } 170 void SetSheetHigh(int high) 171 { 172 m_nsheetHigh = high; 173 } 174 public: 175 PointNodePtr m_pleftNode; 176 PointNodePtr m_pRightNode; 177 private: 178 int m_nhigh; 179 int m_nlow; 180 int m_nsheetHigh; 181 }; 182 183 class CPositionNodeEntity : public CNodeEntity 184 { 185 public: 186 CPositionNodeEntity(CPoint& point,int number,int flag); 187 CPositionNodeEntity(int number, int flag); 188 virtual int GetGrade() { return EG_PositionNode; } 189 virtual void OnDraw(CDC* pDC); 190 virtual bool UpdateInfo(CWnd* pWnd); 191 virtual vecInt GetMenuIDvec(); 192 193 void SetPointx(int x) 194 { 195 m_nx = x; 196 } 197 void SetRealX(int x) 198 { 199 m_Origin.x = x; 200 m_rect.TopLeft().x = m_Origin.x - radius; 201 m_rect.BottomRight().x = m_Origin.x + radius; 202 } 203 void SetRealY(int y) 204 { 205 m_Origin.y = y; 206 m_rect.TopLeft().y = m_Origin.y - radius; 207 m_rect.BottomRight().y = m_Origin.y + radius; 208 } 209 int GetPointx() 210 { 211 return m_nx; 212 } 213 void SetNextNode(PointNodePtr node) 214 { 215 m_pNextNode = node; 216 } 217 void SetLastNode(PointNodePtr node) 218 { 219 m_pLastNode = node; 220 } 221 222 PointNodePtr GetNextNode() 223 { 224 return m_pNextNode; 225 } 226 PointNodePtr GetLastNode() 227 { 228 return m_pLastNode; 229 } 230 231 void SetLastRule(RuleNodePtr node) 232 { 233 m_pLastRule = node; 234 } 235 void SetRule(RuleNodePtr node) 236 { 237 m_pRule = node; 238 } 239 int GetX() 240 { 241 return m_nx; 242 } 243 private: 244 int m_nx; 245 PointNodePtr m_pNextNode; 246 PointNodePtr m_pLastNode; 247 RuleNodePtr m_pLastRule; 248 RuleNodePtr m_pRule; 249 int m_flag; 250 251 }; 252 253 254 class CFyqEnityMgr 255 { 256 public: 257 CFyqEnityMgr(); 258 259 bool CreateEntities(Cfyq_expression* exp,CRect& rect); 260 void OnDraw(CDC* pDC, CRect& rect); 261 CRect GetBoundingBox(); 262 EntityPtr SelectEntity(CPoint pt); 263 void SetSelected(bool val); 264 bool IsEmpty(); 265 void SetScopeToExpression(Cfyq_expression* exp); 266 public://编辑 267 bool EditEntity(CPoint pt, CWnd* pWnd); 268 bool EditNodeBackGround(CPoint pt, CWnd* pWnd); 269 bool DeleteEntity(EntityPtr pEnt); 270 bool AddPositionNode(CPoint &point); 271 void AddPositionNode(int numx); 272 void DeleteRule(PointNodePtr start, PointNodePtr end); 273 PointNodePtr ExistPointNode(int nNum); 274 RuleNodePtr ExistRule(int nNum); 275 public: 276 void findRule(); 277 void findPosition(); 278 protected: 279 VecEntity m_Entities; 280 VecRule m_VecRule; 281 VecPointNode m_VecPoint; 282 PointNodePtr m_lastNode; 283 284 BaseNodeEntity m_LastSelected; 285 286 int m_nPointCount; 287 int m_nNowHigh; 288 //CFile_TbCatalogTreeCtrl *m_pCtrl; 289 }; 290 291 292 293 294 ///////////////////////////////////////////////////////////////////////////// 295 //去高去低编辑框 296 class FLY_DBASE_API CD_EditHighLowDlg : public CXTPResizeDialog 297 { 298 public: 299 CD_EditHighLowDlg(CWnd* pParent = NULL); 300 ~CD_EditHighLowDlg(); 301 302 void SetValue(CString str, int nHighNum, int nLowNum,int max,CPoint& point); 303 public: 304 virtual BOOL OnInitDialog(); 305 virtual void DoDataExchange(CDataExchange* pDX); 306 virtual void OnOK(); 307 DECLARE_MESSAGE_MAP() 308 public: 309 CString m_sHighNum; 310 CString m_sLowNum; 311 CString m_sShowAdd; 312 int m_nHighNum; 313 int m_nLowNum; 314 int m_Max; 315 CPoint m_point; 316 }; 317 //修改已存在的点 318 class FLY_DBASE_API CD_EditPointDlg : public CXTPResizeDialog 319 { 320 public: 321 CD_EditPointDlg(CWnd* pParent = NULL); 322 ~CD_EditPointDlg(); 323 324 void SetValue(CString str, int max, int min,CPoint &point); 325 public: 326 virtual BOOL OnInitDialog(); 327 virtual void DoDataExchange(CDataExchange* pDX); 328 virtual void OnOK(); 329 DECLARE_MESSAGE_MAP() 330 public: 331 CString m_sShowPoint; 332 CString m_sEditPoint; 333 int m_nMax; 334 int m_nMin; 335 int m_nNum; 336 CPoint m_point; 337 }; 338 339 340 341 class FLY_DBASE_API CD_AddPointDlg : public CXTPResizeDialog 342 { 343 public: 344 CD_AddPointDlg(CWnd* pParent = NULL); 345 ~CD_AddPointDlg(); 346 347 public: 348 virtual BOOL OnInitDialog(); 349 virtual void DoDataExchange(CDataExchange* pDX); 350 void SetValue(CPoint& point); 351 virtual void OnOK(); 352 DECLARE_MESSAGE_MAP() 353 public: 354 CString m_sAddPoint; 355 int m_nNum; 356 CPoint m_point; 357 };
#include "stdafx.h" #include <afxwin.h> #include <memory> #include "ZbFile_Add_MaxMin.h" #include "Resource.h" CString GetMenuStringByID(int nID) { switch (nID) { case MI_Edit: return MI_Edit_Tip; case MI_Delete: return MI_Delete_Tip; case MI_AddPositionNode: return MI_AddPositionNode_Tip; default: break; } return _T(""); } CFyqEntity::CFyqEntity() { m_bSelected = false; } CFyqEntity::~CFyqEntity() { } void CFyqEntity::OnDraw(CDC* pDC) { if (m_bSelected) { DrawBoundingBox(pDC); } } void CFyqEntity::DrawBoundingBox(CDC* pDC) { CRect rt = GetBoundingBox(); if (this->GetGrade() == EG_PositionNode) { pDC->Ellipse(m_Origin.x - radius, m_Origin.y - radius, m_Origin.x + radius, m_Origin.y + radius); } else { if (this->GetGrade() == EG_RuleNode) { pDC->SelectStockObject(NULL_BRUSH); pDC->SelectStockObject(NULL_PEN); } pDC->Rectangle(rt); } } bool CFyqEntity::UpdateInfo(CWnd* pWnd) { return true; } void CFyqEntity::SetSelected(bool val) { m_bSelected = val; } bool CFyqEntity::bSelected() { return m_bSelected; } //////////////////////////////////////////////////////////////////// CRect CArrowEntity::GetBoundingBox() { return m_rect; } void CArrowEntity::OnDraw(CDC* pDC) { CFyqEntity::OnDraw(pDC); //绘制箭头 pDC->MoveTo(m_originPoint); pDC->LineTo(m_upPoint); pDC->MoveTo(m_originPoint); pDC->LineTo(m_downPoint); } CAxisEntity::CAxisEntity(CPoint& start, CPoint& end) { m_start = start; m_end = end; } ////////////////////////////////////////////////////////////////////////////// CRect CAxisEntity::GetBoundingBox() { CRect rtArrow = m_Arrow->GetBoundingBox(); CRect Allrt; m_rect; Allrt.UnionRect(m_rect, rtArrow); return Allrt; } void CAxisEntity::OnDraw(CDC* pDC) { CFyqEntity::OnDraw(pDC); pDC->MoveTo(m_start); pDC->LineTo(m_end); } vecInt CAxisEntity::GetMenuIDvec() { vecInt temMenu; temMenu.push_back(MI_AddPositionNode); return temMenu; } void CAxisEntity::SetStartPoint(CPoint &pt) { m_start = pt; } void CAxisEntity::SetEndPoint(CPoint &pt) { m_end = pt; m_rect.SetRect(m_start.x, m_start.y - 5, m_end.x, m_end.y + 5); } void CAxisEntity::SetArrow(ArrowPtr arrow) { m_Arrow = arrow; } ////////////////////////////////////////////////////////////////////////////// CNodeEntity::CNodeEntity() { m_bupdate = false; } CRect CNodeEntity::GetBoundingBox() { return m_rect; } void CNodeEntity::OnDraw(CDC* pDC) { CFyqEntity::OnDraw(pDC); pDC->MoveTo(m_rect.TopLeft()); pDC->LineTo(m_rect.BottomRight()); } void CNodeEntity::SetRect(CPoint pt1, CPoint pt2) { m_rect.SetRect(pt1, pt2); } void CNodeEntity::SetContent(CString val) { m_sContent = val; } CRect CNodeEntity::GetRect() { return m_rect; } CString CNodeEntity::GetContent() { return m_sContent; } /////////////////////////////////////////////////////////////////////// CRuleNodeEntity::CRuleNodeEntity() { m_pleftNode = NULL; m_pRightNode = NULL; m_nhigh = -1; m_nlow = -1; } CRuleNodeEntity::CRuleNodeEntity(PointNodePtr leftnode, PointNodePtr rightnode, CString& str, int high, int low,int SheetMaxH) { m_pleftNode = leftnode; m_pRightNode = rightnode; m_rect.SetRect(leftnode->m_Origin.x, SheetMaxH, rightnode->m_Origin.x, rightnode->m_Origin.y); m_sContent = str; m_nhigh = high; m_nlow = low; m_nsheetHigh = SheetMaxH; } CRuleNodeEntity::~CRuleNodeEntity() { } void CRuleNodeEntity::OnDraw(CDC* pDC) { CFyqEntity::OnDraw(pDC); CBrush brush; if (m_bupdate) brush.CreateSolidBrush(SelectedColor); else pDC->SelectStockObject(NULL_BRUSH); m_bupdate = 0; pDC->SelectStockObject(NULL_PEN); CBrush* pOldbrush = pDC->SelectObject(&brush); pDC->Rectangle(((m_pleftNode->m_Origin.x + m_pRightNode->m_Origin.x) / 2) - 25, m_nsheetHigh, ((m_pleftNode->m_Origin.x + m_pRightNode->m_Origin.x) / 2) + 25, m_pRightNode->m_Origin.y); if (pOldbrush) pDC->SelectObject(pOldbrush); pDC->SetTextColor(RGB(25, 155, 12)); m_rect.SetRect(((m_pleftNode->m_Origin.x+ m_pRightNode->m_Origin.x)/2) - 30,m_nsheetHigh, ((m_pleftNode->m_Origin.x + m_pRightNode->m_Origin.x) / 2) + 30, m_pRightNode->m_Origin.y); pDC->DrawText(m_sContent, m_rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER); pDC->SetTextColor(RGB(0, 0, 0)); } bool CRuleNodeEntity::UpdateInfo(CWnd* pWnd) { CString str; str.Format("当大于等于%d家,小于%d家时", m_pleftNode->GetPointx(), m_pRightNode->GetPointx()); int x1 = m_rect.TopLeft().x; int y2 = m_rect.BottomRight().y; CPoint point(x1, y2); ClientToScreen(pWnd->GetSafeHwnd(), &point); CD_EditHighLowDlg dlg; dlg.SetValue(str, m_nhigh, m_nlow, m_pRightNode->GetPointx(),point); if (IDOK == dlg.DoModal()) { Sethigh(dlg.m_nHighNum); Setlow(dlg.m_nHighNum); } return true; } vecInt CRuleNodeEntity::GetMenuIDvec() { vecInt temMenu; temMenu.push_back(MI_Edit); return temMenu; } //////////////////////////////////////////////////////////////////////////////////////// CPositionNodeEntity::CPositionNodeEntity(CPoint& point, int number,int flag) { m_bupdate = false; m_Origin = point; m_flag = flag; if (!flag) { } else { m_rect.TopLeft().x = m_Origin.x - radius; m_rect.TopLeft().y = m_Origin.y - radius; m_rect.BottomRight().x = m_Origin.x + radius; m_rect.BottomRight().y = m_Origin.y + radius; } m_nx = number; CString str; str.Format("%d", number); m_sContent = str; } CPositionNodeEntity::CPositionNodeEntity(int number, int flag) { m_flag = flag; m_nx = number; CString str; str.Format("%d", number); m_sContent = str; } void CPositionNodeEntity::OnDraw(CDC* pDC) { if (!m_flag) { return; } CFyqEntity::OnDraw(pDC); //设半径为8 CBrush brush; if(m_bupdate) brush.CreateSolidBrush(SelectedColor); else brush.CreateSolidBrush(NoSelectedColor); m_bupdate = 0; CBrush * pOldbrush = pDC->SelectObject(&brush); HPEN hPen = CreatePen(PS_SOLID,1, RGB(0, 0, 0)); pDC->SelectObject(hPen); pDC->Ellipse(m_Origin.x - radius, m_Origin.y - radius, m_Origin.x + radius, m_Origin.y + radius); if (pOldbrush) pDC->SelectObject(pOldbrush); CRect rect(m_Origin.x - radius, m_Origin.y - radius, m_Origin.x + radius, m_Origin.y + radius); CString str; str.Format("%d", m_nx); m_sContent = str; pDC->DrawText(str, &rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER); DeleteObject(hPen); } bool CPositionNodeEntity::UpdateInfo(CWnd* pWnd) { CString str; str.Format("当前为%d,修改为:", m_nx); CD_EditPointDlg dlg; int min, max; if (m_pLastNode) { min = m_pLastNode->GetPointx(); } else { min = 3; } if (m_pNextNode) { max = m_pNextNode->GetPointx(); } else { max = 10000; } int x1 = m_rect.TopLeft().x; int y2 = m_rect.BottomRight().y; CPoint point(x1, y2); ClientToScreen(pWnd->GetSafeHwnd(), &point); dlg.SetValue(str,max,min, point); if (IDOK == dlg.DoModal()) { SetPointx(dlg.m_nNum); } return true; } vecInt CPositionNodeEntity::GetMenuIDvec() { vecInt temMenu; temMenu.push_back(MI_Edit); temMenu.push_back(MI_Delete); return temMenu; } //////////////////////////////////////////////////////////////////////////////////////// CFyqEnityMgr::CFyqEnityMgr() { m_nPointCount = 0; } bool CFyqEnityMgr::CreateEntities(Cfyq_expression* exp, CRect& rect) { //该函数里面所有的坐标限于第一次初始化 修改到ondraw里面修改 /* m_pCtrl = pCtrl;*/ m_Entities.clear(); std::vector<std::vector<int>> vecScope; vecScope = exp->GetScopeMinMax(); CPoint leftupPoint = rect.TopLeft(); CPoint rightdownPoint = rect.BottomRight(); int SheetMaxH = rightdownPoint.y - 10; //一开始起始y int TextAreaWidth = leftupPoint.x; //一开始起始x 因为是横着画的 int MaxX = rightdownPoint.x; // 最远x //坐标轴 CPoint pstart(rect.TopLeft().x, SheetMaxH); CPoint pend(MaxX, SheetMaxH); auto ptrAxis = make_shared<CAxisEntity>(pstart, pend); m_Entities.push_back(ptrAxis); //箭头 CPoint puppoint(pend.x - 10, pend.y - 5); CPoint pdownpoint(pend.x - 10, pend.y + 5); auto ptrArrow = make_shared<CArrowEntity>(pend, puppoint, pdownpoint); m_Entities.push_back(ptrArrow); ptrAxis->SetArrow(ptrArrow); int xMaxGrad = 5; //步进为5,目前动态计算还未完成 //坐标点 for (int i = 0; i < vecScope.size(); ++i) { int nBegin = vecScope[i][0]; int nEnd = vecScope[i][1]; int nhigh = vecScope[i][2]; int nlow = vecScope[i][3]; if (nBegin == 0) { continue; } CPoint pointend; CPoint pointstart(rect.TopLeft().x + nBegin * xMaxGrad * 10 - xMaxGrad * 25, SheetMaxH); pointend.x = rect.TopLeft().x + nEnd * xMaxGrad * 10 - xMaxGrad * 25; if (pointend.x > MaxX) { pointend.x = MaxX; } pointend.y = SheetMaxH; CString str; str.Format("%d高,%d低", nhigh, nlow); RuleNodePtr ptrLastRule = ExistRule(nBegin); PointNodePtr ptrPositionstart = ExistPointNode(nBegin); if (ptrPositionstart == NULL) { ptrPositionstart = make_shared<CPositionNodeEntity>(pointstart, nBegin,1); m_Entities.push_back(ptrPositionstart); } PointNodePtr ptrPositionend; if(pointend.x == MaxX) ptrPositionend = make_shared<CPositionNodeEntity>(pointend, nEnd,0); else ptrPositionend = make_shared<CPositionNodeEntity>(pointend, nEnd, 1); auto ptrCRuleNodeEnitiy = make_shared<CRuleNodeEntity>(ptrPositionstart, ptrPositionend,str, nhigh, nlow, leftupPoint.y); ptrPositionstart->SetRule(ptrCRuleNodeEnitiy); if (ptrLastRule != NULL) { ptrPositionstart->SetLastRule(ptrLastRule); } m_Entities.push_back(ptrPositionend); m_Entities.push_back(ptrCRuleNodeEnitiy); ptrPositionstart->SetNextNode(ptrPositionend); ptrPositionend->SetLastNode(ptrPositionstart); if (i == vecScope.size() - 1) { m_lastNode = ptrPositionend; } } return true; } void CFyqEnityMgr::OnDraw(CDC* pDC, CRect& rect) { CPoint leftupPoint = rect.TopLeft(); m_nNowHigh = leftupPoint.y; int TextAreaWidth = leftupPoint.x; //一开始起始x 因为是横着画的 m_nPointCount = 0; CPoint rightdownPoint = rect.BottomRight(); int SheetMaxH = rightdownPoint.y - 10; //一开始起始y int MaxX = rightdownPoint.x; // 最远x CPoint pStart(leftupPoint.x, SheetMaxH); CPoint pend(MaxX, SheetMaxH); CPoint puppoint(pend.x - 10, pend.y - 5); CPoint pdownpoint(pend.x - 10, pend.y + 5); m_lastNode->m_Origin = pend; for (auto it = m_Entities.begin(); it != m_Entities.end(); it++) { if ((*it)->GetGrade() == EG_Arrow) { std::dynamic_pointer_cast<CArrowEntity>(*it)->SetPoint(pend, puppoint, pdownpoint); } if ((*it)->GetGrade() == EG_Axis) { std::dynamic_pointer_cast<CAxisEntity>(*it)->SetStartPoint(pStart); std::dynamic_pointer_cast<CAxisEntity>(*it)->SetEndPoint(pend); } if ((*it)->GetGrade() == EG_PositionNode) { ++m_nPointCount; } } //根据点的个数动态计算步进 findPosition(); sort(m_VecPoint.begin(), m_VecPoint.end(), [](PointNodePtr node1, PointNodePtr node2) { return node1->GetX() < node2->GetX(); }); int xMaxGrad = -1; if(m_VecPoint.size() > 1) xMaxGrad = (MaxX - 100 - TextAreaWidth) / (10 * m_VecPoint[m_VecPoint.size() - 2]->GetX()); for (auto it = m_Entities.begin(); it != m_Entities.end(); it++) { if ((*it)->GetGrade() == EG_PositionNode && (*it) != m_lastNode) { CPoint point; int number = std::dynamic_pointer_cast<CPositionNodeEntity>(*it)->GetX(); point.x = TextAreaWidth + xMaxGrad * number * 10 - xMaxGrad * 20; point.y = SheetMaxH; std::dynamic_pointer_cast<CPositionNodeEntity>(*it)->SetRealX(point.x); std::dynamic_pointer_cast<CPositionNodeEntity>(*it)->SetRealY(point.y); } if ((*it)->GetGrade() == EG_RuleNode) { std::dynamic_pointer_cast<CRuleNodeEntity>(*it)->SetSheetHigh(m_nNowHigh); } } for (auto it = m_Entities.begin(); it != m_Entities.end(); it++) { (*it)->OnDraw(pDC); } } EntityPtr CFyqEnityMgr::SelectEntity(CPoint pt) { vecInt SelOrder; SelOrder.push_back(EG_RuleNode); SelOrder.push_back(EG_PositionNode); SelOrder.push_back(EG_Axis); for (int i = 0; i < SelOrder.size(); i++) { int order = SelOrder[i]; auto it = find_if(m_Entities.begin(), m_Entities.end(), [=](EntityPtr ptr) { if (order == ptr->GetGrade()) { CRect rt = ptr->GetBoundingBox(); if (rt.PtInRect(pt)) return true; } return false; }); if (it != m_Entities.end()) { return (*it); } } return nullptr; } void CFyqEnityMgr::SetSelected(bool val) { for (auto it = m_Entities.begin(); it != m_Entities.end(); it++) { (*it)->SetSelected(val); } } bool CFyqEnityMgr::IsEmpty() { return m_Entities.empty(); } void CFyqEnityMgr::SetScopeToExpression(Cfyq_expression* exp) { m_VecRule.clear(); for (int i = 0; i < m_Entities.size(); ++i) { if (m_Entities[i]->GetGrade() == EG_RuleNode) { auto ptr = std::dynamic_pointer_cast<CRuleNodeEntity>(m_Entities[i]); m_VecRule.push_back(ptr); } } sort(m_VecRule.begin(), m_VecRule.end(), [&](RuleNodePtr node1, RuleNodePtr node2) { return node1->GetleftNode()->GetPointx() < node2->GetleftNode()->GetPointx(); }); int dMinCount; int dMaxCount; int dMaxNumber; int dMinNumber; CString str; if (m_VecRule.size() == 1) { dMinCount = m_VecRule[0]->GetleftNode()->GetPointx(); dMaxCount = m_VecRule[0]->GetRightNode()->GetPointx(); dMaxNumber = m_VecRule[0]->Gethigh(); dMinNumber = m_VecRule[0]->Getlow(); str.Format("%d,%d,%d,%d", dMinCount, dMaxCount, dMaxNumber, dMinNumber); exp->GetScopeFromTree(); exp->m_vecScope[0]->ReplaceScope(str); } else if (m_VecRule.size() > 1) { CString ans; for (int i = 0; i < m_VecRule.size(); ++i) { dMinCount = m_VecRule[i]->GetleftNode()->GetPointx(); dMaxCount = m_VecRule[i]->GetRightNode()->GetPointx(); dMaxNumber = m_VecRule[i]->Gethigh(); dMinNumber = m_VecRule[i]->Getlow(); if (i == m_VecRule.size() - 1) { str.Format("%d,%d,%d,%d", dMinCount, dMaxCount, dMaxNumber, dMinNumber); } else { str.Format("%d,%d,%d,%d;", dMinCount, dMaxCount, dMaxNumber, dMinNumber); } ans += str; } exp->GetScopeFromTree(); exp->m_vecScope[0]->ReplaceScope(ans); } } CRect CFyqEnityMgr::GetBoundingBox() { CRect rt; for (auto it = m_Entities.begin(); it != m_Entities.end(); it++) { CRect temrt = (*it)->GetBoundingBox(); rt.UnionRect(rt, temrt); } return rt; } // bool CFyqEnityMgr::LButtonDraw(CPoint pt, CWnd* pWnd) // { // pWnd->InvalidateRect(GetBoundingBox()); // return true; // } bool CFyqEnityMgr::EditEntity(CPoint pt, CWnd* pWnd) { EntityPtr pEnt = SelectEntity(pt); SetSelected(false); if (nullptr != pEnt) { pEnt->SetSelected(true); pWnd->InvalidateRect(GetBoundingBox()); vecInt menuid = pEnt->GetMenuIDvec(); CMenu menu; VERIFY(menu.CreatePopupMenu()); for (int i = 0; i < menuid.size(); i++) { menu.AppendMenu(MF_STRING, menuid[i], GetMenuStringByID(menuid[i])); } //除了增加点在数轴上 其他都是在矩形的正下方 int nCmd; CPoint point; point.y = pEnt->m_rect.BottomRight().y; if (pEnt->GetGrade() == EG_Axis || pEnt->GetGrade() == EG_Arrow) { point.x = pt.x; } else { point.x = pEnt->m_rect.TopLeft().x; } ClientToScreen(pWnd->GetSafeHwnd(), &point); nCmd = TrackPopupMenu(menu.GetSafeHmenu(), TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL | TPM_RETURNCMD, point.x, point.y, 0, pWnd->GetSafeHwnd(), 0); switch (nCmd) { case MI_Edit: { pEnt->UpdateInfo(pWnd); } break; case MI_Delete: { DeleteEntity(pEnt); } break; case MI_AddPositionNode: { AddPositionNode(point); } break; default: break; } return true; } return false; } bool CFyqEnityMgr::EditNodeBackGround(CPoint pt, CWnd* pWnd) { auto it = find_if(m_Entities.begin(), m_Entities.end(), [=](EntityPtr ptr) { if (EG_PositionNode == ptr->GetGrade() || EG_RuleNode == ptr->GetGrade()) { CRect rt = ptr->GetBoundingBox(); if (rt.PtInRect(pt)) return true; } return false; }); if (it == m_Entities.end()) { for (auto it = m_Entities.begin(); it != m_Entities.end(); ++it) { if ((*it)->GetGrade() == EG_PositionNode || (*it)->GetGrade() == EG_RuleNode) { std::dynamic_pointer_cast<CNodeEntity>(*it)->SetUpdate(false); } } if (m_LastSelected) { pWnd->InvalidateRect(&m_LastSelected->GetBoundingBox()); m_LastSelected = nullptr; } return false; } else { std::dynamic_pointer_cast<CNodeEntity>(*it)->SetUpdate(true); if ((*it) != m_LastSelected) { if (m_LastSelected) { std::dynamic_pointer_cast<CNodeEntity>(m_LastSelected)->SetUpdate(false); pWnd->InvalidateRect(&(m_LastSelected)->GetBoundingBox()); } m_LastSelected = std::dynamic_pointer_cast<CNodeEntity>(*it); pWnd->InvalidateRect(&(*it)->GetBoundingBox()); } return true; } } bool CFyqEnityMgr::DeleteEntity(EntityPtr pEnt) { //数据中的 //不能存在已有的点 PointNodePtr nowNode = std::dynamic_pointer_cast<CPositionNodeEntity>(pEnt); if (nowNode == NULL) { return false; } PointNodePtr leftnode = nowNode->GetLastNode(); PointNodePtr rightnode = nowNode->GetNextNode(); if (leftnode) leftnode->SetNextNode(rightnode); rightnode->SetLastNode(leftnode); for (auto it = m_Entities.begin(); it != m_Entities.end();) { if ((*it)->GetGrade() == EG_RuleNode) { if (std::dynamic_pointer_cast<CRuleNodeEntity>((*it))->GetleftNode() == nowNode || std::dynamic_pointer_cast<CRuleNodeEntity>((*it))->GetRightNode() == nowNode) { it = m_Entities.erase(it); } else { ++it; } } else { ++it; } } for (auto it = m_Entities.begin(); it != m_Entities.end();) { if ((*it) == pEnt) { it = m_Entities.erase(it); } else { ++it; } } CString str; str.Format("0高,0低"); if (leftnode) { auto PtrRule = make_shared<CRuleNodeEntity>(leftnode, rightnode, str, 0, 0, m_nNowHigh); m_Entities.push_back(PtrRule); } return true; } //&& -> & bool CFyqEnityMgr::AddPositionNode(CPoint &point) { CD_AddPointDlg dlg; dlg.SetValue(point); if (IDOK == dlg.DoModal()) { AddPositionNode(dlg.m_nNum); } return true; } void CFyqEnityMgr::DeleteRule(PointNodePtr start, PointNodePtr end) { findRule(); for (auto it = m_Entities.begin(); it != m_Entities.end();) { if ((*it)->GetGrade() == EG_RuleNode) { if (std::dynamic_pointer_cast<CRuleNodeEntity>(*it)->GetleftNode() == start && std::dynamic_pointer_cast<CRuleNodeEntity>(*it)->GetRightNode() == end) { it = m_Entities.erase(it); } else { ++it; } } else { ++it; } } } void CFyqEnityMgr::AddPositionNode(int numx) { findPosition(); //不能存在已有的点 PointNodePtr ptr; CString str; str.Format("%d高,%d低", 0, 0); sort(m_VecPoint.begin(), m_VecPoint.end(), [](PointNodePtr node1, PointNodePtr node2) { return node1->GetX() < node2->GetX(); }); for (int i = 0; i < m_VecPoint.size() - 1; ++i) { if (numx > m_VecPoint[i]->GetX() && numx < m_VecPoint[i + 1]->GetX()) { ptr = make_shared<CPositionNodeEntity>(numx,1); ptr->SetLastNode(m_VecPoint[i]); ptr->SetNextNode(m_VecPoint[i + 1]); //删除已有的矩形 DeleteRule(m_VecPoint[i], m_VecPoint[i + 1]); //创建已有矩形 auto PtrFirstRule = make_shared<CRuleNodeEntity>(m_VecPoint[i], ptr, str, 0, 0, m_nNowHigh); auto PtrSecondRule = make_shared<CRuleNodeEntity>(ptr, m_VecPoint[i+1], str, 0, 0, m_nNowHigh); m_Entities.push_back(ptr); m_Entities.push_back(PtrFirstRule); m_Entities.push_back(PtrSecondRule); return; } } ptr = make_shared<CPositionNodeEntity>(numx, 1); ptr->SetNextNode(m_VecPoint[0]); auto PtrFirstRule = make_shared<CRuleNodeEntity>(ptr, m_VecPoint[0], str, 0, 0, m_nNowHigh); m_Entities.push_back(ptr); m_Entities.push_back(PtrFirstRule); } PointNodePtr CFyqEnityMgr::ExistPointNode(int nNum) { findPosition(); auto it = find_if(m_VecPoint.begin(), m_VecPoint.end(), [nNum](PointNodePtr node) { return node->GetX() == nNum; }); if (it != m_VecPoint.end()) { return *it; } else { return NULL; } } RuleNodePtr CFyqEnityMgr::ExistRule(int nNum) { findRule(); auto it = find_if(m_VecRule.begin(), m_VecRule.end(), [&](RuleNodePtr node) { return node->GetRightNode()->GetX() == nNum; }); if (it != m_VecRule.end()) { return *it; } else { return NULL; } } void CFyqEnityMgr::findRule() { m_VecRule.clear(); for (int i = 0; i < m_Entities.size(); ++i) { if (m_Entities[i]->GetGrade() == EG_RuleNode) { auto ptr = std::dynamic_pointer_cast<CRuleNodeEntity>(m_Entities[i]); m_VecRule.push_back(ptr); } } } void CFyqEnityMgr::findPosition() { m_VecPoint.clear(); for (int i = 0; i < m_Entities.size(); ++i) { if (m_Entities[i]->GetGrade() == EG_PositionNode) { auto ptr = std::dynamic_pointer_cast<CPositionNodeEntity>(m_Entities[i]); m_VecPoint.push_back(ptr); } } } /////////////////////////////////////////////////////////////////// CD_EditHighLowDlg::CD_EditHighLowDlg(CWnd* pParent /*= NULL*/) :CXTPResizeDialog(IDD_DLG_HighLow, pParent) { } CD_EditHighLowDlg::~CD_EditHighLowDlg() { } BEGIN_MESSAGE_MAP(CD_EditHighLowDlg, CXTPResizeDialog) END_MESSAGE_MAP() void CD_EditHighLowDlg::SetValue(CString str, int nHighNum, int nLowNum,int max,CPoint& point) { m_sShowAdd = str; m_sHighNum.Format(_T("%d"), nHighNum); m_sLowNum.Format(_T("%d"), nLowNum); m_Max = max; m_point = point; } BOOL CD_EditHighLowDlg::OnInitDialog() { __super::OnInitDialog(); CRect rect(m_point.x, m_point.y+5, m_point.x + 225, m_point.y + 120); MoveWindow(&rect); UpdateData(FALSE); return TRUE; } void CD_EditHighLowDlg::DoDataExchange(CDataExchange* pDX) { __super::DoDataExchange(pDX); DDX_Text(pDX, IDC_STATIC_ShowAdd, m_sShowAdd); DDX_Text(pDX, IDC_EDIT_High, m_sHighNum); DDX_Text(pDX, IDC_EDIT_Low, m_sLowNum); } void CD_EditHighLowDlg::OnOK() { UpdateData(TRUE); m_nHighNum = atoi(m_sHighNum); m_nLowNum = atoi(m_sLowNum); if (m_nHighNum + m_nLowNum >= m_Max) { AfxMessageBox("去高去低的企业数不能大于等于最大企业数!"); return; } EndDialog(IDOK); } //////////////////////////////////////////////////////// CD_EditPointDlg::CD_EditPointDlg(CWnd* pParent /*= NULL*/) :CXTPResizeDialog(IDD_Edit_Point, pParent) { } CD_EditPointDlg::~CD_EditPointDlg() { } BEGIN_MESSAGE_MAP(CD_EditPointDlg, CXTPResizeDialog) END_MESSAGE_MAP() void CD_EditPointDlg::SetValue(CString str, int max,int min,CPoint& point) { m_sShowPoint = str; m_nMax = max; m_nMin = min; m_point = point; } BOOL CD_EditPointDlg::OnInitDialog() { __super::OnInitDialog(); CRect rect(m_point.x, m_point.y, m_point.x + 180, m_point.y + 80); MoveWindow(&rect); UpdateData(FALSE); return TRUE; } void CD_EditPointDlg::DoDataExchange(CDataExchange* pDX) { __super::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_Point, m_sEditPoint); DDX_Text(pDX, IDC_STATIC_Point, m_sShowPoint); } void CD_EditPointDlg::OnOK() { UpdateData(TRUE); m_nNum = atoi(m_sEditPoint); CString str; str.Format("输入范围需要大于%d,小于%d!", m_nMin, m_nMax); if (!(m_nNum < m_nMax && m_nNum >= m_nMin)) { AfxMessageBox(str); return; } EndDialog(IDOK); } /////////////////////////////////////////// CD_AddPointDlg::CD_AddPointDlg(CWnd* pParent /*= NULL*/) :CXTPResizeDialog(IDD_ADD_Point, pParent) { } CD_AddPointDlg::~CD_AddPointDlg() { } BEGIN_MESSAGE_MAP(CD_AddPointDlg, CXTPResizeDialog) END_MESSAGE_MAP() BOOL CD_AddPointDlg::OnInitDialog() { __super::OnInitDialog(); CRect rect(m_point.x, m_point.y,m_point.x + 200,m_point.y+70); MoveWindow(&rect); UpdateData(FALSE); return TRUE; } void CD_AddPointDlg::DoDataExchange(CDataExchange* pDX) { __super::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_AddPoint, m_sAddPoint); } void CD_AddPointDlg::SetValue(CPoint& point) { m_point = point; } void CD_AddPointDlg::OnOK() { UpdateData(TRUE); m_nNum = atoi(m_sAddPoint); if (m_nNum < 3 || m_nNum >= 10000) { AfxMessageBox("坐标应大于3,小于10000!"); return; } EndDialog(IDOK); }