Skip to content

Instantly share code, notes, and snippets.

@boumer7
Created June 4, 2024 12:07
Show Gist options
  • Save boumer7/149a345b3c06a700fcd693c9d4760502 to your computer and use it in GitHub Desktop.
Save boumer7/149a345b3c06a700fcd693c9d4760502 to your computer and use it in GitHub Desktop.
fillItems
// 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("Предупреждение! <font color=\"Green\"> Отсутствует изделие </font>{0}. Получение атрибутов для данной записи невозможно. <br>",
parent == null ? "" : "в составе <a href =\"" + Service.UI.FormatLink((ScriptingObject)parent, true) + "\">" + parent.ToString() + "</a>"));
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<string, string> calculatedAttrs = new Dictionary<string, string>();
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("<font color=\"Yellow\">Предупреждение!</font> атрибут <font color=\"Green\">" + attrName + "</font> не может быть выгружен из ИИВ <a href=\"" + Service.UI.FormatLink((ScriptingObject)pvc, true) + "\">" + pvc.ToString() + "</a> с тэгами <font color=\"Green\">" + attrTags.ToString() + "</font> <br>");
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);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment