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); }
/// <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); } } }
//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)); }
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); } }
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); }
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); }
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); } }
/// <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); }