using Editor.AppManager; using Editor.CommandControl.ViewModel; using Editor.CommandCore; using Editor.CommandCustom; using Editor.PluginInterface; using Editor.WidzetPluginInterface; using EditorCore; using EGModeler.Controls; using EGModeler.ViewModels; using HmEG; using HmEG.Controls; using MahApps.Metro.Controls; using System.Diagnostics; using System; using System.Globalization; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; namespace EGModeler { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : MetroWindow { private ECommandManager ECommandManager { get => ECommandManager.GetCommandManager(0); } private SnapAssist? _snap; public MainWindow() { //테마 테스트 //ThemeManager.Instance.SwitchTheme(ThemeType.ColorThemeBlack); InitializeComponent(); MainWindowLoadingHelper.Instance.IsInitialized = true; this.DataContext = MainWindowViewModel.Instance; WidzetPlugin.AttachWidzet(); HmEGAppManager.GetAppManager(0).SettingManager.PropertyChanged += PropertyChanged; //#if !DEBUG //모델러 모드 강제 (배포 전 작업, 주석 해제 후 사용) // HmEGAppManager.GetAppManager(0).SettingManager.ModelerMode = ModelerMode.ModelingNViewing; //#endif _snap = new SnapAssist(this); _snap.Attach(); } private void PropertyChanged(object? sender, System.Reflection.PropertyInfo e) { if(e.Name.Equals("IsSidePanelVisible")) { var MainViewportGrid = this.FindChild("MainViewportGrid"); var isShow = HmEGAppManager.GetAppManager(0).SettingManager.IsSidePanelVisible; if(isShow) { MainViewportGrid.ColumnDefinitions[1].Width = new GridLength(2); MainViewportGrid.ColumnDefinitions[2].Width = new GridLength(MainViewportGrid.ColumnDefinitions[2].Width.Value, GridUnitType.Auto); MainViewportGrid.ColumnDefinitions[2].MinWidth = 370; } else { MainViewportGrid.ColumnDefinitions[1].Width = new GridLength(0); MainViewportGrid.ColumnDefinitions[2].Width = new GridLength(0); MainViewportGrid.ColumnDefinitions[2].MinWidth = 0; } } //#if !DEBUG //모델러 모드 강제 (배포 전 작업, 주석 해제 후 사용) // if (e.Name.Equals("ModelerMode")) // { // var mode = HmEGAppManager.GetAppManager(0).SettingManager.ModelerMode; // if (mode != ModelerMode.ModelingNViewing) // { // HmEGAppManager.GetAppManager(0).SettingManager.ModelerMode = ModelerMode.ModelingNViewing; // HmEGAppManager.GetAppManager(0).UpdateSettingJson(); // } // } //#endif } private void titleBar_Loaded(object sender, System.Windows.RoutedEventArgs e) { if(sender != null) { this.TitleBarHeight = (int)((System.Windows.Controls.UserControl)sender).ActualHeight; } } GridLength tmpHeight; GradientTransparencySettingPanel gradientTransparencySettingPanel = new GradientTransparencySettingPanel(); private AdornerLayer _adornerLayer; private CustomAdorner _adorner; private void MainWindow_Loaded(object sender, System.Windows.RoutedEventArgs e) { _adornerLayer = AdornerLayer.GetAdornerLayer(settingOptionPanel); if (_adorner != null) { _adornerLayer.Remove(_adorner); _adorner = null; return; } ScrollContentPresenter scrollPresenter = new ScrollContentPresenter { Content = gradientTransparencySettingPanel }; _adorner = new CustomAdorner(settingOptionPanel, scrollPresenter); _adornerLayer.Add(_adorner); var MainWindowContentGrid = this.FindChild("MainWindowContentGrid"); if (MainWindowContentGrid != null) { MainWindowContentGrid.RowDefinitions[2].Height = new GridLength(HmEGAppManager.GetAppManager(0).SettingManager.MainCommandPanelHeight); tmpHeight = MainWindowContentGrid.RowDefinitions[2].Height; } var screens = System.Windows.Forms.Screen.AllScreens; //뷰포트가 전부 로드되면 로딩창 닫는다. var viewports = this.FindChildren(); foreach(var viewport in viewports) { viewCount++; viewport.OnRendered += Viewport_OnRendered; } if (HmEGAppManager.GetAppManager(0).SettingManager.IsSecondWindowOn) { var secondWindow = new SecondWindow(); var primaryScreen = screens.FirstOrDefault(s => s.Primary); if (primaryScreen != null) { var secondaryScreen = screens .Where(s => s.Bounds.X > primaryScreen.Bounds.X) .OrderBy(s => s.Bounds.X) .FirstOrDefault(); Dispatcher.BeginInvoke(new Action(() => { var dpi = GetDpiForScreen(); if (secondaryScreen != null) { secondWindow.Left = (secondaryScreen.WorkingArea.Left) / dpi; secondWindow.Top = (secondaryScreen.WorkingArea.Top) / dpi; } else { secondWindow.Left = (primaryScreen.WorkingArea.Left) / dpi; secondWindow.Top = (primaryScreen.WorkingArea.Top) / dpi; } secondWindow.Show(); })); } else { secondWindow.Show(); } var viewports2 = secondWindow.FindChildren(); if (HmEGAppManager.GetAppManager(0).SettingManager.IsSecondWindowOn) { //세컨드윈도우 활성화를위한 foreach (var viewport in viewports2) { viewCount2++; viewport.OnRendered += Viewport_OnRendered2; } } else { foreach (var viewport in viewports2) { HmEGAppManager.GetAppManager(0).UnRegisterViewport(viewport); } } } totalViewCount = viewCount + viewCount2; MainWindowLoadingHelper.Instance.IsLoaded = true; Application.Current.MainWindow = this; IsSetLayout = true; CommandPanelViewModel.IncludedControls.Add(this); } private int totalViewCount = 0; //로드안된 뷰포트 수 private int viewCount = 0; private async void Viewport_OnRendered(object? sender, EventArgs e) { var host = (DX11ImageSourceRenderHost)sender; ((EGViewport)host.Viewport).OnRendered -= Viewport_OnRendered; viewCount--; totalViewCount--; if (totalViewCount == 0) { if (App.LoadingWindow != null) { if (App.LoadingWindow.Dispatcher.CheckAccess()) App.LoadingWindow.Close(); else App.LoadingWindow.Dispatcher.Invoke(() => App.LoadingWindow.Close()); } ResourceManager.Instance.GetMaterialImages(); } if (viewCount == 0) { try { await PluginLoader.LoadProjectPluginsAsync(); } catch (Exception ex) { } //모든 뷰포트가 로드되면 로딩창 닫기전에 메인창 활성화 - 안하면 뒤로간다 this.Activate(); HmEGAppManager.GetAppManager(0).StartupCommandManager.ExecuteStartCommands(); HmEG_DebugWidzetPlugin.AttachDebugTabs(); Conference_DebugWidzetPlugin.AttachDebugTabs(); } } //로드안된 두번째 윈도우 뷰포트 수 private int viewCount2 = 0; private void Viewport_OnRendered2(object? sender, EventArgs e) { var host = (DX11ImageSourceRenderHost)sender; ((EGViewport)host.Viewport).OnRendered -= Viewport_OnRendered2; viewCount2--; totalViewCount--; //뷰포트가 로드되면 활성화 if (viewCount2 == 0) { Window.GetWindow((EGViewport)host.Viewport).Activate(); } if (totalViewCount == 0) { App.LoadingWindow.Dispatcher.Invoke(() => { App.LoadingWindow.Close(); //App.LoadingWindow.Dispatcher.InvokeShutdown(); }); ResourceManager.Instance.GetMaterialImages(); } } private double GetDpiForScreen() { var source = PresentationSource.FromVisual(this); var matrix = source.CompositionTarget.TransformToDevice; double dpi = matrix.M11 * 96.0; return dpi / 96.0; } private void ViewPortPanel_DragEnter(object sender, System.Windows.DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effects = DragDropEffects.Copy; } else { e.Effects = DragDropEffects.None; } } List targetFiles; readonly Dictionary extensions = new Dictionary() { { "HANMAC Engineering Format", ".hmeg" }, { "AutoCAD Drawing", ".dwg" }, { "AutoCAD Drawing Exchange", ".dxf" }, { "GRIMI Drawing File", ".grm" }, { "Wavefront Object Format", ".obj" }, //{ "Rhino 3D Model", ".3dm" }, { "WPB File", ".wpb" }, { "WPB_IFC File", ".wpb_ifc" }, { "Industry Foundation Classes", ".ifc" }, { "Triangulated Irregular Network", ".tins" }, { "3D Studio", ".3ds" }, { "Collada File", ".dae" }, { "MotionBuilder", ".fbx" }, { "glTF Binary File", ".glb" }, { "glTF Text File", ".gltf" }, { "XML File", ".xml" }, }; private void ViewPortPanel_Drop(object sender, System.Windows.DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); var allowedExtensions = extensions.Values.Select(ext => ext.ToLower()).ToList(); var validFiles = files.Where(file => { string extension = System.IO.Path.GetExtension(file).ToLower(); return allowedExtensions.Contains(extension); }).ToArray(); if (validFiles.Length > 1) { if (!LoadingWindowHelperThread.Instance.IsOpen) LoadingWindowHelperThread.Instance.Open(); var sb = new StringBuilder(); sb.Append("! ImportByPath "); for (int i = 0; i < files.Count(); i++) { sb.Append("\"" + files[i] + "\""); if (i != files.Count() - 1) sb.Append("\u001F,"); } ECommandManager.ExcuteCommand(sb.ToString()); } else if(validFiles.Length == 1) { string file = validFiles[0]; var owner = Application.Current.Windows.OfType().FirstOrDefault(); MessageBoxResult result; if (owner != null) { result = MessageBox.Show( owner, "파일을 Import 하시겠습니까?\n'아니오'를 선택하면 Open됩니다.", "파일 처리 옵션", MessageBoxButton.YesNoCancel, MessageBoxImage.Question ); } else { result = MessageBox.Show( "파일을 Import 하시겠습니까?\n'아니오'를 선택하면 Open됩니다.", "파일 처리 옵션", MessageBoxButton.YesNoCancel, MessageBoxImage.Question ); } if (result == MessageBoxResult.Yes) { if (!LoadingWindowHelperThread.Instance.IsOpen) LoadingWindowHelperThread.Instance.Open(); var sb = new StringBuilder(); sb.Append("! ImportByPath "); foreach (var vfile in validFiles) { sb.Append("\"" + vfile + "\""); } ECommandManager.ExcuteCommand(sb.ToString()); } else if (result == MessageBoxResult.No) { HmEGAppManager.GetAppManager(0).FileManager.Open(file); } } } } bool IsSetLayout; private void CommandPanel_SizeChanged(object sender, SizeChangedEventArgs e) { var MainWindowContentGrid = this.FindChild("MainWindowContentGrid"); if (MainWindowContentGrid != null & IsSetLayout) { HmEGAppManager.GetAppManager(0).SettingManager.MainCommandPanelHeight = MainWindowContentGrid.RowDefinitions[2].Height.Value; tmpHeight = MainWindowContentGrid.RowDefinitions[2].Height.Value < 100 ? tmpHeight : MainWindowContentGrid.RowDefinitions[2].Height; HmEGAppManager.GetAppManager(0).UpdateSettingJson(); return; } } private void GridSplitter_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) { var MainWindowContentGrid = this.FindChild("MainWindowContentGrid"); if (MainWindowContentGrid != null) { if(MainWindowContentGrid.RowDefinitions[2].Height.Value == 0) { MainWindowContentGrid.RowDefinitions[2].Height = tmpHeight; } else { MainWindowContentGrid.RowDefinitions[2].Height = new GridLength(0); } } } } public class BoolToParameterConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is bool boolValue) { if (boolValue) { if (parameter != null) { return ConvertParameter(parameter, targetType); } return 0; } else { return 0; } } return 0; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException("ConvertBack is not implemented."); } private object ConvertParameter(object parameter, Type targetType) { if (parameter is string paramString) { if (targetType == typeof(double)) return double.TryParse(paramString, out double result) ? result : 0; if (targetType == typeof(int)) return int.TryParse(paramString, out int result) ? result : 0; if (targetType == typeof(GridLength)) return double.TryParse(paramString, out double result) ? new GridLength(result) : new GridLength(0); } return parameter; } } }