Files
ShrlAlgoToolkit/ShrlAlgoToolkit.RevitAddins/FamMaster/UpgradeFamilyCmd.cs

352 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.IO;
using System.Text.RegularExpressions;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Melskin.Controls;
using Microsoft.Win32;
using Nice3point.Revit.Toolkit.External;
using ShrlAlgo.Addin.Test;
using ShrlAlgoToolkit;
using ShrlAlgoToolkit.RevitAddins;
using ShrlAlgoToolkit.RevitAddins.Common.Controls;
using ShrlAlgoToolkit.RevitAddins.RvFamily;
using TaskDialog = Autodesk.Revit.UI.TaskDialog;
namespace ShrlAlgoToolkit.RevitAddins.General;
[Transaction(TransactionMode.Manual)]
public class UpgradeFamilyCmd : ExternalCommand
{
private List<string> fileNames;
public override void Execute()
{
try
{
fileNames = GetSelectedFileNames();
if (fileNames.Count > 0)
{
ProgressManager.Run("批量更新文件", (reporter, token) =>
{
// 利用之前封装的 TransactionExtensions 开启事务
Document.InvokeInTransaction(() =>
{
for (int i = 0; i < fileNames.Count; i++)
{
// 检查用户是否点击了“取消”
token.ThrowIfCancellationRequested();
var fileName = fileNames[i];
UpdateFile(UiDocument, fileName);
reporter.Report(i + 1, fileNames.Count, $"正在更新: {fileName}");
// 如果逻辑非常非常耗时可以考虑在这里短暂休眠让出一点点CPU通常不用加
// Thread.Sleep(1);
}
}, "更新文件");
});
}
}
catch (Exception e)
{
if (e is not Autodesk.Revit.Exceptions.OperationCanceledException)
{
ErrorMessage = e.Message;
Result = Result.Failed;
}
}
}
/// <summary>
/// 获取选择全路径文件名列表
/// </summary>
private static List<string> GetSelectedFileNames()
{
var taskDialog = new TaskDialog("选择方式")
{
MainInstruction = "选择方式",
MainContent = "请选择方式"
//FooterText = "<a href=\"http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=2484975 \">"
//+ "进入revit开发中心</a>"
};
taskDialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, "选择文件");
taskDialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, "选择文件夹");
var tResult = taskDialog.Show();
var list = new List<string>();
switch (tResult)
{
case TaskDialogResult.CommandLink1:
{
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);
}
}
break;
}
case TaskDialogResult.CommandLink2:
{
var dialog = new VistaFolderBrowserDialog
{
Multiselect = false
};
dialog.ShowDialog();
if (dialog.SelectedPath != null)
{
var directoryInfo = new DirectoryInfo(dialog.SelectedPath);
var files = directoryInfo.GetFiles("*.rfa", SearchOption.AllDirectories);
foreach (var file in files)
{
list.Add(file.FullName);
}
}
break;
}
}
return list;
}
private void UpdateFile(UIDocument uidoc, string filename)
{
System.Threading.Thread.Sleep(50);
if (File.GetAttributes(filename).ToString().IndexOf("ReadOnly", StringComparison.Ordinal) != -1)
{
File.SetAttributes(filename, FileAttributes.Normal);
}
Document famdoc;
try
{
famdoc = Application.OpenDocumentFile(filename);
}
catch (Autodesk.Revit.Exceptions.CorruptModelException)
{
return;
}
if (famdoc.IsFamilyDocument)
{
using var trans = new Transaction(famdoc);
trans.Start("删除多余属性值");
var fm = famdoc.FamilyManager;
if (fm.CurrentType == null)
{
var t = Path.GetFileNameWithoutExtension(filename);
fm.NewType(t);
}
try
{
var familyParameter = fm.get_Parameter(BuiltInParameter.ALL_MODEL_URL);
if (familyParameter != null)
{
fm.Set(familyParameter, string.Empty);
}
familyParameter = fm.get_Parameter(BuiltInParameter.ALL_MODEL_TYPE_COMMENTS);
if (familyParameter != null)
{
fm.Set(familyParameter, string.Empty);
}
familyParameter = fm.get_Parameter(BuiltInParameter.ALL_MODEL_DESCRIPTION);
if (familyParameter != null)
{
fm.Set(familyParameter, string.Empty);
}
familyParameter = fm.get_Parameter(BuiltInParameter.KEYNOTE_PARAM);
if (familyParameter != null)
{
fm.Set(familyParameter, string.Empty);
}
familyParameter = fm.get_Parameter(BuiltInParameter.UNIFORMAT_CODE);
if (familyParameter != null)
{
fm.Set(familyParameter, string.Empty);
}
familyParameter = fm.get_Parameter(BuiltInParameter.ALL_MODEL_MODEL);
if (familyParameter != null)
{
fm.Set(familyParameter, string.Empty);
}
var fampara = fm.get_Parameter("族库大师");
if (fampara != null)
{
fm.RemoveParameter(fampara);
}
var hostobjects = new FilteredElementCollector(famdoc)
.OfClass(typeof(HostObject)).ToElementIds();
var rplanes = new FilteredElementCollector(famdoc)
.OfCategory(BuiltInCategory.OST_CLines).ToElementIds();
var dimids = new FilteredElementCollector(famdoc)
.OfClass(typeof(Dimension)).ToElementIds();
var conids = new FilteredElementCollector(famdoc)
.OfClass(typeof(ConnectorElement)).ToElementIds();
//ICollection<ElementId> curids = new FilteredElementCollector(famdoc).OfClass(typeof(CurveElement)).ToElementIds();
var textnotes = new FilteredElementCollector(famdoc)
.OfClass(typeof(TextNote)).ToElementIds();
var lightsources = new FilteredElementCollector(famdoc)
.OfCategory(BuiltInCategory.OST_LightingFixtureSource).ToElementIds();
var lights = new FilteredElementCollector(famdoc)
.OfCategory(BuiltInCategory.OST_LightingFixtures).ToElementIds();
var sketchgrids = new FilteredElementCollector(famdoc)
.OfCategory(BuiltInCategory.OST_IOSSketchGrid).ToElementIds();
var modelcurves = new FilteredElementCollector(famdoc)
.OfCategory(BuiltInCategory.OST_ReferenceLines).ToElementIds();
var facebox =
new FilteredElementCollector(famdoc).OfClass(typeof(Extrusion));
//UiDocument.ActiveView = v3d;
//UIView uIView = UiDocument.GetOpenUIViews().Where(x => x.ViewId == v3d.ViewId).FirstOrDefault();
//uIView.ZoomToFit();
var setting = famdoc.GetDocumentPreviewSettings();
var previewid = famdoc.FindPreviewId<View3D>(setting);
setting.PreviewViewId = previewid;
var v = famdoc.GetElement(previewid) as View;
setting.ForceViewUpdate(true);
//得到基于面的族样板拉伸体
if (facebox.Count() != 0)
{
var boxs = from x in facebox
where Math.Abs(x.get_Parameter(BuiltInParameter.EXTRUSION_END_PARAM).AsDouble() - -1) < 0.0001
select x.Id;
var elementIds = boxs.ToList();
if (elementIds.Count() != 0)
{
v.HideElementsTemporary(elementIds);
}
}
//var graphicDisplayOptions = v3d.get_Parameter(BuiltInParameter.MODEL_GRAPHICS_STYLE);
//graphicDisplayOptions.Set(8);
v.DisplayStyle = DisplayStyle.RealisticWithEdges;
v.DetailLevel = ViewDetailLevel.Fine;
ThinLinesOptions.AreThinLinesEnabled = true;
v.HideElementsTemporary(hostobjects);
v.HideElementsTemporary(rplanes);
v.HideElementsTemporary(dimids);
v.HideElementsTemporary(conids);
v.HideElementsTemporary(textnotes);
v.HideElementsTemporary(lights);
v.HideElementsTemporary(lightsources);
v.HideElementsTemporary(sketchgrids);
v.HideElementsTemporary(modelcurves);
#if REVIT2018 || REVIT2020
var ele = famdoc.GetElement(new ElementId(1537));
#elif REVIT2025
var ele = famdoc.GetElement(ElementId.Parse("1537"));
#endif
if (ele != null)
{
v.HideElementTemporary(ele.Id);
}
if (v is View3D)
{
var v3d = v as View3D;
if (v3d.IsLocked)
{
v3d.Unlock();
}
if (famdoc.OwnerFamily.FamilyCategory ==
Category.GetCategory(famdoc, BuiltInCategory.OST_LightingFixtures))
{
v3d.OrientTo(new XYZ(-1, 1, 1));
}
else
{
//人看向视图的视角向量
//v3d.OrientTo(new XYZ(-1, 1, -1));
v3d.OrientTo(new XYZ(-1, -1, -1));
}
//v3d.OrientTo(new XYZ(1, -1, -1));
}
//XYZ eyeposition = new XYZ();
//XYZ updirection = XYZ.BasisZ;
//XYZ forwarddirection = XYZ.BasisY;
//ViewOrientation3D orientation3D = new ViewOrientation3D(eyeposition,updirection,forwarddirection);
//v3d.SetOrientation(orientation3D);
//UiDocument.RefreshActiveView();
//v3d.ToggleToIsometric();
//System.Windows.Forms.SendKeys.SendWait("TL");
ThinLinesOptions.AreThinLinesEnabled = true;
var sa = new SaveAsOptions
{
OverwriteExistingFile = true,
PreviewViewId = previewid
};
//SetViewSaveOption(famdoc, v3d, sa, setting);
trans.Commit();
famdoc.SaveAs(filename, sa);
famdoc.Close(false);
}
catch (Exception)
{
//if (ex.GetType() == typeof(OperationCanceledException))
//{
// if (trans.HasStarted())
// {
// trans.Commit();
// famdoc.CloseTrigger(false);
// }
// break;
//}
if (trans.HasStarted())
{
trans.Commit();
famdoc.Close(false);
}
}
}
else //不是族文件时
{
var sa = new SaveAsOptions
{
OverwriteExistingFile = true
};
famdoc.SaveAs(filename, sa);
famdoc.Close(false);
}
var isMatch = Regex.IsMatch(filename, ".\\d{4}(.rfa)");
if (isMatch)
{
File.Delete(filename);
}
}
}