public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { // Get application and document objects UIApplication uiapp = commandData.Application; UIDocument uidoc = uiapp?.ActiveUIDocument; Document doc = uidoc?.Document; Document docAR = null; ElementId selectedId = uidoc.Selection.GetElementIds().First(); var elem = doc.GetElement(selectedId); try { using (Transaction t = new Transaction(doc, "TEST")) { t.Start(); SchemaMethods sm = new SchemaMethods("2b6a75d7-a580-4786-9d6c-6739437c2170", "TestSchema"); sm.setValueToEntity(elem, "Dict_String", 0, "lal kek cheburek"); sm.setValueToEntity(elem, "Dict_Double", 0, 15.2); sm.setValueToEntity(elem, "Dict_XYZ", 0, new XYZ(10.0, 0.0, 15.3)); XYZ ret = (XYZ)sm.getSchemaDictValue <XYZ>(elem, "Dict_XYZ", 0); Util.InfoMsg2("Результат:", ret.ToString()); t.Commit(); } return(Result.Succeeded); } // This is where we "catch" potential errors and define how to deal with them catch (Autodesk.Revit.Exceptions.OperationCanceledException) { // If user decided to cancel the operation return Result.Canceled return(Result.Cancelled); } catch (Exception ex) { // If something went wrong return Result.Failed message = ex.Message; return(Result.Failed); } }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiApp = commandData.Application; UIDocument uidoc = uiApp.ActiveUIDocument; Application app = uiApp.Application; Document doc = uidoc.Document; Schema sch = null; string SchemaGuid = "ea07dfeb-9c7f-4233-b516-6621abc6744e"; ObjectType obt = ObjectType.Element; Reference refElemLinked; while (true) { try { Dictionary <string, string> param = new Dictionary <string, string> { ["Задание ЭМ"] = "893e72a1-b208-4d12-bb26-6bcc4a444d0c", ["Новый"] = "bf28d2b7-3b97-4f90-8c2a-590a92a654c6", ["Перемещен"] = "7ad4d050-bedd-42fa-98c4-6cff9e953460", ["Удален"] = "f2b4ac9f-4ae4-49c3-9c84-e043de20d814" }; FilteredElementCollector collector = new FilteredElementCollector(doc); ISelectionFilter selectionFilter = new LinkPickFilter(doc); refElemLinked = uidoc.Selection.PickObject(obt, selectionFilter, "Выберите связь"); RevitLinkInstance linkInstance = doc.GetElement(refElemLinked.ElementId) as RevitLinkInstance; Document docLinked = linkInstance.GetLinkDocument(); string famname1 = "ME_Точка_подключения_(1 фазная сеть)"; string famname2 = "ME_Точка_подключения_(2 коннектора, 3 фазная сеть)"; string famname3 = "ME_Точка_подключения_(3 фазная сеть)"; var LinkInstUniq = linkInstance.UniqueId; var LinkName = docLinked.Title; var LinkPath = docLinked.PathName; //TaskDialog.Show("Информация ", "Связь: " + LinkName + "\r\n"); FilteredElementCollector collectorlink = new FilteredElementCollector(docLinked); IList <Element> CatsElems = new List <Element>(); collectorlink.WherePasses(new LogicalOrFilter(new List <ElementFilter> { new ElementCategoryFilter(BuiltInCategory.OST_DuctAccessory), new ElementCategoryFilter(BuiltInCategory.OST_PipeAccessory), new ElementCategoryFilter(BuiltInCategory.OST_Furniture), new ElementCategoryFilter(BuiltInCategory.OST_GenericModel), new ElementCategoryFilter(BuiltInCategory.OST_LightingFixtures), new ElementCategoryFilter(BuiltInCategory.OST_ElectricalFixtures), new ElementCategoryFilter(BuiltInCategory.OST_SecurityDevices), new ElementCategoryFilter(BuiltInCategory.OST_FireAlarmDevices), new ElementCategoryFilter(BuiltInCategory.OST_CommunicationDevices), new ElementCategoryFilter(BuiltInCategory.OST_ElectricalEquipment), new ElementCategoryFilter(BuiltInCategory.OST_MechanicalEquipment), new ElementCategoryFilter(BuiltInCategory.OST_Casework) })); CatsElems = collectorlink.WhereElementIsNotElementType().ToElements(); //элементы по категориям var elems = CatsElems.Where(f => f.get_Parameter(new Guid(param["Задание ЭМ"])) != null && f.get_Parameter(new Guid(param["Задание ЭМ"])).AsInteger() == 1); //фильтр по параметру "Задание ЭМ" FilteredElementCollector collfams = collector.OfClass(typeof(Family)); Family fam1 = collfams.FirstOrDefault(e => e.Name.Equals(famname1)) as Family; Family fam2 = collfams.FirstOrDefault(e => e.Name.Equals(famname2)) as Family; Family fam3 = collfams.FirstOrDefault(e => e.Name.Equals(famname3)) as Family; FilteredElementCollector MEcollector = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_MechanicalEquipment).WhereElementIsNotElementType(); sm = new SchemaMethods(SchemaGuid, "Ag_Schema"); sch = sm.Schema; var targetElems = MEcollector.Where(i => (i.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() == famname1 || i.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() == famname2 || i.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() == famname3) && (string)sm.getSchemaDictValue <string>(i, "Dict_String", (int)Keys.Element_UniqueId) == i.UniqueId && (string)sm.getSchemaDictValue <string>(i, "Dict_String", (int)Keys.Link_Name) == LinkName); var NSE = 0; var PSE = 0; var countId = 0; int countLink = elems.Count(); using (Transaction tr = new Transaction(doc, "Проверка элементов из связи")) { tr.Start(); foreach (Element targEL in targetElems) { var cntEl = 0; foreach (Element origElement in elems) { LocationPoint pPoint = origElement.Location as LocationPoint; XYZ pointLink = pPoint.Point; var ElemUniq = origElement.UniqueId; string LinkUniq = (string)sm.getSchemaDictValue <string>(targEL, "Dict_String", (int)Keys.Linked_Element_UniqueId); if (LinkUniq == null || LinkUniq == string.Empty) { continue; } if (LinkUniq == ElemUniq) { cntEl++; countId++; LocationPoint locEl = targEL.Location as LocationPoint; XYZ pointEl = locEl.Point; if (pointEl.ToString() == pointLink.ToString()) { PSE++; } if (pointEl.ToString() != pointLink.ToString()) { NSE++; targEL.get_Parameter(new Guid(param["Перемещен"])).Set(1); targEL.get_Parameter(new Guid(param["Новый"])).Set(0); //targEL.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set("Элемент перемещен!!!"); } } } if (cntEl == 0) { NSE++; targEL.get_Parameter(new Guid(param["Удален"])).Set(1); targEL.get_Parameter(new Guid(param["Перемещен"])).Set(0); targEL.get_Parameter(new Guid(param["Новый"])).Set(0); //targEL.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set("Элемент удален!!!"); } } string U1, U2, U3; U1 = string.Empty; U2 = string.Empty; U3 = string.Empty; if (countLink > countId) { var q = countLink - countId; U1 = "Не размещено " + q + " элементов" + " \n"; } if (NSE > 0) { U2 = "Неправильно размещенных элементов: " + NSE + " \n"; } if (NSE == 0) { U3 = "Нет неправильно размещенных элементов \n"; } var U4 = "На своих местах: " + PSE + " из " + countLink; InfoMsg("Связь: " + LinkName + "\n" + "Количество элементов в связи: " + elems.Count().ToString() + " \n \n" + U1 + U2 + U3 + U4); tr.Commit(); } } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { break; } catch (Exception ex) { message = ex.Message; return(Result.Failed); } break; } return(Result.Succeeded); }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiApp = commandData.Application; UIDocument uidoc = uiApp.ActiveUIDocument; //Application app = uiApp.Application; Document doc = uidoc.Document; Schema sch = null; string SchemaGuid = "ea07dfeb-9c7f-4233-b516-6621abc6744e"; ObjectType obt = ObjectType.Element; Reference refElemLinked; while (true) { try { Dictionary <string, string> param = new Dictionary <string, string> { ["Задание СС"] = "d30b8343-4a2d-4457-9137-e34e511d7233", ["Новый"] = "bf28d2b7-3b97-4f90-8c2a-590a92a654c6", ["Перемещен"] = "7ad4d050-bedd-42fa-98c4-6cff9e953460", ["Удален"] = "f2b4ac9f-4ae4-49c3-9c84-e043de20d814", ["Этаж"] = "4857fa3b-e80e-4167-9b66-f40cd5992680", ["Имя Системы"] = "303f67e6-3fd6-469b-9356-dccb116a3277", ["OUT"] = "478914c0-6c06-4dd6-8c41-fa1122140e87", ["IN"] = "cf610632-14a9-4c8d-84ae-79053ba99593", ["Тип подключения"] = "d512be5c-4315-4b86-aad1-74e7648760ef", ["Нормально отк/закр."] = "ce22f60b-9ae0-4c79-a624-873f39099510", ["Наименование"] = "b4cfdcbd-5668-4572-bcd6-3d504043bd65" }; FilteredElementCollector collector = new FilteredElementCollector(doc); IList <Element> links = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_RvtLinks) .WhereElementIsNotElementType().ToElements(); var linkName = PlaceEquip.SelectLink(links); var link = links.Where(i => i.get_Parameter(BuiltInParameter.ELEM_TYPE_PARAM).AsValueString() == linkName); RevitLinkInstance linkInstance = link.First() as RevitLinkInstance; Document docLinked = linkInstance.GetLinkDocument(); string famname1 = "Задание для СС"; var LinkInstUniq = linkInstance.UniqueId; var LinkName = docLinked.Title; var LinkPath = docLinked.PathName; //TaskDialog.Show("Информация ", "Связь: " + LinkName + "\r\n"); FilteredElementCollector collectorlink = new FilteredElementCollector(docLinked); IList <Element> CatsElems = new List <Element>(); collectorlink.WherePasses(new LogicalOrFilter(new List <ElementFilter> { new ElementCategoryFilter(BuiltInCategory.OST_DuctAccessory), new ElementCategoryFilter(BuiltInCategory.OST_PipeAccessory), new ElementCategoryFilter(BuiltInCategory.OST_Furniture), new ElementCategoryFilter(BuiltInCategory.OST_GenericModel), new ElementCategoryFilter(BuiltInCategory.OST_LightingFixtures), new ElementCategoryFilter(BuiltInCategory.OST_ElectricalFixtures), new ElementCategoryFilter(BuiltInCategory.OST_SecurityDevices), new ElementCategoryFilter(BuiltInCategory.OST_FireAlarmDevices), new ElementCategoryFilter(BuiltInCategory.OST_CommunicationDevices), new ElementCategoryFilter(BuiltInCategory.OST_ElectricalEquipment), new ElementCategoryFilter(BuiltInCategory.OST_MechanicalEquipment), new ElementCategoryFilter(BuiltInCategory.OST_Casework) })); CatsElems = collectorlink.WhereElementIsNotElementType().ToElements(); //элементы по категориям var elems = CatsElems.Where(f => f.get_Parameter(new Guid(param["Задание СС"])) != null && f.get_Parameter(new Guid(param["Задание СС"])).AsInteger() == 1); //фильтр по параметру "Задание ЭМ" FilteredElementCollector collfams = collector.OfClass(typeof(Family)); Family fam1 = collfams.FirstOrDefault <Element>(e => e.Name.Equals(famname1)) as Family; FilteredElementCollector MEcollector = new FilteredElementCollector(doc) .OfCategory(BuiltInCategory.OST_MechanicalEquipment).WhereElementIsNotElementType(); sm = new SchemaMethods(SchemaGuid, "Ag_Schema"); sch = sm.Schema; var targetElems = MEcollector.Where(i => i.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() == famname1 && (string)sm.getSchemaDictValue <string>(i, "Dict_String", (int)Keys.Element_UniqueId) == i.UniqueId && (string)sm.getSchemaDictValue <string>(i, "Dict_String", (int)Keys.Link_Name) == LinkName); var NSE = 0; var PSE = 0; var countId = 0; var Del = 0; string tdelems = "Этажи на которых есть неправильные элементы:" + "\n"; int countLink = elems.Count(); foreach (Element targEL in targetElems) { var cntEl = 0; //удаленный элемент foreach (Element origElement in elems) { LocationPoint pPoint = origElement.Location as LocationPoint; XYZ pointLink = pPoint.Point; var ElemUniq = origElement.UniqueId; string LinkUniq = (string)sm.getSchemaDictValue <string>(targEL, "Dict_String", (int)Keys.Linked_Element_UniqueId); if (LinkUniq == null || LinkUniq == string.Empty) { continue; } if (LinkUniq == ElemUniq) { countId++; cntEl++; LocationPoint locEl = targEL.Location as LocationPoint; XYZ pointEl = locEl.Point; if (pointEl.ToString() == pointLink.ToString()) { PSE++; } if (pointEl.ToString() != pointLink.ToString()) { NSE++; var lvl = targEL.get_Parameter(new Guid(param["Этаж"])).AsString(); if (!tdelems.Contains(lvl)) { tdelems = tdelems + "[" + targEL.get_Parameter(new Guid(param["Этаж"])).AsString() + "]" + "\n"; } } //// } } if (cntEl == 0) { Del++; var lvl = targEL.get_Parameter(new Guid(param["Этаж"])).AsString(); if (!tdelems.Contains(lvl)) { tdelems = tdelems + "[" + targEL.get_Parameter(new Guid(param["Этаж"])).AsString() + "]" + "\n"; } } } string U1, U2, U3, U5; U1 = string.Empty; U2 = string.Empty; U3 = string.Empty; U5 = string.Empty; TaskDialog td = new TaskDialog("Информация"); bool Not = true; if (countLink > countId) { var q = countLink - countId; var st = string.Empty; switch (q) { case 1: st = " элемент"; break; case 2: case 3: case 4: st = " элементa"; break; default: st = " элементов"; break; } U1 = "Не размещено: " + q + st + " \n"; Not = false; } if (NSE > 0) { U2 = "Неправильно размещенных элементов: " + NSE + " \n"; } if (NSE == 0) { U3 = "Нет неправильно размещенных элементов \n"; } if (Del != 0) { U5 = "Удаленных элементов: " + Del + " \n"; } var U4 = "На своих местах: " + PSE + " из " + countLink; if (Del == 0 && NSE == 0) { tdelems = String.Empty; } td.Title = "Информация"; td.TitleAutoPrefix = false; td.AllowCancellation = true; td.MainInstruction = "Связь: " + LinkName; td.MainContent = U1 + U2 + U3 + U5 + U4; td.FooterText = "Количество элементов в связи: "; //td.ExtraCheckBoxText = "Переместить неправильные на свои места"; td.ExpandedContent = tdelems; if (NSE != 0 || Del != 0) { td.MainIcon = TaskDialogIcon.TaskDialogIconWarning; td.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, "Отметить неправильно размещенные"); td.VerificationText = "Переместить неправильные на свои места"; if (Not == false) { td.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, "Отметить неправильные и добавить новые"); } } else { if (Not == false) { td.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, "Добавить новые элементы"); } td.MainIcon = TaskDialogIcon.TaskDialogIconInformation; } td.CommonButtons = TaskDialogCommonButtons.Close; TaskDialogResult tdRes = td.Show(); Stream myStream; SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "Excel files (*.xlsx )|*.xlsx |All files (*.*)|*.*"; saveFileDialog1.FilterIndex = 2; saveFileDialog1.RestoreDirectory = true; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { if ((myStream = saveFileDialog1.OpenFile()) != null) { // Code to write the stream goes here. myStream.Close(); } } using (ExcelPackage excel = new ExcelPackage()) { ExcelWorksheet ws = excel.Workbook.Worksheets.Add("Параметры"); List <string[]> NamesParameters = new List <string[]>() { new string[] { "Наименование", "Нормально отк/закр.", "Комментарии", "Имя системы", "Имя панели", "Количество сигналов(IN)", "Количество сигналов(OUT)", "Тип подключения", "Марка", "Маркировка типоразмера", "Комментарии к типоразмеру" } }; int string oldValues = "A2:" + Char.ConvertFromUtf32(NamesParameters[0].Length + 64) + "2"; string newValues = "L2:" + Char.ConvertFromUtf32(NamesParameters[0].Length * 2 + 64) + "2"; ws.Cells[oldValues].LoadFromArrays(NamesParameters); ws.Cells[oldValues].Style.Border.BorderAround(ExcelBorderStyle.Thin); //ws.Cells[oldValues].Style.Fill.PatternType = ExcelFillStyle.Solid; //ws.Cells[oldValues].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.FromArgb(255, 200, 206)); //ws.Cells[oldValues].Style.Font.Color.SetColor(System.Drawing.Color.FromArgb(156, 0, 6)); ws.Cells[newValues].LoadFromArrays(NamesParameters); ws.Cells[newValues].Style.Border.BorderAround(ExcelBorderStyle.Thin); SetStyleCells(ws, oldValues, Color.FromArgb(255, 243, 243), Color.FromArgb(0, 0, 0)); SetStyleCells(ws, newValues, Color.FromArgb(243, 255, 243), Color.FromArgb(0, 0, 0)); ws.Cells[oldValues].Style.Font.Bold = true; ws.Cells[newValues].Style.Font.Bold = true; //ws.Cells[newValues].Style.Fill.PatternType = ExcelFillStyle.Solid; //ws.Cells[newValues].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.FromArgb(198, 239, 206)); //ws.Cells[newValues].Style.Font.Color.SetColor(System.Drawing.Color.FromArgb(0, 97, 0)); ws.Cells.AutoFitColumns(0); FileInfo excelFile = new FileInfo(saveFileDialog1.FileName); excel.SaveAs(excelFile); bool isExcelInstalled = Type.GetTypeFromProgID("Excel.Application") != null ? true : false; if (isExcelInstalled) { System.Diagnostics.Process.Start(excelFile.ToString()); } } if (tdRes == TaskDialogResult.CommandLink1 || tdRes == TaskDialogResult.CommandLink2 || tdRes == TaskDialogResult.CommandLink3) { using (Transaction tr = new Transaction(doc, "Проверка элементов из связи")) { tr.Start(); foreach (Element targEL in targetElems) // перебираем элементы проекта { var cntEl = 0; //удаленный элемент foreach (Element origElement in elems) //перебираем элементы связи { LocationPoint pPoint = origElement.Location as LocationPoint; XYZ pointLink = pPoint.Point; var ElemUniq = origElement.UniqueId; string LinkUniq = (string)sm.getSchemaDictValue <string>(targEL, "Dict_String", (int)Keys.Linked_Element_UniqueId); if (LinkUniq == null || LinkUniq == string.Empty) { continue; } if (LinkUniq == ElemUniq) //уник номер проекта и связи равны { cntEl++; LocationPoint locEl = targEL.Location as LocationPoint; XYZ pointEl = locEl.Point; if (pointEl.ToString() != pointLink.ToString()) //координаты не равны { targEL.get_Parameter(new Guid(param["Перемещен"])).Set(1); targEL.get_Parameter(new Guid(param["Новый"])).Set(0); if (td.WasVerificationChecked()) { XYZ newPoint = pointLink - pointEl; ElementTransformUtils.MoveElement(doc, targEL.Id, newPoint); } } } } if (cntEl == 0) { targEL.get_Parameter(new Guid(param["Удален"])).Set(1); targEL.get_Parameter(new Guid(param["Перемещен"])).Set(0); targEL.get_Parameter(new Guid(param["Новый"])).Set(0); } } tr.Commit(); } if (tdRes == TaskDialogResult.CommandLink2) { PlaceEquip ss = new PlaceEquip(doc, linkName); } } } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { break; } catch (Exception ex) { message = ex.Message; return(Result.Failed); } break; } return(Result.Succeeded); }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiApp = commandData.Application; UIDocument uidoc = uiApp.ActiveUIDocument; Document doc = uidoc.Document; Schema sch = null; string SchemaGuid = "ce827518-2247-4eda-b76d-c7dfb4681f3c"; ObjectType obt = ObjectType.Element; Reference refElemLinked; while (true) { try { IList <string> Guids = new List <string> // общие параметры { "303f67e6-3fd6-469b-9356-dccb116a3277", // "Имя системы" "7e243149-8b16-4c8b-8161-cd7780048c99", // "Ток" "be29221e-5b74-4a61-a253-4eb5f3b532d9", // "Напряжение" "b4d13aad-0763-4481-b015-63137342d077", // "Номинальная мощность" "0e7bcec3-7a44-43a9-b8ef-0dee369c4efc", // ["Кат. электроснабжения"] "d512be5c-4315-4b86-aad1-74e7648760ef" // ["тип подключения"] //"478914c0-6c06-4dd6-8c41-fa1122140e87", // [OUT]сигналы //"cf610632-14a9-4c8d-84ae-79053ba99593" // [IN]сигналы }; IList <string> NamesParam = new List <string> // параметры семейства { "Ввод1_Номинальная_мощность", "Ввод1_Коэффициент_мощности", "Ввод1_Напряжение", "Ввод2_Номинальная_мощность", "Ввод2_Коэффициент_мощности", "Ввод2_Напряжение" }; FilteredElementCollector collector = new FilteredElementCollector(doc); string famname1 = "ME_Точка_подключения_(1 фазная сеть)"; string famname2 = "ME_Точка_подключения_(2 коннектора, 3 фазная сеть)"; string famname3 = "ME_Точка_подключения_(3 фазная сеть)"; FilteredElementCollector collfams = collector.OfClass(typeof(Family)); Family fam1 = collfams.FirstOrDefault <Element>(e => e.Name.Equals(famname1)) as Family; Family fam2 = collfams.FirstOrDefault <Element>(e => e.Name.Equals(famname2)) as Family; Family fam3 = collfams.FirstOrDefault <Element>(e => e.Name.Equals(famname3)) as Family; if (fam1 == null || fam2 == null || fam3 == null) { string n1, n2, n3; n1 = ""; n2 = ""; n3 = ""; if (fam1 == null) { n1 = famname1 + "\n "; } if (fam2 == null) { n2 = famname2 + "\n "; } if (fam3 == null) { n3 = famname3 + "\n "; } var DiagRes = FamErrorMsg("Не загружены семейства:\n " + n1 + n3 + n2 + "\n Загрузить ?"); if (DiagRes == true) { using (Transaction t = new Transaction(doc, "Загрузить семейство")) { t.Start(); string path1 = @"\\arena\ARMO-GROUP\ИПУ\ЛИЧНЫЕ\САПРомания\RVT\02-БИБЛИОТЕКА\10-Семейства\90-Электрооборудование и освещение (ЭО)\Оборудование\ME_Точка_подключения_(1 фазная сеть).rfa"; string path2 = @"\\arena\ARMO-GROUP\ИПУ\ЛИЧНЫЕ\САПРомания\RVT\02-БИБЛИОТЕКА\10-Семейства\90-Электрооборудование и освещение (ЭО)\Оборудование\ME_Точка_подключения_(2 коннектора, 3 фазная сеть).rfa"; string path3 = @"\\arena\ARMO-GROUP\ИПУ\ЛИЧНЫЕ\САПРомания\RVT\02-БИБЛИОТЕКА\10-Семейства\90-Электрооборудование и освещение (ЭО)\Оборудование\ME_Точка_подключения_(3 фазная сеть).rfa"; if (fam1 == null) { doc.LoadFamily(path1, out fam1); } if (fam2 == null) { doc.LoadFamily(path2, out fam2); } if (fam3 == null) { doc.LoadFamily(path3, out fam3); } t.Commit(); } } if (DiagRes == false) { return(Result.Cancelled); } //TaskDialog.Show("Предупреждение", "Не загружены семейства:\n " + n1 + n3 + n2); //return Result.Cancelled; } ISelectionFilter selectionFilter = new LinkPickFilter(doc); refElemLinked = uidoc.Selection.PickObject(obt, selectionFilter, "Выберите связь"); RevitLinkInstance linkInstance = doc.GetElement(refElemLinked.ElementId) as RevitLinkInstance; Document docLinked = linkInstance.GetLinkDocument(); var checkLinkInst = false; var LinkUniq = linkInstance.UniqueId; //UniqId экземпляра связи var LinkName = docLinked.Title; //Имя связи var LinkPath = docLinked.PathName; //Путь к связи FilteredElementCollector collectorlink = new FilteredElementCollector(docLinked); IList <Element> CatsElems = new List <Element>(); collectorlink.WherePasses(new LogicalOrFilter(new List <ElementFilter> { new ElementCategoryFilter(BuiltInCategory.OST_DuctAccessory), new ElementCategoryFilter(BuiltInCategory.OST_PipeAccessory), new ElementCategoryFilter(BuiltInCategory.OST_Furniture), new ElementCategoryFilter(BuiltInCategory.OST_GenericModel), new ElementCategoryFilter(BuiltInCategory.OST_LightingFixtures), new ElementCategoryFilter(BuiltInCategory.OST_ElectricalFixtures), new ElementCategoryFilter(BuiltInCategory.OST_SecurityDevices), new ElementCategoryFilter(BuiltInCategory.OST_FireAlarmDevices), new ElementCategoryFilter(BuiltInCategory.OST_CommunicationDevices), new ElementCategoryFilter(BuiltInCategory.OST_ElectricalEquipment), new ElementCategoryFilter(BuiltInCategory.OST_MechanicalEquipment), new ElementCategoryFilter(BuiltInCategory.OST_Casework) })); CatsElems = collectorlink.WhereElementIsNotElementType().ToElements(); //элементы по категориям var elems = CatsElems.Where(f => f.get_Parameter(new Guid(param["Задание ЭМ"])) != null && f.get_Parameter(new Guid(param["Задание ЭМ"])).AsInteger() == 1); InfoMsg("Связь: " + LinkName + "\n" + "Количество элементов в связи: " + elems.Count().ToString()); // MessageBox ISet <ElementId> elementSet1 = fam1.GetFamilySymbolIds(); ISet <ElementId> elementSet2 = fam2.GetFamilySymbolIds(); ISet <ElementId> elementSet3 = fam3.GetFamilySymbolIds(); FamilySymbol type1 = doc.GetElement(elementSet1.First()) as FamilySymbol; FamilySymbol type2 = doc.GetElement(elementSet2.First()) as FamilySymbol; FamilySymbol type3 = doc.GetElement(elementSet3.First()) as FamilySymbol; sm = new SchemaMethods(SchemaGuid, "Ag_Schema"); //создание схемы ExStorage sch = sm.Schema; FilteredElementCollector MEcollector = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_MechanicalEquipment).WhereElementIsNotElementType(); var targetElems = MEcollector.Where(i => (i.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() == famname1 || i.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() == famname3) && (string)sm.getSchemaDictValue <string>(i, "Dict_String", (int)Keys.Element_UniqueId) == i.UniqueId && (string)sm.getSchemaDictValue <string>(i, "Dict_String", (int)Keys.Link_Name) == LinkName); // коллектор по UniqId элемента и имени связи для 1 ТП var targetElems2 = MEcollector.Where(i => i.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() == famname2 && (string)sm.getSchemaDictValue <string>(i, "Dict_String", (int)Keys.Element_UniqueId) == i.UniqueId && (string)sm.getSchemaDictValue <string>(i, "Dict_String", (int)Keys.Link_Name) == LinkName); // коллектор по UniqId элемента и имени связи для семейства с двумя ТП if (targetElems.Count() != 0 || targetElems2.Count() != 0) { checkLinkInst = true; } //проверка новый ли это элемент, если новый то пишем в параметр using (Transaction t = new Transaction(doc, "Размещение элементов")) { t.Start(); type1.Activate(); type2.Activate(); type3.Activate(); var countTarget = 0; //количество размещаемых элементов foreach (Element origElement in elems) //перебираем элементы из связи { LocationPoint pPoint = origElement.Location as LocationPoint; XYZ coords = pPoint.Point; //координаты экземпляра в связи var FamSymbol = (origElement as FamilyInstance).Symbol; // FamilySymbol элементов связи var linkElemUniq = origElement.UniqueId; var famname = origElement.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString(); //имя семейства в связи var typename = famname + "_/" + origElement.Name; typename = typename.Replace("[", "("); typename = typename.Replace("]", ")"); // имя семейства + имя типоразмера (заменяем скобки []) var target = targetElems.Where(i => (string)sm.getSchemaDictValue <string>(i, "Dict_String", (int)Keys.Linked_Element_UniqueId) == linkElemUniq); //коллектор по совпадающим UniqId (1 ТП) var target2 = targetElems2.Where(i => (string)sm.getSchemaDictValue <string>(i, "Dict_String", (int)Keys.Linked_Element_UniqueId) == linkElemUniq); //коллектор по совпадающим UniqId (2 ТП) if (target.Count() != 0 || target2.Count() != 0) { continue; } // проверка по UniqID в связи и в проекте if (typename.Contains("(380-2)")) // для семейства с двумя ТП { FamilySymbol Newtype = Util.GetFamilySymbolByName(doc, typename) as FamilySymbol ?? CreateNewType(type2, typename); //проверка есть ли типоразмер в проекте если нет создаем var targElement = doc.Create.NewFamilyInstance(coords, Newtype, StructuralType.NonStructural); if (checkLinkInst != false) { targElement.get_Parameter(new Guid(param["Новый"])).Set(1); } //проверка новый ли элемент, если новый то пишем в параметр ElemUniq = targElement.UniqueId; SetValueToFields(targElement, ElemUniq, linkElemUniq, LinkUniq, LinkName, LinkPath, typename, coords, sch); //запись параметров в ExStorage foreach (string nameparam in NamesParam) //записываем значения параметров семейства с двумя ТП { if (FamSymbol.LookupParameter(nameparam) != null) //параметры типа { var origParam = FamSymbol.LookupParameter(nameparam).AsDouble(); targElement.LookupParameter(nameparam).Set(origParam); } if (origElement.LookupParameter(nameparam) != null) //параметры экземпляра { var origParam = origElement.LookupParameter(nameparam).AsDouble(); targElement.LookupParameter(nameparam).Set(origParam); } } NameSystemParameter(origElement, targElement, Guids[0]); // параметр "имя системы" SetParameters(origElement, targElement, LinkName); continue; } FamilyInstance targetElement = null; if (FamSymbol.get_Parameter(new Guid(param["Количетсво полюсов"])) != null || origElement.get_Parameter(new Guid(param["Количетсво полюсов"])) != null) //проверяем количество полюсов { if (origElement.get_Parameter(new Guid(param["Количетсво полюсов"]))?.AsInteger() == 1 || FamSymbol.get_Parameter(new Guid(param["Количетсво полюсов"]))?.AsInteger() == 1) //1 фазная { FamilySymbol Newtype = Util.GetFamilySymbolByName(doc, typename) as FamilySymbol ?? CreateNewType(type1, typename); //проверка есть ли типоразмер в проекте если нет создаем targetElement = doc.Create.NewFamilyInstance(coords, Newtype, StructuralType.NonStructural); countTarget++; } if (origElement.get_Parameter(new Guid(param["Количетсво полюсов"]))?.AsInteger() == 3 || FamSymbol.get_Parameter(new Guid(param["Количетсво полюсов"]))?.AsInteger() == 3) //3 фазная { FamilySymbol Newtype = Util.GetFamilySymbolByName(doc, typename) as FamilySymbol ?? CreateNewType(type3, typename); //проверка есть ли типоразмер в проекте если нет создаем targetElement = doc.Create.NewFamilyInstance(coords, Newtype, StructuralType.NonStructural); countTarget++; } } else { continue; } if (checkLinkInst != false) { targetElement.get_Parameter(new Guid(param["Новый"])).Set(1); } ElemUniq = targetElement.UniqueId; Ozk(origElement, targetElement); foreach (string guid in Guids) //записываем значения параметров семейства с 1 ТП { if (guid == Guids[0]) //по параметру "имя системы" { NameSystemParameter(origElement, targetElement, guid); continue; } SetParameterToInstance(guid, origElement, targetElement); SetParameterToType(guid, origElement, targetElement); } SetValueToFields(targetElement, ElemUniq, linkElemUniq, LinkUniq, LinkName, LinkPath, typename, coords, sch);//запись параметров в ExStorage SetParameters(origElement, targetElement, LinkName); SetParameterToInstance(param["Коэф. мощности"], origElement, targetElement); GSymbol(typename, "Вентилятор", "УГО_Двигатель", targetElement); GSymbol(typename, "МДУ", "УГО_МДУ", targetElement); GSymbol(typename, "Щит_автоматики", "УГО_ЩА", targetElement); } t.Commit(); if (countTarget == 0) { WinForms.MessageBox.Show("Нет элементов для размещения!", "Предупреждение", WinForms.MessageBoxButtons.OK, WinForms.MessageBoxIcon.Warning); break; } InfoMsg("Элементов размещено в проекте: " + countTarget); break; } } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { break; } catch (Exception ex) { message = ex.Message; return(Result.Failed); } } return(Result.Succeeded); }
public Result Run() { Schema sch = null; string SchemaGuid = "ce827518-2247-4eda-b76d-c7dfb4681f3c"; FilteredElementCollector collector = new FilteredElementCollector(doc); string famname1 = "Задание для СС"; FilteredElementCollector collfams = collector.OfClass(typeof(Family)); Family fam1 = collfams.FirstOrDefault<Element>(e => e.Name.Equals(famname1)) as Family; if (fam1 == null) { string path1 = @"\\arena\ARMO-GROUP\ИПУ\ЛИЧНЫЕ\САПРомания\RVT\02-БИБЛИОТЕКА\10-Семейства\70-Слаботочные системы (СС)\Оборудование\Задание для СС.rfa"; var tdRes = TDFamLoad(path1, famname1); if (tdRes == TaskDialogResult.Yes) { using (Transaction t = new Transaction(doc, "Загрузить семейство")) { t.Start(); if (fam1 == null) { doc.LoadFamily(path1, out fam1); } t.Commit(); } } if (tdRes == TaskDialogResult.No) { return Result.Failed; } if (tdRes == TaskDialogResult.Close) { return Result.Failed; } } IList<Element> links = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_RvtLinks) .WhereElementIsNotElementType().ToElements(); if (linkN == null) { linkName = SelectLink(links); } else { linkName = linkN; } var link = links.Where(i => i.get_Parameter(BuiltInParameter.ELEM_TYPE_PARAM).AsValueString() == linkName); RevitLinkInstance linkInstance = link.First() as RevitLinkInstance; Document docLinked = linkInstance.GetLinkDocument(); var checkLinkInst = false; var LinkUniq = linkInstance.UniqueId; //UniqId экземпляра связи var LinkName = docLinked.Title; //Имя связи var LinkPath = docLinked.PathName; //Путь к связи FilteredElementCollector collectorlink = new FilteredElementCollector(docLinked); IList<Element> CatsElems = new List<Element>(); collectorlink.WherePasses(new LogicalOrFilter(new List<ElementFilter> { new ElementCategoryFilter(BuiltInCategory.OST_DuctAccessory), new ElementCategoryFilter(BuiltInCategory.OST_PipeAccessory), new ElementCategoryFilter(BuiltInCategory.OST_Furniture), new ElementCategoryFilter(BuiltInCategory.OST_GenericModel), new ElementCategoryFilter(BuiltInCategory.OST_LightingFixtures), new ElementCategoryFilter(BuiltInCategory.OST_ElectricalFixtures), new ElementCategoryFilter(BuiltInCategory.OST_SecurityDevices), new ElementCategoryFilter(BuiltInCategory.OST_FireAlarmDevices), new ElementCategoryFilter(BuiltInCategory.OST_CommunicationDevices), new ElementCategoryFilter(BuiltInCategory.OST_ElectricalEquipment), new ElementCategoryFilter(BuiltInCategory.OST_MechanicalEquipment), new ElementCategoryFilter(BuiltInCategory.OST_Casework) })); CatsElems = collectorlink.WhereElementIsNotElementType().ToElements(); //элементы по категориям IEnumerable<Element> elems = CatsElems.Where(f => f.get_Parameter(new Guid(param["Задание СС"])) != null && f.get_Parameter(new Guid(param["Задание СС"])).AsInteger() == 1); ISet<ElementId> elementSet1 = fam1.GetFamilySymbolIds(); FamilySymbol type1 = doc.GetElement(elementSet1.First()) as FamilySymbol; sm = new SchemaMethods(SchemaGuid, "Ag_Schema"); //создание схемы ExStorage sch = sm.Schema; FilteredElementCollector MEcollector = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_MechanicalEquipment).WhereElementIsNotElementType(); var targetElems = MEcollector.Where(i => i.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() == famname1 && (string)sm.getSchemaDictValue<string>(i, "Dict_String", (int)Keys.Element_UniqueId) == i.UniqueId && (string)sm.getSchemaDictValue<string>(i, "Dict_String", (int)Keys.Link_Name) == LinkName); // коллектор по UniqId элемента и имени связи if (targetElems.Count() != 0) { checkLinkInst = true; } //проверка новый ли это элемент, если новый то пишем в параметр var Res = TDInfo(elems, LinkName); if (Res == TaskDialogResult.Cancel) { return Result.Failed; } if (WSCheck == true) { checkLinkInst = false; } using (Transaction t = new Transaction(doc, "Размещение элементов")) { t.Start(); type1.Activate(); var countTarget = 0; //количество размещаемых элементов foreach (Element origElement in elems) //перебираем элементы из связи { LocationPoint pPoint = origElement.Location as LocationPoint; XYZ coords = pPoint.Point; //координаты экземпляра в связи double rotation = pPoint.Rotation; var FamSymbol = (origElement as FamilyInstance).Symbol; // FamilySymbol элементов связи var linkElemUniq = origElement.UniqueId; var famname = origElement.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString(); //имя семейства в связи var typename = famname + "_/_" + origElement.Name;typename = typename.Replace("[", "(");typename = typename.Replace("]", ")"); // имя семейства + имя типоразмера (заменяем скобки []) if (origElement.LookupParameter("Щит аварийного освещения") != null &&origElement.LookupParameter("Щит аварийного освещения").AsInteger() == 1) { typename = typename + "/Щит аварийного освещения"; } if (origElement.LookupParameter("Щит управления двигателями") != null &&origElement.LookupParameter("Щит управления двигателями").AsInteger() == 1) { typename = typename + "/Щит управления двигателями"; } if (origElement.LookupParameter("Щит силовой распределительный") != null &&origElement.LookupParameter("Щит силовой распределительный").AsInteger() == 1) { typename = typename + "/Щит силовой распределительный"; } var target = targetElems.Where(i => (string)sm.getSchemaDictValue<string>(i, "Dict_String", (int)Keys.Linked_Element_UniqueId) == linkElemUniq); //коллектор по совпадающим UniqId (1 ТП) if (target.Count() != 0) { continue; } // проверка по UniqID в связи и в проекте FamilySymbol Newtype = Util.GetFamilySymbolByName(doc, typename) as FamilySymbol ?? CreateNewType(type1, typename); //проверка есть ли типоразмер в проекте если нет создаем //var targetElement = doc.Create.NewFamilyInstance(coords, Newtype, StructuralType.NonStructural); XYZ point2 = new XYZ(coords.X, coords.Y, coords.Z + 100); Line axis = Line.CreateBound(coords, point2); FamilyInstance ins = origElement as FamilyInstance; var tr = ins.GetTotalTransform(); var basX1 = tr.BasisX.X; var basX2 = tr.BasisX.Y; var basX3 = tr.BasisX.Z; var basY1 = tr.BasisY.X; var basY2 = tr.BasisY.Y; var basY3 = tr.BasisY.Z; var basZ1 = tr.BasisZ.X; var basZ2 = tr.BasisZ.Y; var basZ3 = tr.BasisZ.Z; XYZ liner = new XYZ(basX1, basX2, 0); if (basZ1 != 0 || basZ2 != 0) { liner = new XYZ(basZ1, basZ2, 0); } var targetElement = doc.Create.NewFamilyInstance(coords,Newtype,liner,origElement,StructuralType.NonStructural); countTarget++; if (checkLinkInst != false) { targetElement.get_Parameter(new Guid(param["Новый"])).Set(1); } //проверка новый ли элемент, если новый то пишем в параметр ElemUniq = targetElement.UniqueId; SetValueToFields(targetElement, ElemUniq, linkElemUniq, LinkUniq, LinkName, LinkPath, typename, coords,sch); //запись параметров в ExStorage SetParameters(origElement, targetElement, LinkName); //запись параметров в Instance NameSystemParameter(origElement, targetElement); Ozk(origElement, targetElement); //уго озк кду GSymbol(typename, "Электрооборудование", "Шкаф", origElement, targetElement); GSymbol(typename, "КСК", "УГО_КСК", targetElement); GSymbol(typename, "ШПК", "УГО_ПК", targetElement); GSymbol(typename, "СОУЭ", "УГО_СОУЭ", targetElement); GSymbol(typename, "СПЖ", "УГО_СПЖ", targetElement); GSymbol(typename, "ЦПИ", "УГО_ЦПИ", targetElement); GSymbol(typename, "Щит_автоматики", "УГО_ЩУ", targetElement); GSymbol(typename, "РП", "УГО_СПЖ", targetElement); } t.Commit(); if (countTarget == 0) { TaskDialog tdPr = new TaskDialog("Предупреждение"); tdPr.MainIcon = TaskDialogIcon.TaskDialogIconWarning; tdPr.TitleAutoPrefix = false; tdPr.AllowCancellation = true; tdPr.MainInstruction = "Нет элементов для размещения!"; tdPr.CommonButtons = TaskDialogCommonButtons.Close; tdPr.DefaultButton = TaskDialogResult.Close; TaskDialogResult tdRes = tdPr.Show(); return Result.Succeeded; } else { TaskDialog end = new TaskDialog("Информация"); end.MainIcon = TaskDialogIcon.TaskDialogIconInformation; end.MainInstruction = "Элементов размещено в проекте: " + countTarget; end.TitleAutoPrefix = false; end.Show(); return Result.Succeeded; } } }