345 lines
13 KiB
C#
345 lines
13 KiB
C#
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 ShrlAlgoToolkit.RevitAddins.Common.Controls;
|
||
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)
|
||
{
|
||
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);
|
||
}
|
||
}
|
||
} |