Добрый день!
Я работаю с режимом "Структура изделия", все позиции которые есть в структуре изделия выгружаю в pdm систему, но чтобы это сделать нужно открыть каждую деталь и сохранить ее, для этого нужен путь файла. Путь файла искала в режиме 3D модель, обозначение файла брала из структуры изделия и искала соответствие в дереве построения. Но столкнулась с вариантом когда, в дереве построения и в структуре изделия обозначения отличаются, но при этом если в структуре становлюсь на какую-то позицию, то в дереве она подсвечивается. Столкнулась с тем, что могу вытащить путь связанного объекта и отдельно Обозначение и Наименование, но связать их между собой не получается.
На входе имею см. рисунок1.
Далее использую код, который бегает по структуре изделия и считывает Обозначение, Наименование, Путь(расположение связанных объектов) и записывает в таблицу.
Если я использую код:
[CODE] //создаем столбцы в Data TableSystem.Data.DataTable dt = new System.Data.DataTable();
dt.Columns.Add("NOTE_SPEC", typeof(string));
dt.Columns.Add("NAME_SPEC", typeof(string));
dt.Columns.Add("CHECK_POS", typeof(Boolean));
dt.Columns.Add("Path", typeof(string));
document = TFlex.Application.ActiveDocument;
//получаем объекты дерева построения
//1-параметр - ссылка на текущую сборку
//2-параметр - указывает нужно ли, кроме ссылок на grb, возвращать ссылки на картинки, БД.
//3-параметр - указывает нужно ли возвращать ссылки на библиотечные фрагменты
//последний параметр - позволяет задать уровень вложенности,
//для которого нужно получить ссылки(false - 1 уровень вложенности, true - поиск на всю глубину сборки)
string[] filePaths = TFlex.Application.GetDocumentExternalFileLinks(document.FileName, false, false, false);
//бегаем по спецификации T-flex
foreach (var ps in document.GetProductStructures())
{
//перебор всех элементов/записей
foreach (var elem in ps.GetAllRowElements())
{
var includeInReport = (bool)elem.IncludeInDoc.Value; //true/false если стоит галочка включать в спецификацию
d = elem.SourceFragmentPath; //расположение (путь) связанного объекта
if (d != null)
{
//перебор групп(разделов) "главного" представления:
foreach (var group in ps.GetRowElementGroups())
{
string groupName = group.Name;
if ((groupName == "Документация") || (groupName == "Сборочные единицы") || (groupName == "Детали") || (groupName == "Прочие изделия"))
{
foreach (var item in group.Items)
{
//Значения элемента
dynamic mainElem = item.MergedElements.First();
string paramValue = mainElem[new Guid("ee9a8bc0-c016-4915-9baa-69b2d8c28786")].ValueAsString; //обозначение
string paramValue1 = mainElem[new Guid("44bb724a-de07-4fd3-9882-ced1c8425057")].ValueAsString; //наименование
if ((groupName == "Документация") || (groupName == "Детали") || (groupName == "Сборочные единицы") || (groupName == "Прочие изделия"))
{
//добавляем строку в Data Table и запоняем ее
DataRow newRow = dt.Rows.Add();
newRow.SetField("NOTE_SPEC", paramValue);
newRow.SetField("NAME_SPEC", paramValue1);
newRow.SetField("CHECK_POS", true);
count_row = Convert.ToInt16(dt.Rows.Count.ToString());
if (paramValue.Contains(" СБ") == true)
{
string paths = document.FileName.ToString();
newRow.SetField("path", paths); //заполняем строку
}
else
{
newRow.SetField("path", d); //заполняем строку
}
}
}
}
}
}
}
}
gridContrl.DataSource = null;
gridContrl.DataSource = dt;
[/CODE]
то на выходе получаю (см.рисунок2). Обратите внимание, что колонки Обозначение и Расположение файла не соответствуют.
Если использую код, который вытаскивает правильно Обозначение, то не могу получить Расположение файла, так как SourceFragmentPath есть только в GetAllRowElements. (см. рисунок3)[CODE]//создаем столбцы в Data Table
System.Data.DataTable dt = new System.Data.DataTable();
dt.Columns.Add("NOTE_SPEC", typeof(string));
dt.Columns.Add("NAME_SPEC", typeof(string));
dt.Columns.Add("CHECK_POS", typeof(Boolean));
dt.Columns.Add("Path", typeof(string));
document = TFlex.Application.ActiveDocument;
//получаем объекты дерева построения
//1-параметр - ссылка на текущую сборку
//2-параметр - указывает нужно ли, кроме ссылок на grb, возвращать ссылки на картинки, БД.
//3-параметр - указывает нужно ли возвращать ссылки на библиотечные фрагменты
//последний параметр - позволяет задать уровень вложенности,
//для которого нужно получить ссылки(false - 1 уровень вложенности, true - поиск на всю глубину сборки)
string[] filePaths = TFlex.Application.GetDocumentExternalFileLinks(document.FileName, false, false, false);
//бегаем по спецификации T-flex
foreach (var ps in document.GetProductStructures())
{
//перебор всех элементов/записей
foreach (var elem in ps.GetAllRowElements())
{
var includeInReport = (bool)elem.IncludeInDoc.Value; //true/false если стоит галочка включать в спецификацию
d = elem.SourceFragmentPath; //расположение (путь) связанного объекта
}
if (d != null)
{
//перебор групп(разделов) "главного" представления:
foreach (var group in ps.GetRowElementGroups())
{
string groupName = group.Name;
if ((groupName == "Документация") || (groupName == "Сборочные единицы") || (groupName == "Детали") || (groupName == "Прочие изделия"))
{
foreach (var item in group.Items)
{
//Значения элемента
dynamic mainElem = item.MergedElements.First();
string paramValue = mainElem[new Guid("ee9a8bc0-c016-4915-9baa-69b2d8c28786")].ValueAsString; //обозначение
string paramValue1 = mainElem[new Guid("44bb724a-de07-4fd3-9882-ced1c8425057")].ValueAsString; //наименование
if ((groupName == "Документация") || (groupName == "Детали") || (groupName == "Сборочные единицы") || (groupName == "Прочие изделия"))
{
//добавляем строку в Data Table и запоняем ее
DataRow newRow = dt.Rows.Add();
newRow.SetField("NOTE_SPEC", paramValue);
newRow.SetField("NAME_SPEC", paramValue1);
newRow.SetField("CHECK_POS", true);
count_row = Convert.ToInt16(dt.Rows.Count.ToString());
if (paramValue.Contains(" СБ") == true)
{
string paths = document.FileName.ToString();
newRow.SetField("path", paths); //заполняем строку
}
else
{
newRow.SetField("path", d); //заполняем строку
}
}
}
}
}
}
//}
}
gridContrl.DataSource = null;
gridContrl.DataSource = dt;[/CODE]
Получается я могу получить либо только расположение файлов, либо реальные обозначение и наименование деталей.
Подскажите пожалуйста, как получить и Расположение связанных объектов, и Обозначение, и Наименование, при этом сохранив все условия из кода?