Пример #1
0
        /// <summary>
        /// Создать новое свойство
        /// </summary>
        /// <param name="oState"></param>
        /// <param name="name"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static ComApi.InwOaProperty CreateNewUserProp(ComApi.InwOpState3 oState,
                                                             string name, object value)
        {
            // create new property
            ComApi.InwOaProperty newP = (ComApi.InwOaProperty)oState
                                        .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwOaProperty, null, null);

            // set the name, username and value of the new property
            newP.name     = Common.Transliteration.Front(name);
            newP.UserName = name;
            if (value == null || (value is string && String.IsNullOrWhiteSpace(value as string)))
            {
                value = "_";
            }
            newP.value = ObjectToSetAsUserPropertyValue(value);
            return(newP);
        }
Пример #2
0
        /// <summary>
        /// Добавить служебные свойства S1NF0 если их еще нет
        /// Не меняет свойства если они уже есть если не передан параметр overwrite = true
        /// В любом случае может переписать только те свойства, которые переданы в словаре propsToWrite
        /// Возвращает true если свойства объекта отредактированы
        /// </summary>
        /// <param name="oState"></param>
        /// <param name="item"></param>
        /// <param name="propsToWrite"></param>
        /// <param name="overwrite">перезаписывать свойства если они уже есть</param>
        /// <returns></returns>
        public static bool SetS1NF0PropsToItem
            (ComApi.InwOpState3 oState, ModelItem item,
            Dictionary <string, object> propsToWrite,
            Dictionary <string, bool> toOverwrite)
        {
            ComApi.InwOaPropertyVec propsToSet
                = oState.ObjectFactory(ComApi.nwEObjectType.eObjectType_nwOaPropertyVec);

            //convert the .NET collection to COM object
            ComApi.InwOaPath oPath = ComApiBridge.ComApiBridge.ToInwOaPath(item);
            //Получить текущие свойства элемента
            ComApi.InwGUIPropertyNode2 propertyNode
                = (ComApi.InwGUIPropertyNode2)oState.GetGUIPropertyNode(oPath, true);
            //Поиск панели Id
            int indexToSet = 0;
            int i          = 1;


            foreach (ComApi.InwGUIAttribute2 attr in propertyNode.GUIAttributes())
            {
                if (attr.UserDefined)
                {
                    if (attr.ClassUserName.Equals(S1NF0_DATA_TAB_DISPLAY_NAME))
                    {
                        indexToSet = i;
                        foreach (ComApi.InwOaProperty prop in attr.Properties())
                        {
                            if (propsToWrite.ContainsKey(prop.UserName))
                            {
                                if (toOverwrite.ContainsKey(prop.UserName) &&
                                    !toOverwrite[prop.UserName])
                                {
                                    propsToWrite.Remove(prop.UserName);
                                }
                                else
                                {
                                    continue;//Перейти к следующему свойству
                                }
                            }

                            propsToSet.Properties().Add(Utils.CopyProp(oState, prop));
                        }
                    }
                    else
                    {
                        i++;
                    }
                }
            }

            if (propsToWrite.Count > 0)
            {
                foreach (KeyValuePair <string, object> kvp in propsToWrite)
                {
                    string propName = kvp.Key;
                    object value    = kvp.Value;
                    if (value is S1NF0PropSpecialValue)
                    {
                        if ((S1NF0PropSpecialValue)value == S1NF0PropSpecialValue.RandomGUID)
                        {
                            value = Guid.NewGuid().ToString();
                        }
                        else
                        {
                            value = "_";
                        }
                    }

                    propsToSet.Properties().Add(CreateNewUserProp(oState, propName, value));
                }

                propertyNode.SetUserDefined(indexToSet, S1NF0_DATA_TAB_DISPLAY_NAME, "S1NF0", propsToSet);
                return(true);
            }
            return(false);
        }
