Imports EgtWPFLib5 Imports EgtUILib Imports Microsoft.Win32 Imports System.IO Imports Ionic.Zip Imports Newtonsoft.Json Public Class SliceManagerVM Inherits VMBase #Region "FIELDS & PROPERTIES" Private Enum CalcSteps As Integer NULL = 0 CALC_INTERSECTIONS = 1 SLICING = 2 CALC_PATHS = 3 CALC_TOOLPATHS = 4 CALC_SOLIDS = 5 CALCTSF = 6 GENERATE = 7 End Enum ' variabile che indica se sono in corso i calcoli Private m_bCalculating As Boolean = False Friend ReadOnly Property bCalculating As Boolean Get Return m_bCalculating End Get End Property #Region "ProgressBar" ' Funzioni di callback per output in interfaccia da LUA Private m_ProcEventsCallback As New ProcessEventsCallback(AddressOf ProcessEvents) Private m_bStopScript As Boolean = False Private m_bStopScriptToManage As Boolean = False Private m_bSlice As Boolean = False Friend ReadOnly Property bSlice As Boolean Get Return m_bSlice End Get End Property Private m_bCalcTFS As Boolean = False Private m_bGenerate As Boolean = False Private m_bCalcSolid As Boolean = False Friend ReadOnly Property bCalcSolid As Boolean Get Return m_bCalcSolid End Get End Property Friend Sub SetCalcSolid(value As Boolean) m_bCalcSolid = value End Sub Private m_SliceManagerState As CalcSteps Private m_CalcStep As CalcSteps = CalcSteps.NULL Public ReadOnly Property sLoadingText As String Get Select Case m_SliceManagerState Case CalcSteps.CALC_INTERSECTIONS Return "Calculating Intersections..." Case CalcSteps.SLICING Return "Slicing..." Case CalcSteps.CALC_PATHS Return "Calculating Paths..." Case CalcSteps.CALC_TOOLPATHS Return "Calculating Toolpaths..." Case CalcSteps.CALC_SOLIDS Return "Calculating Solids..." Case CalcSteps.CALCTSF Return "Calculating Feed & Speed..." Case CalcSteps.GENERATE Return "Generating..." Case Else Return "" End Select End Get End Property Private m_PartialLoading_Value As Integer = 0 Public Property PartialLoading_Value As Integer Get Return m_PartialLoading_Value End Get Set(value As Integer) m_PartialLoading_Value = value End Set End Property Private Sub SetPartialLoading(value As Integer) m_PartialLoading_Value = value NotifyPropertyChanged(NameOf(PartialLoading_Value)) End Sub Private m_MainLoading_Value As Integer = 0 Public Property MainLoading_Value As Integer Get Return m_MainLoading_Value End Get Set(value As Integer) m_MainLoading_Value = value End Set End Property Private Sub SetMainLoadingValue(value As Integer) m_MainLoading_Value = value NotifyPropertyChanged(NameOf(MainLoading_Value)) End Sub Private m_Loading_Visibility As Visibility = Visibility.Collapsed Public Property Loading_Visibility As Visibility Get Return m_Loading_Visibility End Get Set(value As Visibility) m_Loading_Visibility = value End Set End Property Friend Sub SetLoadingVisibility(bIsVisible As Boolean) m_Loading_Visibility = If(bIsVisible, Visibility.Visible, Visibility.Collapsed) NotifyPropertyChanged(NameOf(Loading_Visibility)) End Sub #End Region ' ProgressBar Private m_dTime As Double = 0 Public ReadOnly Property ghTime As String Get Dim dtTime As TimeSpan = TimeSpan.FromSeconds(m_dTime) Return Math.Floor(dtTime.TotalHours) & "h " & (Math.Floor(dtTime.Minutes)).ToString("00") & "m" '& (Math.Ceiling(dtTime.Seconds)).ToString("00") End Get End Property Private m_dMass As Double = 0 Public ReadOnly Property ghMass As String Get Return DoubleToString(m_dMass, 1) & " kg" End Get End Property Public ReadOnly Property ghDimensions As String Get If Not IsNothing(Map.refTopPanelVM.SelPart) Then Dim b3Print As BBox3d = Map.refDispositionPanelVM.GetSolidForReferenceBBox(Map.refTopPanelVM.SelPart) Return DoubleToString(b3Print.DimX, 1) & " x " & DoubleToString(b3Print.DimY, 1) & " x " & DoubleToString(b3Print.DimZ, 1) & " mm" End If Return "" End Get End Property Friend Sub UpdateDimensions() NotifyPropertyChanged(NameOf(ghDimensions)) End Sub Public ReadOnly Property Time_Visibility As Visibility Get Return If(m_dTime > 0, Visibility.Visible, Visibility.Collapsed) End Get End Property Public ReadOnly Property Mass_Visibility As Visibility Get Return If(m_dMass > 0, Visibility.Visible, Visibility.Collapsed) End Get End Property Private m_Buttons_IsEnabled As Boolean = True Public ReadOnly Property Buttons_IsEnabled As Boolean Get Return m_Buttons_IsEnabled End Get End Property Friend Sub SetButtonsIsEnabled(value As Boolean) m_Buttons_IsEnabled = value NotifyPropertyChanged(NameOf(Buttons_IsEnabled)) End Sub Private m_ModifyMode_Visibility As Visibility = Visibility.Collapsed Public ReadOnly Property ModifyMode_Visibility As Visibility Get Return m_ModifyMode_Visibility End Get End Property Private m_SliceMode_Visibility As Visibility = Visibility.Collapsed Public ReadOnly Property SliceMode_Visibility As Visibility Get Return m_SliceMode_Visibility End Get End Property ' Definizione comandi Private m_cmdSlice As ICommand Private m_cmdStopCalculation As ICommand Private m_cmdSimulate As ICommand Private m_cmdUpdate As ICommand Private m_cmdGenerate As ICommand Private m_cmdExit As ICommand #End Region ' FIELDS & PROPERTIES #Region "CONSTRUCTORS" Sub New() ' Creo riferimento a questa classe in EgtCAM5Map Map.SetRefSliceManagerVM(Me) UpdateState(False) End Sub #End Region ' CONSTRUCTORS #Region "METHODS" Friend Sub UpdateState(bState As Boolean) If bState Then m_ModifyMode_Visibility = Visibility.Collapsed m_SliceMode_Visibility = Visibility.Visible Else m_ModifyMode_Visibility = Visibility.Visible m_SliceMode_Visibility = Visibility.Collapsed End If NotifyPropertyChanged(NameOf(ModifyMode_Visibility)) NotifyPropertyChanged(NameOf(SliceMode_Visibility)) End Sub Friend Sub UpdateTimeAndMass() Dim nLayTFSCalcId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, LAY_TFSCALC) If nLayTFSCalcId <> GDB_ID.NULL Then If Not EgtGetInfo(nLayTFSCalcId, "Ttot", m_dTime) Then m_dTime = 0 If Not EgtGetInfo(nLayTFSCalcId, KEY_MASS, m_dMass) Then m_dMass = 0 Else m_dTime = 0 m_dMass = 0 End If NotifyPropertyChanged(NameOf(ghTime)) NotifyPropertyChanged(NameOf(ghMass)) NotifyPropertyChanged(NameOf(Time_Visibility)) NotifyPropertyChanged(NameOf(Mass_Visibility)) End Sub Friend Function ProcessEvents(ByVal nProg As Integer, ByVal nPause As Integer) As Integer ' Se previsto, imposto progress If nProg >= 0 Then Dim dPartialProgress As Integer = 0 Dim NewSliceManagerState = Math.DivRem(nProg, 100, dPartialProgress) If dPartialProgress = 0 Then m_SliceManagerState = NewSliceManagerState dPartialProgress = 100 Else m_SliceManagerState = NewSliceManagerState + 1 End If 'EgtOutLog("SliceManagerState: " & m_SliceManagerState) NotifyPropertyChanged(NameOf(sLoadingText)) SetPartialLoading(dPartialProgress) 'EgtOutLog("PartialProgress: " & dPartialProgress) Dim dCalcTSFMax As Double = If(m_bSlice, 15, 70) Dim dGenerateMax As Double = If(m_bSlice, 5, 30) Dim dMainProgress As Double = 0 If m_bSlice Then If m_SliceManagerState > CalcSteps.SLICING Then dMainProgress += 10 ElseIf m_SliceManagerState = CalcSteps.SLICING Then dMainProgress += 10 / 100 * dPartialProgress End If If m_SliceManagerState > CalcSteps.CALC_PATHS Then dMainProgress += 10 ElseIf m_SliceManagerState = CalcSteps.CALC_PATHS Then dMainProgress += 10 / 100 * dPartialProgress End If If m_SliceManagerState > CalcSteps.CALC_TOOLPATHS Then dMainProgress += 10 ElseIf m_SliceManagerState = CalcSteps.CALC_TOOLPATHS Then dMainProgress += 10 / 100 * dPartialProgress End If If m_SliceManagerState > CalcSteps.CALC_SOLIDS Then dMainProgress += 50 ElseIf m_SliceManagerState = CalcSteps.CALC_SOLIDS Then dMainProgress += 50 / 100 * dPartialProgress End If End If If m_bCalcSolid Then dMainProgress += dPartialProgress End If If m_bCalcTFS Then If m_SliceManagerState > CalcSteps.CALCTSF Then dMainProgress += dCalcTSFMax ElseIf m_SliceManagerState = CalcSteps.CALCTSF Then dMainProgress += dCalcTSFMax / 100 * dPartialProgress End If End If If m_bGenerate Then If m_SliceManagerState > CalcSteps.GENERATE Then dMainProgress += dGenerateMax ElseIf m_SliceManagerState = CalcSteps.GENERATE Then dMainProgress += dGenerateMax / 100 * dPartialProgress End If End If SetMainLoadingValue(dMainProgress) 'EgtOutLog("MainProgress: " & dMainProgress) End If ' Costringo ad aggiornare UpdateUI() ' Eventuale attesa Threading.Thread.Sleep(nPause) ' Ritorno eventuale stop If m_bStopScript Then m_bStopScript = False m_bStopScriptToManage = True Return 1 Else Return 0 End If Return 0 End Function Friend Function CalcSlice(bGenerate As Boolean, Optional bForceGenerate As Boolean = False) As Boolean ' Verifico nome progetto Dim sCurrProject As String = String.Empty EgtGetCurrFilePath(sCurrProject) If String.IsNullOrWhiteSpace(sCurrProject) Or EgtGetFileType(sCurrProject) <> FT.NGE Then Map.refSceneHostVM.SaveAsProject() End If EgtGetCurrFilePath(sCurrProject) If String.IsNullOrWhiteSpace(sCurrProject) Or EgtGetFileType(sCurrProject) <> FT.NGE Then MessageBox.Show("Save project before calculating slices!", "Error", MessageBoxButton.OK, MessageBoxImage.Error) Return False End If ' mostro barre di caricamento SetLoadingVisibility(True) ' disabilito ProjManager, TopPanel, TFS, Slider, bottoni e uscita dal programma Map.refProjManagerVM.SetProjCmdIsEnabled(False) Map.refTopPanelVM.SetTopPanelIsEnabled(False) Map.refViewLayerManagerVM.SetViewLayerManagerIsEnabled(False) Map.refTFSEditorVM.SetTFSEditorIsEnabled(False) Map.refSliderManagerVM.SetLayerIndexIsEnabled(False) Map.refSliderManagerVM.SetLayerAdvancementIsEnabled(False) SetButtonsIsEnabled(False) ' verifico se eseguire slice m_bSlice = False m_bCalcTFS = False m_bGenerate = bGenerate Dim bOk As Boolean = True Dim bToRecalcSlice As Boolean = False Dim bToRecalcTFS As Boolean = False Dim bToRecalcGenerate As Boolean = False Dim nPartId As Integer = EgtGetFirstPart() While nPartId <> GDB_ID.NULL Dim bTemp As Boolean = False If EgtGetInfo(nPartId, MAC_TORECALC_SLICE, bTemp) AndAlso bTemp Then bToRecalcSlice = True End If If EgtGetInfo(nPartId, MAC_TORECALC_TFS, bTemp) AndAlso bTemp Then bToRecalcTFS = True End If If EgtGetInfo(nPartId, MAC_TORECALC_GENERATE, bTemp) AndAlso bTemp Then bToRecalcGenerate = True End If nPartId = EgtGetNextPart(nPartId) End While If bToRecalcSlice Then m_bSlice = True m_bCalcTFS = True m_bGenerate = bForceGenerate OrElse (bGenerate AndAlso bToRecalcGenerate) Else m_bSlice = False m_bCalcTFS = bToRecalcTFS m_bGenerate = bForceGenerate OrElse (bGenerate AndAlso bToRecalcGenerate) End If If m_bSlice OrElse m_bCalcTFS Then nPartId = EgtGetFirstPart() While nPartId <> GDB_ID.NULL EgtSetInfo(nPartId, MAC_TORECALC_GENERATE, True) nPartId = EgtGetNextPart(nPartId) End While End If ' Aggiorno dati macchina Map.refTFSEditorVM.UpdateSpeedMinMax() ' eseguo calcolo slicing, toolpath e solidi bOk = ExecSlice(m_bSlice, m_bCalcTFS) ' se calcolo andato a buon fine If bOk Then ' rimuovo flag richiesta ricalcolo Dim nCurrPartId As Integer = EgtGetFirstPart() While nCurrPartId <> GDB_ID.NULL ' eseguo rimozione flag If m_bSlice AndAlso Not m_bStopScriptToManage Then EgtRemoveInfo(nCurrPartId, MAC_TORECALC_SLICE) If m_bCalcTFS AndAlso Not m_bStopScriptToManage Then EgtRemoveInfo(nCurrPartId, MAC_TORECALC_TFS) nCurrPartId = EgtGetNextPart(nCurrPartId) End While ' aggiorno massa Dim nLayTFSCalcId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, LAY_TFSCALC) EgtGetInfo(nLayTFSCalcId, KEY_MASS, m_dMass) NotifyPropertyChanged(NameOf(ghMass)) End If Map.refTFSEditorVM.Refresh() Map.refTopPanelVM.SelPart.RefreshPrintLayers() ' in caso di errore, segnalazione If Not bOk Then MessageBox.Show("Error in slicing! See log file.", "Error", MessageBoxButton.OK, MessageBoxImage.Error) End If If bOk And m_bGenerate Then ' verifico esistenza e correttezza machgroup InitMachGroup(True) ' eseguo generazione CN Dim sMsg As String = "" bOk = ExecGenerate(sMsg) ' leggo stima tempo e la riporto in layer di calcolo EgtGetInfo(EgtGetFirstMachGroup(), "Ttot", m_dTime) NotifyPropertyChanged(NameOf(ghTime)) Dim nLayTFSCalcId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, LAY_TFSCALC) EgtSetInfo(nLayTFSCalcId, "Ttot", m_dTime) ' se calcolo andato a buon fine, rimuovo flag richiesta ricalcolo If bOk Then Dim nCurrPartId As Integer = EgtGetFirstPart() While nCurrPartId <> GDB_ID.NULL ' eseguo rimozione flag EgtRemoveInfo(nCurrPartId, MAC_TORECALC_GENERATE) nCurrPartId = EgtGetNextPart(nCurrPartId) End While Else Dim sOut As String = "Error in NC code generation : " If String.IsNullOrWhiteSpace(sMsg) Then sOut &= "See log file." Else sOut &= sMsg End If MessageBox.Show(sOut, "Error", MessageBoxButton.OK, MessageBoxImage.Error) End If End If ' aggiorno tempo e massa Map.refSliceManagerVM.UpdateTimeAndMass() ' Aggiorno intestazione programma Map.refSceneHostVM.EmitTitle() ' nascondo barre di caricamento SetLoadingVisibility(False) ' riabilito ProjManager, TopPanel e uscita dal programma Map.refProjManagerVM.SetProjCmdIsEnabled(True) Map.refTopPanelVM.SetTopPanelIsEnabled(True) Map.refViewLayerManagerVM.SetViewLayerManagerIsEnabled(True) Map.refTFSEditorVM.SetTFSEditorIsEnabled(True) Map.refSliderManagerVM.SetLayerIndexIsEnabled(True) Map.refSliderManagerVM.SetLayerAdvancementIsEnabled(True) SetButtonsIsEnabled(True) Return bOk End Function Friend Sub InitMachGroup(bGenerate As Boolean) If bGenerate Then Dim nMachGroupId As Integer = EgtGetFirstMachGroup() While nMachGroupId <> GDB_ID.NULL EgtRemoveMachGroup(nMachGroupId) nMachGroupId = EgtGetFirstMachGroup() End While ' Definisco e posiziono il grezzo sulla tavola EgtAddMachGroup("3dPrint") EgtSetTable("Tab") For Each CurrPart In Map.refTopPanelVM.PartList Dim b3Part As New BBox3d Dim b3PrintSolid As New BBox3d EgtGetBBoxGlob(CurrPart.nPartId, GDB_BB.STANDARD, b3Part) EgtGetBBoxGlob(CurrPart.nPrintSolidId, GDB_BB.STANDARD, b3PrintSolid) Dim nRawId As Integer = EgtAddRawPart(b3PrintSolid.Min, b3PrintSolid.DimX, b3PrintSolid.DimY, b3PrintSolid.DimZ, New Color3d(128, 128, 128, 30)) EgtAddPartToRawPart(CurrPart.nPartId, Point3d.ORIG() + (b3Part.Min - b3PrintSolid.Min), nRawId) EgtMoveToCornerRawPart(nRawId, b3PrintSolid.Min, MCH_CR.BL) Next EgtResetCurrMachGroup() Else ' esecuzione script prima di inizio Mach ExecInitMachScript() EgtSetCurrMachGroup(EgtGetFirstMachGroup()) End If End Sub Private Function ExecInitMachScript() As Boolean ' Recupero il nome dello script e verifico esista Dim sInitMachScriptPath As String = "" If EgtUILib.GetPrivateProfileString(S_MACHINING, K_MACH_INITSCRIPT, "", sInitMachScriptPath, CurrentMachine.sMachIniFile) = 0 Then Return True sInitMachScriptPath = (CurrentMachine.sMachScriptDir & "\" & sInitMachScriptPath).TrimEnd({"\"c}) If Not My.Computer.FileSystem.FileExists(sInitMachScriptPath) Then Return True ' Eseguo lo script EgtLuaCreateGlobTable("MACH") If Not EgtLuaExecFile(sInitMachScriptPath) Then EgtOutLog("Error executing Machining init script " & sInitMachScriptPath) MessageBox.Show(EgtMsg(5463) & " " & sInitMachScriptPath, EgtMsg(5461), MessageBoxButton.OK, MessageBoxImage.Error) Return False End If Dim nErr As Integer = 999 EgtLuaGetGlobIntVar("MACH.ERR", nErr) EgtLuaResetGlobVar("MACH") Return nErr = 0 End Function Friend Function ExecExitMachScript() As Boolean ' Recupero il nome dello script e verifico esista Dim sExitMachScriptPath As String = "" If EgtUILib.GetPrivateProfileString(S_MACHINING, K_MACH_EXITSCRIPT, "", sExitMachScriptPath, CurrentMachine.sMachIniFile) = 0 Then Return True sExitMachScriptPath = CurrentMachine.sMachScriptDir & "\" & sExitMachScriptPath If Not My.Computer.FileSystem.FileExists(sExitMachScriptPath) Then Return True ' Eseguo lo script EgtLuaCreateGlobTable("MACH") If Not EgtLuaExecFile(sExitMachScriptPath) Then EgtOutLog("Error executing Machining exit script " & sExitMachScriptPath) MessageBox.Show(EgtMsg(5464) & " " & sExitMachScriptPath, EgtMsg(5461), MessageBoxButton.OK, MessageBoxImage.Error) Return False End If Dim nErr As Integer = 999 EgtLuaGetGlobIntVar("MACH.ERR", nErr) EgtLuaResetGlobVar("MACH") Return nErr = 0 End Function #End Region ' METHODS #Region "COMMANDS" #Region "Slice" ''' ''' Returns a command that do CPlaneTop. ''' Public ReadOnly Property Slice_Command As ICommand Get If m_cmdSlice Is Nothing Then m_cmdSlice = New Command(AddressOf Slice) End If Return m_cmdSlice End Get End Property ''' ''' Execute the CPlaneTop. This method is invoked by the CPlaneTopCommand. ''' Public Sub Slice() If Map.refSceneHostVM.MainController.GetStep <> 0 OrElse Map.refStartMachPanelVM.bCPlaneObj_IsActive OrElse Map.refRibPanelVM.bCPlaneObj_IsActive OrElse Map.refShellNumberPanelVM.bCPlaneObj_IsActive OrElse Map.refFilledSolidPanelVM.bCPlaneObj_IsActive Then Return If m_bCalculating Then Return m_bCalculating = True If IsNothing(Map.refTopPanelVM.SelPart) Then MessageBox.Show("No parts to slice!", "Error", MessageBoxButton.OK, MessageBoxImage.Error) m_bCalculating = False Return End If If IsNothing(Map.refTopPanelVM.SelMaterial) Then MessageBox.Show("No print material set!", "Error", MessageBoxButton.OK, MessageBoxImage.Error) m_bCalculating = False Return End If If IsNothing(Map.refTopPanelVM.SelMachining) OrElse IsNothing(Map.refTopPanelVM.CurrMachining) OrElse Map.refTopPanelVM.CurrMachining.dCurrStrandH <= 0 Then MessageBox.Show("No print parameters set!", "Error", MessageBoxButton.OK, MessageBoxImage.Error) m_bCalculating = False Return End If Dim b3Print As BBox3d = Map.refDispositionPanelVM.GetSolidForReferenceBBox(Map.refTopPanelVM.SelPart) If Not String.IsNullOrWhiteSpace(CurrentMachine.sMachDataIniFile) AndAlso Not CurrentMachine.b3ExtrusionArea.EnclosesXY(b3Print) Then MessageBox.Show("Part outside the extrusion area!", "Error", MessageBoxButton.OK, MessageBoxImage.Error) m_bCalculating = False Return End If ' eseguo calcoli CalcSlice(False) ' se non ho interrotto calcoli If Not m_bStopScriptToManage Then Map.refTopPanelVM.SelPage = Pages.NULL Map.refTopPanelVM.SelPage = Pages.SLICE Map.refSliderManagerVM.SetLayerIndexToMax() NotifyPropertyChanged(NameOf(Time_Visibility)) NotifyPropertyChanged(NameOf(Mass_Visibility)) ' se ricalcolato slice attivo vista SliceToolpath e modo TillSelected If m_bSlice Then Map.refSliderManagerVM.SetSelViewSlider(SliderManagerVM.ViewSliderType.UNTIL_SELECTED) End If Else m_bStopScriptToManage = False End If m_bSlice = False m_bCalcTFS = False m_bGenerate = False m_bCalculating = False End Sub #End Region ' Slice #Region "StopCalculation" ''' ''' Returns a command that do CPlaneTop. ''' Public ReadOnly Property StopCalculation_Command As ICommand Get If m_cmdStopCalculation Is Nothing Then m_cmdStopCalculation = New Command(AddressOf StopCalculation) End If Return m_cmdStopCalculation End Get End Property ''' ''' Execute the CPlaneTop. This method is invoked by the CPlaneTopCommand. ''' Public Sub StopCalculation() If Not m_bCalculating Then Return m_bStopScript = True m_bCalculating = False End Sub #End Region ' StopCalculation #Region "Update" ''' ''' Returns a command that do CPlaneTop. ''' Public ReadOnly Property Update_Command As ICommand Get If m_cmdUpdate Is Nothing Then m_cmdUpdate = New Command(AddressOf Update) End If Return m_cmdUpdate End Get End Property ''' ''' Execute the CPlaneTop. This method is invoked by the CPlaneTopCommand. ''' Public Sub Update() If m_bCalculating Then Return m_bCalculating = True ' eseguo calcoli CalcSlice(False) ' se non ho interrotto calcoli If Not m_bStopScriptToManage Then NotifyPropertyChanged(NameOf(Time_Visibility)) NotifyPropertyChanged(NameOf(Mass_Visibility)) Else m_bStopScriptToManage = False End If m_bCalculating = False End Sub #End Region ' Update #Region "Generate" ''' ''' Returns a command that do CPlaneTop. ''' Public ReadOnly Property Generate_Command As ICommand Get If m_cmdGenerate Is Nothing Then m_cmdGenerate = New Command(AddressOf Generate) End If Return m_cmdGenerate End Get End Property ''' ''' Execute the CPlaneTop. This method is invoked by the CPlaneTopCommand. ''' Public Sub Generate() If m_bCalculating Then Return m_bCalculating = True Dim bShiftPressed As Boolean = (Keyboard.Modifiers And ModifierKeys.Shift) = ModifierKeys.Shift Dim bCtrlPressed As Boolean = (Keyboard.Modifiers And ModifierKeys.Control) = ModifierKeys.Control ' se shift chiedo nome Dim sIsoFilePath As String = "" Dim sExtension As String = "" GetPrivateProfileString(S_PARTPROGRAM, K_EXTENSION, "", sExtension, CurrentMachine.sMachIniFile) If String.IsNullOrWhiteSpace(sExtension) Then sExtension = ".cnc" End If If bCtrlPressed Then Dim sCurrFilePath As String = "" Dim sInitialDirectory As String = "" EgtGetCurrFilePath(sCurrFilePath) If Not IsNothing(sCurrFilePath) Then sInitialDirectory = System.IO.Path.ChangeExtension(sCurrFilePath, sExtension) End If Dim NewSaveFileDialog As New Windows.Forms.SaveFileDialog With {.Title = "ISO File Name", .Filter = "|*" & sExtension, .FilterIndex = 1, .InitialDirectory = System.IO.Path.GetDirectoryName(sInitialDirectory), .FileName = sInitialDirectory, .CreatePrompt = True, .OverwritePrompt = True, .ValidateNames = False} Dim bResult As Boolean? = NewSaveFileDialog.ShowDialog() If IsNothing(bResult) OrElse Not bResult Then m_bCalculating = False Return End If Dim nTabPartId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, TABLE) If nTabPartId <> GDB_ID.NULL Then EgtSetInfo(nTabPartId, KEY_ISOFILE_PATH, NewSaveFileDialog.FileName) sIsoFilePath = NewSaveFileDialog.FileName End If Else Dim nTabPartId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, TABLE) If nTabPartId <> GDB_ID.NULL Then EgtGetInfo(nTabPartId, KEY_ISOFILE_PATH, sIsoFilePath) If String.IsNullOrWhiteSpace(sIsoFilePath) OrElse Not Directory.Exists(Path.GetDirectoryName(sIsoFilePath)) Then EgtGetCurrFilePath(sIsoFilePath) sIsoFilePath = System.IO.Path.ChangeExtension(sIsoFilePath, sExtension) EgtSetInfo(nTabPartId, KEY_ISOFILE_PATH, sIsoFilePath) End If End If End If ' eseguo calcoli Dim bOk As Boolean = CalcSlice(True, True) ' se non ho interrotto calcoli If bOk AndAlso Not m_bStopScriptToManage Then ' Se esiste l'iso If File.Exists(sIsoFilePath) Then If bShiftPressed Then ' Se esiste ne lancio l'editing Process.Start("Notepad.exe", sIsoFilePath) ' altrimenti lo segnalo End If ' verifico se creare pacchetto If Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.MACHINE_EXPORT) Then 'If True Then If Not CreateProjectForMachine(sIsoFilePath) Then MessageBox.Show("Icrx file generation failed!!", "Error!", MessageBoxButton.OK, MessageBoxImage.Error) End If ' riabilito ProjManager, TopPanel e uscita dal programma Map.refProjManagerVM.SetProjCmdIsEnabled(True) Map.refTopPanelVM.SetTopPanelIsEnabled(True) Map.refViewLayerManagerVM.SetViewLayerManagerIsEnabled(True) Map.refTFSEditorVM.SetTFSEditorIsEnabled(True) Map.refSliderManagerVM.SetLayerIndexIsEnabled(True) Map.refSliderManagerVM.SetLayerAdvancementIsEnabled(True) SetButtonsIsEnabled(True) End If Else ' altrimenti lo segnalo MessageBox.Show("Part program generation failed!!", "Error", MessageBoxButton.OK, MessageBoxImage.Error) End If NotifyPropertyChanged(NameOf(Time_Visibility)) NotifyPropertyChanged(NameOf(Mass_Visibility)) Else m_bStopScriptToManage = False End If m_bCalculating = False End Sub Private Function CreateProjectForMachine(sIsoFilePath As String) As Boolean ' disabilito ProjManager, TopPanel, TFS, Slider, bottoni e uscita dal programma Map.refProjManagerVM.SetProjCmdIsEnabled(False) Map.refTopPanelVM.SetTopPanelIsEnabled(False) Map.refViewLayerManagerVM.SetViewLayerManagerIsEnabled(False) Map.refTFSEditorVM.SetTFSEditorIsEnabled(False) Map.refSliderManagerVM.SetLayerIndexIsEnabled(False) Map.refSliderManagerVM.SetLayerAdvancementIsEnabled(False) SetButtonsIsEnabled(False) ' creo cartella file da esportare in Temp Dim sExportTempFolderPath As String = Map.refMainWindowVM.MainWindowM.sTempDir & "\MachineExport" If Directory.Exists(sExportTempFolderPath) Then Try Directory.Delete(sExportTempFolderPath, True) Catch ex As Exception EgtOutLog("Error! Impossible deleting folder " & sExportTempFolderPath & "!") Return False End Try End If Try Directory.CreateDirectory(sExportTempFolderPath) Catch ex As Exception EgtOutLog("Error! Impossible creating folder " & sExportTempFolderPath & "!") Return False End Try ' mostro solido per eportazione Dim SolidCheck As ViewLayer = Map.refViewLayerManagerVM.LayerList.FirstOrDefault(Function(x) x.Type = ViewLayer.ViewLayerType.SOLID_SLICE) Dim CurrSolidCheckValue As Boolean? = SolidCheck.bIsVisible If IsNothing(SolidCheck.bIsVisible) OrElse Not SolidCheck.bIsVisible Then SolidCheck.bIsVisible = True End If ' esporto file progetto Dim sFileExtension As String If True Then sFileExtension = ".3dm" Else sFileExtension = ".3mf" End If Dim s3dFilePath As String = "" If Not Map.refSceneHostVM.ExportProjectForMachine(sExportTempFolderPath, True, s3dFilePath) Then EgtOutLog("Error! Impossible exporting 3mf file!") Return False End If '' esporto file 3mf 'Dim s3mfPath As String = sExportTempFolderPath & "\ProjectSlice.3mf" 'If Not Map.refSceneHostVM.ExportProjectForMachine(s3mfPath) Then ' EgtOutLog("Error! Impossible exporting 3mf file!") ' Return False 'End If ' creo file json Dim sProjName As String = "" EgtGetCurrFilePath(sProjName) Dim sJsonPath As String = sExportTempFolderPath & "\ProjectSlice.json" CreateJson(sJsonPath) ' creo immagine preview Dim sPreviewImagePath As String = sExportTempFolderPath & "\ProjectSlice.png" CreatePreviewImage(sPreviewImagePath) ' nascondo solido If IsNothing(CurrSolidCheckValue) OrElse Not CurrSolidCheckValue Then SolidCheck.bIsVisible = CurrSolidCheckValue End If ' creo path dello zip Dim sZipPath As String = Path.ChangeExtension(sProjName, ".icrx") ' se esiste gia' lo cancello If File.Exists(sZipPath) Then Try File.Delete(sZipPath) Catch ex As Exception EgtOutLog("Error! Impossible deleting old icrx file!") Return False End Try End If Try Using zip As New Ionic.Zip.ZipFile(sZipPath, Console.Out) zip.AlternateEncodingUsage = ZipOption.Always zip.AlternateEncoding = Text.Encoding.UTF8 zip.CompressionMethod = CompressionMethod.None ' aggiungo file Iso zip.AddItem(sIsoFilePath, "").FileName = "ProjectSlice" & Path.GetExtension(sIsoFilePath) ' aggiungo file 3mf zip.AddItem(s3dFilePath, "") ' aggiungo json zip.AddItem(sJsonPath, "") ' aggiungo immagine preview zip.AddItem(sPreviewImagePath, "") ' salvo lo zip zip.Save() End Using Catch ex As Exception EgtOutLog("Error! Icrx file generation failed!!") Return False End Try ' elimino tutti i file temporanei creati If Directory.Exists(sExportTempFolderPath) Then Directory.Delete(sExportTempFolderPath, True) End If Return True End Function Private Function CreateJson(sJsonPath As String) As Boolean ' creo json Dim JsonMain As New JsonMain(m_dTime, m_dMass) Dim json As String = JsonConvert.SerializeObject(JsonMain, Formatting.Indented) If File.Exists(sJsonPath) Then Try File.Delete(sJsonPath) Catch ex As Exception EgtOutLog("Error! Impossible deleting file " & sJsonPath & "!") Return False End Try End If Try File.AppendAllText(sJsonPath, json) Catch ex As Exception EgtOutLog("Error! Impossible writing json file " & sJsonPath & "!") Return False End Try Return True End Function Private Function CreatePreviewImage(sPreviewImagePath As String) As Boolean ' recupero posizione vista corrente Dim nCurrAngVertDeg As Integer = 0 Dim nCurrAngHorizDeg As Integer = 0 EgtGetGenericView(nCurrAngVertDeg, nCurrAngHorizDeg) EgtSetView(VT.ISO_SW, False) SetTableVisibility(False) EgtZoom(ZM.ALL, False) 'EgtExportSvg(GDB_ID.ROOT, sPreviewImagePath) EgtGetImage(SM.SHADING, New Color3d(255, 255, 255, 255), New Color3d(255, 255, 255, 255), 3000, 3000, sPreviewImagePath) EgtSetGenericView(nCurrAngVertDeg, nCurrAngHorizDeg, False) SetTableVisibility(True) EgtZoom(ZM.ALL, True) Return True End Function #End Region ' Generate #Region "Simulate" ''' ''' Returns a command that do CPlaneTop. ''' Public ReadOnly Property Simulate_Command As ICommand Get If m_cmdSimulate Is Nothing Then m_cmdSimulate = New Command(AddressOf Simulate) End If Return m_cmdSimulate End Get End Property ''' ''' Execute the CPlaneTop. This method is invoked by the CPlaneTopCommand. ''' Public Sub Simulate() m_bCalculating = True ' eseguo calcoli CalcSlice(True) m_bCalculating = False ' se non ho interrotto calcoli If Not m_bStopScriptToManage Then ' verifico esistenza e correttezza machgroup InitMachGroup(False) ' apro simulazione Map.refRightPanelVM.SetSelPanel(RightPanelVM.Panels.SIMULATION) Else m_bStopScriptToManage = False End If End Sub #End Region ' Simulate #Region "Exit" ''' ''' Returns a command that do CPlaneTop. ''' Public ReadOnly Property Exit_Command As ICommand Get If m_cmdExit Is Nothing Then m_cmdExit = New Command(AddressOf ExitCmd) End If Return m_cmdExit End Get End Property ''' ''' Execute the CPlaneTop. This method is invoked by the CPlaneTopCommand. ''' Public Sub ExitCmd() ' se in simulazione If Map.refRightPanelVM.SelPanel = RightPanelVM.Panels.SIMULATION Then ' la chiudo Map.refSimulationPanelVM.Ok() End If Map.refTopPanelVM.SelPage = Pages.MODIFY End Sub #End Region ' Exit #End Region ' COMMANDS End Class