Загрузка данных
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Win32;
using Xbim.Ifc;
using Xbim.Ifc4.Interfaces;
namespace IfcBimEditor
{
public partial class MainWindow : Window
{
private IfcStore _model;
private string _openedPath;
public MainWindow() { InitializeComponent(); }
private List<IIfcObject> Selected => ElementsList.SelectedItems
.Cast<ElementItem>().Select(x => x.Element).ToList();
private void Open_Click(object sender, RoutedEventArgs e)
{
var dialog = new OpenFileDialog { Filter = "IFC (*.ifc)|*.ifc" };
if (dialog.ShowDialog() != true) return;
try
{
Viewer.Model = null;
_model?.Dispose();
_model = IfcStore.Open(dialog.FileName);
_openedPath = dialog.FileName;
// Создание геометрии для отображения.
var context = new Xbim.ModelGeometry.Scene.Xbim3DModelContext(_model);
context.CreateContext();
Viewer.Model = _model;
Viewer.ReloadModel();
ElementsList.ItemsSource = _model.Instances.OfType<IIfcObject>()
.Select(x => new ElementItem { Element = x }).OrderBy(x => x.Display).ToList();
StatusText.Text = $"Открыт: {_openedPath}";
}
catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка открытия"); }
}
private void ElementsList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var selected = Selected;
SelectedCount.Text = $"Выбрано: {selected.Count}";
var item = selected.FirstOrDefault();
if (item == null) { PropertiesGrid.ItemsSource = null; return; }
var rows = new List<PropertyRow>
{
new PropertyRow { Group = "IFC", Name = "Class", Value = item.ExpressType.Name },
new PropertyRow { Group = "IFC", Name = "GlobalId", Value = item.GlobalId.ToString() },
new PropertyRow { Group = "IFC", Name = "Name", Value = item.Name?.ToString() ?? "" }
};
foreach (var rel in item.IsDefinedBy.OfType<IIfcRelDefinesByProperties>())
if (rel.RelatingPropertyDefinition is IIfcPropertySet ps)
foreach (var prop in ps.HasProperties.OfType<IIfcPropertySingleValue>())
rows.Add(new PropertyRow { Group = ps.Name?.ToString(),
Name = prop.Name.ToString(), Value = prop.NominalValue?.ToString() });
PropertiesGrid.ItemsSource = rows;
}
private void Similar_Click(object sender, RoutedEventArgs e)
{
if (_model == null || Selected.Count == 0) return;
var similar = IfcEditor.FindSimilar(_model, Selected[0], MatchMode.SelectedIndex)
.Select(x => x.GlobalId.ToString()).ToHashSet();
ElementsList.SelectedItems.Clear();
foreach (ElementItem item in ElementsList.Items)
if (similar.Contains(item.Element.GlobalId.ToString()))
ElementsList.SelectedItems.Add(item);
StatusText.Text = $"Найдено подобных элементов: {similar.Count}";
}
private void Apply_Click(object sender, RoutedEventArgs e)
{
if (_model == null || Selected.Count == 0) { MessageBox.Show("Выберите элементы."); return; }
var pset = PsetInput.Text.Trim();
var prop = PropertyInput.Text.Trim();
if (pset.Length == 0 || prop.Length == 0) { MessageBox.Show("Укажите Pset и имя свойства."); return; }
if (MessageBox.Show($"Изменить {prop} у {Selected.Count} элементов?",
"Подтверждение", MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
try
{
var count = IfcEditor.SetStringProperty(_model, Selected, pset, prop,
ValueInput.Text, CreateMissing.IsChecked == true);
StatusText.Text = $"Изменено элементов: {count}. Сохраните IFC.";
ElementsList_SelectionChanged(null, null);
}
catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка изменения"); }
}
private void Save_Click(object sender, RoutedEventArgs e)
{
if (_model == null) return;
var dialog = new SaveFileDialog { Filter = "IFC (*.ifc)|*.ifc",
FileName = System.IO.Path.GetFileNameWithoutExtension(_openedPath) + "_edited.ifc" };
if (dialog.ShowDialog() != true) return;
if (string.Equals(dialog.FileName, _openedPath, StringComparison.OrdinalIgnoreCase))
{ MessageBox.Show("Выберите новое имя файла для сохранения."); return; }
try { _model.SaveAs(dialog.FileName); StatusText.Text = "Сохранено: " + dialog.FileName; }
catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка сохранения"); }
}
protected override void OnClosed(EventArgs e) { _model?.Dispose(); base.OnClosed(e); }
public sealed class PropertyRow { public string Group { get; set; } public string Name { get; set; } public string Value { get; set; } }
}
}