Пример #3
0
        public static int Execute(/*params string[] parameters*/)
        {
            ComApi.InwOpState3 oState = ComApiBridge.ComApiBridge.State;

            Document doc = Application.ActiveDocument;

            ModelItemCollection currSelectionColl = doc.CurrentSelection.SelectedItems;

            if (currSelectionColl.Count > 0)
            {
                foreach (ModelItem item in currSelectionColl.DescendantsAndSelf)
                {
                    if (item.HasGeometry)
                    {
                        ComApi.InwOaPath oPath = ComApiBridge.ComApiBridge.ToInwOaPath(item);

                        Transform3D tr = item.Transform;//TODO: учитывать уже добавленную трансформацию!!!
                        //tr.Factor()
                        Transform3DComponents transform3DComponents = tr.Factor();
                        //transform3DComponents.ScaleOrientation
                        Point3D center = item.Geometry.BoundingBox.Center;

                        double z               = center.Z;
                        double zTransformed    = z * 1.1;
                        double correctionTrans = (z - zTransformed) /*/ 2*/;

                        ComApi.InwOpSelection comSelectionOut =
                            ComApiBridge.ComApiBridge.ToInwOpSelection(new ModelItemCollection()
                        {
                            item
                        });

                        ComApi.InwLTransform3f3 oTrans1
                            = (ComApi.InwLTransform3f3)oState
                              .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwLTransform3f, null, null);
                        //растяжение по Z
                        ComApi.InwLVec3f scale
                            = (ComApi.InwLVec3f)oState
                              .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwLVec3f, null, null);
                        scale.SetValue(1, 1, 1.1);
                        //смещение по Z
                        ComApi.InwLVec3f trans
                            = (ComApi.InwLVec3f)oState
                              .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwLVec3f, null, null);
                        trans.SetValue(0, 0, correctionTrans);

                        //ComApi.InwLRotation3f scaleOrientation
                        //    = (ComApi.InwLRotation3f)oState
                        //    .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwLRotation3f, null, null);
                        //ComApi.InwLUnitVec3f axis
                        //    = (ComApi.InwLUnitVec3f)oState
                        //    .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwLUnitVec3f, null, null);
                        //axis.SetValue(0, 0, 1);
                        //scaleOrientation.SetValue(axis, 0);

                        //ComApi.InwLRotation3f Rotation
                        //    = (ComApi.InwLRotation3f)oState
                        //    .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwLRotation3f, null, null);
                        //Rotation.SetValue(axis, 0);

                        //oTrans1.factor(scale, scaleOrientation, Rotation, trans);
                        //double[] matrix = ConvertDoubleArray((Array)((object)oTrans1.Matrix));

                        //oTrans1.MakeScale(scale);
                        //double[] matrix1 = ConvertDoubleArray((Array)((object)oTrans1.Matrix));
                        //oTrans1.MakeTranslation(trans);
                        //double[] matrix2 = ConvertDoubleArray((Array)((object)oTrans1.Matrix));

                        oTrans1.SetMatrix(new double[]
                        {
                            1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1.1, 0, 0, 0, correctionTrans, 1
                        });


                        //oTrans1.MakeScale(scaleVec);
                        oState.OverrideTransform(comSelectionOut, oTrans1);
                    }
                }
            }

            return(0);
        }
