Attribute VB_Name = "Modvision"
Declare Function HeapCreate Lib "kernel32" (ByVal flOptions As Long, ByVal dwInitialSize As Long, ByVal dwMaximumSize As Long) As Long
Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long
Declare Function HeapDestroy Lib "kernel32" (ByVal hHeap As Long) As Long
' queste due funzioni servono per copiare il contenuto di un buffer in un'altro
' sono diverse perchè gli argomenti sono diversi, cioè una funzione riceve il primo
' parametro per riferimento e l'altra per valore
Declare Sub CopyMemory2 Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, ByVal Source As Any, ByVal Length As Long)
Declare Sub CopyMemory1 Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Any, Source As Any, ByVal Length As Long)
' funzioni presenti nella libreria AUREL.DLL
Declare Function SearchNCCSingleGP Lib "vision.dll" (pSearch As NCCSEARCH) As Long
Global copystring$
Global dimim&  'dimensione template  X * Y
Public searcharea% 'se =1 sto acquisendo la search area
Public templat% 'se =1 sto acquisendo il template
Public flagdoing%
Public TempTop As Long
Public TempLeft As Long
Public TempBottom As Long
Public TempRight As Long
Public SearchTop As Long
Public SearchLeft As Long
Public SearchBottom As Long
Public SearchRight As Long
Public RicEs As Long
Public FattRid As Long
Public SogliaAccet As Long
Public SogliaCorr As Single
Public mytemplate() As Byte
Public myimage() As Byte
Public deftemplate%
Public defsearcharea%
Public thescore%
Public visionfilename$
Public currentcutnumber%
Public changetemplate%
Type NCCSEARCH
'parametri di ingresso della funzione
        pointerPicture As Long 'puntatore al buffer dell'immagine
'in realtà questo campo non viene mai usato in quanto nella dll, in quanto nella dll
'si trova già un puntatore all'immagine corrente, e la funzione di ricerca all'interno
'della dll sa dove si trova utilizza direttamente quel puntatore senza
'che ci sia bisogno di passare alla funzione un altro puntatore
'viene usata solo nelle funzioni Gp (General Purpouse) SADGp ed NCCGp perchè
'si intende che possano funzionare anche senza il software di acquisizione delle immagini
'fornito dalla dll
        larghPicture As Long 'larghezza dell'immagine
        altezPicture As Long 'altezza dell'immagine
        pointerTemplate As Long 'puntatore al buffer del template
        larghTemplate As Long 'larghezza del template
        altezTemplate As Long 'altezza del template
        iTopLeftSearchArea As Long 'coordinata y del vertice in alto a sx dell'area di ricerca
        jTopLeftSearchArea As Long 'coordinata x del vertice in alto a sx dell'area di ricerca
        iDownRightSearchArea As Long 'coordinata y del vertice in basso a dx dell'area di ricerca
        jDownRightSearchArea As Long 'coordinata x del vertice in basso a dx dell'area di ricerca
        larghFinestraIniziale As Long 'larghezza della finestra iniziale di ricerca
        altezFinestraIniziale As Long 'altezza della finestra iniziale di ricerca
        
        fattoreRiduzione As Long
        SogliaCorrelazione As Single
            
 'valori di ritorno della funzione
        iLocalizzazione As Long 'coordinata y in cui è stato riteovato il pattern
        jLocalizzazione As Long 'coordinata x in cui è stato riteovato il pattern
        misuraMigliorMatch As Single 'misura del match
        TemplateFound As Long
        devStandard As Single
End Type


Sub setboxtopleft(Picx As PictureBox, Picy As PictureBox, curx!, cury!)
Picx.Left = curx!
Picx.Top = cury!
Picx.Width = Picx.Height
Picy.Left = curx!
Picy.Top = cury!
Picy.Height = Picy.Width
Picx.Visible = True
Picy.Visible = True
End Sub

Sub extractsize(Picx1 As PictureBox, Picy1 As PictureBox)
sw& = Int(Picx1.Width / Screen.TwipsPerPixelX)
sh& = Int(Picy1.Height / Screen.TwipsPerPixelY)
st& = Int(Picx1.Top / Screen.TwipsPerPixelY)
sl& = Int(Picx1.Left / Screen.TwipsPerPixelX)
If searcharea% = 1 Then
    SearchBottom = st& + sh&
    SearchRight = sl& + sw&
    SearchTop = st&
    SearchLeft = sl&
    Exit Sub
