Files
SzmediTools/Szmedi.RvKits/Drawing/Dimension2DTo3DCmd.cs
2025-09-16 16:06:41 +08:00

423 lines
20 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 Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Nice3point.Revit.Toolkit.External;
using System;
using System.Linq;
using System.Windows;
using System.Windows.Interop;
using Szmedi.RvKits.ModelManager;
namespace Szmedi.RvKits.DrawingTools;
[Transaction(TransactionMode.Manual)]
public class Dimension2DTo3DCmd : ExternalCommand
{
public override void Execute()
{
View viewPlan = Document.ActiveView;
CopyAnnotationViewModel viewModel = new(UiApplication);
CopyAnnotationWin win = null;
//AssemblyLoaderHelpers loader = new(GlobalVariables.DirAssembly);
//loader.HookAssemblyResolve();
List<MessageModel> models = new();
try
{
win = new CopyAnnotationWin(viewModel);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
LogAssists.WriteLog(e.StackTrace);
}
//finally
//{
// loader.UnhookAssemblyResolve();
//}
List<Dimension> dimensions = new FilteredElementCollector(Document, viewPlan.Id)
.OfClass(typeof(Dimension))
.WhereElementIsNotElementType()
.Cast<Dimension>()
.ToList();
if (win != null && win.ShowDialog() == true)
{
if (win.DialogResult == true)
{
using TransactionGroup group = new(Document, "复制平面标注");
group.Start();
foreach (View3D view3D in viewModel.View3DsSelected)
{
SketchPlane originSketch = view3D.SketchPlane;
using (Transaction ts = new(Document, "复制尺寸标注"))
{
foreach (Dimension dimension in dimensions)
{
try
{
ts.Start();
List<Reference> references = new();
Curve curve = dimension.Curve;
curve.MakeBound(0, 100);
Plane plane = Plane.CreateByNormalAndOrigin(XYZ.BasisZ, curve.GetEndPoint(0));
view3D.SketchPlane = SketchPlane.Create(Document, plane);
switch (dimension.DimensionShape)
{
case DimensionShape.Linear:
bool isContainMepCurve = false;
Curve locCurve = null;
ReferenceArray array = new();
foreach (Reference reference in dimension.References)
{
//重新定义参照平面为管线的平面
if (Document.GetElement(reference) is MEPCurve mepCurve)
{
LocationCurve loc = mepCurve.Location as LocationCurve;
locCurve = loc.Curve;
plane = Plane.CreateByNormalAndOrigin(XYZ.BasisZ, locCurve.GetEndPoint(0));
view3D.SketchPlane = SketchPlane.Create(Document, plane);
isContainMepCurve = true;
if (reference.ConvertToStableRepresentation(Document).EndsWith(":0:LINEAR"))
{
array.Append(new Reference(mepCurve));
continue;
}
}
array.Append(reference);
}
if (isContainMepCurve)
{
double dis = locCurve.GetEndPoint(0).Z - curve.GetEndPoint(0).Z;
Curve finalCurve = dimension.Curve.CreateTransformed(
Transform.CreateTranslation(dis * XYZ.BasisZ)
);
Document.Create.NewDimension(view3D, finalCurve as Line, array, dimension.DimensionType);
}
else
{
Document.Create.NewDimension(
view3D,
dimension.Curve as Line,
dimension.References,
dimension.DimensionType
);
//dim.Curve.CreateTransformed(Transform.CreateTranslation(10 * XYZ.BasisZ));
}
//var elem = doc.GetElement(dimension.References.get_Item(0));
break;
case DimensionShape.Angular:
foreach (Reference reference in dimension.References)
{
references.Add(reference);
}
AngularDimension.Create(
Document,
view3D,
dimension.Curve as Arc,
references,
dimension.DimensionType
);
break;
case DimensionShape.Radial:
break;
case DimensionShape.ArcLength:
break;
case DimensionShape.Spot:
int code = dimension.Category.GetHashCode();
Reference refer = dimension.References.get_Item(0);
if (code == -2000263) //高程点
{
SpotDimension spot = Document.Create.NewSpotElevation(
view3D,
refer,
dimension.Origin,
dimension.Origin,
dimension.Origin,
dimension.Origin,
true
);
continue;
}
if (code == -2000264) //坐标点
{
SpotDimension spot = Document.Create.NewSpotCoordinate(
view3D,
refer,
dimension.Origin,
dimension.Origin,
dimension.Origin,
dimension.Origin,
true
);
continue;
}
break;
case DimensionShape.Diameter:
break;
case DimensionShape.Unknown:
break;
}
ts.Commit();
}
catch (Exception)
{
models.Add(new MessageModel(dimension, "无法复制"));
if (ts.GetStatus() == TransactionStatus.Started)
{
ts.Commit();
}
//TaskDialog.Show("错误", e.Message);
}
}
//if (dimension.DimensionShape == DimensionShape.Radial)
//{
// continue;
//}
//if (dimension.DimensionShape == DimensionShape.Diameter)
//{
// continue;
//}
}
using (Transaction ts = new(Document, "重置工作平面"))
{
ts.Start();
view3D.SketchPlane = originSketch;
ts.Commit();
}
using Transaction trans = new(Document, "复制标记");
trans.Start();
bool canCopyTag = false;
if (view3D.CanBeLocked() && view3D.CanSaveOrientation())
{
view3D.SaveOrientationAndLock();
canCopyTag = true;
}
else
{
MessageBoxResult result = MessageBox.Show(
"视图名存在意外的字符,族的标记将不会复制,是否继续?",
"错误",
MessageBoxButton.OKCancel,
MessageBoxImage.Warning
);
if (result == MessageBoxResult.Cancel)
{
Result = Result.Cancelled;
return;
}
}
IEnumerable<TextNote> textList = new FilteredElementCollector(Document, viewPlan.Id)
.OfClass(typeof(TextNote))
.ToElements()
.Cast<TextNote>();
IEnumerable<IndependentTag> tags = new FilteredElementCollector(Document, viewPlan.Id)
.OfClass(typeof(IndependentTag))
.ToElements()
.Cast<IndependentTag>();
foreach (TextNote text in textList)
{
XYZ position = text.Coord + (viewPlan.GenLevel.Elevation * XYZ.BasisZ);
TextNoteOptions options =
new()
{
KeepRotatedTextReadable = false,
HorizontalAlignment = text.HorizontalAlignment,
Rotation = 0,
TypeId = text.TextNoteType.Id
};
TextNote note = TextNote.Create(Document, view3D.Id, position, text.Width, text.Text, options);
note.SetFormattedText(text.GetFormattedText());
note.LeaderLeftAttachment = text.LeaderLeftAttachment;
note.LeaderRightAttachment = text.LeaderRightAttachment;
}
//try
//{
if (canCopyTag)
{
foreach (IndependentTag tag in tags)
{
IndependentTag tagCopy;
double maxZ = Document.GetElement(tag.GetTaggedReference()).get_BoundingBox(view3D).Max.Z;
XYZ position = new(tag.TagHeadPosition.X, tag.TagHeadPosition.Y, maxZ);
if (tag.IsOrphaned)
{
continue;
}
tagCopy = tag.IsMaterialTag
? IndependentTag.Create(
Document,
view3D.Id,
tag.GetTaggedReference(),
tag.HasLeader,
TagMode.TM_ADDBY_MATERIAL,
tag.TagOrientation,
position
)
: tag.IsMulticategoryTag
? IndependentTag.Create(
Document,
view3D.Id,
tag.GetTaggedReference(),
tag.HasLeader,
TagMode.TM_ADDBY_MULTICATEGORY,
tag.TagOrientation,
position
)
: IndependentTag.Create(
Document,
view3D.Id,
tag.GetTaggedReference(),
tag.HasLeader,
TagMode.TM_ADDBY_CATEGORY,
tag.TagOrientation,
position
);
tagCopy.ChangeTypeId(tag.GetTypeId());
Document.Regenerate();
if (tagCopy.IsValidObject)
{
tagCopy.HasLeader = tag.HasLeader;
if (tagCopy.HasLeader)
{
switch (tag.LeaderEndCondition)
{
case LeaderEndCondition.Attached:
tagCopy.TagHeadPosition = position;
break;
case LeaderEndCondition.Free:
tagCopy.TagHeadPosition = position;
try
{
tagCopy.LeaderEnd = new XYZ(tag.LeaderEnd.X, tag.LeaderEnd.Y, maxZ);
}
catch (Exception e)
{
LogAssists.WriteLog(e.Message);
models.Add(new MessageModel(tag, "无法修改引线端点值,需重建"));
//stringBuilder.AppendLine($"{tag.Id.IntegerValue}");
}
break;
}
}
if (tagCopy.CanLeaderEndConditionBeAssigned(tag.LeaderEndCondition))
{
tagCopy.LeaderEndCondition = tag.LeaderEndCondition;
}
if (tag.HasLeader && tag.HasElbow)
{
tagCopy.LeaderElbow = new XYZ(tag.LeaderElbow.X, tag.LeaderElbow.Y, maxZ);
}
}
else
{
models.Add(new MessageModel(tag, "无法复制"));
//stringBuilder.AppendLine($"标注类型:{tag.Name}标注Id{tag.Id.IntegerValue}");
}
}
}
trans.Commit();
//}
//catch (Exception ex)
//{
// message = ex.InnerException.ToString();
// if (trans.GetStatus() == TransactionStatus.Started)
// {
// trans.RollBack();
// }
// return Result.Failed;
//}
}
if (group.GetStatus() == TransactionStatus.Started)
{
group.Assimilate();
}
//if (sb.ToString().Length > 0)
//{
// var result = TaskDialog.Show("标注复制问题", "需要手动解决的标注:\n\n" + sb + "\n是否保存到桌面并打开", TaskDialogCommonButtons.Yes | TaskDialogCommonButtons.No);
// if (result == TaskDialogResult.Yes)
// {
// var filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) +
// $"\\标注问题 {DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-ffff")}.txt";
// File.WriteAllText(filePath
// , sb.ToString());
// System.Diagnostics.Process.Start(filePath);
// }
//}
if (models.Count > 0)
{
MessageWin messageWin = new() { DataContext = new MessageViewModel(UiDocument, models) };
new WindowInteropHelper(messageWin) { Owner = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle };
messageWin.Show();
//var result = TaskDialog.Show("标记复制问题", "需要手动解决的标注:\n\n" + stringBuilder + "\n是否保存到桌面并打开", TaskDialogCommonButtons.Yes | TaskDialogCommonButtons.No);
//if (result == TaskDialogResult.Yes)
//{
// var filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) +
// $"\\标注问题 {DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-ffff")}.txt";
// File.WriteAllText(filePath
// , stringBuilder.ToString());
// System.Diagnostics.Process.Start(filePath);
//}
}
}
}
}
private void AdjustTextDirection(Document Document)
{
IEnumerable<TextNote> textList = new FilteredElementCollector(Document, Document.ActiveView.Id)
.OfClass(typeof(TextNote))
.ToElements()
.Cast<TextNote>();
using Transaction trans = new(Document, "调整文字朝向");
foreach (TextNote text in textList)
{
try
{
trans.Start();
text.KeepRotatedTextReadable = false;
Document.Regenerate();
text.KeepRotatedTextReadable = true;
trans.Commit();
}
catch (Exception)
{
if (trans.GetStatus() == TransactionStatus.Started)
{
trans.RollBack();
}
}
}
}
}