Files
omagoffice/EgtStoneLib/VeinMatchingWindow.xaml.vb
T
Emmanuele Sassi 4c679fbd48 OmagOFFICE :
- Migliorato AboutBox.
- Miglioramenti per compatibilità con nuova versione WPFLib5.
2017-11-25 16:55:39 +00:00

1105 lines
46 KiB
VB.net

Imports System.IO
Imports System.Windows.Interop
Imports System.Runtime.InteropServices
Imports EgtUILib
Imports EgtWPFLib5
Public Class VeinMatchingWindow
' Dichiarazione Scene
Friend WithEvents VeinMatchingScene As New Scene
Private VeinMatchingSceneHost As New System.Windows.Forms.Integration.WindowsFormsHost
' Gestione finestra
Private m_bFirst As Boolean = True
Private m_bPositioned As Boolean = False
' Selezione e modifica
Private m_nRestRadius As Integer = 3
Private m_dSnapDist As Double = 0
Private m_nIdToSel As Integer = GDB_ID.NULL
Private m_nIdToDesel As Integer = GDB_ID.NULL
Private m_bEnableEdit As Boolean = False
Private m_bVerify As Boolean = True
Private m_bCurrVerify As Boolean = True
Private m_bMagnetic As Boolean = False
Private m_bDrag As Boolean = False
Private m_bRotate As Boolean = False
Private m_bDragToStart As Boolean = False
Private m_bDragging As Boolean = False
Private m_locPrev As System.Drawing.Point
Private m_ptPrev As Point3d
Private m_ptCen As Point3d
Private Sub Window_Initialized(sender As Object, e As EventArgs)
' Assegnazione scena all'host e posizionamento nella PlacePageGrid
VeinMatchingSceneHost.Child = VeinMatchingScene
VeinMatchingSceneHost.SetValue(Grid.ColumnProperty, 1)
Me.VeinMatchingGrid.Children.Add(VeinMatchingSceneHost)
' Per non farla visualizzare alla creazione
Me.Left = 32000
' Assegno messaggi
ExportBtn.Content = EgtMsg(MSG_VEINMATCHING + 1) ' Esporta
ShowTextBtn.Content = EgtMsg(MSG_VEINMATCHING + 2) ' Mostra Info
EditBtn.Content = EgtMsg(MSG_VEINMATCHING + 3) ' Modifica
VerifyBtn.Content = EgtMsg(MSG_VEINMATCHING + 4) ' Verifica
MagneticBtn.Content = EgtMsg(MSG_VEINMATCHING + 5) ' Magnetico
End Sub
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
' Inizializzazioni da eseguire appena prima della prima visualizzazione
If m_bFirst Then
' Imposto finestra senza SystemMenu
Dim hwnd As IntPtr = New WindowInteropHelper(Me).Handle
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) And Not WS_SYSMENU)
' imposto colore di default
Dim DefColor As New Color3d(0, 0, 0)
GetMainPrivateProfileColor(S_GEOMDB, K_DEFAULTCOLOR, DefColor)
VeinMatchingScene.SetDefaultMaterial(DefColor)
' imposto colori sfondo
Dim BackTopColor As New Color3d(211, 211, 211)
GetMainPrivateProfileColor(S_SCENE, K_BACKTOP, BackTopColor)
Dim BackBotColor As New Color3d(211, 211, 211)
GetMainPrivateProfileColor(S_SCENE, K_BACKBOTTOM, BackBotColor)
VeinMatchingScene.SetViewBackground(BackTopColor, BackBotColor)
' imposto colore di evidenziazione
Dim MarkColor As New Color3d(255, 255, 0)
GetMainPrivateProfileColor(S_SCENE, K_MARK, MarkColor)
VeinMatchingScene.SetMarkMaterial(MarkColor)
' imposto colore per superfici selezionate
Dim SelSurfColor As New Color3d(255, 255, 192)
GetMainPrivateProfileColor(S_SCENE, K_SELSURF, SelSurfColor)
VeinMatchingScene.SetSelSurfMaterial(SelSurfColor)
' imposto tipo e colore del rettangolo di zoom
Dim bOutline As Boolean = True
Dim ZwColor As New Color3d(0, 0, 0)
GetMainPrivateProfileZoomWin(S_SCENE, K_ZOOMWIN, bOutline, ZwColor)
VeinMatchingScene.SetZoomWinAttribs(bOutline, ZwColor)
' imposto colore della linea di distanza
Dim DstLnColor As New Color3d(255, 0, 0)
GetMainPrivateProfileColor(S_SCENE, K_DISTLINE, DstLnColor)
VeinMatchingScene.SetDistLineMaterial(DstLnColor)
' imposto parametri OpenGL
Dim nDriver As Integer = GetMainPrivateProfileInt(S_OPENGL, K_DRIVER, 3)
Dim b2Buff As Boolean = (GetMainPrivateProfileInt(S_OPENGL, K_DOUBLEBUFFER, 1) <> 0)
Dim nColorBits As Integer = GetMainPrivateProfileInt(S_OPENGL, K_COLORBITS, 32)
Dim nDepthBits As Integer = GetMainPrivateProfileInt(S_OPENGL, K_DEPTHBITS, 32)
VeinMatchingScene.SetViewAttributes(nDriver, b2Buff, nColorBits, nDepthBits)
' inizializzo la scena (DB geometrico + visualizzazione) e verifico presenza chiave
If Not VeinMatchingScene.Init() Then
Me.Close()
End If
' dimensione lineare max in pixel delle textures
Dim nTxrMaxLinPix As Integer = GetMainPrivateProfileInt(S_SCENE, K_TXRMAXLINPIX, 16384)
EgtSetTextureMaxLinPixels(nTxrMaxLinPix)
' massimo movimento mouse considerato nullo
m_nRestRadius = GetMainPrivateProfileInt(S_NEST, K_RESTRADIUS, 3)
m_dSnapDist = GetMainPrivateProfileDouble(S_NEST, K_SNAPDIST, 50)
' imposto stato bottone ShowText
ShowTextBtn.IsChecked = VeinMatching.bShowText
' imposto stato bottoni Edit e Verify
EditBtn.IsChecked = m_bEnableEdit
VerifyBtn.IsEnabled = m_bEnableEdit
VerifyBtn.IsChecked = m_bVerify
MagneticBtn.IsEnabled = m_bEnableEdit And m_bVerify
MagneticBtn.IsChecked = m_bMagnetic
' dichiaro inizializzazioni eseguite
m_bFirst = False
End If
' inibisco selezione diretta da Scene
VeinMatchingScene.SetStatusNull()
End Sub
Private Sub Window_Closed(sender As Object, e As EventArgs) Handles Me.Closed
' Salvo posizione Window (se posizionata e non minimizzata)
If m_bPositioned And Me.WindowState <> WindowState.Minimized Then
Dim nFlag As Integer = If(Me.WindowState = WindowState.Maximized, 1, 0)
WriteMainPrivateProfileWinPos(S_VEINMATCHING, K_VEINMA_PLACE, nFlag, CInt(Me.Left), CInt(Me.Top), CInt(Me.Width), CInt(Me.Height))
End If
End Sub
Friend Sub AdjustPosition()
' Se già posizionata, esco subito
If m_bPositioned Then Return
' Imposto posizione e dimensioni della MainWindow da INI
Dim nFlag, nLeft, nTop, nWidth, nHeight As Integer
If GetMainPrivateProfileWinPos(S_VEINMATCHING, K_VEINMA_PLACE, nFlag, nLeft, nTop, nWidth, nHeight) Then
Dim PtTL = New System.Drawing.Point(nLeft, nTop)
Dim s As System.Windows.Forms.Screen = System.Windows.Forms.Screen.FromPoint(PtTL)
If s.Bounds.Contains(PtTL) Then
Me.WindowStartupLocation = Windows.WindowStartupLocation.Manual
Me.Top = nTop
Me.Left = nLeft
Me.Height = nHeight
Me.Width = nWidth
Me.WindowState = If(nFlag = 1, WindowState.Maximized, WindowState.Normal)
m_bPositioned = True
VeinMatching.ZoomAll()
Return
End If
End If
' Imposto in posizione standard
Me.WindowStartupLocation = Windows.WindowStartupLocation.Manual
Me.Top = Application.Current.MainWindow.Top
Me.Left = Application.Current.MainWindow.Left
Me.Height = nHeight
Me.Width = nWidth
Me.WindowState = If(nFlag = 1, WindowState.Maximized, WindowState.Normal)
m_bPositioned = True
VeinMatching.ZoomAll()
End Sub
Private Sub OnMouseDownScene(sender As Object, e As Windows.Forms.MouseEventArgs) Handles VeinMatchingScene.OnMouseDownScene
' Per default no drag
m_bDrag = False
' Si può selezionare solo con il tasto sinistro e se stato NULL
If e.Button <> Windows.Forms.MouseButtons.Left Or Not VeinMatchingScene.IsStatusNull() Then Return
' Eseguo selezione
EgtSetObjFilterForSelWin(True, True, True, True, True)
Dim nSel As Integer
EgtSelect(e.Location, Scene.DIM_SEL, Scene.DIM_SEL, nSel)
' Ricavo nome dell'entità selezionata e identificativo
Dim nId As Integer = EgtGetFirstObjInSelWin()
While nId <> GDB_ID.NULL
' Cerco l'identificativo del pezzo cui appartiene
Dim nPartId As Integer = EgtGetParent(EgtGetParent(nId))
If EgtIsPart(nPartId) Then
Dim nStat As Integer = GDB_ST.ON_
EgtGetStatus(nPartId, nStat)
' Se già selezionato o posizione oggetto incompatibile con flag posizione selezionati
If nStat = GDB_ST.SEL Then
' Memorizzo Id da deselezionare
m_nIdToDesel = nPartId
Else
' Memorizzo Id da selezionare
m_nIdToSel = nPartId
End If
If m_bEnableEdit Then m_bDrag = True
EgtDraw()
Exit While
End If
' Passo al successivo
nId = EgtGetNextObjInSelWin()
End While
' Se abilitata modifica, dati per drag
If m_bEnableEdit Then
m_locPrev = e.Location
m_bDrag = m_bDrag AndAlso EgtUnProjectPoint(e.Location, m_ptPrev)
m_bCurrVerify = m_bVerify And (Keyboard.Modifiers And ModifierKeys.Shift) = 0
m_bRotate = m_bDrag AndAlso (Keyboard.Modifiers And ModifierKeys.Control) > 0
m_bDragToStart = m_bDrag
End If
End Sub
Private Sub OnMouseMoveScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles VeinMatchingScene.OnMouseMoveScene
' Se drag non abilitato o già in esecuzione, esco
If Not m_bDrag Or m_bDragging Then Return
' Determino cosa muovere
Dim nMoveId = If(m_nIdToSel <> GDB_ID.NULL, m_nIdToSel, GDB_ID.SEL)
' Se primo movimento di drag, verifico di aver superato la soglia di movimento in pixel
If m_bDragToStart Then
If Math.Abs(e.Location.X - m_locPrev.X) < m_nRestRadius And
Math.Abs(e.Location.Y - m_locPrev.Y) < m_nRestRadius Then
Return
End If
If m_bRotate Then
If Not EgtGetPartPartClusterCenterGlob(nMoveId, m_ptCen) Then Return
End If
m_bDragToStart = False
End If
' Inizio esecuzione di drag
m_bDragging = True
' Ricavo il punto corrente in coordinate mondo
Dim ptCurr As Point3d
EgtUnProjectPoint(e.Location, ptCurr)
' Se traslazione
If Not m_bRotate Then
' Ricavo il vettore di movimento
Dim vtMove As Vector3d = ptCurr - m_ptPrev
' Eseguo il movimento
If vtMove.SqLen() > EPS_SMALL * EPS_SMALL Then
' Con verifica di collisione
If m_bCurrVerify Then
EgtMovePart(nMoveId, True, vtMove)
EgtSaveCollInfo()
' se movimento risultante nullo, provo con movimento tangente
Dim bTgMoved As Boolean = False
If vtMove.IsSmall() Then
' riprovo con movimento tangente
Dim vtTgMove As Vector3d = ptCurr - m_ptPrev
EgtTgMovePartOnCollision(nMoveId, True, vtTgMove)
bTgMoved = (Not vtTgMove.IsSmall())
End If
' se abilitato magnetico (allineamento + snap), lo provo
Dim bAlignMoved As Boolean = False
Dim bSnapMoved As Boolean = False
If m_bMagnetic Then
EgtAlignPartOnCollision(nMoveId, True, bAlignMoved)
If m_dSnapDist > EPS_SMALL Then
EgtRestoreCollInfo()
' !!! Questa funzione usa i tagli, bisogna modificarla per farla funzionare in questo caso !!!
EgtMovePartToSnapPointOnCollision(nMoveId, True, m_dSnapDist, bSnapMoved)
End If
End If
' Standard
Else
EgtMove(nMoveId, vtMove)
End If
VeinMatching.SetProjectModified()
EgtDraw()
End If
' altrimenti rotazione
Else
' Ricavo l'angolo di movimento
Dim vtPrev As Vector3d = m_ptPrev - m_ptCen
Dim vtCurr As Vector3d = ptCurr - m_ptCen
Dim dAngRotDeg As Double = Math.Atan2(Vector3d.CrossXY(vtPrev, vtCurr), Vector3d.ScalarXY(vtPrev, vtCurr)) * 180.0 / Math.PI
If Math.Abs(dAngRotDeg) > EPS_ANG_SMALL Then
' Con verifica di collisione
If m_bCurrVerify Then
EgtRotatePart(nMoveId, True, m_ptCen, dAngRotDeg)
' Standard
Else
EgtRotate(nMoveId, m_ptCen, Vector3d.Z_AX(), dAngRotDeg, GDB_RT.GLOB)
End If
VeinMatching.SetProjectModified()
EgtDraw()
End If
End If
' Aggiorno il punto precedente
m_ptPrev = ptCurr
' Terminata esecuzione di drag
m_bDragging = False
End Sub
Private Sub OnMouseUpScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles VeinMatchingScene.OnMouseUpScene
' Se abilitata modifica
If m_bEnableEdit Then
' Se eseguito drag
If Not m_bDragToStart Then
' Non serve fare alcunché
' Se selezione da eseguire
ElseIf m_nIdToSel <> GDB_ID.NULL Then
' Eseguo la selezione
EgtSelectObj(m_nIdToSel)
' Se deselezione da eseguire
ElseIf m_nIdToDesel <> GDB_ID.NULL Then
EgtDeselectObj(m_nIdToDesel)
End If
' Altrimenti selezione/deselezione anche per nesting
Else
' Se selezione da eseguire
If m_nIdToSel <> GDB_ID.NULL Then
' Eseguo la selezione in Nesting
Dim bSelected As Boolean = False
Dim nOriId As Integer = GDB_ID.NULL
EgtGetInfo(m_nIdToSel, KEY_ORI_ID, nOriId)
If EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) AndAlso EgtExistsObj(nOriId) Then
Dim nMachGrpId As Integer
If (OmagOFFICEMap.refNestingTabVM.SelectPart(nOriId, False, nMachGrpId)) Then
bSelected = True
Else
If nMachGrpId = GDB_ID.NULL Then
' "Attenzione" "Pezzo non selezionabile in questa condizione"
MessageBox.Show(Me, EgtMsg(91606), EgtMsg(91122), MessageBoxButton.OK, MessageBoxImage.Exclamation)
Else
Dim sMachGrpName As String = String.Empty
EgtGetMachGroupName(nMachGrpId, sMachGrpName)
' "Attenzione" "Pezzo non selezionabile perchè appartenente a gruppo di lavoro non corrente :" ...
MessageBox.Show(Me, EgtMsg(91607) & " " & sMachGrpName, EgtMsg(91122), MessageBoxButton.OK, MessageBoxImage.Exclamation)
End If
End If
End If
EgtSetCurrentContext(VeinMatchingScene.GetCtx())
' Se selezione riuscita, la eseguo anche in VME
If bSelected Then EgtSelectObj(m_nIdToSel)
' Se deselezione da eseguire
ElseIf m_nIdToDesel <> GDB_ID.NULL Then
' Eseguo la deselezione in Nesting
Dim bDeselected As Boolean = False
Dim nOriId As Integer = GDB_ID.NULL
EgtGetInfo(m_nIdToDesel, KEY_ORI_ID, nOriId)
If EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) AndAlso EgtExistsObj(nOriId) Then
If (OmagOFFICEMap.refNestingTabVM.DeselectPart(nOriId, False)) Then
bDeselected = True
End If
End If
EgtSetCurrentContext(VeinMatchingScene.GetCtx())
' Se deselezione riuscita, la eseguo anche in VME
If bDeselected Then EgtDeselectObj(m_nIdToDesel)
End If
End If
' Reset
m_bDrag = False
m_nIdToSel = GDB_ID.NULL
m_nIdToDesel = GDB_ID.NULL
EgtDraw()
End Sub
Private Sub ShowTextBtn_Click(sender As Object, e As RoutedEventArgs) Handles ShowTextBtn.Click
VeinMatching.SetShowText(If(ShowTextBtn.IsChecked, False))
End Sub
Private Sub EditBtn_Click(sender As Object, e As RoutedEventArgs) Handles EditBtn.Click
' Impostazione stato di modifica
m_bEnableEdit = If(EditBtn.IsChecked, False)
If Not m_bEnableEdit Then
EgtDeselectAll()
EgtDraw()
End If
VerifyBtn.IsEnabled = m_bEnableEdit
MagneticBtn.IsEnabled = m_bEnableEdit And m_bVerify
End Sub
Private Sub VerifyBtn_Click(sender As Object, e As RoutedEventArgs) Handles VerifyBtn.Click
m_bVerify = If(VerifyBtn.IsChecked, False)
MagneticBtn.IsEnabled = m_bEnableEdit And m_bVerify
End Sub
Private Sub MagneticBtn_Click(sender As Object, e As RoutedEventArgs) Handles MagneticBtn.Click
m_bMagnetic = If(MagneticBtn.IsChecked, False)
End Sub
Private Sub ExportBtn_Click(sender As Object, e As RoutedEventArgs) Handles ExportBtn.Click
Dim SaveFileDialog As New Microsoft.Win32.SaveFileDialog
SaveFileDialog.Title = "Export"
SaveFileDialog.Filter = "Images Png (*.png)|*.png" &
"|Images Jpeg (*.jpg;*.jpeg)|*.jpg;*.jpeg" &
"|Images Bitmap (*.bmp)|*.bmp"
SaveFileDialog.FilterIndex = 2
If Not SaveFileDialog.ShowDialog Then Return
VeinMatching.Export(SaveFileDialog.FileName)
End Sub
Private Sub Scene_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles VeinMatchingScene.KeyDown
' Con DEL eseguo cancellazione dei pezzi selezionati
If e.KeyData = System.Windows.Forms.Keys.Delete Then
' Se non ci sono oggetti selezionati, esco
If Not VeinMatching.SelectedObjects() Then Return
' Sei sicuro di voler cancellare i pezzi selezionati ?
If MessageBox.Show(EgtMsg(MSG_EGTMSGBOX + 21), "", MessageBoxButton.OKCancel, MessageBoxImage.Question) = MessageBoxResult.Cancel Then Return
VeinMatching.RemoveAllSelectedParts()
EgtDraw()
End If
End Sub
End Class
Friend Module VeinMatching
' Contesto del VeinMatching
Friend m_nVeinCtx As Integer = 0
' Nome fotografia
Private m_nPhoto As Integer = 0
' Dimensioni immagine da esportare
Private m_nImgWidth As Integer = 1600
Private m_nImgHeight As Integer = 1200
' Flag visualizzazione testi
Private m_bShowText As Boolean = True
Friend ReadOnly Property bShowText As Boolean
Get
Return m_bShowText
End Get
End Property
' Costanti
Const REF_NAME As String = "Ref"
Const KEY_ORI_REF As String = "OriRef"
Const DIM_REG As Double = 20000
Const WIDTH_ADD_REG As Double = 4000
Friend Function SetExportImageDim(nImgWidth As Integer, nImgHeight As Integer) As Boolean
m_nImgWidth = nImgWidth
m_nImgHeight = nImgHeight
Return True
End Function
Friend Function SetRefOnAllParts() As Boolean
' Si opera nel contesto corrente
Dim nId As Integer = EgtGetFirstPart()
While nId <> GDB_ID.NULL
' Gruppo regione
Dim nRegLayId As Integer = EgtGetFirstNameInGroup(nId, NAME_REGION)
' Entità superficie regione piatta
Dim nRegId As Integer = EgtGetFirstInGroup(nRegLayId)
While nRegId <> GDB_ID.NULL
If EgtGetType(nRegId) = GDB_TY.SRF_FRGN Then
Exit While
End If
nRegId = EgtGetNext(nRegId)
End While
' Ne recupero il centroide
Dim ptCen As Point3d
EgtCentroid(nRegId, GDB_ID.ROOT, ptCen)
' Inserisco il riferimento
Dim frRef As New Frame3d(ptCen)
Dim nRefId As Integer = EgtCreateGeoFrame(nRegLayId, frRef, GDB_RT.GLOB)
EgtSetName(nRefId, REF_NAME)
' salvo nelle info il riferimento originale
EgtSetInfo(nRefId, KEY_ORI_REF, frRef)
' nascondo l'oggetto appena inserito
EgtSetMode(nRefId, GDB_MD.HIDDEN)
' Passo al pezzo successivo
nId = EgtGetNextPart(nId)
End While
Return True
End Function
Friend Function SetRefOnPart(nId As Integer) As Boolean
' Si opera nel contesto corrente
' Verifico validità identificativo oggetto
If nId = GDB_ID.NULL Then Return False
' Recupero gruppo regione
Dim nRegLayId As Integer = EgtGetFirstNameInGroup(nId, NAME_REGION)
' Se c'è già il riferimento, esco
If EgtGetFirstNameInGroup(nRegLayId, REF_NAME) <> GDB_ID.NULL Then Return True
' Entità superficie regione piatta
Dim nRegId As Integer = EgtGetFirstInGroup(nRegLayId)
While nRegId <> GDB_ID.NULL
If EgtGetType(nRegId) = GDB_TY.SRF_FRGN Then
Exit While
End If
nRegId = EgtGetNext(nRegId)
End While
' Ne recupero il centroide
Dim ptCen As Point3d
EgtCentroid(nRegId, GDB_ID.ROOT, ptCen)
' Inserisco il riferimento
Dim frRef As New Frame3d(ptCen)
Dim nRefId As Integer = EgtCreateGeoFrame(nRegLayId, frRef, GDB_RT.GLOB)
EgtSetName(nRefId, REF_NAME)
' salvo nelle info il riferimento originale
EgtSetInfo(nRefId, KEY_ORI_REF, frRef)
' nascondo l'oggetto appena inserito
EgtSetMode(nRefId, GDB_MD.HIDDEN)
Return True
End Function
Friend Function AddPart(nPartId As Integer, Optional bPack As Boolean = False) As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Se esiste già il pezzo nel VM, esco
If GetVeinPartId(nPartId) <> GDB_ID.NULL Then Return True
' Verifico validità pezzo
If nPartId = GDB_ID.NULL Then Return False
' Salvo il pezzo su file temporaneo
Dim sTmpDir As String = String.Empty
If Not EgtGetTempDir(sTmpDir) Then Return False
Dim sTmpFile As String = sTmpDir & "\FlatPartVme.Nge"
EgtSaveObjToFile(nPartId, sTmpFile, NGE.BIN)
ShowParkedParts()
' Carico il file nel VM
Dim bOk As Boolean = My.Computer.FileSystem.FileExists(sTmpFile)
If bOk Then
bOk = AddPart(sTmpFile, nPartId, bPack)
' Ne aggiorno la visualizzazione
ZoomAll()
' Cancello il file
My.Computer.FileSystem.DeleteFile(sTmpFile)
End If
Return bOk
End Function
Friend Function AddPart(sPartFile As String, nPartId As Integer, Optional bPack As Boolean = False) As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Se esiste già il pezzo nel VM, esco
If GetVeinPartId(nPartId) <> GDB_ID.NULL Then Return True
' Imposto VeinMatching context
Dim nMainCtx = SetVeinContext()
If nMainCtx = 0 Then Return False
' Inserisco il pezzo
EgtInsertFile(sPartFile)
' Ne recupero l'Id
Dim nVeinId2 As Integer = EgtGetLastPart()
' Elimino eventuali preview delle lavorazioni
EgtErase(EgtGetFirstNameInGroup(nVeinId2, NAME_PREVIEW))
' Assegno Id originale
EgtSetInfo(nVeinId2, KEY_ORI_ID, nPartId)
' Se impostato, nascondo scritte, sono nel layer "Region"
If Not m_bShowText Then
Dim nVeinRegId As Integer = EgtGetFirstNameInGroup(nVeinId2, NAME_REGION)
Dim nCurrId As Integer = EgtGetFirstInGroup(nVeinRegId)
While nCurrId <> GDB_ID.NULL
If EgtGetType(nCurrId) = GDB_TY.EXT_TEXT Then EgtSetStatus(nCurrId, GDB_ST.OFF)
nCurrId = EgtGetNext(nCurrId)
End While
End If
' Nascondo layer con valori angoli dei lati
Dim nLayAngId As Integer = EgtGetFirstNameInGroup(nVeinId2, SIDE_ANGLE_LAYER)
EgtSetStatus(nLayAngId, GDB_ST.OFF)
' Se richiesto, eseguo pack
If bPack Then
EgtPackBox(nVeinId2, 0, 0, WIDTH_ADD_REG, DIM_REG, 0, True)
End If
' Se necessario, ripristino il contesto originale
If nMainCtx > 0 Then EgtSetCurrentContext(nMainCtx)
Return True
End Function
Friend Function OnInsertPartInRaw(nPartId As Integer, Optional bDeselect As Boolean = True) As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Recupero il contesto corrente (principale)
Dim nMainCtx = EgtGetCurrentContext()
' Se non c'è la fotografia, esco
Dim nPhotoId As Integer = EstPhoto.GetPhoto()
If nPhotoId = GDB_ID.NULL Then Return If(bDeselect, OnDeselectPart(nPartId), True)
' Recupero il nome originale del pezzo
Dim nOriId As Integer = nPartId
EgtGetInfo(nPartId, KEY_ORI_ID, nOriId)
' Recupero la path originale della foto
Dim sPhoto As String = String.Empty
EgtGetPhotoPath(nPhotoId, sPhoto)
' Verifico se esiste già questa foto nel VeinMatching
Dim sVeinPhoto As String = String.Empty
Dim nInd As Integer = 1
While nInd <= m_nPhoto
If GetVeinPhotoPath(nInd, sVeinPhoto) AndAlso
String.Compare(sPhoto, sVeinPhoto, True) = 0 Then
Exit While
End If
nInd += 1
End While
' Se necessario, copio la foto
If nInd > m_nPhoto Then
If Not CopyPhoto(nPhotoId) Then Return False
nInd = m_nPhoto
End If
' Recupero il pezzo nel VeinMatching
EgtSetCurrentContext(m_nVeinCtx)
Dim nId = GetVeinPartId(nOriId)
If nId <> GDB_ID.NULL Then
' Recupero la regione del pezzo
Dim nRegId As Integer = GetVeinPartRegionId(nId)
' Gli assegno la texture della foto
EgtSetTextureName(nRegId, GetVeinPhotoName(nInd))
' Sistemo il riferimento della texture
Dim refTxr As New Frame3d
GetVeinRefPhoto(nMainCtx, nPartId, nId, refTxr)
EgtSetTextureFrame(nRegId, refTxr, GDB_RT.GLOB)
' Sistemo il colore
Dim colWhite As New Color3d(255, 255, 255, 100)
EgtSetColor(nRegId, colWhite)
' Se richiesto, eseguo deselezione
If bDeselect Then EgtDeselectObj(nId)
End If
EgtDraw()
EgtSetCurrentContext(nMainCtx)
Return True
End Function
Friend Function OnMovePartInRaw(nPartId As Integer) As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Recupero il contesto corrente (principale)
Dim nMainCtx = EgtGetCurrentContext()
' Se non c'è la fotografia, esco
Dim nPhotoId As Integer = EstPhoto.GetPhoto()
If nPhotoId = GDB_ID.NULL Then Return True
' Recupero il nome originale del pezzo
Dim nOriId As Integer = nPartId
EgtGetInfo(nPartId, KEY_ORI_ID, nOriId)
' Recupero il pezzo nel VeinMatching
EgtSetCurrentContext(m_nVeinCtx)
Dim nId = GetVeinPartId(nOriId)
If nId <> GDB_ID.NULL Then
' Recupero la regione del pezzo
Dim nRegId As Integer = GetVeinPartRegionId(nId)
' Sistemo il riferimento della texture
Dim refTxr As New Frame3d
GetVeinRefPhoto(nMainCtx, nPartId, nId, refTxr)
EgtSetTextureFrame(nRegId, refTxr, GDB_RT.GLOB)
EgtDraw()
End If
EgtSetCurrentContext(nMainCtx)
Return True
End Function
Friend Function OnRemovePartFromRaw(nPartId As Integer, Optional bDeselect As Boolean = True) As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Recupero il contesto corrente (principale)
Dim nMainCtx = EgtGetCurrentContext()
' Se non c'è la fotografia, esco
Dim nPhotoId As Integer = EstPhoto.GetPhoto()
If nPhotoId = GDB_ID.NULL Then Return If(bDeselect, OnDeselectPart(nPartId), True)
' Recupero il nome originale del pezzo
Dim nOriId As Integer = nPartId
EgtGetInfo(nPartId, KEY_ORI_ID, nOriId)
' Tolgo la texture dal pezzo
EgtSetCurrentContext(m_nVeinCtx)
Dim nId As Integer = GetVeinPartId(nOriId)
If nId <> GDB_ID.NULL Then
' Recupero la regione del pezzo
Dim nRegId As Integer = GetVeinPartRegionId(nId)
' Gli tolgo la texture
EgtRemoveTextureData(nRegId)
' Sistemo il colore
Dim colAqua As New Color3d(0, 255, 255, 25)
EgtSetColor(nRegId, colAqua)
' Se richiesto, eseguo deselezione
If bDeselect Then EgtDeselectObj(nId)
EgtDraw()
End If
EgtSetCurrentContext(nMainCtx)
Return True
End Function
Friend Function OnRemovePart(nPartId As Integer) As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Recupero il contesto corrente (principale)
Dim nMainCtx = EgtGetCurrentContext()
' Recupero il nome originale del pezzo
Dim nOriId As Integer = nPartId
EgtGetInfo(nPartId, KEY_ORI_ID, nOriId)
' Recupero il pezzo nel VeinMatching e lo cancello
EgtSetCurrentContext(m_nVeinCtx)
Dim nId = GetVeinPartId(nOriId)
If nId <> GDB_ID.NULL Then
EgtErase(nId)
EgtDraw()
End If
EgtSetCurrentContext(nMainCtx)
Return True
End Function
Friend Function OnSelectPart(nPartId As Integer) As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Recupero il contesto corrente (principale)
Dim nMainCtx = EgtGetCurrentContext()
' Recupero il nome originale del pezzo
Dim nOriId As Integer = nPartId
EgtGetInfo(nPartId, KEY_ORI_ID, nOriId)
' Recupero il pezzo nel VeinMatching
EgtSetCurrentContext(m_nVeinCtx)
Dim nId = GetVeinPartId(nOriId)
Dim bFound As Boolean = nId <> GDB_ID.NULL
' Lo seleziono
If bFound Then EgtSelectObj(nId)
' Aggiorno visualizzazione e ritorno al contesto originale
EgtDraw()
EgtSetCurrentContext(nMainCtx)
Return bFound
End Function
Friend Function OnDeselectPart(nPartId As Integer) As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Recupero il contesto corrente (principale)
Dim nMainCtx = EgtGetCurrentContext()
' Recupero il nome originale del pezzo
Dim nOriId As Integer = nPartId
EgtGetInfo(nPartId, KEY_ORI_ID, nOriId)
' Recupero il pezzo nel VeinMatching
EgtSetCurrentContext(m_nVeinCtx)
Dim nId = GetVeinPartId(nOriId)
Dim bFound As Boolean = nId <> GDB_ID.NULL
' Lo seleziono
If bFound Then EgtDeselectObj(nId)
' Aggiorno visualizzazione e ritorno al contesto originale
EgtDraw()
EgtSetCurrentContext(nMainCtx)
Return bFound
End Function
Friend Function OnSelectAll() As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Imposto VeinMatching context
Dim nCurrCtx = SetVeinContext()
If nCurrCtx = 0 Then Return False
' Eseguo selezione di tutti i pezzi
EgtSelectAll()
EgtDraw()
' Se necessario, ripristino il contesto originale
If nCurrCtx > 0 Then EgtSetCurrentContext(nCurrCtx)
Return True
End Function
Friend Function OnDeselectAll() As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Imposto VeinMatching context
Dim nCurrCtx = SetVeinContext()
If nCurrCtx = 0 Then Return False
' Eseguo deselezione di tutti i pezzi
EgtDeselectAll()
EgtDraw()
' Se necessario, ripristino il contesto originale
If nCurrCtx > 0 Then EgtSetCurrentContext(nCurrCtx)
Return True
End Function
Friend Function SelectedObjects() As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return False
' Imposto VeinMatching context
Dim nCurrCtx = SetVeinContext()
If nCurrCtx = 0 Then Return False
Dim bFound As Boolean = (EgtGetFirstSelectedObj() <> GDB_ID.NULL)
' Se necessario, ripristino il contesto originale
If nCurrCtx > 0 Then EgtSetCurrentContext(nCurrCtx)
Return bFound
End Function
Friend Function RemoveAllSelectedParts() As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Imposto VeinMatching context
Dim nCurrCtx = SetVeinContext()
If nCurrCtx = 0 Then Return False
' Eseguo la cancellazione di tutti i pezzi selezionati
Dim nId As Integer = EgtGetFirstSelectedObj()
While nId <> GDB_ID.NULL
Dim nNextId As Integer = EgtGetNextSelectedObj()
EgtErase(nId)
nId = nNextId
End While
' Se necessario, ripristino il contesto originale
If nCurrCtx > 0 Then EgtSetCurrentContext(nCurrCtx)
Return True
End Function
Friend Function ZoomAll() As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Imposto VeinMatching context
Dim nCurrCtx = SetVeinContext()
If nCurrCtx = 0 Then Return False
' Eseguo Zoom
EgtZoom(ZM.ALL)
' Se necessario, ripristino il contesto originale
If nCurrCtx > 0 Then EgtSetCurrentContext(nCurrCtx)
Return True
End Function
Friend Function Clear() As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Imposto VeinMatching context
Dim nCurrCtx = SetVeinContext()
If nCurrCtx = 0 Then Return False
' Pulisco il DB
EgtNewFile()
EgtDraw()
' Reset contatore foto
m_nPhoto = 0
' creo regione valida per i pezzi
EgtCreateOutRegionRectangle(GDB_ID.ROOT, -DIM_REG, -DIM_REG, DIM_REG, DIM_REG, 0)
' Se necessario, ripristino il contesto originale
If nCurrCtx > 0 Then EgtSetCurrentContext(nCurrCtx)
Return True
End Function
Friend Function Open(sFilePath As String) As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Recupero il contesto corrente (principale)
Dim nMainCtx = EgtGetCurrentContext()
' Apro il file
EgtSetCurrentContext(m_nVeinCtx)
Dim bOk As Boolean = EgtOpenFile(sFilePath)
' Aggiorno contatore foto
Dim nPhId As Integer = EgtGetFirstInGroup(EgtGetFirstNameInGroup(GDB_ID.ROOT, PHOTO_GRP))
While nPhId <> GDB_ID.NULL
Dim sName As String = String.Empty
EgtGetName(nPhId, sName)
Dim nVal As Integer = 0
If StringToInt(sName.Replace(PHOTO_NAME, ""), nVal) Then m_nPhoto = Math.Max(m_nPhoto, nVal)
nPhId = EgtGetNext(nPhId)
End While
' Se non presente, aggiungo regione valida per i pezzi
EgtCreateOutRegionRectangle(GDB_ID.ROOT, -DIM_REG, -DIM_REG, DIM_REG, DIM_REG, 0)
' Aggiorno visualizzazione testi
UpdateShowText()
' Eseguo zoom all
EgtZoom(ZM.ALL)
' Ripristino il contesto originale
EgtSetCurrentContext(nMainCtx)
Return bOk
End Function
Friend Function Save(sFilePath As String) As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Recupero il contesto corrente (principale)
Dim nMainCtx As Integer = EgtGetCurrentContext()
' Elimino foto inutilizzate
RemoveUnusedPhotos()
' Salvo il file
EgtSetCurrentContext(m_nVeinCtx)
Dim bOk As Boolean = EgtSaveFile(sFilePath, NGE.CMPTEXT)
' Ripristino il contesto originale
EgtSetCurrentContext(nMainCtx)
Return bOk
End Function
Friend Function Export(sFilePath As String) As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return True
' Recupero il contesto corrente (principale)
Dim nMainCtx = EgtGetCurrentContext()
' Esporto il file come immagine
EgtSetCurrentContext(m_nVeinCtx)
Dim bOk As Boolean = (EgtGetFileType(sFilePath) = FT.IMG)
bOk = bOk AndAlso EgtGetImage(EgtGetShowMode(), New Color3d(255, 255, 255), New Color3d(255, 255, 255),
m_nImgWidth, m_nImgHeight, sFilePath)
' Ripristino il contesto originale
EgtSetCurrentContext(nMainCtx)
Return bOk
End Function
Friend Function ChangePhotoPath(sOldPath As String, sNewPath As String) As Boolean
' Cerco nel VeinMatching una foto con la path originale
Dim sVeinPhoto As String = String.Empty
Dim nInd As Integer = 1
While nInd <= m_nPhoto
If GetVeinPhotoPath(nInd, sVeinPhoto) AndAlso
String.Compare(sOldPath, sVeinPhoto, True) = 0 Then
Exit While
End If
nInd += 1
End While
' Se trovata, cambio il path
If nInd <= m_nPhoto Then
' Imposto VeinMatching context
Dim nCurrCtx = SetVeinContext()
If nCurrCtx = 0 Then Return False
' Eseguo
Dim nPhotoId As Integer = GetVeinPhotoId(nInd)
EgtChangePhotoPath(nPhotoId, sNewPath)
' Se necessario, ripristino il contesto originale
If nCurrCtx > 0 Then EgtSetCurrentContext(nCurrCtx)
End If
Return False
End Function
Friend Function RemoveUnusedPhotos() As Boolean
' Recupero il contesto corrente
Dim nMainCtx As Integer = EgtGetCurrentContext()
' Riempio array con path delle foto caricate
Dim vsPath As New List(Of String)
Dim nPhId As Integer = EgtGetFirstInGroup(EgtGetFirstNameInGroup(GDB_ID.ROOT, PHOTO_GRP))
While nPhId <> GDB_ID.NULL
Dim sPath As String = String.Empty
If EgtGetPhotoPath(nPhId, sPath) Then
vsPath.Add(sPath)
End If
nPhId = EgtGetNext(nPhId)
End While
' Passo al contesto del VeinMatching
EgtSetCurrentContext(m_nVeinCtx)
' Elimino foto di VeinMatching in eccesso
Dim nVmPhId As Integer = EgtGetFirstInGroup(EgtGetFirstNameInGroup(GDB_ID.ROOT, PHOTO_GRP))
While nVmPhId <> GDB_ID.NULL
Dim sPath As String = String.Empty
Dim bErase As Boolean = Not EgtGetPhotoPath(nVmPhId, sPath)
If Not bErase Then
Dim bFound As Boolean = False
For Each sVal As String In vsPath
If String.Compare(sVal, sPath, True) = 0 Then
bFound = True
Exit For
End If
Next
bErase = Not bFound
End If
If bErase Then
Dim nEraseId As Integer = nVmPhId
nVmPhId = EgtGetNext(nVmPhId)
EgtErase(nEraseId)
Else
nVmPhId = EgtGetNext(nVmPhId)
End If
End While
' Ritorno al contesto corrente
EgtSetCurrentContext(nMainCtx)
Return True
End Function
Friend Function SetShowText(bShow As Boolean) As Boolean
If bShow <> m_bShowText Then
m_bShowText = bShow
UpdateShowText()
End If
Return True
End Function
Friend Function IsPartIn(nPartId As Integer) As Boolean
Return (GetVeinPartId(nPartId) <> GDB_ID.NULL)
End Function
Friend Sub UpdateShowText()
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return
' Recupero il contesto corrente (principale)
Dim nMainCtx As Integer = EgtGetCurrentContext()
' Ciclo sui pezzi
EgtSetCurrentContext(m_nVeinCtx)
Dim nPartId As Integer = EgtGetFirstPart()
While nPartId <> GDB_ID.NULL
Dim nVeinRegId As Integer = EgtGetFirstNameInGroup(nPartId, NAME_REGION)
Dim nCurrId As Integer = EgtGetFirstInGroup(nVeinRegId)
While nCurrId <> GDB_ID.NULL
If EgtGetType(nCurrId) = GDB_TY.EXT_TEXT Then EgtSetStatus(nCurrId, If(m_bShowText, GDB_ST.ON_, GDB_ST.OFF))
nCurrId = EgtGetNext(nCurrId)
End While
nPartId = EgtGetNextPart(nPartId)
End While
EgtDraw()
' Ripristino il contesto originale
EgtSetCurrentContext(nMainCtx)
End Sub
Friend Sub SetProjectModified()
' Salvo il contesto corrente
Dim nCurrCtx As Integer = EgtGetCurrentContext()
' Recupero il contesto principale
EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx())
' Imposto flag di modificato sul progetto principale
EgtSetModified()
' Ripristino il contesto originale
EgtSetCurrentContext(nCurrCtx)
End Sub
Private Function CopyPhoto(nPhotoId As Integer) As Boolean
' Recupero il contesto corrente
Dim nCurrCtx = EgtGetCurrentContext()
' Recupero i dati della fotografia
Dim sPath As String = String.Empty
If Not EgtGetPhotoPath(nPhotoId, sPath) OrElse Not File.Exists(sPath) Then Return False
Dim ptOri As Point3d
If Not EgtGetPhotoOrigin(nPhotoId, ptOri) Then Return False
Dim ptCen As Point3d
If Not EgtGetPhotoCenter(nPhotoId, ptCen) Then Return False
Dim dDimX, dDimY As Double
If Not EgtGetPhotoDimensions(nPhotoId, dDimX, dDimY) Then Return False
Dim ptMin, ptMax As Point3d
If Not EgtGetBBoxGlob(nPhotoId, GDB_BB.STANDARD, ptMin, ptMax) Then Return False
' Passo al contesto del VeinMatching
EgtSetCurrentContext(m_nVeinCtx)
' Se non esiste il gruppo per le foto, lo creo
Dim nPhGrpId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, PHOTO_GRP)
If nPhGrpId = GDB_ID.NULL Then
nPhGrpId = EgtCreateGroup(GDB_ID.ROOT)
If nPhGrpId = GDB_ID.NULL Then
EgtSetCurrentContext(nCurrCtx)
Return False
End If
EgtSetName(nPhGrpId, PHOTO_GRP)
End If
EgtSetLevel(nPhGrpId, GDB_LV.SYSTEM)
EgtSetStatus(nPhGrpId, GDB_ST.OFF)
' Carico la fotografia
m_nPhoto += 1
Dim nNewId As Integer = EgtAddPhoto2(GetVeinPhotoName(m_nPhoto), sPath, ptOri, ptCen, dDimX, dDimY, nPhGrpId, ptMin, ptMax)
' Ritorno al contesto corrente
EgtSetCurrentContext(nCurrCtx)
Return nNewId <> GDB_ID.NULL
End Function
Private Function SetVeinContext() As Integer
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 Then Return 0
' Recupero il contesto corrente
Dim nCurrCtx = EgtGetCurrentContext()
' Se necessario, cambio contesto
If m_nVeinCtx <> nCurrCtx Then
If EgtSetCurrentContext(m_nVeinCtx) Then
Return nCurrCtx
Else
Return 0
End If
Else
Return -1
End If
End Function
Private Function GetVeinPhotoName(nInd As Integer) As String
Return PHOTO_NAME & nInd.ToString()
End Function
Private Function GetVeinPhotoId(nInd As Integer) As Integer
Return EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(GDB_ID.ROOT, PHOTO_GRP), GetVeinPhotoName(nInd))
End Function
Private Function GetVeinPhotoPath(nInd As Integer, ByRef sPath As String) As Boolean
' Imposto VeinMatching context
Dim nCurrCtx = SetVeinContext()
If nCurrCtx = 0 Then Return False
' Recupero path dell'immagine della foto
Dim nId As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(GDB_ID.ROOT, PHOTO_GRP), GetVeinPhotoName(nInd))
Dim bOk As Boolean = EgtGetPhotoPath(nId, sPath)
' Se necessario, ripristino il contesto originale
If nCurrCtx > 0 Then EgtSetCurrentContext(nCurrCtx)
Return bOk
End Function
Private Function GetVeinRefPhoto(nMainCtx As Integer, nPartId As Integer, nVePartId As Integer, ByRef refPhoto As Frame3d) As Boolean
' Riferimento della foto rispetto al riferimento del pezzo nel contesto principale
If Not EgtSetCurrentContext(nMainCtx) Then Return False
' riferimento della foto in globale
If Not EstPhoto.GetPhotoTextureRef(refPhoto) Then
EgtSetCurrentContext(m_nVeinCtx)
Return False
End If
' riferimento del pezzo in globale
Dim nRefId As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nPartId, NAME_REGION), REF_NAME)
Dim refPart As New Frame3d
If Not EgtFrame(nRefId, GDB_ID.ROOT, refPart) Then
EgtSetCurrentContext(m_nVeinCtx)
Return False
End If
' porto il riferimento della foto in quello del pezzo
refPhoto.ToLoc(refPart)
' Riferimento della foto rispetto al riferimento del pezzo in VeinMatching
If Not EgtSetCurrentContext(m_nVeinCtx) Then Return False
' riferimento del pezzo in globale
Dim nVeRefId As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nVePartId, NAME_REGION), REF_NAME)
Dim refVePart As New Frame3d
If Not EgtFrame(nVeRefId, GDB_ID.ROOT, refVePart) Then Return False
refPhoto.ToGlob(refVePart)
Return True
End Function
Private Function GetVeinPartId(nPartId As Integer) As Integer
' Imposto VeinMatching context
Dim nCurrCtx = SetVeinContext()
If nCurrCtx = 0 Then Return GDB_ID.NULL
' Cerco il pezzo in Vein che corrisponde al pezzo desiderato
Dim nId As Integer = EgtGetFirstPart()
While nId <> GDB_ID.NULL
Dim nOriId As Integer
If EgtGetInfo(nId, KEY_ORI_ID, nOriId) AndAlso nOriId = nPartId Then
Exit While
End If
nId = EgtGetNextPart(nId)
End While
' Se necessario, ripristino il contesto originale
If nCurrCtx > 0 Then EgtSetCurrentContext(nCurrCtx)
Return nId
End Function
Private Function GetVeinPartRegionId(nVeinPartId As Integer) As Integer
' Imposto VeinMatching context
Dim nCurrCtx = SetVeinContext()
If nCurrCtx = 0 Then Return GDB_ID.NULL
' Gruppo regione
Dim nRegLayId As Integer = EgtGetFirstNameInGroup(nVeinPartId, NAME_REGION)
' Entità superficie regione piatta
Dim nRegId As Integer = EgtGetFirstInGroup(nRegLayId)
While nRegId <> GDB_ID.NULL
If EgtGetType(nRegId) = GDB_TY.SRF_FRGN Then
Exit While
End If
nRegId = EgtGetNext(nRegId)
End While
' Se necessario, ripristino il contesto originale
If nCurrCtx > 0 Then EgtSetCurrentContext(nCurrCtx)
Return nRegId
End Function
End Module