'---------------------------------------------------------------------------- ' EgalTech 2015-2015 '---------------------------------------------------------------------------- ' File : Component.vb Data : 09.07.15 Versione : 1.6g3 ' Contenuto : Classe Component (dialogo esecuzione componente parametrico). ' ' ' ' Modifiche : 08.07.15 DS Creazione modulo. ' ' '---------------------------------------------------------------------------- Imports System.Globalization Imports TestEIn.EgtInterface Public Class Component ' Constants Private Const NUM_VAR As Integer = 10 Private Const LUA_CMP_VARS As String = "CMP" Private Const LUA_CMP_DRAW As String = "CMP_Draw" ' Properties Private m_sCompoDir As String = String.Empty Private m_sCompoName As String = String.Empty Private m_CVars(NUM_VAR - 1) As CompoVar Private Sub Component_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load ' imposto colore di default Dim DefColor As New Color3d(0, 0, 0) GetPrivateProfileColor(S_GEOMDB, K_DEFAULTCOLOR, DefColor, Form1.GetIniFile()) Scene2.SetDefaultMaterial(DefColor) ' imposto colori sfondo Dim BackTopColor As New Color3d(192, 192, 192) GetPrivateProfileColor(S_SCENE, K_BACKTOP, BackTopColor, Form1.GetIniFile()) Dim BackBotColor As New Color3d(BackTopColor) GetPrivateProfileColor(S_SCENE, K_BACKBOTTOM, BackBotColor, Form1.GetIniFile()) Scene2.SetViewBackground(BackTopColor, BackBotColor) ' imposto colore di evidenziazione Dim MarkColor As New Color3d(255, 255, 0) GetPrivateProfileColor(S_SCENE, K_MARK, MarkColor, Form1.GetIniFile()) Scene2.SetMarkMaterial(MarkColor) ' imposto colore per superfici selezionate Dim SelSurfColor As New Color3d(255, 255, 192) GetPrivateProfileColor(S_SCENE, K_SELSURF, SelSurfColor, Form1.GetIniFile()) Scene2.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, Form1.GetIniFile()) Scene2.SetZoomWinAttribs(bOutline, ZwColor) ' imposto colore della linea di distanza Dim DstLnColor As New Color3d(255, 0, 0) GetPrivateProfileColor(S_SCENE, K_DISTLINE, DstLnColor, Form1.GetIniFile()) Scene2.SetDistLineMaterial(DstLnColor) ' imposto parametri OpenGL Dim nDriver As Integer = GetPrivateProfileInt(S_OPENGL, K_DRIVER, 3, Form1.GetIniFile()) Dim b2Buff As Boolean = (GetPrivateProfileInt(S_OPENGL, K_DOUBLEBUFFER, 1, Form1.GetIniFile()) <> 0) Dim nColorBits As Integer = GetPrivateProfileInt(S_OPENGL, K_COLORBITS, 32, Form1.GetIniFile()) Dim nDepthBits As Integer = GetPrivateProfileInt(S_OPENGL, K_DEPTHBITS, 32, Form1.GetIniFile()) Scene2.SetViewAttributes(nDriver, b2Buff, nColorBits, nDepthBits) ' inizializzo la scena (DB geometrico + visualizzazione) Scene2.Init() ' assegno posizione e dimensioni finestra Dim nFlag As Integer Dim nLeft As Integer Dim nTop As Integer Dim nWidth As Integer Dim nHeight As Integer GetPrivateProfileWinPos(S_COMPO, K_CMPWINPLACE, nFlag, nLeft, nTop, nWidth, nHeight, Form1.GetIniFile()) Me.StartPosition = System.Windows.Forms.FormStartPosition.Manual Me.Location = New Point(nLeft, nTop) Me.Size = New Size(nWidth, nHeight) WindowState = If(nFlag = 1, FormWindowState.Maximized, FormWindowState.Normal) ' leggo direttorio componenti GetPrivateProfileString(S_COMPO, K_COMPODIR, "", m_sCompoDir, Form1.GetIniFile()) ' recupero i file lua del direttorio e li inserisco nella lista dei componenti Dim DirInfo As New IO.DirectoryInfo(m_sCompoDir) Dim vFi As IO.FileInfo() = DirInfo.GetFiles("*.lua") Dim Fi As IO.FileInfo For Each Fi In vFi ListBox1.Items.Add(IO.Path.GetFileNameWithoutExtension(Fi.Name)) Next ' imposto selezione sul primo ListBox1.SelectedIndex = 0 LoadCurrentCompo() End Sub Private Sub Component_FormClosing(sender As System.Object, e As FormClosingEventArgs) Handles MyBase.FormClosing ' Salvo posizione finestra Dim nFlag As Integer = If(Me.WindowState = FormWindowState.Maximized, 1, 0) WritePrivateProfileWinPos(S_COMPO, K_CMPWINPLACE, nFlag, Me.Left, Me.Top, Me.Width, Me.Height, Form1.GetIniFile()) ' Pulisco l'ambiente lua EgtLuaResetGlobVar(LUA_CMP_VARS) EgtLuaResetGlobVar(LUA_CMP_DRAW) ' Termino la scena (DB geometrico + visualizzazione) Scene2.Terminate() End Sub Private Sub Component_KeyDown(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles Me.KeyDown If e.KeyData = Keys.Escape Then Me.DialogResult = System.Windows.Forms.DialogResult.Cancel Me.Close() End If End Sub Private Sub ListBox1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.Click LoadCurrentCompo() End Sub Private Sub LoadCurrentCompo() ' Recupero item selezionato Dim sCompo As String = ListBox1.SelectedItem.ToString() ' verifico se cambiato If sCompo = m_sCompoName Then Return End If m_sCompoName = sCompo 'Pulisco l'ambiente lua EgtLuaResetGlobVar(LUA_CMP_VARS) EgtLuaResetGlobVar(LUA_CMP_DRAW) ' Costruisco path completa del componente Dim sPath = m_sCompoDir & "\" & m_sCompoName & ".lua" ' Lo eseguo If Not EgtLuaExecFile(sPath) Then EgtNewFile() tbMsg.Text = "Error in component execution" Else tbMsg.Text = "" End If Scene2.ZoomAll() ' recupero nome, tipo e valore delle variabili globali For i As Integer = 1 To NUM_VAR Dim CVar = New CompoVar If CVar.NameTypeValueFromLua(i) Then m_CVars(i - 1) = CVar Else m_CVars(i - 1) = Nothing End If Next ' aggiorno la griglia For i As Integer = 1 To NUM_VAR If m_CVars(i - 1) IsNot Nothing Then GetNameEdit(i).Text = m_CVars(i - 1).m_sName GetNameEdit(i).Show() GetValueEdit(i).Text = m_CVars(i - 1).ToString() GetValueEdit(i).Show() Else GetNameEdit(i).Hide() GetValueEdit(i).Hide() End If Next ' abilito bottoni Vista e Inserisci btnView.Enabled = True btnInsert.Enabled = True End Sub Private Sub btnView_Click(sender As Object, e As EventArgs) Handles btnView.Click ' aggiorno le variabili For i As Integer = 1 To NUM_VAR If m_CVars(i - 1) IsNot Nothing Then ' interpreto il valore, se non riesco ripristino default If Not m_CVars(i - 1).FromString(GetValueEdit(i).Text) Then GetValueEdit(i).Text = m_CVars(i - 1).ToString() End If ' aggiorno la corrispondente variabile lua If Not m_CVars(i - 1).ToLua(i) Then Dim sErr As String = String.Empty EgtLuaGetLastError(sErr) EgtOutLog(sErr) End If End If Next ' ricalcolo il disegno If Not EgtLuaExecLine(LUA_CMP_DRAW & "(true)") Then tbMsg.Text = "Error in component execution" Else Dim nErr As Integer = 0 EgtLuaGetGlobIntVar(LUA_CMP_VARS & ".ERR", nErr) If nErr <> 0 Then Dim sMsg As String = String.Empty EgtLuaGetGlobStringVar(LUA_CMP_VARS & ".MSG", sMsg) tbMsg.Text = sMsg Else tbMsg.Text = "" End If End If EgtZoom(ZM.ALL) End Sub Private Sub btnInsert_Click(sender As Object, e As EventArgs) Handles btnInsert.Click ' Lancio View per aggiornare il disegno btnView_Click(sender, e) ' Inserisco il componente nel DB geometrico principale EgtSetCurrentContext(Form1.GetCtx()) If Not EgtLuaExecLine(LUA_CMP_DRAW & "(false)") Then Dim sErr As String = String.Empty EgtLuaGetLastError(sErr) EgtOutLog(sErr) End If Form1.LoadObjTree() EgtZoom(ZM.ALL) EgtSetCurrentContext(Scene2.GetCtx()) End Sub Private Function GetNameEdit(ByVal nInd As Integer) As TextBox Select Case nInd Case 1 Return tbName1 Case 2 Return tbName2 Case 3 Return tbName3 Case 4 Return tbName4 Case 5 Return tbName5 Case 6 Return tbName6 Case 7 Return tbName7 Case 8 Return tbName8 Case 9 Return tbName9 Case Else Return tbName10 End Select End Function Private Function GetValueEdit(ByVal nInd As Integer) As TextBox Select Case nInd Case 1 Return tbValue1 Case 2 Return tbValue2 Case 3 Return tbValue3 Case 4 Return tbValue4 Case 5 Return tbValue5 Case 6 Return tbValue6 Case 7 Return tbValue7 Case 8 Return tbValue8 Case 9 Return tbValue9 Case Else Return tbValue10 End Select End Function Private Class CompoVar ' Public Members Public m_sName As String Public m_nType As Integer Public m_bVal As Boolean Public m_nVal As Integer Public m_dVal As Double Public m_sVal As String ' Constants Const LUA_NAME As String = LUA_CMP_VARS & ".N" Const LUA_TYPE As String = LUA_CMP_VARS & ".T" Const LUA_VALUE As String = LUA_CMP_VARS & ".V" Public Sub New() m_nType = 0 End Sub Public Overrides Function ToString() As String Select Case m_nType Case 1 Return m_bVal.ToString() Case 2 Return m_nVal.ToString() Case 3 Return m_dVal.ToString(CultureInfo.InvariantCulture) Case 4 Return m_sVal End Select Return "" End Function Public Function FromString(ByVal sVal As String) As Boolean Select Case m_nType Case 1 Dim bVal As Boolean = False If Boolean.TryParse(sVal, bVal) Then m_bVal = bVal Return True End If Case 2 Dim dVal As Double If EgtLuaEvalNumExpr(sVal, dVal) Then m_nVal = CInt(dVal) Return True End If Case 3 Dim dVal As Double If EgtLuaEvalNumExpr(sVal, dVal) Then m_dVal = dVal Return True End If Case 4 m_sVal = sVal Return True End Select Return False End Function Public Function ToLua(ByVal nInd As Integer) As Boolean Select Case m_nType Case 1 Return EgtLuaSetGlobBoolVar(LUA_VALUE & nInd.ToString(), m_bVal) Case 2 Return EgtLuaSetGlobIntVar(LUA_VALUE & nInd.ToString(), m_nVal) Case 3 Return EgtLuaSetGlobNumVar(LUA_VALUE & nInd.ToString(), m_dVal) Case 4 Return EgtLuaSetGlobStringVar(LUA_VALUE & nInd.ToString(), m_sVal) End Select Return False End Function Public Function NameTypeValueFromLua(ByVal nInd As Integer) As Boolean Dim bOk As Boolean = True bOk = bOk AndAlso EgtLuaGetGlobStringVar(LUA_NAME & nInd.ToString(), m_sName) bOk = bOk AndAlso EgtLuaGetGlobIntVar(LUA_TYPE & nInd.ToString(), m_nType) Select Case m_nType Case 1 Return bOk AndAlso EgtLuaGetGlobBoolVar(LUA_VALUE & nInd.ToString(), m_bVal) Case 2 Return bOk AndAlso EgtLuaGetGlobIntVar(LUA_VALUE & nInd.ToString(), m_nVal) Case 3 Return bOk AndAlso EgtLuaGetGlobNumVar(LUA_VALUE & nInd.ToString(), m_dVal) Case 4 Return bOk AndAlso EgtLuaGetGlobStringVar(LUA_VALUE & nInd.ToString(), m_sVal) End Select Return False End Function End Class End Class