Files
OmagCUT/VeinMatchingWindow.xaml.vb
T
Dario Sassi 73d60f3f66 OmagCUT 1.8h2 :
- aggiunta rotazione in registrazione 
- correzioni per gestione immagini.
2017-08-07 18:34:14 +00:00

537 lines
22 KiB
VB.net

Imports System.IO
Imports System.Windows.Interop
Imports System.Runtime.InteropServices
Imports EgtUILib
Public Class VeinMatchingWindow
' Riferimento alla MainWindow
Private m_MainWindow As MainWindow = DirectCast(Application.Current.MainWindow, MainWindow)
Private m_bFirst As Boolean = True
Private m_bPositioned As Boolean = False
' Dichiarazione Scene
Friend WithEvents VeinMatchingScene As New Scene
Private VeinMatchingSceneHost As New System.Windows.Forms.Integration.WindowsFormsHost
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
NewBtn.Content = EgtMsg(MSG_CADCUTPAGEUC + 3)
LoadBtn.Content = EgtMsg(MSG_CADCUTPAGEUC + 4)
SaveBtn.Content = EgtMsg(MSG_CADCUTPAGEUC + 5)
ExportBtn.Content = EgtMsg(MSG_CADCUTPAGEUC + 10)
' Disabilitazione provvisoria
LoadBtn.IsEnabled = False
SaveBtn.IsEnabled = False
ExportBtn.IsEnabled = False
End Sub
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
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)
GetPrivateProfileColor(S_GEOMDB, K_DEFAULTCOLOR, DefColor, m_MainWindow.GetIniFile())
VeinMatchingScene.SetDefaultMaterial(DefColor)
' imposto colori sfondo
Dim BackTopColor As New Color3d(211, 211, 211)
GetPrivateProfileColor(S_SCENE, K_BACKTOP, BackTopColor, m_MainWindow.GetIniFile())
Dim BackBotColor As New Color3d(211, 211, 211)
GetPrivateProfileColor(S_SCENE, K_BACKBOTTOM, BackBotColor, m_MainWindow.GetIniFile())
VeinMatchingScene.SetViewBackground(BackTopColor, BackBotColor)
' imposto colore di evidenziazione
Dim MarkColor As New Color3d(255, 255, 0)
GetPrivateProfileColor(S_SCENE, K_MARK, MarkColor, m_MainWindow.GetIniFile())
VeinMatchingScene.SetMarkMaterial(MarkColor)
' imposto colore per superfici selezionate
Dim SelSurfColor As New Color3d(255, 255, 192)
GetPrivateProfileColor(S_SCENE, K_SELSURF, SelSurfColor, m_MainWindow.GetIniFile())
VeinMatchingScene.SetSelSurfMaterial(SelSurfColor)
' imposto tipo e colore del rettangolo di zoom
Dim bOutline As Boolean = True
Dim ZwColor As New Color3d(0, 0, 0)
GetPrivateProfileZoomWin(S_SCENE, K_ZOOMWIN, bOutline, ZwColor, m_MainWindow.GetIniFile())
VeinMatchingScene.SetZoomWinAttribs(bOutline, ZwColor)
' imposto colore della linea di distanza
Dim DstLnColor As New Color3d(255, 0, 0)
GetPrivateProfileColor(S_SCENE, K_DISTLINE, DstLnColor, m_MainWindow.GetIniFile())
VeinMatchingScene.SetDistLineMaterial(DstLnColor)
' imposto parametri OpenGL
Dim nDriver As Integer = GetPrivateProfileInt(S_OPENGL, K_DRIVER, 3, m_MainWindow.GetIniFile())
Dim b2Buff As Boolean = (GetPrivateProfileInt(S_OPENGL, K_DOUBLEBUFFER, 1, m_MainWindow.GetIniFile()) <> 0)
Dim nColorBits As Integer = GetPrivateProfileInt(S_OPENGL, K_COLORBITS, 32, m_MainWindow.GetIniFile())
Dim nDepthBits As Integer = GetPrivateProfileInt(S_OPENGL, K_DEPTHBITS, 32, m_MainWindow.GetIniFile())
VeinMatchingScene.SetViewAttributes(nDriver, b2Buff, nColorBits, nDepthBits)
' inizializzo la scena (DB geometrico + visualizzazione) e verifico presenza chiave
If Not VeinMatchingScene.Init() Then
m_MainWindow.m_CadCutPageUC.m_ProjectMgr.VeinMatchingBtn.IsChecked = False
Me.Close()
End If
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)
WritePrivateProfileWinPos(S_VEINMATCHING, K_VEINMA_PLACE, nFlag, CInt(Me.Left), CInt(Me.Top), CInt(Me.Width), CInt(Me.Height), m_MainWindow.GetIniFile())
End If
End Sub
Friend Sub AdjustPosition()
' Se già pozizionata, esco subito
If m_bPositioned Then Return
' Imposto posizione e dimensioni della MainWindow da INI
Dim nFlag, nLeft, nTop, nWidth, nHeight As Integer
If GetPrivateProfileWinPos(S_VEINMATCHING, K_VEINMA_PLACE, nFlag, nLeft, nTop, nWidth, nHeight, m_MainWindow.GetIniFile()) 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
Return
End If
End If
' Imposto in posizione standard
Me.WindowStartupLocation = Windows.WindowStartupLocation.Manual
Me.Top = m_MainWindow.Top
Me.Left = m_MainWindow.Left
Me.Height = nHeight
Me.Width = nWidth
Me.WindowState = If(nFlag = 1, WindowState.Maximized, WindowState.Normal)
m_bPositioned = True
End Sub
Private Sub NewBtn_Click(sender As Object, e As RoutedEventArgs) Handles NewBtn.Click
VeinMatching.Clear()
End Sub
End Class
Friend Module VeinMatching
' Riferimento alla MainWindow
Private m_MainWindow As MainWindow = DirectCast(Application.Current.MainWindow, MainWindow)
' Contesto del VeinMatching
Friend m_nVeinCtx As Integer = 0
' Nome fotografia
Private m_nPhoto As Integer = 0
' Costanti
Const REF_NAME As String = "Ref"
Const KEY_ORI_REF As String = "OriRef"
Friend Function SetRefOnAllParts(nCtx As Integer) As Boolean
' Si opera nel contesto indicato
EgtSetCurrentContext(nCtx)
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 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
' Se necessario, ripristino il contesto originale
If nCurrCtx > 0 Then EgtSetCurrentContext(nCurrCtx)
Return True
End Function
Friend Function AddPart(sPartFile As String, nPartId As Integer) As Boolean
' Verifico esista il contesto del VeinMatching
If m_nVeinCtx = 0 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()
' Assegno Id originale
EgtSetInfo(nVeinId2, KEY_ORI_ID, nPartId)
' Nascondo scritte, sono nel layer "Region"
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
' Nascondo layer con valori angoli dei lati
nCurrId = EgtGetFirstNameInGroup(nVeinId2, SIDE_ANGLE_LAYER)
EgtSetStatus(nCurrId, GDB_ST.OFF)
' 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 = m_MainWindow.m_CurrentProjectPageUC.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)
' Verifico se esiste già la foto del progetto corrente nel VeinMatching
Dim sPhoto As String = String.Empty
EgtGetPhotoPath(nPhotoId, sPhoto)
Dim sVeinPhoto As String = String.Empty
GetVeinPhotoPath(sVeinPhoto)
' Se necessario, copio la foto
If String.Compare(sPhoto, sVeinPhoto, True) <> 0 Then
If Not CopyPhoto(nPhotoId) Then Return False
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, GetPhotoName())
' 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 = m_MainWindow.m_CurrentProjectPageUC.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)
End If
EgtDraw()
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 = m_MainWindow.m_CurrentProjectPageUC.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)
End If
EgtDraw()
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 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
Private Function GetPhotoName() As String
Return PHOTO_NAME & m_nPhoto.ToString()
End Function
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(GetPhotoName(), 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 GetVeinPhoto() As Integer
' Imposto VeinMatching context
Dim nCurrCtx = SetVeinContext()
If nCurrCtx = 0 Then Return GDB_ID.NULL
' Recupero Id foto
Dim nId As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(GDB_ID.ROOT, PHOTO_GRP), GetPhotoName())
' Se necessario, ripristino il contesto originale
If nCurrCtx > 0 Then EgtSetCurrentContext(nCurrCtx)
Return nId
End Function
Private Function GetVeinPhotoPath(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), GetPhotoName())
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 m_MainWindow.m_CurrentProjectPageUC.GetPhotoTextureRef(refPhoto) Then Return False
' 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 Return False
' 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