コード例 #1
0
ファイル: PAACreator.cs プロジェクト: wzfxue/Revit
        private bool GenerateMultiplePipe(PAAModel model)
        {
            Document doc  = model.Document;
            View     view = doc.GetElement(model.ViewId) as View;

            if (view == null)
            {
                return(false);
            }
            model.CalculateLocations();
            if (model.IsRegenerate)
            {
                model.Clear();
            }
            XYZ parallelVector    = model.ParallelVector;
            XYZ verticalVector    = model.VerticalVector;
            var pipeAndNodePoints = model.PipeAndNodePoints;
            //线 创建
            FamilyInstance line = doc.Create.NewFamilyInstance(model.TargetLocation, model.GetLineFamily(doc), view);
            //线 旋转处理
            LocationPoint locationPoint = line.Location as LocationPoint;

            locationPoint.RotateByXY(model.TargetLocation, model.VerticalVector);
            model.LineId = line.Id;
            UpdateLineParameters(model, pipeAndNodePoints, line, verticalVector);
            //标注 创建
            model.AnnotationIds = new List <ElementId>();
            for (int i = 0; i < pipeAndNodePoints.Count(); i++)
            {
                var subTag = doc.Create.NewTag(view, pipeAndNodePoints[i].Target, false, TagMode.TM_ADDBY_CATEGORY, TagOrientation.Horizontal, pipeAndNodePoints[i].AnnotationPoint);
                model.AnnotationIds.Add(subTag.Id);
            }
            return(true);
        }
コード例 #2
0
ファイル: PAACreator.cs プロジェクト: wzfxue/Revit
        /// <summary>
        /// 线 参数设置
        /// </summary>
        /// <param name="nodePoints"></param>
        /// <param name="line"></param>
        private void UpdateLineParameters(PAAModel model, List <ElementAndNodePoint> nodePoints, FamilyInstance line, XYZ verticalVector)
        {
            double deepLength = Math.Abs((nodePoints.Last().NodePoint - nodePoints.First().NodePoint).DotProduct(verticalVector));

            line.GetParameters(TagProperty.线高度1.ToString()).First().Set(model.LineHeight);
            line.GetParameters(TagProperty.线宽度.ToString()).First().Set(model.LineWidth);
            line.GetParameters(TagProperty.线下探长度.ToString()).First().Set(deepLength);
            line.GetParameters(TagProperty.间距.ToString()).First().Set(model.CurrentFontHeight);
            line.GetParameters(TagProperty.文字行数.ToString()).First().Set(nodePoints.Count());
            for (int i = 2; i <= 8; i++)
            {
                var first = nodePoints.First();
                if (nodePoints.Count() >= i)
                {
                    var cur = nodePoints[i - 1];
                    //line.GetParameters(string.Format("节点{0}可见性", i)).First().Set(1);
                    line.GetParameters(string.Format("节点{0}距离", i)).First().Set(Math.Abs((cur.NodePoint - first.NodePoint).DotProduct(verticalVector)));
                }
                else
                {
                    //line.GetParameters(string.Format("节点{0}可见性", i)).First().Set(0);
                    line.GetParameters(string.Format("节点{0}距离", i)).First().Set(0);
                }
            }
        }
コード例 #3
0
ファイル: PAACreator.cs プロジェクト: wzfxue/Revit
        //public void Regenerate(Document doc, PAAModelForSingle model, Element target)
        //{
        //    //FamilyInstance line = doc.GetElement(model.LineId) as FamilyInstance;
        //    //PAAContext.Creator.Regenerate(doc, model, target, (line.Location as LocationPoint).Point - model.LineLocation);
        //}

        public bool Regenerate(PAAModel model)
        {
            if (model.ModelType == PAAModelType.SinglePipe)
            {
                model.Clear();
            }
            return(Generate(model));
        }
コード例 #4
0
ファイル: PAACreator.cs プロジェクト: wzfxue/Revit
        public bool Generate(PAAModel model)
        {
            switch (model.ModelType)
            {
            case PAAModelType.SinglePipe:
                return(GenerateSinglePipe(model));

            case PAAModelType.MultiplePipe:
                return(GenerateMultiplePipe(model));

            case PAAModelType.SingleDuct:
            case PAAModelType.SingleCableTray:
                return(GenerateSingle_LeftOrMiddle(model));

            default:
                return(false);
            }
        }
