Example #1
0
        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);
        }
Example #2
0
        /// <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);
                }
            }
        }
Example #3
0
 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());
 }
Example #4
0
        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;
                }
            }
        }