public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { var uiApp = commandData.Application; var app = commandData.Application.Application; var uiDoc = commandData.Application.ActiveUIDocument; var doc = commandData.Application.ActiveUIDocument.Document; if (selectedId == null) { selectedId = uiDoc.Selection.PickObject(ObjectType.Element, new BeamFramingFilter()).ElementId; } string tagName = "梁平法_集中标_左对齐"; FamilySymbol tagSymbol = null; VLTransactionHelper.DelegateTransaction(doc, "加载族", () => { #region 加载族 //查找族类型 var symbols = new FilteredElementCollector(doc) .WherePasses(new ElementCategoryFilter(BuiltInCategory.OST_StructuralFramingTags)) .WherePasses(new ElementClassFilter(typeof(FamilySymbol))); var targetSymbol = symbols.FirstOrDefault(c => (c as FamilySymbol).FamilyName == tagName); if (targetSymbol != null) { tagSymbol = targetSymbol as FamilySymbol; } //空时加载族类型 if (tagSymbol == null) { var symbolFile = @"E:\WorkingSpace\Tasks\0526标注\梁平法_集中标_左对齐.rfa"; Family family; if (doc.LoadFamily(symbolFile, out family)) { //获取族类型集合Id var familySymbolIds = family.GetFamilySymbolIds(); foreach (var familySymbolId in familySymbolIds) { var e = doc.GetElement(familySymbolId) as FamilySymbol; if (e != null && e.FamilyName == tagName) { tagSymbol = e; break; } } } else { TaskDialogShow("加载族文件失败"); } } #endregion if (tagSymbol == null) { return(false); } #region 参数赋值 //如果上述两者获取到了对应的族 var view = doc.ActiveView; var element = doc.GetElement(selectedId); //参数赋值 BeamAnnotationData.LoadConfig(doc); var beamParameterNames = Enum.GetNames(typeof(BeamAnnotationParameters)); var parameter = element.GetParameters(nameof(BeamAnnotationParameters.梁名称)).FirstOrDefault(); if (parameter == null) { string shareFilePath = @"E:\WorkingSpace\Tasks\0526标注\标注_共享参数(全).txt"; var parameterHelper = new Utilities.ShareParameter(shareFilePath); foreach (var beamParameterName in beamParameterNames) { if (new List <string>() { nameof(BeamAnnotationParameters.梁名称) , nameof(BeamAnnotationParameters.箍筋直径) } .Contains(beamParameterName)) { AddSharedParameterByDefaulGroupName(doc, shareFilePath, BeamAnnotationParameterGroupName, beamParameterName, element.Category, true, Autodesk.Revit.DB.BuiltInParameterGroup.PG_TEXT); } //parameterHelper.AddShadeParameter(doc, shareFilePath, BeamAnnotationParameterGroupName, beamParameterName, element.Category, false, Autodesk.Revit.DB.BuiltInParameterGroup.PG_TEXT); else if (new List <string>() { nameof(BeamAnnotationParameters.梁宽) , nameof(BeamAnnotationParameters.梁高) } .Contains(beamParameterName)) { AddSharedParameterByDefaulGroupName(doc, shareFilePath, BeamAnnotationParameterGroupName, beamParameterName, element.Category, false, Autodesk.Revit.DB.BuiltInParameterGroup.PG_GEOMETRY); } //parameterHelper.AddShadeParameter(doc, BeamAnnotationParameterGroupName, beamParameterName, element.Category, true, Autodesk.Revit.DB.BuiltInParameterGroup.PG_GEOMETRY); else { AddSharedParameterByDefaulGroupName(doc, shareFilePath, BeamAnnotationParameterGroupName, beamParameterName, element.Category, true, Autodesk.Revit.DB.BuiltInParameterGroup.INVALID); } //parameterHelper.AddShadeParameter(doc, BeamAnnotationParameterGroupName, beamParameterName, element.Category, false, Autodesk.Revit.DB.BuiltInParameterGroup.INVALID); } } //参数赋值 element.GetParameters(nameof(BeamAnnotationParameters.梁名称)).FirstOrDefault().Set(BeamAnnotationData.BeamName); element.GetParameters(nameof(BeamAnnotationParameters.梁加腋)).FirstOrDefault().Set(BeamAnnotationData.BeamHaunching); element.GetParameters(nameof(BeamAnnotationParameters.梁加腋可见性)).FirstOrDefault().Set(Convert.ToInt32(BeamAnnotationData.BeamHaunchingVisibility)); element.GetParameters(nameof(BeamAnnotationParameters.梁箍筋)).FirstOrDefault().Set(BeamAnnotationData.Hooping); element.GetParameters(nameof(BeamAnnotationParameters.箍筋直径)).FirstOrDefault().Set(BeamAnnotationData.HoopingDiameter); element.GetParameters(nameof(BeamAnnotationParameters.梁纵筋)).FirstOrDefault().Set(BeamAnnotationData.LongitudinalBar); element.GetParameters(nameof(BeamAnnotationParameters.纵筋级别)).FirstOrDefault().Set(BeamAnnotationData.LongitudinalBarLevel); element.GetParameters(nameof(BeamAnnotationParameters.梁腰筋)).FirstOrDefault().Set(BeamAnnotationData.WaistBar); element.GetParameters(nameof(BeamAnnotationParameters.腰筋级别)).FirstOrDefault().Set(BeamAnnotationData.WaistBarLevel); element.GetParameters(nameof(BeamAnnotationParameters.梁顶绝对标高)).FirstOrDefault().Set(BeamAnnotationData.BeamAbsoluteTop); element.GetParameters(nameof(BeamAnnotationParameters.梁顶相对偏移)).FirstOrDefault().Set(BeamAnnotationData.BeamRelationalSkew); var symbol = (element as FamilyInstance).Symbol; symbol.GetParameters(nameof(BeamAnnotationParameters.梁宽)).FirstOrDefault().Set(BeamAnnotationData.BeamWidth); symbol.GetParameters(nameof(BeamAnnotationParameters.梁高)).FirstOrDefault().Set(BeamAnnotationData.BeamHeight); var familyDoc = doc.EditFamily(symbol.Family); #endregion #region 绘图处理 //绘图处理 double parallelLength = BeamAnnotationConstaints.parallelLength; int vecticalLength = BeamAnnotationConstaints.vecticalLength; int standardLength = BeamAnnotationConstaints.standardLength; string relatedLineField = BeamAnnotationConstaints.relatedLineField; string relatedTagField = BeamAnnotationConstaints.relatedTagField; string relatedBeamField = BeamAnnotationConstaints.relatedBeamField; string relatedViewField = BeamAnnotationConstaints.relatedViewField; view = doc.ActiveView; var beam = doc.GetElement(selectedId); //中点出线 var locationCurve = (beam.Location as LocationCurve).Curve; var midPoint = (locationCurve.GetEndPoint(0) + locationCurve.GetEndPoint(1)) / 2; var parallelVector = (locationCurve as Line).Direction; if (parallelVector.X < 0 || (parallelVector.X == 0 && parallelVector.Y == -1)) { parallelVector = new XYZ(-parallelVector.X, -parallelVector.Y, parallelVector.Z); } var vecticalVector = new XYZ(parallelVector.Y, -parallelVector.X, 0); var line = doc.Create.NewDetailCurve(view, Line.CreateBound(midPoint, midPoint + standardLength * vecticalVector)); //中点绘字 var tag1 = doc.Create.NewTag(view, beam, false, TagMode.TM_ADDBY_CATEGORY, TagOrientation.Horizontal, midPoint); //确定长宽 var targetPoint = (locationCurve.GetEndPoint(0) + locationCurve.GetEndPoint(1)) / 2 + parallelLength * parallelVector + vecticalLength * vecticalVector; ////删除中点绘字 doc.Delete(tag1.Id); //综合移动 var tag2 = doc.Create.NewTag(view, beam, false, TagMode.TM_ADDBY_CATEGORY, TagOrientation.Horizontal, targetPoint); //关系存储 var collection = MyTestContext.GetCollection(doc); collection.Add(new BeamAnnotationEntity(view.Id.IntegerValue, beam.Id.IntegerValue, line.Id.IntegerValue, tag2.Id.IntegerValue)); MyTestContext.SaveCollection(doc); #endregion return(true); }); return(Result.Succeeded); }
///// <summary> ///// 采用 Extensible Storage ///// </summary> ///// <param name="updateData"></param> //public void Execute(UpdaterData updateData) //{ // var doc = updateData.GetDocument(); // var adds = updateData.GetAddedElementIds(); // var edits = updateData.GetModifiedElementIds(); // var deletes = updateData.GetDeletedElementIds(); // //var collection = MyTestContext.GetCollection(doc); // if (edits.Count == 0) // return; // if (IsEditing == true) // { // IsEditing = false; // return; // } // double parallelLength = BeamAnnotationConstaints.parallelLength; // int vecticalLength = BeamAnnotationConstaints.vecticalLength; // int standardLength = BeamAnnotationConstaints.standardLength; // string relatedLineField = BeamAnnotationConstaints.relatedLineField; // string relatedTagField = BeamAnnotationConstaints.relatedTagField; // string relatedBeamField = BeamAnnotationConstaints.relatedBeamField; // string relatedViewField = BeamAnnotationConstaints.relatedViewField; // foreach (var editId in edits) // { // var element = doc.GetElement(editId); // View view; // Element beam; // IndependentTag tag; // DetailLine line; // SchemaEntityOpr opr = new SchemaEntityOpr(element); // var relatedBeamId = opr.GetParm(relatedBeamField); // if (string.IsNullOrEmpty(relatedBeamId)) // return; // var relatedViewId = opr.GetParm(relatedViewField); // if (string.IsNullOrEmpty(relatedViewId)) // return; // beam = doc.GetElement(new ElementId(int.Parse(relatedBeamId))); // view = doc.GetElement(new ElementId(int.Parse(relatedViewId))) as View; // tag = element as IndependentTag; // bool isLineMoved; // if (tag != null) // { // var relatedLineId = opr.GetParm(relatedLineField); // if (string.IsNullOrEmpty(relatedLineId)) // return; // line = doc.GetElement(new ElementId(int.Parse(relatedLineId))) as DetailLine; // isLineMoved = false; // } // else // { // line = element as DetailLine; // var relatedTagId = opr.GetParm(relatedTagField); // tag = doc.GetElement(new ElementId(int.Parse(relatedTagId))) as IndependentTag; // isLineMoved = true; // } // var beamCurve = (beam.Location as LocationCurve).Curve; // //平行 单位向量 // var parallelVector = (beamCurve as Line).Direction; // if (parallelVector.X < 0 || (parallelVector.X == 0 && parallelVector.Y == -1)) // parallelVector = new XYZ(-parallelVector.X, -parallelVector.Y, parallelVector.Z); // //垂直 单位向量 // var vecticalVector = new XYZ(parallelVector.Y, -parallelVector.X, 0); // //重新计算线的位置 // if (isLineMoved) // { // //重新计算线的位置 // var lineLocationCurve = line.Location as LocationCurve; // var currentPoint0 = lineLocationCurve.Curve.GetEndPoint(0); // var currentPoint1 = lineLocationCurve.Curve.GetEndPoint(1); // beamCurve.MakeUnbound(); // var project = beamCurve.Project(currentPoint0); // var length = currentPoint1.DistanceTo(project.XYZPoint); // currentPoint0 = project.XYZPoint; // if (currentPoint1.DistanceTo(currentPoint0) < standardLength) // currentPoint1 = currentPoint0 + standardLength * vecticalVector; // doc.Delete(line.Id); // var newLine = doc.Create.NewDetailCurve(view, Line.CreateBound(currentPoint0, currentPoint1)); // //重新计算标签的位置 // tag.TagHeadPosition = currentPoint1 - standardLength * vecticalVector + (parallelLength * parallelVector + vecticalLength * vecticalVector); // //更新扩展存储 // opr = new SchemaEntityOpr(newLine); // opr.SetParm(relatedViewField, view.Id.IntegerValue.ToString()); // opr.SetParm(relatedBeamField, beam.Id.IntegerValue.ToString()); // opr.SetParm(relatedTagField, tag.Id.IntegerValue.ToString()); // opr.SaveTo(newLine); // opr = new SchemaEntityOpr(tag); // opr.SetParm(relatedLineField, newLine.Id.IntegerValue.ToString()); // opr.SaveTo(tag); // } // else // { // //重新计算线的位置 // var currentPoint0 = tag.TagHeadPosition - (parallelLength * parallelVector + vecticalLength * vecticalVector); // var midPoint = (beamCurve.GetEndPoint(0) + beamCurve.GetEndPoint(1)) / 2; // var orientPoint0 = new XYZ(midPoint.X, midPoint.Y, currentPoint0.Z);//梁的Z轴为0与Curve绘制的轴不一致,调整为以Curve为准 // var currentPoint1 = currentPoint0 + standardLength * vecticalVector; // beamCurve.MakeUnbound(); // var project = beamCurve.Project(currentPoint0); // if (currentPoint1.DistanceTo(project.XYZPoint) < standardLength) // { // currentPoint0 = project.XYZPoint; // currentPoint1 = currentPoint0 + standardLength * vecticalVector; // //重新计算标签的位置 // tag.TagHeadPosition = currentPoint1 - standardLength * vecticalVector + (parallelLength * parallelVector + vecticalLength * vecticalVector); // } // else // { // var skewLine = Line.CreateBound(orientPoint0, currentPoint0); // currentPoint0 = orientPoint0 + skewLine.Length * Math.Cos(skewLine.Direction.AngleTo(parallelVector)) * parallelVector; // } // if (line != null) // doc.Delete(line.Id); // var newLine = doc.Create.NewDetailCurve(view, Line.CreateBound(currentPoint0, currentPoint1)); // //更新扩展存储 // opr = new SchemaEntityOpr(newLine); // opr.SetParm(relatedViewField, view.Id.IntegerValue.ToString()); // opr.SetParm(relatedBeamField, beam.Id.IntegerValue.ToString()); // opr.SetParm(relatedTagField, tag.Id.IntegerValue.ToString()); // opr.SaveTo(newLine); // opr = new SchemaEntityOpr(tag); // opr.SetParm(relatedLineField, newLine.Id.IntegerValue.ToString()); // opr.SaveTo(tag); // } // } // IsEditing = true;// 标签的移动 会触发标签移动的回调 //} #endregion #region MyTestContext.GetCollection方案 public void Execute(UpdaterData updateData) { var doc = updateData.GetDocument(); var adds = updateData.GetAddedElementIds(); var edits = updateData.GetModifiedElementIds(); var deletes = updateData.GetDeletedElementIds(); var collection = MyTestContext.GetCollection(doc); if (edits.Count == 0) { return; } if (IsEditing == true) { IsEditing = false; return; } double parallelLength = BeamAnnotationConstaints.parallelLength; int vecticalLength = BeamAnnotationConstaints.vecticalLength; string relatedLineField = BeamAnnotationConstaints.relatedLineField; string relatedTagField = BeamAnnotationConstaints.relatedTagField; string relatedBeamField = BeamAnnotationConstaints.relatedBeamField; string relatedViewField = BeamAnnotationConstaints.relatedViewField; foreach (var editId in edits) { var element = doc.GetElement(editId); View view; Element beam; IndependentTag tag; DetailLine line; BeamAnnotationEntity entity = null; var lineMoved = collection.FirstOrDefault(c => c.LineId == editId.IntegerValue); if (lineMoved != null) { entity = lineMoved; } var tagMoved = collection.FirstOrDefault(c => c.TagId == editId.IntegerValue); if (tagMoved != null) { entity = tagMoved; } if (entity == null) { return; } beam = doc.GetElement(new ElementId(entity.BeamId)); view = doc.GetElement(new ElementId(entity.ViewId)) as View; bool isLineMoved; if (lineMoved != null) { tag = doc.GetElement(new ElementId(entity.TagId)) as IndependentTag; line = doc.GetElement(editId) as DetailLine; isLineMoved = true; } else { tag = doc.GetElement(editId) as IndependentTag; line = doc.GetElement(new ElementId(entity.LineId)) as DetailLine; isLineMoved = false; } var beamCurve = (beam.Location as LocationCurve).Curve; //平行 单位向量 var parallelVector = (beamCurve as Line).Direction; if (parallelVector.X < 0 || (parallelVector.X == 0 && parallelVector.Y == -1)) { parallelVector = new XYZ(-parallelVector.X, -parallelVector.Y, parallelVector.Z); } //垂直 单位向量 var vecticalVector = new XYZ(parallelVector.Y, -parallelVector.X, 0); var tagDiagonalXYZ = parallelLength * parallelVector + vecticalLength * vecticalVector; //重新计算线的位置 if (isLineMoved) { var lineLocationCurve = line.Location as LocationCurve; var currentPoint0 = lineLocationCurve.Curve.GetEndPoint(0); var currentPoint1 = lineLocationCurve.Curve.GetEndPoint(1); //重新计算线的位置 //重新计算标签的位置 var tagPoint = CalculateTagPointAndLinePointFromLine(beamCurve, vecticalVector, ref currentPoint0, ref currentPoint1); //模型更新 doc.Delete(line.Id); var newLine = doc.Create.NewDetailCurve(view, Line.CreateBound(currentPoint0, currentPoint1)); tag.TagHeadPosition = tagPoint + tagDiagonalXYZ; //更新存储 entity.LineId = newLine.Id.IntegerValue; } else { //重新计算线的位置 //重新计算标签的位置 XYZ currentPoint0, currentPoint1; var tagPoint = CalculateTagPointAndLinePointFromTag(beamCurve, tag.TagHeadPosition, parallelVector, vecticalVector, out currentPoint0, out currentPoint1); if (line != null) { doc.Delete(line.Id); } var newLine = doc.Create.NewDetailCurve(view, Line.CreateBound(currentPoint0, currentPoint1)); if (tagPoint != null) { tag.TagHeadPosition = tagPoint + tagDiagonalXYZ; } //更新存储 entity.LineId = newLine.Id.IntegerValue; } } IsEditing = true;// 标签的移动 会触发标签移动的回调 MyTestContext.SaveCollection(doc); }