Imports EgtUILib Imports EgtWPFLib5 Public Class SceneButtonVM Inherits VMBase #Region "FIELDS & PROPERTIES" Public Shared m_nIndexList As Integer = 0 Public Shared m_nIndexList_1 As Integer = 0 Public Shared m_nIndexList_2 As Integer = 0 Public m_SelOptionUC As SelOptionV Public m_SceneUserControlV As SceneUserControlV Public m_PairUC As SceneUserControlV Public m_RotateUC As SceneUserControlV Public m_MoveUC As SceneUserControlV Public m_NewPanelUC As SceneUserControlV Public m_EditPanelUC As SceneUserControlV Public m_EditTopKUC As SceneUserControlV Public m_ParametricCompoUC As SceneUserControlV Private m_TopListBtn As New List(Of SceneBtn) Public Property TopListBtn As List(Of SceneBtn) Get Return m_TopListBtn End Get Set(value As List(Of SceneBtn)) m_TopListBtn = value End Set End Property Private m_LeftListBtn As New List(Of SceneBtn) Public Property LeftListBtn As List(Of SceneBtn) Get Return m_LeftListBtn End Get Set(value As List(Of SceneBtn)) m_LeftListBtn = value End Set End Property Private m_RightListBtn As New List(Of SceneBtn) Public Property RightListBtn As List(Of SceneBtn) Get Return m_RightListBtn End Get Set(value As List(Of SceneBtn)) m_RightListBtn = value End Set End Property Private m_BottomListBtn As New List(Of SceneBtn) Public Property BottomListBtn As List(Of SceneBtn) Get Return m_BottomListBtn End Get Set(value As List(Of SceneBtn)) m_BottomListBtn = value End Set End Property Private m_BottomCenterListBtn As New List(Of SceneBtn) Public Property BottomCenterListBtn As List(Of SceneBtn) Get Return m_BottomCenterListBtn End Get Set(value As List(Of SceneBtn)) m_BottomCenterListBtn = value End Set End Property Private m_TopPanelListGroupBtn As New List(Of GroupSceneBtn) Public Property TopPanelListGroupBtn As List(Of GroupSceneBtn) Get Return m_TopPanelListGroupBtn End Get Set(value As List(Of GroupSceneBtn)) m_TopPanelListGroupBtn = value End Set End Property Private m_ParametricListGroupBtn As New List(Of GroupSceneBtn) Public Property ParametricListGroupBtn As List(Of GroupSceneBtn) Get Return m_ParametricListGroupBtn End Get Set(value As List(Of GroupSceneBtn)) m_ParametricListGroupBtn = value End Set End Property Friend Enum TopPanel As Integer TOP_PANEL = 0 TOP_PANEL_1 = 1 End Enum Private m_SelSelTopPanel As TopPanel = TopPanel.TOP_PANEL Public Property SelTopPanel As Integer Get Return m_SelSelTopPanel End Get Set(value As Integer) m_SelSelTopPanel = value End Set End Property Friend Sub SetSelTopPanel(TopOtion As TopPanel) m_SelSelTopPanel = TopOtion NotifyPropertyChanged(NameOf(SelTopPanel)) End Sub #End Region ' Fields & Properties #Region "CONSTRUCTOR" Sub New() Map.SetRefSceneButtonVM(Me) LoadButtons() LoadGroupButtons(TOPPANELLIST_BTN, m_TopPanelListGroupBtn) LoadGroupButtons("ParametricListBtn", m_ParametricListGroupBtn) End Sub #End Region ' Constructor #Region "METHODS" ''' ''' Funzione che carica i bottoni ''' Private Sub LoadButtons() SetButtonsLocation(TOPLIST_BTN, m_TopListBtn) SetButtonsLocation(LEFTLIST_BTN, m_LeftListBtn) SetButtonsLocation(RIGHTLIST_BTN, m_RightListBtn) SetButtonsLocation(BOTTOMLIST_BTN, m_BottomListBtn) SetButtonsLocation(BOTTOMCENTERLIST_BTN, m_BottomCenterListBtn) End Sub Private Sub LoadGroupButtons(NameList As String, GroupSceneBtnList As List(Of GroupSceneBtn)) Dim Index As Integer = 1 Dim SubTitle As String = String.Empty Dim sKeyTitle As String = NameList & "_" & Index.ToString() While GetMainPrivateProfileString(sKeyTitle, ConstEgtStone3D.SUBTITLE, "", SubTitle) > 0 SetGroupButtonsLocation(sKeyTitle, GroupSceneBtnList) Index += 1 sKeyTitle = NameList & "_" & Index.ToString() End While End Sub ''' ''' Funzione che permette di posizionare i bottoni letti da file ini ''' ''' ''' Private Sub SetButtonsLocation(PositionList As String, ListBtn As List(Of SceneBtn)) Dim Index As Integer = 1 Dim sBtnString As String = String.Empty While GetMainPrivateProfileString(PositionList, "Btn_" & Index.ToString, "", sBtnString) > 0 Dim sItems As String() = Split(sBtnString, ",") If sItems.Count < 3 Then ' Errore di configurazione comando: mancano dei parametri EgtOutLog("") Else If sItems(0) = "Button" Then ' Button ListBtn.Add(New _Button(sItems(1), sItems(2), sItems(3))) ElseIf sItems(0) = "ToggleButton" Then ' ToggelButton ListBtn.Add(New _ToggleButton(sItems(1), sItems(2), sItems(3))) ElseIf sItems(0) = "ButtonComboBox" And sItems.Count >= 4 Then ' Button che apre una combo box ListBtn.Add(New _ButtonComboBox(sItems(1), sItems(2), sItems(3), sItems(4))) End If End If Index += 1 sBtnString = String.Empty End While End Sub Private Sub SetGroupButtonsLocation(PositionList As String, ListGroupBtn As List(Of GroupSceneBtn)) Dim LocalListSceneBtn As New List(Of SceneBtn) Dim SubTitle As String = String.Empty Dim Title As String SetButtonsLocation(PositionList, LocalListSceneBtn) GetMainPrivateProfileString(PositionList, ConstEgtStone3D.SUBTITLE, "", SubTitle) Title = SplitSubTitle(SubTitle) ListGroupBtn.Add(New GroupSceneBtn(LocalListSceneBtn, Title)) End Sub Public Function IsTgBtnChecked(Flag As String) As Boolean ' cerco il bottone con il flag richiesto Dim Btn As _ToggleButton = GetButton(Flag) Dim bIsChecked As Boolean = False If Not IsNothing(Btn) Then bIsChecked = Btn.IsChecked ' restituisco la sua proprietà IsChecked Return bIsChecked End Function Public Function GetButton(Flag As String) As SceneBtn ' cerco il bottone con il flag richiesto Dim Btn As SceneBtn = m_BottomListBtn.FirstOrDefault(Function(x) x.Flag = Flag) If Not IsNothing(Btn) Then Return Btn Btn = m_RightListBtn.FirstOrDefault(Function(x) x.Flag = Flag) If Not IsNothing(Btn) Then Return Btn Btn = m_TopListBtn.FirstOrDefault(Function(x) x.Flag = Flag) If Not IsNothing(Btn) Then Return Btn Btn = m_LeftListBtn.FirstOrDefault(Function(x) x.Flag = Flag) If Not IsNothing(Btn) Then Return Btn Btn = m_BottomCenterListBtn.FirstOrDefault(Function(x) x.Flag = Flag) Return Btn End Function Private Function SplitSubTitle(SubTitle As String) As String Dim subTitleList As String() = SubTitle.Split("/"c) For IndexTitle As Integer = 0 To subTitleList.Count - 1 If IsNumeric(subTitleList(IndexTitle)) AndAlso Not EgtMsg(subTitleList(IndexTitle)).StartsWith("Msg") Then Return EgtMsg(subTitleList(IndexTitle)) Else Return subTitleList(IndexTitle + 1) End If Next Return String.Empty End Function ''' ''' Funzione per caricare l'user control ''' ''' User control generico Public Sub LoadUC(SceneUC As SceneUserControlV) If Not IsNothing(m_PairUC) Then RemoveUC(m_PairUC) If Not IsNothing(m_RotateUC) Then RemoveUC(m_RotateUC) If Not IsNothing(m_MoveUC) Then RemoveUC(m_MoveUC) If Not IsNothing(m_NewPanelUC) Then RemoveUC(m_NewPanelUC) If Not IsNothing(m_EditPanelUC) Then RemoveUC(m_EditPanelUC) If Not IsNothing(m_EditTopKUC) Then RemoveUC(m_EditTopKUC) If Not IsNothing(m_ParametricCompoUC) Then RemoveUC(m_ParametricCompoUC) Grid.SetColumn(SceneUC, 0) Grid.SetRow(SceneUC, 0) Grid.SetColumnSpan(SceneUC, 2) Grid.SetRowSpan(SceneUC, 5) Map.refSceneButtonV.MainGrid.Children.Add(SceneUC) End Sub ''' ''' Funzione per rimuovere l'user control ''' ''' User control generico Friend Sub RemoveUC(SceneUC As SceneUserControlV) Map.refSceneButtonV.MainGrid.Children.Remove(SceneUC) SceneUC = Nothing End Sub #End Region ' Methods End Class ' ------------------------------ GROUPSCENEBTN ------------------------------ Public Class GroupSceneBtn #Region "FIELDS & PROPERTIES" Private m_SubTitle As String Public Property SubTitle As String Get Return m_SubTitle End Get Set(value As String) m_SubTitle = value End Set End Property Private m_TopPanelListBtn As New List(Of SceneBtn) Public Property TopPanelListBtn As List(Of SceneBtn) Get Return m_TopPanelListBtn End Get Set(value As List(Of SceneBtn)) m_TopPanelListBtn = value End Set End Property #End Region ' Fields & Properties #Region "CONSTRUCTOR" Sub New(TopPanelListBtn As List(Of SceneBtn), sSubTitle As String) m_TopPanelListBtn = TopPanelListBtn m_SubTitle = sSubTitle End Sub #End Region ' Constructor End Class ' ------------------------------ SCENEBTN ------------------------------ Public Class SceneBtn Inherits VMBase #Region "FIELDS & PROPETIES" Private m_Name As String = String.Empty Public Property Name As String Get Return m_Name End Get Set(value As String) m_Name = value End Set End Property Private m_Img As String = String.Empty Public Property Img As String Get Return m_Img End Get Set(value As String) m_Img = value End Set End Property Private m_Flag As String = String.Empty Public Property Flag As String Get Return m_Flag End Get Set(value As String) m_Flag = value End Set End Property Private m_IsEnabled As Boolean = True Public Property IsEnabled As Boolean Get Return m_IsEnabled End Get Set(value As Boolean) m_IsEnabled = value End Set End Property #End Region ' Fields & Properties #Region "CONSTRUCTOR" Sub New(_Name As String, _Img As String, _Flag As String) m_Name = _Name m_Img = Map.refMainWindowVM.MainWindowM.sResourcesDir & "\" & _Img m_Flag = _Flag End Sub #End Region ' Constructor #Region "COMMANDS" #Region "CmdBtn" Private m_CmdBtn As ICommand Public ReadOnly Property CmdBtn As ICommand Get If m_CmdBtn Is Nothing Then m_CmdBtn = New Command(AddressOf MethodBtn) End If Return m_CmdBtn End Get End Property Private Sub MethodBtn() SceneCmd.Exec(m_Flag) End Sub #End Region ' CmdBtn #End Region ' Commands End Class ' ------------------------------ _BUTTON ------------------------------ Public Class _Button Inherits SceneBtn #Region "CONSTRUCTOR" Sub New(_Name As String, _Img As String, _Flag As String) MyBase.New(_Name, _Img, _Flag) End Sub #End Region ' Constructor End Class ' ------------------------------ _TOOGLEBUTTON ------------------------------ Public Class _ToggleButton Inherits SceneBtn #Region "FIELDS & PROPERTIES" Private m_IsChecked As Boolean = False Public Property IsChecked As Boolean Get Return m_IsChecked End Get Set(value As Boolean) m_IsChecked = value NotifyPropertyChanged(NameOf(IsChecked)) End Set End Property #End Region ' Fields & Properties #Region "CONSTRUCTOR" Sub New(_Name As String, _Img As String, _Flag As String) MyBase.New(_Name, _Img, _Flag) End Sub #End Region ' Constructor End Class ' ------------------------------ _BUTTONCOMBOBOX ------------------------------ Public Class _ButtonComboBox Inherits SceneBtn #Region "FIELDS & PROPERTIES" Private m_SourceList As New List(Of String) Public Property SourceList As List(Of String) Get Return m_SourceList End Get Set(value As List(Of String)) m_SourceList = value End Set End Property #End Region ' Fields & Properties #Region "CONSTRUCTOR" Sub New(_Name As String, _Img As String, _Flag As String, _PrototypeList As String) MyBase.New(_Name, _Img, _Flag) 'conversione da _PrototypeList a _List ''''' da implementare m_SourceList = New List(Of String)({"Becca", "Bacca", "Bionda", "Mora"}) 'm_SourceList = _List End Sub #End Region ' Constructor End Class ' ------------------------------ SCENECMD ------------------------------ Module SceneCmd #Region "METHODS" Public Function ExecFile(Flag As String, nVeinCtx As Integer, Optional dir As String = "") As Boolean Dim bNewParametricExsists As Boolean = False If Flag.Contains(".lua") Then If IsNothing(Map.refSceneButtonVM.m_ParametricCompoUC) Then Map.refSceneButtonVM.m_ParametricCompoUC = New SceneUserControlV Dim LocalParametricCompo As New ParametricCompoVM(Flag, nVeinCtx, dir) If LocalParametricCompo.bFileExsist Then Map.refSceneButtonVM.m_ParametricCompoUC.DataContext = LocalParametricCompo Map.refSceneButtonVM.LoadUC(Map.refSceneButtonVM.m_ParametricCompoUC) bNewParametricExsists = True End If End If Return bNewParametricExsists End Function Public Function ExecMethod(Flag As String, nVeinCtx As Integer) As Boolean Dim bNewMethodsExsists As Boolean = True Select Case Flag Case EGT_AUTOPAIR EgtSetCurrentContext(nVeinCtx) EgtLuaSetGlobIntVar("ASS.nVeinCtx", nVeinCtx) EgtLuaCallFunction("ASS.PairAll") Case EGT_UNPAIR SolidManagerM.Unpair(Map.refSceneHostVM.m_nIdPart) Case EGT_PAIR If IsNothing(Map.refSceneButtonVM.m_PairUC) Then Map.refSceneButtonVM.m_PairUC = New SceneUserControlV Map.refSceneButtonVM.m_PairUC.DataContext = New PairVM() Map.refSceneButtonVM.LoadUC(Map.refSceneButtonVM.m_PairUC) Case EGT_RESET_INTERS SolidManagerM.ResetInters() Case EGT_ROTATE If IsNothing(Map.refSceneButtonVM.m_RotateUC) Then Map.refSceneButtonVM.m_RotateUC = New SceneUserControlV Map.refSceneButtonVM.m_RotateUC.DataContext = New RotateVM() Map.refSceneButtonVM.LoadUC(Map.refSceneButtonVM.m_RotateUC) Case EGT_MOVE If IsNothing(Map.refSceneButtonVM.m_MoveUC) Then Map.refSceneButtonVM.m_MoveUC = New SceneUserControlV Map.refSceneButtonVM.m_MoveUC.DataContext = New MoveVM() Map.refSceneButtonVM.LoadUC(Map.refSceneButtonVM.m_MoveUC) Case EGT_UNDO Undo() Case EGT_REDO Redo() Case EGT_SEL_TYPE Map.refSceneButtonV.MenuSelType.IsOpen = True Case EGT_IMPORT_LOOP ImportLoop() Case EGT_CREATE_SOLID_LOOP SolidManagerM.CreateSolidFromLoops(Map.refSceneHostVM.m_nIdPart) Case EGT_PANEL If IsNothing(Map.refSceneButtonVM.m_NewPanelUC) Then Map.refSceneButtonVM.m_NewPanelUC = New SceneUserControlV Map.refSceneButtonVM.m_NewPanelUC.DataContext = New NewPanelVM() Map.refSceneButtonVM.LoadUC(Map.refSceneButtonVM.m_NewPanelUC) Map.refSceneHostVM.m_SelType = GDB_TY.CRV_LINE SolidManagerM.ShowLoopEdges() Case EGT_EXPORTPROJECT ExportProjectNge() Case EGT_DELETE SolidManagerM.Delete(Map.refSceneHostVM.m_nIdPart) Map.refSceneHostVM.m_nIdPart = GDB_ID.NULL Case EGT_EDIT_PANEL If IsNothing(Map.refSceneButtonVM.m_EditPanelUC) Then Map.refSceneButtonVM.m_EditPanelUC = New SceneUserControlV Map.refSceneButtonVM.m_EditPanelUC.DataContext = New EditPanelVM() Map.refSceneButtonVM.LoadUC(Map.refSceneButtonVM.m_EditPanelUC) Case EGT_EDIT_TOPK If IsNothing(Map.refSceneButtonVM.m_EditTopKUC) Then Map.refSceneButtonVM.m_EditTopKUC = New SceneUserControlV Map.refSceneButtonVM.m_EditTopKUC.DataContext = New EditTopKitchenVM() Map.refSceneButtonVM.LoadUC(Map.refSceneButtonVM.m_EditTopKUC) Case Else EgtOutLog("La chiamata del metodo '" & Flag & "' non è andata a buon fine") bNewMethodsExsists = False End Select Return bNewMethodsExsists End Function Public Sub Exec(Flag As String) Dim nVeinCtx As Integer = Map.refSceneHostVM.MainScene.GetCtx() If Not ExecFile(Flag, nVeinCtx) Then ExecMethod(Flag, nVeinCtx) End If End Sub Friend Sub Undo() ' se con questa operazione torno all'inizio disattivo il bottone undo SolidManagerM.UndoEvent() SolidManagerM.ManageUndoRedo() EgtDraw() End Sub Friend Sub Redo() ' se con questa operazione ho finito la storia disponibile disattivo il bottone redo SolidManagerM.RedoEvent() SolidManagerM.ManageUndoRedo() EgtDraw() End Sub ''' ''' Funzione che permette di importare un file nge ''' Private Sub ImportLoop() ' Recupero cartella dell'ultimo progetto aperto Dim sDir As String = String.Empty 'Map.refSceneHostVM.MainController.GetCurrFile() If String.IsNullOrWhiteSpace(sDir) Then GetMainPrivateProfileString(S_MRUFILES, K_FILE & 1, "", sDir) End If If Not String.IsNullOrWhiteSpace(sDir) Then sDir = System.IO.Path.GetDirectoryName(sDir) End If Dim ImportDialog As New EgtManageFileDialogV(Application.Current.MainWindow, New EgtManageFileDialogVM()) With { .Title = EgtMsg(91127), ' Importa .Filter = "nge files (*.nge)|*.nge", .FilterIndex = 1, .InitialDirectory = sDir, .Mode = 1 } If Not ImportDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then Return If String.IsNullOrEmpty(ImportDialog.FileName) Then Return Dim sFilePath As String = ImportDialog.FileName Map.refSceneHostVM.MainController.InsertProject(sFilePath, False) ' rinomino il part aggiungendo un UUID Dim nPart As Integer = EgtGetLastPart() Dim sName As String = String.Empty EgtGetName(nPart, sName) Dim sUUID As String = "" EgtLuaCallFunction("TOOL.GetNewUUID") EgtLuaGetGlobStringVar("TOOL.UUID", sUUID) If sName <> String.Empty Then sName = sUUID & "_" & sName Else sName = sUUID & "_ImportedLoop" End If EgtSetName(nPart, sName) Dim nRefLay As Integer = EgtCreateGroup(nPart) EgtSetName(nRefLay, "Ref") End Sub Public Sub EnableActionButtons() 'If (m_nIdPart = GDB_ID.NULL) Then Return ''abilito i bottoni che possono eseguire delle azioni 'Dim PartSolidSel As PartSolid = GetPartSolid(m_nIdPart) 'If Not IsNothing(PartSolidSel) And PartSolidSel.IsPaired() Then ' UnpairBtn.IsEnabled = True ' ExplodeBtn.IsEnabled = True ' ExplodeNormalsBtn.IsEnabled = True 'End If End Sub Public Sub DisableActionButtons() ''disabilito tutti i bottoni che eseguono azioni sul pezzo selezionato 'UnpairBtn.IsEnabled = False 'ExplodeBtn.IsEnabled = False 'ExplodeNormalsBtn.IsEnabled = False End Sub Public Function DeselectAll() As Boolean Dim bDeselected As Boolean = True Dim nOriId As Integer = GDB_ID.NULL For Each PartSolidSel In m_PartSolidList '' deseleziono nel nesting 'EgtGetInfo(PartSolidSel.PartId, KEY_ORI_ID, nOriId) 'If EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) AndAlso EgtExistsObj(nOriId) Then ' If Not (OmagOFFICEMap.refNestingTabVM.DeselectPart(nOriId, False)) Then ' bDeselected = False ' End If 'End If EgtSetCurrentContext(m_nVeinCtx) PartSolidSel.DeselectPart() Next Map.refSceneHostVM.m_nIdPart = GDB_ID.NULL DisableActionButtons() Return bDeselected End Function Public Sub AddPanel(nId As Integer) Dim NewPanelVM As NewPanelVM = DirectCast(Map.refSceneButtonVM.m_NewPanelUC.DataContext, NewPanelVM) NewPanelVM.AddPanel(nId) End Sub Public Sub ExportProjectNge() ' creo una copia del contesto corrente Dim sSavePath As String = "C:\EgtData\EgtStone3D\Temp\export.nge" EgtSaveFile(sSavePath, 2) Dim nTempContext As Integer = EgtInitContext() ' setto il contesto temporaneo come corrente EgtSetCurrentContext(nTempContext) EgtOpenFile(sSavePath) Dim nPart As Integer = EgtGetFirstPart() Dim HorizontalOffset As Double = 0 While nPart <> GDB_ID.NULL Dim nNextPart As Integer = EgtGetNext(nPart) Dim sName As String = String.Empty EgtGetName(nPart, sName) If sName = "SOLID" Then EgtErase(nPart) Else ' accendo il part e il layer della regione EgtSetStatus(nPart, GDB_ST.ON_) Dim nRefLay As Integer = EgtGetFirstNameInGroup(nPart, "Region") EgtSetStatus(nRefLay, GDB_ST.ON_) ' riporto il part nell'origine EgtChangeGroupFrame(nPart, New Frame3d()) ' lo posiziono affiancato agli altri Dim vtMove As New Vector3d(HorizontalOffset, 0, 0) EgtMove(nPart, vtMove, GDB_RT.GLOB) Dim BBox As New BBox3d EgtGetBBoxGlob(nPart, 0, BBox) HorizontalOffset += BBox.DimX + 5 ' pulisco le info di accoppiamento EgtSetInfo(nPart, "Paired", "") End If nPart = nNextPart End While Dim nInfoLay As Integer = EgtCreateGroup(GDB_ID.ROOT) EgtSetLevel(nInfoLay, GDB_LV.SYSTEM) EgtSetName(nInfoLay, "EgtStone3D") EgtSaveFile(sSavePath, 2) ' reimposto il contesto della scena principale e cancello il contesto temporaneo EgtSetCurrentContext(SolidManagerM.m_nVeinCtx) EgtDeleteContext(nTempContext) End Sub #End Region ' Methods End Module ' ------------------------------ SPLITCONVERTER ------------------------------ Public Class SplitConverter Implements IValueConverter Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert Dim sParam() As String = DirectCast(parameter, TextBlock).Text.Split("_"c) Dim dParam As Double = CDbl(Map.refSceneButtonVM.TopPanelListGroupBtn(CInt(sParam(1))).TopPanelListBtn.Count()) + 1 Return (Math.Floor(dParam / 2)) * 35 End Function Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack Throw New NotImplementedException End Function End Class