Пример #4
0
        public static void SetPropsMethod(ComApi.InwOpState3 oState,
                                          ModelItemCollection modelItemColl, List <DisplayDataTab> displayDataTabs,
                                          List <DisplayURL> displayURLs, bool overwriteUserAttr, bool overwriteLinks,
                                          bool preserveExistingProperties)
        {
            //Удалить пустые строки из наборов
            displayDataTabs.RemoveAll(ddt => String.IsNullOrEmpty(ddt.DisplayName));
            foreach (DisplayDataTab ddt in displayDataTabs)
            {
                ddt.DisplayProperties.RemoveAll(dp => String.IsNullOrEmpty(dp.DisplayName));
            }
            displayURLs.RemoveAll(dUrl =>
                                  String.IsNullOrEmpty(dUrl.DisplayName) || String.IsNullOrEmpty(dUrl.URL));

            //Если пользователь зачем-то ввел значение нередактируемого свойства, то убрать его
            DisplayDataTab idDataTab
                = displayDataTabs.Find(ddt => ddt.DisplayName.Equals(S1NF0_DATA_TAB_DISPLAY_NAME));

            if (idDataTab != null)
            {
                idDataTab.DisplayProperties.RemoveAll(p
                                                      => propsNotModifiable.Contains(p.DisplayName));
            }

            //Конвертировать значения всех свойств
            foreach (DisplayDataTab ddt in displayDataTabs)
            {
                foreach (DisplayProperty dp in ddt.DisplayProperties)
                {
                    dp.ConvertValue();
                }
            }


            #region Старое

            /*
             *  //Заполнить список свойств, которые нужно будет добавить на панель Id
             *  ComApi.InwOaPropertyVec idDataTabPropertyVec = (ComApi.InwOaPropertyVec)oState
             *                  .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwOaPropertyVec,
             *                  null, null);
             *
             *  //Заполнить список свойств для панели Id
             *  //(в ней хранятся уникальные Id для каждого элемента, которые не должны меняться этой командой)
             *  if (idDataTab != null)
             *  {
             *      foreach (DisplayProperty dp in idDataTab.DisplayProperties)
             *      {
             *          idDataTabPropertyVec.Properties()
             *              .Add(Utils.CreateNewUserProp(oState, dp.DisplayName, dp.Value));
             *      }
             *  }
             */

            //Заполнены ли списки свойств?
            //Если список пустой, то панели должны быть удалена
            //bool userPropsDefined = displayDataTabs.Count > 0;


            //Создание набора для присоединения к объектам модели
            //List<DisplayDataTab> propsToSet = new List<DisplayDataTab>();
            #endregion

            //Словарь свойств, которые добавляются
            Dictionary <string, DisplayProperty> propsDefined = new Dictionary <string, DisplayProperty>();

            //Создать базовые наборы свойств, которые будут привязываться к объектам
            foreach (DisplayDataTab ddt in displayDataTabs)
            {
                //if (!ddt.DisplayName.Equals(S1NF0_DATA_TAB_DISPLAY_NAME))
                //{
                //ddt.InwOaPropertyVec = (ComApi.InwOaPropertyVec)oState
                //        .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwOaPropertyVec,
                //        null, null);
                //propsToSet.Add(ddt);
                foreach (DisplayProperty dp in ddt.DisplayProperties)
                {
                    //ComApi.InwOaProperty newP
                    //        = Utils.CreateNewUserProp(oState, dp.DisplayName, dp.Value);
                    //// add the new property to the new property category
                    //ddt.InwOaPropertyVec.Properties().Add(newP);

                    string key = ddt.DisplayName + dp.DisplayName;
                    if (!propsDefined.ContainsKey(key))
                    {
                        propsDefined.Add(key, dp);
                    }
                }
                //}
            }

            //словарь ссылок, которые добавляются
            Dictionary <string, string> linksDefined = new Dictionary <string, string>();

            //Создание набора ссылок для привязки к объектам
            //ComApi.InwOpState10 state = ComApiBridge.ComApiBridge.State;
            //ComApi.InwURLOverride urlOverride
            //    = (ComApi.InwURLOverride)state
            //    .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwURLOverride, null, null);
            //ComApi.InwURLColl oURLColl = urlOverride.URLs();
            foreach (DisplayURL dUrl in displayURLs)
            {
                //ComApi.InwURL2 oUrl = (ComApi.InwURL2)state
                //    .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwURL, null, null);
                //oUrl.name = dUrl.DisplayName;
                //oUrl.URL = dUrl.URL;
                //oUrl.SetCategory("Hyperlink", "LcOaURLCategoryHyperlink");//Тип - всегда гиперссылка
                //oURLColl.Add(oUrl);

                string key = dUrl.DisplayName;
                if (!linksDefined.ContainsKey(key))
                {
                    linksDefined.Add(key, dUrl.URL);
                }
            }


            foreach (ModelItem item in modelItemColl.DescendantsAndSelf)
            {
                //convert the .NET object to COM object
                ComApi.InwOaPath oPath = ComApiBridge.ComApiBridge.ToInwOaPath(item);


                //Переделать панель атрибутов в соответствии с заполненными строками в окне
                if (overwriteUserAttr)//Только если стояла галка в окне!!!
                {
                    //наборы свойств
                    //ключ - имя панели, значение - набор свойств для привязки к объекту
                    Dictionary <string, ComApi.InwOaPropertyVec> propVectorsCurr
                        = new Dictionary <string, ComApi.InwOaPropertyVec>();
                    // Сначала скопировать базовые наборы свойств для каждой из заданных панелей в словарь
                    //foreach (DisplayDataTab ddt in displayDataTabs)
                    //{
                    //    propVectorsCurr.Add(ddt.DisplayName, ddt.InwOaPropertyVec.Copy());
                    //}

                    //Изучаются текущие свойства объекта модели
                    //Сначала в наборы свойств нужно добавить если присутствуют:
                    //- свойства, которые не редактируются данной командой
                    //- если нажата галка "Не удалять свойства", то любые свойства, которых не было в окне SetProps
                    //- свойства которые были заданы в окне SetProps, но они уже присутствуют в модели
                    //  (их значение задается как введено в окне,
                    //  если эти свойства добавлены на этом этапе, то они не должны добавляться на следующем)
                    HashSet <string> alreadyAdded = new HashSet <string>();//набор ключей свойств, которые добавлены на этом этапе

                    ComApi.InwGUIPropertyNode2 propn
                        = (ComApi.InwGUIPropertyNode2)oState.GetGUIPropertyNode(oPath, true);
                    foreach (ComApi.InwGUIAttribute2 attr in propn.GUIAttributes())
                    {
                        if (attr.UserDefined)
                        {
                            foreach (ComApi.InwOaProperty prop in attr.Properties())
                            {
                                string key = attr.ClassUserName + prop.UserName;

                                if (
                                    (attr.ClassUserName.Equals(S1NF0_DATA_TAB_DISPLAY_NAME) && propsNotModifiable.Contains(prop.UserName)) //- свойства, которые не редактируются данной командой
                                    ||
                                    (preserveExistingProperties && !propsDefined.ContainsKey(key))                                         //- если нажата галка Не удалять свойства, то любые свойства, которых не было в окне
                                    ||
                                    propsDefined.ContainsKey(key)                                                                          //- свойства которые были заданы в окне SetProps, но они уже присутствуют в модели
                                    )
                                {
                                    ComApi.InwOaPropertyVec vec = null;
                                    propVectorsCurr.TryGetValue(attr.ClassUserName, out vec);
                                    if (vec == null)
                                    {
                                        vec = (ComApi.InwOaPropertyVec)oState
                                              .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwOaPropertyVec,
                                                             null, null);
                                        propVectorsCurr.Add(attr.ClassUserName, vec);
                                    }
                                    if (!propsDefined.ContainsKey(key))
                                    {
                                        vec.Properties().Add(Utils.CopyProp(oState, prop));
                                    }
                                    else
                                    {
                                        //Учесть введенное значение
                                        DisplayProperty dp = propsDefined[key];
                                        vec.Properties().Add(Utils.CreateNewUserProp(oState, dp.DisplayName, dp.Value));
                                        alreadyAdded.Add(key);
                                    }
                                }
                            }
                        }
                    }

                    //Затем добавить вновь создаваемые свойства, которых ранее не было в модели
                    //(с учетом тех, которые были добавлены на предыдущем этапе)
                    foreach (DisplayDataTab ddt in displayDataTabs)
                    {
                        ComApi.InwOaPropertyVec vec = null;
                        propVectorsCurr.TryGetValue(ddt.DisplayName, out vec);
                        if (vec == null)
                        {
                            vec = (ComApi.InwOaPropertyVec)oState
                                  .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwOaPropertyVec,
                                                 null, null);
                            propVectorsCurr.Add(ddt.DisplayName, vec);
                        }

                        foreach (DisplayProperty dp in ddt.DisplayProperties)
                        {
                            string key = ddt.DisplayName + dp.DisplayName;
                            if (!alreadyAdded.Contains(key))
                            {
                                ComApi.InwOaProperty newP
                                    = Utils.CreateNewUserProp(oState, dp.DisplayName, dp.Value);
                                // add the new property to the new property category
                                vec.Properties().Add(newP);
                            }
                        }
                    }


                    //Удалить старые панели
                    try
                    { propn.RemoveUserDefined(0); }
                    catch (System.Runtime.InteropServices.COMException) { }
                    //Создать новые
                    foreach (KeyValuePair <string, ComApi.InwOaPropertyVec> kvp in propVectorsCurr)
                    {
                        propn.SetUserDefined(0, kvp.Key, "S1NF0",
                                             kvp.Value);
                    }

                    #region Старое

                    /*
                     *          // get properties collection of the path
                     *          ComApi.InwGUIPropertyNode2 propn
                     *              = (ComApi.InwGUIPropertyNode2)oState.GetGUIPropertyNode(oPath, true);
                     *
                     *
                     *
                     *          ComApi.InwOaPropertyVec idDataTabPropertyVecCurr = idDataTabPropertyVec.Copy();
                     *
                     *          //Добавить нередактируемые свойства если они есть в исходном
                     *          foreach (string dn in propsNotModifiable)
                     *          {
                     *              DataProperty prop = item.PropertyCategories
                     *              .FindPropertyByDisplayName(S1NF0_DATA_TAB_DISPLAY_NAME, dn);
                     *
                     *              if (prop != null)
                     *              {
                     *                  ComApi.InwOaProperty copyProp = Utils.CopyProp(oState, prop);
                     *                  idDataTabPropertyVecCurr.Properties().Add(copyProp);
                     *              }
                     *          }
                     *
                     *
                     *          //Удалить старые панели
                     *          try
                     *          { propn.RemoveUserDefined(0); }
                     *          catch (System.Runtime.InteropServices.COMException) { }
                     *          //Создать новые
                     *          if (userPropsDefined)
                     *          {
                     *              foreach (DisplayDataTab ddt in propsToSet)
                     *              {
                     *                  //Создание одной панели
                     *                  propn.SetUserDefined(0, ddt.DisplayName, "S1NF0",
                     *                      ddt.InwOaPropertyVec);
                     *              }
                     *
                     *              //Создание панели Id
                     *              if (idDataTabPropertyVecCurr.Properties().Count > 0)
                     *              {
                     *                  propn.SetUserDefined(0, S1NF0_DATA_TAB_DISPLAY_NAME, "S1NF0",
                     *                      idDataTabPropertyVecCurr);
                     *              }
                     *
                     *
                     *          }
                     */
                    #endregion
                }



                //Переделать все ссылки в соответствии с заполненными строками в окне
                if (overwriteLinks)//Только если стояла галка в окне!!!
                {
                    ComApi.InwURLOverride urlOverrideCurr = (ComApi.InwURLOverride)oState
                                                            .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwURLOverride, null, null);//urlOverride.Copy();

                    //Изучаются текущие ссылки
                    //Сначала в набор ссылок нужно добавить если присутствуют:
                    //- если нажата галка "Не удалять свойства", то любые ссылки, которых не было в окне SetProps
                    //- ссылки которые были заданы в окне SetProps, но они уже присутствуют в модели
                    //  (их значение задается как введено в окне,
                    //  если эти ссылки добавлены на этом этапе, то они не должны добавляться на следующем)
                    HashSet <string> alreadyAdded = new HashSet <string>();//набор ключей ссылок, которые добавлены на этом этапе

                    PropertyCategory linksCat = item.PropertyCategories.FindCategoryByName("LcOaExURLAttribute");
                    if (linksCat != null)
                    {
                        int linksCount = linksCat.Properties.Count / 3;

                        for (int i = 0; i < linksCount; i++)
                        {
                            string       suffix   = i == 0 ? "" : i.ToString();
                            DataProperty nameProp = item.PropertyCategories
                                                    .FindPropertyByName("LcOaExURLAttribute", "LcOaURLAttributeName" + suffix);
                            DataProperty urlProp = item.PropertyCategories
                                                   .FindPropertyByName("LcOaExURLAttribute", "LcOaURLAttributeURL" + suffix);
                            if (nameProp != null && urlProp != null)
                            {
                                string key = nameProp.Value.ToDisplayString();
                                if ((preserveExistingProperties && !linksDefined.ContainsKey(key))//- если нажата галка "Не удалять свойства", то любые ссылки, которых не было в окне SetProps
                                    ||
                                    (linksDefined.ContainsKey(key)))
                                {
                                    ComApi.InwURL2 oUrl = (ComApi.InwURL2)oState
                                                          .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwURL, null, null);
                                    oUrl.name = nameProp.Value.ToDisplayString();
                                    if (!linksDefined.ContainsKey(key))
                                    {
                                        oUrl.URL = urlProp.Value.ToDisplayString();//Сохранить существующее значение
                                    }
                                    else
                                    {
                                        oUrl.URL = linksDefined[key];//присвоить заданное в окне значение ссылки
                                        alreadyAdded.Add(key);
                                    }
                                    oUrl.SetCategory("Hyperlink", "LcOaURLCategoryHyperlink");//Тип - всегда гиперссылка

                                    urlOverrideCurr.URLs().Add(oUrl);
                                }
                            }
                        }
                    }


                    foreach (DisplayURL dUrl in displayURLs)
                    {
                        string key = dUrl.DisplayName;
                        if (!alreadyAdded.Contains(key))
                        {
                            ComApi.InwURL2 oUrl = (ComApi.InwURL2)oState
                                                  .ObjectFactory(ComApi.nwEObjectType.eObjectType_nwURL, null, null);
                            oUrl.name = dUrl.DisplayName;
                            oUrl.URL  = dUrl.URL;
                            oUrl.SetCategory("Hyperlink", "LcOaURLCategoryHyperlink");//Тип - всегда гиперссылка
                            urlOverrideCurr.URLs().Add(oUrl);
                        }
                    }


                    ComApi.InwOpSelection comSelectionOut =
                        ComApiBridge.ComApiBridge.ToInwOpSelection(new ModelItemCollection()
                    {
                        item
                    });
                    oState.SetOverrideURL(comSelectionOut, urlOverrideCurr);
                }
            }
        }
