整理UI
This commit is contained in:
@@ -1,93 +0,0 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
using Autodesk.Revit.Attributes;
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.UI;
|
||||
|
||||
namespace ShrlAlgo.Addin.Test
|
||||
{
|
||||
[Transaction(TransactionMode.Manual)]
|
||||
[Regeneration(RegenerationOption.Manual)]
|
||||
internal class CheckCollision : IExternalCommand
|
||||
{
|
||||
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
|
||||
{
|
||||
//程序UI界面
|
||||
var uiapp = commandData.Application;
|
||||
//获取元素(选择) 显示元素 视图(活动视图)管理(对象)
|
||||
var uidoc = uiapp.ActiveUIDocument;
|
||||
//获取位置和场地 视图(多个视图)管理 获取元素(Revit 项目里的全部元素)
|
||||
var doc = uidoc.Document;
|
||||
//当前视图
|
||||
var view = doc.ActiveView;
|
||||
var collector = new FilteredElementCollector(doc, view.Id)
|
||||
.OfClass(typeof(MEPCurve))
|
||||
.WhereElementIsNotElementType().ToList();
|
||||
// 检查管线之间的碰撞
|
||||
var collisions = CheckPipeCollisionsParallel(doc, collector);
|
||||
|
||||
// 显示碰撞结果
|
||||
ShowCollisionResults(collisions);
|
||||
return Result.Succeeded;
|
||||
}
|
||||
public List<Tuple<Element, Element>> CheckPipeCollisionsParallel(Document doc, List<Element> pipes)
|
||||
{
|
||||
var collisions = new List<Tuple<Element, Element>>();
|
||||
// 使用 Parallel.For 并行检查碰撞
|
||||
Parallel.For(0, pipes.Count, i =>
|
||||
{
|
||||
for (var j = i + 1; j < pipes.Count; j++)
|
||||
{
|
||||
var pipe1 = pipes[i];
|
||||
var pipe2 = pipes[j];
|
||||
|
||||
// 使用 ElementIntersectsElementFilter 检查碰撞
|
||||
var filter = new ElementIntersectsElementFilter(pipe1);
|
||||
var collector = new FilteredElementCollector(doc, [pipe2.Id]);
|
||||
collector.WherePasses(filter);
|
||||
|
||||
if (collector.Any())
|
||||
{
|
||||
// 如果检测到碰撞,记录下来
|
||||
lock (collisions)
|
||||
{
|
||||
collisions.Add(new Tuple<Element, Element>(pipe1, pipe2));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return collisions;
|
||||
}
|
||||
public void ShowCollisionResults(List<Tuple<Element, Element>> collisions)
|
||||
{
|
||||
if (collisions.Count == 0)
|
||||
{
|
||||
TaskDialog.Show("碰撞检查", "未发现碰撞");
|
||||
}
|
||||
else
|
||||
{
|
||||
var message = new StringBuilder();
|
||||
message.AppendLine("发现碰撞:");
|
||||
foreach (var collision in collisions)
|
||||
{
|
||||
message.AppendLine($"管线 {collision.Item1.Id} 与管线 {collision.Item2.Id} 发生碰撞");
|
||||
}
|
||||
ExportCollisionResultsToFile(message.ToString());
|
||||
//TaskDialog.Show("碰撞检查", message.ToString());
|
||||
}
|
||||
}
|
||||
public void ExportCollisionResultsToFile(string content)
|
||||
{
|
||||
// 获取桌面路径
|
||||
var desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
|
||||
|
||||
// 创建文件路径
|
||||
var filePath = Path.Combine(desktopPath, "碰撞检查.txt");
|
||||
|
||||
// 写入文件
|
||||
File.WriteAllText(filePath, content);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
using Autodesk.Revit.DB;
|
||||
|
||||
namespace ShrlAlgo.Addin.Test;
|
||||
|
||||
public class InsertInfo
|
||||
{
|
||||
|
||||
public string Name { get; set; }
|
||||
public XYZ InsertPoint { get; set; }
|
||||
public double Radian { get; set; }
|
||||
public double Length { get; set; }
|
||||
}
|
||||
@@ -1,207 +0,0 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
|
||||
using Autodesk.Revit.Attributes;
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.UI;
|
||||
|
||||
using Microsoft.Win32;
|
||||
|
||||
using Nice3point.Revit.Toolkit.External;
|
||||
|
||||
using ShrlAlgoToolkit.Revit.Assists;
|
||||
using ShrlAlgoToolkit.Revit.Extensions;
|
||||
|
||||
|
||||
namespace ShrlAlgo.Addin.Test;
|
||||
/// <summary>
|
||||
/// Revit执行命令
|
||||
/// </summary>
|
||||
[Transaction(TransactionMode.Manual)]
|
||||
[Regeneration(RegenerationOption.Manual)]
|
||||
public class RemoveParamCmd : ExternalCommand
|
||||
{
|
||||
public override void Execute()
|
||||
{
|
||||
var list = new List<string>();
|
||||
var filter = "族文件|*.rfa";
|
||||
var openFile = new OpenFileDialog
|
||||
{
|
||||
Multiselect = true,
|
||||
Filter = filter
|
||||
};
|
||||
openFile.ShowDialog();
|
||||
if (openFile.FileNames.Length != 0)
|
||||
{
|
||||
var strFiles = openFile.FileNames;
|
||||
|
||||
foreach (var file in strFiles)
|
||||
{
|
||||
list.Add(file);
|
||||
}
|
||||
}
|
||||
foreach (var fileName in list)
|
||||
{
|
||||
var doc = Application.OpenDocumentFile(fileName);
|
||||
doc.Save();
|
||||
doc.Close(false);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 移除任意参数
|
||||
/// </summary>
|
||||
/// <param name="element"></param>
|
||||
/// <param name="paramNames"></param>
|
||||
private void RemoveParams(Element element, params string[] paramNames)
|
||||
{
|
||||
var dict = ParameterAssist.GetParameterElementBindings(Document);
|
||||
var bindings = Document.ParameterBindings;
|
||||
var parameterElements = Document.OfClass<ParameterElement>().Cast<ParameterElement>();
|
||||
Document.InvokeGroup(
|
||||
_ =>
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
Element type = null;
|
||||
var hasTypeId = element.GetTypeId() != ElementId.InvalidElementId;
|
||||
if (hasTypeId)
|
||||
{
|
||||
type = Document.GetElement(element.GetTypeId());
|
||||
}
|
||||
Document.Invoke(
|
||||
ts =>
|
||||
{
|
||||
//实例参数
|
||||
foreach (Parameter param in element.ParametersMap)
|
||||
{
|
||||
if (paramNames.Contains(param.Definition.Name))
|
||||
{
|
||||
//var name = param.Definition.Name;
|
||||
//var defs = dict.Keys.Select(e => e.GetDefinition());
|
||||
var ds = dict.Where(
|
||||
e => e.Key.GetDefinition().Id == (param.Definition as InternalDefinition)?.Id);
|
||||
if (ds.Any())//说明是项目参数
|
||||
{
|
||||
var d = ds.FirstOrDefault();
|
||||
var parameter = d.Key;
|
||||
var binding = d.Value;
|
||||
if (binding.Categories.Size == 1)//如果只剩下一个类别,则直接移除
|
||||
{
|
||||
if (parameter is SharedParameterElement)//共享参数
|
||||
{
|
||||
bindings.Remove(param.Definition);
|
||||
}
|
||||
else//项目参数
|
||||
{
|
||||
dict.Remove(parameter);
|
||||
Document.Delete(parameter.Id);
|
||||
}
|
||||
}
|
||||
else//否则只移除一个类别
|
||||
{
|
||||
binding.Categories.Erase(element.Category);
|
||||
Document.ParameterBindings.ReInsert(parameter.GetDefinition(), binding);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Document.Regenerate();
|
||||
|
||||
//类型参数
|
||||
if (hasTypeId)
|
||||
{
|
||||
foreach (Parameter param in type.ParametersMap)
|
||||
{
|
||||
if (paramNames.Contains(param.Definition.Name))
|
||||
{
|
||||
//var name = param.Definition.Name;
|
||||
//var defs = dict.Keys.Select(e => e.GetDefinition());
|
||||
var ds = dict.Where(
|
||||
e => e.Key.GetDefinition().Id == (param.Definition as InternalDefinition)?.Id);
|
||||
if (ds.Any())//说明是项目参数
|
||||
{
|
||||
var d = ds.FirstOrDefault();
|
||||
var parameter = d.Key;
|
||||
var binding = d.Value;
|
||||
if (binding.Categories.Size == 1)//如果只剩下一个类别,则直接移除
|
||||
{
|
||||
if (parameter is SharedParameterElement)//共享参数
|
||||
{
|
||||
bindings.Remove(param.Definition);
|
||||
}
|
||||
else//项目参数
|
||||
{
|
||||
dict.Remove(parameter);
|
||||
Document.Delete(parameter.Id);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
binding.Categories.Erase(element.Category);
|
||||
Document.ParameterBindings.ReInsert(parameter.GetDefinition(), binding);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}, "清理项目参数");
|
||||
|
||||
bool instaneFlag = element.ParametersMap
|
||||
.OfType<Parameter>()
|
||||
.Any(param => paramNames.Contains(param.Definition.Name));
|
||||
bool typeFlag = false;
|
||||
|
||||
if (hasTypeId)
|
||||
{
|
||||
typeFlag = type.ParametersMap.OfType<Parameter>()
|
||||
.Any(param => paramNames.Contains(param.Definition.Name));
|
||||
}
|
||||
var NeedToEditFamily = instaneFlag || typeFlag;
|
||||
|
||||
if (NeedToEditFamily && element is FamilyInstance instance)
|
||||
{
|
||||
Document famdoc = null;
|
||||
try
|
||||
{
|
||||
Family family = instance.Symbol.Family;
|
||||
|
||||
if (family.IsEditable)
|
||||
{
|
||||
famdoc = Document.EditFamily(family);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendLine($"{family.Name} 不可编辑。");
|
||||
}
|
||||
|
||||
if (famdoc != null)
|
||||
{
|
||||
using (Transaction ts = new(famdoc, "删除参数"))
|
||||
{
|
||||
ts.Start();
|
||||
var parametersToRemove = famdoc.FamilyManager
|
||||
.GetParameters()
|
||||
.Where(fp => paramNames.Contains(fp.Definition.Name));
|
||||
foreach (FamilyParameter fp in parametersToRemove)
|
||||
{
|
||||
famdoc.FamilyManager.RemoveParameter(fp);
|
||||
}
|
||||
ts.Commit();
|
||||
}
|
||||
|
||||
famdoc.LoadFamily(Document);
|
||||
famdoc.Close(false);
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
sb.AppendLine($"{famdoc.Title} 发生错误!");
|
||||
}
|
||||
}
|
||||
if (sb.Length > 0)
|
||||
{
|
||||
MessageBox.Show(sb.ToString());
|
||||
}
|
||||
}, "参数移除");
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
using System;
|
||||
|
||||
using Autodesk.Revit.Attributes;
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.UI;
|
||||
using Autodesk.Revit.UI.Selection;
|
||||
|
||||
using Nice3point.Revit.Toolkit.External;
|
||||
|
||||
namespace ShrlAlgo.Addin.Test;
|
||||
[Transaction(TransactionMode.Manual)]
|
||||
[Regeneration(RegenerationOption.Manual)]
|
||||
public class SeparateModel : ExternalCommand
|
||||
{
|
||||
public override void Execute()
|
||||
{
|
||||
SeparateModelWin win = new SeparateModelWin();
|
||||
win.Show();
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
<Window
|
||||
x:Class="ShrlAlgo.Addin.Test.SeparateModelWin"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:AduSkin="https://github.com/aduskin"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:ShrlAlgo.Addin.Test"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
Title="拆分模型"
|
||||
Width="300"
|
||||
Height="300"
|
||||
SizeToContent="Height"
|
||||
Topmost="True"
|
||||
mc:Ignorable="d">
|
||||
<Grid>
|
||||
<StackPanel Margin="5">
|
||||
<AduSkin:MetroTextBox
|
||||
x:Name="TbFileName"
|
||||
Margin="5"
|
||||
InputHint="文件名" />
|
||||
<AduSkin:MetroTextBox
|
||||
x:Name="TbFolder"
|
||||
Margin="5"
|
||||
InputHint="保存路径" />
|
||||
<AduSkin:MetroButton
|
||||
Margin="5"
|
||||
Click="MetroButton_Click"
|
||||
Content="拆分" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -1,99 +0,0 @@
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
|
||||
using Autodesk.Revit.DB;
|
||||
|
||||
using Nice3point.Revit.Toolkit.External.Handlers;
|
||||
using ShrlAlgoToolkit.Revit.Assists;
|
||||
using Exception = System.Exception;
|
||||
|
||||
using UIFrameworkServices;
|
||||
|
||||
namespace ShrlAlgo.Addin.Test;
|
||||
/// <summary>
|
||||
/// SeparateModelWin.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class SeparateModelWin
|
||||
{
|
||||
ActionEventHandler separate = new ActionEventHandler();
|
||||
public SeparateModelWin()
|
||||
{
|
||||
InitializeComponent();
|
||||
TbFolder.Text = "F:\\燃气改造项目\\归档";
|
||||
}
|
||||
|
||||
private void MetroButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
separate.Raise(
|
||||
uiapp =>
|
||||
{
|
||||
|
||||
var uidoc = uiapp.ActiveUIDocument;
|
||||
var doc = uidoc.Document;
|
||||
var list = uidoc.Selection.GetElementIds();
|
||||
|
||||
if (list.Count == 0)
|
||||
{
|
||||
MessageBox.Show("未选中元素", "提示");
|
||||
return;
|
||||
}
|
||||
var walls = list.Select(id => doc.GetElement(id)).Where(e => e is Wall).Select(e => e.Id).ToList();
|
||||
var others = list.Select(id => doc.GetElement(id)).Where(e => e is not Wall).Select(e => e.Id).ToList();
|
||||
SpearateByIds(doc, walls, true);
|
||||
SpearateByIds(doc, others, false);
|
||||
using (Transaction trans = new Transaction(doc, "删除选中"))
|
||||
{
|
||||
try
|
||||
{
|
||||
trans.Start();
|
||||
doc.Delete(list);
|
||||
trans.Commit();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void SpearateByIds(Document doc, System.Collections.Generic.ICollection<ElementId> list, bool isA)
|
||||
{
|
||||
var allOthers = doc.OfModelCollector()?
|
||||
.Excluding(list)
|
||||
.ToElementIds();
|
||||
if (allOthers == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var ids = doc.OfClass<ImportInstance>().ToElementIds();
|
||||
var modelLineIds = doc.OfCollector().OfCategory(BuiltInCategory.OST_Lines).Select(e => e.Id).ToList();
|
||||
var texts = doc.OfCollector().OfCategory(BuiltInCategory.OST_TextNotes).Select(e => e.Id).ToList();
|
||||
using (Transaction trans = new Transaction(doc, "拆分模型"))
|
||||
{
|
||||
try
|
||||
{
|
||||
trans.Start();
|
||||
doc.Delete(allOthers);
|
||||
doc.Delete(ids);
|
||||
doc.Delete(modelLineIds);
|
||||
doc.Delete(texts);
|
||||
trans.Commit();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
if (!Directory.Exists(TbFolder.Text))
|
||||
{
|
||||
Directory.CreateDirectory(TbFolder.Text);
|
||||
}
|
||||
var fileName = isA ? TbFileName.Text + "-A" : TbFileName.Text + "-GE";
|
||||
var filePath = Path.Combine(TbFolder.Text, $"{fileName}.rvt");
|
||||
SaveAsOptions options = new SaveAsOptions() { OverwriteExistingFile = true, PreviewViewId = doc.ActiveView.Id, Compact = true };
|
||||
|
||||
doc.SaveAs(filePath, options);
|
||||
QuickAccessToolBarService.performMultipleUndoRedoOperations(true, 1);
|
||||
}
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
using Autodesk.Revit.Attributes;
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.UI;
|
||||
|
||||
namespace ShrlAlgo.Addin.Test
|
||||
{
|
||||
[Transaction(TransactionMode.Manual)]
|
||||
[Regeneration(RegenerationOption.Manual)]
|
||||
public class SetHeight : IExternalCommand
|
||||
{
|
||||
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
|
||||
{
|
||||
//程序UI界面
|
||||
var uiapp = commandData.Application;
|
||||
//获取元素(选择) 显示元素 视图(活动视图)管理(对象)
|
||||
var uidoc = uiapp.ActiveUIDocument;
|
||||
//程序
|
||||
var app = uiapp.Application;
|
||||
//获取位置和场地 视图(多个视图)管理 获取元素(Revit 项目里的全部元素)
|
||||
var doc = uidoc.Document;
|
||||
//获取所有打开文档
|
||||
var docset = uiapp.Application.Documents;
|
||||
//当前视图
|
||||
var view = doc.ActiveView;
|
||||
|
||||
var ids = uidoc.Selection.GetElementIds();
|
||||
using (var ts = new Transaction(doc, "设置净高"))
|
||||
{
|
||||
ts.Start();
|
||||
try
|
||||
{
|
||||
foreach (var id in ids)
|
||||
{
|
||||
var elem = doc.GetElement(id);
|
||||
var param = elem.GetParameters("h").FirstOrDefault();
|
||||
var height = elem.GetParameters("净高").FirstOrDefault();
|
||||
height.Set(param.AsValueString());
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return Result.Failed;
|
||||
}
|
||||
|
||||
ts.Commit();
|
||||
}
|
||||
return Result.Succeeded;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user