Files
SzmediTools/Szmedi.RvKits/FamilyTools/MassSaveFamiliesWin.xaml.cs

463 lines
17 KiB
C#
Raw Permalink Normal View History

2025-09-16 16:06:41 +08:00

using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using Szmedi.RvKits.Assists.ProgressWrapper;
using Szmedi.RvKits.Models;
namespace Szmedi.RvKits.MassSaveFamily
{
/// <summary>
/// MassSaveFamiliesWin.xaml 的交互逻辑
/// </summary>
public partial class MassSaveFamiliesWin
{
private readonly IList<TreeModel> familyNodes = [];
private readonly List<DocumentItem> docsFromListWpf = [];
private readonly UIApplication uiapp;
private Document docFrom;
private string docFromName;
public MassSaveFamiliesWin(UIApplication uiapp)
{
//this.uidoc = uidoc;
this.uiapp = uiapp;
InitializeComponent();
}
/// <summary>
/// 将族列表绑定到树状结构
/// </summary>
private void AddFamilyToTreeView()
{
try
{
foreach (Document selectedDoc in uiapp.Application.Documents)
{
if (!selectedDoc.IsLinked)
{
if (cbbFrom.SelectedValue.ToString() == selectedDoc.Title)
{
List<TreeModel> familiesTree = [];
#region
var categories = selectedDoc.Settings.Categories;
var familiesCollector = new FilteredElementCollector(selectedDoc).OfClass(typeof(Family)).OfType<Family>().Where(f => !f.IsInPlace && f.IsEditable);
var familiesSymbolCollector = new FilteredElementCollector(selectedDoc).OfClass(typeof(FamilySymbol));
//List<ElementId> dimensionTypeId = (from Element i in new FilteredElementCollector(selectedDoc).QueryElementsByType(typeof(DimensionType)) select i.Id).ToList();
//var elementTypes = new FilteredElementCollector(selectedDoc).QueryElementsByType(typeof(TypeName));
//ElementClassFilter familysymbolfilter = new ElementClassFilter(typeof(FamilySymbol));
//ElementClassFilter hostsymbolFilter = new ElementClassFilter(typeof(HostObjAttributes));
//LogicalOrFilter andfilter = new LogicalOrFilter(familysymbolfilter, hostsymbolFilter);
//var familiesSymbolCollector = new FilteredElementCollector(selectedDoc).WherePasses(andfilter);
foreach (Category category in categories)
{
TreeModel familyCategoryNode =
new()
{
//familyCategory.Id = category.Name;
Name = category.Name,
IsExpanded = false
};
foreach (var family in familiesCollector)
{
if (family.FamilyCategory.Name == category.Name)
{
TreeModel familyNode =
new()
{
//familyNode.Id = family.Name;
Name = family.Name,
IsExpanded = false,
Parent = familyCategoryNode
};
familyCategoryNode.Children.Add(familyNode);
familyNodes.Add(familyNode);
}
}
if (familyCategoryNode.Children.Count != 0)
{
familiesTree.Add(familyCategoryNode);
}
}
#endregion
familiesTree.Sort();
FamilyTreeView.ItemsSourceData = familiesTree;
//FamilyTreeView.UpdateLayout();
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void btnPathChoose_Click(object sender, RoutedEventArgs e)
{
FolderBrowserDialog dialog = new();
//dialog.DetailDescription = "请选择文件路径";
//dialog.SeletcedPath = @"C:\Users\ZGG\Documents";
if (dialog.ShowDialog())
{
var savePath = dialog.SelectedPath;
tbPathChoose.Text = savePath;
}
if (cbbFrom.SelectedItem != null && tbPathChoose.Text != string.Empty)
{
btnSave.IsEnabled = true;
}
}
private void btnSave_Click(object sender, RoutedEventArgs e)
{
var selectedItems = FamilyTreeView.CheckedItemsIgnoreRelation();
var existPath = tbPathChoose.Text;
if (selectedItems.Count == 0)
{
MessageBox.Show("请选择要保存的族!");
}
else if (!Directory.Exists(existPath))
{
var dr = MessageBox.Show("路径不存在,是否创建该路径", "提示", MessageBoxButton.OKCancel);
if (dr == MessageBoxResult.OK)
{
try
{
Directory.CreateDirectory(existPath);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
else
{
var app = uiapp.Application;
List<Family> familyLs = [];
foreach (Document doc in app.Documents)
{
if (!doc.IsLinked && !doc.IsFamilyDocument)
{
if (doc.Title == docFromName)
{
docFrom = doc;
}
}
}
var familyCollector = new FilteredElementCollector(docFrom).OfClass(typeof(Family)).OfType<Family>().ToList();
foreach (var familyNode in familyNodes)
{
if (familyNode.IsChecked == true)
{
foreach (var family in familyCollector)
{
if (family.Name == familyNode.Name)
{
familyLs.Add(family);
}
}
}
}
var sb = new StringBuilder();
#region
ProgressBarManager<Family> manager = new(
uiapp.ActiveUIDocument, familyLs,
(uidoc, family, obj) =>
{
var path = tbPathChoose.Text;
var familyFileInfo = family.Name;
//string categoryInfo = family.Category.Name;
var categoryInfo = family.FamilyCategory.Name;
var directory = path;
if (cbToFolder.IsChecked == true)
{
directory = Path.Combine(path, categoryInfo);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
}
if (cbAddCate.IsChecked == true)
{
familyFileInfo = $"({categoryInfo}){familyFileInfo}";
}
var completeDir = Path.Combine(directory, $"{familyFileInfo}.rfa");
try
{
FileInfo fileInfo = new(completeDir);
if (fileInfo.Exists && rbIgnore.IsChecked == true) { }
else
{
if (fileInfo.Exists)
{
fileInfo.Delete();
}
var famdoc = docFrom.EditFamily(family);
if (cbSet3D.IsChecked == true)
{
Set3DView(famdoc);
}
famdoc.SaveAs(completeDir);
famdoc.Close(false);
}
}
catch (Exception ex)
{
sb.AppendLine(family.Name + ": " + ex.Message);
LogAssists.WriteLog(ex.Message);
}
}, "批量保存族", false, null);
manager.ProgressModal();
#endregion
//foreach (var family in familyLs)
//{
// var path = tbPathChoose.Text;
// var familyFileInfo = family.Name;
// //string categoryInfo = family.Category.Name;
// var categoryInfo = family.FamilyCategory.Name;
// var directory = path;
// if (cbToFolder.IsChecked == true)
// {
// directory = Path.Combine(path, categoryInfo);
// if (!Directory.Exists(directory))
// {
// Directory.CreateDirectory(directory);
// }
// }
// if (cbAddCate.IsChecked == true)
// {
// familyFileInfo = $"({categoryInfo}){familyFileInfo}";
// }
// var completeDir = Path.Combine(directory, $"{familyFileInfo}.rfa");
// try
// {
// FileInfo fileInfo = new(completeDir);
// if (fileInfo.Exists && rbIgnore.IsChecked == true) { }
// else
// {
// if (fileInfo.Exists)
// {
// fileInfo.Delete();
// }
// var famdoc = docFrom.EditFamily(family);
// if (cbSet3D.IsChecked == true)
// {
// Set3DView(famdoc);
// }
// famdoc.SaveAs(completeDir);
// famdoc.Close(false);
// }
// }
// catch (Exception ex)
// {
// sb.AppendLine(family.Name + ": " + ex.Message);
// LogAssists.WriteLog(ex.Message);
// }
//}
_ = sb.Length > 0
? MessageBox.Show(sb.ToString(), "导出结束")
: MessageBox.Show("导出完成", "导出结束");
}
}
private void cbbFrom_DropDownClosed(object sender, EventArgs e)
{
try
{
if (cbbFrom.SelectedItem != null)
{
AddFamilyToTreeView();
FamilyTreeView.IsEnabled = true;
docFromName = cbbFrom.SelectedValue.ToString();
if (tbPathChoose.Text != string.Empty)
{
btnSave.IsEnabled = true;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void cbbFrom_DropDownOpened(object sender, EventArgs e)
{
ListOfOpenedDocument();
}
/// <summary>
/// 获取当前所有文档
/// </summary>
private void ListOfOpenedDocument()
{
docsFromListWpf.Clear();
cbbFrom.ItemsSource = null;
foreach (Document document in uiapp.Application.Documents)
{
if (!document.IsLinked && !document.IsFamilyDocument)
{
DocumentItem docItem = new(document.Title, document.Title);
//docItem.Name = doc.Title;
//docItem.Value = doc.Title;
docsFromListWpf.Add(docItem);
}
}
cbbFrom.ItemsSource = docsFromListWpf;
}
/// <summary>
/// 设置为三维视图
/// </summary>
/// <param name="docf"></param>
private void Set3DView(Document docf)
{
try
{
Transaction transaction = new(docf);
transaction.Start();
docf.Regenerate();
docf.GetDocumentPreviewSettings();
SaveAsOptions saveAsOptions = new();
if (docf.GetDocumentPreviewSettings().PreviewViewId.Equals(ElementId.InvalidElementId))
{
var startingViewSettings = StartingViewSettings.GetStartingViewSettings(docf);
if (!startingViewSettings.ViewId.Equals(ElementId.InvalidElementId))
{
saveAsOptions.PreviewViewId = startingViewSettings.ViewId;
}
else
{
var viewCollector = new FilteredElementCollector(docf).OfClass(typeof(View));
var viewEnum = viewCollector
.Cast<View>()
.Where(
delegate (View view)
{
return view.ViewType == ViewType.ThreeD && !view.IsTemplate;
}
);
var flag = true;
foreach (View view in (IEnumerable)viewEnum)
{
if (!view.IsTemplate)
{
saveAsOptions.PreviewViewId = view.Id;
flag = false;
break;
}
}
if (flag)
{
foreach (
View view in (IEnumerable)
viewCollector
.Cast<View>()
.Where(
delegate (View viewNot3D)
{
return viewNot3D.ViewType
is ViewType.FloorPlan
or ViewType.EngineeringPlan
or ViewType.Elevation
|| (viewNot3D.ViewType == ViewType.Section && !viewNot3D.IsTemplate);
}
)
)
{
if (!view.IsTemplate)
{
saveAsOptions.PreviewViewId = view.Id;
break;
}
}
}
}
}
transaction.Commit();
}
catch { }
}
private void tbPathChoose_TextChanged(object sender, TextChangedEventArgs e)
{
if (cbbFrom.SelectedItem != null && tbPathChoose.Text != string.Empty)
{
btnSave.IsEnabled = true;
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
FamilyTreeView.IsEnabled = false;
btnSave.IsEnabled = false;
ListOfOpenedDocument();
}
/// <summary>
/// 绑定文档条目类
/// </summary>
public class DocumentItem
{
public string Name { get; set; }
public string Value { get; set; }
public DocumentItem(string _Name, string _Value)
{
Name = _Name;
Value = _Value;
}
//public override string ToString()
//{
// return Name;
//}
}
}
}