// FillItems(pvc, null, rootQuant, rootLevel, true) вызов из UpdateItemList; private void FillItems(InfoObject pvc, CollectionElement sourceElement, double quantity, string level, bool isRoot) { if (pvc == null) { var parent = sourceElement == null ? null : sourceElement.OwnerObject as InfoObject; errors.AppendLine(string.Format("Предупреждение! Отсутствует изделие {0}. Получение атрибутов для данной записи невозможно.
", parent == null ? "" : "в составе " + parent.ToString() + "")); return; } var productConfiguration = pvc.GetInfoObject("ProductConfiguration"); var productVersion = pvc.GetInfoObject("ProductVersion"); // AA Родитель-изделие для версии изделия var izdelie = productVersion.GetInfoObject("LinkToOriginalObject"); // АА Получение доступа к контейнеру ЭРИ Изделия var ParentContainer = izdelie.ContainerOriginal; var parameters = ParentContainer.GetAttribute("Parameters"); StringBuilder parameters_string = new StringBuilder(); var FSCValue = "Не указано"; var PN_MentorValue = "Не указано"; var ManufacturerValue = "Не указано"; var OriginalContainer = ParentContainer.ToString(); var nameIzdelie = izdelie.GetString("Name"); Dictionary calculatedAttrs = new Dictionary(); foreach (var item in parameters.CollectionElements) { string attrName = item.GetString("NameInStandard"); if (attrName == "FSC" || attrName == "P/N Mentor" || attrName == "Производитель") { calculatedAttrs[attrName] = item.GetString("NameKeyTable"); //parameters_string.Append($"{attrName}: {calculatedAttrs[attrName]} "); } } // OK // parameters_string.Append($"FSC: {fsc_attr}; PN Mentor: {pn_mentor_attr}"); bool collectMode = false; foreach (var param in ParentContainer.AllAttributes){ if (param.NameKey == "Name" && param.Value.ValueAsString == nameIzdelie){ collectMode = true; } if (collectMode && param.NameKey != "Order"){ if (calculatedAttrs["FSC"] == param.NameKey){ FSCValue = param.Value.ValueAsString; }else if (calculatedAttrs["P/N Mentor"] == param.NameKey){ PN_MentorValue = param.Value.ValueAsString; }else if (calculatedAttrs["Производитель"] == param.NameKey){ ManufacturerValue = param.Value.ValueAsString; } }else{ collectMode = false; } } collectMode = false; var allAttributes = ParentContainer.AllAttributes.ToList(); for (int i = allAttributes.Count - 1; i >= 0; i--) { var param = allAttributes[i]; if (param.NameKey == "Name" && param.Value.ValueAsString == nameIzdelie){ collectMode = true; } if (collectMode && param.NameKey != "Order"){ if (calculatedAttrs["FSC"] == param.NameKey){ FSCValue = param.Value.ValueAsString; }else if (calculatedAttrs["P/N Mentor"] == param.NameKey){ PN_MentorValue = param.Value.ValueAsString; }else if (calculatedAttrs["Производитель"] == param.NameKey){ ManufacturerValue = param.Value.ValueAsString; } }else{ collectMode = false; } } collectMode = false; //Service.UI.ShowMessage(string.Join(", ", parameters_string)); /*bool collectMode = false; bool orderMet = false; foreach (var param in ParentContainer.AllAttributes) { if (param.NameKey == "Name" && param.Value.ValueAsString == nameIzdelie) { collectMode = true; continue; } if (collectMode) { if (param.NameKey == "Order") { orderMet = true; break; } if (calculatedAttrs.ContainsValue(param.NameKey)) { if (param.NameKey == calculatedAttrs["FSC"]) { FSCValue = param.Value.ValueAsString; } if (param.NameKey == calculatedAttrs["P/N Mentor"]) { PN_MentorValue = param.Value.ValueAsString; } if (param.NameKey == calculatedAttrs["Производитель"]) { ManufacturerValue = param.Value.ValueAsString; } } } } if (!orderMet) { for (int i = ParentContainer.AllAttributes.Count() - 1; i >= 0; i--) { var param = ParentContainer.AllAttributes.ElementAt(i); if (param.NameKey == "Order") { break; } if (calculatedAttrs.ContainsValue(param.NameKey)) { if (param.NameKey == calculatedAttrs["FSC"]) { FSCValue = param.Value.ValueAsString; } if (param.NameKey == calculatedAttrs["P/N Mentor"]) { PN_MentorValue = param.Value.ValueAsString; } if (param.NameKey == calculatedAttrs["Производитель"]) { ManufacturerValue = param.Value.ValueAsString; } } } } Service.UI.ShowMessage(string.Join(", ", parameters_string)); //parameters_string.Append($"FSC: {FSCValue} PN Mentor: {PN_MentorValue} Manuf.: {ManufacturerValue}"); // Clipboard.SetText(parameters_string.ToString()); /* foreach (var param in ParentContainer.AllAttributes) { if (param.NameKey.Contains("attr") || param.NameKey.Contains("Name") || param.NameKey.Contains("Order")){ parameters_string.Append($"{param.NameKey} : {param.Value.Value}"); } if (param.NameKey == "Name" && param.Value.ValueAsString == nameIzdelie) { attrReadMode = true; } if (attrReadMode && param.NameKey == "Order") { attrReadMode = false; break; } if (attrReadMode && calculatedAttrs.ContainsValue(param.NameKey)) { if (param.NameKey == calculatedAttrs["FSC"]) { FSCValue = param.Value.ValueAsString; } if (param.NameKey == calculatedAttrs["P/N Mentor"]) { PN_MentorValue = param.Value.ValueAsString; } if (param.NameKey == calculatedAttrs["Производитель"]) { ManufacturerValue = param.Value.ValueAsString; } } } Clipboard.SetText(parameters_string.ToString()); for (int i = ParentContainer.AllAttributes.Count() - 1; i >= 0; i--) { var param = ParentContainer.AllAttributes.ElementAt(i); if (param.NameKey == "Name" && param.Value.ValueAsString == nameIzdelie) { attrReadMode = true; } if (attrReadMode && param.NameKey == "Order") { attrReadMode = false; } if (attrReadMode && calculatedAttrs.ContainsValue(param.NameKey)) { if (param.NameKey == calculatedAttrs["FSC"]) { FSCValue = param.Value.ValueAsString; } if (param.NameKey == calculatedAttrs["P/N Mentor"]) { PN_MentorValue = param.Value.ValueAsString; } if (param.NameKey == calculatedAttrs["Производитель"]) { ManufacturerValue = param.Value.ValueAsString; } } } //parameters_string.Append($"{FSCValue}, {PN_MentorValue}, {ManufacturerValue}"); //Service.UI.ShowMessage(string.Join(", ", parameters_string)); /* var fsc_inner_value = ""; var pn_mentor_inner_value = ""; foreach (var param in ParentContainer.AllAttributes) { parameters_string.Append($"{param.NameKey}: {param.Value.Value} "); if (param.NameKey == fsc_attr){ fsc_inner_value = param.Value.Value.ToString(); } if (param.NameKey == pn_mentor_attr){ pn_mentor_inner_value = param.Value.Value.ToString(); } if (param.NameKey == "Name" && param.Value.Value.ToString() == nameIzdelie){ if (fsc_inner_value != ""){ FSCValue = fsc_inner_value; } if (pn_mentor_inner_value != ""){ PN_MentorValue = pn_mentor_inner_value; } fsc_inner_value = ""; pn_mentor_inner_value = ""; } } */ var documentVersion = pvc.GetInfoObject("ProductVersion.OriginalDocument"); var newCE = exportDataAttr.AddCollectionElement(); if (!isRoot || setRootLevel) newCE["Quantity"] = quantity; newCE["ProductItem"] = pvc; newCE["OriginalDocument"] = documentVersion; newCE["Level"] = level; newCE["FSC"] = FSCValue; newCE["PN_Mentor"] = PN_MentorValue; newCE["OriginalContainer"] = OriginalContainer; newCE["Manufacturer"] = ManufacturerValue; // определения атрибутов, которые будут заполняться вручную var manualyHandledAttributes = new[] { "Quantity", "Level", "ProductItem", "OriginalDocument", "FSC", "PN_Mentor", "OriginalContainer", "Manufacturer"}; // AA attrNamesDict - словарь ключей из моей коллекции атрибутов "Экспортируемые элементы" foreach (var kvp in attrNamesDict) { var attrName = kvp.Key; var attrTags = kvp.Value; // АА Этим можно вывести "Part Number" из коллекции Экспорт. элементы // errors.AppendLine($"{attrName} |"); // пропустим ручные атрибуты if (manualyHandledAttributes.Contains(attrName)) continue; // пропустим авторассчётные атрибуты чтоб они сами считались // AA Авторассчётные атрибуты - те, которые имеют включённое автовычисление и собств. скрипт (подлинник STEP и подлинник PDF) if (newCE.GetAttributeDef(attrName).AutoCalculationKind == AttributeDefBase.AutoCalculationKindEnum.Calculating) { newCE.GetAttribute(attrName).TurnToCalculated(); continue; } if (newCE.GetAttributeDef(attrName).AutoCalculationKind != AttributeDefBase.AutoCalculationKindEnum.None){ continue; } IAttributableObject valueSource = pvc; // если в тэгах содержится ключевое слово, то нужно использовать другой источник данных if (attrTags.Any(str => str.StartsWith("DataSource"))) { var sourceString = attrTags.First(str => str.StartsWith("DataSource")); if (sourceString.Contains("Version")) valueSource = productVersion; else if (sourceString.Contains("Configuration")) valueSource = productConfiguration; else if (sourceString.Contains("Element") && sourceElement != null) valueSource = sourceElement; } if (valueSource == null) errors.AppendLine("Предупреждение! атрибут " + attrName + " не может быть выгружен из ИИВ " + pvc.ToString() + " с тэгами " + attrTags.ToString() + "
"); else{ newCE[attrName] = valueSource[attrName]; } } int levelCounter = 1; // АА песочница с выводом функций и атрибутов элемента /* foreach (var itemz in pvc.GetCollectionElements("Items")) { errors.Append(itemz.GetString("Part_Number")); } */ foreach (var item in pvc.GetCollectionElements("Items").Safe().OrderBy(ce=>ce.GetString("SortedKey"))) { // aa // item - это Name + Quantity var childQuantity = item.GetDouble("Quantity"); /* if (item.ToString().Contains("C331")){ errors.Append(item); } */ if (!isRoot && multiply) childQuantity *= quantity; var childLevel = string.Format("{0}{1}", isRoot ? "" : level + ".", levelCounter++.ToString()); // errors.Append(string.Join(", ", item.GetInfoObject("ProductItem").AllAttributes)); // АА Эта часть заполняет данными в интерфейсе FillItems(item.GetInfoObject("ProductItem"), item, childQuantity, childLevel, false); } }