498 lines
20 KiB
C#
498 lines
20 KiB
C#
|
|
|
|||
|
|
using Autodesk.Revit.DB;
|
|||
|
|
using Autodesk.Revit.UI;
|
|||
|
|
|
|||
|
|
using System;
|
|||
|
|
using System.Windows;
|
|||
|
|
|
|||
|
|
using Szmedi.RvKits.Models;
|
|||
|
|
|
|||
|
|
namespace Szmedi.RvKits.TransmitFamily
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// FamilyTransmit.xaml 的交互逻辑
|
|||
|
|
/// </summary>
|
|||
|
|
public partial class TransmitProjectWin
|
|||
|
|
{
|
|||
|
|
private readonly IList<TreeModel> familyNodes = new List<TreeModel>();
|
|||
|
|
private readonly List<DocumentItem> docsFromListWpf = new();
|
|||
|
|
private readonly List<DocumentItem> docsToListWpf = new();
|
|||
|
|
|
|||
|
|
private readonly UIApplication uiapp;
|
|||
|
|
|
|||
|
|
//便于类中各处进行调用,故在此处添加字段
|
|||
|
|
//private doc doc;
|
|||
|
|
|
|||
|
|
private readonly UIDocument uidoc;
|
|||
|
|
private Document docFrom;
|
|||
|
|
private Document docTo;
|
|||
|
|
private string docFromName;
|
|||
|
|
private string docToName;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 构造
|
|||
|
|
/// </summary>
|
|||
|
|
public TransmitProjectWin()
|
|||
|
|
{
|
|||
|
|
InitializeComponent();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 重载,参数传入窗体
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="doc"></param>
|
|||
|
|
/// <param name="uidoc"></param>
|
|||
|
|
/// <param name="uiapp"></param>
|
|||
|
|
public TransmitProjectWin(UIApplication uiapp)
|
|||
|
|
{
|
|||
|
|
this.uiapp = uiapp;
|
|||
|
|
uidoc = uiapp.ActiveUIDocument;
|
|||
|
|
InitializeComponent();
|
|||
|
|
ListOfOpenedDocument();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取族,并将族列表绑定到TreeVIew控件
|
|||
|
|
/// </summary>
|
|||
|
|
private void AddFamilyToTreeView()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
foreach (Document selectedDoc in uiapp.Application.Documents)
|
|||
|
|
{
|
|||
|
|
if (!selectedDoc.IsLinked && !selectedDoc.IsFamilyDocument)
|
|||
|
|
{
|
|||
|
|
if (cbbFrom.SelectedValue.ToString() == selectedDoc.Title)
|
|||
|
|
{
|
|||
|
|
List<TreeModel> familiesTree = new();
|
|||
|
|
|
|||
|
|
#region 族
|
|||
|
|
|
|||
|
|
Categories categories = selectedDoc.Settings.Categories;
|
|||
|
|
|
|||
|
|
var familyCollector = new FilteredElementCollector(selectedDoc).OfClass(typeof(Family));
|
|||
|
|
|
|||
|
|
var familySymbolCollector = 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 (Family family in familyCollector)
|
|||
|
|
{
|
|||
|
|
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);
|
|||
|
|
foreach (FamilySymbol familySymbol in familySymbolCollector)
|
|||
|
|
{
|
|||
|
|
if (familySymbol.FamilyName == family.Name)
|
|||
|
|
{
|
|||
|
|
TreeModel familySymbolNode =
|
|||
|
|
new()
|
|||
|
|
{
|
|||
|
|
//familiesSymbolNode.Id = familySymbol.Name;
|
|||
|
|
Name = familySymbol.Name,
|
|||
|
|
Parent = familyNode
|
|||
|
|
};
|
|||
|
|
familyNode.Children.Add(familySymbolNode);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (familyCategoryNode.Children.Count != 0)
|
|||
|
|
{
|
|||
|
|
familiesTree.Add(familyCategoryNode);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion 族
|
|||
|
|
|
|||
|
|
var hostObjectCollector = new FilteredElementCollector(selectedDoc).OfClass(typeof(HostObjAttributes));
|
|||
|
|
//IList<string> categoryNames = (from HostObjAttributes ele in hostObjectCollector
|
|||
|
|
// select ele.Category.Name).ToList();
|
|||
|
|
|
|||
|
|
//var elementTypes = new FilteredElementCollector(selectedDoc).QueryElementsByType(typeof(TypeName));
|
|||
|
|
//List<string> ss1 = categoryNames.Distinct().ToList();
|
|||
|
|
foreach (HostObjAttributes obj in hostObjectCollector)
|
|||
|
|
{
|
|||
|
|
string categoryName = obj.Category.Name;
|
|||
|
|
string familyName = obj.FamilyName;
|
|||
|
|
string familySymbolName = obj.Name;
|
|||
|
|
|
|||
|
|
#region categoryRegion
|
|||
|
|
|
|||
|
|
TreeModel familyCategoryNode = null;
|
|||
|
|
foreach (var t in familiesTree)
|
|||
|
|
{
|
|||
|
|
if (t.ToolTip.Equals(categoryName)) //遍历是否找到相同的节点
|
|||
|
|
{
|
|||
|
|
familyCategoryNode = t; //有则传递给当前类别节点
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (familyCategoryNode == null)
|
|||
|
|
{
|
|||
|
|
TreeModel t = new() { Name = categoryName, IsExpanded = false };
|
|||
|
|
|
|||
|
|
familyCategoryNode = t;
|
|||
|
|
familiesTree.Add(familyCategoryNode);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion categoryRegion
|
|||
|
|
|
|||
|
|
#region familyRegion
|
|||
|
|
|
|||
|
|
TreeModel familyNode = null;
|
|||
|
|
foreach (var t in familyCategoryNode.Children)
|
|||
|
|
{
|
|||
|
|
if (t.ToolTip.Equals(categoryName + "-" + familyName))
|
|||
|
|
{
|
|||
|
|
familyNode = t;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (familyNode == null)
|
|||
|
|
{
|
|||
|
|
TreeModel t =
|
|||
|
|
new()
|
|||
|
|
{
|
|||
|
|
Name = familyName,
|
|||
|
|
IsExpanded = false,
|
|||
|
|
Parent = familyCategoryNode
|
|||
|
|
};
|
|||
|
|
familyCategoryNode.Children.Add(t);
|
|||
|
|
|
|||
|
|
familyNode = t;
|
|||
|
|
|
|||
|
|
familyNodes.Add(familyNode);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion familyRegion
|
|||
|
|
|
|||
|
|
#region familySymbol
|
|||
|
|
|
|||
|
|
TreeModel familySymbolNode = null;
|
|||
|
|
foreach (var t in familyNode.Children)
|
|||
|
|
{
|
|||
|
|
if (t.ToolTip.Equals(familyName + "-" + familySymbolName))
|
|||
|
|
{
|
|||
|
|
familySymbolNode = t;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (familySymbolNode == null)
|
|||
|
|
{
|
|||
|
|
TreeModel t =
|
|||
|
|
new()
|
|||
|
|
{
|
|||
|
|
Name = familySymbolName,
|
|||
|
|
IsExpanded = false,
|
|||
|
|
Parent = familyNode
|
|||
|
|
};
|
|||
|
|
familyNode.Children.Add(t);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion familySymbol
|
|||
|
|
|
|||
|
|
//TreeModel familyNode = new TreeModel();
|
|||
|
|
//familyNode.Name = obj.FamilyName;
|
|||
|
|
////familyNode.Name = obj.FamilyName;
|
|||
|
|
//familyNode.IsExpanded = false;
|
|||
|
|
//familyNode.Parent = categoryNode;
|
|||
|
|
//categoryNode.Children.Add(familyNode);
|
|||
|
|
|
|||
|
|
//familyNodes.Add(familyNode);
|
|||
|
|
////if (obj.Name == familyNode.Name)
|
|||
|
|
////{
|
|||
|
|
//TreeModel familiesSymbolNode = new TreeModel();
|
|||
|
|
////familiesSymbolNode.Id = familySymbol.Name;
|
|||
|
|
//familiesSymbolNode.Name = obj.Name;
|
|||
|
|
//familiesSymbolNode.Parent = familyNode;
|
|||
|
|
//familyNode.Children.Add(familiesSymbolNode);
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
familiesTree.Sort();
|
|||
|
|
|
|||
|
|
FamilyTreeView.ItemsSourceData = familiesTree;
|
|||
|
|
//FamilyTreeView.UpdateLayout();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(ex.ToString());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void btnClose_Click(object sender, RoutedEventArgs e)
|
|||
|
|
{
|
|||
|
|
Close();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void btnTransmit_Click(object sender, RoutedEventArgs e)
|
|||
|
|
{
|
|||
|
|
Close();
|
|||
|
|
IList<TreeModel> selectedItems = FamilyTreeView.CheckedItemsIgnoreRelation();
|
|||
|
|
|
|||
|
|
if (selectedItems.Count == 0)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show("请选择需要传递的族");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
UIDocument uidoc = this.uidoc;
|
|||
|
|
Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
|
|||
|
|
|
|||
|
|
IList<ElementId> transmitIds = new List<ElementId>();
|
|||
|
|
foreach (Document doc in app.Documents)
|
|||
|
|
{
|
|||
|
|
if (!doc.IsLinked)
|
|||
|
|
{
|
|||
|
|
if (doc.Title == docToName)
|
|||
|
|
{
|
|||
|
|
docTo = doc;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (doc.Title == docFromName)
|
|||
|
|
{
|
|||
|
|
docFrom = doc;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ElementClassFilter familysymbolfilter = new ElementClassFilter(typeof(FamilySymbol));
|
|||
|
|
//ElementClassFilter hostsymbolFilter = new ElementClassFilter(typeof(HostObjAttributes));
|
|||
|
|
//LogicalOrFilter andfilter = new LogicalOrFilter(familysymbolfilter, hostsymbolFilter);
|
|||
|
|
//var familiesSymbolCollector = new FilteredElementCollector(doc).WherePasses(andfilter);
|
|||
|
|
|
|||
|
|
var familiesSymbolCollector = new FilteredElementCollector(docFrom).OfClass(typeof(FamilySymbol));
|
|||
|
|
var hostObjSymbolCollector = new FilteredElementCollector(docFrom).OfClass(typeof(HostObjAttributes));
|
|||
|
|
|
|||
|
|
foreach (TreeModel familyNode in familyNodes)
|
|||
|
|
{
|
|||
|
|
if (familyNode.IsChecked != false)
|
|||
|
|
{
|
|||
|
|
foreach (TreeModel item in familyNode.Children)
|
|||
|
|
{
|
|||
|
|
if (item.IsChecked == true)
|
|||
|
|
{
|
|||
|
|
foreach (FamilySymbol familySymbol in familiesSymbolCollector)
|
|||
|
|
{
|
|||
|
|
if (familySymbol.Name == item.Name && familySymbol.FamilyName == item.Parent.Name)
|
|||
|
|
{
|
|||
|
|
transmitIds.Add(familySymbol.Id);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
foreach (HostObjAttributes hostObjSymbol in hostObjSymbolCollector)
|
|||
|
|
{
|
|||
|
|
if (hostObjSymbol.Name == item.Name && hostObjSymbol.FamilyName == item.Parent.Name)
|
|||
|
|
{
|
|||
|
|
transmitIds.Add(hostObjSymbol.Id);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
CopyPasteOptions copyPasteOptions = new();
|
|||
|
|
//if (rbOverride.IsChecked == true)
|
|||
|
|
//{
|
|||
|
|
// copyPasteOptions.SetDuplicateTypeNamesHandler(new CopyHandlerOk());
|
|||
|
|
//}
|
|||
|
|
//else if (rbSkip.IsChecked == true)
|
|||
|
|
//{
|
|||
|
|
// copyPasteOptions.SetDuplicateTypeNamesHandler(new CopyHandlerAbort());
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
//}
|
|||
|
|
using Transaction trans = new(docTo);
|
|||
|
|
trans.Start("传递族");
|
|||
|
|
var options = trans.GetFailureHandlingOptions().SetFailuresPreprocessor(new FailuresPreProcessor());
|
|||
|
|
ElementTransformUtils.CopyElements(docFrom, transmitIds, docTo, null, copyPasteOptions);
|
|||
|
|
trans.Commit();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void cbbFrom_DropDownClosed(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
if (docsFromListWpf.Count > 1)
|
|||
|
|
{
|
|||
|
|
cbbTo.IsEnabled = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (cbbFrom.SelectedItem != null)
|
|||
|
|
{
|
|||
|
|
docsToListWpf.Clear();
|
|||
|
|
cbbTo.ItemsSource = null;
|
|||
|
|
foreach (var item in docsFromListWpf)
|
|||
|
|
{
|
|||
|
|
if (item != cbbFrom.SelectedItem)
|
|||
|
|
{
|
|||
|
|
docsToListWpf.Add(item);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
docFromName = item.Name;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
cbbTo.ItemsSource = docsToListWpf;
|
|||
|
|
AddFamilyToTreeView();
|
|||
|
|
FamilyTreeView.IsEnabled = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(ex.ToString());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void cbbFrom_DropDownOpened(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
ListOfOpenedDocument();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void cbbTo_DropDownClosed(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
if (cbbTo.SelectedItem == null) { }
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
foreach (var item in docsToListWpf)
|
|||
|
|
{
|
|||
|
|
if (item == cbbTo.SelectedItem)
|
|||
|
|
{
|
|||
|
|
docToName = item.Name;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
btnTransmit.IsEnabled = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
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="sender"></param>
|
|||
|
|
/// <param name="e"></param>
|
|||
|
|
private void WpfTransmit_Loaded(object sender, RoutedEventArgs e)
|
|||
|
|
{
|
|||
|
|
cbbTo.IsEnabled = false;
|
|||
|
|
FamilyTreeView.IsEnabled = false;
|
|||
|
|
btnTransmit.IsEnabled = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//private int GetFamilyCount(IList<TreeModel> treeList)
|
|||
|
|
//{
|
|||
|
|
// StringBuilder names = new StringBuilder();
|
|||
|
|
// int number = 0;
|
|||
|
|
// foreach (TreeModel tree in treeList)
|
|||
|
|
// {
|
|||
|
|
// if (tree.Children.Count == 0)
|
|||
|
|
// {
|
|||
|
|
// number++;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// return number;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//private string GetNames(IList<TreeModel> treeList)
|
|||
|
|
//{
|
|||
|
|
// StringBuilder names = new StringBuilder();
|
|||
|
|
|
|||
|
|
// foreach (TreeModel tree in treeList)
|
|||
|
|
// {
|
|||
|
|
// names.Append(tree.Name).Append(",");
|
|||
|
|
// }
|
|||
|
|
// return names.ToString();
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//public class CopyHandlerOk : IDuplicateTypeNamesHandler
|
|||
|
|
//{
|
|||
|
|
// public DuplicateTypeAction OnDuplicateTypeNamesFound(DuplicateTypeNamesHandlerArgs args)
|
|||
|
|
// {
|
|||
|
|
// return DuplicateTypeAction.UseDestinationTypes;
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//public class CopyHandlerAbort : IDuplicateTypeNamesHandler
|
|||
|
|
//{
|
|||
|
|
// public DuplicateTypeAction OnDuplicateTypeNamesFound(DuplicateTypeNamesHandlerArgs args)
|
|||
|
|
// {
|
|||
|
|
// return DuplicateTypeAction.Abort;
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
}
|