End If
If templat% = 1 Then
    TempBottom = st& + sh&
    TempRight = sl& + sw&
    TempTop = st&
    TempLeft = sl&
    Exit Sub
End If
End Sub
Sub findvision(found%, foundx&, foundy&)
found% = 0
Dim pNccSearch7 As NCCSEARCH
pti& = VarPtr(myimage(1))
ptt& = VarPtr(mytemplate(1))
pNccSearch7.pointerPicture = pti&
pNccSearch7.larghPicture = 768
pNccSearch7.altezPicture = 576
pNccSearch7.pointerTemplate = ptt&
pNccSearch7.altezTemplate = TempBottom - TempTop
pNccSearch7.larghTemplate = TempRight - TempLeft
pNccSearch7.jTopLeftSearchArea = SearchLeft
pNccSearch7.iTopLeftSearchArea = SearchTop
pNccSearch7.jDownRightSearchArea = SearchRight
pNccSearch7.iDownRightSearchArea = SearchBottom
pNccSearch7.fattoreRiduzione = 4
cor! = thescore%
If cor! = 0 Then cor! = 500
If cor! >= 1000 Then cor! = 999
cor! = cor! / 10000
pNccSearch7.SogliaCorrelazione = 0.9 + cor!
retval = SearchNCCSingleGP(pNccSearch7)
mtc! = pNccSearch7.misuraMigliorMatch
sc% = Int((mtc! - 0.9) * 10000)
If retval = 0 And pNccSearch7.misuraMigliorMatch >= pNccSearch7.SogliaCorrelazione Then
                found% = 1
                foundx& = pNccSearch7.jLocalizzazione
                foundy& = pNccSearch7.iLocalizzazione
End If
End Sub
Sub savevision(fn$)
un% = FreeFile
Open fn$ For Output As #un%
Print #un%, Str(SearchTop)
Print #un%, Str(SearchBottom)
Print #un%, Str(SearchRight)
Print #un%, Str(SearchLeft)
Print #un%, Str(TempTop)
Print #un%, Str(TempBottom)
Print #un%, Str(TempRight)
Print #un%, Str(TempLeft)
Print #un%, Str(thescore%)
Print #un%, copystring$;
Close #un%
changetemplate% = 0
End Sub
Sub loadvision(fn$)
un% = FreeFile
Open fn$ For Input As #un%
Line Input #un%, cl$
SearchTop = Val(cl$)
Line Input #un%, cl$
SearchBottom = Val(cl$)
Line Input #un%, cl$
SearchRight = Val(cl$)
Line Input #un%, cl$
SearchLeft = Val(cl$)
Line Input #un%, cl$
TempTop = Val(cl$)
Line Input #un%, cl$
TempBottom = Val(cl$)
Line Input #un%, cl$
TempRight = Val(cl$)
Line Input #un%, cl$
TempLeft = Val(cl$)
Line Input #un%, cl$
thescore% = Val(cl$)
foffset& = Seek(un%)
Close #un%
dimim& = (TempBottom - TempTop) * (TempRight - TempLeft)
Open fn$ For Binary As #un%
Seek (un%), foffset&
copystring$ = Input$(dimim&, un%)
Close #un%
End Sub

Sub sizebox(Picx1 As PictureBox, Picy1 As PictureBox, Picx2 As PictureBox, Picy2 As PictureBox, curx!, cury!)
w1! = curx! - Picx1.Left
h1! = cury! - Picy1.Top
If w1! <= 0 Then Exit Sub
If h1! <= 0 Then Exit Sub
Picx1.Width = w1!
Picy1.Height = h1!
Picx2.Top = cury!
Picy2.Left = curx!
Picx2.Width = Picx1.Width
Picy2.Height = Picy1.Height
'If Picx2.Visible = False Then
Picx2.Left = Picx1.Left
Picy2.Top = Picy1.Top
Picx2.Visible = True
Picy2.Visible = True
'End If
End Sub

Sub enablekeys()
With Frmvision
If .cmdvt.Enabled = False Then .cmdvt.Enabled = True
If .cmdfind.Enabled = False Then .cmdfind.Enabled = True
If .cmdsave.Enabled = False Then .cmdsave.Enabled = True
End With
End Sub