Пример #5
0
        private void SearchForExcelTableMatches
            (Document doc, IEnumerable <ModelItem> items, bool ignoreNonVisible,
            Excel.Range keyColumn,
            //Dictionary<string, int> keyValues,
            /*NamedConstant*/ string keyCatName, /*NamedConstant*/ string keyPropName,
            ComApi.InwOpState3 oState, Excel._Worksheet worksheet,
            SortedDictionary <int, Common.ExcelInterop.CellValue> tableHeader, string tabName
            )
        {
            foreach (ModelItem item in items)
            {
                if (ignoreNonVisible && item.IsHidden)
                {
                    continue;//Пропустить скрытый элемент
                }

                DataProperty property
                    = item.PropertyCategories.FindPropertyByDisplayName/*.FindPropertyByCombinedName*/ (keyCatName, keyPropName);
                //object searchValue = Utils.GetUserPropValue(property.Value);
                string searchValue = Utils.GetDisplayValue(property.Value);
                //Найти в выбранном столбце Excel ячейку с таким же значением


                Excel.Range row = keyColumn.Find(searchValue,
                                                 LookIn: Excel.XlFindLookIn.xlValues, LookAt: Excel.XlLookAt.xlWhole,
                                                 SearchOrder: Excel.XlSearchOrder.xlByColumns,
                                                 MatchByte: false);

                //int rowNum = 0;
                //keyValues.TryGetValue(searchValue, out rowNum);

                if (/*rowNum != 0*/ row != null)
                {
                    matchCount++;

                    int rowNum = row.Row;
                    //Получить данные из этой строки таблицы
                    SortedDictionary <int, Common.ExcelInterop.CellValue> rowValues
                        = Common.ExcelInterop.Utils.GetRowValues(worksheet, rowNum);
                    //Привязать пользовательские атрибуты как в строке таблицы. Если такие атрибуты уже были созданы, то переписать их значение
                    //Набор свойств для задания для этого элемента модели
                    ComApi.InwOaPropertyVec propsToSet
                        = oState.ObjectFactory(ComApi.nwEObjectType.eObjectType_nwOaPropertyVec);
                    //Заполнить данными из строки Excel
                    foreach (KeyValuePair <int, Common.ExcelInterop.CellValue> kvp in tableHeader)
                    {
                        int    colIndex = kvp.Key;
                        string propName = kvp.Value.DisplayString;
                        Common.ExcelInterop.CellValue cellValue = null;
                        rowValues.TryGetValue(colIndex, out cellValue);
                        object propValue = null;
                        if (cellValue != null)
                        {
                            propValue = Utils.ConvertValueByString(cellValue.DisplayString);//.Value2;
                        }

                        // create new property
                        ComApi.InwOaProperty newP = Utils.CreateNewUserProp(oState, propName, propValue);

                        // add the new property to the new property category
                        propsToSet.Properties().Add(newP);
                    }


                    foreach (ModelItem dItem in item.DescendantsAndSelf)
                    {
                        //convert the .NET collection to COM object
                        ComApi.InwOaPath oPath = ComApiBridge.ComApiBridge.ToInwOaPath(dItem);
                        //Получить текущие свойства элемента
                        ComApi.InwGUIPropertyNode2 propertyNode
                            = (ComApi.InwGUIPropertyNode2)oState.GetGUIPropertyNode(oPath, true);
                        //Проверить есть ли у элемента панель данных пользователя с точно таким же названием
                        //Получить ее индекс
                        int indexToSet = 0;
                        int i          = 1;
                        foreach (ComApi.InwGUIAttribute2 attr in propertyNode.GUIAttributes())
                        {
                            if (attr.UserDefined)
                            {
                                if (attr.ClassUserName.Equals(tabName))
                                {
                                    indexToSet = i;
                                    break;
                                }
                                else
                                {
                                    i++;
                                }
                            }
                        }

                        //Перезаписать панель данными из Excel
                        propertyNode.SetUserDefined(
                            indexToSet,
                            tabName, "S1NF0", propsToSet);
                    }
                    //System.Runtime.InteropServices.Marshal.ReleaseComObject(row);
                }
                else
                {
                    //Если неправильно указать ключевое свойство и столбец, возникает зависание из-за многократного поиска Search во вложенных элементах

                    //Search search = new Search();
                    //search.Selection.CopyFrom(item.Descendants);
                    //search.PruneBelowMatch = true;//объекты без вложенных
                    //search.SearchConditions
                    //    .Add(SearchCondition.HasPropertyByCombinedName(keyCatCombName, keyPropCombName));
                    //ModelItemCollection dItems = search.FindAll(doc, false);

                    //IEnumerable<ModelItem> dItems
                    //    = item.Descendants.Where(SearchCondition.HasPropertyByCombinedName(keyCatCombName, keyPropCombName));//Не обрезает вложенные объекты


                    //TODO: Это чревато огромными задержками на большой модели если неправильно задано ключевое поле!!!
                    //Вместо Search API Линейный поиск по дереву до нахождения соответствия
                    List <ModelItem> dItems = new List <ModelItem>();
                    SearchHasPropertyByCombinedName(item.Children, keyCatName, keyPropName, dItems);


                    SearchForExcelTableMatches(doc, dItems, ignoreNonVisible,
                                               keyColumn,
                                               //keyValues,
                                               keyCatName, keyPropName,
                                               oState, worksheet, tableHeader, tabName
                                               );
                }
            }
        }