QuakeGod
2023-09-05 df03213660361b1c771f0a3f21b6ddaeaef7763a
提交 | 用户 | age
0ed438 1 
418cb3 2 // MultiTerminal2View.cpp: CMTerm1View 类的实现
0ed438 3 //
Q 4
5 #include "pch.h"
6 #include "framework.h"
7 // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
8 // ATL 项目中进行定义,并允许与该项目共享文档代码。
9 #ifndef SHARED_HANDLERS
10 #include "MTerm1.h"
11 #endif
12
13 #include "MTerm1Doc.h"
14 #include "MTerm1View.h"
418cb3 15 #include "ChildFrm.h"
Q 16 #include "DialogSetCoil.h"
17 #include "DialogSetData.h"
18 #include "DialogIoComment.h"
19 #include "KDefine.h"
df0321 20 #include "MainFrm.h"
0ed438 21
Q 22 #ifdef _DEBUG
23 #define new DEBUG_NEW
24 #endif
25
26
27 // CMTerm1View
28
418cb3 29 IMPLEMENT_DYNCREATE(CMTerm1View, CScrollView)
0ed438 30
418cb3 31 BEGIN_MESSAGE_MAP(CMTerm1View, CScrollView)
0ed438 32     // 标准打印命令
418cb3 33     ON_COMMAND(ID_FILE_PRINT, &CScrollView::OnFilePrint)
Q 34     ON_COMMAND(ID_FILE_PRINT_DIRECT, &CScrollView::OnFilePrint)
35     ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CScrollView::OnFilePrintPreview)
36
37     ON_WM_CREATE()
38     ON_WM_TIMER()
39     ON_WM_ERASEBKGND()
40     ON_WM_SIZE()
41
42     ON_WM_LBUTTONDOWN()
43     ON_WM_LBUTTONUP()
44     ON_WM_LBUTTONDBLCLK()
45     ON_WM_RBUTTONDOWN()
0ed438 46     ON_WM_RBUTTONUP()
418cb3 47     ON_WM_CONTEXTMENU()
Q 48     ON_WM_INITMENUPOPUP()
49
50     ON_COMMAND(ID_RECT_SELECT, &CMTerm1View::OnRectSelect)
51     ON_UPDATE_COMMAND_UI(ID_RECT_SELECT, &CMTerm1View::OnUpdateRectSelect)
52     ON_COMMAND(ID_TEXT_FIRST, &CMTerm1View::OnTextFirst)
53     ON_UPDATE_COMMAND_UI(ID_TEXT_FIRST, &CMTerm1View::OnUpdateTextFirst)
54     ON_COMMAND(ID_INSERT_BLANK_LINE, &CMTerm1View::OnInsertBlankLine)
55     ON_UPDATE_COMMAND_UI(ID_INSERT_BLANK_LINE, &CMTerm1View::OnUpdateInsertBlankLine)
56     ON_COMMAND(ID_DELETE_BLANK_LINE, &CMTerm1View::OnDeleteBlankLine)
57     ON_UPDATE_COMMAND_UI(ID_DELETE_BLANK_LINE, &CMTerm1View::OnUpdateDeleteBlankLine)
58     ON_COMMAND(ID_DISPLAY_COMMENTS, &CMTerm1View::OnDisplayComments)
59     ON_UPDATE_COMMAND_UI(ID_DISPLAY_COMMENTS, &CMTerm1View::OnUpdateDisplayComments)
60     ON_COMMAND(ID_MONITOR, &CMTerm1View::OnMonitor)
61     ON_UPDATE_COMMAND_UI(ID_MONITOR, &CMTerm1View::OnUpdateMonitor)
62     ON_COMMAND(ID_PROG_CONVERT, &CMTerm1View::OnProgConvert)
63     ON_UPDATE_COMMAND_UI(ID_PROG_CONVERT, &CMTerm1View::OnUpdateProgConvert)
64     ON_COMMAND(ID_PROG_CANCEL_EDIT, &CMTerm1View::OnProgCancelEdit)
65     ON_UPDATE_COMMAND_UI(ID_PROG_CANCEL_EDIT, &CMTerm1View::OnUpdateProgCancelEdit)
66     ON_COMMAND(ID_INPUT_IO_COMMENT, &CMTerm1View::OnInputIoComment)
67
68
69     //    ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_MACHINE_TYPE, ID_INDICATOR_INFO_DISPLAY, OnUpdateIndicators)
70     ON_COMMAND_RANGE(ID_INDICATOR_MACHINE_TYPE, ID_INDICATOR_INFO_DISPLAY, NULL)
71 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_MACHINE_TYPE, &CMTerm1View::OnUpdateMachineType)
72 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_PROGRAM_POS, &CMTerm1View::OnUpdateProgramPos)
73 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_CONNECTIVITY, &CMTerm1View::OnUpdateConnectivity)
74 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_RUN_STATUS, &CMTerm1View::OnUpdateRunStatus)
75 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_MONITOR_STATUS, &CMTerm1View::OnUpdateMonitorStatus)
76 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_TARGET_ADDRESS, &CMTerm1View::OnUpdateTargetAddress)
77 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_INFO_DISPLAY, &CMTerm1View::OnUpdateDisplayComments)
78
79 //    ON_COMMAND(ID_INDICATOR_MONITOR_STATUS, &CMTerm1View::OnIndicatorMonitorStatus)
80 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_MONITOR_STATUS, &CMTerm1View::OnUpdateIndicatorMonitorStatus)
81 ON_WM_KEYDOWN()
0ed438 82 END_MESSAGE_MAP()
418cb3 83
0ed438 84
Q 85 // CMTerm1View 构造/析构
86
87 CMTerm1View::CMTerm1View() noexcept
88 {
89     // TODO: 在此处添加构造代码
90
91 }
92
93 CMTerm1View::~CMTerm1View()
94 {
95 }
96
97 BOOL CMTerm1View::PreCreateWindow(CREATESTRUCT& cs)
98 {
99     // TODO: 在此处通过修改
100     //  CREATESTRUCT cs 来修改窗口类或样式
101
418cb3 102     return CScrollView::PreCreateWindow(cs);
Q 103 }
104
105 void CMTerm1View::OnInitialUpdate()
106 {
107     CScrollView::OnInitialUpdate();
108     TextFont.CreateFont(13, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, _T("宋体"));
109     MonTextFont.CreateFont(12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, _T("宋体"));
110     AnnoFont.CreateFont(12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, _T("宋体"));
111     m_pStatusBar = ((CChildFrame *)GetParentFrame())->GetStatusBar();
112     CSize sizeTotal;
113     // TODO: 计算此视图的合计大小
114     sizeTotal.cx = m_LeftMargin + m_CellWidth* m_CellPerLine + m_CellWidth *2;
115     sizeTotal.cy = 2000;
116     SetScrollSizes(MM_TEXT, sizeTotal);
117     CString s1;
118     SetTimer(1, 50,NULL);
119     SetTimer(2, 10, NULL);
120
0ed438 121 }
Q 122
123 // CMTerm1View 绘图
124
418cb3 125 void CMTerm1View::OnDraw(CDC* pDC)
0ed438 126 {
Q 127     CMTerm1Doc* pDoc = GetDocument();
128     ASSERT_VALID(pDoc);
129     if (!pDoc)
130         return;
131
132     // TODO: 在此处为本机数据添加绘制代码
418cb3 133     CString s1;
Q 134     needReDraw = 1;
135     DrawLDSGraph(pDC);
136     needReDraw = 0;
0ed438 137 }
Q 138
139 // CMTerm1View 打印
140
141 BOOL CMTerm1View::OnPreparePrinting(CPrintInfo* pInfo)
142 {
143     // 默认准备
144     return DoPreparePrinting(pInfo);
145 }
146
147 void CMTerm1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
148 {
149     // TODO: 添加额外的打印前进行的初始化过程
150 }
151
152 void CMTerm1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
153 {
154     // TODO: 添加打印后进行的清理过程
155 }
156
157
158 // CMTerm1View 诊断
159
160 #ifdef _DEBUG
161 void CMTerm1View::AssertValid() const
162 {
418cb3 163     CScrollView::AssertValid();
0ed438 164 }
Q 165
166 void CMTerm1View::Dump(CDumpContext& dc) const
167 {
418cb3 168     CScrollView::Dump(dc);
0ed438 169 }
Q 170
171 CMTerm1Doc* CMTerm1View::GetDocument() const // 非调试版本是内联的
172 {
173     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMTerm1Doc)));
174     return (CMTerm1Doc*)m_pDocument;
175 }
176 #endif //_DEBUG
177
418cb3 178 int CMTerm1View::OnCreate(LPCREATESTRUCT lpCreateStruct)
Q 179 {
180     if (CScrollView::OnCreate(lpCreateStruct) == -1)
181         return -1;
182
183     // TODO:  在此添加您专用的创建代码
184
185     return 0;
186 }
187
188 int CMTerm1View::DoReDraw()
189 {
190     // TODO: 在此处添加实现代码.
191     CPoint scroll1;
192     scroll1 = this->GetScrollPosition();
193
194     CClientDC dc1(this);
195     XFORM xform1;
196     xform1.eM11 = 1;
197     xform1.eM12 = 0;
198     xform1.eM21 = 0;
199     xform1.eM22 = 1;
200     xform1.eDx = float(-scroll1.x);
201     xform1.eDy = float(-scroll1.y);
202
203     XFORM xform2 = { 1, 0, 0, 1, 0, 0 };
204
205     dc1.SetGraphicsMode(GM_ADVANCED);
206     dc1.SetWorldTransform(&xform1);
207
208     DrawLDSGraph(&dc1);
209     
210     return 0;
211 }
212
213 int CMTerm1View::ScrollToCell(int nRow, int nCol)
214 {
215     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
216
217     CSize sizeTotal;
218     // TODO: 计算此视图的合计大小
219     sizeTotal.cx = m_LeftMargin + m_CellWidth * m_CellPerLine + m_CellWidth * 2;
220     sizeTotal.cy = m_TopMargin + CellTotalHeight * (m_nTotalRow );
221     CSize sizeSb;
222     GetScrollBarSizes(sizeSb);
223     POINT pt1;
224     pt1.x = 0;
225     pt1.y = nRow * CellTotalHeight;
226     ScrollToPosition(pt1);
227     return 0;
228 }
229
230 int CMTerm1View::ScrollCellIntoView(int nRow, int nCol)
231 {
232     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
233     return 0;
234 }
235
236 int CMTerm1View::isCellInView(int nRow, int nCol)
237 {
238     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
239     return 0;
240 }
241
242 int CMTerm1View::DrawLDSGraph(CDC* pDC)
243 {
244     // TODO: 在此处添加实现代码.
245     CString s1;
246     CMTerm1Doc* pDoc = GetDocument();
247     ASSERT_VALID(pDoc);
248     if (!pDoc)    return false;
249     if (m_bMonitoring) {
250         pDoc->DoPLCMonitor();
251     }
252     int x1, y1, x2, y2;
253     //    RECT rect1;
254     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
255
256     int nDataType, nDataAddr;
257     int nStat;
258     CBrush br0(BkColor);
259     CBrush br01(BkEditColor);
260     int nRow, nCol;
261     CRect rect0;
262     this->GetClientRect(&rect0);
263     int viewWidth = rect0.Width();
264     CPoint scroll1;
265     scroll1 = this->GetScrollPosition();
266
267     int nFirstVisibleLine;
268     int nLastVisibleLine;
269
270     nFirstVisibleLine = (scroll1.y - m_TopMargin) / CellTotalHeight;
271     nLastVisibleLine = (rect0.Height() + scroll1.y - m_TopMargin) / CellTotalHeight + 1;
272     if (nFirstVisibleLine < 0) { nFirstVisibleLine = 0; }
273     if (nLastVisibleLine < 0) { nLastVisibleLine = 0; }
274
275     CFont *pOldFont;
276     pOldFont = (CFont *)pDC->SelectObject(&TextFont);
277     
278
279     for (int i = nFirstVisibleLine; i < nLastVisibleLine && i < 1000; i++) {
280         // 画一行 单元
281         nRow = i;
282         int x0, y0;
283         x0 = m_LeftMargin;
284         y0 = m_TopMargin + CellTotalHeight * i;
285         y2 = y0 + CellTotalHeight;
286         //画背景
287         if (needReDraw) {
288             // 左半部分
289             if (scroll1.x < x0) {
290                 CRect rect1(scroll1.x, y0, x0, y2);
291                 pDC->FillRect(&rect1, &br0);
292             }
293             //中间部分
294             x1 = max(scroll1.x, x0);
295             x2 = min(scroll1.x + viewWidth, x0 + m_CellPerLine * m_CellWidth);
296             CRect rect2(x1, y0, x2, y2);
297             //背景颜色
298             if (!Cells[nRow][0].bEditing){
299                 pDC->FillRect(&rect2, &br0);
300             }    else {
301                 pDC->FillRect(&rect2, &br01);
302             }
303             // 右边部分
304             if (x2 < scroll1.x + viewWidth)    {
305                 CRect rect3(x2, y0, scroll1.x + viewWidth, y2);
306                 pDC->FillRect(&rect3, &br0);
307             }
308
309             if (m_FocusRow == i)     DrawFocusRect(pDC);
310
311         }
312         //*
313         // 画本行左侧母线
314         x1 = m_LeftMargin;
315         y1 = m_TopMargin + CellTotalHeight * i;
316         x2 = x1;
317         y2 = y1 + CellTotalHeight;
318
319         pDC->MoveTo(x1, y1);
320         pDC->LineTo(x2, y2);
321         //画左侧母线小短横线
322
323
324         x1 = m_LeftMargin;
325         y1 = m_TopMargin + CellTotalHeight * i + m_LinePosY;
326         x2 = x1 + 3;
327         y2 = y1;
328         pDC->MoveTo(x1, y1);
329         pDC->LineTo(x2, y2);
330
331         // 如果本行第一个ST是程序段的起始,输出程序步数
332         //*/
333         int nType = Cells[nRow][0].nType;
334         int nProgSetp = Cells[nRow][0].nProgStep;
335         if (nType == typeNO || nType == typeNC || nType == typeCMP) {
336             int nPairTo = pDoc->Progs[nProgSetp].PairTo;
337             int nPairOp = 0;
338             if (nPairTo) nPairOp = pDoc->Progs[nPairTo].nOpType1;
339             if (nPairOp == 0) { //程序段开始
340                 //在当前行的左侧输出 当前 程序步数
341                 s1.Format(_T("  %d"), nProgSetp);
342                 CRect rect2(0, m_TopMargin + CellTotalHeight * i + m_LinePosY - 8, m_LeftMargin - 4, m_TopMargin + CellTotalHeight * i + m_LinePosY + 14);
343                 pDC->DrawText(s1, &rect2, DT_RIGHT);
344
345             }
346         }
347         // 获取数据  并显示各单元
df0321 348
418cb3 349         for (int j = 0; j < m_CellPerLine; j++) {
Q 350             nCol = j;
351             nDataType = Cells[nRow][nCol].nDataType;
352             nDataAddr = Cells[nRow][nCol].nDataAddr;
df0321 353             if (m_bMonitoring) {
Q 354                 if ((nDataType & TYPEDATA) == TYPEDATA) {
355                     nStat = pDoc->GetVarData(nDataType, nDataAddr);
356                 }
357                 else {
358                     nStat = pDoc->GetCoilValue(nDataType, nDataAddr);
359                 }
360                 Cells[nRow][nCol].nStat = nStat;
361                 nType = Cells[nRow][nCol].nType;
362                 if (nType == typeNO || nType == typeNC || nType == typeCMP || nType == typeTM)
363                 {
364                     int nProgStep = Cells[nRow][nCol].nProgStep;
365                     int nBinProgStep = pDoc->Progs[nProgStep].nBinStep;
366                     Cells[nRow][nCol].nTrace = pDoc->ProgTrace[nBinProgStep];
367                 }
418cb3 368             }
Q 369             else {
df0321 370                 Cells[nRow][nCol].nStat = 0; Cells[nRow][nCol].nTrace = 0;
418cb3 371             }
df0321 372
418cb3 373             DrawCell(pDC, i, j);
Q 374         }
375
376
377         // 画本行右侧母线
378 //*
379         x1 = m_LeftMargin + m_CellWidth * m_CellPerLine;
380         y1 = m_TopMargin + CellTotalHeight * i;
381         x2 = x1;
382         y2 = y1 + CellTotalHeight;
383
384         pDC->MoveTo(x1, y1);
385         pDC->LineTo(x2, y2);
386         // 画本行右侧母线小短横线
387         x1 = m_LeftMargin + m_CellWidth * m_CellPerLine;
388         y1 = m_TopMargin + CellTotalHeight * i + m_LinePosY;
389         x2 = x1 - 3;
390         y2 = y1;
391         pDC->MoveTo(x1, y1);
392         pDC->LineTo(x2, y2);
393
394         //*/
395     }
396     pDC->SelectObject(pOldFont);
397     CRect rect2(0, 30, 240, 100);
398     //    pDC->DrawText(_T("这是测试字符串111,222,33,aa,bb,cc"), &rect2, 0);
399     s1.Format(_T("This is New Info.."));
400     needReDraw = 0;
401     return 0;
402 }
403
404
405 void  CMTerm1View::DrawFocusRect(CDC* pDC)
406 {
407 //    DrawCell(pDC, m_oldFocusRow, m_oldFocusCol);
408     CPen BluePen(PS_SOLID, 3, FocusColor);
409     CPen * pOldPen = pDC->SelectObject(&BluePen);
410     //CBrush * pOldBrush = ;
411     pDC->SelectStockObject(NULL_BRUSH);
412     int x0, y0;
413     //    int x1, y1, x2, y2;
414     RECT rect1;
415     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
416
417     rect1.left = m_LeftMargin + 1 + m_CellWidth * m_FocusCol;
418     rect1.right = rect1.left + m_CellWidth - 4;
419     rect1.top = m_TopMargin + CellTotalHeight * m_FocusRow;
420     rect1.bottom = rect1.top + CellTotalHeight - 2;
421
422     x0 = rect1.left;
423     y0 = rect1.top;
424     //pDC->DrawFocusRect(&rect1);
425     pDC->Rectangle(&rect1);
426     m_oldFocusCol = m_FocusCol;
427     m_oldFocusRow = m_FocusRow;
428
429     pDC->SelectObject(pOldPen);
430 //    pDC->SelectObject(poldBrush);
431 }
432
433
434 int CMTerm1View::DrawLeftRightLine(CDC* pDC, int x0, int y0, int size1, int size2)
435 {
436     // TODO: 在此处添加实现代码.
437     int x1, y1, x2, y2;
438     //画左侧横线
439     x1 = x0;
440     y1 = y0 + m_LinePosY;
441     x2 = x1 + size1;
442     y2 = y1;
443     pDC->MoveTo(x1, y1);
444     pDC->LineTo(x2, y2);
445
446     //画右侧横线
447     x1 = x0 + size1 +size2;
448     y1 = y0 + m_LinePosY;
449     x2 = x0 + m_CellWidth;
450     y2 = y1;
451     pDC->MoveTo(x1, y1);
452     pDC->LineTo(x2, y2);
453     return 0;
454 }
455
456
457 void CMTerm1View::DrawOT(CDC* pDC, int x0, int y0)
458 {
459     int x1, y1;
460     //画左右侧横线
461     DrawLeftRightLine(pDC, x0, y0);
462
463     x1 = x0 +16;
464     y1 = y0 + m_LinePosY;
465
466     pDC->MoveTo(x1 + 6 + 6, y1);
467     pDC->AngleArc(x1 + 6, y1, 6, 0, 360);
468 }
469
470 void  CMTerm1View::DrawRelay(CDC* pDC, int x0, int y0)
471 {
472     int x1, y1, x2, y2;
473     //画左右侧横线
474     DrawLeftRightLine(pDC, x0, y0);
475     // 画左侧竖线
476     x1 = x0+16;
477     y1 = y0 + m_LinePosY - 6;
478     x2 = x1;
479     y2 = y1 + 12;
480     pDC->MoveTo(x1, y1);
481     pDC->LineTo(x2, y2);
482     // 画右侧竖线
483     x1 = x2 + 12;
484     y1 = y1;
485     x2 = x1;
486     y2 = y1 + 12;
487     pDC->MoveTo(x1, y1);
488     pDC->LineTo(x2, y2);
489 }
490
491 int CMTerm1View::DrawBracket(CDC* pDC, int x0, int y0, int sizex, int sty, int sizey)
492 {
493     // TODO: 在此处添加实现代码.
494     int x1, y1, x2, y2;
495     // 左边的短横线
496     x1 = x0 ;
497     y1 = y0 + m_LinePosY;
498     x2 = x0 + 3;
499     y2 = y1;
500     pDC->MoveTo(x1, y1);
501     pDC->LineTo(x2, y2);
502
503     // 左方括号
504     x1 = x0 + 9;
505     y1 = y0 + sty;
506     x2 = x0 + 3;
507     y2 = y1;
508     pDC->MoveTo(x1, y1);
509     pDC->LineTo(x2, y2);
510     x2 = x2;
511     y2 = y2 + sizey;
512     pDC->LineTo(x2, y2);
513     x2 = x2 + 6;
514     y2 = y2;
515     pDC->LineTo(x2, y2);
516     // 右方括号
517     x1 = x0 + sizex - 6 - 6;
518     y1 = y0 + sty;
519     x2 = x0 + sizex -6 ;
520     y2 = y1;
521     pDC->MoveTo(x1, y1);
522     pDC->LineTo(x2, y2);
523     x2 = x2;
524     y2 = y2 + sizey;
525     pDC->LineTo(x2, y2);
526     x2 = x2 - 6;
527     y2 = y2;
528     pDC->LineTo(x2, y2);
529     // 右边的短横线
530     x1 = x0 + sizex - 6;
531     y1 = y0 + m_LinePosY;
532     x2 = x0 + sizex ;
533     y2 = y1;
534     pDC->MoveTo(x1, y1);
535     pDC->LineTo(x2, y2);
536     return 0;
537 }
538 int CMTerm1View::DrawAngleBracket(CDC* pDC, int x0, int y0, int size1, int size2)
539 {
540     // TODO: 在此处添加实现代码.
541     int x1,y1,x2, y2;
542     DrawLeftRightLine(pDC, x0, y0, size1, size2);
543     // 左尖括号
544     x1 = x0 + size1 + 6;
545     y1 = y0 + m_LinePosY -6;
546     x2 = x1 -6;
547     y2 = y1 +6 ;
548     pDC->MoveTo(x1, y1);
549     pDC->LineTo(x2, y2);
550     x2 = x2 +6;
551     y2 = y2 + 6;
552     pDC->LineTo(x2, y2);
553     // 右尖括号
554     x1 = x0 + size1 + size2 - 6;
555     y1 = y0 + m_LinePosY - 6;
556     x2 = x1 + 6;
557     y2 = y1 + 6 ;
558     pDC->MoveTo(x1, y1);
559     pDC->LineTo(x2, y2);
560     x2 = x2 -6 ;
561     y2 = y2 + 6;
562     pDC->LineTo(x2, y2);
563     return 0;
564 }
565
566 int CMTerm1View::DrawCellStat1(CDC * pDC, int x1, int y1, int sizex, int sizey, int nStat)
567 {
568     // TODO: 在此处添加实现代码.
569     CRect rect1;
570     rect1.left = x1;
571     rect1.top = y1;
572     rect1.right = x1+sizex;
573     rect1.bottom = y1+sizey;
574
575     CBrush br0(BkColor);
576     CBrush br1(MonCoilColor);
577     if (m_bMonitoring) {
578         if (nStat) {
579             pDC->FillRect(&rect1, &br1);
580         }else{
581             pDC->FillRect(&rect1, &br0);
582         }
583     }
584     return 0;
585 }
586
587 int CMTerm1View::DrawCellStat2(CDC* pDC, int x1, int y1, int sizex, int sizey, int nStat)
588 {
589     // TODO: 在此处添加实现代码.
590     CRect rect1;
591     rect1.left = x1;
592     rect1.top = y1;
593     rect1.right = x1+sizex;
594     rect1.bottom = y1+sizey;
595     CBrush br2(TraceBkColor);
596     CBrush br3(TraceColor);
597     if (m_bMonitoring) {
598         if (nStat) {
599             pDC->FillRect(&rect1, &br3);
600         }else{
601             pDC->FillRect(&rect1, &br2);
602         }
603     }
604     return 0;
605 }
606
607 int CMTerm1View::DrawCellText1(CDC* pDC, CString sText, int x1, int y1, int sizex, int sizey, int nFormat)
608 {
609     // TODO: 在此处添加实现代码.
610     CRect rect1;
611     rect1.left = x1;
612     rect1.top = y1;
613     rect1.right = rect1.left + sizex;
614     rect1.bottom = rect1.top + sizey;
615     pDC->DrawText(sText, &rect1, nFormat);
616     return 0;
617 }
618
619 int CMTerm1View::DrawCellText2(CDC* pDC, CString sText, int x1, int y1, int sizex, int sizey, int nFormat, int nTextColor)
620 {
621     // TODO: 在此处添加实现代码.
622     COLORREF clrOld = pDC->SetTextColor(nTextColor);
623     CRect rect1;
624     rect1.left = x1;
625     rect1.top = y1;
626     rect1.right = rect1.left + sizex;
627     rect1.bottom = rect1.top + sizey;
628     pDC->DrawText(sText, &rect1, nFormat);
629     pDC->SetTextColor(clrOld);
630     return 0;
631 }
632
633 int CMTerm1View::DrawCellAnno(CDC * pDC, int nRow, int nCol, CString sAnno)
634 {
635     // TODO: 在此处添加实现代码.
636     if (!m_bShowComments) return 0;
637     if (!needReDraw) return 0;
638     CMTerm1Doc * pDoc = GetDocument();
639     int x0, y0;
640     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
641     x0 = m_LeftMargin + 1 + m_CellWidth * nCol;
642     y0 = m_TopMargin + CellTotalHeight * nRow;
643
644     int nType, nAddr;
645     nType = Cells[nRow][nCol].nDataType;
646     nAddr = Cells[nRow][nCol].nDataAddr;
647     CString s1;
648     if (pDoc->GetAnno(nType, nAddr, s1)) {
649         CFont *pOldFont;
650         pOldFont = (CFont *)pDC->SelectObject(&AnnoFont);
651         DrawCellText2(pDC, s1, x0 + 2, y0 + m_LinePosY + 6, m_CellWidth-10, 32, DT_WORDBREAK, AnnoColor);
652         pDC->SelectObject(pOldFont);
653     }
654     return 0;
655 }
656
657 void CMTerm1View::DrawCell(CDC* pDC, int nRow, int nCol)
658 {
659
660     //CMTerm1Doc * pDoc= GetDocument();
661     int x0, y0;
662     int x1, y1, x2, y2;
663     RECT rect1;
664     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
665
666     rect1.left = m_LeftMargin + 1 + m_CellWidth * nCol;
667     rect1.right = rect1.left + m_CellWidth;
668     rect1.top = m_TopMargin + CellTotalHeight * nRow;
669     rect1.bottom = rect1.top + CellTotalHeight;
670
671     x0 = rect1.left;
672     y0 = rect1.top;
673
674     CString s1;
675     //    pDC->DrawFocusRect(&rect1);
676     if (Cells[nRow][nCol].bLeftLineUp && nCol !=0)
677     {
678         if (needReDraw) {
679             pDC->MoveTo(x0, y0);
680             pDC->LineTo(x0, y0 + m_LinePosY);
681         }
682     }
683     if (Cells[nRow][nCol].bLeftLineDn && nCol != 0)
684     {
685         if (needReDraw) {
686             pDC->MoveTo(x0, y0 + m_LinePosY);
687             pDC->LineTo(x0, y0 + CellTotalHeight);
688         }
689     }
690     int nType = Cells[nRow][nCol].nType;
691     if (nType == typeNone)
692     {
693
694     }
695     else if (nType == typeLine1)
696     {    //Draw Line
697         //画直横线
698         if (needReDraw) {
699             pDC->MoveTo(x0, y0 + m_LinePosY);
700             pDC->LineTo(x0 + m_CellWidth, y0 + m_LinePosY);
701         }
702     }
703     else if (nType == typeLine2)
704     {    //Draw Line
705         //画直横线
706 //        pDC->MoveTo(x0, y0);
707 //        pDC->LineTo(x0, y0 + CellTotalHeight);
708     }
709     else if (nType == typeNO)
710     {
711         // Draw Coil
712         if (needReDraw) {
713             DrawRelay(pDC, x0, y0);
714             //显示文字
715             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
716             DrawCellAnno(pDC, nRow, nCol, _T(""));
717         }
718         if (m_bMonitoring){
719             //Draw Stat
720             DrawCellStat1(pDC, x0 + 16 + 2, y0 + m_LinePosY - 6, 8, 12, Cells[nRow][nCol].nStat);
721             // tracing
722             DrawCellStat2(pDC, x0 + 16 + 2 + 10 + 4, y0 + m_LinePosY - 4, 4, 4, Cells[nRow][nCol].nTrace);
723         }
724     }
725     else if (nType == typeNC)
726     {
727         if (needReDraw) {
728             DrawRelay(pDC, x0, y0);
729             //显示文字
730             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
731             DrawCellAnno(pDC, nRow, nCol, _T(""));
732             //画常闭斜线
733             x1 = x0 + 16 + 12 - 3;
734             y1 = y0 + m_LinePosY - 6;
735             x2 = x0 + 16 + 2;
736             y2 = y1 + 12;
737             pDC->MoveTo(x1, y1);
738             pDC->LineTo(x2, y2);
739         }
740         if (m_bMonitoring)
741         {
742             //Draw Stat
743             DrawCellStat1(pDC, x0 + 16 + 2, y0 + m_LinePosY - 6, 8, 12, ! Cells[nRow][nCol].nStat);
744             // tracing
745             DrawCellStat2(pDC, x0 + 16 + 2 + 10 + 4, y0 + m_LinePosY - 4, 4, 4, Cells[nRow][nCol].nTrace);
746             //画常闭斜线
747             x1 = x0 + 16 + 12 - 3;
748             y1 = y0 + m_LinePosY - 6;
749             x2 = x0 + 16 + 2;
750             y2 = y1 + 12;
751             pDC->MoveTo(x1, y1);
752             pDC->LineTo(x2, y2);
753         }
754     }
755     else if (nType == typePP)
756     {
757         if (needReDraw) {
758             DrawRelay(pDC, x0, y0);
759             //画上升沿箭头
760             x1 = x0 + 16 + 6;
761             y1 = y0 + m_LinePosY - 5;
762             x2 = x1;
763             y2 = y1 + 10;
764             pDC->MoveTo(x1, y1);
765             pDC->LineTo(x2, y2);
766             //*
767             x2 = x1 - 3;
768             y2 = y1 + 4;
769             pDC->MoveTo(x1, y1);
770             pDC->LineTo(x2, y2);
771             x2 = x1 + 3;
772             y2 = y1 + 4;
773             pDC->MoveTo(x1, y1);
774             pDC->LineTo(x2, y2);
775             //*/
776                     //显示文字
777             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
778             DrawCellAnno(pDC, nRow, nCol, _T(""));
779         }
780     }
781     else if (nType == typePN)
782     {
783         if (needReDraw) {
784             DrawRelay(pDC, x0, y0);
785             //画下降沿箭头
786             x1 = x0 + 16 + 6;
787             y1 = y0 + m_LinePosY + 5;
788             x2 = x1;
789             y2 = y1 - 10;
790             pDC->MoveTo(x1, y1);
791             pDC->LineTo(x2, y2);
792             //*
793             x2 = x1 - 3;
794             y2 = y1 - 3;
795             pDC->MoveTo(x1, y1);
796             pDC->LineTo(x2, y2);
797
798             x2 = x1 + 3;
799             y2 = y1 - 3;
800             pDC->MoveTo(x1, y1);
801             pDC->LineTo(x2, y2);
802             //*/
803             //显示文字
804             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
805             DrawCellAnno(pDC, nRow, nCol, _T(""));
806         }
807     }
808     else if (nType == typeNOT)    {
809         if (needReDraw) {
810             DrawLeftRightLine(pDC, x0, y0);
811             //画常闭斜线
812             x1 = x0 + 16 + 12 - 3;
813             y1 = y0 + m_LinePosY - 6;
814             x2 = x0 + 16 + 2;
815             y2 = y1 + 12;
816             pDC->MoveTo(x1, y1);
817             pDC->LineTo(x2, y2);
818             //显示文字
819     //        DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
820         }
821     }
822     else if (nType == typeDF)    {
823         if (needReDraw) {
824             //    DrawLeftRightLine(pDC, x0, y0);
825             DrawAngleBracket(pDC, x0, y0, 8, 32);
826             //显示文字
827             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 16, y0 + m_LinePosY - 8, 16, 14);
828         }
829     }
830     else if (nType == typeDF_)    {
831         if (needReDraw) {
832             //    DrawLeftRightLine(pDC, x0, y0);
833             DrawAngleBracket(pDC, x0, y0, 8, 40);
834             //显示文字
835             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 16, y0 + m_LinePosY - 8, 24, 14);
836         }
837     }
838     else if (nType == typeOUT)    {
839         if (needReDraw) {
840             //显示外形
841             DrawOT(pDC, x0, y0);
842             //显示文字
843             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
844             DrawCellAnno(pDC, nRow, nCol, _T(""));
845         }
846         if (m_bMonitoring) {
847             //Draw Stat
848             DrawCellStat1(pDC, x0 + 16 + 2, y0 + m_LinePosY - 6, 8, 12, Cells[nRow][nCol].nStat);
849         }
850     }
851     else if (nType == typeSET)    {
852
853         if (needReDraw) {
854             //画左侧横线
855             //DrawLeftRightLine(pDC, x0, y0, 14, 18);
856             DrawAngleBracket(pDC, x0, y0, 8, 32);
857             DrawCellText1(pDC, _T("S"), x0 + 18, y0 + m_LinePosY - 8, 8, 14);
858             //显示文字
859             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
860             DrawCellAnno(pDC, nRow, nCol, _T(""));
861         }
862         if (m_bMonitoring) {
863             //Draw Stat
864             DrawCellStat1(pDC, x0 + 14, y0 + m_LinePosY - 8, 16, 16, Cells[nRow][nCol].nStat);
865             DrawCellText1(pDC, _T("S"), x0 + 18, y0 + m_LinePosY - 8, 8, 14);
866         }
867
868     }
869     else if (nType == typeRESET)    {
870         if (needReDraw) {
871             //画左右侧横线
872             //DrawLeftRightLine(pDC, x0, y0, 14, 18);
873             DrawAngleBracket(pDC, x0, y0, 8, 32);
874             DrawCellText1(pDC, _T("R"), x0 + 17, y0 + m_LinePosY - 8, 9, 14);
875             //显示文字
876             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
877             DrawCellAnno(pDC, nRow, nCol, _T(""));
878         }
879         if (m_bMonitoring) {
880             //Draw Stat
881             DrawCellStat1(pDC, x0 + 14, y0 + m_LinePosY - 8, 16, 16, Cells[nRow][nCol].nStat);
882             DrawCellText1(pDC, _T("R"), x0 + 17, y0 + m_LinePosY - 8, 9, 14);
883         }
884     }
885     else if (nType == typeCMP)    {
886         if (needReDraw) {
887             // 画中括号
888             DrawBracket(pDC, x0, y0, m_CellWidth * 3);
889             //显示文字
890             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 12, y0, m_CellWidth, 14);
891             DrawCellText1(pDC, Cells[nRow][nCol + 1].sParam, x0 + m_CellWidth + 2, y0, m_CellWidth, 14);
892             DrawCellText1(pDC, Cells[nRow][nCol + 2].sParam, x0 + m_CellWidth * 2 + 2, y0, m_CellWidth, 14);
893             DrawCellAnno(pDC, nRow, nCol + 1, _T(""));
894             DrawCellAnno(pDC, nRow, nCol + 2, _T(""));
895         }
896         if (m_bMonitoring) {
897             s1.Format(_T("     %d"), Cells[nRow][nCol + 1].nStat);
898             DrawCellText2(pDC, s1,x0+m_CellWidth+2,y0+m_LinePosY-6,m_CellWidth-10,14,DT_RIGHT, MonTextColor);
899             s1.Format(_T("     %d"), Cells[nRow][nCol + 2].nStat);
900             DrawCellText2(pDC, s1, x0 + m_CellWidth*2 + 2, y0 + m_LinePosY - 6, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
901             // tracing
902             DrawCellStat2(pDC, x0 + m_CellWidth * 3 - 4, y0 + m_LinePosY - 8, 4, 4, Cells[nRow][nCol].nTrace);
903         }
904     }
905     else if (nType == typeTM)    {
906         if (needReDraw) {
907             // 画中括号
908             DrawBracket(pDC, x0, y0, m_CellWidth * 3);
909             //显示文字
910             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 12, y0, m_CellWidth, 14);
911             DrawCellText1(pDC, Cells[nRow][nCol + 1].sParam, x0 + m_CellWidth + 2, y0, m_CellWidth, 14);
912             DrawCellText1(pDC, Cells[nRow][nCol + 2].sParam, x0 + m_CellWidth * 2 + 2, y0, m_CellWidth, 14);
913             DrawCellAnno(pDC, nRow, nCol, _T(""));
914             DrawCellAnno(pDC, nRow, nCol + 1, _T(""));
915             DrawCellAnno(pDC, nRow, nCol + 2, _T(""));
916         }
917         if (m_bMonitoring) {
918             s1.Format(_T("     %d"), Cells[nRow][nCol + 1].nStat);
919             DrawCellText2(pDC, s1, x0 + m_CellWidth + 2, y0 + m_LinePosY - 6, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
920             s1.Format(_T("     %d"), Cells[nRow][nCol + 2].nStat);
921             DrawCellText2(pDC, s1, x0 + m_CellWidth * 2 + 2, y0 + m_LinePosY - 6, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
922             // tracing
923             DrawCellStat2(pDC, x0 + m_CellWidth * 3 - 4, y0 + m_LinePosY - 8, 4, 4, Cells[nRow][nCol].nTrace);
924         }
925     }
926     else if (nType == typeFN1)    {
927         if (needReDraw) {
928
929             // 画中括号
930             DrawBracket(pDC, x0, y0, m_CellWidth * 2, m_LinePosY - 8, 16);
931             //显示文字
932             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 12, y0 + m_LinePosY - 6, m_CellWidth, 14);
933             DrawCellText1(pDC, Cells[nRow][nCol + 1].sParam, x0 + m_CellWidth + 2, y0 + m_LinePosY - 6, m_CellWidth, 14);
934             DrawCellAnno(pDC, nRow, nCol + 1, _T(""));
935         }
936         if (m_bMonitoring) {
937
938             s1.Format(_T("     %d"), Cells[nRow][nCol + 1].nStat);
939             DrawCellText2(pDC, s1, x0 + m_CellWidth + 2, y0 , m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
940             // tracing
941             DrawCellStat2(pDC, x0 + m_CellWidth * 2 - 4, y0 + m_LinePosY - 8, 4, 4, Cells[nRow][nCol].nTrace);
942         }
943     }
944     else if (nType == typeFN2)    {
945         if (needReDraw) {
946             // 画中括号
947             DrawBracket(pDC, x0, y0, m_CellWidth * 3, m_LinePosY - 8, 16);
948             //显示文字
949             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 12, y0 + m_LinePosY - 6, m_CellWidth, 14);
950             DrawCellText1(pDC, Cells[nRow][nCol + 1].sParam, x0 + m_CellWidth + 2, y0 + m_LinePosY - 6, m_CellWidth, 14);
951             DrawCellText1(pDC, Cells[nRow][nCol + 2].sParam, x0 + m_CellWidth * 2 + 2, y0 + m_LinePosY - 6, m_CellWidth, 14);
952             DrawCellAnno(pDC, nRow, nCol + 1, _T(""));
953             DrawCellAnno(pDC, nRow, nCol + 2, _T(""));
954         }
955         if (m_bMonitoring) {
956             s1.Format(_T("     %d"), Cells[nRow][nCol + 1].nStat);
957             DrawCellText2(pDC, s1, x0 + m_CellWidth + 2, y0, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
958             s1.Format(_T("     %d"), Cells[nRow][nCol + 2].nStat);
959             DrawCellText2(pDC, s1, x0 + m_CellWidth * 2 + 2, y0, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
960             // tracing
961             DrawCellStat2(pDC, x0 + m_CellWidth * 3 - 4, y0 + m_LinePosY - 8, 4, 4, Cells[nRow][nCol].nTrace);
962         }
963     }
964     else if (nType == typeFN3)    {
965         if (needReDraw) {
966             // 画中括号
967             DrawBracket(pDC, x0, y0, m_CellWidth * 4, m_LinePosY - 8, 16);
968             //显示文字
969             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 12, y0 + m_LinePosY - 6, m_CellWidth, 14);
970             DrawCellText1(pDC, Cells[nRow][nCol + 1].sParam, x0 + m_CellWidth + 2, y0 + m_LinePosY - 6, m_CellWidth, 14);
971             DrawCellText1(pDC, Cells[nRow][nCol + 2].sParam, x0 + m_CellWidth * 2 + 2, y0 + m_LinePosY - 6, m_CellWidth, 14);
972             DrawCellText1(pDC, Cells[nRow][nCol + 3].sParam, x0 + m_CellWidth * 3 + 2, y0 + m_LinePosY - 6, m_CellWidth, 14);
973             DrawCellAnno(pDC, nRow, nCol + 1, _T(""));
974             DrawCellAnno(pDC, nRow, nCol + 2, _T(""));
975             DrawCellAnno(pDC, nRow, nCol + 3, _T(""));
976         }
977         if (m_bMonitoring) {
978             s1.Format(_T("     %d"), Cells[nRow][nCol + 1].nStat);
979             DrawCellText2(pDC, s1, x0 + m_CellWidth + 2, y0, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
980             s1.Format(_T("     %d"), Cells[nRow][nCol + 2].nStat);
981             DrawCellText2(pDC, s1, x0 + m_CellWidth * 2 + 2, y0, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
982             s1.Format(_T("     %d"), Cells[nRow][nCol + 3].nStat);
983             DrawCellText2(pDC, s1, x0 + m_CellWidth * 3 + 2, y0, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
984             // tracing
985             DrawCellStat2(pDC, x0 + m_CellWidth * 4 - 4, y0 + m_LinePosY - 8, 4, 4, Cells[nRow][nCol].nTrace);
986         }
987     }
988     else
989     {
990     }
991 }
0ed438 992
Q 993 // CMTerm1View 消息处理程序
418cb3 994
Q 995 void CMTerm1View::OnUpdate(CView* /*pSender*/, LPARAM lHint, CObject* /*pHint*/)
996 {
997     // TODO: 在此添加专用代码和/或调用基类
998     //初始化 cell 内容 
999     if (lHint == 0 || lHint == 1)
1000     {
1001         TransProgToLDS();
1002         CRect rect0;
1003         this->GetClientRect(&rect0);
1004
1005         int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1006
1007         CSize sizeTotal;
1008         // TODO: 计算此视图的合计大小
1009         sizeTotal.cx = m_LeftMargin + m_CellWidth * m_CellPerLine + m_CellWidth * 2;
1010         sizeTotal.cy = m_TopMargin + CellTotalHeight * (m_nTotalRow - 1) + rect0.Height();
1011         SetScrollSizes(MM_TEXT, sizeTotal);
1012         needReDraw = 1;
1013         this->RedrawWindow();
1014     }
1015     else if (lHint == 2) {
1016         UpdateStatusBar();
1017     }
1018
1019 }
1020
1021 BOOL CMTerm1View::OnEraseBkgnd(CDC* pDC)
1022 {
1023     // TODO: 在此添加消息处理程序代码和/或调用默认值
1024     return true;
1025     return CScrollView::OnEraseBkgnd(pDC);
1026 }
1027
1028 void CMTerm1View::OnSize(UINT nType, int cx, int cy)
1029 {
1030     CScrollView::OnSize(nType, cx, cy);
1031 //    CString s1;
1032 //    s1.Format(_T("OnSize %d %d %d"), nType, cx, cy);
1033 //    DbgLog(s1);
1034
1035     if (this->IsWindowVisible())
1036     {
1037         CRect rect0;
1038         this->GetClientRect(&rect0);
1039
1040         int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1041
1042         CSize sizeTotal;
1043         // TODO: 计算此视图的合计大小
1044         sizeTotal.cx = m_LeftMargin + m_CellWidth * m_CellPerLine + m_CellWidth * 2;
1045         sizeTotal.cy = m_TopMargin + CellTotalHeight * (m_nTotalRow - 1) + rect0.Height();
1046         SetScrollSizes(MM_TEXT, sizeTotal);
1047         needReDraw = 1;
1048         this->RedrawWindow();
1049     }
1050
1051     needReDraw = 1;
1052     // TODO: 在此处添加消息处理程序代码
1053 }
1054
1055 BOOL CMTerm1View::OnScrollBy(CSize sizeScroll, BOOL bDoScroll)
1056 {
1057     // TODO: 在此添加专用代码和/或调用基类
1058     needReDraw = 1;
1059     return CScrollView::OnScrollBy(sizeScroll, bDoScroll);
1060 }
1061
1062 void CMTerm1View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
1063 {
1064     // TODO: 在此添加消息处理程序代码和/或调用默认值
1065     CString s1;
1066 //    s1.Format(_T("KeyDown %d %d %d"), nChar, nRepCnt, nFlags);
1067 //    DbgLog(s1);
1068     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1069
1070     CRect rect0;
1071     this->GetClientRect(&rect0);
1072     int viewWidth = rect0.Width();
1073     CPoint scroll1;
1074     scroll1 = this->GetScrollPosition();
1075
1076     int nFirstVisibleLine;
1077     int nLastVisibleLine;
1078     int nLinesinView;
1079     nFirstVisibleLine = (scroll1.y - m_TopMargin) / CellTotalHeight;
1080     nLastVisibleLine = (rect0.Height() + scroll1.y - m_TopMargin) / CellTotalHeight + 1;
1081     if (nFirstVisibleLine < 0) { nFirstVisibleLine = 0; }
1082     if (nLastVisibleLine < 0) { nLastVisibleLine = 0; }
1083     nLinesinView = nLastVisibleLine - 1 - nFirstVisibleLine;
1084     int nRow, nCol;
1085     nRow = m_FocusRow;
1086     nCol = m_FocusCol;
1087     if (nChar == VK_LEFT) {
1088         nCol -= 1;
1089         if (nCol < 0) { 
1090             if (nRow > 0) {
1091                 nRow -= 1; nCol += m_CellPerLine;
1092             }else { 
1093                 nCol = 0; 
1094             }
1095         }
1096     }
1097     if (nChar == VK_RIGHT) {
1098         nCol += 1;
1099         if (nCol >= m_CellPerLine) { 
1100             if (nRow < m_nTotalRow + nLinesinView - 1 ) {
1101                 nCol -= m_CellPerLine;
1102                 nRow += 1;
1103             }
1104             else {
1105                 nCol = m_CellPerLine - 1;
1106             }
1107         }
1108     }
1109     if (nChar == VK_UP) {
1110         nRow -= 1;
1111         if (nRow < 0) { nRow = 0; }
1112     }
1113     if (nChar == VK_DOWN) {
1114         nRow += 1;
1115         if (nRow >= m_nTotalRow + nLinesinView) { nRow = m_nTotalRow + nLinesinView -1; }
1116
1117     }
1118     m_FocusRow = nRow;
1119     m_FocusCol = nCol;
1120     if (Cells[nRow][nCol].nType) {
1121         m_nCurProgStep = Cells[nRow][nCol].nProgStep;
1122     }
1123     
1124     if (nRow < nFirstVisibleLine) { 
1125         scroll1.y -= CellTotalHeight;
1126         ScrollToPosition(scroll1); 
1127     }
1128     if (nRow > 0 && nRow >= nLastVisibleLine - 1 ) { 
1129         scroll1.y += CellTotalHeight;
1130         ScrollToPosition(scroll1); 
1131     }
1132
1133     //    DrawFocusRect();
1134     GetDocument()->UpdateAllViews(this, m_FocusCol);
1135     needReDraw = 1;
1136     this->RedrawWindow();
1137     UpdateStatusBar();
1138
1139     CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
1140 }
df0321 1141 int CMTerm1View::CellFocusChg(int nRow, int nCol)
Q 1142 {
1143     CString s1;
1144     stCell & thecell = Cells[nRow][nCol];
1145     s1.Format(_T("Cell %d %d Type %02X \r\n"), nRow, nCol, thecell.nType);
1146     s1.AppendFormat(_T(" sCoilName %s sParam %s \r\n"), thecell.sCoilName, thecell.sParam );
1147     s1.AppendFormat(_T("LeftUp %d leftDn %d "), thecell.bLeftLineUp, thecell.bLeftLineDn);
1148     DbgLog(s1);
1149
1150     auto p1 = (CMainFrame*)AfxGetMainWnd();
1151     auto p2 = p1->GetInputWnd();
1152     p2->SetCurCellPos(nRow,nCol,thecell);
1153
1154
1155
1156     return 0;
1157 }
418cb3 1158
Q 1159 void CMTerm1View::OnLButtonDown(UINT nFlags, CPoint point)
1160 {
1161     // TODO: 在此添加消息处理程序代码和/或调用默认值
1162     CString s1;
1163     CPoint scroll1;
1164     scroll1 = this->GetScrollPosition();
1165     int tx, ty;
1166     tx = point.x + scroll1.x;
1167     ty = point.y + scroll1.y;
1168     int nRow, nCol;
1169     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1170     nRow = (ty - m_TopMargin) / CellTotalHeight;
1171     nCol = (tx - m_LeftMargin) / m_CellWidth;
1172     if (nRow < 0) { nRow = 0; }
1173     if (nCol < 0) { nCol = 0; }
1174     if (nCol >= m_CellPerLine) { nCol = m_CellPerLine - 1; }
1175     s1.Format(_T("LD %d %d  %02X  Scroll %d %d  Total %d %d Row %d Col %d"), point.x, point.y, nFlags, scroll1.x, scroll1.y, tx, ty, nRow, nCol);
1176     m_pStatusBar->SetPaneText(6, s1);
1177     m_FocusRow = nRow;
1178     m_FocusCol = nCol;
1179     if (Cells[nRow][nCol].nType) {
1180         m_nCurProgStep = Cells[nRow][nCol].nProgStep;
1181     }
1182
1183     //    DrawFocusRect();
df0321 1184     CellFocusChg(nRow, nCol);
418cb3 1185     GetDocument()->UpdateAllViews(this, m_FocusCol);
Q 1186     needReDraw = 1;
1187     this->RedrawWindow();
1188     UpdateStatusBar();
1189     //    m_pStatusBar->Set
1190     CScrollView::OnLButtonDown(nFlags, point);
1191 }
1192
1193 void CMTerm1View::OnLButtonUp(UINT nFlags, CPoint point)
1194 {
1195     // TODO: 在此添加消息处理程序代码和/或调用默认值
1196
1197     CScrollView::OnLButtonUp(nFlags, point);
1198 }
1199
1200 void CMTerm1View::OnLButtonDblClk(UINT nFlags, CPoint point)
1201 {
1202     // TODO: 在此添加消息处理程序代码和/或调用默认值
1203     CString s1;
1204     CMTerm1Doc * pDoc = (CMTerm1Doc*)GetDocument();
1205     CPoint scroll1;
1206     scroll1 = this->GetScrollPosition();
1207     int tx, ty;
1208     tx = point.x + scroll1.x;
1209     ty = point.y + scroll1.y;
1210
1211     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1212     int nRow = (ty - m_TopMargin) / CellTotalHeight;
1213     int nCol = (tx - m_LeftMargin) / m_CellWidth;
1214
1215     if (nRow < 0) { nRow = 0; }
1216     if (nCol < 0) { nCol = 0; }
1217     if (nCol >= m_CellPerLine) { nCol = m_CellPerLine - 1; }
1218     s1.Format(_T("LD db Clk %d %d  %02X  Scroll %d %d  Total %d %d Row %d Col %d"),
1219         point.x, point.y, nFlags, scroll1.x, scroll1.y, tx, ty, nRow, nCol);
1220     m_pStatusBar->SetPaneText(6, s1);
1221     m_pStatusBar->SetPaneBackgroundColor(6, RGB(255, 255, 0));
1222     m_pStatusBar->SetPaneTextColor(6, RGB(0, 0, 255));
1223     m_pStatusBar->EnablePaneProgressBar(6);
1224     m_pStatusBar->SetPaneProgress(6, 5);
1225     SysLog(s1);
1226
1227     m_FocusRow = nRow;
1228     m_FocusCol = nCol;
1229     if (Cells[nRow][nCol].nType) {
1230         m_nCurProgStep = Cells[nRow][nCol].nProgStep;
1231     }
1232     if (!pDoc->m_bOnline) return;
1233     //if (!m_bMonitoring) return;
1234
1235     CString sParam;
1236     sParam = Cells[nRow][nCol].sParam;
1237     int nDataType, nDataAddr, nStat;
1238     nDataType = Cells[nRow][nCol].nDataType;
1239     nDataAddr = Cells[nRow][nCol].nDataAddr;
1240     nStat = Cells[nRow][nCol].nStat;
1241
1242     s1.Format(_T("Name %s DataType %d DataAddr %d  Stat %d"),
1243         sParam, nDataType, nDataAddr, nStat);
1244     SysLog(s1);
1245     if (Cells[m_FocusRow][m_FocusCol].sParam == _T("")) {
1246         return;
1247     }
1248     needReDraw = 1;
1249     if ((nDataType&TYPEDATA) == TYPEDATA) {
1250         CDialogSetData dialog2;
1251
1252         dialog2.m_strAddr = sParam;
1253         dialog2.m_nStat = nStat;
1254
1255         INT_PTR r = dialog2.DoModal();
1256         if (r == IDOK)
1257         {
1258             int s = dialog2.m_nStat;
1259             ///
1260             pDoc->SetVarData(nDataType, nDataAddr, s);
1261             //Cells[nRow][nCol].nStat = s;
1262             s1.Format(_T("Set Data %s as %d "), sParam, s);
1263             SysLog(s1);
1264             this->RedrawWindow();
1265         }
1266     }
1267     else {
1268         CDialogSetCoil dialog1;
1269
1270         dialog1.m_strAddr = sParam;
1271         dialog1.m_nStat = nStat;
1272
1273         INT_PTR r = dialog1.DoModal();
1274         if (r == IDOK)
1275         {
1276             int s = dialog1.m_nStat;
1277             ///
1278             pDoc->SetCoilValue(nDataType, nDataAddr, s);
1279             //        Cells[nRow][nCol].nStat = nStat;
1280
1281             //        Cells[m_FocusRow][m_FocusCol].nStat = s;
1282             //        s1.Format(_T("Set Coild %s as %d "), sParam, s);
1283             //        AfxMessageBox(s1);
1284             this->RedrawWindow();
1285         }
1286     }
1287     CScrollView::OnLButtonDblClk(nFlags, point);
1288 }
1289
1290 void CMTerm1View::OnRButtonDown(UINT nFlags, CPoint point)
1291 {
1292     // TODO: 在此添加消息处理程序代码和/或调用默认值
1293     CString s1;
1294     CPoint scroll1;
1295     scroll1 = this->GetScrollPosition();
1296     int tx, ty;
1297     tx = point.x + scroll1.x;
1298     ty = point.y + scroll1.y;
1299
1300     int nRow, nCol;
1301     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1302     nRow = (ty- m_TopMargin )/ CellTotalHeight;
1303     nCol = (tx - m_LeftMargin) / m_CellWidth;
1304
1305     if (nRow < 0) { nRow = 0; }
1306     if (nCol < 0) { nCol = 0; }
1307     if (nCol >= m_CellPerLine) { nCol = m_CellPerLine - 1; }
1308     s1.Format(_T("RD %d %d  %02X  Scroll %d %d  Total %d %d Row %d Col %d"), point.x, point.y, nFlags, scroll1.x, scroll1.y, tx, ty, m_FocusRow, m_FocusCol);
1309     m_pStatusBar->SetPaneText(6, s1);
1310     m_FocusRow = nRow;
1311     m_FocusCol = nCol;
1312     //    DrawFocusRect();
1313     GetDocument()->UpdateAllViews(this, m_FocusCol);
1314     needReDraw = 1;
1315     this->RedrawWindow();
1316
1317     CScrollView::OnRButtonDown(nFlags, point);
1318 }
1319
1320 void CMTerm1View::OnRButtonUp(UINT nFlags, CPoint point)
1321 {
1322     // TODO: 在此添加消息处理程序代码和/或调用默认值
1323     //CContextMenuManager
1324     CScrollView::OnRButtonUp(nFlags, point);
1325 }
1326
1327 void CMTerm1View::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
1328 {
1329     // TODO: 在此处添加消息处理程序代码
1330     CMenu menu1;
1331     menu1.LoadMenu(IDR_MENU1);
1332     CMenu *pContextMenu = menu1.GetSubMenu(0);
1333     pContextMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
1334 }
1335
1336 void CMTerm1View::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
1337 {
1338     CScrollView::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
1339
1340     // TODO: 在此处添加消息处理程序代码
1341     if (!bSysMenu && pPopupMenu)
1342     {
1343         CCmdUI cmdUI;
1344         cmdUI.m_pOther = NULL;
1345         cmdUI.m_pMenu = pPopupMenu;
1346         cmdUI.m_pSubMenu = NULL;
1347
1348
1349         UINT count = pPopupMenu->GetMenuItemCount();
1350         cmdUI.m_nIndexMax = count;
1351         for (UINT i = 0; i < count; i++)
1352         {
1353             UINT nID = pPopupMenu->GetMenuItemID(i);
1354             if (-1 == nID || 0 == nID)
1355             {
1356                 continue;
1357             }
1358             cmdUI.m_nID = nID;
1359             cmdUI.m_nIndex = i;
1360             cmdUI.DoUpdate(this, FALSE);
1361         }
1362     }
1363 }
1364
1365 void CMTerm1View::OnTimer(UINT_PTR nIDEvent)
1366 {
1367     // TODO: 在此添加消息处理程序代码和/或调用默认值
1368     CString s1;
1369     CMTerm1Doc * pDoc = (CMTerm1Doc*)GetDocument();
1370
1371     if (nIDEvent == 0) {
1372
1373     }
1374     else if (nIDEvent == 1)
1375     {
1376         if (m_bMonitoring) {
1377             //this->RedrawWindow();
1378             DoReDraw();
1379         }
1380     }
1381     else if (nIDEvent == 2) {
1382         pDoc->OnTimer(2);
1383     }
1384     else {
1385
1386     }
1387     CScrollView::OnTimer(nIDEvent);
1388 }
1389
1390 void CMTerm1View::OnMonitor()
1391 {
1392     // TODO: 在此添加命令处理程序代码
1393     m_bMonitoring = !m_bMonitoring;
1394     this->RedrawWindow();
1395     UpdateStatusBar();
1396 }
1397
1398 void CMTerm1View::OnUpdateMonitor(CCmdUI *pCmdUI)
1399 {
1400     // TODO: 在此添加命令更新用户界面处理程序代码
1401     pCmdUI->SetCheck(m_bMonitoring == true);
1402 }
1403
1404 void CMTerm1View::OnProgConvert()
1405 {
1406     // TODO: 在此添加命令处理程序代码
1407     CString s1;
1408     s1.Format(_T("Prog Convert"));
1409     SysLog(s1);
1410     int r = TransLDSToProg();
1411     s1.Format(_T("LDS To Prog result %d"), r);
1412     SysLog(s1);
1413     if (r==0) {
1414     //    m_bModified = 0;
1415         int j=TransProgToLDS();
1416         s1.Format(_T("Porg to LDS retuls %d"), j);
1417         SysLog(s1);
1418         needReDraw = 1;
1419         RedrawWindow();
1420     }
1421     else {
1422         s1.Format(_T("Error in Prog Convert"));
1423         SysLog(s1);
1424     }
1425 }
1426
1427 void CMTerm1View::OnUpdateProgConvert(CCmdUI *pCmdUI)
1428 {
1429     // TODO: 在此添加命令更新用户界面处理程序代码
1430     pCmdUI->SetCheck(0);
1431     pCmdUI->Enable(m_bModified);
1432 }
1433
1434 void CMTerm1View::OnProgCancelEdit()
1435 {
1436     CString s1;
1437     s1.Format(_T("Prog Cancel Edit"));
1438     SysLog(s1);
1439     // TODO: 在此添加命令处理程序代码
1440 }
1441
1442
1443 void CMTerm1View::OnUpdateProgCancelEdit(CCmdUI *pCmdUI)
1444 {
1445     // TODO: 在此添加命令更新用户界面处理程序代码
1446 //    pCmdUI->SetCheck(m_bModified);
1447     pCmdUI->Enable(m_bModified);
1448 }
1449
1450
1451 void CMTerm1View::OnInsertBlankLine()
1452 {
1453     // TODO: 在此添加命令处理程序代码
1454     CString s1;
1455     s1.Format(_T("Insert Blank Line"));
1456     SysLog(s1);
1457     m_FocusRow;
1458     //当前行之后的所有,下移一行
1459     for (int i = m_nTotalRow - 1; i >= m_FocusRow; i--) {
1460         for (int j = 0; j < m_CellPerLine; j++) {
1461             Cells[i + 1][j] = Cells[i][j];
1462         }
1463     }
1464     m_nTotalRow += 1;
1465     // 当前行灰色    
1466     for (int j = 0; j < m_CellPerLine; j++)    {
1467         Cells[m_FocusRow][j].clear();
1468         Cells[m_FocusRow][j].bEditing = 1;
1469         Cells[m_FocusRow][j].bModified = 1;
1470         if (Cells[m_FocusRow + 1][j].bLeftLineUp) {
1471             Cells[m_FocusRow][j].bLeftLineUp = 1;
1472             Cells[m_FocusRow][j].bLeftLineDn = 1;
1473         }
1474     }
1475
1476     // 当前行 加入 触点
1477 //    m_FocusCol;
1478 //    Cells[m_FocusRow][0].nType= typeNO;
1479 //    Cells[m_FocusRow][0].nDataType = KLCoilTypeX;
1480 //    Cells[m_FocusRow][0].nDataAddr = 15;
1481 //    Cells[m_FocusRow][0].sCoilName = "ABCDEFG";
1482
1483     m_bModified = 1;
1484     needReDraw = 1;
1485     this->RedrawWindow();
1486 }
1487 int FindTypeIndex(CString str[], CString strType, int num)
1488 {
1489     for (int i = 0;i < num;i++)
1490     {
1491         if (strType == str[i])
1492         {
1493             return i;
1494         }
1495     }
1496     return -1;
1497 }
1498
df0321 1499 void CMTerm1View::SetCellToView(stCell cell1)               //**************************************************************************************************//
418cb3 1500 {
Q 1501
1502     Cells[m_FocusRow][m_FocusCol] = cell1;
1503     m_bModified = 1;
1504     needReDraw = 1;
1505     m_FocusCol += 1;
df0321 1506     Cells[m_FocusRow][0].bEditing = 1;
Q 1507
1508     if (m_nTotalRow < m_FocusRow + 1) {
1509         m_nTotalRow = m_FocusRow + 1;
1510     }
1511
418cb3 1512     if (m_FocusCol >= 16) 
Q 1513     { m_FocusCol = 0;m_FocusRow += 1; }
1514     
1515     this->RedrawWindow();
1516     
1517 }
1518 void CMTerm1View::OnUpdateInsertBlankLine(CCmdUI *pCmdUI)
1519 {
1520     // TODO: 在此添加命令更新用户界面处理程序代码
1521 }
1522
1523 void CMTerm1View::OnDeleteBlankLine()
1524 {
1525     // TODO: 在此添加命令处理程序代码
1526     CString s1;
1527     s1.Format(_T("Delete Blank Line"));
1528     SysLog(s1);
1529 }
1530
1531 void CMTerm1View::OnUpdateDeleteBlankLine(CCmdUI *pCmdUI)
1532 {
1533     // TODO: 在此添加命令更新用户界面处理程序代码
1534 }
1535
1536 void CMTerm1View::OnRectSelect()
1537 {
1538     // TODO: 在此添加命令处理程序代码
1539 }
1540
1541
1542 void CMTerm1View::OnUpdateRectSelect(CCmdUI *pCmdUI)
1543 {
1544     // TODO: 在此添加命令更新用户界面处理程序代码
1545 }
1546
1547
1548 void CMTerm1View::OnTextFirst()
1549 {
1550     // TODO: 在此添加命令处理程序代码
1551 }
1552
1553
1554 void CMTerm1View::OnUpdateTextFirst(CCmdUI *pCmdUI)
1555 {
1556     // TODO: 在此添加命令更新用户界面处理程序代码
1557 }
1558
1559 void CMTerm1View::OnDisplayComments()
1560 {
1561     // TODO: 在此添加命令处理程序代码
1562     m_bShowComments = !m_bShowComments;
1563     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1564     CRect rect0;
1565     this->GetClientRect(&rect0);
1566
1567     CSize sizeTotal;
1568     // TODO: 计算此视图的合计大小
1569     sizeTotal.cx = m_LeftMargin + m_CellWidth * m_CellPerLine + m_CellWidth * 2;
1570     sizeTotal.cy = m_TopMargin + CellTotalHeight * (m_nTotalRow-1)  + rect0.Height();
1571     SetScrollSizes(MM_TEXT, sizeTotal);
1572     needReDraw = 1;
1573     this->Invalidate();
1574 }
1575
1576
1577 void CMTerm1View::OnUpdateDisplayComments(CCmdUI *pCmdUI)
1578 {
1579     // TODO: 在此添加命令更新用户界面处理程序代码
1580     pCmdUI->SetCheck(m_bShowComments == true);
1581 }
1582
1583
1584
1585 int CMTerm1View::UpdateStatusBar(int nIndex)
1586 {
1587     // TODO: 在此处添加实现代码.
1588     CString s1;
1589     CMTerm1Doc * pDoc = (CMTerm1Doc*)GetDocument();
1590
1591     if (nIndex == idxMachineType || nIndex == -1) {        //机型代码
1592         s1 = pDoc->m_sMachineType;
1593         m_pStatusBar->SetPaneText(idxMachineType,s1);
1594     }
1595     if (nIndex == idxProgPos || nIndex == -1) { //程序位置/步数
1596         s1.Format(_T("%5d/%5d"), m_nCurProgStep,pDoc->m_nProgSteps);
1597         m_pStatusBar->SetPaneText(idxProgPos, s1);
1598     }
1599     if (nIndex == idxOnline || nIndex == -1) { //在线 /离线
1600         if (!pDoc->m_bOnline) {
1601             s1 = _T("离线");
1602             m_pStatusBar->SetPaneText(idxOnline, s1);
1603             m_pStatusBar->SetPaneBackgroundColor(idxOnline);
1604         }
1605         else if (pDoc->m_bOnline) {
1606             if (pDoc->m_bSimulate)    {
1607                 s1 = _T("在线(仿真)");
1608                 m_pStatusBar->SetPaneText(2, s1);
1609                 m_pStatusBar->SetPaneBackgroundColor(idxOnline, OnlineColor);
1610             }else{
1611                 s1 = _T("在线");
1612                 m_pStatusBar->SetPaneText(2, s1);
1613                 m_pStatusBar->SetPaneBackgroundColor(idxOnline, OnlineColor);
1614             }
1615         }
1616     }
1617     if (nIndex == idxRunning || nIndex == -1) { // 运行 / 停止
1618         if (!pDoc->m_bOnline)        {
1619             s1 = _T("");
1620             m_pStatusBar->SetPaneText(idxRunning, s1);
1621             m_pStatusBar->SetPaneBackgroundColor(idxRunning);
1622             m_pStatusBar->SetPaneWidth(idxRunning, 0);
1623             m_pStatusBar->SetPaneStyle(idxRunning, SBPS_DISABLED);
1624
1625         }else if (!pDoc->m_bPlcRunning) {
1626             s1 = _T("PROG");
1627             m_pStatusBar->SetPaneText(idxRunning, s1);
1628             m_pStatusBar->SetPaneWidth(idxRunning, s1.GetLength()*8);
1629             m_pStatusBar->SetPaneBackgroundColor(idxRunning, ProgColor);
1630         }else {
1631             s1 = _T("RUN");
1632             m_pStatusBar->SetPaneText(idxRunning, s1);
1633             m_pStatusBar->SetPaneWidth(idxRunning, s1.GetLength() * 8);
1634             m_pStatusBar->SetPaneBackgroundColor(idxRunning, RunningColor);
1635         }
1636     }
1637     if (nIndex == idxMonitor || nIndex == -1) { // 监控 //
1638 //        s1 = pDoc->m_sMachineType;
1639         if (!m_bMonitoring) {
1640             s1 = _T("[监控停止]");
1641             m_pStatusBar->SetPaneText(idxMonitor, s1);
1642             m_pStatusBar->SetPaneBackgroundColor(idxMonitor);
1643         }else{
1644             s1 = _T("[正在监控]");
1645             m_pStatusBar->SetPaneText(idxMonitor, s1);
1646             m_pStatusBar->SetPaneBackgroundColor(idxMonitor, MonitorColor);
1647         }
1648     }
1649     if (nIndex == idxAddress || nIndex == -1) { // 地址,本站
1650 //        s1 = pDoc->m_sMachineType;
1651         if (!pDoc->m_bOnline) {
1652             s1 = _T("本站");
1653             m_pStatusBar->SetPaneText(idxAddress, s1);
1654             m_pStatusBar->SetPaneBackgroundColor(idxMonitor);
1655         }else {
1656             s1 = _T("本站");
1657             m_pStatusBar->SetPaneText(idxAddress, s1);
1658             m_pStatusBar->SetPaneBackgroundColor(idxMonitor, AddressColor);
1659         }
1660
1661     }
1662     if (nIndex == idxInfoDisp || nIndex == -1) { // INFO DISPLAY
1663 //        s1 = pDoc->m_sMachineType;
1664         m_pStatusBar->SetPaneText(idxInfoDisp, s1);
1665     }
1666
1667     return 0;
1668 }
1669
1670
1671 void CMTerm1View::OnUpdateIndicatorMonitorStatus(CCmdUI *pCmdUI)
1672 {
1673     // TODO: 在此添加命令更新用户界面处理程序代码
1674
1675     //pCmdUI->SetCheck(m_bMonitoring == true);
1676     if (!m_bMonitoring)     pCmdUI->SetText(_T("[监控停止]"));
1677     else     pCmdUI->SetText(_T("[正在监控]"));
1678 }
1679
1680 void CMTerm1View::OnUpdateIndicators(CCmdUI *pCmdUI)
1681 {
1682     // TODO: 在此添加命令更新用户界面处理程序代码
1683     CString s1;
1684     s1.Format(_T("pCmdUI nID %d "));
1685     DbgLog(s1);
1686     pCmdUI->m_nID;
1687     pCmdUI->SetText(_T("KL-D20N16"));
1688 }
1689
1690 void CMTerm1View::OnUpdateMachineType(CCmdUI *pCmdUI)
1691 {
1692     // TODO: 在此添加命令更新用户界面处理程序代码
1693     CString s1;
1694     s1.Format(_T("pCmdUI nID %d "));
1695     DbgLog(s1);
1696     pCmdUI->m_nID;
1697     pCmdUI->SetText(_T("KL-D20N16"));
1698 }
1699
1700 void CMTerm1View::OnUpdateProgramPos(CCmdUI *pCmdUI)
1701 {
1702     // TODO: 在此添加命令更新用户界面处理程序代码
1703     CString s1;
1704     s1.Format(_T("%5d/%5d"), 18, 55);
1705     pCmdUI->SetText(s1);
1706 }
1707
1708 void CMTerm1View::OnUpdateConnectivity(CCmdUI *pCmdUI)
1709 {
1710     // TODO: 在此添加命令更新用户界面处理程序代码
1711     CString s1;
1712     s1 = _T("离线");
1713     s1 = _T("在线");
1714
1715     pCmdUI->SetText(s1);
1716 }
1717 void CMTerm1View::OnUpdateRunStatus(CCmdUI *pCmdUI)
1718 {
1719     // TODO: 在此添加命令更新用户界面处理程序代码
1720     CString s1;
1721     CMTerm1Doc* pDoc = GetDocument();
1722     ASSERT_VALID(pDoc);
1723     if (!pDoc)    return;
1724     if (pDoc->m_bPlcRunning) {
1725         s1 = _T("运行");
1726         m_pStatusBar->SetPaneText(3, s1);
1727         m_pStatusBar->SetPaneTextColor(3, RGB(0, 0, 0));
1728     }
1729     else {
1730         s1 = _T("停止");
1731         m_pStatusBar->SetPaneText(3, s1);
1732         m_pStatusBar->SetPaneTextColor(3, RGB(0, 0, 0));
1733     }
1734     s1.Format(_T("PCmdUI %d %d"), pCmdUI->m_nID, pCmdUI->m_nIndex);
1735     DbgLog(s1);
1736
1737 //    pCmdUI->SetText(s1);
1738 }
1739 void CMTerm1View::OnUpdateMonitorStatus(CCmdUI *pCmdUI)
1740 {
1741     // TODO: 在此添加命令更新用户界面处理程序代码
1742     CString s1;
1743     s1 = _T("停止监控");
1744     s1 = _T("监控中");
1745     if (!m_bMonitoring)     pCmdUI->SetText(_T("[监控停止]"));
1746     else     pCmdUI->SetText(_T("[正在监控]"));
1747
1748 //    pCmdUI->SetText(s1);
1749 }
1750 void CMTerm1View::OnUpdateTargetAddress(CCmdUI *pCmdUI)
1751 {
1752     // TODO: 在此添加命令更新用户界面处理程序代码
1753     CString s1;
1754     s1 = _T("远程");
1755     s1 = _T("本站");
1756     pCmdUI->SetText(s1);
1757 }
1758
1759 void CMTerm1View::OnInputIoComment()
1760 {
1761     // TODO: 在此添加命令处理程序代码
1762     CString s1;
1763     int nRow, nCol;
1764     nRow = m_FocusRow;
1765     nCol = m_FocusCol;
1766     if (nCol < 0) { nCol = 0; }
1767     if (nCol >= m_CellPerLine) { nCol = m_CellPerLine - 1; }
1768
1769     CString sParam;
1770     sParam = Cells[nRow][nCol].sParam;
1771     int nDataType, nDataAddr, nStat;
1772     nDataType = Cells[nRow][nCol].nDataType;
1773     nDataAddr = Cells[nRow][nCol].nDataAddr;
1774     nStat = Cells[nRow][nCol].nStat;
1775
1776     s1.Format(_T("Name %s DataType %d DataAddr %d  Stat %d"),
1777         sParam, nDataType, nDataAddr, nStat);
1778     SysLog(s1);
1779     if (Cells[m_FocusRow][m_FocusCol].sParam == _T("")) {
1780         return;
1781     }
1782
1783     CMTerm1Doc * pDoc = GetDocument();
1784     CString sComment;
1785     pDoc->GetAnno(nDataType, nDataAddr, sComment);
1786     CDialogIoComment dialog1;
1787     dialog1.m_sIOName = sParam;
1788     dialog1.m_sComment = sComment;
1789     dialog1.m_nCoilType = nDataType;
1790     dialog1.m_nCoilAddr = nDataAddr;
1791     INT_PTR r = dialog1.DoModal();
1792     if (r == IDOK)
1793     {
1794         sComment = dialog1.m_sComment;
1795         pDoc->SetAnno(nDataType, nDataAddr, sParam, sComment);
1796         s1.Format(_T("Set %s %d %d  comment -> %s"), sParam, nDataType, nDataAddr, sComment);
1797         SysLog(s1);
1798         //needReDraw = 1;
1799         this->RedrawWindow();
1800     }
1801 }
1802
1803
1804 int CMTerm1View::TransProgToLDS()
1805 {
1806     CString s1;
1807     CMTerm1Doc * pDoc = (CMTerm1Doc*)GetDocument();
1808
1809     // 先扫描分开的程序段
1810     int stpos[100] = { 0 };
1811     int nSts = 0;
1812
1813     for (int i = 0; i < m_nTotalRow && i < 2000; i++) {
1814         for (int j = 0; j < 16; j++) {
1815             Cells[i][j].clear();
1816             s1.Format(_T("%d:%d"), i, j);
1817             Cells[i][j].sCoilName = s1;
1818         }
1819     }
1820     POINT StPts[100];
1821     //    StPts[0] = POINT{ 0, 0 };
1822     POINT EndPt[100];
1823     int nEndPts = 0;
1824     nSts = 0;
1825     int nCurLine = 0;
1826
1827     int cx = 0, cy = 0;
1828     int maxy = 0;
1829     for (int i = 0; i < pDoc->m_nProgSteps; i++)
1830     {
1831         int nOp = pDoc->Progs[i].nOpType1;
1832         int nParamCount = pDoc->Progs[i].nParamCount;
1833         CStringA OpName;
1834         CStringA ShowTxt;
1835         pDoc->OpToTxt(nOp, OpName);
1836         pDoc->OpToShowTxt(nOp, ShowTxt);
1837         int nPairTo = pDoc->Progs[i].PairTo;
1838         int nPairOp = 0;
1839         if (nPairTo) nPairOp = pDoc->Progs[nPairTo].nOpType1;
1840         int nCellType;
1841         switch (nOp)
1842         {
1843
1844         case OP_NOP:
1845             break;
1846         case OP_ST:
1847         case OP_ST_:
1848             if (i == 0) {
1849
1850             }
1851             else {
1852                 //记录当前位置 
1853                 EndPt[nEndPts] = POINT{ cx,cy };
1854                 nEndPts++;
1855                 if (nPairOp == OP_ANS) {
1856                     //继续前进                
1857                     //cx = 0, cy = nCurLine;
1858                     //cx = StPts[nSts - 1].x;
1859                     //nCurLine = cy + 1; //另起一行
1860 ///*                
1861                     nCurLine=cy;
1862                     int hasData = 1;
1863                     while (hasData) {
1864                         hasData = 0;
1865                         for (int j = cx +1; j < m_CellPerLine; j++) {
1866                             if (Cells[nCurLine][j].nType != 0) {
1867                                 nCurLine++; hasData = 1; break;
1868                             }
1869                         }
1870                     }
1871                     //                    nCurLine = maxy + 1; //另起一行
1872                     if (nCurLine > maxy) maxy = nCurLine;
1873                     for (int j = cy; j < nCurLine; j++) {
1874                         Cells[j][cx].bLeftLineDn = 1;
1875                         Cells[j + 1][cx].bLeftLineUp = 1;
1876                     }
1877                     cy = nCurLine;
1878 //*/
1879                 }
1880                 else if (nPairOp == OP_ORS) {
1881                     cx = StPts[nSts - 1].x;
1882                     nCurLine = cy + 1; //另起一行
1883                     int hasData = 1;
1884                     while (hasData) {
1885                         hasData = 0;
1886                         for (int j = cx; j < m_CellPerLine; j++) {
1887                             if (Cells[nCurLine][j].nType != 0) {
1888                                 nCurLine++; hasData = 1; break;
1889                             }
1890                         }
1891                     }
1892                     //                    nCurLine = maxy + 1; //另起一行
1893                     if (nCurLine > maxy) maxy = nCurLine;
1894                     for (int j = cy; j < nCurLine; j++) {
1895                         Cells[j][cx].bLeftLineDn = 1;
1896                         Cells[j + 1][cx].bLeftLineUp = 1;
1897                     }
1898                     cy = nCurLine;
1899                 }
1900                 else if (nPairOp == 0) {
1901                     nCurLine = maxy + 1; //另起一行
1902                     maxy = nCurLine;
1903                     cx = 0; cy = nCurLine;
1904                 }
1905             }
1906             stpos[nSts] = i;
1907             StPts[nSts] = POINT{ cx,cy };
1908             nSts++;
1909             Cells[cy][cx].nType = pDoc->Progs[i].nOpType1 == OP_ST ? typeNO : typeNC; //typeNC
1910             Cells[cy][cx].nProgStep = i;
1911             Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
1912             Cells[cy][cx].sParam = pDoc->Progs[i].Params[0].sParamStr;
1913             Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType;
1914             Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
1915             cx++;    //移到下一格
1916             break;
1917         case OP_ST_EQ:
1918         case OP_ST_NE:
1919         case OP_ST_LT:
1920         case OP_ST_GT:
1921         case OP_ST_LE:
1922         case OP_ST_GE:
1923             if (i == 0) {
1924
1925             }
1926             else {
1927                 //记录当前位置 
1928                 EndPt[nEndPts] = POINT{ cx,cy };
1929                 nEndPts++;
1930                 if (nPairOp == OP_ANS) {
1931                     //继续前进                
1932                     //cx = 0, cy = nCurLine;
1933                 }
1934                 else if (nPairOp == OP_ORS) {
1935                     cx = StPts[nSts - 1].x;
1936                     nCurLine = cy + 1; //另起一行
1937                     int hasData = 1;
1938                     while (hasData) {
1939                         hasData = 0;
1940                         for (int j = cx; j < m_CellPerLine; j++) {
1941                             if (Cells[nCurLine][j].nType != 0) {
1942                                 nCurLine++; hasData = 1; break;
1943                             }
1944                         }
1945                     }
1946                     //                    nCurLine = maxy + 1; //另起一行
1947                     if (nCurLine > maxy) maxy = nCurLine;
1948                     for (int j = cy; j < nCurLine; j++) {
1949                         Cells[j][cx].bLeftLineDn = 1;
1950                         Cells[j + 1][cx].bLeftLineUp = 1;
1951                     }
1952                     cy = nCurLine;
1953                 }
1954                 else if (nPairOp == 0) {
1955                     nCurLine = maxy + 1; //另起一行
1956                     maxy = nCurLine;
1957                     cx = 0; cy = nCurLine;
1958                 }
1959             }
1960             stpos[nSts] = i;
1961             StPts[nSts] = POINT{ cx,cy };
1962             nSts++;
1963             Cells[cy][cx].nType = typeCMP;
1964             Cells[cy][cx].nProgStep = i;
1965             Cells[cy][cx].sParam = OpName;
1966             Cells[cy][cx].sCoilName = ShowTxt;
1967             Cells[cy][cx + 1].nType = typeExt1;
1968             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
1969             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
1970             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
1971             Cells[cy][cx + 2].nType = typeExt1;
1972             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
1973             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
1974             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
1975             cx += 3;    //移到下3格
1976             break;
1977
1978         case OP_AN:
1979         case OP_AN_:
1980
1981             Cells[cy][cx].nType = nOp == OP_AN ? typeNO : typeNC; //typeNC
1982             Cells[cy][cx].nProgStep = i;
1983             Cells[cy][cx].sParam = pDoc->Progs[i].Params[0].sParamStr;
1984             Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
1985             Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType;
1986             Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
1987             cx++;
1988             break;
1989         case OP_AN_EQ:
1990         case OP_AN_NE:
1991         case OP_AN_LT:
1992         case OP_AN_GT:
1993         case OP_AN_LE:
1994         case OP_AN_GE:
1995             Cells[cy][cx].nType = typeCMP;
1996             Cells[cy][cx].nProgStep = i;
1997             Cells[cy][cx].sCoilName = ShowTxt;
1998             Cells[cy][cx + 1].nType = typeExt1;
1999             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2000             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2001             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2002             Cells[cy][cx + 2].nType = typeExt1;
2003             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2004             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2005             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2006             cx += 3;
2007             break;
2008
2009         case OP_OR:
2010         case OP_OR_:
2011             EndPt[nEndPts] = POINT{ cx,cy };
2012             nEndPts++;
2013             cx = StPts[nSts - 1].x;
2014             nCurLine = cy + 1; //另起一行
2015             {
2016                 int hasData = 1;
2017                 while (hasData) {
2018                     hasData = 0;
2019                     for (int j = cx; j < m_CellPerLine; j++) {
2020                         if (Cells[nCurLine][j].nType != 0) {
2021                             nCurLine++; hasData = 1; break;
2022                         }
2023                     }
2024                 }
2025             }
2026             if (nCurLine > maxy)    maxy = nCurLine;
2027             for (int j = cy; j < nCurLine; j++) {
2028                 Cells[j][cx].bLeftLineDn = 1;
2029                 Cells[j + 1][cx].bLeftLineUp = 1;
2030             }
2031             cy = nCurLine;
2032             Cells[cy][cx].nProgStep = i;
2033             Cells[cy][cx].nType = nOp == OP_OR ? typeNO : typeNC; //typeNC
2034             Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
2035             Cells[cy][cx].sParam = pDoc->Progs[i].Params[0].sParamStr;
2036             Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType;
2037             Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2038             cx++;
2039             if (cx < EndPt[nEndPts - 1].x)
2040             {    //本行补齐
2041                 for (int j = cx; j < EndPt[nEndPts - 1].x; j++)
2042                 {
2043                     Cells[cy][j].nType = typeLine1;
2044                 }
2045                 cx = EndPt[nEndPts - 1].x;
2046             }
2047             else {
2048                 //前一行补齐
2049                 for (int j = EndPt[nEndPts - 1].x; j < cx; j++)
2050                 {
2051                     Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1;
2052                 }
2053
2054             }
2055             //连接上下线
2056             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2057             {
2058                 Cells[j][cx].bLeftLineDn = 1;
2059                 Cells[j + 1][cx].bLeftLineUp = 1;
2060             }
2061             //光标位置, 前一结束点位置
2062             cy = EndPt[nEndPts - 1].y;
2063             nEndPts--;
2064
2065             break;
2066         case OP_OR_EQ:
2067         case OP_OR_NE:
2068         case OP_OR_LT:
2069         case OP_OR_GT:
2070         case OP_OR_LE:
2071         case OP_OR_GE:
2072             EndPt[nEndPts] = POINT{ cx,cy };
2073             nEndPts++;
2074             cx = StPts[nSts - 1].x;
2075             nCurLine = cy + 1; //另起一行
2076             {
2077                 int hasData = 1;
2078                 while (hasData) {
2079                     hasData = 0;
2080                     for (int j = cx; j < m_CellPerLine; j++) {
2081                         if (Cells[nCurLine][j].nType != 0) {
2082                             nCurLine++; hasData = 1; break;
2083                         }
2084                     }
2085                 }
2086             }
2087             if (nCurLine > maxy)    maxy = nCurLine;
2088             for (int j = cy; j < nCurLine; j++) {
2089                 Cells[j][cx].bLeftLineDn = 1;
2090                 Cells[j + 1][cx].bLeftLineUp = 1;
2091             }
2092             cy = nCurLine;
2093             Cells[cy][cx].nType = typeCMP;
2094             Cells[cy][cx].nProgStep = i;
2095             Cells[cy][cx].sCoilName = ShowTxt;
2096             Cells[cy][cx + 1].nType = typeExt1;
2097             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2098             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2099             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2100             Cells[cy][cx + 2].nType = typeExt1;
2101             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2102             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2103             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2104             cx += 3;
2105             if (cx < EndPt[nEndPts - 1].x)
2106             {    //本行补齐
2107                 for (int j = cx; j < EndPt[nEndPts - 1].x; j++)
2108                 {
2109                     Cells[cy][j].nType = typeLine1;
2110                 }
2111                 cx = EndPt[nEndPts - 1].x;
2112             }
2113             else {
2114                 //前一行补齐
2115                 for (int j = EndPt[nEndPts - 1].x; j < cx; j++)
2116                 {
2117                     Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1;
2118                 }
2119
2120             }
2121             //连接上下线
2122             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2123             {
2124                 Cells[j][cx].bLeftLineDn = 1;
2125                 Cells[j + 1][cx].bLeftLineUp = 1;
2126             }
2127             //光标位置, 前一结束点位置
2128             cy = EndPt[nEndPts - 1].y;
2129             nEndPts--;
2130
2131             break;
2132         case OP_NOT:
2133             Cells[cy][cx].nType = typeNOT;
2134             Cells[cy][cx].sCoilName = _T("NOT");
2135
2136             Cells[cy][cx].nProgStep = i;
2137             cx++;
2138             break;
2139         case OP_DF:
2140         case OP_DF_:
2141             Cells[cy][cx].nType = nOp == OP_DF ? typeDF : typeDF_;
2142             Cells[cy][cx].sCoilName = nOp == OP_DF ? _T("DF") : _T("DF/");
2143
2144             Cells[cy][cx].nProgStep = i;
2145             cx++;
2146             break;
2147         case OP_ANS:
2148             nSts--;
2149             nEndPts--;
2150
2151             break;
2152         case OP_ORS:
2153             // 当前序列与前面的序列合并。
2154             //当前序列的开始结束位置
2155             //EndPt[nEndPts] = POINT{ cx,cy };
2156             //nEndPts++;
2157             //StPts[nSts - 1]; EndPt[nEndPts - 1];
2158             //前一序列的开始结束位置
2159             StPts[nSts - 1]; EndPt[nEndPts - 1];
2160             //判断二者长度
2161             if (cx < EndPt[nEndPts - 1].x)
2162             {    //本行补齐
2163                 for (int j = cx; j < EndPt[nEndPts - 1].x; j++)
2164                 {
2165                     Cells[cy][j].nType = typeLine1;
2166                 }
2167                 cx = EndPt[nEndPts - 1].x;
2168             }
2169             else {
2170                 //前一行补齐
2171                 for (int j = EndPt[nEndPts - 1].x; j < cx; j++)
2172                 {
2173                     Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1;
2174                 }
2175
2176             }
2177             //连接上下线
2178             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2179             {
2180                 Cells[j][cx].bLeftLineDn = 1;
2181                 Cells[j + 1][cx].bLeftLineUp = 1;
2182             }
2183             //光标位置, 前一结束点位置
2184             cy = EndPt[nEndPts - 1].y;
2185             nSts--;
2186             nEndPts--;
2187
2188             break;
2189         case OP_PSHS:
2190             EndPt[nEndPts] = POINT{ cx,cy };
2191             nEndPts++;
2192             break;
2193         case OP_RDS:
2194             cx = EndPt[nEndPts - 1].x;
2195             for (int j = cx; j < m_CellPerLine; j++) {
2196                 if (Cells[cy][j].nType != 0)
2197                 {
2198                     cy++; j = cx - 1; //break;
2199                 }
2200             }
2201             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2202             {
2203                 Cells[j][cx].bLeftLineDn = 1;
2204                 Cells[j + 1][cx].bLeftLineUp = 1;
2205             }
2206             break;
2207         case OP_POPS:
2208             cx = EndPt[nEndPts - 1].x;
2209             for (int j = cx; j < m_CellPerLine; j++) {
2210                 if (Cells[cy][j].nType != 0)
2211                 {
2212                     cy++; j = cx - 1; break;
2213                 }
2214             }
2215             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2216             {
2217                 Cells[j][cx].bLeftLineDn = 1;
2218                 Cells[j + 1][cx].bLeftLineUp = 1;
2219             }
2220             nEndPts--;
2221
2222             break;
2223         case OP_OUT:
2224         case OP_SET:
2225         case OP_RESET:
2226             nCellType = nOp == OP_OUT ? typeOUT : nOp == OP_SET ? typeSET : typeRESET;
2227             nCurLine = cy;
2228             if (cx <= m_CellPerLine) {
2229
2230                 int hasData = 1;
2231                 while (hasData) {
2232                     hasData = 0;
2233                     for (int j = cx; j < m_CellPerLine; j++) {
2234                         if (Cells[nCurLine][j].nType != 0) {
2235                             nCurLine++; hasData = 1; break;
2236                         }
2237                     }
2238                 }
2239                 //if (nCurLine > maxy)    maxy = nCurLine;
2240                 for (int j = cy; j < nCurLine; j++) {
2241                     Cells[j][cx].bLeftLineDn = 1;
2242                     Cells[j + 1][cx].bLeftLineUp = 1;
2243                 }
2244                 cy = nCurLine;
2245                 for (int j = cx; j < m_CellPerLine; j++)
2246                 {
2247                     Cells[cy][j].nType = typeLine1;
2248                 }
2249                 Cells[cy][m_CellPerLine - 1].nType = nCellType;
2250                 Cells[cy][m_CellPerLine - 1].nProgStep = i;
2251                 Cells[cy][m_CellPerLine - 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2252                 Cells[cy][m_CellPerLine - 1].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
2253                 Cells[cy][m_CellPerLine - 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2254                 Cells[cy][m_CellPerLine - 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2255                 
2256             }
2257             else {
2258                 Cells[cy][cx].nType = nCellType;
2259                 Cells[cy][cx].nProgStep = i;
2260                 Cells[cy][cx].sParam = pDoc->Progs[i].Params[0].sParamStr;
2261                 Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
2262                 Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType;
2263                 Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2264             }
2265             if (cy > maxy) { maxy = cy; }
2266             //cy++;
2267             break;
2268
2269         case OP_TML:
2270         case OP_TMR:
2271         case OP_TMX:
2272         case OP_TMY:
2273             Cells[cy][cx].nType = typeTM;
2274             Cells[cy][cx].nProgStep = i;
2275             Cells[cy][cx].sCoilName = ShowTxt;
2276             Cells[cy][cx + 1].nType = typeExt1;
2277             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2278             Cells[cy][cx + 1].nDataType = KLDataTypeEV;
2279             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2280             Cells[cy][cx + 2].nType = typeExt1;
2281             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2282             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2283             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2284             cx += 3;
2285             break;
2286         case OP_INC:
2287         case OP_DEC:
2288             Cells[cy][cx].nType = typeFN1;
2289             Cells[cy][cx].nProgStep = i;
2290             Cells[cy][cx].sCoilName = ShowTxt;
2291             Cells[cy][cx + 1].nType = typeExt1;
2292             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2293             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2294             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2295             cx += 2;
2296             break;
2297
2298         case OP_MV:
2299         case OP_ADD2:
2300         case OP_SUB2:
2301             Cells[cy][cx].nType = typeFN2;
2302             Cells[cy][cx].nProgStep = i;
2303             Cells[cy][cx].sCoilName = ShowTxt;
2304             Cells[cy][cx + 1].nType = typeExt1;
2305             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2306             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2307             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2308             Cells[cy][cx + 2].nType = typeExt1;
2309             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2310             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2311             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2312             cx += 3;
2313             break;
2314
2315         case OP_ADD3:
2316         case OP_SUB3:
2317         case OP_MUL:
2318         case OP_DIV:
2319             Cells[cy][cx].nType = typeFN3;
2320             Cells[cy][cx].nProgStep = i;
2321             Cells[cy][cx].sCoilName = ShowTxt;
2322             Cells[cy][cx + 1].nType = typeExt1;
2323             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2324             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2325             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2326             Cells[cy][cx + 2].nType = typeExt1;
2327             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2328             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2329             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2330             Cells[cy][cx + 3].nType = typeExt1;
2331             Cells[cy][cx + 3].sParam = pDoc->Progs[i].Params[2].sParamStr;
2332             Cells[cy][cx + 3].nDataType = pDoc->Progs[i].Params[2].nParamType;
2333             Cells[cy][cx + 3].nDataAddr = pDoc->Progs[i].Params[2].nParamAddr;
2334             cx += 4;
2335             break;
2336
2337         default:
2338             break;
2339         }
2340     }
2341     m_nTotalRow = maxy + 1;
2342     /*
2343         for (int i = 0; i < 25; i++)
2344         {
2345             for (int j = 0; j < 16; j++)
2346             {
2347                 Cells[i][j].nType = i;
2348                 s1.Format(_T("%d:%d"), i, j);
2349                 Cells[i][j].sCoilName = s1;
2350             }
2351         }
2352     */
2353     needReDraw = 1;
2354     return 0;
2355 }
2356
2357
2358 int CMTerm1View::TransLDSToProg()
2359 {
2360     // TODO: 在此处添加实现代码.
2361     CMTerm1Doc * pDoc = GetDocument();
2362     CString s1;
2363     s1.Format(_T("Trans LDS to PRrog"));
2364     DbgLog(s1);
2365
2366     //梯形图 数量
2367     s1.Format(_T("Total Lines %d"), m_nTotalRow);
2368     DbgLog(s1);
2369     //分段
2370     int nDivCount = 0;
2371     int Divs[100] = { 0 };
2372     for (int i = 0; i < m_nTotalRow; i++)    {
2373         int nRow = i;
2374         int bConnected = 0;
2375         for (int j = 0; j < m_CellPerLine; j++)        {
2376             int nCol = j;
2377             if (Cells[nRow][nCol].bLeftLineDn) {
2378                 bConnected = 1; break;
2379             }
2380         }
2381         if (!bConnected) {
2382             //找到一处分界点
2383             Divs[nDivCount] = i;
2384             s1.Format(_T("Div at Line %d "), nRow);
2385             DbgLog(s1);
2386             nDivCount++;
2387         }
2388     }
2389     stProgSection allprogs;
2390     //每段单独处理
2391     for (int i = 0; i < nDivCount; i++)    {
2392         int nStartLine, nEndLine;
2393         if (i == 0) { nStartLine = 0; nEndLine = Divs[i]; }
2394         else { nStartLine = Divs[i - 1]+1; nEndLine = Divs[i]; }
2395         s1.Format(_T("Process Line %d - %d "), nStartLine, nEndLine);
2396         DbgLog(s1);
2397         int nCounts[20] = { 0 };
2398         int nCounts2[20] = { 0 };
2399         int nCounts3[20] = { 0 };
2400
2401         s1.Empty();
2402         for (int j = 0; j < m_CellPerLine; j++)    {
2403             int nCount = 0;
2404             int nCount2 = 0;
2405             int nCount3 = 0;
2406             for (int k = nStartLine; k <= nEndLine; k++) {
2407                 if (Cells[k][j].nType) {
2408                     nCount += 1;
2409                     nCount2 += 1;
2410                     nCount3 += 1;
2411                     if (Cells[k][j].bLeftLineUp) nCount2 -= 1;
2412 //                    if (Cells[k][j].bLeftLineDn) nCount2 -= 1;
2413                     if (j != m_CellPerLine - 1)    {
2414                         if (Cells[k][j + 1].bLeftLineUp) nCount3 -= 1;
2415 //                        if (Cells[k][j + 1].bLeftLineDn) nCount3 -= 1;
2416                     }
2417
2418                 }
2419             }
2420             nCounts[j] = nCount;
2421             nCounts2[j] = nCount2;
2422             nCounts3[j] = nCount3;
2423         }
2424         s1.Empty();
2425         for (int j = 0; j < m_CellPerLine; j++) {
2426             s1.AppendFormat(_T(" %d(%d)"), nCounts[j],nCounts3[j]);
2427         }
2428         DbgLog(s1);
2429         s1.Empty();
2430         for (int j = 0; j < m_CellPerLine; j++)    {
2431             s1.AppendFormat(_T(" %d "), nCounts2[j]);
2432         }
2433         DbgLog(s1);
2434         //开始从左到右,从上到下扫描,主要关注 竖直连接线。
2435         int nCurPosX,nCurPosY;
2436         nCurPosY = nStartLine;
2437         nCurPosX = 0;
2438         CString sProg;
2439         int nAllSteps=0;
2440         stProgSection Progsec;
2441         for (int i = nStartLine; i <= nEndLine; i++){
2442             CString sProgSec;
2443             int nSteps = 0;;
2444             nCurPosY = i;
2445             stProgSection thisprogsec;
2446             if (Cells[i][0].nType)
2447             ScanLDSCells(nStartLine, nEndLine, nCurPosY, nCurPosX, 0, thisprogsec, sProgSec,nSteps);
2448             sProg += sProgSec;
2449             nAllSteps += nSteps;
2450             Progsec += thisprogsec;
2451         }
2452         DbgLog(_T("\r\n")+ sProg);
2453         int n = int(Progsec.Progs.size());
2454         s1.Format(_T("progSec steps %d "), n);
2455         DbgLog(s1);
2456         for (int i = 0; i < n; i++) {
2457             int optype = Progsec.Progs[i].nOpType1;
2458             CStringA OpTxtA, OpShowTxtA;
2459             CString OpTxt, OpShowTxt;
2460             pDoc->OpToTxt(optype, OpTxtA);
2461             pDoc->OpToShowTxt(optype, OpShowTxtA);
2462             OpTxt = OpTxtA;
2463             OpShowTxt = OpShowTxtA;
2464             s1.Format(_T("%d %s %s"), optype, OpTxt, OpShowTxt);
2465             DbgLog(s1);
2466         }
2467         allprogs += Progsec;
2468     }
2469     //输出程序
2470     int n=(int)allprogs.Progs.size();
2471     s1.Format(_T("all prog steps %d "), n);
2472     DbgLog(s1);
2473     for (int i = 0; i < n; i++)    {
2474         int optype=allprogs.Progs[i].nOpType1;
df0321 2475         allprogs.Progs[i].PairTo = 0;
Q 2476         allprogs.Progs[i].nBinStep = i;
418cb3 2477         CStringA OpTxtA,OpShowTxtA;
Q 2478         CString OpTxt,OpShowTxt;
2479         pDoc->OpToTxt(optype, OpTxtA);
2480         pDoc->OpToShowTxt(optype, OpShowTxtA);
2481         OpTxt = OpTxtA;
2482         OpShowTxt = OpShowTxtA;
2483         s1.Format(_T("%d %s %s"), optype, OpTxt, OpShowTxt);
df0321 2484         pDoc->Progs[i] = allprogs.Progs[i];
418cb3 2485 //        DbgLog(s1);
Q 2486     }
df0321 2487     pDoc->m_nProgSteps = n;
418cb3 2488     return 0;
Q 2489 }
2490
2491 int CMTerm1View::ScanLDSCells(int nStartLine, int nEndLine, int nPosY, int nPosX, int nLevel, stProgSection & progsec, CString & sProgSec, int &nSteps)
2492 {
2493     // TODO: 在此处添加实现代码.
2494     CString s1;
2495     int nCurPosX, nCurPosY;
2496     int nNextX = 1;
2497     nCurPosY = nPosY;
2498     nCurPosX = nPosX;
df0321 2499     int nCoilType, CoilAddr;
Q 2500     CMTerm1Doc* pDoc = GetDocument();
418cb3 2501     for (int j = nPosX; j < m_CellPerLine; j+=nNextX) {
Q 2502         nCurPosX = j;
2503         //先处理当前单元;
2504         int nType = Cells[nCurPosY][nCurPosX].nType;
2505         CString sCellName = Cells[nCurPosY][nCurPosX].sCoilName;
2506         CMTerm1Doc::stProg theprog;
df0321 2507         CStringA sCellNameA;
Q 2508         sCellNameA = sCellName;
418cb3 2509         if (nType == typeNO) {
Q 2510             if (j==0) {
2511                 s1.Format(_T("%d %d ST %s"), nCurPosY, nCurPosX,sCellName);
2512                 sProgSec.AppendFormat(_T("ST %s\r\n"),sCellName);
2513                 theprog.nOpType1 = OP_ST;
df0321 2514                 theprog.nParamCount = 1;
Q 2515                 pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr);
2516                 theprog.Params[0].nParamType = nCoilType;
2517                 theprog.Params[0].nParamAddr = CoilAddr;
2518                 theprog.Params[0].sParamStr = sCellNameA;
418cb3 2519                 progsec.Append(theprog);
Q 2520             }
2521             else {
2522                 s1.Format(_T("%d %d AN %s"), nCurPosY, nCurPosX, sCellName);
2523                 sProgSec.AppendFormat(_T("NO %s\r\n"), sCellName);
2524                 theprog.nOpType1 = OP_AN;
df0321 2525                 theprog.nParamCount = 1;
Q 2526                 pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr);
2527                 theprog.Params[0].nParamType = nCoilType;
2528                 theprog.Params[0].nParamAddr = CoilAddr;
2529                 theprog.Params[0].sParamStr = sCellNameA;
418cb3 2530                 progsec.Append(theprog);
Q 2531             }
2532             nSteps += 1;
2533             DbgLog(s1);
2534             nNextX =  1;
2535         }else 
2536         if (nType == typeNC) {
2537             if (j == 0) {
2538                 s1.Format(_T("%d %d ST/ %s"), nCurPosY, nCurPosX, sCellName);
2539                 sProgSec.AppendFormat(_T("ST/ %s\r\n"), sCellName);
2540                 theprog.nOpType1 = OP_ST_;
df0321 2541                 theprog.nParamCount = 1;
Q 2542                 pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr);
2543                 theprog.Params[0].nParamType = nCoilType;
2544                 theprog.Params[0].nParamAddr = CoilAddr;
2545                 theprog.Params[0].sParamStr = sCellNameA;
418cb3 2546                 progsec.Append(theprog);
Q 2547
2548             }
2549             else
2550             {
2551                 s1.Format(_T("%d %d AN/ %s"), nCurPosY, nCurPosX, sCellName);
2552                 sProgSec.AppendFormat(_T("AN/ %s\r\n"), sCellName);
2553                 theprog.nOpType1 = OP_AN_;
df0321 2554                 theprog.nParamCount = 1;
Q 2555                 pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr);
2556                 theprog.Params[0].nParamType = nCoilType;
2557                 theprog.Params[0].nParamAddr = CoilAddr;
2558                 theprog.Params[0].sParamStr = sCellNameA;
418cb3 2559                 progsec.Append(theprog);
Q 2560             }
2561             DbgLog(s1);
2562             nSteps += 1;
2563             nNextX =  1;
2564         }else 
2565         if (nType == typePP) {
2566             s1.Format(_T("%d %d PP %s"), nCurPosY, nCurPosX, sCellName);
2567             DbgLog(s1);
2568             //progsec.Append(theprog);
2569             sProgSec.AppendFormat(_T("PP %s\r\n"), sCellName);
2570             nSteps += 1;
2571             nNextX =  1;
2572         }else 
2573         if (nType == typePN) {
2574             s1.Format(_T("%d %d PN %s"), nCurPosY, nCurPosX, sCellName);
2575             DbgLog(s1);
2576             //progsec.Append(theprog);
2577             sProgSec.AppendFormat(_T("PN %s\r\n"), sCellName, sCellName);
2578             nSteps += 1;
2579             nNextX =  1;
2580         }else 
2581         if (nType == typeNOT) {
2582             s1.Format(_T("%d %d NOT %s"), nCurPosY, nCurPosX, sCellName);
2583             DbgLog(s1);
2584             sProgSec.AppendFormat(_T("NOT %s\r\n"), sCellName);
2585             theprog.nOpType1 = OP_NOT;
2586             progsec.Append(theprog);
2587             nSteps += 1;
2588             nNextX =  1;
2589         }else 
2590         if (nType == typeDF) {
2591             s1.Format(_T("%d %d DF %s"), nCurPosY, nCurPosX, sCellName);
2592             DbgLog(s1);
2593             sProgSec.AppendFormat(_T("DF %s\r\n"), sCellName);
2594             theprog.nOpType1 = OP_DF;
2595             progsec.Append(theprog);
2596             nSteps += 1;
2597             nNextX =  1;
2598         }else 
2599         if (nType == typeDF_) {
2600             s1.Format(_T("%d %d DF/ %s"), nCurPosY, nCurPosX, sCellName);
2601             DbgLog(s1);
2602             sProgSec.AppendFormat(_T("DF/ %s\r\n"), sCellName);
2603             theprog.nOpType1 = OP_DF_;
2604             progsec.Append(theprog);
2605             nSteps += 1;
2606             nNextX =  1;
2607         }else 
2608         if (nType == typeOUT) {
2609             s1.Format(_T("%d %d OUT %s"), nCurPosY, nCurPosX, sCellName);
2610             DbgLog(s1);
2611             sProgSec.AppendFormat(_T("OUT %s\r\n"), sCellName);
2612             theprog.nOpType1 = OP_OUT;
df0321 2613             theprog.nParamCount = 1;
Q 2614             pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr);
2615             theprog.Params[0].nParamType = nCoilType;
2616             theprog.Params[0].nParamAddr = CoilAddr;
2617             theprog.Params[0].sParamStr = sCellNameA;
418cb3 2618             progsec.Append(theprog);
Q 2619             nSteps += 1;
2620             nNextX =  1;
2621         }else 
2622         if (nType == typeSET) {
2623             s1.Format(_T("%d %d SET %s"), nCurPosY, nCurPosX, sCellName);
2624             DbgLog(s1);
2625             sProgSec.AppendFormat(_T("SET %s\r\n"), sCellName);
2626             theprog.nOpType1 = OP_SET;
df0321 2627             theprog.nParamCount = 1;
Q 2628             pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr);
2629             theprog.Params[0].nParamType = nCoilType;
2630             theprog.Params[0].nParamAddr = CoilAddr;
2631             theprog.Params[0].sParamStr = sCellNameA;
418cb3 2632             progsec.Append(theprog);
Q 2633             nSteps += 1;
2634             nNextX =  1;
2635         }else 
2636         if (nType == typeRESET) {
2637             s1.Format(_T("%d %d RESET %s"), nCurPosY, nCurPosX, sCellName);
2638             DbgLog(s1);
2639             sProgSec.AppendFormat(_T("RESET %s\r\n"), sCellName);
2640             theprog.nOpType1 = OP_RESET;
df0321 2641             theprog.nParamCount = 1;
Q 2642             pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr);
2643             theprog.Params[0].nParamType = nCoilType;
2644             theprog.Params[0].nParamAddr = CoilAddr;
2645             theprog.Params[0].sParamStr = sCellNameA;
418cb3 2646             progsec.Append(theprog);
Q 2647             nSteps += 1;
2648             nNextX =  1;
2649         }else 
2650         if (nType == typeCMP) {
2651             s1.Format(_T("%d %d CMP %s %s %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX+1].sParam,Cells[nCurPosY][nCurPosX + 2].sParam);
2652             DbgLog(s1);
2653             theprog.nOpType1 = OP_ST_GT;
df0321 2654             theprog.nParamCount = 1;
418cb3 2655             progsec.Append(theprog);
Q 2656             sProgSec.AppendFormat(_T("CMP %s %s %s \r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
2657             nSteps += 1;
2658             nNextX =  3;
2659         }else 
2660         if (nType == typeTM) {
2661             s1.Format(_T("%d %d TM %s %d %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX+1].sParam,Cells[nCurPosY][nCurPosX + 2].sParam);
2662             DbgLog(s1);
2663             theprog.nOpType1 = OP_TMX;
df0321 2664             theprog.nParamCount = 1;
Q 2665             pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr);
2666             theprog.Params[0].nParamType = nCoilType;
2667             theprog.Params[0].nParamAddr = CoilAddr;
2668             theprog.Params[0].sParamStr = sCellNameA;
418cb3 2669             progsec.Append(theprog);
Q 2670             sProgSec.AppendFormat(_T("TM %s %d %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX+1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
2671             nSteps += 1;
2672             nNextX =  3;
2673         }else 
2674         if (nType == typeFN1) {
2675             s1.Format(_T("%d %d FN1 %s %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX + 1].sParam);
2676             DbgLog(s1);
2677             theprog.nOpType1 = OP_INC;
2678             progsec.Append(theprog);
2679             sProgSec.AppendFormat(_T("FN1 %s %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam);
2680             nSteps += 1;
2681             nNextX =  2;
2682         }else 
2683         if (nType == typeFN2) {
2684             s1.Format(_T("%d %d FN2 %s %s %s "), nCurPosY, nCurPosX, sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
2685             DbgLog(s1);
2686             theprog.nOpType1 = OP_MV;
2687             progsec.Append(theprog);
2688             sProgSec.AppendFormat(_T("FN2 %s %s %s \r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
2689             nSteps += 1;
2690             nNextX =  3;
2691         }else 
2692         if (nType == typeFN3) {
2693             s1.Format(_T("%d %d FN3 %s %s %s %s"), nCurPosY, nCurPosX, sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam, Cells[nCurPosY][nCurPosX + 3].sParam);
2694             DbgLog(s1);
2695             theprog.nOpType1 = OP_ADD3;
2696             progsec.Append(theprog);
2697             sProgSec.AppendFormat(_T("FN3 %s %s %s %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam, Cells[nCurPosY][nCurPosX + 3].sParam);
2698             nSteps += 1;
2699             nNextX =  4;
2700         }else {
2701             nNextX =  1;
2702             //continue;
2703         }
2704
2705         if (j + nNextX >= m_CellPerLine) continue;
2706         if (Cells[nCurPosY][j + nNextX].bLeftLineUp || Cells[nCurPosY][j + nNextX].bLeftLineDn) {    // 发现竖线
2707             //先看往上面有没有连接
2708             if (Cells[nCurPosY][j + nNextX].bLeftLineUp) { // 往上面有连接
2709                 s1.Format(_T("%d %d ORS "), nCurPosY, nCurPosX);
2710                 DbgLog(s1);
2711                 theprog.nOpType1 = OP_ORS;
2712                 progsec.Append(theprog);
2713                 sProgSec.AppendFormat(_T("ORS \r\n"));
2714                 nSteps += 1;
2715                 nLevel -= 1;
2716             }
2717             int nLeftUpCon = 0;
2718             if (Cells[nCurPosY][j + nNextX].bLeftLineUp ) nLeftUpCon = 1;
2719             //向下查找,看看竖线的左侧下面还有没有连接其他东西/
2720             int nLeftDnCon = 0;
2721             for (int k = nCurPosY + 1; k <= nEndLine; k++) {
2722                 if (!Cells[k][j + nNextX].bLeftLineUp) break;  // 竖线到最下面的端点了。
2723                 if (Cells[k][j + nNextX - 1 ].nType) { nLeftDnCon += 1; break; }
2724             }
2725             s1.Format(_T("LeftUp %d   LeftDn  %d"), nLeftUpCon, nLeftDnCon);
2726             DbgLog(s1);
2727             if (nLeftDnCon) {    //左侧有连接,那么扫描到这个竖线,继续扫描左侧下面的内容。
2728
2729                 return 1;
2730             }
2731             if (!nLeftDnCon) {// 左侧下面没有连接,那么这个就是左面最后的单元,开始处理右面的单元。
2732                 if (nLeftUpCon) {
2733                     if ( nPosX >0 || nLevel > 0) {
2734                     s1.Format(_T("%d %d ANS "), nCurPosY, nCurPosX);
2735                     DbgLog(s1);
2736                     theprog.nOpType1 = OP_ANS;
2737                     progsec.Append(theprog);
2738                     sProgSec.AppendFormat(_T("ANS \r\n"));
2739                     nSteps += 1;
2740                     nLevel -= 1;
2741                 }
2742
2743                 }
2744                 //从头到尾处理, 查找此竖线的最高位置;
2745                 int nLineTop = nCurPosY;
2746                 int nLineBottom = nCurPosY;
2747                 for (int k = nCurPosY; k >= nStartLine; k--)
2748                 {
2749                     if (!Cells[k][j + nNextX].bLeftLineUp) {  break; }
2750                     nLineTop = k -1;
2751                 }
2752                 // 查找右侧有几个连接
2753                 int nRightCon = 0;
2754                 for (int k = nLineTop; k <= nEndLine; k++) {
2755                     if (Cells[k][j + nNextX].nType) { nRightCon += 1; }
2756                     nLineBottom = k;
2757                     if (!Cells[k][j + nNextX].bLeftLineDn) { break; }
2758                 }
2759                 s1.Format(_T("VLine %d - %d : %d , right = %d "), nLineTop,nLineBottom,j+nNextX,nRightCon);
2760                 DbgLog(s1);
2761                 if (nRightCon == 1) {
2762                     s1.Format(_T(">>>> Go %d : %d , level %d "), nLineTop, j + nNextX, nLevel);
2763                     DbgLog(s1);
2764                     CString ProgSec;
2765                     int theSteps = 0;
2766                     stProgSection thisprogsec;
2767                     int r = ScanLDSCells(nStartLine, nEndLine, nLineTop, j + nNextX, nLevel,thisprogsec, ProgSec,theSteps);
2768                     sProgSec += ProgSec;
2769                     nSteps += theSteps;
2770                     progsec += thisprogsec;
2771                     s1.Format(_T("<<<< Re %d : %d , Result %d "), nLineTop, j + nNextX, r);
2772                     DbgLog(s1);
2773                 }
2774                 else
2775                 {
2776                     int nLastResult = 0;
2777                     int nRightCount = 0;
2778                     CString sCons[100];
2779                     CString ProgSecs[100];
2780                     int res[100] = { 0 };
2781                     int nLastSteps = 0;
2782                     for (int k = nLineTop; k <= nLineBottom; k++)
2783                     {
2784                         //s1.Format(_T("VLine %d - %d : %d       %d of %d "), nLineTop, nLineBottom, j + nNextX, k+1,nRightCon);
2785                         //DbgLog(s1);
2786                         if (Cells[k][j + nNextX].nType) {
2787                             s1.Format(_T(" >>> Go %d : %d , level %d "), k, j + nNextX, nLevel +1);
2788                             DbgLog(s1);
2789                             CString ProgSec;
2790                             int theSteps = 0;
2791                             nLevel += 1;
2792                             stProgSection thisprogsec;
2793                             res[nRightCount] = ScanLDSCells(nStartLine, nEndLine, k, j + nNextX, nLevel ,thisprogsec,ProgSecs[nRightCount],theSteps);
2794                             nLastResult = res[nRightCount];
2795                             nSteps += theSteps;
2796                             progsec += thisprogsec;
2797                             //if (res[nRightCount] > 0) nLevel += 1;
2798                             sProgSec += ProgSec;
2799                             s1.Format(_T(" <<< Re %d : %d , Result %d Steps %d Last %d"), k, j + nNextX, res[nRightCount],theSteps,nLastSteps);
2800                             DbgLog(s1);
2801                             if (nRightCount == 0) {
2802                             }
2803                             else if (res[nRightCount-1] == 0) {
2804                                 s1.Format(_T(" POPS"), k, j + nNextX, nLevel + 1);
2805                                 DbgLog(s1);
2806                                 //sProgSec.AppendFormat(_T("POPS \r\n"));
2807                                 if (nLastSteps > 1) 
2808                                 {
2809                                     if (sCons[nRightCount - 1] == _T("POPS")) { sCons[nRightCount - 1] = _T("RDS"); }
2810                                     else { sCons[nRightCount - 1] = _T("PSHS"); }
2811                                     sCons[nRightCount] = _T("POPS");
2812                                 }
2813                             }
2814                             else {
2815
2816                             }
2817                             nLastSteps = theSteps;
2818                             nRightCount++;
2819                         }
2820                     }
2821                     nLastResult = 0;
2822                     for (int k = 0; k < nRightCount; k++)
2823                     {
2824                         if (nLastResult || res[k]) { s1 = _T("ST") + ProgSecs[k];  ProgSecs[k] =s1; }
2825                         s1= sCons[k] + _T("\r\n") + ProgSecs[k];
2826                         sProgSec.Append(s1);
2827                         nLastResult = res[k];
2828                     }
2829                     if (nLastResult) sProgSec.Append(_T("ANS\r\n"));
2830                     return 0;
2831                 }
2832             }
2833         }
2834     }
2835     return 0;
2836 }
2837