Esempio n. 1
0
        /// <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 (deletes.Count == 0)
            {
                return;
            }
            foreach (var deleteId in deletes)
            {
                var entity = collection.FirstOrDefault(c => c.TagId == deleteId.IntegerValue);
                if (entity != null)
                {
                    var line = doc.GetElement(new ElementId(entity.LineId));
                    if (line != null)
                    {
                        doc.Delete(line.Id);
                    }
                    collection.Remove(entity);
                }


                //var element = doc.GetElement(deleteId);
                //SchemaEntityOpr opr = new SchemaEntityOpr(element);
                //string relatedLineField = BeamAnnotationConstaints.relatedLineField;
                //var relatedLineId = opr.GetParm(relatedLineField);
                //var line = doc.GetElement(new ElementId(int.Parse(relatedLineId))) as DetailLine;
                //if (line != null)
                //    doc.Delete(line.Id);
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        ///// <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);
        }