using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Windows.Controls; using System.Windows.Data; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Sai.Database.Shared; using Sai.RvKits.Operation; using SZBIM.StandardTools; namespace Sai.Common.Shared.WBSCoder { /// /// 主窗口viewmodel /// public partial class CheckCodeViewModel : ObservableObject { public CheckCodeViewModel(UIDocument uidoc, SqliteUtil sqliteUtil) { SqliteUtil = sqliteUtil; Uidoc = uidoc; Index = 0; Init(archiDatabase); } public const int WM_CLOSE = 0x10; private readonly string archiDatabase = $"{RelativePaths.DirAssembly}\\Database\\ArchiWBSCode.db"; private readonly string metroDatabase = $"{RelativePaths.DirAssembly}\\Database\\MetroWBSCode.db"; public readonly SqliteUtil SqliteUtil; [ObservableProperty] private System.Windows.Media.ImageSource icon; [ObservableProperty] private string projectPath; public IList AllElements => GetElementInstances(); public int? Index { get; set; } public ObservableCollection LastTaskItems { get; set; } = new(); public ObservableCollection EngineerCategories { get; set; } = new(); public UIDocument Uidoc { get; set; } /// /// 获取项目中所有实例 /// /// public IList GetElementInstances() { if (Uidoc == null) { return null; } ElementClassFilter hostObjFilter = new ElementClassFilter(typeof(HostObject)); ElementClassFilter instanceFilter = new ElementClassFilter(typeof(FamilyInstance)); LogicalOrFilter logicalOrFilter = new LogicalOrFilter(hostObjFilter, instanceFilter); var elems = new FilteredElementCollector(Uidoc.Document).WherePasses(logicalOrFilter).ToElements(); return elems; } [RelayCommand] private void Closed() { SqliteUtil.CloseConnection(); var win = WinIntPtr.FindWindow(null, "打开Project文件"); WinIntPtr.SendMessage(win, WM_CLOSE, 0, 0); } [RelayCommand] private void GetDataBase(object obj) { System.Windows.Controls.ComboBox cbb = obj as System.Windows.Controls.ComboBox; Index = cbb?.SelectedIndex; switch (Index) { case 0: Init(archiDatabase); break; case 1: Init(metroDatabase); break; } } private void Init(string database) { //SqliteUtil.CloseConnection(); try { SqliteUtil.CreateDb(database); var categories = (from array in SqliteUtil.QueryTable("CATEGORY") select new WBSData { Name = array[4], WbsCode = array[3], HierarchicalCode = array[2] }).ToList(); EngineerCategories.Clear(); foreach (var wbsData in categories) { EngineerCategories.Add(wbsData); } } catch (Exception e) { Console.WriteLine(e); throw; } } [RelayCommand] private void OpenProjectFileDialog() { const string filter = "项目(*.mpp)|*.mpp"; FileOpenDialog openFileDialog = new FileOpenDialog(filter) { DefaultFilterEntry = filter, ShowPreview = true, Title = "打开Project文件" }; if (openFileDialog.Show() == ItemSelectionDialogResult.Confirmed) { ModelPath mp = openFileDialog.GetSelectedModelPath(); ProjectPath = ModelPathUtils.ConvertModelPathToUserVisiblePath(mp); ProjectUtil.GetTasks(ProjectPath, LastTaskItems); } } [RelayCommand] private static void SearchData(object obj) { if (!(obj is object[] multiObj)) return; DataGrid dataGrid = multiObj[0] as DataGrid; System.Windows.Controls.TextBox textBox = multiObj[1] as System.Windows.Controls.TextBox; var cvs = CollectionViewSource.GetDefaultView(dataGrid.ItemsSource); if (cvs != null && cvs.CanFilter) { cvs.Filter = p => { TaskItem task = p as TaskItem; return task.Name.Contains(textBox.Text); }; } } } }