/// <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); }
/// <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); }
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); }
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); } } }
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 ); } } }