Imports System.Windows.Forms.Integration Imports System.Collections.ObjectModel Imports System.Reflection Imports System.IO Imports EgtUILib Imports EgtWPFLib5 Public Class ToolDbWindowVM Inherits VMBase Private Const SETUP_FILEEXTENSION As String = ".stu" Friend Shared m_bActive As Boolean = False Friend Shared m_ProjectSceneContext As Integer = 0 Public Shared ReadOnly Property ProjectSceneContext As Integer Get Return m_ProjectSceneContext End Get End Property Friend Shared m_ToolDbSceneContext As Integer = 0 Friend Shared m_sToolMakersDirPath As String = String.Empty Friend Shared m_sMachineIniPath As String = String.Empty Friend Shared m_sScriptDirPath As String = String.Empty Friend Shared m_sToolDirPath As String = String.Empty Friend Shared m_MatType As MaterialType = Nothing Friend Shared m_bVisibleSysNotes As Boolean = False Public Property MatType As MaterialType Get Return m_MatType End Get Set(value As MaterialType) m_MatType = value End Set End Property Private m_Title As String Public ReadOnly Property Title As String Get Return EgtMsg(MSG_MAINWINDOW + 3) End Get End Property ' Lista degli utensili Private m_ToolsList As New ObservableCollection(Of FamilyToolTreeViewItem) Public Property ToolsList As ObservableCollection(Of FamilyToolTreeViewItem) Get Return m_ToolsList End Get Set(value As ObservableCollection(Of FamilyToolTreeViewItem)) m_ToolsList = value End Set End Property Public ReadOnly Property SelFamily As FamilyToolTreeViewItem Get Return m_ToolsList.FirstOrDefault(Function(x) x.IsSelected) End Get End Property Public ReadOnly Property SelTool As ToolTreeViewItem Get For each Family In m_ToolsList Dim Tool As InheritableTreeViewItem = Family.Items.FirstOrDefault(Function(x) x.IsSelected) If Not IsNothing(Tool) Then Return directcast(Tool, ToolTreeViewItem) End If Next Return Nothing End Get End Property Private m_IsEnabledNewBtn As Boolean Public ReadOnly Property IsEnabledNewBtn As Boolean Get Return m_IsEnabledNewBtn End Get End Property Private m_IsEnabledSaveBtn As Boolean Public ReadOnly Property IsEnabledSaveBtn As Boolean Get Return m_IsEnabledSaveBtn End Get End Property Private m_IsEnabledRemoveBtn As Boolean Public ReadOnly Property IsEnabledRemoveBtn As Boolean Get Return m_IsEnabledRemoveBtn End Get End Property Public ReadOnly Property IsEnabledImpExpBtn As Boolean Get Return IsNothing( SelTool) OrElse SelTool.IsValid() End Get End Property Dim StoneDrillToolParamPageV As StoneDrillParamPageV Dim WoodDrillToolParamPageV As WoodDrillParamPageV Dim StoneSawToolParamPageV As StoneSawParamPageV Dim WoodSawToolParamPageV As WoodSawParamPageV Dim StoneMillToolParamPageV As StoneMillParamPageV Dim WoodMillToolParamPageV As WoodMillParamPageV Dim BeamMillToolParamPageV As BeamMillParamPageV Dim ChiselToolParamPageV As ChiselParamPageV Dim MortiseToolParamPageV As MortiseParamPageV Dim WaterjetToolParamPageV As WaterjetParamPageV Public ReadOnly Property ParamPageV As ContentControl Get Dim selToolFamily As FamilyToolTreeViewItem = Nothing Dim selTool As ToolTreeViewItem = Nothing Dim selToolFamilyType As Integer = 0 For Each ToolFamily In ToolsList For Each Tool In ToolFamily.Items If Tool.IsSelected Then selTool = DirectCast(Tool, ToolTreeViewItem) Exit For End If Next If Not IsNothing(selTool) Then selToolFamilyType = ToolFamily.ToolType Exit For End If Next ' disattivo disegno utensile ToolTreeViewItem.SuspendToolDrawUpdate = True StoneDrillToolParamPageV.DataContext = Nothing WoodDrillToolParamPageV.DataContext = Nothing StoneSawToolParamPageV.DataContext = Nothing WoodSawToolParamPageV.DataContext = Nothing StoneMillToolParamPageV.DataContext = Nothing WoodMillToolParamPageV.DataContext = Nothing BeamMillToolParamPageV.DataContext = Nothing MortiseToolParamPageV.DataContext = Nothing ChiselToolParamPageV.DataContext = Nothing WaterjetToolParamPageV.DataContext = Nothing Select Case selToolFamilyType Case MCH_TF.DRILLBIT If m_MatType = MaterialType.STONE Then StoneDrillToolParamPageV.DataContext = selTool Return StoneDrillToolParamPageV ElseIf m_MatType = MaterialType.WOOD Or m_MatType = MaterialType.BEAM Then WoodDrillToolParamPageV.DataContext = selTool Return WoodDrillToolParamPageV End If Case MCH_TF.SAWBLADE If m_MatType = MaterialType.STONE Then StoneSawToolParamPageV.DataContext = selTool Return StoneSawToolParamPageV ElseIf m_MatType = MaterialType.WOOD Or m_MatType = MaterialType.BEAM Then WoodSawToolParamPageV.DataContext = selTool Return WoodSawToolParamPageV End If Case MCH_TF.MILL If m_MatType = MaterialType.STONE Then StoneMillToolParamPageV.DataContext = selTool Return StoneMillToolParamPageV ElseIf m_MatType = MaterialType.WOOD Then WoodMillToolParamPageV.DataContext = selTool Return WoodMillToolParamPageV ElseIf m_MatType = MaterialType.BEAM Then BeamMillToolParamPageV.DataContext = selTool Return BeamMillToolParamPageV End If Case MCH_TF.MORTISE MortiseToolParamPageV.DataContext = selTool Return MortiseToolParamPageV Case MCH_TF.CHISEL ChiselToolParamPageV.DataContext = selTool Return ChiselToolParamPageV Case MCH_TF.WATERJET WaterjetToolParamPageV.DataContext = selTool Return WaterjetToolParamPageV End Select ' riattivo disegno utensile ToolTreeViewItem.SuspendToolDrawUpdate = False Return Nothing End Get End Property 'PROJECT PAGE'S SCENE FIELDS AND PROPERTIES ' Reference to the ProjectScene Private WithEvents m_ToolScene As New Scene ' Reference to the ProjectSceneHost Private SceneHost As WindowsFormsHost ' Property used to bind the scene to the WindowsFormsHost in XAML Private m_bfirst As Boolean = True Public ReadOnly Property ToolSceneHost As WindowsFormsHost Get If m_bfirst Then SceneHost = New WindowsFormsHost() With {.Child = m_ToolScene} If Not m_ToolScene.Init() Then EgtOutLog("Error in Tool scene creation") 'Application.Msn.NotifyColleagues(Application.CLOSEAPPLICATION) End If m_ToolDbSceneContext = m_ToolScene.GetCtx() ' inibisco selezione diretta da Scene m_ToolScene.SetStatusNull() 'OnPropertyChanged("SelectedMachine") m_bfirst = False End If Return SceneHost End Get End Property ' visibilità parametro Active Private m_Active_Visibility As Boolean Public ReadOnly Property Active_Visibility As Visibility Get Return If(m_Active_Visibility, Visibility.Visible, Visibility.Collapsed) End Get End Property Public Overridable Sub OnCursorPos(ByVal sender As Object, ByVal sCursorPos As String) Handles m_ToolScene.OnCursorPos LibMap.refStatusBarVM.SetCurrPos(sCursorPos) End Sub ' Definizione comandi Private m_cmdNew As ICommand Private m_cmdSave As ICommand Private m_cmdRemove As ICommand Private m_cmdImport As ICommand Private m_cmdExport As ICommand Private m_cmdReloadTool As ICommand Private m_cmdCloseToolsDb As ICommand #Region "MESSAGES" 'Definizione dei messaggi della pagina Public ReadOnly Property NewMsg As String Get Return EgtMsg(31701) End Get End Property Public ReadOnly Property SaveMsg As String Get Return EgtMsg(31702) End Get End Property Public ReadOnly Property RemoveMsg As String Get Return EgtMsg(31703) End Get End Property Public ReadOnly Property ImportMsg As String Get Return EgtMsg(31161) End Get End Property Public ReadOnly Property ExportMsg As String Get Return EgtMsg(31162) End Get End Property Public ReadOnly Property ResetMsg As String Get Return EgtMsg(31167) End Get End Property Public ReadOnly Property CorrTxBl As String Get Return EgtMsg(MSG_TOOLDB + 51) End Get End Property Public ReadOnly Property ExitParTxBl As String Get Return EgtMsg(MSG_TOOLDB + 52) End Get End Property Public ReadOnly Property TypeTxBl As String Get Return EgtMsg(MSG_TOOLDB + 53) End Get End Property Public ReadOnly Property CoolantTxBl As String Get Return EgtMsg(MSG_TOOLDB + 54) End Get End Property Public ReadOnly Property CornRadTxBl As String Get Return EgtMsg(MSG_TOOLDB + 55) End Get End Property Public ReadOnly Property DiamTxBl As String Get Return EgtMsg(MSG_TOOLDB + 56) End Get End Property Public ReadOnly Property TotDiamTxBl As String Get Return EgtMsg(MSG_TOOLDB + 57) End Get End Property Public ReadOnly Property FeedTxBl As String Get Return EgtMsg(MSG_TOOLDB + 58) End Get End Property Public ReadOnly Property EndFeedTxBl As String Get Return EgtMsg(MSG_TOOLDB + 59) End Get End Property Public ReadOnly Property StartFeedTxBl As String Get Return EgtMsg(MSG_TOOLDB + 60) End Get End Property Public ReadOnly Property LenTxBl As String Get Return EgtMsg(MSG_TOOLDB + 62) End Get End Property Public ReadOnly Property TotLenTxBl As String Get Return EgtMsg(MSG_TOOLDB + 63) End Get End Property Public ReadOnly Property MaxMatTxBl As String Get Return EgtMsg(MSG_TOOLDB + 64) End Get End Property Public ReadOnly Property LonOffsetTxBl As String Get Return EgtMsg(MSG_TOOLDB + 65) End Get End Property Public ReadOnly Property RadOffsetTxBl As String Get Return EgtMsg(MSG_TOOLDB + 66) End Get End Property Public ReadOnly Property SpeedTxBl As String Get Return EgtMsg(MSG_TOOLDB + 67) End Get End Property Public ReadOnly Property SideAngTxBl As String Get Return EgtMsg(MSG_TOOLDB + 68) End Get End Property Public ReadOnly Property MaxSpeedTxBl As String Get Return EgtMsg(MSG_TOOLDB + 69) End Get End Property Public ReadOnly Property ThickTxBl As String Get Return EgtMsg(MSG_TOOLDB + 70) End Get End Property Public ReadOnly Property MaxAbsorptionTxBl As String Get Return EgtMsg(MSG_TOOLDB + 71) End Get End Property Public ReadOnly Property MinFeedTxBl As String Get Return EgtMsg(MSG_TOOLDB + 72) End Get End Property Public ReadOnly Property DrawTxBl As String Get Return EgtMsg(MSG_TOOLDB + 73) End Get End Property Public ReadOnly Property HeadTxBl As String Get Return EgtMsg(MSG_TOOLDB + 74) End Get End Property Public ReadOnly Property NameParTxBl As String Get Return EgtMsg(MSG_TOOLDB + 75) End Get End Property Public ReadOnly Property UserNotesTxBl As String Get Return EgtMsg(MSG_TOOLDB + 76) End Get End Property Public ReadOnly Property TcPosTxBl As String Get Return EgtMsg(MSG_TOOLDB + 77) End Get End Property #End Region #Region "CONSTRUCTOR" Sub New(sMachineDirPath As String, sMachineIniPath As String, ProjectSceneContext As Integer, Optional sMatType As String = "Wood", Optional bVisibleSysNotes As Boolean = False) m_bActive = True m_ProjectSceneContext = ProjectSceneContext m_sMachineIniPath = sMachineIniPath m_sScriptDirPath = sMachineDirPath & "\Scripts" m_sToolDirPath = sMachineDirPath & "\Tools" ' leggo direttorio toolmakers GetMainPrivateProfileString(S_MACH, K_TOOLMAKERSDIR, "", m_sToolMakersDirPath) m_bVisibleSysNotes = bVisibleSysNotes EgtUILib.GetPrivateProfileString(S_GENERAL, K_MATERIAL, sMatType, sMatType, sMachineIniPath) Select Case sMatType Case "Stone" m_MatType = MaterialType.STONE Case "Wood" m_MatType = MaterialType.WOOD Case "Beam" m_MatType = MaterialType.BEAM Case "Additive" m_MatType = MaterialType.WOOD Case Else ' Se il materiale spcificato nel file INI della macchina non corrisponde ai 3 sopracitati viene emesso un messaggio di errore m_MatType = Nothing MsgBox(EgtMsg(31409), MsgBoxStyle.Exclamation, EgtMsg(31551)) Exit Sub End Select ' Passo all'item della lista il delegato alla funzione che permette di cancellare una lavorazione ToolTreeViewItem.m_delRemoveTool = AddressOf RemoveTool ' Passo all'item della lista il delegato alla funzione che permette di disattivare la lista delle lavorazioni ToolTreeViewItem.m_delErrorOnTool = AddressOf ErrorOnTool FamilyToolTreeViewItem.m_delErrorOnTool = AddressOf ErrorOnTool ' Passo all'item della lista il delegato alla funzione che permette di disattivare la lista delle lavorazioni ToolTreeViewItem.m_delIsEnabledBtns = AddressOf IsEnabledBtns FamilyToolTreeViewItem.m_delIsEnabledBtns = AddressOf IsEnabledBtns ToolTreeViewItem.m_delNotifyPropertyChanged = AddressOf ccc FamilyToolTreeViewItem.m_delNotifyPropertyChanged = AddressOf ccc ' Passo all'item della lista il delegato alla funzione che restituisce l'utensile selezionato ToolTreeViewItem.m_delGetSelectedTool = AddressOf GetSelectedTool LoadSelectedMachineTools() ' carico Lua che contiene le funzioni di attrezzaggio EgtSetCurrentContext(ToolDbWindowVM.m_ProjectSceneContext) Dim bScriptFileExec As Boolean = EgtLuaExecFile(m_sScriptDirPath & "\SetUp.lua") ' carico lista teste ToolTreeViewItem.m_OrigHeadList.Clear() Dim sHeads As String = String.Empty EgtSetCurrentContext(ToolDbWindowVM.m_ProjectSceneContext) If EgtGetAllHeadsNames(sHeads) Then Dim sHeadList() As String = sHeads.Split(","c) For HeadIndex = 0 To sHeadList.Count - 1 If bScriptFileExec Then ' Verifico che la testa sia valida EgtLuaSetGlobStringVar("STU.HEAD", sHeadList(HeadIndex)) If EgtLuaExistsFunction("STU.IsValidHead") AndAlso EgtLuaCallFunction("STU.IsValidHead") Then ' Leggo variabili Dim IsValidHead As Boolean = False EgtLuaGetGlobBoolVar("STU.ISVALID", IsValidHead) If Not IsValidHead Then Continue For End If End If ' Cerco messaggio per questa testa Dim sHText As String = String.Empty EgtUILib.GetPrivateProfileString(S_HEADS, sHeadList(HeadIndex), "", sHText, m_sMachineIniPath) Dim sHTextMsg As String = String.Empty If IsNumeric(sHText) Then sHTextMsg = EgtMsg(CInt(sHText)) If sHTextMsg = ("Msg" & CInt(sHText)) Then sHTextMsg = sHText End If Else sHTextMsg = sHText End If sHTextMsg &= " (" & sHeadList(HeadIndex) & ")" ToolTreeViewItem.m_OrigHeadList.Add(New HeadItem(sHeadList(HeadIndex), sHTextMsg)) Next Else MessageBox.Show("Impossible loading Head list from machine!", "Error", MessageBoxButton.OK, MessageBoxImage.Error) EgtOutLog("Error: Impossible loading Head list from machine!") End If ToolTreeViewItem.m_OrigTcPosList.Clear() If bScriptFileExec Then ' creo lista di tutti i TcPos Dim nPosIndex As Integer = 1 Dim sTcPos As String = String.Empty Dim nErr As Integer = 0 While nErr = 0 EgtLuaSetGlobIntVar("STU.INDEX", nPosIndex) If Not EgtLuaCallFunction("STU.GetTcPosFromPos") Then Exit While ' Leggo variabili EgtLuaGetGlobStringVar("STU.TCPOS", sTcPos) If Not EgtLuaGetGlobIntVar("STU.ERR", nErr) Then nErr = 999 If nErr = 0 Then ToolTreeViewItem.m_OrigTcPosList.Add(sTcPos) End If nPosIndex += 1 End While End If If Not bScriptFileExec Then MessageBox.Show(EgtMsg(MSG_TOOLDBERRORS + 25), EgtMsg(MSG_TOOLDBERRORS + 26), MessageBoxButton.OK, MessageBoxImage.Error) EgtOutLog("Error: SetUp configuration file not found!") End If ' leggo da ini se parametro Active è attivo m_Active_Visibility = (EgtUILib.GetPrivateProfileInt(S_TOOLS, K_ACTIVE, 0, m_sMachineIniPath) <> 0) StoneDrillToolParamPageV = New StoneDrillParamPageV WoodDrillToolParamPageV = New WoodDrillParamPageV StoneSawToolParamPageV = New StoneSawParamPageV WoodSawToolParamPageV = New WoodSawParamPageV StoneMillToolParamPageV = New StoneMillParamPageV WoodMillToolParamPageV = New WoodMillParamPageV BeamMillToolParamPageV = New BeamMillParamPageV MortiseToolParamPageV = New MortiseParamPageV ChiselToolParamPageV = New ChiselParamPageV WaterjetToolParamPageV = New WaterjetParamPageV NotifyPropertyChanged("ParamPageV") End Sub #End Region ' Constructor #Region "METHODS" Private Sub ccc() NotifyPropertyChanged("ParamPageV") End Sub Private Sub IsEnabledBtns(bIsEnabledNewBtn As Boolean, bIsEnabledSaveBtn As Boolean, bIsEnabledDeleteBtn As Boolean) m_IsEnabledNewBtn = bIsEnabledNewBtn m_IsEnabledSaveBtn = bIsEnabledSaveBtn m_IsEnabledRemoveBtn = bIsEnabledDeleteBtn NotifyPropertyChanged("IsEnabledNewBtn") NotifyPropertyChanged("IsEnabledSaveBtn") NotifyPropertyChanged("IsEnabledRemoveBtn") NotifyPropertyChanged("IsEnabledImpExpBtn") End Sub ' Quando chiamato, disattiva tutti gli item dell'albero o li riattiva a seconda che ci sia o meno un errore Private Sub ErrorOnTool(bIsEnabled As Boolean) For Each FamilyToolItem In ToolsList FamilyToolItem.IsEnabled = Not bIsEnabled Next End Sub ''' ''' Method that search tools for the currently selected Machine and add it to the ToolsList. ''' Private Sub LoadSelectedMachineTools() ' Creo la lista degli utensili (leggo tutti gli utensili) Dim ActiveToolsFamilies() As ToolsFamily = MachineUtility.ReadToolFamilies(m_sMachineIniPath) For Each ToolsFamily In ActiveToolsFamilies Dim FamilyTreeView As New FamilyToolTreeViewItem(ToolsFamily.Name, ToolsFamily.Id) ToolsList.Add(FamilyTreeView) Dim nType As Integer = 0 Dim ToolName As String = String.Empty EgtSetCurrentContext(ToolDbWindowVM.m_ProjectSceneContext) ' distinguo il tipo di fresa If ToolsFamily.Id = MCH_TF.MILL And MatType = MaterialType.STONE Then If ToolsFamily.Name = EgtMsg(90754) Then ' MOLA SCASSO nType = 0 If EgtTdbGetFirstTool(ToolsFamily.Id, ToolName, nType) Then If nType = MCH_TY.MILL_NOTIP Then FamilyTreeView.Items.Add(New ToolTreeViewItem(ToolName)) End If While EgtTdbGetNextTool(ToolsFamily.Id, ToolName, nType) If nType = MCH_TY.MILL_NOTIP Then FamilyTreeView.Items.Add(New ToolTreeViewItem(ToolName)) End If End While End If ElseIf ToolsFamily.Name = EgtMsg(90756) Then ' MOLA LUCIDANTE nType = 0 If EgtTdbGetFirstTool(ToolsFamily.Id, ToolName, nType) Then If nType = MCH_TY.MILL_POLISHING Then FamilyTreeView.Items.Add(New ToolTreeViewItem(ToolName)) End If While EgtTdbGetNextTool(ToolsFamily.Id, ToolName, nType) If nType = MCH_TY.MILL_POLISHING Then FamilyTreeView.Items.Add(New ToolTreeViewItem(ToolName)) End If End While End If Else nType = 0 If EgtTdbGetFirstTool(ToolsFamily.Id, ToolName, nType) Then If nType = MCH_TY.MILL_STD Then FamilyTreeView.Items.Add(New ToolTreeViewItem(ToolName)) End If While EgtTdbGetNextTool(ToolsFamily.Id, ToolName, nType) If nType = MCH_TY.MILL_STD Then FamilyTreeView.Items.Add(New ToolTreeViewItem(ToolName)) End If End While End If End If ' riparto con il ciclo for Continue For End If If EgtTdbGetFirstTool(ToolsFamily.Id, ToolName, nType) Then FamilyTreeView.Items.Add(New ToolTreeViewItem(ToolName)) While EgtTdbGetNextTool(ToolsFamily.Id, ToolName, nType) FamilyTreeView.Items.Add(New ToolTreeViewItem(ToolName)) End While End If Next ' Se esiste almeno una famiglia di utensili, la seleziono If ToolsList.Count > 0 Then ToolsList(0).IsSelected = True ToolsList(0).NotifyPropertyChanged("IsSelected") End If End Sub Private Function GetSelectedTool() As ToolTreeViewItem For Each ToolFamily In m_ToolsList For Each Tool In ToolFamily.Items If Tool.m_IsSelected Then Return DirectCast(Tool, ToolTreeViewItem) End If Next Next Return Nothing End Function ' Funzione che aggiorna setup default con tool che hanno parametro Active ' (deve essere sovrascitta se il programma prevede l'uso del parametro Active) Public Overridable Function UpdateDefSetup() As Boolean Return True End Function ' Funzione che verifica modifica utensile selezionato ed eventualmente chiede se salvarlo Public Function VerifySelectedToolModification() As Boolean ' Se non c'è utensile selezionato, esco con continuazione If IsNothing( SelTool) Then Return True ' Se utensile selezionato non valido, esco con blocco If Not SelTool.IsValid() Then Return False ' Verifico salvataggio SelTool.WriteToolParam() If EgtTdbIsCurrToolModified() Or SelTool.m_IsModifiedName Or SelTool.NewTool Then Select Case MsgBox(EgtMsg(MSG_TOOLDBERRORS), MsgBoxStyle.YesNoCancel, EgtMsg(MSG_TOOLDBERRORS + 1)) Case MsgBoxResult.Yes SelTool.NewTool = False SelTool.m_Name = SelTool.m_Name.Trim() SelTool.WriteToolName() EgtTdbSaveCurrTool() Case MsgBoxResult.No If SelTool.NewTool Then RemoveTool(SelTool) ElseIf SelTool.m_IsModifiedName Then Dim DbName As String = String.Empty EgtTdbGetCurrToolParam(MCH_TP.NAME, DbName) SelTool.NamePar = DbName End If Case MsgBoxResult.Cancel Return False End Select End If Return True End Function ''' ''' Method that search imported tools for the currently selected Machine and add it to the ToolsList. ''' Private Sub LoadImportedMachineTools(vsImportedTools As String()) ' Leggo tutti gli utensili presenti nella Macchina (quindi anche quelli appena importati). Dim ActiveToolsFamilies() As ToolsFamily = MachineUtility.ReadToolFamilies(m_sMachineIniPath) Dim ToolsFamilyIndex As Integer = 0 For Each ToolsFamily In ActiveToolsFamilies Dim FamilyTreeView As New FamilyToolTreeViewItem(ToolsFamily.Name, ToolsFamily.Id) Dim ToolFamilyItem = ToolsList.FirstOrDefault(Function(ToolFamily) ToolFamily.ToolType = FamilyTreeView.ToolType) If IsNothing(ToolFamilyItem) Then ToolsList.Insert(ToolsFamilyIndex, FamilyTreeView) End If Dim nType As Integer = 0 Dim ToolName As String = String.Empty Dim ToolIndex As Integer = 0 EgtSetCurrentContext(ToolDbWindowVM.m_ProjectSceneContext) If EgtTdbGetFirstTool(ToolsFamily.Id, ToolName, nType) Then Dim ToolItem = ToolsList(ToolsFamilyIndex).Items.FirstOrDefault(Function(Tool) Tool.Name = ToolName) If IsNothing(ToolItem) Then ' Se leggo un utensile non presente nella ToolsList visualizzata lo aggiungo ad essa. ToolsList(ToolsFamilyIndex).Items.Insert(ToolIndex, New ToolTreeViewItem(ToolName)) ElseIf vsImportedTools.Contains(ToolName) Then ' Se un utensile è presente nella ToolsList visualizzata ma nel contempo è nell'array vsImported ' vuol dire che è stato sovrascritto perciò lo rimuovo e lo riaggiungo alla ToolsList. ToolsList(ToolsFamilyIndex).Items.Remove(ToolsList(ToolsFamilyIndex).Items.FirstOrDefault(Function(Tool) Tool.Name = ToolName)) ToolsList(ToolsFamilyIndex).Items.Insert(ToolIndex, New ToolTreeViewItem(ToolName)) End If ToolIndex += 1 While EgtTdbGetNextTool(ToolsFamily.Id, ToolName, nType) ToolItem = ToolsList(ToolsFamilyIndex).Items.FirstOrDefault(Function(Tool) Tool.Name = ToolName) If IsNothing(ToolItem) Then ' Se leggo un utensile non presente nella ToolsList visualizzata lo aggiungo ad essa. ToolsList(ToolsFamilyIndex).Items.Insert(ToolIndex, New ToolTreeViewItem(ToolName)) ElseIf vsImportedTools.Contains(ToolName) Then ' Se un utensile è presente nella ToolsList visualizzata ma nel contempo è nell'array vsImported ' vuol dire che è stato sovrascritto perciò lo rimuovo e lo riaggiungo alla ToolsList. ToolsList(ToolsFamilyIndex).Items.Remove(ToolsList(ToolsFamilyIndex).Items.FirstOrDefault(Function(Tool) Tool.Name = ToolName)) ToolsList(ToolsFamilyIndex).Items.Insert(ToolIndex, New ToolTreeViewItem(ToolName)) End If ToolIndex += 1 End While End If ToolsFamilyIndex += 1 Next End Sub #End Region ' Methods #Region "COMMANDS" #Region "NewCommand" ''' ''' Returns a command that create a new tool. ''' Public ReadOnly Property NewCommand As ICommand Get If m_cmdNew Is Nothing Then m_cmdNew = New Command(AddressOf NewPar) End If Return m_cmdNew End Get End Property ''' ''' Creata the new tool. This method is invoked by the NewCommand. ''' Public Overridable Sub NewPar(ByVal param As Object) EgtSetCurrentContext(ToolDbWindowVM.m_ProjectSceneContext) ' Verifico se sia selezionata una famiglia Dim NewToolItem As ToolTreeViewItem If TypeOf param Is FamilyToolTreeViewItem Then Dim ToolFamily As FamilyToolTreeViewItem = DirectCast(param, FamilyToolTreeViewItem) Dim NewName As String = ToolFamily.Name EgtTdbGetToolNewName(NewName) If EgtTdbAddTool(NewName, ToolFamily.ToolType) Then NewToolItem = New ToolTreeViewItem(NewName) ToolFamily.Items.Add(NewToolItem) EgtTdbSaveCurrTool() NewToolItem.NewTool = True ' Determino il tipo di utensile Dim nType As Integer EgtTdbGetCurrToolParam(MCH_TP.TYPE, nType) Dim bSaw As Boolean = ((nType And MCH_TF.SAWBLADE) <> 0) ' Imposto testa e uscita ' Sempre lame su H1.1 e altri utensili su H1.2 EgtTdbSetCurrToolParam(MCH_TP.HEAD, "H1") EgtTdbSetCurrToolParam(MCH_TP.EXIT_, If(bSaw, 1, 2)) ' Per macchine senza ToolChanger, resetto la posizione su questo If CurrentMachine.ShowToolChanger = 0 Then EgtTdbSetCurrToolParam(MCH_TP.TCPOS, "") End If ' Imposto dimensioni standard If (nType And MCH_TF.DRILLBIT) <> 0 Then EgtTdbSetCurrToolParam(MCH_TP.LEN, 80.0) EgtTdbSetCurrToolParam(MCH_TP.TOTLEN, 80.0) EgtTdbSetCurrToolParam(MCH_TP.DIAM, 20.0) EgtTdbSetCurrToolParam(MCH_TP.TOTDIAM, 20.0) EgtTdbSetCurrToolParam(MCH_TP.MAXMAT, 40.0) ElseIf (nType And MCH_TF.SAWBLADE) <> 0 Then EgtTdbSetCurrToolParam(MCH_TP.LEN, 80.0) EgtTdbSetCurrToolParam(MCH_TP.TOTLEN, 80.0) EgtTdbSetCurrToolParam(MCH_TP.DIAM, 600.0) EgtTdbSetCurrToolParam(MCH_TP.TOTDIAM, 600.0) EgtTdbSetCurrToolParam(MCH_TP.THICK, 5.0) EgtTdbSetCurrToolParam(MCH_TP.MAXMAT, 40.0) ElseIf (nType And MCH_TF.MILL) <> 0 Then EgtTdbSetCurrToolParam(MCH_TP.LEN, 80.0) EgtTdbSetCurrToolParam(MCH_TP.TOTLEN, 80.0) EgtTdbSetCurrToolParam(MCH_TP.DIAM, 20.0) EgtTdbSetCurrToolParam(MCH_TP.TOTDIAM, 20.0) EgtTdbSetCurrToolParam(MCH_TP.MAXMAT, 40.0) End If ' Salvo e aggiorno interfaccia utente EgtTdbSaveCurrTool() ' Seleziono il nuovo utensile If Not ToolFamily.IsExpanded Then ToolFamily.IsExpanded = True NewToolItem.IsSelected = True NewToolItem.NotifyPropertyChanged("IsSelected") End If ' Verifico se sia selezionato un utensile ElseIf TypeOf param Is ToolTreeViewItem Then Dim ToolCopied As ToolTreeViewItem = DirectCast(param, ToolTreeViewItem) Dim NewName As String = ToolCopied.Name EgtTdbGetToolNewName(NewName) If EgtTdbCopyTool(ToolCopied.Name, NewName) Then ' Elimino disegno che non deve essere copiato EgtTdbSetCurrToolParam(MCH_TP.DRAW, String.Empty) Dim CurrType As Integer EgtTdbGetCurrToolParam(MCH_TP.TYPE, CurrType) For Each ToolFamily In ToolsList If (ToolFamily.ToolType And CurrType) <> 0 Then NewToolItem = New ToolTreeViewItem(NewName) ToolFamily.Items.Add(NewToolItem) EgtTdbSaveCurrTool() NewToolItem.NewTool = True ' Reimposto l'utensile vecchio nel Db per deselezionarlo e fare le verifiche correttamente EgtTdbSetCurrTool(ToolCopied.Name) ToolCopied.IsSelected = False ToolCopied.NotifyPropertyChanged("IsSelected") NewToolItem.IsSelected = True Exit For End If Next End If End If End Sub #End Region ' NewCommand #Region "SaveCommand" ''' ''' Returns a command that save the current selected tool. ''' Public ReadOnly Property SaveCommand() As ICommand Get If m_cmdSave Is Nothing Then m_cmdSave = New Command(AddressOf Save) End If Return m_cmdSave End Get End Property ''' ''' Saves the current tool. This method is invoked by the SaveCommand. ''' Public Sub Save(ByVal param As Object) Dim CurrTool As ToolTreeViewItem = DirectCast(param, ToolTreeViewItem) CurrTool.WriteToolParam() CurrTool.m_Name = CurrTool.m_Name.Trim() CurrTool.WriteToolName() EgtTdbSaveCurrTool() ' La funzione di salvataggio utensile forza lo stato di modificato allo stesso per poi salvare il disegno e il DB CurrTool.NewTool = False CurrTool.IsModifiedReset() IsEnabledBtns(CurrTool.IsValid And Not CurrTool.IsModified, CurrTool.IsValid, True) End Sub #End Region ' SaveCommand #Region "RemoveCommand" ''' ''' Returns a command that remove the current selected tool. ''' Public ReadOnly Property RemoveCommand() As ICommand Get If m_cmdRemove Is Nothing Then m_cmdRemove = New Command(AddressOf Remove) End If Return m_cmdRemove End Get End Property ''' ''' Remove the current selected tools from Db and TreeView. This method is invoked by the RemoveCommand. ''' Public Sub Remove(ByVal param As Object) EgtSetCurrentContext(ToolDbWindowVM.m_ProjectSceneContext) Dim ToolToRemove As ToolTreeViewItem = DirectCast(param, ToolTreeViewItem) ' Verifico se questo utensile viene utilizzato da qualche lavorazione Dim UsingMachining As New List(Of String) Dim ActiveMachiningsTypes() As MachiningsType = MachineUtility.ReadMachiningFamilies(m_sMachineIniPath) For Each MachiningsType In ActiveMachiningsTypes Dim MachiningName As String = String.Empty EgtMdbGetFirstMachining(MachiningsType.Id, MachiningName) While Not String.IsNullOrWhiteSpace(MachiningName) ' recupero tuuid EgtMdbSetCurrMachining(MachiningName) Dim sCurrMachTUUID As String = String.Empty EgtMdbGetCurrMachiningParam(MCH_MP.TUUID, sCurrMachTUUID) If sCurrMachTUUID = ToolToRemove.Uuid Then UsingMachining.Add(MachiningName) End If EgtMdbGetNextMachining(MachiningsType.Id, MachiningName) End While Next Dim MessageBoxText As String = EgtMsg(MSG_TOOLDBERRORS + 22) & " " & ToolToRemove.Name & EgtMsg(MSG_TOOLDBERRORS + 23) If UsingMachining.Count > 0 Then MessageBoxText &= "This is the list of Machining that use this tool:" & Environment.NewLine For MachiningIndex = 0 To UsingMachining.Count - 1 MessageBoxText &= "- " & UsingMachining(MachiningIndex) & Environment.NewLine Next End If ' Chiedo conferma cancellazione lavorazione If MessageBox.Show(MessageBoxText, EgtMsg(MSG_TOOLDBERRORS + 24), MessageBoxButton.YesNo, MessageBoxImage.Question) <> MessageBoxResult.Yes Then Return End If RemoveTool(ToolToRemove) End Sub Private Sub RemoveTool(ToolToRemove As ToolTreeViewItem) EgtSetCurrentContext(ToolDbWindowVM.m_ProjectSceneContext) ' Salvo il tipo di utensile per poterlo cancellare Dim ToolType As Integer = ToolToRemove.Type ' Cancello l'utensile Dim CurrToolOriginalName As String = String.Empty EgtTdbGetToolFromUUID(ToolToRemove.Uuid, CurrToolOriginalName) EgtTdbRemoveTool(CurrToolOriginalName) ' Rimuovo il nome dell'albero For Each ToolFamily In ToolsList If (ToolFamily.ToolType And ToolType) <> 0 Then ToolFamily.Items.Remove(ToolToRemove) End If Next ErrorOnTool(False) End Sub #End Region ' RemoveCommand #Region "ImportCommand" ''' ''' Returns a command that remove the current selected machining. ''' Public ReadOnly Property ImportCommand() As ICommand Get If m_cmdImport Is Nothing Then m_cmdImport = New Command(AddressOf ImportTool) End If Return m_cmdImport End Get End Property ''' ''' Manage the MachiningDb closing. This method is invoked by the CloseMachiningDbCommand. ''' Public Sub ImportTool(param As Object) EgtSetCurrentContext(ToolDbWindowVM.m_ProjectSceneContext) ' Se c'è utensile selezionato, ne verifico salvataggio If Not VerifySelectedToolModification() Then Return ' apro dialogo di scelta file Dim ImportFileDlg As New Microsoft.Win32.OpenFileDialog() With { .Title = EgtMsg(31161) & " " & EgtMsg(31163), .DefaultExt = ".data", .Filter = "Tools (.data)|*.data", .CheckFileExists = True, .ValidateNames = True } If ImportFileDlg.ShowDialog() <> True Then Return Dim ImportFilePath As String = ImportFileDlg.FileName ' recupero liste utensili da importare Dim ImportFileToolNameList As String() Dim ImportFileToolFamilyList As Integer() EgtTdbToBeImported(ImportFilePath, ImportFileToolNameList, ImportFileToolFamilyList) ' li inserisco in lista per finestra di scelta Dim ToolToImportList As New ObservableCollection(Of ImpExpToolFamily) ' creo famiglie di utensili in base a quelle trovate in lista importata If Not IsNothing(ImportFileToolNameList) AndAlso Not IsNothing(ImportFileToolFamilyList) Then For ToolIndex As Integer = 0 To ImportFileToolNameList.Count - 1 Dim ToolName As String = ImportFileToolNameList(ToolIndex) Dim ToolFamily As Integer = ImportFileToolFamilyList(ToolIndex) ToolFamily = ToolFamily And (MCH_TF.DRILLBIT Or MCH_TF.SAWBLADE Or MCH_TF.MILL Or MCH_TF.MORTISE Or MCH_TF.CHISEL Or MCH_TF.WATERJET Or MCH_TF.COMPO) Dim bFounded As Boolean = False For Each ToolToImportFamily In ToolToImportList If (ToolFamily = ToolToImportFamily.FamilyType) Then ToolToImportFamily.ToolList.Add(New ImpExpToolItem(ToolName, AlreadyExist(ToolName))) bFounded = True Exit For End If Next If Not bFounded Then Dim NewFamily As New ImpExpToolFamily(GetToolFamilyName(ToolFamily), ToolFamily) NewFamily.ToolList.Add(New ImpExpToolItem(ToolName, AlreadyExist(ToolName))) ToolToImportList.Add(NewFamily) End If Next End If Dim ImportWndVM As New ImportExportToolWindowVM(ToolToImportList, False, ImportFilePath, ImportFileToolNameList) Dim ImportWnd As New ImportExportToolWindowV(Application.Current.MainWindow, ImportWndVM) If ImportWnd.ShowDialog() Then ' Aggiungo all'albero visualizzato gli utensili appena importati LoadImportedMachineTools(ImportWndVM.vsImported) End If End Sub Private Function AlreadyExist(ToolName As String) As Boolean For Each ToolFamily In m_ToolsList For Each ToolItem As ToolTreeViewItem In ToolFamily.Items If ToolName = ToolItem.Name Then Return True End If Next Next Return False End Function Private Function GetToolFamilyName(NewToolFamily As Integer) As String For Each ToolFamily In m_ToolsList If NewToolFamily = ToolFamily.ToolType Then Return ToolFamily.Name End If Next Return "" End Function #End Region ' ImportCommand #Region "ExportCommand" ''' ''' Returns a command that remove the current selected machining. ''' Public ReadOnly Property ExportCommand() As ICommand Get If m_cmdExport Is Nothing Then m_cmdExport = New Command(AddressOf ExportTool) End If Return m_cmdExport End Get End Property ''' ''' Manage the MachiningDb closing. This method is invoked by the CloseMachiningDbCommand. ''' Public Sub ExportTool(param As Object) EgtSetCurrentContext(ToolDbWindowVM.m_ProjectSceneContext) ' Se c'è utensile selezionato, ne verifico salvataggio If Not VerifySelectedToolModification() Then Return ' Creo lista utensili per esportazione Dim ToolToExportList As New ObservableCollection(Of ImpExpToolFamily) For Each Family In m_ToolsList Dim ImpExpToolFamily As New ImpExpToolFamily(Family.Name, Family.ToolType) For Each Tool In Family.Items ImpExpToolFamily.ToolList.Add(New ImpExpToolItem(Tool.Name, False)) Next ToolToExportList.Add(ImpExpToolFamily) Next Dim ExportWndVM As New ImportExportToolWindowVM(ToolToExportList, True) Dim ExportWnd As New ImportExportToolWindowV(Application.Current.MainWindow, ExportWndVM) ExportWnd.ShowDialog() End Sub #End Region ' ExportCommand #Region "ReloadToolCommand" ''' ''' Returns a command that reload the current selected tool. ''' Public ReadOnly Property ReloadToolCommand() As ICommand Get If m_cmdReloadTool Is Nothing Then m_cmdReloadTool = New Command(AddressOf ReloadTool) End If Return m_cmdReloadTool End Get End Property ''' ''' Reload the current selected tools. This method is invoked by the RemoveCommand. ''' Public Sub ReloadTool(ByVal param As Object) If TypeOf param Is FamilyToolTreeViewItem Then Return ' Verifico se sia selezionato un utensile ElseIf TypeOf param Is ToolTreeViewItem Then Dim ToolToReload As ToolTreeViewItem = DirectCast(param, ToolTreeViewItem) EgtSetCurrentContext(ToolDbWindowVM.m_ProjectSceneContext) ToolToReload.ReadToolParam() ToolToReload.ReadToolName() ToolToReload.IsModifiedReset() End If End Sub #End Region ' ReloadToolCommand #Region "CloseToolDbCommand" ''' ''' Returns a command that close ToolDB Window. ''' Public ReadOnly Property CloseToolsDbCommand() As ICommand Get If m_cmdCloseToolsDb Is Nothing Then m_cmdCloseToolsDb = New Command(AddressOf CloseToolsDb) End If Return m_cmdCloseToolsDb End Get End Property ''' ''' Manage the ToolDb closing. This method is invoked by the CloseToolDbCommand. ''' Public Sub CloseToolsDb(param As Object) If (Keyboard.Modifiers And ModifierKeys.Alt) = ModifierKeys.Alt OrElse Keyboard.IsKeyDown(Key.F4) Then Return End If m_bActive = False ' Imposto contesto di progetto EgtSetCurrentContext(ToolDbWindowVM.m_ProjectSceneContext) ' Se c'è utensile selezionato, ne verifico salvataggio If Not VerifySelectedToolModification() Then If Not SelTool.IsValid() Then 'Utensile non valido, correggerlo o cancellarlo prima di uscire dal Db Utensili. - Errore MessageBox.Show(EgtMsg( 31129), EgtMsg( 31126)) End If Return End If ' Salvataggio DB utensili EgtTdbSave() ' Reset lua EgtLuaResetGlobVar("STU") ' Se c'è il parametro Active sugli utensili If m_Active_Visibility Then ' aggiorno setup di default UpdateDefSetup() End If ' Chiusura finestra ToolTreeViewItem.m_delRemoveTool = Nothing ToolTreeViewItem.m_delErrorOnTool = Nothing ToolTreeViewItem.m_delIsEnabledBtns = Nothing FamilyToolTreeViewItem.m_delIsEnabledBtns = Nothing For Each Window In Application.Current.Windows If TypeOf Window Is ToolDbWindowV Then Dim ToolDbWindow As ToolDbWindowV = DirectCast(Window, ToolDbWindowV) ToolDbWindow.DataContext = Nothing ToolDbWindow.Close() End If Next End Sub #End Region ' CloseToolsDbCommand #End Region ' Commands End Class