From 89cd7441c184d37f90d4d5311b348e938119765f Mon Sep 17 00:00:00 2001 From: zxd <zxdvslxy@gmail.com> Date: 星期六, 21 十月 2023 12:28:04 +0800 Subject: [PATCH] 修改最后一个单元格不会被读取的问题 --- MTerm1/MTerm1View.cpp | 1355 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 1,039 insertions(+), 316 deletions(-) diff --git a/MTerm1/MTerm1View.cpp b/MTerm1/MTerm1View.cpp index 3e2dbf9..866bc7f 100644 --- a/MTerm1/MTerm1View.cpp +++ b/MTerm1/MTerm1View.cpp @@ -737,6 +737,9 @@ if (needReDraw) { pDC->MoveTo(x0, y0); pDC->LineTo(x0, y0 + m_LinePosY); + //鐢荤洿绔栫嚎 + //pDC->MoveTo(x0, y0 + (0.32 * CellTotalHeight)); + //pDC->LineTo(x0, y0 - (0.69 * CellTotalHeight)); } } if (Cells[nRow][nCol].bLeftLineDn && nCol != 0) @@ -761,9 +764,9 @@ } else if (nType == typeLine2) { //Draw Line - //鐢荤洿妯嚎 -// pDC->MoveTo(x0, y0); -// pDC->LineTo(x0, y0 + CellTotalHeight); + //鐢荤洿绔栫嚎 + pDC->MoveTo(x0, y0 + (0.32 * CellTotalHeight)); + pDC->LineTo(x0, y0 - (0.69 * CellTotalHeight)); } else if (nType == typeNO) { @@ -1152,6 +1155,7 @@ nCol = 0; } } + CellFocusChg(nRow, nCol); } if (nChar == VK_RIGHT) { nCol += 1; @@ -1164,15 +1168,17 @@ nCol = m_CellPerLine - 1; } } + CellFocusChg(nRow, nCol); } if (nChar == VK_UP) { nRow -= 1; if (nRow < 0) { nRow = 0; } + CellFocusChg(nRow, nCol); } if (nChar == VK_DOWN) { nRow += 1; if (nRow >= m_nTotalRow + nLinesinView) { nRow = m_nTotalRow + nLinesinView -1; } - + CellFocusChg(nRow, nCol); } m_FocusRow = nRow; m_FocusCol = nCol; @@ -1215,11 +1221,11 @@ auto p1 = (CMainFrame*)AfxGetMainWnd(); auto p2 = p1->GetInputWnd(); - p2->SetCurCellPos(nRow,nCol,thecell); - + p2->SetCurCellPos(nRow,nCol,thecell); + p2->focusCell = thecell; return 0; } - +//榧犳爣宸﹂敭鐐瑰嚮浜嬩欢 void CMTerm1View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 鍦ㄦ娣诲姞娑堟伅澶勭悊绋嬪簭浠g爜鍜�/鎴栬皟鐢ㄩ粯璁ゅ�� @@ -1476,16 +1482,27 @@ pCmdUI->SetCheck(m_bMonitoring == true); } +/// <summary> +/// 绋嬪簭杞崲鎸夐挳鐐瑰嚮 +/// </summary> void CMTerm1View::OnProgConvert() { - // TODO: 鍦ㄦ娣诲姞鍛戒护澶勭悊绋嬪簭浠g爜 + //杞崲鍓嶅厛瀵筁DS鐨勮鍒欒繘琛屾楠岋紙妫�楠岃鍒欎笌杩斿洖鍙傛暟骞舵湭瀹屽叏纭畾 + // std::pair<int,CString> result = LDSCheckRule(); + //if (result.first == 111) + //{ + // DbgLog(result.second); + // return; + //} + CString s1; s1.Format(_T("Prog Convert")); - SysLog(s1); + SysLog(s1); int r = TransLDSToProg(); s1.Format(_T("LDS To Prog result %d"), r); SysLog(s1); - if (r==0) { + if (r==0) + { // m_bModified = 0; int j=TransProgToLDS(); s1.Format(_T("Porg to LDS retuls %d"), j); @@ -1571,24 +1588,73 @@ return -1; } -void CMTerm1View::SetCellToView(stCell cell1) //**************************************************************************************************// +/// <summary> +/// 璁剧疆Cell鍒扮獥鍙h鍥� +/// </summary> +/// <param name="cell1"></param> +void CMTerm1View::SetCellToView(stCell cell1, int flag) //**************************************************************************************************// { - + bool changeVLine = false; + if ((Cells[m_FocusRow][m_FocusCol].bLeftLineDn != cell1.bLeftLineDn) + || (Cells[m_FocusRow][m_FocusCol].bLeftLineUp != cell1.bLeftLineUp)) + { + changeVLine = true; + } Cells[m_FocusRow][m_FocusCol] = cell1; m_bModified = 1; needReDraw = 1; - m_FocusCol += 1; + Cells[m_FocusRow][0].bEditing = 1; - if (m_nTotalRow < m_FocusRow + 1) { + if (m_nTotalRow < m_FocusRow + 1) + { m_nTotalRow = m_FocusRow + 1; } + //鍗曞厓鏍煎叧鑱斾慨鏀� + switch (flag) + { + case 1: + { + if(Cells[m_FocusRow - 1][m_FocusCol].nType == CMTerm1View::typeExt1) + { + //鍙戦�侀敊璇俊鎭� + DbgLog(_T("鎻掑叆绾电嚎澶辫触锛氬厜鏍囦綅缃敊璇紒鍙傛暟浣嶇疆涓嶅厑璁告坊鍔犵旱绾�")); + return; + } + //娣诲姞绾电嚎鏃跺悓姝ユ坊鍔犱笂涓�琛� + Cells[m_FocusRow - 1][m_FocusCol].bLeftLineDn = 1; + }break; + case 2: + { + if (Cells[m_FocusRow - 1][m_FocusCol].nType == CMTerm1View::typeExt1) + { + //鍙戦�侀敊璇俊鎭� + DbgLog(_T("鍒犻櫎绾电嚎澶辫触锛氬厜鏍囦綅缃敊璇紒鍙傛暟浣嶇疆涓嶅厑璁稿垹闄ょ旱绾�")); + return; + } + //鍒犻櫎绾电嚎鏃跺悓姝ュ垹闄や笂涓�琛� + Cells[m_FocusRow - 1][m_FocusCol].bLeftLineDn = 0; + + }break; + default: + break; + } + //濡傛灉鍙樺寲鐨勬槸绔栫嚎锛岀劍鐐逛笉鍚庣Щ + if (!changeVLine) + { + //鍗曞厓鏍间綅缃悗绉� + m_FocusCol += 1; + } + if (m_FocusCol >= 16) - { m_FocusCol = 0;m_FocusRow += 1; } - + { + m_FocusCol = 0; + m_FocusRow += 1; + } + this->RedrawWindow(); - + this->CellFocusChg(m_FocusRow, m_FocusCol);//鏀瑰彉鐒︾偣 } void CMTerm1View::OnUpdateInsertBlankLine(CCmdUI *pCmdUI) { @@ -1888,16 +1954,21 @@ int stpos[100] = { 0 }; int nSts = 0; - for (int i = 0; i < m_nTotalRow && i < 2000; i++) { - for (int j = 0; j < 16; j++) { + for (int i = 0; i < m_nTotalRow && i < 2000; i++) + { + for (int j = 0; j < 16; j++) + { Cells[i][j].clear(); - s1.Format(_T("%d:%d"), i, j); + s1.Format(_T("%d:%d"), i, j); Cells[i][j].sCoilName = s1; } } POINT StPts[100]; // StPts[0] = POINT{ 0, 0 }; POINT EndPt[100]; + + POINT StrPt[100]; + int nStrPts = 0; int nEndPts = 0; nSts = 0; int nCurLine = 0; @@ -1916,71 +1987,95 @@ pDoc->OpToShowTxt(nOp, ShowTxt); int nPairTo = pDoc->Progs[i].PairTo; int nPairOp = 0; - if (nPairTo) nPairOp = pDoc->Progs[nPairTo].nOpType1; + if (nPairTo) + { + nPairOp = pDoc->Progs[nPairTo].nOpType1; + } int nCellType; switch (nOp) { - case OP_NOP: break; case OP_ST: case OP_ST_: - if (i == 0) { + if (i == 0) + { } - else { + else + { //璁板綍褰撳墠浣嶇疆 EndPt[nEndPts] = POINT{ cx,cy }; nEndPts++; - if (nPairOp == OP_ANS) { + if (nPairOp == OP_ANS) + { //缁х画鍓嶈繘 //cx = 0, cy = nCurLine; //cx = StPts[nSts - 1].x; //nCurLine = cy + 1; //鍙﹁捣涓�琛� - ///* +///* nCurLine = cy; int hasData = 1; while (hasData) { hasData = 0; - for (int j = cx + 1; j < m_CellPerLine; j++) { - if (Cells[nCurLine][j].nType != 0) { + for (int j = cx + 1; j < m_CellPerLine; j++) + { + if (Cells[nCurLine][j].nType != 0) + { nCurLine++; hasData = 1; break; } } } - // nCurLine = maxy + 1; //鍙﹁捣涓�琛� - if (nCurLine > maxy) maxy = nCurLine; - for (int j = cy; j < nCurLine; j++) { + //nCurLine = maxy + 1; //鍙﹁捣涓�琛� + if (nCurLine > maxy) + { + maxy = nCurLine; + } + for (int j = cy; j < nCurLine; j++) + { Cells[j][cx].bLeftLineDn = 1; Cells[j + 1][cx].bLeftLineUp = 1; } cy = nCurLine; //*/ } - else if (nPairOp == OP_ORS) { + else if (nPairOp == OP_ORS) + { cx = StPts[nSts - 1].x; nCurLine = cy + 1; //鍙﹁捣涓�琛� int hasData = 1; - while (hasData) { + while (hasData) + { hasData = 0; - for (int j = cx; j < m_CellPerLine; j++) { - if (Cells[nCurLine][j].nType != 0) { + for (int j = cx; j < m_CellPerLine; j++) + { + if (Cells[nCurLine][j].nType != 0) + { nCurLine++; hasData = 1; break; } } } // nCurLine = maxy + 1; //鍙﹁捣涓�琛� if (nCurLine > maxy) maxy = nCurLine; - for (int j = cy; j < nCurLine; j++) { + for (int j = cy; j < nCurLine; j++) + { Cells[j][cx].bLeftLineDn = 1; Cells[j + 1][cx].bLeftLineUp = 1; } cy = nCurLine; } - else if (nPairOp == 0) { - nCurLine = maxy + 1; //鍙﹁捣涓�琛� - maxy = nCurLine; - cx = 0; cy = nCurLine; + else if (nPairOp == 0) + { + if (i > 0 && nOp == pDoc->Progs[i-1].nOpType1)//濡傛灉鍓嶉潰涔熸槸ST锛岄偅灏变笉鎹㈣ + { + + } + else + { + nCurLine = ++maxy; + cx = 0; + cy = nCurLine; + } } } stpos[nSts] = i; @@ -2089,26 +2184,36 @@ case OP_OR: case OP_OR_: EndPt[nEndPts] = POINT{ cx,cy }; - nEndPts++; + nEndPts++; cx = StPts[nSts - 1].x; nCurLine = cy + 1; //鍙﹁捣涓�琛� { int hasData = 1; - while (hasData) { - hasData = 0; - for (int j = cx; j < m_CellPerLine; j++) { - if (Cells[nCurLine][j].nType != 0) { - nCurLine++; hasData = 1; break; + while (hasData) + { + hasData = 0; + for (int j = cx; j < m_CellPerLine; j++) + { + if (Cells[nCurLine][j].nType != 0) + { + nCurLine++; + hasData = 1; + break; } } } } - if (nCurLine > maxy) maxy = nCurLine; - for (int j = cy; j < nCurLine; j++) { + if (nCurLine > maxy) + { + maxy = nCurLine; + } + for (int j = cy; j < nCurLine; j++) + { Cells[j][cx].bLeftLineDn = 1; Cells[j + 1][cx].bLeftLineUp = 1; } cy = nCurLine; + StPts[nSts] = POINT{ cx,cy };//+++ Cells[cy][cx].nProgStep = i; Cells[cy][cx].nType = nOp == OP_OR ? typeNO : typeNC; //typeNC Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr; @@ -2116,22 +2221,22 @@ Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType; Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr; cx++; - if (cx < EndPt[nEndPts - 1].x) - { //鏈琛ラ綈 - for (int j = cx; j < EndPt[nEndPts - 1].x; j++) - { - Cells[cy][j].nType = typeLine1; - } - cx = EndPt[nEndPts - 1].x; - } - else { - //鍓嶄竴琛岃ˉ榻� - for (int j = EndPt[nEndPts - 1].x; j < cx; j++) - { - Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1; - } + //if (cx <= EndPt[nEndPts - 1].x) + //{ //鏈琛ラ綈 + // for (int j = cx; j < EndPt[nEndPts - 1].x; j++) + // { + // Cells[cy][j].nType = typeLine1; + // } + // cx = EndPt[nEndPts - 1].x; + //} + //else { + // //鍓嶄竴琛岃ˉ榻� + // for (int j = EndPt[nEndPts - 1].x; j < cx; j++) + // { + // Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1; + // } - } + //} //杩炴帴涓婁笅绾� for (int j = EndPt[nEndPts - 1].y; j < cy; j++) { @@ -2140,6 +2245,7 @@ } //鍏夋爣浣嶇疆, 鍓嶄竴缁撴潫鐐逛綅缃� cy = EndPt[nEndPts - 1].y; + nEndPts--; break; @@ -2225,50 +2331,73 @@ cx++; break; case OP_ANS: + //ANS璇存槑鏄湁鐜矾锛屾暣琛岃繘琛岀Щ鍔紙鍚戝彸锛変粠鍚庡悜鍓嶈繘琛岀Щ鍔� + EndPt[nEndPts].y; + for (int i = EndPt[nEndPts-1].x ; i > 0; i--) + { + for (int j = EndPt[nEndPts].x; j >= 0; j--) + { + if (j > 0 + && Cells[cy + 1][j-1].nType == typeNone + || Cells[cy + 1][j - 1].nType == typeLine1 + || Cells[cy + 1][j - 1].nType == typeLine2) + { + continue; + } + + Cells[cy + 1][j] = Cells[cy + 1][j - 1]; + } + } + + Cells[EndPt[nEndPts].y][EndPt[nEndPts-1].x].bLeftLineDn = 1; + Cells[EndPt[nEndPts].y+1][EndPt[nEndPts-1].x].bLeftLineUp = 1; + nSts--; nEndPts--; break; case OP_ORS: - // 褰撳墠搴忓垪涓庡墠闈㈢殑搴忓垪鍚堝苟銆� - //褰撳墠搴忓垪鐨勫紑濮嬬粨鏉熶綅缃� - //EndPt[nEndPts] = POINT{ cx,cy }; - //nEndPts++; - //StPts[nSts - 1]; EndPt[nEndPts - 1]; - //鍓嶄竴搴忓垪鐨勫紑濮嬬粨鏉熶綅缃� - StPts[nSts - 1]; EndPt[nEndPts - 1]; + + if (nEndPts <= 0) + { + break; + } + //鍒ゆ柇浜岃�呴暱搴� if (cx < EndPt[nEndPts - 1].x) - { //鏈琛ラ綈 + { + //鏈琛ラ綈 for (int j = cx; j < EndPt[nEndPts - 1].x; j++) { Cells[cy][j].nType = typeLine1; } cx = EndPt[nEndPts - 1].x; } - else { + else + { //鍓嶄竴琛岃ˉ榻� for (int j = EndPt[nEndPts - 1].x; j < cx; j++) { - Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1; + if (Cells[EndPt[nEndPts - 1].y][j].nType == typeNone) + { + Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1; + } } - } //杩炴帴涓婁笅绾� - for (int j = EndPt[nEndPts - 1].y; j < cy; j++) - { - Cells[j][cx].bLeftLineDn = 1; - Cells[j + 1][cx].bLeftLineUp = 1; - } + + Cells[cy][cx].bLeftLineUp = 1; + Cells[cy-1][cx].bLeftLineDn = 1; + //鍏夋爣浣嶇疆, 鍓嶄竴缁撴潫鐐逛綅缃� - cy = EndPt[nEndPts - 1].y; nSts--; nEndPts--; - + cy = EndPt[nEndPts].y; + cx = EndPt[nEndPts].x; break; case OP_PSHS: - EndPt[nEndPts] = POINT{ cx,cy }; - nEndPts++; + StrPt[nStrPts] = POINT{ EndPt[nEndPts].x,EndPt[nEndPts].y+1 }; + nStrPts++; break; case OP_RDS: cx = EndPt[nEndPts - 1].x; @@ -2285,20 +2414,9 @@ } break; case OP_POPS: - cx = EndPt[nEndPts - 1].x; - for (int j = cx; j < m_CellPerLine; j++) { - if (Cells[cy][j].nType != 0) - { - cy++; j = cx - 1; break; - } - } - for (int j = EndPt[nEndPts - 1].y; j < cy; j++) - { - Cells[j][cx].bLeftLineDn = 1; - Cells[j + 1][cx].bLeftLineUp = 1; - } - nEndPts--; - + nStrPts--; + cy = StrPt[nStrPts].y; + cx = StrPt[nStrPts].x; break; case OP_OUT: case OP_SET: @@ -2439,48 +2557,73 @@ needReDraw = 1; return 0; } - +bool firstCoil = true;//鏈绗竴涓崟鍏冩牸 +bool isPops = false; /// <summary> /// 姊舰鍥捐浆Prog /// </summary> /// <returns></returns> int CMTerm1View::TransLDSToProg() { - // TODO: 鍦ㄦ澶勬坊鍔犲疄鐜颁唬鐮�. CMTerm1Doc * pDoc = GetDocument(); CString s1; s1.Format(_T("Trans LDS to PRrog")); DbgLog(s1); + s1.Format(_T("灏嗘褰㈠浘杞垚prog鏍煎紡")); + DbgLog(s1); - //姊舰鍥� 鏁伴噺 + //姊舰鍥� ROW鏁伴噺 + s1.Format(_T("鎬昏琛屾暟 %d"), m_nTotalRow); + DbgLog(s1); s1.Format(_T("Total Lines %d"), m_nTotalRow); DbgLog(s1); + //鍒嗘 int nDivCount = 0; + //鍒嗘 鐐归泦鍚� int Divs[100] = { 0 }; - for (int i = 0; i < m_nTotalRow; i++) { + for (int i = 0; i < m_nTotalRow; i++) + { int nRow = i; int bConnected = 0; - for (int j = 0; j < m_CellPerLine; j++) { + for (int j = 0; j < m_CellPerLine; j++) + { int nCol = j; - if (Cells[nRow][nCol].bLeftLineDn) { - bConnected = 1; break; + if (Cells[nRow][nCol].bLeftLineDn) + { + bConnected = 1; + s1.Format(_T("row==%d col==%d 鏈夊乏涓嬬珫绾匡紒锛侊紒"), nRow,nCol); + DbgLog(s1); + break; } - } - if (!bConnected) { + } + if (!bConnected) + { //鎵惧埌涓�澶勫垎鐣岀偣 Divs[nDivCount] = i; - s1.Format(_T("Div at Line %d "), nRow); + s1.Format(_T("Div at Line %d 鏄� 锛氾細锛氾細锛氾細锛氾細锛氾細锛氾細鍒嗙晫鐐�"), nRow); DbgLog(s1); nDivCount++; } } - stProgSection allprogs; + + stProgSection allprogs; //姣忔鍗曠嫭澶勭悊 - for (int i = 0; i < nDivCount; i++) { + for (int i = 0; i < nDivCount; i++) + { int nStartLine, nEndLine; - if (i == 0) { nStartLine = 0; nEndLine = Divs[i]; } - else { nStartLine = Divs[i - 1]+1; nEndLine = Divs[i]; } + if (i == 0) + { + nStartLine = 0; + nEndLine = Divs[i]; + } + else + { + nStartLine = Divs[i - 1]+1; + nEndLine = Divs[i]; + } + s1.Format(_T("鏈琛屽彿 璧峰-缁堟锛� %d - %d "), nStartLine, nEndLine); + DbgLog(s1); s1.Format(_T("Process Line %d - %d "), nStartLine, nEndLine); DbgLog(s1); int nCounts[20] = { 0 }; @@ -2488,35 +2631,50 @@ int nCounts3[20] = { 0 }; s1.Empty(); - for (int j = 0; j < m_CellPerLine; j++) { + for (int j = 0; j < m_CellPerLine; j++) + { int nCount = 0; int nCount2 = 0; int nCount3 = 0; - for (int k = nStartLine; k <= nEndLine; k++) { - if (Cells[k][j].nType) { + for (int k = nStartLine; k <= nEndLine; k++) + { + if (Cells[k][j].nType) + { nCount += 1; nCount2 += 1; nCount3 += 1; - if (Cells[k][j].bLeftLineUp) nCount2 -= 1; + if (Cells[k][j].bLeftLineUp) + { + nCount2 -= 1; + } // if (Cells[k][j].bLeftLineDn) nCount2 -= 1; - if (j != m_CellPerLine - 1) { - if (Cells[k][j + 1].bLeftLineUp) nCount3 -= 1; + + if (j != m_CellPerLine - 1) + { + if (Cells[k][j + 1].bLeftLineUp) + { + nCount3 -= 1; + } // if (Cells[k][j + 1].bLeftLineDn) nCount3 -= 1; } - } } nCounts[j] = nCount; nCounts2[j] = nCount2; nCounts3[j] = nCount3; } + s1.Empty(); - for (int j = 0; j < m_CellPerLine; j++) { + for (int j = 0; j < m_CellPerLine; j++) + { s1.AppendFormat(_T(" %d(%d)"), nCounts[j],nCounts3[j]); } + DbgLog(_T("")); + DbgLog(s1); s1.Empty(); - for (int j = 0; j < m_CellPerLine; j++) { + for (int j = 0; j < m_CellPerLine; j++) + { s1.AppendFormat(_T(" %d "), nCounts2[j]); } DbgLog(s1); @@ -2527,26 +2685,39 @@ CString sProg; int nAllSteps=0; stProgSection Progsec; - for (int i = nStartLine; i <= nEndLine; i++){ + for (int i = nStartLine; i <= nEndLine; i++) + { CString sProgSec; int nSteps = 0;; nCurPosY = i; stProgSection thisprogsec; if (Cells[i][0].nType) { - //寰幆閬嶅巻鍗曞厓鏍� - ScanLDSCells(nStartLine, nEndLine, nCurPosY, nCurPosX, 0, thisprogsec, sProgSec, nSteps); + firstCoil = true; + //寰幆閬嶅巻鍗曞厓鏍�(杞崲鐨勯�昏緫鍦ㄨ繖涓嚱鏁�) + //ScanLDSCells(nStartLine, nEndLine, nCurPosY, nCurPosX, 0, thisprogsec, sProgSec, nSteps); + //ScanLDSCells2(nStartLine, nEndLine, nCurPosY, nCurPosX, 0, thisprogsec, sProgSec, nSteps); } - sProg += sProgSec; - nAllSteps += nSteps; - Progsec += thisprogsec; + //sProg += sProgSec; + // nAllSteps += nSteps; + //Progsec += thisprogsec; } - + CString sProgSec; + int nSteps = 0;; + nCurPosY = i; + stProgSection thisprogsec; + ScanLDSCells2(nStartLine, nEndLine, nCurPosY, nCurPosX, 16,0, thisprogsec, sProgSec, nSteps); + sProg += sProgSec; + nAllSteps += nSteps; + Progsec += thisprogsec; DbgLog(_T("\r\n")+ sProg); int n = int(Progsec.Progs.size()); + s1.Format(_T("绋嬪簭娈垫鏁帮細 %d "), n); + DbgLog(s1); s1.Format(_T("progSec steps %d "), n); DbgLog(s1); - for (int i = 0; i < n; i++) { + for (int i = 0; i < n; i++) + { int optype = Progsec.Progs[i].nOpType1; CStringA OpTxtA, OpShowTxtA; CString OpTxt, OpShowTxt; @@ -2559,13 +2730,17 @@ } allprogs += Progsec; } + //杈撳嚭绋嬪簭 int n=(int)allprogs.Progs.size(); + s1.Format(_T("鎬荤▼搴忔鏁� %d "), n); + DbgLog(s1); s1.Format(_T("all prog steps %d "), n); DbgLog(s1); - for (int i = 0; i < n; i++) { + for (int i = 0; i < n; i++) + { int optype=allprogs.Progs[i].nOpType1; - allprogs.Progs[i].PairTo = 0; + allprogs.Progs[i].PairTo = 0;//?????????? allprogs.Progs[i].nBinStep = i; CStringA OpTxtA,OpShowTxtA; CString OpTxt,OpShowTxt; @@ -2587,45 +2762,265 @@ /// </summary> /// <param name="nStartLine"></param> /// <param name="nEndLine"></param> -/// <param name="nPosY"></param> -/// <param name="nPosX"></param> -/// <param name="nLevel"></param> -/// <param name="progsec"></param> -/// <param name="sProgSec"></param> -/// <param name="nSteps"></param> +/// <param name="nPosY">琛�</param> +/// <param name="nPosX">鍒�</param> +/// <param name="nLevel">灞傜骇</param> +/// <param name="progsec">prog鏍煎紡鐨勬寚浠ら泦</param> +/// <param name="sProgSec">鎸囦护闆�</param> +/// <param name="nSteps">绋嬪簭姝ユ暟</param> /// <returns></returns> -int CMTerm1View::ScanLDSCells(int nStartLine, int nEndLine, int nPosY, int nPosX, int nLevel, stProgSection & progsec, CString & sProgSec, int &nSteps) +int CMTerm1View::ScanLDSCells(int nStartLine, int nEndLine, int nPosY, int nPosX, + int nLevel, stProgSection & progsec, CString & sProgSec, int &nSteps) { - // TODO: 鍦ㄦ澶勬坊鍔犲疄鐜颁唬鐮�. CString s1; int nCurPosX, nCurPosY; - int nNextX = 1; + int nNextX = 1;//姝ラ暱(涓嬩釜璧峰鐐圭Щ鍔ㄧ殑璺濈) nCurPosY = nPosY; nCurPosX = nPosX; int nCoilType, CoilAddr; CMTerm1Doc* pDoc = GetDocument(); - for (int j = nPosX; j < m_CellPerLine; j+=nNextX) { + for (int j = nPosX; j < m_CellPerLine; j += nNextX) + { nCurPosX = j; - //鍏堝鐞嗗綋鍓嶅崟鍏�; + //鍏堝鐞嗗綋鍓嶅崟鍏冨熀鏈俊鎭�; int nType = Cells[nCurPosY][nCurPosX].nType; CString sCellName = Cells[nCurPosY][nCurPosX].sCoilName; CMTerm1Doc::stProg theprog; CStringA sCellNameA; sCellNameA = sCellName; - if (nType == typeNO) + + if (j + nNextX >= m_CellPerLine) { - if (j==0) { - s1.Format(_T("%d %d ST %s"), nCurPosY, nCurPosX,sCellName); - sProgSec.AppendFormat(_T("ST %s\r\n"),sCellName); - theprog.nOpType1 = OP_ST; + continue; + } + + //1.鍏堣幏鍙栨鍗曞厓鏍煎彸渚т竴鏍肩殑绔栫嚎 + if (Cells[nCurPosY][j + nNextX].bLeftLineUp + || Cells[nCurPosY][j + nNextX].bLeftLineDn) + { + + //鍏堢湅寰�涓婇潰鏈夋病鏈夎繛鎺� + if (Cells[nCurPosY][j + nNextX].bLeftLineUp) + { + // 寰�涓婇潰鏈夎繛鎺ヤ笖鏈夎Е鐐硅繛鎺ワ紝鎵嶄娇鐢∣RS + s1.Format(_T("%d %d ORS "), nCurPosY, nCurPosX); + DbgLog(s1); + theprog.nOpType1 = OP_ORS; + progsec.Append(theprog); + sProgSec.AppendFormat(_T("ORS \r\n")); + firstCoil = false; + nSteps += 1; + nLevel -= 1; + } + //鍙充晶涓�鏍肩殑宸︿笂鏄惁鏈夐摼鎺� + int nLeftUpCon = 0; + if (Cells[nCurPosY][j + nNextX].bLeftLineUp) + { + nLeftUpCon = 1; + } + //鍚戜笅鏌ユ壘锛岀湅鐪嬬珫绾跨殑鍙充晶涓�鏍肩殑宸︿晶涓嬮潰杩樻湁娌℃湁杩炴帴鍏朵粬涓滆タ + int nLeftDnCon = 0;//鍗曞厓鏍煎彸渚т竴鏍肩殑宸︿晶鍚戜笅杩炴帴鏁� + for (int k = nCurPosY; k <= nEndLine; k++) + { + if (Cells[k][j + nNextX].bLeftLineDn) + { + if (Cells[k][j + nNextX - 1].nType) + { + nLeftDnCon += 1; + } + } + else + { + break; // 绔栫嚎鍒版渶涓嬮潰鐨勭鐐逛簡銆� + } + } + + s1.Format(_T("LeftUp %d LeftDn %d"), nLeftUpCon, nLeftDnCon); + DbgLog(s1); + + //鍙充晶涓�鏍肩殑宸︿晶涓嬮潰鏈夎繛鎺ワ紝閭d箞鎵弿鍒拌繖涓珫绾挎椂杩斿洖锛岀户缁壂鎻忓乏渚т笅闈㈢殑鍐呭銆� + if (nLeftDnCon) + { + return 1; + } + //鍙充晶涓�鏍肩殑宸︿晶涓嬮潰娌℃湁杩炴帴锛岄偅涔堣繖涓氨鏄乏闈㈡渶鍚庣殑鍗曞厓锛屽紑濮嬪鐞嗗彸闈㈢殑鍗曞厓銆� + else + { + if (nLeftUpCon) + { + if (nPosX > 0 || nLevel > 0) + { + s1.Format(_T("%d %d ANS "), nCurPosY, nCurPosX); + DbgLog(s1); + theprog.nOpType1 = OP_ANS; + progsec.Append(theprog); + sProgSec.AppendFormat(_T("ANS \r\n")); + nSteps += 1; + nLevel -= 1; + } + } + //浠庡ご鍒板熬澶勭悊, 鏌ユ壘姝ょ珫绾跨殑鏈�楂樹綅缃�; + int nLineTop = nCurPosY; + int nLineBottom = nCurPosY; + for (int k = nCurPosY; k >= nStartLine; k--) + { + if (!Cells[k][j + nNextX].bLeftLineUp) + { + break; + } + nLineTop = k - 1; + } + + // 鏌ユ壘鍙充晶鏈夊嚑涓繛鎺� + int nRightCon = 0;//鍗曞厓鏍煎彸渚ц繛鎺ユ暟 + for (int k = nLineTop; k <= nEndLine; k++) + { + if (Cells[k][j + nNextX].nType) + { + nRightCon += 1; + } + nLineBottom = k; + if (!Cells[k][j + nNextX].bLeftLineDn) + { + break; + } + } + s1.Format(_T("VLine %d - %d : %d , right = %d "), nLineTop, nLineBottom, j + nNextX, nRightCon); + DbgLog(s1); + + if (nRightCon == 1) + { + s1.Format(_T(">>>> Go %d : %d , level %d "), nLineTop, j + nNextX, nLevel); + DbgLog(s1); + CString ProgSec; + int theSteps = 0; + stProgSection thisprogsec; + + //杩欐湁闂锛屽簲璇ユ槸鍦ㄦ渶楂樼偣鐨勬椂鍊欙紝鍗曠嫭杩涜涓�娆¤浆鎹紵 + int r = ScanLDSCells(nStartLine, nEndLine, nLineTop, j + nNextX, nLevel, thisprogsec, ProgSec, theSteps); + + sProgSec += ProgSec; + nSteps += theSteps; + progsec += thisprogsec; + s1.Format(_T("<<<< Re %d : %d , Result %d "), nLineTop, j + nNextX, 0); + DbgLog(s1); + continue; + } + else + { + int nLastResult = 0; + int nRightCount = 0; + CString sCons[100]; + CString ProgSecs[100]; + int res[100] = { 0 }; + int nLastSteps = 0; + for (int k = nLineTop; k <= nLineBottom; k++) + { + //s1.Format(_T("VLine %d - %d : %d %d of %d "), nLineTop, nLineBottom, j + nNextX, k+1,nRightCon); + //DbgLog(s1); + if (Cells[k][j + nNextX].nType) + { + s1.Format(_T(" >>> Go %d : %d , level %d "), k, j + nNextX, nLevel + 1); + DbgLog(s1); + CString ProgSec; + int theSteps = 0; + nLevel += 1; + stProgSection thisprogsec; + res[nRightCount] = ScanLDSCells(nStartLine, nEndLine, k, j + nNextX, nLevel, thisprogsec, ProgSecs[nRightCount], theSteps); + nLastResult = res[nRightCount]; + nSteps += theSteps; + progsec += thisprogsec; + //if (res[nRightCount] > 0) nLevel += 1; + sProgSec += ProgSec; + s1.Format(_T(" <<< Re %d : %d , Result %d Steps %d Last %d"), k, j + nNextX, res[nRightCount], theSteps, nLastSteps); + DbgLog(s1); + if (nRightCount == 0) + { + //杩欓噷鏄笉鏄簲璇ュ仛鐐逛粈涔� + } + else if (res[nRightCount - 1] == 0) + { + s1.Format(_T(" POPS"), k, j + nNextX, nLevel + 1); + DbgLog(s1); + //sProgSec.AppendFormat(_T("POPS \r\n")); + if (nLastSteps > 1) + { + if (sCons[nRightCount - 1] == _T("POPS")) + { + sCons[nRightCount - 1] = _T("RDS"); + } + else + { + sCons[nRightCount - 1] = _T("PSHS"); + } + sCons[nRightCount] = _T("POPS"); + } + } + else + { + + } + nLastSteps = theSteps; + nRightCount++; + } + } + nLastResult = 0; + for (int k = 0; k < nRightCount; k++) + { + if (nLastResult || res[k]) + { + s1 = _T("ST") + ProgSecs[k]; + + ProgSecs[k] = s1; + } + s1 = sCons[k] + _T("\r\n") + ProgSecs[k]; + sProgSec.Append(s1); + nLastResult = res[k]; + } + if (nLastResult) + { + sProgSec.Append(_T("ANS\r\n")); + } + return 0; + } + } + } + //濡傛灉娌℃湁绔栫嚎鐩存帴缈昏瘧 + else + { + Translate2Prog(nType, j + nNextX, nLevel, sCellName, progsec, sProgSec, nSteps); + } + /* + #pragma region 鏍规嵁鍗曞厓鏍肩被鍨嬭浆鎹负鎸囦护鍜宲rog + + if (nType == typeNO) + { + if (firstCoil && nType != typeLine1 && nType != typeLine2) + { + //鍏堢湅寰�涓婇潰鏈夋病鏈夎繛鎺� + if (Cells[nCurPosY][j + nNextX].bLeftLineUp) + { + // 寰�涓婇潰鏈夎繛鎺ヤ笖鏈夎Е鐐硅繛鎺ワ紝鎵嶄娇鐢∣R + s1.Format(_T("%d %d OR %s"), nCurPosY, nCurPosX, sCellName); + sProgSec.AppendFormat(_T("OR %s\r\n"), sCellName); + theprog.nOpType1 = OP_OR; + } + else + { + s1.Format(_T("%d %d ST %s"), nCurPosY, nCurPosX, sCellName); + sProgSec.AppendFormat(_T("ST %s\r\n"), sCellName); + theprog.nOpType1 = OP_ST; + } theprog.nParamCount = 1; pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr); theprog.Params[0].nParamType = nCoilType; theprog.Params[0].nParamAddr = CoilAddr; theprog.Params[0].sParamStr = sCellNameA; progsec.Append(theprog); + firstCoil = false; } - else { + else + { s1.Format(_T("%d %d AN %s"), nCurPosY, nCurPosX, sCellName); sProgSec.AppendFormat(_T("NO %s\r\n"), sCellName); theprog.nOpType1 = OP_AN; @@ -2638,10 +3033,12 @@ } nSteps += 1; DbgLog(s1); - nNextX = 1; - }else - if (nType == typeNC) { - if (j == 0) { + nNextX = 1; + } + else if (nType == typeNC) + { + if (firstCoil && nType != typeLine1 && nType != typeLine2) + { s1.Format(_T("%d %d ST/ %s"), nCurPosY, nCurPosX, sCellName); sProgSec.AppendFormat(_T("ST/ %s\r\n"), sCellName); theprog.nOpType1 = OP_ST_; @@ -2651,7 +3048,7 @@ theprog.Params[0].nParamAddr = CoilAddr; theprog.Params[0].sParamStr = sCellNameA; progsec.Append(theprog); - + firstCoil = false; } else { @@ -2667,52 +3064,58 @@ } DbgLog(s1); nSteps += 1; - nNextX = 1; - }else - if (nType == typePP) { + nNextX = 1; + } + else if (nType == typePP) + { s1.Format(_T("%d %d PP %s"), nCurPosY, nCurPosX, sCellName); DbgLog(s1); //progsec.Append(theprog); sProgSec.AppendFormat(_T("PP %s\r\n"), sCellName); nSteps += 1; - nNextX = 1; - }else - if (nType == typePN) { + nNextX = 1; + } + else if (nType == typePN) + { s1.Format(_T("%d %d PN %s"), nCurPosY, nCurPosX, sCellName); DbgLog(s1); //progsec.Append(theprog); sProgSec.AppendFormat(_T("PN %s\r\n"), sCellName, sCellName); nSteps += 1; - nNextX = 1; - }else - if (nType == typeNOT) { + nNextX = 1; + } + else if (nType == typeNOT) + { s1.Format(_T("%d %d NOT %s"), nCurPosY, nCurPosX, sCellName); DbgLog(s1); sProgSec.AppendFormat(_T("NOT %s\r\n"), sCellName); theprog.nOpType1 = OP_NOT; progsec.Append(theprog); nSteps += 1; - nNextX = 1; - }else - if (nType == typeDF) { + nNextX = 1; + } + else if (nType == typeDF) + { s1.Format(_T("%d %d DF %s"), nCurPosY, nCurPosX, sCellName); DbgLog(s1); sProgSec.AppendFormat(_T("DF %s\r\n"), sCellName); theprog.nOpType1 = OP_DF; progsec.Append(theprog); nSteps += 1; - nNextX = 1; - }else - if (nType == typeDF_) { + nNextX = 1; + } + else if (nType == typeDF_) + { s1.Format(_T("%d %d DF/ %s"), nCurPosY, nCurPosX, sCellName); DbgLog(s1); sProgSec.AppendFormat(_T("DF/ %s\r\n"), sCellName); theprog.nOpType1 = OP_DF_; progsec.Append(theprog); nSteps += 1; - nNextX = 1; - }else - if (nType == typeOUT) { + nNextX = 1; + } + else if (nType == typeOUT) + { s1.Format(_T("%d %d OUT %s"), nCurPosY, nCurPosX, sCellName); DbgLog(s1); sProgSec.AppendFormat(_T("OUT %s\r\n"), sCellName); @@ -2724,9 +3127,10 @@ theprog.Params[0].sParamStr = sCellNameA; progsec.Append(theprog); nSteps += 1; - nNextX = 1; - }else - if (nType == typeSET) { + nNextX = 1; + } + else if (nType == typeSET) + { s1.Format(_T("%d %d SET %s"), nCurPosY, nCurPosX, sCellName); DbgLog(s1); sProgSec.AppendFormat(_T("SET %s\r\n"), sCellName); @@ -2738,9 +3142,10 @@ theprog.Params[0].sParamStr = sCellNameA; progsec.Append(theprog); nSteps += 1; - nNextX = 1; - }else - if (nType == typeRESET) { + nNextX = 1; + } + else if (nType == typeRESET) + { s1.Format(_T("%d %d RESET %s"), nCurPosY, nCurPosX, sCellName); DbgLog(s1); sProgSec.AppendFormat(_T("RESET %s\r\n"), sCellName); @@ -2752,20 +3157,22 @@ theprog.Params[0].sParamStr = sCellNameA; progsec.Append(theprog); nSteps += 1; - nNextX = 1; - }else - if (nType == typeCMP) { - s1.Format(_T("%d %d CMP %s %s %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX+1].sParam,Cells[nCurPosY][nCurPosX + 2].sParam); + nNextX = 1; + } + else if (nType == typeCMP) + { + s1.Format(_T("%d %d CMP %s %s %s"), nCurPosY, nCurPosX, sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam); DbgLog(s1); theprog.nOpType1 = OP_ST_GT; theprog.nParamCount = 1; progsec.Append(theprog); sProgSec.AppendFormat(_T("CMP %s %s %s \r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam); nSteps += 1; - nNextX = 3; - }else - if (nType == typeTM) { - s1.Format(_T("%d %d TM %s %d %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX+1].sParam,Cells[nCurPosY][nCurPosX + 2].sParam); + nNextX = 3; + } + else if (nType == typeTM) + { + s1.Format(_T("%d %d TM %s %d %s"), nCurPosY, nCurPosX, sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam); DbgLog(s1); theprog.nOpType1 = OP_TMX; theprog.nParamCount = 1; @@ -2774,174 +3181,490 @@ theprog.Params[0].nParamAddr = CoilAddr; theprog.Params[0].sParamStr = sCellNameA; progsec.Append(theprog); - sProgSec.AppendFormat(_T("TM %s %d %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX+1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam); + sProgSec.AppendFormat(_T("TM %s %d %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam); nSteps += 1; - nNextX = 3; - }else - if (nType == typeFN1) { - s1.Format(_T("%d %d FN1 %s %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX + 1].sParam); + nNextX = 3; + } + else if (nType == typeFN1) + { + s1.Format(_T("%d %d FN1 %s %s"), nCurPosY, nCurPosX, sCellName, Cells[nCurPosY][nCurPosX + 1].sParam); DbgLog(s1); theprog.nOpType1 = OP_INC; progsec.Append(theprog); sProgSec.AppendFormat(_T("FN1 %s %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam); nSteps += 1; - nNextX = 2; - }else - if (nType == typeFN2) { + nNextX = 2; + } + else if (nType == typeFN2) + { s1.Format(_T("%d %d FN2 %s %s %s "), nCurPosY, nCurPosX, sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam); DbgLog(s1); theprog.nOpType1 = OP_MV; progsec.Append(theprog); sProgSec.AppendFormat(_T("FN2 %s %s %s \r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam); nSteps += 1; - nNextX = 3; - }else - if (nType == typeFN3) { + nNextX = 3; + } + else if (nType == typeFN3) + { 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); DbgLog(s1); theprog.nOpType1 = OP_ADD3; progsec.Append(theprog); 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); nSteps += 1; - nNextX = 4; - }else { - nNextX = 1; + nNextX = 4; + } + else + { + nNextX = 1; //continue; } + + #pragma endregion + */ + } + return 0; + } +// 璁板綍y,x +std::pair<int, int> popsPoint[100]; int nPSHS = -1; +int CMTerm1View::ScanLDSCells2(int nStartLine, int nEndLine, int nPosY, int nPosX, int nSizeX, + int nLevel, stProgSection& progsec, CString& sProgSec, int& nSteps) +{ + CString s1; + int nCurPosX, nCurPosY; + int nNextX = 0;//姝ラ暱锛堝埌涓嬩釜绾垮湀璧峰浣嶇疆搴旂Щ鍔ㄨ窛绂� + nCurPosY = nStartLine; + nCurPosX = nPosX; + int nCoilType, CoilAddr; + CMTerm1Doc* pDoc = GetDocument(); - if (j + nNextX >= m_CellPerLine) continue; - if (Cells[nCurPosY][j + nNextX].bLeftLineUp || Cells[nCurPosY][j + nNextX].bLeftLineDn) { // 鍙戠幇绔栫嚎 - //鍏堢湅寰�涓婇潰鏈夋病鏈夎繛鎺� - if (Cells[nCurPosY][j + nNextX].bLeftLineUp) { // 寰�涓婇潰鏈夎繛鎺� + for (int j = nPosX; j < nSizeX; j += nNextX) + { + nCurPosX = j; + //鍏堝鐞嗗綋鍓嶅崟鍏�; + int nType = Cells[nCurPosY][nCurPosX].nType; + CString sCellName = Cells[nCurPosY][nCurPosX].sCoilName; + CMTerm1Doc::stProg theprog; + CStringA sCellNameA; + sCellNameA = sCellName; + CString ProgSec; + int theSteps = 0; + + stProgSection thisprogsec; + + //鍒ゆ柇瓒婄晫 + if (j + nNextX > m_CellPerLine) + { + continue; + } + //if (!firstCoil && Cells[nCurPosY][j].bLeftLineUp) + //{ + // break; + //} + if (Cells[nCurPosY][nCurPosX].nType == typeNone) + { + nNextX = 1; + continue; + } + //寮�濮嬬炕璇戝崟涓崟鍏冩牸锛屽苟杩斿洖涓嬩釜鍗曞厓鏍间綅缃� + nNextX = Translate2Prog(nType, nCurPosY, nCurPosX, sCellName, progsec, sProgSec, nSteps); + //1.鍒ゆ柇姝ゅ崟鍏冩牸鍙充晶涓�鏍兼槸鍚︽湁鍚戜笅鐨勭珫绾� + if (Cells[nCurPosY][j + nNextX].bLeftLineDn) + { + //1.1:鏈夊垎鏀紝鐩存帴寮�濮嬭鍙栦笅涓�琛� + if (Cells[nCurPosY +1][j].nType == typeNone) + { + if (Cells[nCurPosY + 1][j + nNextX].nType != typeNone) + { + firstCoil = true; + } + continue; + } + + firstCoil = true; + ScanLDSCells2(nCurPosY + 1, nCurPosY + 1, nCurPosY + 1, 0, j + nNextX, ++nLevel, thisprogsec, ProgSec, theSteps); + + //鏈塐R鍏崇郴涓斾笉鍙竴涓妭鐐� + if (theSteps > 1 && nLevel > 0) + { + // 姝ユ暟澶т簬1锛屾槸澶嶅悎缁撴灉锛屾墠浣跨敤ORS s1.Format(_T("%d %d ORS "), nCurPosY, nCurPosX); DbgLog(s1); theprog.nOpType1 = OP_ORS; - progsec.Append(theprog); - sProgSec.AppendFormat(_T("ORS \r\n")); + //progsec.Append(theprog); + //sProgSec.AppendFormat(_T("ORS \r\n")); + thisprogsec.Append(theprog); + ProgSec.AppendFormat(_T("ORS \r\n")); + firstCoil = false; nSteps += 1; - nLevel -= 1; } - int nLeftUpCon = 0; - if (Cells[nCurPosY][j + nNextX].bLeftLineUp ) nLeftUpCon = 1; - //鍚戜笅鏌ユ壘锛岀湅鐪嬬珫绾跨殑宸︿晶涓嬮潰杩樻湁娌℃湁杩炴帴鍏朵粬涓滆タ/ - int nLeftDnCon = 0; - for (int k = nCurPosY + 1; k <= nEndLine; k++) { - if (!Cells[k][j + nNextX].bLeftLineUp) break; // 绔栫嚎鍒版渶涓嬮潰鐨勭鐐逛簡銆� - if (Cells[k][j + nNextX - 1 ].nType) { nLeftDnCon += 1; break; } - } - s1.Format(_T("LeftUp %d LeftDn %d"), nLeftUpCon, nLeftDnCon); - DbgLog(s1); - if (nLeftDnCon) { //宸︿晶鏈夎繛鎺ワ紝閭d箞鎵弿鍒拌繖涓珫绾匡紝缁х画鎵弿宸︿晶涓嬮潰鐨勫唴瀹广�� - return 1; - } - if (!nLeftDnCon) {// 宸︿晶涓嬮潰娌℃湁杩炴帴锛岄偅涔堣繖涓氨鏄乏闈㈡渶鍚庣殑鍗曞厓锛屽紑濮嬪鐞嗗彸闈㈢殑鍗曞厓銆� - if (nLeftUpCon) { - if ( nPosX >0 || nLevel > 0) { - s1.Format(_T("%d %d ANS "), nCurPosY, nCurPosX); - DbgLog(s1); - theprog.nOpType1 = OP_ANS; - progsec.Append(theprog); - sProgSec.AppendFormat(_T("ANS \r\n")); - nSteps += 1; - nLevel -= 1; - } - - } - //浠庡ご鍒板熬澶勭悊, 鏌ユ壘姝ょ珫绾跨殑鏈�楂樹綅缃�; - int nLineTop = nCurPosY; - int nLineBottom = nCurPosY; - for (int k = nCurPosY; k >= nStartLine; k--) + //1.2:浠庡悗鍚戝墠鏌ユ壘涓嬩竴琛屾槸鍚﹁繕鏈夊悜涓婄殑绔栫嚎锛堝舰鎴愰棴鐜級锛圤RS銆丄NS锛� + for (int k = j; k >= 0; k--) + { + if (Cells[nCurPosY + 1][k].nType == typeNone) { - if (!Cells[k][j + nNextX].bLeftLineUp) { break; } - nLineTop = k -1; + //濡傛灉閬囧埌绌烘牸锛岃繕娌℃悳鍒帮紝灏辩粨鏉熸悳绱� + break; } - // 鏌ユ壘鍙充晶鏈夊嚑涓繛鎺� - int nRightCon = 0; - for (int k = nLineTop; k <= nEndLine; k++) { - if (Cells[k][j + nNextX].nType) { nRightCon += 1; } - nLineBottom = k; - if (!Cells[k][j + nNextX].bLeftLineDn) { break; } - } - s1.Format(_T("VLine %d - %d : %d , right = %d "), nLineTop,nLineBottom,j+nNextX,nRightCon); - DbgLog(s1); - if (nRightCon == 1) { - s1.Format(_T(">>>> Go %d : %d , level %d "), nLineTop, j + nNextX, nLevel); - DbgLog(s1); - CString ProgSec; - int theSteps = 0; - stProgSection thisprogsec; - - // - int r = ScanLDSCells(nStartLine, nEndLine, nLineTop, j + nNextX, nLevel,thisprogsec, ProgSec,theSteps); - - sProgSec += ProgSec; - nSteps += theSteps; - progsec += thisprogsec; - s1.Format(_T("<<<< Re %d : %d , Result %d "), nLineTop, j + nNextX, r); - DbgLog(s1); - } - else + if (Cells[nCurPosY+1][k].bLeftLineUp) { - int nLastResult = 0; - int nRightCount = 0; - CString sCons[100]; - CString ProgSecs[100]; - int res[100] = { 0 }; - int nLastSteps = 0; - for (int k = nLineTop; k <= nLineBottom; k++) + //濡傛灉鏈変竴鏉$珫绾匡紝璇存槑鏄舰鎴愪簡鐜紝瑕佺敤ANS + if (theSteps >= 1 && nLevel > 0) { - //s1.Format(_T("VLine %d - %d : %d %d of %d "), nLineTop, nLineBottom, j + nNextX, k+1,nRightCon); - //DbgLog(s1); - if (Cells[k][j + nNextX].nType) { - s1.Format(_T(" >>> Go %d : %d , level %d "), k, j + nNextX, nLevel +1); - DbgLog(s1); - CString ProgSec; - int theSteps = 0; - nLevel += 1; - stProgSection thisprogsec; - res[nRightCount] = ScanLDSCells(nStartLine, nEndLine, k, j + nNextX, nLevel ,thisprogsec,ProgSecs[nRightCount],theSteps); - nLastResult = res[nRightCount]; - nSteps += theSteps; - progsec += thisprogsec; - //if (res[nRightCount] > 0) nLevel += 1; - sProgSec += ProgSec; - s1.Format(_T(" <<< Re %d : %d , Result %d Steps %d Last %d"), k, j + nNextX, res[nRightCount],theSteps,nLastSteps); - DbgLog(s1); - if (nRightCount == 0) { - } - else if (res[nRightCount-1] == 0) { - s1.Format(_T(" POPS"), k, j + nNextX, nLevel + 1); - DbgLog(s1); - //sProgSec.AppendFormat(_T("POPS \r\n")); - if (nLastSteps > 1) - { - if (sCons[nRightCount - 1] == _T("POPS")) { sCons[nRightCount - 1] = _T("RDS"); } - else { sCons[nRightCount - 1] = _T("PSHS"); } - sCons[nRightCount] = _T("POPS"); - } - } - else { - - } - nLastSteps = theSteps; - nRightCount++; - } + //姝ユ暟澶т簬1锛屾槸澶嶅悎缁撴灉锛屼娇鐢ˋNS + s1.Format(_T("%d %d ANS "), nCurPosY, nCurPosX); + DbgLog(s1); + theprog.nOpType1 = OP_ANS; + //progsec.Append(theprog); + //sProgSec.AppendFormat(_T("ANS \r\n")); + thisprogsec.Append(theprog); + ProgSec.AppendFormat(_T("ANS \r\n")); + nSteps += 1; } - nLastResult = 0; - for (int k = 0; k < nRightCount; k++) - { - if (nLastResult || res[k]) { s1 = _T("ST") + ProgSecs[k]; ProgSecs[k] =s1; } - s1= sCons[k] + _T("\r\n") + ProgSecs[k]; - sProgSec.Append(s1); - nLastResult = res[k]; - } - if (nLastResult) sProgSec.Append(_T("ANS\r\n")); - return 0; } } + + //灏嗚浆鎹㈠畬鎴愮殑閮ㄥ垎鍔犲叆鍒版�婚泦涓� + nSteps += theSteps; + progsec += thisprogsec; + sProgSec += ProgSec; + + //1.3:鏌ヨ姝ゅ垎鏀笅涓�绾ц繛鎺ョ偣宸﹀彸鍧囧瓨鍦ㄨ妭鐐癸紝瀛樺湪灏盤SHS + if (Cells[nCurPosY + 1][j].nType != typeNone + && Cells[nCurPosY + 1][j + 1].nType != typeNone) + { + ++nPSHS; + CString push = _T("PSHS \r\n"); + theprog.nOpType1 = OP_PSHS; + progsec.Append(theprog); + sProgSec.Append(push); + popsPoint[nPSHS] = std::make_pair(nCurPosY + 1, j + 1); + } + }//end 1.鍒ゆ柇姝ゅ崟鍏冩牸鍙充晶涓�鏍兼槸鍚︽湁鍚戜笅鐨勭珫绾� + + } + nLevel--; + //宸插洖鍒拌捣濮嬪眰 + if (nLevel == 0) + { + CMTerm1Doc::stProg theprog; + for (int i = nPSHS; i >= 0; i--) + { + //+POP + CString pop = _T("POPS \r\n"); + theprog.nOpType1 = OP_POPS; + progsec.Append(theprog); + sProgSec.Append(pop); + //+fanyi + //寮�濮嬬炕璇戝崟涓崟鍏冩牸锛屽苟杩斿洖涓嬩釜鍗曞厓鏍间綅缃� + //firstCoil = true; + ScanLDSCells2(popsPoint[nPSHS].first, popsPoint[nPSHS].first, popsPoint[nPSHS].first, popsPoint[nPSHS].second, 16, nLevel, progsec, sProgSec, nSteps); + nPSHS--; + + } + if (nPSHS == -1) + { + fill(popsPoint, popsPoint + 100, std::make_pair(0, 0)); } } + return 0; } + +int CMTerm1View::Translate2Prog( + int nType, int nCurPosY, int nCurPosX, CString sCellName, + stProgSection& progsec, CString& sProgSec, int& nSteps) +{ + CString s1; + int nNextX = 1;//姝ラ暱 + int nCoilType, CoilAddr; + CMTerm1Doc::stProg theprog; + CMTerm1Doc* pDoc = GetDocument(); + CStringA sCellNameA; + sCellNameA = sCellName; + //if (nType == typeNone) + //{ + // return 0; + //} + if (nType == typeNO) + { + if (firstCoil && nType != typeLine1 && nType != typeLine2) + { + //鍏堢湅寰�涓婇潰鏈夋病鏈夎繛鎺� + if (Cells[nCurPosY][nCurPosX + nNextX].bLeftLineUp) + { + // 寰�涓婇潰鏈夎繛鎺ワ紝浣跨敤OR + sProgSec.AppendFormat(_T("OR %s\r\n"), sCellName); + theprog.nOpType1 = OP_OR; + } + else + { + sProgSec.AppendFormat(_T("ST %s\r\n"), sCellName); + theprog.nOpType1 = OP_ST; + } + theprog.nParamCount = 1; + pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr); + theprog.Params[0].nParamType = nCoilType; + theprog.Params[0].nParamAddr = CoilAddr; + theprog.Params[0].sParamStr = sCellNameA; + progsec.Append(theprog); + firstCoil = false; + } + else + { + sProgSec.AppendFormat(_T("AN %s\r\n"), sCellName); + theprog.nOpType1 = OP_AN; + theprog.nParamCount = 1; + pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr); + theprog.Params[0].nParamType = nCoilType; + theprog.Params[0].nParamAddr = CoilAddr; + theprog.Params[0].sParamStr = sCellNameA; + progsec.Append(theprog); + } + + nSteps += 1; + nNextX = 1; + } + else if (nType == typeNC) + { + if (firstCoil && nType != typeLine1 && nType != typeLine2) + { + sProgSec.AppendFormat(_T("ST/ %s\r\n"), sCellName); + theprog.nOpType1 = OP_ST_; + theprog.nParamCount = 1; + pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr); + theprog.Params[0].nParamType = nCoilType; + theprog.Params[0].nParamAddr = CoilAddr; + theprog.Params[0].sParamStr = sCellNameA; + progsec.Append(theprog); + firstCoil = false; + } + else + { + sProgSec.AppendFormat(_T("AN/ %s\r\n"), sCellName); + theprog.nOpType1 = OP_AN_; + theprog.nParamCount = 1; + pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr); + theprog.Params[0].nParamType = nCoilType; + theprog.Params[0].nParamAddr = CoilAddr; + theprog.Params[0].sParamStr = sCellNameA; + progsec.Append(theprog); + } + nSteps += 1; + nNextX = 1; + } + else if (nType == typePP) + { + //progsec.Append(theprog); + sProgSec.AppendFormat(_T("PP %s\r\n"), sCellName); + nSteps += 1; + nNextX = 1; + } + else if (nType == typePN) + { + //progsec.Append(theprog); + sProgSec.AppendFormat(_T("PN %s\r\n"), sCellName, sCellName); + nSteps += 1; + nNextX = 1; + } + else if (nType == typeNOT) + { + sProgSec.AppendFormat(_T("NOT %s\r\n"), sCellName); + theprog.nOpType1 = OP_NOT; + progsec.Append(theprog); + nSteps += 1; + nNextX = 1; + } + else if (nType == typeDF) + { + sProgSec.AppendFormat(_T("DF %s\r\n"), sCellName); + theprog.nOpType1 = OP_DF; + progsec.Append(theprog); + nSteps += 1; + nNextX = 1; + } + else if (nType == typeDF_) + { + sProgSec.AppendFormat(_T("DF/ %s\r\n"), sCellName); + theprog.nOpType1 = OP_DF_; + progsec.Append(theprog); + nSteps += 1; + nNextX = 1; + } + else if (nType == typeOUT) + { + sProgSec.AppendFormat(_T("OUT %s\r\n"), sCellName); + theprog.nOpType1 = OP_OUT; + theprog.nParamCount = 1; + pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr); + theprog.Params[0].nParamType = nCoilType; + theprog.Params[0].nParamAddr = CoilAddr; + theprog.Params[0].sParamStr = sCellNameA; + progsec.Append(theprog); + nSteps += 1; + nNextX = 1; + } + else if (nType == typeSET) + { + sProgSec.AppendFormat(_T("SET %s\r\n"), sCellName); + theprog.nOpType1 = OP_SET; + theprog.nParamCount = 1; + pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr); + theprog.Params[0].nParamType = nCoilType; + theprog.Params[0].nParamAddr = CoilAddr; + theprog.Params[0].sParamStr = sCellNameA; + progsec.Append(theprog); + nSteps += 1; + nNextX = 1; + } + else if (nType == typeRESET) + { + sProgSec.AppendFormat(_T("RESET %s\r\n"), sCellName); + theprog.nOpType1 = OP_RESET; + theprog.nParamCount = 1; + pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr); + theprog.Params[0].nParamType = nCoilType; + theprog.Params[0].nParamAddr = CoilAddr; + theprog.Params[0].sParamStr = sCellNameA; + progsec.Append(theprog); + nSteps += 1; + nNextX = 1; + } + else if (nType == typeCMP) + { + theprog.nOpType1 = OP_ST_GT; + theprog.nParamCount = 1; + progsec.Append(theprog); + sProgSec.AppendFormat(_T("CMP %s %s %s \r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam); + nSteps += 1; + nNextX = 3; + } + else if (nType == typeTM) + { + theprog.nOpType1 = OP_TMX; + theprog.nParamCount = 1; + pDoc->TxtToCoilType(sCellNameA, &nCoilType, &CoilAddr); + theprog.Params[0].nParamType = nCoilType; + theprog.Params[0].nParamAddr = CoilAddr; + theprog.Params[0].sParamStr = sCellNameA; + progsec.Append(theprog); + sProgSec.AppendFormat(_T("TM %s %d %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam); + nSteps += 1; + nNextX = 3; + } + else if (nType == typeFN1) + { + theprog.nOpType1 = OP_INC; + progsec.Append(theprog); + sProgSec.AppendFormat(_T("FN1 %s %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam); + nSteps += 1; + nNextX = 2; + } + else if (nType == typeFN2) + { + theprog.nOpType1 = OP_MV; + progsec.Append(theprog); + sProgSec.AppendFormat(_T("FN2 %s %s %s \r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam); + nSteps += 1; + nNextX = 3; + } + else if (nType == typeFN3) + { + theprog.nOpType1 = OP_ADD3; + progsec.Append(theprog); + 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); + nSteps += 1; + nNextX = 4; + } + else + { + nNextX = 1; + //continue; + } + return nNextX; +} + + +/// <summary> +/// 鍏ㄩ儴鍥惧舰鏍¢獙 +/// </summary> +/// <returns></returns> +/// <remark> +/// 璁″垝鍦ㄧ涓�涓繑鍥炲�间腑浣跨敤涓嶅悓鐨勯敊璇唬鐮佷唬琛ㄤ笉鍚岀殑閿欒绫诲瀷锛� +/// 骞跺湪绗簩涓繑鍥炲�间腑濉厖閿欒鎻愮ず淇℃伅 +/// </remark> + std::pair<int, CString> CMTerm1View::LDSCheckRule() + { + CString message; + int nDivCount = 0; + int Divs[100] = { 0 }; + //浠ヨ涓哄崟浣嶄粠涓婂埌涓嬮亶鍘嗭紙琛岄亶鍘嗭級 + for (int i = 0; i < m_nTotalRow; i++) + { + int nRow = i; + int bConnected = 0; + bool checkFlag = false;//0鍒楁楠岀粨鏋� + + //鏈鐨�0鍒楁鏌� + if (Cells[nRow][0].nType == 0) + { + checkFlag = true; + } + + //閬嶅巻姝よ鐨�1-15鍒楋紙纭畾鍗曞厓鏍硷級 + for (int j = 1; j < m_CellPerLine; j++) + { + int nCol = j; + //濡傛灉0鍒椾负绌� + if (checkFlag) + { + //鏈夊乏渚т笂绔栫嚎 + if (Cells[nRow][nCol].bLeftLineUp) + { + //濡傛灉涓婂眰涓虹┖鍗曞厓鏍硷紝鏃犳晥绔栫嚎锛岀洿鎺ュ垹闄�-----鍙互鍗曠嫭鍒ゆ柇 + if (nRow - 1 >= 0 && Cells[nRow - 1][nCol].nType == 0) + { + //娓呯悊鍗曞厓鏍� + Cells[nRow][nCol].clear(); + } + //濡傛灉鏄痭one锛岄敊璇細鐭矾鎴栧洖璺� + else if (Cells[nRow][nCol].nType == 0) + { + message.Format(_T("((%d,%d) 闄勮繎浣嶇疆浜х敓瑙︾偣鐭矾鎴栧洖璺紒"), nRow, nCol); + return std::make_pair(111, message); + } + //濡傛灉涓嶄负none銆傚彲浠ヨ浆鎹紝浣嗘槸鎻愮ず锛氭棤娉曠粯鍒跺浘褰紙绋嬪簭涓嶅悎鐞嗭級 + if (Cells[nRow][nCol].nType != 1) + { + message.Format(_T("((%d,%d) 鏃犳硶缁樺埗鍥惧舰锛堢▼搴忎笉鍚堢悊锛�"), nRow, nCol); + return std::make_pair(111, message); + } + + } + //娌℃湁宸︿晶涓婄珫绾匡紝涓旀鍗曞厓鏍肩被鍨� 涓嶄负绌烘垨绾� + else if (Cells[nRow][nCol].nType > 2) + { + //姝ゅ崟鍏冩牸涓哄崟鐙殑绾垮湀鎴栨寚浠ゅ崟鍏冿紝闇�瑕佽Е鐐硅緭鍏� + message.Format(_T("((%d,%d) 闇�瑕佽Е鐐硅緭鍏�"), nRow, nCol); + return std::make_pair(111, message); + } + //鏈夊乏渚т笅绔栫嚎锛屼笖姝ゅ崟鍏冩牸绫诲瀷涓虹┖ + if (Cells[nRow][nCol].bLeftLineDn) + { + //涓嶆敮鎸佸洖璺� + } + } + //濡�0鍒楅潪绌� + else + { + + } + } + + + } + return std::make_pair(0, message); + } -- Gitblit v1.9.1