コード例 #5
0
ファイル: PAACreator.cs プロジェクト: wzfxue/Revit
        private static bool GenerateSinglePipe(PAAModel model)
        {
            Document doc  = model.Document;
            View     view = doc.GetElement(model.ViewId) as View;

            if (view == null)
            {
                return(false);
            }
            //主体
            var target         = doc.GetElement(model.TargetId);
            var targetLocation = target.Location as LocationCurve;
            var p0             = targetLocation.Curve.GetEndPoint(0);
            var p1             = targetLocation.Curve.GetEndPoint(1);
            var pMiddle        = new XYZ((p0.X + p1.X) / 2, (p0.Y + p1.Y) / 2, (p0.Z + p1.Z) / 2);

            model.TargetLocation = pMiddle;
            //线生成
            List <Line> lines = new List <Line>();

            model.CalculateLocations();                                            //计算内容定位
            lines.Add(Line.CreateBound(model.BodyStartPoint, model.BodyEndPoint)); //竖干线
            lines.Add(Line.CreateBound(model.BodyEndPoint, model.LeafEndPoint));   //斜支线
            model.LineIds = new List <ElementId>();
            foreach (var line in lines)
            {
                var lineElement = doc.Create.NewDetailCurve(view, line);
                model.LineIds.Add(lineElement.Id);
            }
            //文本生成
            IndependentTag subTag = doc.Create.NewTag(view, doc.GetElement(model.TargetId), false, TagMode.TM_ADDBY_CATEGORY, TagOrientation.Horizontal, model.AnnotationLocation);

            model.AnnotationId     = subTag.Id;
            subTag.TagHeadPosition = model.AnnotationLocation;
            subTag.ChangeTypeId(model.GetAnnotationFamily(doc, model.TargetId).Id);
            return(true);
        }
コード例 #6
0
ファイル: PAACreator.cs プロジェクト: wzfxue/Revit
        private static bool GenerateSingle_LeftOrMiddle(PAAModel model)
        {
            Document doc    = model.Document;
            View     view   = doc.ActiveView;
            var      target = doc.GetElement(model.TargetId);
            var      line   = (target.Location as LocationCurve).Curve as Line;

            model.UpdateVectors(line);
            var p0 = line.GetEndPoint(0);
            var p1 = line.GetEndPoint(1);

            switch (model.TextType)
            {
            case PAATextType.Option1:
                var location = (p0 + p1) / 2;
                model.UpdateLineWidth(target);
                location = location - model.LineWidth / 2 * model.ParallelVector;
                IndependentTag subTag = doc.Create.NewTag(view, doc.GetElement(model.TargetId), false, TagMode.TM_ADDBY_CATEGORY, TagOrientation.Horizontal, location);
                subTag.ChangeTypeId(model.GetAnnotationFamily(doc, model.TargetId).Id);
                break;

            case PAATextType.Option2:
                //location = p0.GetLengthBySide(model.ParallelVector) > p1.GetLengthBySide(model.ParallelVector) ? p1 : p0;//左上角
                location = (p0 + p1) / 2;
                model.UpdateLineWidth(target);
                location  = location - model.LineWidth / 2 * model.ParallelVector;
                location += model.CurrentFontHeight * model.VerticalVector;
                subTag    = doc.Create.NewTag(view, doc.GetElement(model.TargetId), false, TagMode.TM_ADDBY_CATEGORY, TagOrientation.Horizontal, location);
                subTag.ChangeTypeId(model.GetAnnotationFamily(doc, model.TargetId).Id);
                break;

            default:
                break;
            }
            return(false);
        }
