463 lines
17 KiB
C#
463 lines
17 KiB
C#
|
|
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;
|
|
//}
|
|
}
|
|
}
|
|
}
|