QuakeGod
2024-12-24 61deef5cdf96cbfdd6ad45be49e80d597c00ca65
提交 | 用户 | age
0ed438 1 
418cb3 2 // MultiTerminal2View.h: CMTerm1View 类的接口
0ed438 3 //
Q 4
5 #pragma once
6
418cb3 7 #include <memory>
Q 8 #include <vector>
4ed7fc 9 #include <stack>
0ed438 10
418cb3 11 #include "MTerm1Doc.h"
Q 12 class CMTerm1View : public CScrollView
0ed438 13 {
Q 14 protected: // 仅从序列化创建
15     CMTerm1View() noexcept;
16     DECLARE_DYNCREATE(CMTerm1View)
17
18 // 特性
19 public:
418cb3 20     CMFCStatusBar * m_pStatusBar;
0ed438 21     CMTerm1Doc* GetDocument() const;
418cb3 22
Q 23     //从文档获取程序
24
25     //文档变动通知
26     enum enCellType{
27         typeNone=0,
28         typeLine1=1, //横线
29         typeLine2,     //竖线
30         typeLine3,
31         typeLine4,
32         typeLine5,
33         typeLine6,
34         typeLine7,
35         typeLine8,
36         typeLine9,
37         typeLine10,
38         typeLine11,
39
40         typeNO=12,
41         typeNC=13,
42         typePP=14,  //上升沿
43         typePN=15,  //下降沿
44         typeNOT=16,
45         typeDF = 17,
ad1b4b 46
418cb3 47         typeDF_ = 18, 
Q 48         typeOUT=19,
49         typeSET=20,
50         typeRESET=21,
51
52         typeCMP,
df0321 53         typeExt1,    //23 0x17    //被前面的指令占用的空间
418cb3 54         typeExt2,
Q 55         typeExt3,
6ff05a 56         typeExt4,
418cb3 57
6ff05a 58         typeTM = 30,        //定时器
Q 59         typeFN1 = 40,        //1个参数的函数
60         typeFN2 = 50,        //2个参数的函数
61         typeFN3 = 60,        //3个参数的函数
62         typeFN4 = 70,        //3个参数的函数
418cb3 63
Q 64         typeCoil=99,
61deef 65         typeEND = 255,
418cb3 66
Q 67     };
68     struct stCell
69     {
df0321 70         int nType;                //单元类型。
6ff05a 71         int nOpType;            //指令码。
df0321 72         int nProgStep;            //对应程序的步数
Q 73         int bFocused = 0;        //热点选中
74         int bSelected = 0;        //选中
75         int bEditing = 0;        //编辑中
76         int bModified = 0;        //被修改了
418cb3 77
df0321 78         int bErrFocus = 0;        //错误热点
418cb3 79
df0321 80         int bLeftLineUp = 0;    //左侧向上竖线
Q 81         int bLeftLineDn = 0;    //左侧向下竖线
82         int nStat = 0;            //当前状态//   监控时根据状态,显示数值或色块
83         int nTrace = 0;            //当前跟踪状态
84 //        int nDataWidth = 0;
85         int nDataType=0;        //参数数据类型
86         int nDataAddr=0;        //参数数据地址/值
87         CString sParam;            //参数名
88         CString sCoilName;        //线圈名
418cb3 89         void clear() { 
Q 90             nType = 0; bFocused = 0; bSelected = 0; bEditing = 0; bModified = 0;
91             bLeftLineUp = 0; bLeftLineDn = 0; nStat = 0;
df0321 92             nDataType = 0; nDataAddr = 0;
418cb3 93             sParam.Empty(); sCoilName.Empty();
Q 94         }
95     };
96     stCell Cells[2000][16] = { 0 };
97     struct stProgSection
98     {
61deef 99         int Prefix = 0;
Q 100         int Suffix = 0;
101         int bModifyVal = 1;
418cb3 102         std::vector <CMTerm1Doc::stProg> Progs;
6ff05a 103         int Append(CMTerm1Doc::stProg prog) {
418cb3 104             Progs.push_back(prog);
Q 105             return 0;
106         };
6ff05a 107         int Append(struct stProgSection progsec) {
Q 108             int n = (int)progsec.Progs.size();
418cb3 109             for (int i = 0; i < n; i++) {
Q 110                 Progs.push_back(progsec.Progs[i]);
111             }
112             return 0;
113         };
6ff05a 114         int operator+=(const struct stProgSection progsec) {
418cb3 115             Append(progsec);
61deef 116             bModifyVal = bModifyVal | progsec.bModifyVal;
6ff05a 117             return 0;
418cb3 118         };
Q 119
6ff05a 120         int Insert(CMTerm1Doc::stProg prog) {
418cb3 121             Progs.insert(Progs.begin(), prog);
Q 122             return 0;
123         }
6ff05a 124         CString ToText() {
Q 125             CString s1;
126             CStringA s2A;
127             int n = (int)Progs.size();
61deef 128             s2A.Format(" +%d ", Prefix);
6ff05a 129             for (int k = 0; k < n; k++) {
Q 130                 CMTerm1Doc::stProg& prog0 = Progs.at(k);
131                 s2A = prog0.ToText();
132                 s1 += s2A;
133             }
134             return s1;
135         }
61deef 136         int reduce()
Q 137         {
138             if (Prefix > 0) {
139                 int level = 0;
140                 int j = Progs.size();
141                 for (int i = 0; i < j; i++) {
142                     int nOp = Progs[i].nOpType1;
143                     if (nOp == OP_ST || nOp == OP_ST_) {
144                         level += 1;;
145                     }
146                     else if (nOp == OP_ORS) {
147                         level -= 1;
148                     }
149                     if (nOp == OP_ANS) {
150                         level -= 1;
151                         if (level == 0) {
152                             Progs.erase(Progs.begin() + i);
153                             Prefix -= 1;
154                             break;
155                         }
156                     }
157                 }
158
159             }
160             return Prefix;
161         }
418cb3 162     };
4dfb88 163     std::pair<int, int> popsPoint[100];
6ff05a 164
Q 165     struct arc;
166     struct node {
167         int nId;
168         int bEnable;
169         int nType;
170         char input;
171         char result;
172         char indeep;        //输入 深度
173         char outdeep;        //输出 深度
174
175         int indegree;        //入度
176         int outdegree;        //出度 
177         int parameter1;
178         int parameter2;
179         struct arc *firstIn;
180         struct arc *firstOut;
181         int nCellX;
182         int nCellY;
183         CString Op;
184         CString CoilName;
185         int InProcCount;
186         int OutProcCount;
187         int OutProcAllDone;
188         stProgSection prog1;
189
190     };
191     struct arc {
192         int nId;
193         int bEnable;
194         int tailNode;
195         int headNode;
196         int hlinkId;
197         int tlinkId;
198         struct node* tailvex;
199         struct node* headvex;
200         struct arc* hlink;
201         struct arc* tlink;
202         //stProgSection prog1;
203     };
204
205     node nodes[1000];
206     arc arcs[1000];
207
208     node* rootnode;
209
210     int nNodeCount = 0;
211     int nArcCount = 0;
212     int AddNode(int nType, int CellX,int CellY, CString sCoilName, int PrevNode=0);
213     int AddArc(int nNodeID1, int nNodeID2);
214     int RemoveNode(int nIndex);
215     int RemoveArc(int nIndex);
216
217     int MergeNode(int nNodeId1, int nNodeId2);
218     int MergeVPSubSerialNodes(int nNodeId);
219     int MergeParallelNodeWithinVP(int nVPNodeId1, int nVPNodeId2);
4dfb88 220     
6ff05a 221
Q 222     int FindVPNode(int x, int y,int endy);
223
224     int TransLDSToProg();
225     int TransLDSToProgAOV();
226
227     int ScanAOV1(int nNodeid);
228     int ScanVPAOV(int nVPNodeId1, int nVPNodeId2);
229
230     int MergeVPSerialNodes(int nNodeId);
231 //    int ScanAOV2(int nNodeid);
232
4dfb88 233     int nPSHS = -1;
Q 234     bool firstCoil = true;//本段第一个单元格
418cb3 235
4dfb88 236     bool isPops = false;
418cb3 237     int m_nTotalRow=0;
Q 238     bool m_bMonitoring = false;        //监控中
239     bool m_bShowComments = true;    //显示注释
240
241     bool m_bEditing = false;
242
243     int m_TopMargin = 0;        
244     int m_LeftMargin = 54;        //左侧边距
245     int m_CellPerLine = 16;        //每行单元数
d34256 246      int m_CellWidth = 64;        //单元宽度
418cb3 247     int m_CellHeight = 28;        //单元高度
Q 248     int m_CommentHeight = 32;    //注释高度
249
250     int m_LinePosY = 20;        //元件显示位置
251
d34256 252      int m_FocusRow = 0;             //焦点行列位置
418cb3 253     int m_FocusCol = 0;
d34256 254
418cb3 255     int m_oldFocusRow = 0;
Q 256     int m_oldFocusCol = 0;
257     int m_nCurProgStep = 0;
258     int m_TextFontSize=13;
259     int m_nAnnoFontSize=12;
260
261     int m_bModified = 1;
262
263     COLORREF BkColor = RGB(255,255,255);        //Cell背景颜色
264     COLORREF BkEditColor = RGB(192, 192, 192);    //Editing Cell 背景颜色
265
266     COLORREF TextColor =RGB(0,0,0);
267     COLORREF FocusColor = RGB(128,255,128);
268     COLORREF SelectedColor;
269     COLORREF EditColor;
270     COLORREF AnnoColor = RGB(0,0,255);
271     COLORREF BlockAnnoColor;
272     COLORREF MonCoilColor= RGB(0,255,255);
273     COLORREF MonTextColor = RGB(0, 128, 255);
274
275     COLORREF TraceBkColor = RGB(204,204,204);
276     COLORREF TraceColor = RGB(0,255,255);
277     COLORREF ForceIOColor;
278
279     COLORREF OnlineColor = RGB(0, 255, 255);
280     COLORREF ProgColor = RGB(0, 255, 0);
281     COLORREF RunningColor = RGB(0, 255, 0);
282     COLORREF MonitorColor = RGB(0, 255, 255);
283     COLORREF AddressColor = RGB(0, 255, 255);
284
285     CFont TextFont;
286 //    CFont * pOldFont;
287     CFont MonTextFont;
288     CFont AnnoFont;
289
290
291     enum StatusBarIndicators {
292         idxMachineType = 0,
293         idxProgPos = 1,
294         idxOnline = 2,
295         idxRunning = 3,
296         idxMonitor = 4,
297         idxAddress = 5,
298         idxInfoDisp = 6,
299     };
300
301 //    CBrush brBkColor(BkColor);
302
0ed438 303
Q 304 // 操作
305 public:
418cb3 306     void DrawFocusRect(CDC* pDC);
Q 307     int DrawLeftRightLine(CDC* pDC, int x0, int y0, int size1=16, int size2=12);
308     void DrawRelay(CDC* pDC, int x0, int y0);
309     int DrawBracket(CDC* pDC, int x0, int y0, int sizex, int sty=0, int sizey = 24);
310     int DrawAngleBracket(CDC* pDC, int x0, int y0, int sizex, int size2);
311     void DrawOT(CDC* pDC, int x0, int y0);
312
313     int DrawCellStat1(CDC * pDC, int x1, int y1, int sizex, int sizey, int nStat);
314     int DrawCellStat2(CDC* pDC, int x1, int y1, int sizex, int sizey, int nStat);
315     int DrawCellText1(CDC* pDC, CString sText, int x1, int y1, int sizex, int sizey, int nFormat=0);
316     int DrawCellText2(CDC* pDC, CString sText, int x1, int y1, int sizex, int sizey, int nFormat, int nTextColor);
317     int DrawCellAnno(CDC * pDC, int nRow, int nCol, CString sAnno);
318
319     void DrawCell(CDC* pDC, int nRow, int nCol);
320     int TransProgToLDS();
d34256 321
Z 322     /// <summary>
323     /// Flag::是否需要重绘视图,默认为1=>true
324     /// </summary>
418cb3 325     int needReDraw = 1;
Q 326
327     int DoReDraw();
328     int DrawLDSGraph(CDC* pDC);
329
330     int ScrollToCell(int nRow, int nCol);
331
332     int ScrollCellIntoView(int nRow, int nCol);
333     int isCellInView(int nRow, int nCol);
df0321 334     int CellFocusChg(int nRow, int nCol);
0ed438 335
ad1b4b 336     std::pair<int, CString> CMTerm1View::LDSCheckRule();
Z 337
0ed438 338 // 重写
Q 339 public:
340     virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
341     virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
342 protected:
418cb3 343     virtual void OnInitialUpdate(); // 构造后第一次调用
0ed438 344     virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
Q 345     virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
346     virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
347
348 // 实现
349 public:
350     virtual ~CMTerm1View();
351 #ifdef _DEBUG
352     virtual void AssertValid() const;
353     virtual void Dump(CDumpContext& dc) const;
418cb3 354
0ed438 355 #endif
Q 356
357 protected:
358
359 // 生成的消息映射函数
360 protected:
361     DECLARE_MESSAGE_MAP()
418cb3 362 public:
Q 363     afx_msg void OnMonitor();
364     afx_msg void OnUpdateMonitor(CCmdUI *pCmdUI);
365     afx_msg void OnProgConvert();
366     afx_msg void OnUpdateProgConvert(CCmdUI *pCmdUI);
367     afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
368     afx_msg void OnRectSelect();
369     afx_msg void OnUpdateRectSelect(CCmdUI *pCmdUI);
370     afx_msg void OnTextFirst();
371     afx_msg void OnUpdateTextFirst(CCmdUI *pCmdUI);
372     afx_msg void OnInsertBlankLine();
373     afx_msg void OnUpdateInsertBlankLine(CCmdUI *pCmdUI);
374     afx_msg void OnDeleteBlankLine();
375     afx_msg void OnUpdateDeleteBlankLine(CCmdUI *pCmdUI);
376     afx_msg void OnDisplayComments();
377     afx_msg void OnUpdateDisplayComments(CCmdUI *pCmdUI);
378
379     afx_msg void OnUpdateMachineType(CCmdUI *pCmdUI);
380     afx_msg void OnUpdateProgramPos(CCmdUI *pCmdUI);
381     afx_msg void OnUpdateConnectivity(CCmdUI *pCmdUI);
382     afx_msg void OnUpdateRunStatus(CCmdUI *pCmdUI);
383     afx_msg void OnUpdateMonitorStatus(CCmdUI *pCmdUI);
384     afx_msg void OnUpdateTargetAddress(CCmdUI *pCmdUI);
385
386     int UpdateStatusBar(int nIndex=-1);
387
388     virtual void OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/);
389     afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
390     afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
391     afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
392     afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
393     afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
394
395     afx_msg void OnIndicatorMonitorStatus();
396     afx_msg void OnUpdateIndicators(CCmdUI *pCmdUI);
397
398     afx_msg void OnUpdateIndicatorMonitorStatus(CCmdUI *pCmdUI);
399     afx_msg void OnTimer(UINT_PTR nIDEvent);
400     afx_msg BOOL OnEraseBkgnd(CDC* pDC);
401     afx_msg void OnSize(UINT nType, int cx, int cy);
402     virtual BOOL OnScrollBy(CSize sizeScroll, BOOL bDoScroll = TRUE);
403
404     afx_msg void OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/);
405     afx_msg void OnProgCancelEdit();
406     afx_msg void OnUpdateProgCancelEdit(CCmdUI *pCmdUI);
407     afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
6ff05a 408
Q 409
410
418cb3 411     afx_msg void OnInputIoComment();
Q 412     afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
413     int ScanLDSCells(int nStartLine, int nEndLine, int nPosY, int nPosX, int nLevel, stProgSection & progsec, CString & sProgSec, int &nSteps);
4ed7fc 414     int ScanLDSCells2(int nStartLine, int nEndLine, int nPosY, int nPosX, int nSizeX, int nLevel, stProgSection& progsec, CString& sProgSec, int& nSteps);
Z 415     int CMTerm1View::Translate2Prog(
416         int nType, int nCurPosY, int nCurPosX, CString sCellName,
417         stProgSection& progsec, CString& sProgSec, int& nSteps);
ad1b4b 418     void SetCellToView(stCell cell1, int flag = 0);//modify0919zxd
d34256 419     
0ed438 420 };
Q 421
418cb3 422 #ifndef _DEBUG  // MultiTerminal2View.cpp 中的调试版本
0ed438 423 inline CMTerm1Doc* CMTerm1View::GetDocument() const
Q 424    { return reinterpret_cast<CMTerm1Doc*>(m_pDocument); }
425 #endif
426