From eaafed66b05a3e4e1d8975c93a9e1688fa6c3f3a Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 4 Nov 2015 17:48:48 +0000 Subject: [PATCH] SarmaxWall : - migliorata gestione trasmissione - aggiunti messaggi vari. --- ConstIni.vb | 1 + OpenPageUC.xaml | 2 +- OpenPageUC.xaml.vb | 12 +-- PlacePageUC.xaml | 8 +- PlacePageUC.xaml.vb | 125 +++++++++++++++++++++++---- Resources/ClockwiseRotate.png | Bin 3036 -> 1768 bytes Resources/CounterClockwiseRotate.png | Bin 3088 -> 1793 bytes 7 files changed, 120 insertions(+), 28 deletions(-) diff --git a/ConstIni.vb b/ConstIni.vb index 526e2b5..510c53b 100644 --- a/ConstIni.vb +++ b/ConstIni.vb @@ -88,5 +88,6 @@ Module ConstIni Public Const K_PLANKNUMONTOP As String = "PlankNumOnTop" Public Const K_TRANSMITTER As String = "Transmitter" Public Const K_GANTRIES As String = "Gantries" + Public Const K_SENDTIMEOUT As String = "SendTimeout" End Module diff --git a/OpenPageUC.xaml b/OpenPageUC.xaml index 5b30c4b..5a34a58 100644 --- a/OpenPageUC.xaml +++ b/OpenPageUC.xaml @@ -28,7 +28,7 @@ ItemsSource="{Binding ItemList}"/> - diff --git a/OpenPageUC.xaml.vb b/OpenPageUC.xaml.vb index cb2d432..37f902e 100644 --- a/OpenPageUC.xaml.vb +++ b/OpenPageUC.xaml.vb @@ -214,8 +214,8 @@ Public Class OpenPageUC ' Eseguo zoom OpenScene.ZoomAll() ' Cancello messaggio - MessageTxBx.Text = "" - MessageBrd.Background = Brushes.White + Me.MessageTxBl.Text = "" + Me.MessageBrd.Background = Brushes.White m_bFileOk = False OkBtn.IsEnabled = False Return True @@ -239,12 +239,12 @@ Public Class OpenPageUC Dim nMarkId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, NAME_PROJMARK) m_bFileOk = bOk And (nMarkId <> GDB_ID.NULL) If m_bFileOk Then - MessageTxBx.Text = "" - MessageBrd.Background = Brushes.White + Me.MessageTxBl.Text = "" + Me.MessageBrd.Background = Brushes.White OkBtn.IsEnabled = True Else - MessageTxBx.Text = EgtMsg(MSG_OPENPAGEUC + 1) 'Progetto non valido - MessageBrd.Background = Brushes.Tomato + Me.MessageTxBl.Text = EgtMsg(MSG_OPENPAGEUC + 1) 'Progetto non valido + Me.MessageBrd.Background = Brushes.Tomato OkBtn.IsEnabled = False End If ' Eseguo zoom diff --git a/PlacePageUC.xaml b/PlacePageUC.xaml index 5ccb3bd..1c0316d 100644 --- a/PlacePageUC.xaml +++ b/PlacePageUC.xaml @@ -91,7 +91,7 @@ - + diff --git a/PlacePageUC.xaml.vb b/PlacePageUC.xaml.vb index d83553e..49e96a7 100644 --- a/PlacePageUC.xaml.vb +++ b/PlacePageUC.xaml.vb @@ -1,4 +1,7 @@ -Imports EgtUILib + +Imports System.Threading +Imports System.IO +Imports EgtUILib Public Class PlacePageUC @@ -253,8 +256,8 @@ Public Class PlacePageUC Friend Sub MyDraw() EgtDraw() If EgtGetModified() Then - MessageTxBx.Text = "" - MessageBrd.Background = Brushes.White + Me.MessageTxBl.Text = "" + Me.MessageBrd.Background = Brushes.White End If End Sub @@ -468,8 +471,8 @@ Public Class PlacePageUC End Function Private Sub InsertWallBtn_Click(sender As Object, e As RoutedEventArgs) Handles InsertWallBtn.Click - ' Parametri di caricamento ' Ciclo di inserimento in tavola dei pezzi selezionati + Dim bAllOk As Boolean = True Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL ' Recupero successivo selezionato @@ -478,6 +481,7 @@ Public Class PlacePageUC If EgtIsPart(nId) And Not IsPartInTable(nId) Then If Not EgtPackPart(nId, 0, -m_dWidth, m_dLength, 0, m_dMinDist, False) Then EgtDeselectObj(nId) + bAllOk = False End If End If ' Passo al successivo selezionato @@ -487,6 +491,11 @@ Public Class PlacePageUC m_nPartPos = IIf(EgtGetSelectedObjCount() > 0, PART_POS.IN_TABLE, PART_POS.NONE_TABLE) ' Aggiorno vista MyDraw() + ' Se almeno una parete non piazzata, lo segnalo + If Not bAllOk Then + Me.MessageTxBl.Text = EgtMsg(MSG_PLACEPAGEUC + 9) 'Inserimento non riuscito + Me.MessageBrd.Background = Brushes.Tomato + End If End Sub Private Sub StoreWallBtn_Click(sender As Object, e As RoutedEventArgs) Handles StoreWallBtn.Click @@ -584,7 +593,7 @@ Public Class PlacePageUC EgtLuaSetGlobNumVar("PROC.LAYPLANKNBR", nPlankNumOnLay) Dim dTemp As Double EgtLuaEvalNumExpr(PlankNumFirstLayerTxBx.Text, dTemp) - m_nPlankNumOnTop = CInt(dTemp + 0.1) + m_nPlankNumOnTop = CInt(dTemp + 0.10000000000000001) WritePrivateProfileString(S_MACHINE, K_PLANKNUMONTOP, m_nPlankNumOnTop, m_MainWindow.GetIniFile()) EgtLuaSetGlobNumVar("PROC.TOPPLANKNBR", m_nPlankNumOnTop) ' eseguo @@ -600,11 +609,11 @@ Public Class PlacePageUC Dim nErr As Integer = 1000 EgtLuaGetGlobIntVar("PROC.ERR", nErr) If nErr = 0 Then - MessageTxBx.Text = EgtMsg(MSG_PLACEPAGEUC + 10) ' Generazione riuscita - MessageBrd.Background = Brushes.Green + Me.MessageTxBl.Text = EgtMsg(MSG_PLACEPAGEUC + 10) ' Generazione riuscita + Me.MessageBrd.Background = Brushes.Green Else - MessageTxBx.Text = EgtMsg(MSG_PLACEPAGEUC + 11) ' Errore in generazione - MessageBrd.Background = Brushes.Tomato + Me.MessageTxBl.Text = EgtMsg(MSG_PLACEPAGEUC + 11) ' Errore in generazione + Me.MessageBrd.Background = Brushes.Tomato End If ' cancello variabili EgtLuaResetGlobVar("PROC") @@ -614,20 +623,102 @@ Public Class PlacePageUC ' path dell'eseguibile di trasmissione Dim sExeFile As String = String.Empty GetPrivateProfileString(S_MACHINE, K_TRANSMITTER, "", sExeFile, m_MainWindow.GetIniFile()) - ' Path del file da trasmettere + ' flag per ponti da pilotare + Dim nFlag As Integer = GetPrivateProfileInt(S_MACHINE, K_GANTRIES, 3, m_MainWindow.GetIniFile()) + ' Path del file da trasmettere e del file di risultato Dim nLastProj As Integer = GetPrivateProfileInt(S_GENERAL, K_LASTPROJ, 1, m_MainWindow.GetIniFile()) Dim sDataFile As String = m_MainWindow.GetDataDir() & "\" & nLastProj.ToString("D4") & ".dat" + Dim sResFile As String = m_MainWindow.GetDataDir() & "\" & nLastProj.ToString("D4") & ".err" + ' Rimuovo eventuale file di errore già presente + Try + If My.Computer.FileSystem.FileExists(sResFile) Then + My.Computer.FileSystem.DeleteFile(sResFile) + End If + Catch ex As Exception + End Try + ' Se nessun ponte abilitato, salto tutto + If nFlag = 0 Then + Me.MessageTxBl.Text = EgtMsg(MSG_PLACEPAGEUC + 16) ' Ponti tutti disabilitati + Me.MessageBrd.Background = Brushes.Yellow + Return + End If ' Lancio la trasmissione Try - Process.Start(sExeFile, sDataFile) - MessageTxBx.Text = EgtMsg(MSG_PLACEPAGEUC + 12) ' Lancio trasmissione riuscito - MessageBrd.Background = Brushes.Green + Process.Start(sExeFile, sDataFile & " " & nFlag.ToString()) + Me.MessageTxBl.Text = EgtMsg(MSG_PLACEPAGEUC + 12) ' Lancio trasmissione riuscito + Me.MessageBrd.Background = Brushes.Green Catch ex As Exception - MessageTxBx.Text = EgtMsg(MSG_PLACEPAGEUC + 13) ' Errore in lancio trasmissione - MessageBrd.Background = Brushes.Tomato + Me.MessageTxBl.Text = EgtMsg(MSG_PLACEPAGEUC + 13) ' Errore in lancio trasmissione + Me.MessageBrd.Background = Brushes.Tomato End Try - - + Dim nDummy As Integer + Application.Current.Dispatcher.Invoke(Windows.Threading.DispatcherPriority.Background, _ + New Action(Function() nDummy = 0)) + ' Attendo la lettura del risultato + Dim bOk As Boolean = WaitSendResult(sResFile) + If bOk Then + Me.MessageTxBl.Text = EgtMsg(MSG_PLACEPAGEUC + 14) ' Trasmissione completata con successo + Me.MessageBrd.Background = Brushes.Green + Else + Me.MessageTxBl.Text = EgtMsg(MSG_PLACEPAGEUC + 15) ' Trasmissione non riuscita + Me.MessageBrd.Background = Brushes.Tomato + End If End Sub + Private Function WaitSendResult(ByVal sResFile As String) As Boolean + ' Ciclo di ricerca foto scattata (timeout = 10) + Dim nTimeout As Integer = GetPrivateProfileInt(S_MACHINE, K_SENDTIMEOUT, 10, m_MainWindow.GetIniFile()) + Dim nMaxThick = 10 * nTimeout + For nThick As Integer = 0 To nMaxThick + ' Se esiste il file di risultato + Dim nErr = 999 + If VerifyResult(sResFile, nErr) Then + If nErr = 0 Then + Return True + Else + EgtOutLog("Send err=" & nErr.ToString()) + Return False + End If + ' Altrimenti aspetto + Else + ' Aspetto 100 ms + Thread.Sleep(100) + End If + Next + EgtOutLog("Send generic error") + Return False + End Function + + Private Function VerifyResult(ByVal sResFile As String, ByRef nErr As Integer) As Boolean + ' Se non esiste il file con il risultato + If Not My.Computer.FileSystem.FileExists(sResFile) Then + Return False + End If + ' Leggo il file + Dim bOk As Boolean = False + Try + ' Controllo errori nel file di info + Dim sLine As String = String.Empty + Dim sr As StreamReader = New StreamReader(sResFile) + Do While sr.Peek() > -1 + sLine = sr.ReadLine() + sLine = sLine.Replace(" ", "") + If sLine.StartsWith("Err=") Then + If Int32.TryParse(sLine.Substring(4), nErr) Then + bOk = True + Exit Do + End If + End If + Loop + sr.Close() + Catch ex As Exception + bOk = False + End Try + Return bOk + End Function + + Private Sub MessageTxBl_MouseDown(sender As Object, e As MouseButtonEventArgs) Handles MessageTxBl.MouseDown + Me.MessageTxBl.Text = "" + Me.MessageBrd.Background = Brushes.White + End Sub End Class diff --git a/Resources/ClockwiseRotate.png b/Resources/ClockwiseRotate.png index 7c843bf85935a13c931a2f5a0e88f10bf4de174b..6305332480ba4b3d51f7cd8d6bc3115fd5f9a361 100644 GIT binary patch literal 1768 zcmZ`)c`zFY7Z0nhO4y>J!ivOQZ5-K3-4czEsVeE?FFS0aHk!l zcn2lq#R1D9x%9opL>$J>Gi6*@ZgWvF9Nb&EVPTOo>ORay=m^1TBquYXo9EFsXb`P| zEa5RUNDeW2S)_W?z20}pNn0z)=}u9#0hMdNL`8ThNRnn{z3z;9IxSCwvdxMtzT^ol zwkmj}sNxsNHjf9krZ&or8f5J!5fE{El=OloHOm$BKXCUOxW}#Hk2&xK&1DQj6~`x1 zvmQ{oXRhHmc9U*p(id2+Al{E4oTOEt)@>W?+(8_s37r8?a=EpH@Ki(jhJrmvLRJQ) zFXLvg07lqNrN2!$_~~a@4dg=OQ^SK_LI~n0Amr?`Z0Men>)Fhpmj{hTC_(gQfAx-YAU0owJXJ z_8^DL6-eh1FI|$$+te&4CmXoVsIm z#MA{PWq8e5?ZFeJ;#&+QEwxLl`Zp{|Fy&EN;nHqp1ia1E$Sc3C>4{f9^zb9;nL~!y zMymrMztoBp>btqfZp)1ENF%(J0G|)jzYgD+0yLJ5_>YBhxcF?_a6hof1moNi+fi;Z zWHlWStJJO$ss9OMpkUg_#+S9a$1q%!b%PS_KD+>JY?<$h0anaC1Jw8xsBl#u&(`W1 zA~bX?W@G zx$-ps+R>flvHsfV-ryOcgGnB-1)p`gj#2Gbz7fBvTSj~Bsv6Y@X3nuqOaWoOsNHm_ zz=#OhUmmV?PHg5djlt^RQ)b1PbhHACcQ_amz39GN=lTL#cTnZX(()rqpKA)e+_7l3 z^UQpNqZ~!{+m2?5dcTCzU<#1Hc|~$5AU#8bsh4s}s~7>BTKFFf!h+_D@WHYTC2K#r z?4Xi?&>k-^mYHxeP#lUyzY3RMQ`yOU?=dD6fD@l}BMF?QPYH=C=T3l~PkxgXdTc~x zPL3^2gMcBdfE95Swsbh-;)$vrB<;*8oX8;e#&LLLKVGR8(eI=u1;8-Mj@&B-Zf_Nz z&vpa-s`Rs~z@SPPARIXu@D6o>Od&W86)2iAUyK1OZX(WtCMwpg58Yelr{QMl5R};~q-=F$*E6c^@;p<49 zzI!7jE#)!eyIDr2BLk&$i`MhLx}C3{01tmC;y}l0G5LhK&_E6Oc*f%IINMAwq#w)e z^Dxj!{d(Pp-tSe3!&Q*w_hw8lZ^|RcF2Wn+UwD~D^g-Gi<$A*!^gbujv}7_MNEmy@ zI@kJTX-_NGva+%3XzU_d-B4#iRX?Cuo(U=L9}!8zS2B7u-f+HF|1hoAuzn=hYA6mf z33I3!6b{_dv@7Z1Lgi6MALtZ?OIQwr3{EG`kw#VO@&>_}t zL<$12`tIpOp{V=hqe%II?^(&KV$(=iO4o)nAs{Ie8SiXoak=v=p^y+prRV>|MsK~s z{se=GCIkyH%MvSz=lG545ld^KVmFkZlBla@)#J1YpJkj@paXLHd1PhPr+2CCA8zyd zw*5Z}5}CxbOwK)~=LvnOV1@$6PEYDKWaszTx)tM!uy1R!OaD&R|J^h@?ystUg8y^X d-)pz|Hu7rOs_-XQX7+v(0O#O>X|@l_{1YokJH!A0 literal 3036 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 IJ;%8J0rcsK*8l(j diff --git a/Resources/CounterClockwiseRotate.png b/Resources/CounterClockwiseRotate.png index 04dc4620a38730a40a80045ba4a72ce0abefee5c..93e329768b23acaee299753946da01770c8f4c20 100644 GIT binary patch literal 1793 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