Добрый день!
Я работаю с режимом "Структура изделия", все позиции которые есть в структуре изделия выгружаю в pdm систему, но чтобы это сделать нужно открыть каждую деталь и сохранить ее, для этого нужен путь файла. Путь файла искала в режиме 3D модель, обозначение файла брала из структуры изделия и искала соответствие в дереве построения. Но столкнулась с вариантом когда, в дереве построения и в структуре изделия обозначения отличаются, но при этом если в структуре становлюсь на какую-то позицию, то в дереве она подсвечивается. Столкнулась с тем, что могу вытащить путь связанного объекта и отдельно Обозначение и Наименование, но связать их между собой не получается.
На входе имею см. рисунок1.
Далее использую код, который бегает по структуре изделия и считывает Обозначение, Наименование, Путь(расположение связанных объектов) и записывает в таблицу.
Если я использую код:
Код |
---|
//создаем столбцы в 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; |
то на выходе получаю (см.рисунок2). Обратите внимание, что колонки Обозначение и Расположение файла не соответствуют.
Если использую код, который вытаскивает правильно Обозначение, то не могу получить Расположение файла, так как SourceFragmentPath есть только в GetAllRowElements. (см. рисунок3)
Код |
---|
//создаем столбцы в 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; |
Получается я могу получить либо только расположение файлов, либо реальные обозначение и наименование деталей.
Подскажите пожалуйста, как получить и Расположение связанных объектов, и Обозначение, и Наименование, при этом сохранив все условия из кода?