public static IntersectionMepCurve HTMLRowToIntersection(CollisionReportRow row, Document hostdoc, ElementProcessingLog rowLog, ElementProcessingLog angledPipeLog) { GetElementsFromReportRow(hostdoc, row, out ICollection <Element> docElems, out ICollection <Element> linkElems, out RevitLinkInstance linkdocInstance); // в Naviswork система координат по внутренней площадке документа // поэтому необходимо и корректировать по местной системе координат ProjectLocation pl = hostdoc.ActiveProjectLocation; XYZ centerPoint = pl.GetTransform().OfPoint(row.Point); // определяем, где конструкция, а где сеть var findedElems = docElems.Concat(linkElems); Element host = findedElems.FirstOrDefault(x => x is Wall || x is Floor); if (host == null) { // Случай, когда стена разбита на части Part part = findedElems.FirstOrDefault(x => x is Part) as Part; if (part != null) { LinkElementId linkId = part.GetSourceElementIds().First(); host = hostdoc.GetElement(linkId.HostElementId); } } Element pipe = findedElems.FirstOrDefault(x => x is MEPCurve || (x is FamilyInstance && (x as FamilyInstance).MEPModel.ConnectorManager != null)); // создание объекта пересечения if (host != null && pipe != null) { try { var intr = new IntersectionMepCurve(host, pipe, centerPoint, linkdocInstance); return(intr); } catch (NotImplementedException) { angledPipeLog.AddError(row.Name); } } else { rowLog.AddError(row.Name); } return(null); }
/// <summary> /// Поиск элементов из строки отчета в текущем документе и связанных файлах /// </summary> /// <param name="elementsInDocument">Коллекция, в которую складываются элементы из текущего документа</param> /// /// <param name="elementsInLink">Коллекция, в которую складываются элементы из связанного</param> /// /// <param name="linkInstance">Если найдены элементы в связи, возвращает объект связи; в противном случае null</param> static public void GetElementsFromReportRow(Document doc, CollisionReportRow row, out ICollection <Element> elementsInDocument, out ICollection <Element> elementsInLink, out RevitLinkInstance linkInstance) { linkInstance = null; DocumentDataSet docSet = new DocumentDataSet(doc, true); DocumentData docData1 = docSet[row.E1_DocumentName]; DocumentData docData2 = docSet[row.E2_DocumentName]; Document doc1 = docData1.Document; Document doc2 = docData2.Document; Element e1 = doc1.GetElement(row.E1_Id); Element e2 = doc2.GetElement(row.E2_Id); elementsInDocument = new List <Element>(); elementsInLink = new List <Element>(); if (e1 != null) { if (doc1.IsLinked) { elementsInLink.Add(e1); linkInstance = docData1.Instance; } else { elementsInDocument.Add(e1); } } if (e2 != null) { if (doc2.IsLinked) { elementsInLink.Add(e2); linkInstance = docData2.Instance; } else { elementsInDocument.Add(e2); } } }
static public void SelectRowItems(UIDocument uidoc, CollisionReportRow row) { CollisionUtils.GetElementsFromReportRow(uidoc.Document, row, out ICollection <Element> sdoc, out ICollection <Element> slink, out RevitLinkInstance instance); uidoc.Selection.SetElementIds(sdoc.Cast <Element>().Select(x => x.Id).ToList()); }
static public void LookAtRow(UIDocument uidoc, CollisionReportRow row) { CollisionUtils.GetElementsFromReportRow(uidoc.Document, row, out ICollection <Element> sdoc, out ICollection <Element> slink, out RevitLinkInstance instance); if (sdoc.Count() == 0 && slink.Count() == 0) { var td = new TaskDialog("Просмотр коллизий"); td.MainInstruction = "Ни один элемент не найден ни в текущем, ни в связанном документах"; td.MainContent = "Возможные причины:" + "\n1) Отчет составлен по другим документам" + "\n2) Элементы находятся в связи, которая не загружена в проект" + "\n3) Элементы из отчета были удалены в проекте"; td.Show(); return; } // находим подходящий вид View3D view; if (uidoc.ActiveView.Name != "Просмотр коллизий") { view = GetView(uidoc.Document, "Просмотр коллизий"); uidoc.ActiveView = view; } else { view = uidoc.ActiveView as View3D; } // в Naviswork система координат по внутренней площадке документа // поэтому необходимо и корректировать по местной системе координат ProjectLocation pl = uidoc.Document.ActiveProjectLocation; XYZ centerPoint = pl.GetTransform().OfPoint(row.Point); // создаем подрезку 3д вида double m = UnitUtils.ConvertToInternalUnits(1, DisplayUnitType.DUT_METERS); Outline outline = Intersection.CreateOutline(centerPoint, m, m, m); BoundingBoxXYZ bbox = new BoundingBoxXYZ(); bbox.Min = outline.MinimumPoint; bbox.Max = outline.MaximumPoint; // обновляем вид using (var tr = new Transaction(uidoc.Document, "Обновление 3D вида")) { tr.Start(); //граница 3д вида view.IsSectionBoxActive = true; view.SetSectionBox(bbox); // обрезка листа view.CropBoxActive = false; //!! // Фичу надо доделать, но для релизной версии можно оставить в таком виде // // переопределение графики для элемента //OverrideGraphicSettings greenGraphics = new OverrideGraphicSettings(); //Color green = new Color(0, 255, 0); //Color dark_green = new Color(0, 128, 0); //greenGraphics.SetSurfaceForegroundPatternColor(green); //greenGraphics.SetSurfaceBackgroundPatternColor(green); //greenGraphics.SetProjectionLineColor(green); //greenGraphics.SetCutBackgroundPatternColor(dark_green); //greenGraphics.SetCutForegroundPatternColor(dark_green); //greenGraphics.SetCutLineColor(dark_green); //OverrideGraphicSettings redGraphics = new OverrideGraphicSettings(); //Color red = new Color(255, 0, 0); //Color dark_red = new Color(128, 0, 0); //redGraphics.SetSurfaceForegroundPatternColor(red); //redGraphics.SetSurfaceBackgroundPatternColor(red); //redGraphics.SetProjectionLineColor(red); //redGraphics.SetCutBackgroundPatternColor(dark_red); //redGraphics.SetCutForegroundPatternColor(dark_red); //redGraphics.SetCutLineColor(dark_red); //foreach (ElementId i in sdoc.Cast<Element>().Select(x => x.Id)) //{ // view.SetElementOverrides(i, greenGraphics); //} //foreach (ElementId i in new FilteredElementCollector(uidoc.Document).OfClass(typeof(RevitLinkInstance)).WhereElementIsNotElementType().Select(x=>x.Id)) //{ // view.SetElementOverrides(i, redGraphics); //} tr.Commit(); } // зумируем содержимое окна до границ foreach (var uiview in uidoc.GetOpenUIViews()) { if (uiview.ViewId.Equals(view.Id)) { uiview.ZoomToFit(); break; } } }