コード例 #7
0
ファイル: PAAUpdater_Edit.cs プロジェクト: wzfxue/Revit
        public void Execute(UpdaterData updateData)
        {
            try
            {
                if (PAAContext.IsEditing == true)
                {
                    PAAContext.IsEditing = false;
                    return;
                }
                var        document      = updateData.GetDocument();
                var        edits         = updateData.GetModifiedElementIds();
                var        collection    = PAAContext.GetCollection(document);
                List <int> movedEntities = new List <int>();
                foreach (var changeId in edits)
                {
                    PAAModel model = null;

                    #region 单管 主体 重新生成
                    var targetMoved = collection.Data.FirstOrDefault(c => c.TargetId == changeId);
                    if (targetMoved != null)
                    {
                        model = targetMoved;
                        if (movedEntities.Contains(model.TargetId.IntegerValue))
                        {
                            continue;
                        }
                        var creater        = PAAContext.Creator;
                        var target         = document.GetElement(model.TargetId);//标注主体失效时删除
                        var targetLocation = target.Location as LocationCurve;
                        var p0             = targetLocation.Curve.GetEndPoint(0);
                        var p1             = targetLocation.Curve.GetEndPoint(1);
                        var pMiddle        = new XYZ((p0.X + p1.X) / 2, (p0.Y + p1.Y) / 2, (p0.Z + p1.Z) / 2);
                        var offset         = pMiddle - model.TargetLocation;
                        offset.ToSameZ(new XYZ(0, 0, 0));
                        model.BodyStartPoint += offset;
                        model.BodyEndPoint   += offset;
                        model.LeafEndPoint   += offset;
                        //必要族
                        model.Document       = document;
                        model.IsRegenerate   = true;
                        model.RegenerateType = RegenerateType.BySingle;
                        if (!PAAContext.Creator.Regenerate(model))
                        {
                            collection.Data.Remove(model);
                        }
                        movedEntities.Add(model.TargetId.IntegerValue);
                        //PAAContext.IsEditing = true;//重新生成无需避免移动导致的重复触发
                        continue;
                    }
                    #endregion

                    #region 多管 主体 重新生成
                    targetMoved = collection.Data.FirstOrDefault(c => c.TargetIds != null && c.TargetIds.Contains(changeId));
                    if (targetMoved != null)
                    {
                        model = targetMoved;
                        if (movedEntities.Contains(changeId.IntegerValue))
                        {
                            continue;
                        }
                        model.Document       = document;
                        model.IsRegenerate   = true;
                        model.RegenerateType = RegenerateType.ByMultipleTarget;
                        if (!PAAContext.Creator.Regenerate(model))
                        {
                            collection.Data.Remove(model);
                        }
                        movedEntities.AddRange(model.TargetIds.Select(c => c.IntegerValue));
                        //PAAContext.IsEditing = true;//重新生成无需避免移动导致的重复触发
                        continue;
                    }
                    #endregion

                    #region 根据 标注 重新生成
                    var textMoved = collection.Data.FirstOrDefault(c => c.AnnotationId == changeId);
                    if (textMoved != null)
                    {
                        model = textMoved;
                        if (movedEntities.Contains(model.TargetId.IntegerValue))
                        {
                            continue;
                        }
                        var creater    = PAAContext.Creator;
                        var annotation = document.GetElement(changeId) as IndependentTag;
                        var offset     = annotation.TagHeadPosition - model.AnnotationLocation;
                        offset.ToSameZ(new XYZ(0, 0, 0));
                        model.BodyEndPoint  += offset;
                        model.LeafEndPoint  += offset;
                        model.Document       = document;
                        model.IsRegenerate   = true;
                        model.RegenerateType = RegenerateType.BySingle;
                        if (!PAAContext.Creator.Regenerate(model))
                        {
                            collection.Data.Remove(model);
                        }
                        movedEntities.Add(model.TargetId.IntegerValue);
                        //PAAContext.IsEditing = true;//重新生成无需避免移动导致的重复触发
                        continue;
                    }
                    #endregion

                    #region 根据Line重新生成
                    var lineMoved = collection.Data.FirstOrDefault(c => c.LineId == changeId);
                    if (lineMoved != null)
                    {
                        model = lineMoved;
                        bool isExisted = false;
                        foreach (var TargetId in model.TargetIds)
                        {
                            if (movedEntities.Contains(TargetId.IntegerValue))
                            {
                                isExisted = true;
                                break;
                            }
                        }
                        if (isExisted)
                        {
                            continue;
                        }
                        model.Document       = document;
                        model.IsRegenerate   = true;
                        model.RegenerateType = RegenerateType.ByMultipleLine;
                        if (PAAContext.Creator.Regenerate(model))
                        {
                            PAAContext.IsEditing  = true;
                            PAAContext.IsDeleting = true;
                        }
                        else
                        {
                            collection.Data.Remove(model);
                        }
                        movedEntities.AddRange(model.TargetIds.Select(c => c.IntegerValue));
                        //var line0 = document.GetElement(model.LineIds[0]);
                        //var pStart = (line0.Location as LocationCurve).Curve.GetEndPoint(0);
                        //PAAContext.Creator.Regenerate(document, model, target, pStart - model.BodyStartPoint);
                        //movedEntities.Add(model.TargetId.IntegerValue);
                        ////CSAContext.IsEditing = true;//重新生成无需避免移动导致的重复触发
                        continue;
                    }
                    #endregion
                }
                PAAContext.SaveCollection(document);
            }
            catch (Exception ex)
            {
                VLLogHelper.Error(ex);
            }
        }
