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 models = new(); try { win = new CopyAnnotationWin(viewModel); } catch (Exception e) { MessageBox.Show(e.Message); LogAssists.WriteLog(e.StackTrace); } //finally //{ // loader.UnhookAssemblyResolve(); //} List dimensions = new FilteredElementCollector(Document, viewPlan.Id) .OfClass(typeof(Dimension)) .WhereElementIsNotElementType() .Cast() .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 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 textList = new FilteredElementCollector(Document, viewPlan.Id) .OfClass(typeof(TextNote)) .ToElements() .Cast(); IEnumerable tags = new FilteredElementCollector(Document, viewPlan.Id) .OfClass(typeof(IndependentTag)) .ToElements() .Cast(); 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 textList = new FilteredElementCollector(Document, Document.ActiveView.Id) .OfClass(typeof(TextNote)) .ToElements() .Cast(); 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(); } } } } }