添加项目文件。
This commit is contained in:
194
IFCReader/MainWindow.xaml.cs
Normal file
194
IFCReader/MainWindow.xaml.cs
Normal file
@@ -0,0 +1,194 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
using Microsoft.Win32;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
|
||||
using Xbim.Ifc;
|
||||
using Xbim.Ifc2x3.PropertyResource;
|
||||
using Xbim.Ifc4.Interfaces;
|
||||
using Xbim.Ifc4.Kernel;
|
||||
using Xbim.Ifc4.ProductExtension;
|
||||
using Xbim.Ifc4.PropertyResource;
|
||||
|
||||
namespace IFCReader
|
||||
{
|
||||
/// <summary>
|
||||
/// MainWindow.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class MainWindow : Window
|
||||
{
|
||||
public StringBuilder Message { get; private set; } = new();
|
||||
public string JsonMessage { get; private set; }
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void ReadIFC(string fileName)
|
||||
{
|
||||
var model = IfcStore.Open(fileName);
|
||||
List<IFCElement> elements = new();
|
||||
var collection = model.Instances.OfType<IIfcElement>();
|
||||
foreach (var obj in collection)
|
||||
{
|
||||
Message.AppendLine("构件分割线----------------------------构件分割线");
|
||||
Message.AppendLine(obj.Name);
|
||||
|
||||
IFCElement element = new() { Name = obj.Name };
|
||||
elements.Add(element);
|
||||
//类型属性
|
||||
var typeGroups = obj.IsTypedBy.SelectMany(r => r.RelatingType.HasPropertySets);
|
||||
foreach (var property in typeGroups)
|
||||
{
|
||||
if (property is IIfcPropertySet group)
|
||||
{
|
||||
Message.AppendLine($"<类型属性分组>: {group.Name}-------------------");
|
||||
var ps = group.PropertySetDefinitions.OfType<IIfcPropertySet>().SelectMany(pset => pset.HasProperties);
|
||||
Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
|
||||
element.Groups.Add(new Group() { Name = group.Name, Properties = keyValuePairs });
|
||||
|
||||
foreach (var item in ps)
|
||||
{
|
||||
if (item is IIfcPropertySingleValue propSingle)
|
||||
{
|
||||
Message.AppendLine($"<类型属性>: {propSingle.Name}, <值>: {propSingle.NominalValue}");
|
||||
//element.Groups.Add(propSingle.Name, propSingle.NominalValue.ToString());
|
||||
keyValuePairs.Add(propSingle.Name, propSingle.NominalValue.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
//if (group is IIfcPropertySet propertySet)
|
||||
//{
|
||||
// Message.AppendLine($"Set:{propertySet.Name}, Value:{propertySet.PropertySetDefinitions}");
|
||||
//}
|
||||
}
|
||||
//实例属性
|
||||
|
||||
var insGroups = obj.IsDefinedBy.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions);
|
||||
////在这种情况下, 只考虑属性集。
|
||||
//.OfType<IIfcPropertySet>();
|
||||
////从所有属性集中获取所有属性
|
||||
//.SelectMany(pset => pset.HasProperties);
|
||||
//分组
|
||||
|
||||
foreach (var group in insGroups)
|
||||
{
|
||||
Message.AppendLine($"<实例属性分组>: {group.Name}");
|
||||
var ps = group.PropertySetDefinitions.OfType<IIfcPropertySet>().SelectMany(pset => pset.HasProperties);
|
||||
Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
|
||||
element.Groups.Add(new Group() { Name = group.Name, Properties = keyValuePairs });
|
||||
|
||||
foreach (var item in ps)
|
||||
{
|
||||
if (item is IIfcPropertySingleValue propSingle)
|
||||
{
|
||||
Message.AppendLine($"<实例属性>: {propSingle.Name}, <值>: {propSingle.NominalValue}");
|
||||
//element.Groups.Add(propSingle.Name, propSingle.NominalValue.ToString());
|
||||
keyValuePairs.Add(propSingle.Name, propSingle.NominalValue.ToString());
|
||||
}
|
||||
}
|
||||
//if (group is IIfcPropertySet propertySet)
|
||||
//{
|
||||
// Message.AppendLine($"Set:{propertySet.Name}, Value:{propertySet.PropertySetDefinitions}");
|
||||
//}
|
||||
}
|
||||
|
||||
//var setting = new JsonSerializerSettings();
|
||||
//setting.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
|
||||
//setting.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
|
||||
//JsonMessage += JsonConvert.SerializeObject(insGroups, setting);
|
||||
}
|
||||
JsonMessage = JsonConvert.SerializeObject(elements, Formatting.Indented);
|
||||
//var setting = new JsonSerializerSettings();
|
||||
//setting.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
|
||||
//setting.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
|
||||
//JsonMessage = JsonConvert.SerializeObject(collection, setting);
|
||||
}
|
||||
|
||||
private void OpenFile(object sender, RoutedEventArgs e)
|
||||
{
|
||||
OpenFileDialog dialog = new OpenFileDialog() { Filter = "IFC文件|*.ifc", Multiselect = false };
|
||||
if (dialog.ShowDialog() == true)
|
||||
{
|
||||
IfcFilePath.Text = dialog.FileName;
|
||||
ReadIFC(dialog.FileName);
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteJosn(object sender, RoutedEventArgs e)
|
||||
{
|
||||
WriteJsonFile(JsonMessage);
|
||||
}
|
||||
|
||||
private void WriteJsonFile(string jsonMessage)
|
||||
{
|
||||
var filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\属性信息.json";
|
||||
|
||||
using (FileStream fs = new FileStream(filePath, FileMode.Create))
|
||||
{
|
||||
//写入
|
||||
using (StreamWriter sw = new StreamWriter(fs))
|
||||
{
|
||||
sw.WriteLine(jsonMessage);
|
||||
}
|
||||
}
|
||||
System.Diagnostics.Process.Start(filePath);
|
||||
}
|
||||
|
||||
private void WriteTxt(object sender, RoutedEventArgs e)
|
||||
{
|
||||
WriteTextFile(Message);
|
||||
}
|
||||
|
||||
public void WriteTextFile(StringBuilder sb, string fileName = "IFC属性集")
|
||||
{
|
||||
var filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + $"\\{fileName}.txt";
|
||||
File.WriteAllText(filePath, sb.ToString());
|
||||
System.Diagnostics.Process.Start(filePath);
|
||||
}
|
||||
}
|
||||
|
||||
public class IFCElement
|
||||
{
|
||||
[JsonProperty("元素")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[JsonProperty("属性")]
|
||||
public List<Group> Groups { get; set; } = new();
|
||||
}
|
||||
|
||||
public class Group
|
||||
{
|
||||
[JsonProperty("分组名称")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[JsonProperty("参数")]
|
||||
public Dictionary<string, string> Properties = new Dictionary<string, string>();
|
||||
}
|
||||
|
||||
public class Property
|
||||
{
|
||||
[JsonProperty("参数")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[JsonProperty("值")]
|
||||
public string Value { get; set; }
|
||||
}
|
||||
//public record Property(string Key, string Value);
|
||||
}
|
||||
Reference in New Issue
Block a user