Option Strict Off Option Explicit On Imports System.IO Imports System.Runtime.InteropServices Imports Emgu.CV Imports System.Text Imports System.Globalization Imports System.Threading Public Class FrmMain 'Implements Observer #Region "FIELDS & PROPERTIES" Private Enum en_status NoImage ImageFromCamera Calibration ImgCorrected DefAree DefTexp DefStone DefVentosa End Enum ' Inn sequenza in funzione della gravità dell'errore Private Enum ReadCfgResult OK WARNING ERR0 ERR1 End Enum Private Const CFG_DEFAULT As String = "Default" Private m_sDataRoot As String = "" Public ReadOnly Property sDataRoot As String Get Return m_sDataRoot End Get End Property Public Sub SetDataRoot() m_sDataRoot = GetIniValue("Data", "DataRoot", Application.StartupPath & "\DataRoot.ini") End Sub Private sMsgErr As String = String.Empty Private m_Image As System.Drawing.Image Private m_ZoomFactor As Double ' Permette di aggiornare la pagina principale del programma 'SetFormStatus()' Private status As en_status Private frmSce As New FrmScelta Private WithEvents ImageMng As New clsImageMng Public WithEvents Camera As New clsCamera Private _visione As New clsVisione(ImageMng) Private _ActTh As Integer = 70 Private _numImage As Integer = -1 Private _maxImage As Integer = 0 Private _npProspSel As Integer = -1 Private _borderType As Integer Private WithEvents _search As New clsRicerca(ImageMng) Private Event _waitingCmd() ' Impiegata per simulare l'input di una stringa di processo Private varDebug As String = "2" #End Region ' Fields & Properties #Region "DESTRUCTOR" Protected Overrides Sub Finalize() If (Camera.Connected) Then Camera.Disconnect() End If MyBase.Finalize() End Sub #End Region ' Destructor #Region "METHODS" Private Sub SetFormStatus() If Camera.Connected Then BtnTakeFoto.ImageIndex = 0 If Not ModalitaNascosta Then TStatus.Text = "CameraID = " & ComboBoxCameras.SelectedItem Else TStatus.Text = "CameraID = " & Camera.CameraID End If Else BtnTakeFoto.ImageIndex = 1 TStatus.Text = " --- " End If BtnCfg.Visible = bExtended BtnCorrProsp.Visible = False 'bExtended BtnVentosa.Visible = VacuumCheckEnable btnSearch.Visible = VacuumCheckEnable ComboBoxCameras.Visible = False Select Case status Case en_status.NoImage GBCalibration.Visible = False GBCorrected.Visible = False GBImgFromCam.Visible = False BtnLoad.Visible = bBtnLoad BtnTakeFoto.Visible = True GBDefAree.Visible = False ' Abilito la modifica della configurazione Cmaera/Cfg ComboBoxCameras.Enabled = False ComboBoxCameraCfg.Enabled = True Case en_status.ImageFromCamera GBCalibration.Visible = False GBCorrected.Visible = False GBImgFromCam.Visible = True BtnLoad.Visible = bBtnLoad BtnTakeFoto.Visible = True GBDefAree.Visible = False ' Abilito la modifica della configurazione Cmaera/Cfg ComboBoxCameras.Enabled = False ComboBoxCameraCfg.Enabled = True Case en_status.Calibration GBCalibration.Visible = True GBCorrected.Visible = False GBImgFromCam.Visible = False BtnLoad.Visible = False BtnTakeFoto.Visible = False GBDefAree.Visible = False ' Disabilito la modifica della configurazione Cmaera/Cfg ComboBoxCameras.Enabled = False ComboBoxCameraCfg.Enabled = False Case en_status.ImgCorrected GBCalibration.Visible = False GBCorrected.Visible = True GBImgFromCam.Visible = False BtnLoad.Visible = bBtnLoad BtnTakeFoto.Visible = True GBDefAree.Visible = False ' Disabilito la modifica della configurazione Cmaera/Cfg ComboBoxCameras.Enabled = False ComboBoxCameraCfg.Enabled = False Case en_status.DefAree GBCalibration.Visible = False GBCorrected.Visible = False GBImgFromCam.Visible = False BtnLoad.Visible = False BtnTakeFoto.Visible = False GBDefAree.Visible = True BtnExpT.Visible = True BtnStone.Visible = True BtnVentosa.Visible = VacuumCheckEnable BtnSaveAree.Visible = False BtnExpT.Enabled = _visione.ExpCorrType <> clsVisione.eExpCorrMode.none BtnAbortDefAree.Text = "Close" ' Disabilito la modifica della configurazione Cmaera/Cfg ComboBoxCameras.Enabled = False ComboBoxCameraCfg.Enabled = False Case en_status.DefTexp, en_status.DefStone, en_status.DefVentosa GBCalibration.Visible = False GBCorrected.Visible = False GBImgFromCam.Visible = False BtnLoad.Visible = False BtnTakeFoto.Visible = False GBDefAree.Visible = True BtnExpT.Visible = False BtnStone.Visible = False BtnVentosa.Visible = False BtnSaveAree.Visible = True BtnExpT.Enabled = _visione.ExpCorrType <> clsVisione.eExpCorrMode.none BtnAbortDefAree.Text = "Abort" ' Disabilito la modifica della configurazione Cmaera/Cfg ComboBoxCameras.Enabled = False ComboBoxCameraCfg.Enabled = False End Select PosizionaControlli() End Sub ' carico l'elenco delle camere attivo la connessione con quella selezionata/impostata nel file di configurazione Public Sub LoadCamerasList() ComboBoxCameras.Items.Clear() ' Popolo la lista 'm_idList' delle camere attualmente connesse Camera.CameraList() For i As Integer = 0 To Camera.m_idList.Count - 1 ComboBoxCameras.Items.Add(Camera.m_idList(i)) Next ' Connessione alla prima camera disponibile camera If Camera.m_idList.Count > 0 Then Dim IsValidCam As Boolean = False For nIndexCam As Integer = 0 To Camera.m_idList.Count - 1 If Camera.m_idList(nIndexCam) = CameraID Then ComboBoxCameras.SelectedIndex = nIndexCam IsValidCam = True Exit For End If Next If Not IsValidCam Then ' Non esiste una configurazione Dim sTextMsg As String = String.Format("L'identificativo della camera della configurazione corrente non è disponibile. " & "Verificare che sia accessa oppure che esista. ") MessageBox.Show(sTextMsg, "Avvertenza", MessageBoxButtons.OK, MessageBoxIcon.Warning) ComboBoxCameras.SelectedIndex = -1 End If ' Attivo la If Not ModalitaNascosta Then If ComboBoxCameras.SelectedIndex > -1 Then Camera.Connect(ComboBoxCameras.SelectedItem) Else Camera.Connect(CameraID) End If End If End Sub ' carico elenco CONFIGURAZIONI: se non esiste almeno una valida comunico errore Private Function LoadCfgList() As Boolean Dim TempListIndCfg As New List(Of String) SearchConfigDir(TempListIndCfg) For i As Integer = 0 To TempListIndCfg.Count - 1 ComboBoxCameraCfg.Items.Add(TempListIndCfg(i)) Next ' Seleziona la prima disponibile If TempListIndCfg.Count > 0 Then Dim IsCfgValid As Boolean = False For nIndexCfg As Integer = 0 To TempListIndCfg.Count - 1 ComboBoxCameraCfg.SelectedIndex = nIndexCfg LeggiFileConfigurazione() If CameraID <> String.Empty Then IsCfgValid = True Exit For End If Next If Not IsCfgValid Then 'If Not ModalitaNascosta Then ' Non esiste una configurazione Dim sTextMsg As String = String.Format("Nessuna configurazione presenta una connessione alla camera valida. " & "Nel file 'CamaeraMng.cgf' il campo 'CameraID' è vuoto o assente. ") MessageBox.Show(sTextMsg, "Avvertenza", MessageBoxButtons.OK, MessageBoxIcon.Warning) ComboBoxCameraCfg.SelectedIndex = 0 'End If End If Else 'If Not ModalitaNascosta Then ' Non esiste una configurazione Dim sTextMsg As String = String.Format("Nella cartella '{0}' non sono state trovate configurazioni valide. " & "(CameraMng, CameraMng1, CameraMng2..)", sDataRoot) MessageBox.Show(sTextMsg, "Avvertenza", MessageBoxButtons.OK, MessageBoxIcon.Warning) Return False 'End If End If Return True End Function Public Sub Inizializza() SetDataRoot() ' non visualizzo pagina programma If Not ModalitaNascosta Then FrmStart.Show() Application.DoEvents() SpessLastra = 0 ' se non esiste almeno una configurazione valida chiudo il programma If Not LoadCfgList() Then Me.Close() AggiornaPulsantiVIsibili() MostraStato() ' Questo metodo è eseguibile solo se è andato a buon fine 'LeggiFileConfigurazione' If Not ImageMng.SetFileCalibrazione(FileLensCalib, FileCalibProsp) Then StatoGenerale = statoGenEnum.ErroreCalibrazione TStatus.Text = "Error in Calibration Files" End If Camera.LbImageStatus = LbImageStatus ProgressBar.Minimum = 0 ProgressBar.Maximum = 100 ProgressBar.Value = 0 ' carico elenco camere attive è creo la connessione LoadCamerasList() 'Me.Text = "ID Camera = " & Camera.CameraID status = en_status.NoImage SetFormStatus() SpessLastra = ImageMng.ZCali FrmStart.Close() If VacuumCheckEnable Then TimerMain.Enabled = True End If End Sub ' avvio l'evento di comunicazione con il programma OmagCUT Private Sub StartThreadCmdProcess() RaiseEvent _waitingCmd() End Sub Private Sub LeggiExif(ByVal FileName As String) ' qui potrei vedere se leggo gli exif ... Try Dim EW As New ExifWorks(FileName) LbFocalLenght.Text = EW.FocalLength.ToString("0.0mm") LbFocalLenght.Text = EW.Artist FocalLength = EW.FocalLength EW.Dispose() Catch ex As Exception End Try End Sub Private Sub CaliForm2Data() Dim i As Integer For i = 0 To 3 ImageMng.m_psrc(i).X = ImageControl1.DBoard.GetXCorner(i) ImageMng.m_psrc(i).Y = ImageControl1.DBoard.GetYCorner(i) ImageMng.XHpix(i) = ImageControl1.DBoard.GetXHpx(i) ImageMng.YHpix(i) = ImageControl1.DBoard.GetYHpx(i) Next ImageMng.CalcolaDatiCorrezione() ImageMng.SalvaFileCorrezioneProsp() End Sub Private Sub CaliData2Form() Dim i As Integer For i = 0 To 3 ImageControl1.DBoard.SetPuntoCorner(i, ImageMng.m_psrc(i).X, ImageMng.m_psrc(i).Y) ImageControl1.DBoard.SetPuntoH(i, ImageMng.XHpix(i), ImageMng.YHpix(i)) Next LbAltCali.Text = Format(ImageMng.m_ZCali, "0.00") & " mm" LbAltRif.Text = Format(ImageMng.m_AltRif, "0.00") & " mm" End Sub ' TODO DA sistemare Private Sub AreaForm2Data() Dim i As Integer For i = 0 To 3 ImageMng.m_psrc(i).X = ImageControl1.DBoard.GetXCorner(i) ImageMng.m_psrc(i).Y = ImageControl1.DBoard.GetYCorner(i) Next ' ImageMng.SalvaDatiArea() End Sub Private Sub AreaData2Form() Dim i As Integer For i = 0 To 3 ImageControl1.DBoard.SetPuntoCorner(i, ImageMng.m_psrc(i).X, ImageMng.m_psrc(i).Y) Next End Sub Private Sub PosizionaControlli() ' Posizione di ancoraggio (in alto a sinistra sullo schermo) Dim x As Integer, y As Integer Dim Width As Integer, Height As Integer Dim XGroupBoxes As Integer x = ImageControl1.Location.X y = 50 Width = Me.Size.Width - x - 150 Height = Me.Size.Height - y - 40 - StatusStrip1.Height ImageControl1.SetBounds(x, y, Width, Height) XGroupBoxes = x + Width + 5 BtnTakeFoto.SetBounds(XGroupBoxes + 10, BtnTakeFoto.Location.Y, 60, 50) BtnEnd.SetBounds(Me.Size.Width - 80, Me.Size.Height - 90 - StatusStrip1.Height, 60, 50) ' BtnLoad.SetBounds(XGroupBoxes + 10, BtnLoad.Location.Y, 60, 50) y = BtnTakeFoto.Location.Y + BtnTakeFoto.Size.Height + 1 GBImgFromCam.SetBounds(XGroupBoxes, y, 100, 330) GBCalibration.SetBounds(XGroupBoxes, 30, 100, 370) GBCorrected.SetBounds(XGroupBoxes, y, 100, 330) GBDefAree.SetBounds(XGroupBoxes, y, 100, 330) 'ProgressBar1.SetBounds(ImageControl1.Location.X, ImageControl1.Location.Y + ImageControl1.Size.Height / 2, ImageControl1.Size.Width, ProgressBar1.Size.Height) 'ProgressBar.Width = StatusStrip1.Size.Width - TStatus.Width End Sub Private Sub FineCalibrazione(ByVal bsalva As Boolean) If bsalva Then CaliForm2Data() ImageControl1.DBoard.VisPuntiCorner = False ImageControl1.DBoard.VisPuntiCaliH = False If m_Image IsNot Nothing Then m_Image.Dispose() m_Image = Nothing End If status = en_status.NoImage ImageControl1.Image = Nothing ImageControl1.Refresh() SetFormStatus() End Sub ' ricerca tutte le configurazioni disponibili Private Sub SearchConfigDir(ListIndCfg As List(Of String)) ' verifico se esiste la configurazione standard If File.Exists(m_sDataRoot & "\CameraMng.cfg") Then ListIndCfg.Add(CFG_DEFAULT) End If ' ricerco tutte le configurazioni numerate esistenti For Index As Integer = 0 To 10 If File.Exists(m_sDataRoot & Index.ToString & "\CameraMng.cfg") Then ListIndCfg.Add(Index.ToString) End If Next End Sub ' Costruisco il percorso del file letto da configurazione: restituisco l'esito dell'operazione (Nel riferimento restituisco la sintesi dell'operazione di lettura) Private Function IsCorrectFilePathReadFromCfg(DirToReadCfg As String, ByRef sStringPath As String, ByRef sMsg As String, ByRef CfgResult As ReadCfgResult) As ReadCfgResult Dim CurrCfgResult As ReadCfgResult = ReadCfgResult.OK sStringPath = sStringPath.Trim If Not sStringPath.StartsWith("\") And Not sStringPath.StartsWith(".\") Then ' Warning! il percorso potrebbe non essere relativo If sStringPath.Contains("CameraMng") Then ' Errore! il percorso contiene un riferimento alla cartella CurrCfgResult = ReadCfgResult.ERR0 Else CurrCfgResult = ReadCfgResult.WARNING sStringPath = DirToReadCfg & "\" & sStringPath End If Else ' OK! il percorso è potenzialmente correto If sStringPath.Contains("\CameraMng") Then ' Errore! il percorso contiene un riferimento alla cartella CurrCfgResult = ReadCfgResult.ERR1 Else ' rimuovo il primo carattere se è il punto (".") If sStringPath.StartsWith(".") Then sStringPath.Remove(0, 1) ' Ok! il percorso è accettato CurrCfgResult = ReadCfgResult.OK sStringPath = DirToReadCfg & sStringPath End If End If CreateMsgTextErr(CurrCfgResult, sStringPath, sMsg) ' Valuto se il risultato restituito deve modificare il CfgResult = SetIcoResultCfg(CfgResult, CurrCfgResult) Return CurrCfgResult End Function Private Sub CreateMsgTextErr(ReadCfg As ReadCfgResult, sStringPath As String, ByRef sMsg As String) Select Case ReadCfg Case ReadCfgResult.WARNING sMsg &= String.Format(" · Il percorso relativo '{0}' deve iniziare con '.\'.", sStringPath) & vbCrLf Case ReadCfgResult.ERR0 sMsg &= String.Format(" · Il percorso '{0}' contiene un riferimento alla cartella '.\CameraMng'.", sStringPath) & vbCrLf Case ReadCfgResult.ERR1 sMsg &= String.Format(" · Il percorso '{0}' contiene un riferimento alla cartella '.\CameraMng', deve essere sostituito con {1}.", sStringPath, sStringPath.Replace("CameraMng", "")) & vbCrLf End Select End Sub Private Function SetIcoResultCfg(ResultCfg As ReadCfgResult, CurrResultCfg As ReadCfgResult) As ReadCfgResult If CurrResultCfg > ResultCfg Then ResultCfg = CurrResultCfg End If Return ResultCfg End Function ' procedo alla lettura del file *.cfg Private Sub LeggiFileConfigurazione() If String.IsNullOrEmpty(m_sDataRoot) Then SetDataRoot() Dim NomeFileCfg, TmpString As String Dim DirToReadCfg As String Dim TmpInt As Integer Dim TmpDou As Double Dim reader As StreamReader Dim nfi As NumberFormatInfo = New CultureInfo("en-US", False).NumberFormat ' tutto parte dal file DataRoot.ini che deve trovarsi nella stessa cartelle dell'eseguibile DirToReadCfg = m_sDataRoot ' Indirizzo il programma alla configurazione associata al processo (indice tavola) If Not ModalitaNascosta Then Dim sCfgSelected As String = ComboBoxCameraCfg.SelectedItem DirToReadCfg = DirToReadCfg & If(sCfgSelected = CFG_DEFAULT, "", sCfgSelected) Else DirToReadCfg = DirToReadCfg & MainModule.IndexProc End If Dim CfgResult As ReadCfgResult = ReadCfgResult.OK sMsgErr = String.Empty ' Console.WriteLine("LETTURA CONFIGURAZIONE: " & MainModule.IndexProc & " -- " & DirToReadCfg) Debug.Assert(DirToReadCfg <> "") NomeFileCfg = DirToReadCfg & "\CameraMng.cfg" If Not File.Exists(NomeFileCfg) Then Dim sTextMsg As String = String.Format("Nella cartella '{0}' non è stata trovata la configurazione '{1}'.", sDataRoot, NomeFileCfg) MessageBox.Show(sTextMsg, "Avvertenza", MessageBoxButtons.OK, MessageBoxIcon.Warning) If ModalitaNascosta Then Me.Close() End If Return End If ' ------- INIZIO LETTURA ------- ' default sovrascritti dalla letture del file cfg LensCalibType = 0 SaveDir = "c:\CameraMng\Data\" FileLensCalib = "c:\CameraMng\Clens\Calib.txt" DirTmp = "c:\CameraMng\tmp" FileCalibProsp = "c:\CameraMng\Calib.txt" FileCalibRes = "c:\CameraMng\CaliRes.bin" SaveLogDir = "" VacFileStart = "" VacFilePos = "" VacFileEnd = "" VacDirModels = "" bExtended = False bBtnLoad = False CameraID = "" reader = New StreamReader(NomeFileCfg) nfi.NumberDecimalSeparator = "." TmpString = "" Try While (Not reader.EndOfStream) TmpString = reader.ReadLine() If TmpString.StartsWith("FileCali=") Then FileLensCalib = Mid(TmpString, 10) IsCorrectFilePathReadFromCfg(DirToReadCfg, FileLensCalib, sMsgErr, CfgResult) ElseIf TmpString.StartsWith("LensCalibType=") Then LensCalibType = Convert.ToInt16(Mid(TmpString, 15)) ElseIf TmpString.StartsWith("FileCaliProsp=") Then FileCalibProsp = Mid(TmpString, 15) IsCorrectFilePathReadFromCfg(DirToReadCfg, FileCalibProsp, sMsgErr, CfgResult) ElseIf TmpString.StartsWith("FileCaliRes=") Then FileCalibRes = Mid(TmpString, 13) IsCorrectFilePathReadFromCfg(DirToReadCfg, FileCalibRes, sMsgErr, CfgResult) ElseIf TmpString.StartsWith("Extended=") Then bExtended = CInt(TmpString.Substring(9)) > 0 'lascio vedere tutti i bottoni BtnCfg.Visible = bExtended BtnCorrProsp.Visible = False 'bExtended ElseIf TmpString.StartsWith("BtnLoad=") Then bBtnLoad = CInt(TmpString.Substring(8)) > 0 'lascio vedere tutti i bottoni BtnLoad.Visible = bExtended ElseIf TmpString.StartsWith("SaveDir=") Then SaveDir = Mid(TmpString, 9) IsCorrectFilePathReadFromCfg(DirToReadCfg, SaveDir, sMsgErr, CfgResult) ElseIf TmpString.StartsWith("TmpDir=") Then DirTmp = Mid(TmpString, 8) IsCorrectFilePathReadFromCfg(DirToReadCfg, DirTmp, sMsgErr, CfgResult) ElseIf TmpString.StartsWith("MaxPxWidth=") Then TmpInt = Convert.ToInt16(Mid(TmpString, 12)) If TmpInt > 0 Then ImageMng.MaxPxWidthOutImage = TmpInt ElseIf TmpString.StartsWith("BReduction=") Then _visione.ReduceImage = CInt(TmpString.Substring(11)) 'pyr_down nel riconoscimento bordi ElseIf TmpString.StartsWith("LogDir=") Then SaveLogDir = Mid(TmpString, 8) IsCorrectFilePathReadFromCfg(DirToReadCfg, SaveLogDir, sMsgErr, CfgResult) ElseIf TmpString.StartsWith("CameraID=") Then CameraID = Mid(TmpString, 10) CfgForm.LbCfgCameraID.Text = CameraID ElseIf TmpString.StartsWith("Border=") Then TmpInt = Convert.ToInt16(Mid(TmpString, 8)) If TmpInt > 0 Then bEnableBorder = True _borderType = TmpInt ElseIf TmpString.StartsWith("NLogImages=") Then TmpInt = Convert.ToInt16(Mid(TmpString, 12)) _maxImage = TmpInt ElseIf TmpString.StartsWith("RectCheckExp=") Then Dim xl, yt, xr, yb As Integer Dim split() As String split = Mid(TmpString, 14).Split(",", 8, StringSplitOptions.RemoveEmptyEntries) xl = Convert.ToInt32(split(0)) yt = Convert.ToInt32(split(1)) xr = Convert.ToInt32(split(2)) yb = Convert.ToInt32(split(3)) _visione.AddExpRectangle(xl, yt, xr, yb) ElseIf TmpString.StartsWith("ExpCorrection=") Then TmpInt = Convert.ToInt16(Mid(TmpString, 15)) If TmpInt < 0 Or TmpInt > 4 Then TmpInt = 0 _visione.ExpCorrType = TmpInt ElseIf TmpString.StartsWith("RectCheckStone=") Then Dim xl, yt, xr, yb As Integer Dim split() As String split = Mid(TmpString, 16).Split(",", 8, StringSplitOptions.RemoveEmptyEntries) xl = Convert.ToInt32(split(0)) yt = Convert.ToInt32(split(1)) xr = Convert.ToInt32(split(2)) yb = Convert.ToInt32(split(3)) _visione.SetStoneRectangle(xl, yt, xr, yb) ElseIf TmpString.StartsWith("BlackThFactor=") Then TmpDou = 0 TmpDou = Convert.ToDouble(Mid(TmpString, 15), nfi) If TmpDou > 0 Then _visione.ThFactorNero = TmpDou ElseIf TmpString.StartsWith("VacuumCheckEnable=") Then TmpInt = Convert.ToInt16(Mid(TmpString, Len("VacuumCheckEnable=") + 1)) VacuumCheckEnable = TmpInt > 0 ElseIf TmpString.StartsWith("VacFileStart=") Then VacFileStart = Mid(TmpString, Len("StartVacFile=") + 1) IsCorrectFilePathReadFromCfg(DirToReadCfg, VacFileStart, sMsgErr, CfgResult) ElseIf TmpString.StartsWith("VacFilePos=") Then VacFilePos = Mid(TmpString, Len("VacFilePos=") + 1) IsCorrectFilePathReadFromCfg(DirToReadCfg, VacFilePos, sMsgErr, CfgResult) ElseIf TmpString.StartsWith("VacFileEnd=") Then VacFileEnd = Mid(TmpString, Len("VacFileEnd=") + 1) IsCorrectFilePathReadFromCfg(DirToReadCfg, VacFileEnd, sMsgErr, CfgResult) ElseIf TmpString.StartsWith("VacDirModels=") Then VacDirModels = Mid(TmpString, Len("VacDirModels=") + 1) IsCorrectFilePathReadFromCfg(DirToReadCfg, VacDirModels, sMsgErr, CfgResult) ElseIf TmpString.StartsWith("VacMinScore=") Then VacMinScore = Convert.ToDouble(Mid(TmpString, Len("VacMinScore=") + 1), nfi) ElseIf TmpString.StartsWith("VacTolmm=") Then VacTolmm = Convert.ToDouble(Mid(TmpString, Len("VacTolmm=") + 1), nfi) End If End While reader.Close() reader.Dispose() ' Gestione dell'icone del bottone per esito lettura configurazione Dim nIndexIcoCfg As Integer = 0 Select Case CfgResult Case ReadCfgResult.OK nIndexIcoCfg = 0 Case ReadCfgResult.WARNING nIndexIcoCfg = 2 Case ReadCfgResult.ERR0, ReadCfgResult.ERR1 nIndexIcoCfg = 1 End Select If Not String.IsNullOrEmpty(sMsgErr) Then If Not ModalitaNascosta Then BtnShowMsg.ImageIndex = nIndexIcoCfg BtnShowMsg.Visible = True Else Console.WriteLine("ERRORE LETTURA CONFIGURAZIONE: " & MainModule.IndexProc & " -- " & sMsgErr) End If Else If Not ModalitaNascosta Then BtnShowMsg.ImageIndex = nIndexIcoCfg BtnShowMsg.Visible = False End If End If Catch ex As Exception MsgBox("Error in Cfg File " & TmpString) End Try ' temoraneo #If WinXp Then _visione.SearchMode = CvEnum.RETR_TYPE.CV_RETR_EXTERNAL #Else _visione.SearchMode = CvEnum.RetrType.External #End If CreateDefaultDirs() CfgForm.LbFileCali.Text = FileLensCalib CfgForm.LbImageDir.Text = SaveDir CfgForm.LbTempDir.Text = DirTmp Camera.DownloadDir = DirTmp AggiornaNumImage() End Sub Public Function CancelFile(ByVal inPath As String) As Boolean Dim ret As Boolean Try Dim objFile As FileInfo = New FileInfo(inPath) objFile.Delete() objFile = Nothing ret = True 'return true on success Catch e As Exception ret = False 'return false on error End Try Return ret End Function Public Function CreateDefaultDirs() As Boolean Dim ret As Boolean Dim objDir As New System.IO.DirectoryInfo(DirTmp) Try If Not objDir.Exists Then objDir.Create() End If Catch e As Exception ret = False 'return false on error End Try objDir = Nothing objDir = New System.IO.DirectoryInfo(SaveDir) Try If Not objDir.Exists Then objDir.Create() End If Catch e As Exception ret = False 'return false on error End Try objDir = Nothing ' creo SaveLogDir If SaveLogDir.Length > 0 Then objDir = New System.IO.DirectoryInfo(SaveLogDir) Try If Not objDir.Exists Then objDir.Create() End If Catch e As Exception ret = False 'return false on error End Try objDir = Nothing End If Return ret End Function #Region "METODI FOTOCAMERA" Private Sub CorrezioneCompleta() 'ImageMng.CorrezioneCompletaAsync() ImageMng.CorrezioneCompleta() TStatus.Text = "Image Correction" End Sub Public Sub RichiestaClick() 'If StatoGenerale <> statoGenEnum.StatoOk Then ' Return 'End If Console.WriteLine("RICHIESTA CLICK: " & MainModule.IndexProc) If Camera.Connected Then ImageMng.ProcessStop() Camera.TakeFoto() TStatus.Text = "Click sent" RichiestaFoto = False End If 'CorrezioneAutomatica = True End Sub Public Sub SetSpessLastra(spess As Double) End Sub Public Sub RichiestaStatoCamera() Dim NomeFile As String Dim nf As Integer Try If Not Camera.Connected Then Camera.Connect(CameraID) 'Me.Text = "ID Camera = " & Camera.CameraID End If NomeFile = SaveDir & "click.txt" nf = FreeFile() FileOpen(nf, NomeFile, OpenMode.Output) If Camera.Connected Then Print(nf, "Err=0") Else Print(nf, "Err=1") End If FileClose(nf) Catch ex As Exception ' ?? che faccio? End Try End Sub Private Sub SalvaNuovoBackGround() Dim backSaved As Boolean = False RichiestaBackGround = False Try Console.WriteLine("BACKIMAGE PRONTA: " & MainModule.IndexProc & " Save dir -> " & SaveDir) _visione.BackImage = Nothing FileCopy(Camera.PhotoFileName, SaveDir & "BackImage.jpg") FileCopy(Camera.PhotoFileName, SaveDir & "BackImage" & Format(Now, "yyMMdd_HHmmss") & ".jpg") 'TODO qui sarebbe utile salvare i dati di scatto dell'immagine backSaved = True Catch ex As Exception Console.WriteLine("BACKIMAGE PRONTA: " & MainModule.IndexProc & " - ERRORE - " & ex.Message) End Try Try If backSaved Then Dim EW As New ExifWorks(SaveDir & "BackImage.jpg") Debug.Print("FocalLength Length " & EW.FocalLength.ToString("0.0mm")) Debug.Print("Aperture=" & EW.Aperture.ToString("0.0")) Debug.Print("ISO=" & EW.ISO.ToString) Debug.Print("TimeExp=" & EW.ExposureTime.ToString("0.0")) EW.Dispose() End If Catch ex As Exception End Try End Sub Private Sub RilevaBordi(img As Bitmap) If Not File.Exists(SaveDir & "BackImage.jpg") Then Console.WriteLine("BACK IMAGE NON TROVATA: " & MainModule.IndexProc) Return End If _visione.BackImageFile = SaveDir & "BackImage.jpg" _visione.Image1 = img '_visione.TrovaBordi(2) _visione.BorderType = _borderType VisualizzaThreshold() _visione.TrovaBordiMCh(_ActTh) ImageControl1.Image = _visione.FinalImage End Sub Private Sub MostraStato() If StatoGenerale = statoGenEnum.StatoOk Then Return If ModalitaNascosta Then Return Select Case StatoGenerale Case statoGenEnum.ErroreCalibrazione MsgBox("Calibration Error") Case statoGenEnum.ErroreCfg MsgBox("Cfg Error") Case statoGenEnum.ErroreSconosciuto MsgBox("Unknown Error") End Select End Sub Private Sub EseguiScatto() ' Take Picture If Not Camera.Connected Then Camera.Connect(Camera.CameraID) 'Me.Text = "ID Camera = " & Camera.CameraID End If RichiestaFoto = False RichiestaClick() SetFormStatus() End Sub Public Sub ScattoBackGround() RichiestaBackGround = True EseguiScatto() End Sub Private Sub SetThreshold() Console.WriteLine("SET TRESHHOLD: " & MainModule.IndexProc) _ActTh = SogliaPercentuale * 2.55 _ActTh = Math.Min(_ActTh, 255) VisualizzaThreshold() End Sub Public Sub RipetiThreshold() SetThreshold() VisualizzaThreshold() _visione.ApplicaTreshold(_ActTh) ImageControl1.Image = _visione.FinalImage End Sub Private Sub SalvaImmagineCiclica() If _maxImage <= 0 Then Return If SaveLogDir.Length = 0 Then Return Try AggiornaNumImage() FileCopy(Camera.PhotoFileName, SaveLogDir & "Image" & _numImage.ToString("000") & ".jpg") 'FileCopy(Camera.PhotoFileName, SaveDir & "BackImage" & Format(Now, "yyMMdd_HHmmss") & ".jpg") ' RichiestaBackGround = False Catch ex As Exception End Try End Sub Private Sub AggiornaNumImage() If _maxImage <= 0 Then Return If SaveLogDir.Length = 0 Then Return If _numImage >= 0 Then _numImage = _numImage + 1 If _numImage > _maxImage Then _numImage = 1 End If Return End If Dim NomiFiles() As String ' devo capire dove ero arrivato NomiFiles = Directory.GetFiles(SaveLogDir, "Image???.jpg") Dim i As Integer Dim maxDateIndex As Integer = -1 Dim ActualDate, MaxDate As Date Dim ActualNumber, MaxNumber As Integer If NomiFiles.Length = 0 Then _numImage = 0 Return End If MaxDate = Directory.GetLastWriteTime(NomiFiles(0)) MaxNumber = CInt(NomiFiles(0).Substring(NomiFiles(0).Length - 7, 3)) For i = 1 To NomiFiles.Length - 1 ActualDate = Directory.GetLastWriteTime(NomiFiles(i)) ActualNumber = CInt(NomiFiles(i).Substring(NomiFiles(i).Length - 7, 3)) If ActualNumber > MaxNumber Then MaxNumber = ActualNumber End If If ActualDate > MaxDate Then MaxDate = ActualDate maxDateIndex = i End If Next ' se ho ancora numeri disponibili If MaxNumber < _maxImage Then _numImage = MaxNumber + 1 ' altrimenti sovrascrivo quello con la data più grande ElseIf maxDateIndex > -1 Then _numImage = CInt(NomiFiles(maxDateIndex).Substring(NomiFiles(maxDateIndex).Length - 7, 3)) + 1 End If End Sub Public Sub SetSearchMode(smode As Integer) If smode >= 0 AndAlso smode <= 3 Then _visione.SearchMode = smode Else #If WinXp Then _visione.SearchMode = CvEnum.RETR_TYPE.CV_RETR_EXTERNAL #Else _visione.SearchMode = CvEnum.RetrType.External #End If End If End Sub #End Region ' Metodi fotocamera Private Shared Function GetPrivateProfileString(ByVal section As String, ByVal key As String, ByVal def As String, ByVal retVal As StringBuilder, ByVal size As Integer, ByVal filePath As String) As Integer End Function Public Function GetIniValue(section As String, key As String, filename As String, Optional defaultValue As String = "") As String Dim sb As New StringBuilder(500) If GetPrivateProfileString(section, key, defaultValue, sb, sb.Capacity, filename) > 0 Then Return sb.ToString Else Return defaultValue End If End Function Public Sub SetDefaultCamera(Optional resetID As Boolean = False) Dim NomeFileCfg, TmpString As String Dim NomeFileTempCfg, DirToReadCfg As String Dim SaveFileCfg As String Dim NomeFileIni As String Dim nf As Integer Dim writer As StreamWriter '#If DEBUG Then ' NomeFileIni = "c:\CameraMng\DataRoot.ini" ' DefaultNomeFileCfg = "c:\CameraMng\CameraMng.Cfg" ' 'DirExe = "c:\CameraMng" '#Else NomeFileIni = Application.StartupPath & "\DataRoot.ini" DirToReadCfg = Application.StartupPath 'DirExe = Application.StartupPath '#End If Try DirToReadCfg = GetIniValue("Data", "DataRoot", NomeFileIni, DirToReadCfg) ' aggiungiamo indici processo corrente If Not ModalitaNascosta Then If CFG_DEFAULT <> ComboBoxCameraCfg.SelectedItem.ToString() Then DirToReadCfg = DirToReadCfg & ComboBoxCameraCfg.SelectedItem.ToString() End If Else DirToReadCfg = DirToReadCfg & MainModule.IndexProc End If NomeFileCfg = DirToReadCfg & "\CameraMng.cfg" NomeFileTempCfg = DirToReadCfg & "\CameraMngTmp.cfg" SaveFileCfg = DirToReadCfg & "\CameraMng" & Format(Now, "yyyyMMddhhmmss") & ".cfg" If (File.Exists(NomeFileTempCfg)) Then File.Delete(NomeFileTempCfg) End If nf = FreeFile() FileOpen(nf, NomeFileCfg, OpenMode.Input) writer = New StreamWriter(NomeFileTempCfg) TmpString = "" While Not EOF(nf) TmpString = LineInput(nf) If Not TmpString.StartsWith("CameraID=") Then writer.WriteLine(TmpString, CultureInfo.InvariantCulture) End If End While If Not resetID Then writer.WriteLine("CameraID=" & Camera.CameraID, CultureInfo.InvariantCulture) End If FileClose(nf) writer.Close() File.Copy(NomeFileCfg, SaveFileCfg) If (File.Exists(NomeFileCfg)) Then File.Delete(NomeFileCfg) End If File.Copy(NomeFileTempCfg, NomeFileCfg) File.Delete(NomeFileTempCfg) ' lo faccio qui se tutto è andato bene If resetID Then CameraID = "" CfgForm.LbCfgCameraID.Text = CameraID MsgBox("ID Reset OK") Else MessageBox.Show("New ID succesfully written on '" & NomeFileCfg & "'.", "Avviso", MessageBoxButtons.OK, MessageBoxIcon.Information) CfgForm.LbCfgCameraID.Text = Camera.CameraID End If Catch ex As Exception MsgBox("Error in Writing Cfg File " & ex.Message) End Try End Sub Private Sub AggiornaPulsantiVIsibili() BtnCfg.Visible = bExtended BtnCorrProsp.Visible = False 'bExtended BtnBackG.Visible = bEnableBorder BtnEdgeFinder.Visible = bEnableBorder BtnChangeThreshold.Visible = bEnableBorder BtnIncrTh.Visible = bEnableBorder End Sub ' salva l'area in cui si verifica l'esposizione Private Sub SaveDefAree() Dim NomeFileCfg, TmpString As String Dim NomeFileTempCfg, DirToReadCfg As String Dim SaveFileCfg As String Dim NomeFileIni As String Dim nf As Integer Dim writer As StreamWriter '#If DEBUG Then ' NomeFileIni = "c:\CameraMng\DataRoot.ini" ' DefaultNomeFileCfg = "c:\CameraMng\CameraMng.Cfg" ' DirExe = "c:\CameraMng" '#Else NomeFileIni = Application.StartupPath & "\DataRoot.ini" DirToReadCfg = Application.StartupPath 'DirExe = Application.StartupPath '#End If Dim ExpEnableSet As Boolean = False Dim AreaExpSet As Boolean = False Dim AreaStoneSet As Boolean = False Dim x1, y1, x2, y2 As Integer Try DirToReadCfg = GetIniValue("Data", "DataRoot", NomeFileIni, DirToReadCfg) If Not ModalitaNascosta Then If CFG_DEFAULT <> ComboBoxCameraCfg.SelectedItem.ToString() Then DirToReadCfg = DirToReadCfg & ComboBoxCameraCfg.SelectedItem.ToString() End If Else DirToReadCfg = DirToReadCfg & MainModule.IndexProc End If NomeFileCfg = DirToReadCfg & "\CameraMng.cfg" NomeFileTempCfg = DirToReadCfg & "\CameraMngTmp.cfg" SaveFileCfg = DirToReadCfg & "\CameraMng" & Format(Now, "yyyyMMddhhmmss") & ".cfg" If (File.Exists(NomeFileTempCfg)) Then File.Delete(NomeFileTempCfg) End If nf = FreeFile() FileOpen(nf, NomeFileCfg, OpenMode.Input) writer = New StreamWriter(NomeFileTempCfg) TmpString = "" While Not EOF(nf) TmpString = LineInput(nf) If TmpString.StartsWith("RectCheckExp=") AndAlso _visione.ExpCorrType <> clsVisione.eExpCorrMode.none Then _visione.GetExpRectangle(x1, y1, x2, y2) writer.WriteLine("RectCheckExp={0},{1},{2},{3}", x1.ToString, y1.ToString, x2.ToString, y2.ToString, CultureInfo.InvariantCulture) AreaExpSet = True ElseIf TmpString.StartsWith("RectCheckStone=") Then _visione.GetStoneRectangle(x1, y1, x2, y2) writer.WriteLine("RectCheckStone={0},{1},{2},{3}", x1.ToString, y1.ToString, x2.ToString, y2.ToString, CultureInfo.InvariantCulture) AreaStoneSet = True Else writer.WriteLine(TmpString, CultureInfo.InvariantCulture) End If End While 'If Not ExpEnableSet Then ' writer.WriteLine("ExpCorrection=1") 'End If If Not AreaExpSet AndAlso _visione.ExpCorrType <> clsVisione.eExpCorrMode.none Then _visione.GetExpRectangle(x1, y1, x2, y2) writer.WriteLine("RectCheckExp={0},{1},{2},{3}", x1.ToString, y1.ToString, x2.ToString, y2.ToString, CultureInfo.InvariantCulture) End If If Not AreaStoneSet Then _visione.GetStoneRectangle(x1, y1, x2, y2) writer.WriteLine("RectCheckStone={0},{1},{2},{3}", x1.ToString, y1.ToString, x2.ToString, y2.ToString, CultureInfo.InvariantCulture) End If FileClose(nf) writer.Close() File.Copy(NomeFileCfg, SaveFileCfg) If (File.Exists(NomeFileCfg)) Then File.Delete(NomeFileCfg) End If File.Copy(NomeFileTempCfg, NomeFileCfg) File.Delete(NomeFileTempCfg) Catch ex As Exception MsgBox("Error in Writing Cfg File " & ex.Message) End Try End Sub Private Sub VisualizzaThreshold() Dim thPerc As Double = (CDbl(_ActTh) / 255) * 100 lbThreshold.Text = _ActTh.ToString & " (" & thPerc.ToString("0.0") & "%)" End Sub Private Sub TestRaddrizzamento() Dim _bmp As Bitmap = New Bitmap("c:\Temp\Test.jpg") Dim cameraMatrix As New Matrix(Of Double)(3, 3) '[fx 0 cx; 0 fy cy; 0 0 1] cameraMatrix.Data(0, 0) = _bmp.Width / 2 cameraMatrix.Data(0, 1) = 0 cameraMatrix.Data(0, 2) = _bmp.Width / 2 cameraMatrix.Data(1, 0) = 0 cameraMatrix.Data(1, 1) = _bmp.Height / 2 cameraMatrix.Data(1, 2) = _bmp.Height / 2 cameraMatrix.Data(2, 0) = 0 cameraMatrix.Data(2, 1) = 0 cameraMatrix.Data(2, 2) = 1 Dim distCoeffs As New Matrix(Of Double)(1, 4) '[k1, k2, p1, p2] distCoeffs.Data(0, 0) = 0.17352 distCoeffs.Data(0, 1) = -0.484226 distCoeffs.Data(0, 2) = 0.00075256 distCoeffs.Data(0, 3) = -0.000269617 ' rms = 2.729067 ' fx = 4609.251961 ' fy = 4609.251961 ' cx = 3076.747294 ' cy = 2073.815575 ' k1 = -0.160129 ' k2 = 0.167262 ' p1 = -0.00901 ' p2 = -0.000612 ' hfov = 67.4Deg 'vfov = 48.4Deg 'rms = 2.912043 'fx = 4775.944905 'fy = 4775.944905 'cx = 3103.561924 'cy = 2033.648165 'k1 = -0.153547 'k2 = 0.127935 'p1 = -0.00626 'p2 = -0.000005 'hfov = 66Deg 'vfov = 46.1Deg '[fx 0 cx; 0 fy cy; 0 0 1] cameraMatrix.Data(0, 0) = 4775.944905 cameraMatrix.Data(0, 1) = 0 cameraMatrix.Data(0, 2) = 3103.561924 cameraMatrix.Data(1, 0) = 0 cameraMatrix.Data(1, 1) = 4775.944905 cameraMatrix.Data(1, 2) = 2033.648165 cameraMatrix.Data(2, 0) = 0 cameraMatrix.Data(2, 1) = 0 cameraMatrix.Data(2, 2) = 1 '[k1, k2, p1, p2] distCoeffs.Data(0, 0) = -0.153547 distCoeffs.Data(0, 1) = 0.127935 distCoeffs.Data(0, 2) = -0.00626 distCoeffs.Data(0, 3) = -0.000005 Dim outFrame As New Image(Of Emgu.CV.Structure.Rgb, Byte)(_bmp.Width, _bmp.Height) Dim newIntrinsecMatrix As IInputArray CvInvoke.Undistort(New Image(Of Emgu.CV.Structure.Rgb, Byte)(_bmp), outFrame, cameraMatrix, distCoeffs, newIntrinsecMatrix) _bmp = outFrame.Bitmap _bmp.Save("c:\temp\Testu.png", System.Drawing.Imaging.ImageFormat.Png) End Sub #End Region ' Methods #Region "EVENTS" ' Preparo il programma Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim strWinXP As String = "" #If WinXp Then strWinXP = " (WinXP)" #End If Dim ver As String = My.Application.Info.Version.Major.ToString() & "." & My.Application.Info.Version.Minor.ToString() & (ChrW(97 - 1 + My.Application.Info.Version.Build)).ToString() & My.Application.Info.Version.Revision.ToString() Me.Text = "EgalTech Camera Manager" & strWinXP & " v" & ver BtnLoad.Visible = bExtended ImageControl1.PanMode = True ' Carico la configurazione corrente Inizializza() ' TStatus.Text = "Initialized" If ModalitaNascosta Then Me.Visible = False ' Avvio su un nuvo processo la comunicazione con il programma OmagCUT Dim ThreadCmdProcess As New Thread(AddressOf StartThreadCmdProcess) ThreadCmdProcess.Start() End Sub ' NUOVA gestione comunicazione con OmagCUT Public Sub WaitingForInstruction() Handles Me._waitingCmd Dim sNewReadLine As String = Console.ReadLine 'If Not String.IsNullOrWhiteSpace(varDebug) Then sNewReadLine = varDebug 'varDebug = "" If Not String.IsNullOrEmpty(sNewReadLine) Then While sNewReadLine <> "CLOSE" Dim sVal() As String = sNewReadLine.Split(","c) If sVal.Count > 1 Then sNewReadLine = sVal(0) Select Case sNewReadLine Case "0" ' Primo avvio di processo ModalitaNascosta = True Hide() Console.WriteLine("RICHIESTA LETTURA CONFIGURAZIONE: " & MainModule.IndexProc) LeggiFileConfigurazione() Case "1" ModalitaNascosta = False Visible = True Case "2" ' Richiesta scatto foto e correzione CorrezioneAutomatica = True RichiestaBordi = False Console.WriteLine("CORREZIONE FOTO: " & MainModule.IndexProc) Console.WriteLine("PROCESSO: " & MainModule.IndexProc) Console.WriteLine("CAMERA BODY CFG: " & MainModule.IndexProc & " -- " & CameraID) Console.WriteLine("CAMERA BODY CONNECTED: " & MainModule.IndexProc & " -- " & Camera.CameraID) RichiestaClick() Case "3" RichiestaStatoCamera() Case "4" ' Salvataggio di BackImage per riconoscimento contorno Console.WriteLine("RICHIESTA SFONDO: " & MainModule.IndexProc) Console.WriteLine("PROCESSO: " & MainModule.IndexProc) Console.WriteLine("CAMERA BODY CFG: " & MainModule.IndexProc & " -- " & CameraID) Console.WriteLine("CAMERA BODY CONNECTED: " & MainModule.IndexProc & " -- " & Camera.CameraID) ScattoBackGround() Case "5" ' Richiesta DXF di contorno lastra RichiestaBordi = True If sVal.Count = 2 Then MainModule.SogliaPercentuale = sVal(1) Console.WriteLine("RICONOSCIMENTO CONTORNO: " & MainModule.IndexProc) Console.WriteLine("PROCESSO: " & MainModule.IndexProc) Console.WriteLine("CAMERA BODY CFG: " & MainModule.IndexProc & " -- " & CameraID) Console.WriteLine("CAMERA BODY CONNECTED: " & MainModule.IndexProc & " -- " & Camera.CameraID) RichiestaClick() Case "6" If sVal.Count = 2 Then MainModule.SogliaPercentuale = sVal(1) RipetiThreshold() Case "7" Console.WriteLine("PROCESSO ATTIVO: " & MainModule.IndexProc) Case Else Console.WriteLine("COMANDO '" & sNewReadLine & "' NON DECODIFICATO: " & MainModule.IndexProc) End Select sNewReadLine = Console.ReadLine End While End If End Sub Private Sub BtnTakeFoto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnTakeFoto.Click CorrezioneAutomatica = False EseguiScatto() End Sub Private Sub BtnCfg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCfg.Click 'CfgForm.LbDeviceDescription.Text = Camera.cameraModelFactory CfgForm.LbDeviceStatus.Text = If(Camera.Connected, "Connected", "Disconnected") ' assegnato solo dall'evento connessione, perciò lo ribadisco CfgForm.LbCameraID.Text = Camera.CameraID ' CfgForm.ShowDialog() ' Nuova gestione della pagina delle configurazioni SetConfigForm.ShowDialog() End Sub Private Sub BtnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnEnd.Click Me.Close() End Sub Private Sub BtnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) OpenFileDialog1.InitialDirectory = SaveDir OpenFileDialog1.FileName = "" OpenFileDialog1.Filter = "JPEG Format (*.JPG)|*.jpg|BMP Format (*.BMP) |*.bmp" OpenFileDialog1.CheckFileExists = True OpenFileDialog1.ShowDialog() ImageMng.Corrected = False ImageControl1.Image = Nothing GC.Collect() If Len(OpenFileDialog1.FileName) > 0 Then m_Image = Nothing m_Image = New Bitmap(OpenFileDialog1.FileName) ImageControl1.Image = m_Image ImageControl1.fittoscreen() LeggiExif(OpenFileDialog1.FileName) status = en_status.ImageFromCamera End If SetFormStatus() End Sub Private Sub BtnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSave.Click ' recupero l'immagine che avevo già salvato Dim objBmp As New Drawing.Bitmap(SaveDir & "FinalImage.jpg") Dim NomeFile, NomeFile2, NomeSou As String Dim nf As Integer Dim xyDpi As Single KeyBoard.Text = Format(Now, "yyMMdd_HHmmss") ' la stringa di uscita KeyBoard.ShowDialog() ' Sistemare !!!! If Len(KeyBoard.Text) > 0 Then ' nel file jpeg non so se questo settaggio viene salvato NomeFile = SaveDir & KeyBoard.Text & ".jpg" xyDpi = 25.4 * ImageMng.mm2pixelAtZ ' se calibrazione distorsione lente, non serve objBmp.SetResolution(xyDpi, xyDpi) Try objBmp.Save(NomeFile, System.Drawing.Imaging.ImageFormat.Jpeg) NomeFile2 = SaveDir & "click.txt" nf = FreeFile() FileOpen(nf, NomeFile2, OpenMode.Output) Print(nf, "Err=0") FileClose(nf) Catch MsgBox("File Save Error") End Try Try NomeSou = SaveDir & "FinalImage.txt" NomeFile2 = SaveDir & KeyBoard.Text & ".txt" File.Copy(NomeSou, NomeFile2, True) Catch ex As Exception MsgBox("File Aux Save Error") End Try End If objBmp.Dispose() objBmp = Nothing status = en_status.NoImage End Sub Private Sub BtnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 'CancelFile(Camera.PhotoFileName) CancelDir(DirTmp) End Sub Private Sub FrmMain_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing Try If Camera.Connected Then Camera.Disconnect() End If Catch ex As Exception End Try End End Sub Private Sub ImageControl1_NewMousePosImage(pima As System.Drawing.PointF) Handles ImageControl1.NewMousePosImage lbMousePosmm.Text = "px: X" & pima.X.ToString("0.00") & " Y" & pima.Y.ToString("0.00") If ImageMng.Corrected Then Try Dim pmm As PointF ImageMng.Pix2MMOnUndist(pima, pmm) lbMousePosmm.Text = lbMousePosmm.Text & " mm: X" & pmm.X.ToString("0.00") & " Y" & pmm.Y.ToString("0.00") Catch ex As Exception End Try End If End Sub Private Sub ImageControl1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) SetFormStatus() End Sub Private Sub BtnCorrCompleta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCorrCompleta.Click frmSce.ShowDialog() Refresh() Me.Cursor = Cursors.WaitCursor CorrezioneCompleta() Me.Cursor = Cursors.Default End Sub Private Sub BtnCorrLens_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCorrLens.Click Try status = en_status.Calibration Me.Cursor = Cursors.WaitCursor SetFormStatus() Refresh() ImageMng.Correggi() ProgressBar.Value = 0 ImageControl1.Image = ImageMng.UndistorcedImage ImageControl1.fittoscreen() GC.Collect() CaliData2Form() ImageControl1.DBoard.VisPuntiCorner = True ImageControl1.DBoard.VisPuntiCaliH = True ImageControl1.Refresh() Catch ex As Exception TStatus.Text = "Process Aborted" Finally Me.Cursor = Cursors.Default End Try End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) ImageControl1.fittoscreen() End Sub Private Sub BtnZoom11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) ImageControl1.ZoomFactor = 1 End Sub Private Sub TimerZoom_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerZoom.Tick If m_ZoomFactor <> 1 And m_ZoomFactor <> 0 Then ImageControl1.ZoomFactor = ImageControl1.ZoomFactor * m_ZoomFactor Else TimerZoom.Enabled = False End If End Sub Private Sub BtnZoomPiu_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) m_ZoomFactor = 1.05 ImageControl1.ZoomFactor = ImageControl1.ZoomFactor * m_ZoomFactor TimerZoom.Enabled = True End Sub Private Sub BtnZoomPiu_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) TimerZoom.Enabled = False m_ZoomFactor = 1 End Sub Private Sub FrmMain_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize PosizionaControlli() End Sub Private Sub BtnSaveCal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSaveCal.Click FineCalibrazione(True) End Sub Private Sub BtnAbortCal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAbortCal.Click FineCalibrazione(False) End Sub Private Sub BtnCorrProsp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCorrProsp.Click ImageMng.CorreggiProspettiva(SpessLastra) GC.Collect() SetFormStatus() End Sub Private Sub BtnZoomPan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnZoomPan.Click ImageControl1.PanMode = Not ImageControl1.PanMode End Sub Private Sub LbAltCali_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LbAltCali.Click NumPad.Text = Format(ImageMng.m_ZCali, "0.00") ' la stringa di uscita NumPad.ShowDialog() ImageMng.m_ZCali = Val(NumPad.Text) LbAltCali.Text = Format(ImageMng.m_ZCali, "0.00") & " mm" End Sub Private Sub LbAltRif_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LbAltRif.Click NumPad.Text = Format(ImageMng.m_AltRif, "0.00") ' la stringa di uscita NumPad.ShowDialog() ImageMng.m_AltRif = Val(NumPad.Text) LbAltRif.Text = Format(ImageMng.m_AltRif, "0.00") & " mm" End Sub Private Sub FrmMain_VisibleChanged(sender As Object, e As System.EventArgs) Handles Me.VisibleChanged If ModalitaNascosta Then Me.Hide() End If End Sub Private Sub cmdZoomAll_Click(sender As System.Object, e As System.EventArgs) Handles cmdZoomAll.Click ImageControl1.fittoscreen() End Sub Private Sub BtnZom11_Click(sender As System.Object, e As System.EventArgs) Handles BtnZoom11.Click ImageControl1.ZoomFactor = 1 End Sub Private Sub cmdOpen_Click(sender As System.Object, e As System.EventArgs) Handles BtnLoad.Click ' OpenFileDialog1.InitialDirectory = SaveDir OpenFileDialog1.InitialDirectory = SaveLogDir OpenFileDialog1.FileName = "" OpenFileDialog1.Filter = "JPEG Format (*.JPG)|*.jpg|BMP Format (*.BMP) |*.bmp" OpenFileDialog1.CheckFileExists = True OpenFileDialog1.ShowDialog() ImageMng.Corrected = False ImageControl1.Image = Nothing GC.Collect() If Len(OpenFileDialog1.FileName) > 0 Then ImageMng.ProcessStop() If Not m_Image Is Nothing Then m_Image.Dispose() End If m_Image = Nothing m_Image = New Bitmap(OpenFileDialog1.FileName) ImageControl1.Image = m_Image ImageControl1.fittoscreen() LeggiExif(OpenFileDialog1.FileName) status = en_status.ImageFromCamera ImageMng.InputImage = m_Image TStatus.Text = "Image Loaded" End If SetFormStatus() If CorrezioneAutomatica Then Me.Cursor = Cursors.WaitCursor CorrezioneCompleta() Me.Cursor = Cursors.Default End If End Sub Private Sub ImageMng_AvanzamentoCorrezioneLente(value As Double) Handles ImageMng.AvanzamentoCorrezioneLente If Me.InvokeRequired Then Me.Invoke(Sub() ImageMng_AvanzamentoCorrezioneLente(value)) Return End If If (value >= 0 And value <= 100) Then ProgressBar.Value = value End If TStatus.Text = "Image Undistortion..." End Sub Private Sub ImageMng_AvanzamentoCorrezioneProspettiva(value As Double) Handles ImageMng.AvanzamentoCorrezioneProspettiva If Me.InvokeRequired Then Me.Invoke(Sub() ImageMng_AvanzamentoCorrezioneProspettiva(value)) Return End If If (value >= 0 And value <= 100) Then ProgressBar.Value = value End If TStatus.Text = "Image Correction..." End Sub Private Sub ImageMng_FineCorrezioneLente() Handles ImageMng.FineCorrezioneLente If Me.InvokeRequired Then Me.Invoke(New MethodInvoker(AddressOf ImageMng_FineCorrezioneLente)) Exit Sub End If ProgressBar.Value = 0 'ImageControl1.Image = ImageMng.UndistorcedImage 'ImageControl1.fittoscreen() TStatus.Text = "Image Undistorced" End Sub Private Sub ImageMng_FineCorrezioneProspettiva() Handles ImageMng.FineCorrezioneProspettiva If Me.InvokeRequired Then Me.Invoke(New MethodInvoker(AddressOf ImageMng_FineCorrezioneProspettiva)) Exit Sub End If If Not RichiestaBordi And Not VaacumCheckReq Then ImageMng.SaveClickMsg(0) End If ProgressBar.Value = 0 Try ImageControl1.Image = ImageMng.FinalImage ImageControl1.fittoscreen() TStatus.Text = "Image Correction OK" Catch ex As Exception TStatus.Text = "Failed showing Image" End Try status = en_status.ImgCorrected SetFormStatus() End Sub ' Scarico immagine e procedo all'elaborazione Private Sub Camera_DownloadedCompleted() Handles Camera.DownloadedCompleted ImageMng.DownloadCompletato() ImageMng.InputImage = Camera.CameraImage TStatus.Text = "Image Downloaded" Console.WriteLine("DOWNLOAD DA CAMERA COMPLETATO: " & MainModule.IndexProc) LeggiExif(Camera.PhotoFileName) status = en_status.ImageFromCamera m_Image = Camera.CameraImage ImageControl1.Image = Camera.CameraImage ImageControl1.fittoscreen() SetFormStatus() If RichiestaBackGround Then SalvaNuovoBackGround() ImageMng.SaveClickMsg(0) Return End If ' potrei salvare solo se richiesta bordi .. SalvaImmagineCiclica() If VaacumCheckReq Then VaacumCheckReq = False If Len(VacFilePos) > 0 Then ImageMng.CorrezioneCompleta() _search.GeneraIstruzioniRicerca(VacFilePos, VacMinScore, VacTolmm) _search.Ricerca() ImageControl1.Image = _search.FinalImage End If TimerMain.Enabled = True End If ' RichiestaBordi = True If RichiestaBordi Then SetThreshold() RilevaBordi(m_Image) Return End If If CorrezioneAutomatica Then Me.Cursor = Cursors.WaitCursor CorrezioneCompleta() Me.Cursor = Cursors.Default End If If RichiestaFoto Then RichiestaFoto = False RichiestaClick() Return End If End Sub Private Sub ImageMng_ProcessAborted(err As Integer) Handles ImageMng.ProcessAborted If Me.InvokeRequired Then Me.Invoke(Sub() ImageMng_ProcessAborted(err)) Return End If ProgressBar.Value = 0 TStatus.Text = "Process Aborted" End Sub Private Sub Camera_StatusChanged() Handles Camera.StatusChanged If Camera.Connected Then BtnTakeFoto.ImageIndex = 0 CfgForm.LbCameraID.Text = Camera.CameraID CfgForm.LbDeviceStatus.Text = "Connected" Else BtnTakeFoto.ImageIndex = 1 CfgForm.LbCameraID.Text = "" CfgForm.LbDeviceStatus.Text = "Disconnected" End If End Sub Private Sub BtnBackG_Click(sender As System.Object, e As System.EventArgs) Handles BtnBackG.Click ScattoBackGround() End Sub Private Sub BtnEdgeFinder_Click(sender As System.Object, e As System.EventArgs) Handles BtnEdgeFinder.Click _ActTh = 127 VisualizzaThreshold() RilevaBordi(m_Image) End Sub Private Sub BtnChangeThreshold_Click(sender As System.Object, e As System.EventArgs) Handles BtnChangeThreshold.Click _ActTh = _ActTh - 10 _ActTh = Math.Max(_ActTh, 1) VisualizzaThreshold() _visione.ApplicaTreshold(_ActTh) ImageControl1.Image = _visione.FinalImage End Sub Private Sub BtnIncrTh_Click(sender As System.Object, e As System.EventArgs) Handles BtnIncrTh.Click Dim tm As New Stopwatch Dim t1, t2 As Long tm.Start() _ActTh = _ActTh + 10 _ActTh = Math.Min(_ActTh, 250) VisualizzaThreshold() _visione.ApplicaTreshold(_ActTh) t1 = tm.ElapsedMilliseconds ImageControl1.Image = _visione.FinalImage t2 = tm.ElapsedMilliseconds End Sub Private Sub ImageControl1_PointSelected(n As Integer) Handles ImageControl1.PointSelected lbXmm.Text = ImageMng.m_pworld(n).X.ToString("0.00") lbYmm.Text = ImageMng.m_pworld(n).Y.ToString("0.00") _npProspSel = n 'lbXmm.Text = (n + 1).ToString End Sub Private Sub ImageControl1_PointUnselected() lbXmm.Text = "" lbYmm.Text = "" _npProspSel = -1 End Sub Private Sub lbXmm_Click(sender As System.Object, e As System.EventArgs) Handles lbXmm.Click If _npProspSel < 0 Then Return NumPad.Text = CDbl(lbXmm.Text).ToString("0.00") NumPad.ShowDialog() ImageMng.m_pworld(_npProspSel).X = CDbl(NumPad.Text) lbXmm.Text = ImageMng.m_pworld(_npProspSel).X.ToString("0.00") End Sub Private Sub lbYmm_Click(sender As System.Object, e As System.EventArgs) Handles lbYmm.Click If _npProspSel < 0 Then Return NumPad.Text = lbYmm.Text NumPad.ShowDialog() ImageMng.m_pworld(_npProspSel).Y = CDbl(NumPad.Text) lbYmm.Text = ImageMng.m_pworld(_npProspSel).Y.ToString("0.00") End Sub Private Sub ImageControl1_Load(sender As System.Object, e As System.EventArgs) End Sub Private Sub btnSearch_Click(sender As System.Object, e As System.EventArgs) Handles btnSearch.Click Try If ImageMng.InputImage Is Nothing Then Return If Not File.Exists(VacFilePos) Then MessageBox.Show("Non esiste il file '" & VacFilePos, "ERRORE", MessageBoxButtons.OK, MessageBoxIcon.Error) Return End If If Len(VacFilePos) > 0 Then ImageMng.CorrezioneCompleta() _search.GeneraIstruzioniRicerca(VacFilePos, VacMinScore, VacTolmm) _search.Ricerca() ImageControl1.Image = _search.FinalImage ImageControl1.fittoscreen() End If Catch ex As Exception End Try End Sub Private Sub _search_LogMessage(msg As String) Handles _search.LogMessage MsgBox(msg) End Sub Private Sub TimerMain_Tick(sender As System.Object, e As System.EventArgs) Handles TimerMain.Tick If Not VacuumCheckEnable Then TimerMain.Enabled = False Return End If TimerMain.Enabled = False ' Check esistenza file If (File.Exists(VacFileStart)) Then Dim ok As Boolean = False For i As Integer = 1 To 20 Try File.Delete(VacFileStart) ok = True Catch ex As Exception Threading.Thread.Sleep(100) End Try Next If Not ok Then MsgBox("Error on deleting File" & VacFileStart) Return End If VaacumCheckReq = True RichiestaClick() Else TimerMain.Enabled = True End If End Sub Private Sub BtnDefAree_Click(sender As System.Object, e As System.EventArgs) Handles BtnDefAree.Click Try status = en_status.DefAree Me.Cursor = Cursors.WaitCursor SetFormStatus() Refresh() ImageMng.ProcessStop() ImageMng.CorrezioneCompleta(False) ProgressBar.Value = 0 ImageControl1.Image = ImageMng.FinalImage ImageControl1.fittoscreen() GC.Collect() ImageControl1.Refresh() Catch ex As Exception TStatus.Text = "Process Aborted" Finally Me.Cursor = Cursors.Default End Try End Sub Private Sub BtnAbortDefAree_Click(sender As System.Object, e As System.EventArgs) Handles BtnAbortDefAree.Click Select Case status Case en_status.DefAree status = en_status.ImgCorrected Case en_status.DefTexp, en_status.DefStone, en_status.DefVentosa status = en_status.DefAree End Select ImageControl1.DBoard.VisAreaGen = False ImageControl1.Refresh() SetFormStatus() End Sub Private Sub BtnSaveAree_Click(sender As System.Object, e As System.EventArgs) Handles BtnSaveAree.Click ' TODO fare i salvataggi opportuni Dim x1, y1, x2, y2 As Double ImageControl1.DBoard.GetArea(x1, y1, x2, y2) Select Case status Case en_status.DefTexp _visione.SetExpRectangle(x1, y1, x2, y2) Case en_status.DefStone _visione.SetStoneRectangle(x1, y1, x2, y2) Case en_status.DefVentosa If Not Directory.Exists(VacDirModels) Then Dim sMsg As String = "Non esiste il direttorio '" & VacDirModels MessageBox.Show(sMsg, "ERRORE", MessageBoxButtons.OK, MessageBoxIcon.Error) Return End If Dim NomeFile As String NumPad.Text = "1" NumPad.ShowDialog() If Len(NumPad.Text) > 0 Then ' nel file jpeg non so se questo settaggio viene salvato NomeFile = VacDirModels & NumPad.Text & ".png" ImageMng.SaveModelFromRectangle(NomeFile, x1, y1, x2, y2) End If End Select status = en_status.DefAree ImageControl1.DBoard.VisAreaGen = False ImageControl1.Refresh() SetFormStatus() SaveDefAree() End Sub Private Sub BtnExpT_Click(sender As System.Object, e As System.EventArgs) Handles BtnExpT.Click ' Prendo i valori attuali del rettangolo 0 Dim x1, y1, x2, y2 As Double _visione.GetExpRectangle(x1, y1, x2, y2) ImageControl1.DBoard.SetArea(x1, y1, x2, y2) status = en_status.DefTexp SetFormStatus() ImageControl1.DBoard.VisAreaGen = True ImageControl1.Refresh() End Sub Private Sub BtnStone_Click(sender As Object, e As System.EventArgs) Handles BtnStone.Click ' Prendo i valori attuali del rettangolo 0 Dim x1, y1, x2, y2 As Double _visione.GetStoneRectangle(x1, y1, x2, y2) ImageControl1.DBoard.SetArea(x1, y1, x2, y2) status = en_status.DefStone SetFormStatus() ImageControl1.DBoard.VisAreaGen = True ImageControl1.Refresh() End Sub Private Sub BtnVentosa_Click(sender As System.Object, e As System.EventArgs) Handles BtnVentosa.Click ImageControl1.DBoard.SetArea(1000, 1000, 1800, 1600) status = en_status.DefVentosa SetFormStatus() ImageControl1.DBoard.VisAreaGen = True ImageControl1.Refresh() End Sub Private Sub ComboBoxCameras_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBoxCameras.SelectedIndexChanged If Not ModalitaNascosta Then ' LeggiFileConfigurazione() Camera.Connect(ComboBoxCameras.SelectedItem) SetFormStatus() End If End Sub Private Sub ComboBoxCameraCfg_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBoxCameraCfg.SelectedIndexChanged If Not ModalitaNascosta Then LeggiFileConfigurazione() If Not IsNothing(Camera.m_idList) Then If Camera.m_idList.Contains(CameraID) Then ComboBoxCameras.SelectedItem = CameraID Else ' Non esiste una configurazione Dim sTextMsg As String = String.Format("La configurazione " & ComboBoxCameraCfg.SelectedItem & " presenta una connessione alla camera non valida. " & "Nel file 'CamaeraMng.cgf' il campo 'CameraID") If String.IsNullOrEmpty(CameraID) Then sTextMsg &= "' vuoto." Else sTextMsg &= ": " & CameraID & "' non è valido." End If MessageBox.Show(sTextMsg, "Avvertenza", MessageBoxButtons.OK, MessageBoxIcon.Error) ComboBoxCameras.SelectedIndex = -1 End If End If ImageMng.m_fileCaliLensRead = False ImageMng.m_fileCaliProspRead = False ImageMng.m_bMatProspOk = False ImageMng.SetFileCalibrazione(FileLensCalib, FileCalibProsp) End If End Sub Private Sub RefreshCameras_Click(sender As Object, e As EventArgs) Handles RefreshCameras.Click LoadCamerasList() End Sub Private Sub BtnShowMsg_Click(sender As Object, e As EventArgs) Handles BtnShowMsg.Click Dim sTitle As String = "Esito lettura configurazione " & ComboBoxCameraCfg.SelectedItem MessageBox.Show(sMsgErr, sTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Sub #End Region ' Events End Class