コード例 #8
0
ファイル: PAACreator.cs プロジェクト: wzfxue/Revit
 /// <summary>
 /// 节点位置计算
 /// </summary>
 /// <param name="elementNodePairs"></param>
 /// <param name="rightOfLefts"></param>
 /// <param name="leftOfRights"></param>
 /// <param name="startPoint"></param>
 /// <returns></returns>
 static bool CalculateLocations(Document doc, PAAModel model, List <ElementAndNodePoint> elementNodePairs, XYZ offset)
 {
     //XYZ rightOfLefts;
     //XYZ leftOfRights;
     //XYZ startPoint = model.TargetLocation;
     //bool isRegenerate = startPoint != null;
     ////重叠区间
     //List<XYZ> lefts = new List<XYZ>();
     //List<XYZ> rights = new List<XYZ>();
     //if (!isRegenerate)
     //{
     //    bool usingX = GetLeftsAndRights(elementNodePairs, lefts, rights);
     //    rightOfLefts = usingX ? lefts.First(c => c.X == lefts.Max(p => p.X)) : lefts.First(c => c.Y == lefts.Max(p => p.Y));
     //    leftOfRights = usingX ? rights.First(c => c.X == rights.Min(p => p.X)) : rights.First(c => c.Y == rights.Min(p => p.Y));
     //    if ((usingX && rightOfLefts.X > leftOfRights.X) || (!usingX && rightOfLefts.Y > leftOfRights.Y))
     //        return false;
     //}
     //else
     //{
     //    rightOfLefts = leftOfRights = null;
     //}
     ////节点计算
     //XYZ firstNode;
     //if (!isRegenerate)
     //{
     //    firstNode = (rightOfLefts + leftOfRights) / 2;
     //}
     //else
     //{
     //    var locationCurve = elementNodePairs[0].Line;
     //    firstNode = locationCurve.Project(startPoint).XYZPoint;
     //}
     //elementNodePairs[0].NodePoint = firstNode;
     ////节点位置
     //for (int i = 1; i < elementNodePairs.Count(); i++)
     //    elementNodePairs[i].NodePoint = elementNodePairs[i].Line.Project(elementNodePairs[0].NodePoint).XYZPoint;
     ////排序
     //if (elementNodePairs.Count() > 1)
     //{
     //    if (Math.Abs(elementNodePairs[0].NodePoint.Y - elementNodePairs[1].NodePoint.Y) < 0.01)
     //        elementNodePairs = elementNodePairs.OrderBy(c => c.NodePoint.X).ToList();
     //    else
     //        elementNodePairs = elementNodePairs.OrderByDescending(c => c.NodePoint.Y).ToList();
     //}
     ////标注定位计算
     //model.TargetLocation = elementNodePairs.First().NodePoint;
     //bool overMoved = false;//位移是否超过的最低限制
     //double verticalSkew = 0;
     //if (isRegenerate)// && regenerateType != RegenerateType.RegenerateByPipe)
     //{
     //    //原始高度 +偏移数据
     //    var line = doc.GetElement(model.LineId);
     //    var orientLineHeight = isRegenerate ? line.GetParameters(TagProperty.线高度1.ToString()).First().AsDouble() : 0;
     //    verticalSkew = LocationHelper.GetLengthBySide(offset, model.VerticalVector);
     //    if (Math.Abs(model.VerticalVector.X) > 1 - UnitHelper.MiniValueForXYZ)
     //        verticalSkew = -verticalSkew;
     //    var nodesHeight = UnitHelper.ConvertToFoot((elementNodePairs.Count() - 1) * model.CurrentFontHeight, VLUnitType.millimeter);
     //    overMoved = orientLineHeight + verticalSkew < nodesHeight;
     //    var lineHeight = orientLineHeight + verticalSkew;
     //    if (overMoved)
     //    {
     //        lineHeight = nodesHeight;
     //        verticalSkew = nodesHeight - orientLineHeight;
     //    }
     //    model.LineHeight = lineHeight;
     //}
     //var scale = 1 / PAAContext.FontManagement.OrientFontSizeScale * model.CurrentFontSizeScale;
     //var width = model.TextType.GetLineWidth() * scale;
     ////标注位置
     //for (int i = 0; i < elementNodePairs.Count(); i++)
     //{
     //    var start = model.TargetLocation + (model.LineHeight + i * model.LineSpace) * model.VerticalVector;
     //    var end = start + model.LineWidth * model.ParallelVector;
     //    elementNodePairs[i].AnnotationPoint = model.TextType.GetTextLocation(model.CurrentFontHeight, 0, model.VerticalVector, start, end);
     //}
     return(true);
 }