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