Официальный форум российского программного комплекса T-FLEX PLM


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
Получить все сборки, детали, стандартные изделия входящие в 3D модель
 
Здравствуйте! Подскажите пожалуйста, как макросом пробежаться по дереву построения 3D модели сборки и получить имена, пути входящих деталей, сборок и т.д.? T-flex 15.1.70.0
Написала в техподдержку, но они молчат :(
 
Анна, пример рекурсивной обработки документа и всех вложенных фрагментов, с последовательным выводом метаданных в файл "asm_info.log".

Код
using System.IO;
using TFlex.Model;
using TFlex.Model.Model3D;
using System.Diagnostics;

namespace Test
{
    public class AsmInfo
    {
        private static readonly Document document = TFlex.Application.ActiveDocument;
        private static string path;


        public static void Run()
        {
            if (document == null)
                return;

            path = document.FilePath + @"asm_info.log";

            if (File.Exists(path))
                File.Delete(path);

            MetadataOutput(document);

            if (File.Exists(path))
                Process.Start("notepad.exe", path);
        }

        private static void MetadataOutput(Document document)
        {
            int index = 0;

            foreach (var i in document.GetFragments3D())
            {
                string[] contents = {
                    "Документ:\t\t"         + document.FileName,
                    "Кол-во фрагментов:\t"  + document.GetFragments3D().Count,
                    "  Индекс фрагмента:\t" + index,
                    "  Имя файла:\t\t"      + i.FilePath,
                    "  Имя объкта:\t\t"     + i.Name,
                    "  Идентификатор:\t"    + i.ObjectId,
                    "  Полный путь:\t\t"    + i.FullFilePath,
                    "========================================================"
                };

                File.AppendAllLines(path, contents);
                index++;

                if (TFlex.Application.OpenFragmentDocument(i.FullFilePath) is Document fragment)
                    MetadataOutput(fragment);
            }
        }
    }
}
T-FLEX CAD 17.1.21.0
 
vite, Благодарю, все работает!
 
Добрый день!
Подскажите пожалуйста в чем может быть проблема:
не могу получить свойство фрагментов IncludeInSpecificBom "Включение в спецификацию".
Посмотрел значение переменной i в VS через Shift+F9, данного свойства не существует, есть только свойство IncludeInNewBom.
Код:

using System.IO;
using TFlex.Model;
using TFlex.Model.Model3D;
using System.Diagnostics;

namespace Test
{
public class AsmInfo
{
private static readonly Document document = TFlex.Application.ActiveDocument;
private static string path;


public static void Run()
{
if (document == null)
return;

path = document.FilePath + @"asm_info.log";

if (File.Exists(path))
File.Delete(path);

MetadataOutput(document);

if (File.Exists(path))
Process.Start("notepad.exe", path);
}

private static void MetadataOutput(Document document)
{
int index = 0;

foreach (var i in document.GetFragments3D())
{
string[] contents = {
"Документ:\t\t" + document.FileName,
"Кол-во фрагментов:\t" + document.GetFragments3D().Count,
" Индекс фрагмента:\t" + index,
" Имя файла:\t\t" + i.FilePath,
" Имя объкта:\t\t" + i.Name,
" Идентификатор:\t" + i.ObjectId,
" Полный путь:\t\t" + i.FullFilePath,
" Включение в спецификацию:\t\t" + i.IncludeInSpecificBomh,
"========================================================"
};

File.AppendAllLines(path, contents);
index++;

if (TFlex.Application.OpenFragmentDocument(i.FullFilePath) is Document fragment)
MetadataOutput(fragment);
}
}
}
}
 
Roman, Попробуйте использовать
Код
i.get_IncludeInSpecificBom("Спецификация"); //Передавать нужно имя вашей спецификации

Если Вы хотите узнать включен ли фрагмент в конкретный состав изделия, то можно сделать так, например

foreach (var i in document.GetFragments3D())

{

string result = string.Empty;

var bom = document.GetProductStructures().FirstOrDefault(x => x.SchemeId.ToString() == "0971322f-b6bb-46ae-891e-1abb26e0a252"); //guid вашей спецификации

var rows = bom?.GetAllRowElements();

if(rows != null)

{

foreach (var row in rows)

{

if (row.SourceFragment3DFirstLevel != null && row.SourceFragment3DFirstLevel.ObjectId == i.ObjectId)

{

result = row.IncludeInDoc.Value.ToString();

}

}

}

string[] contents = {

"Документ:\t\t" + document.FileName,

"Кол-во фрагментов:\t" + document.GetFragments3D().Count,

" Индекс фрагмента:\t" + index,

" Имя файла:\t\t" + i.FilePath,

" Имя объкта:\t\t" + i.Name,

" *** :\t" + i.ObjectId,

" Полный путь:\t\t" + i.FullFilePath,

" Включение в спецификацию:\t\t" + result,

"========================================================"

};

Изменено: Hydra - 18.12.2024 15:21:54
 
Спасибо, Hydra! C помощью IncludeInSpecificBom мне необходимо выяснить тип включения фрагмента в спецификацию ( "не включать", "без вложенных элементов", "с вложенными элементами"...)
Изменено: Roman - 18.12.2024 15:38:37
 
Roman, тогда должен помочь первый способ.
Изменено: Hydra - 18.12.2024 16:39:22
 
К сожалению не работает первый способ, ошибку выдает "Ошибка компилятора CS1545"
При проверке переменной по shift F9 свойство "IncludeInSpecificBom" отсутствует, есть только свойство IncludeInNewBom.
1.png (1.22 МБ)
2.png (858.53 КБ)
Изменено: Roman - 19.12.2024 13:08:30
 
Roman, у вас в тексте ошибки есть информация - использовать метод. Используйте его и получите значение нужного перечисления, если пользуетесь C#.

string bomStatus = i.get_IncludeInSpecificBom("Спецификация").ToString();
 
Цитата
написал:
Roman , у вас в тексте ошибки есть информация - использовать метод. Используйте его и получите значение *** перечисления, *** пользуетесь C#.

string bomStatus = i.get_IncludeInSpecificBom("Спецификация").ToString();
Спасибо, Hydra!
Получилось!
private static void MetadataOutput(Document document)
{
int index = 0;



foreach (var i in document.GetFragments3D())
{
string bomStatus = i.get_IncludeInSpecificBom("Структура изделия").ToString();


if (i.Visible == true&& i.TopLevel==true)
{

string[] contents = {
"Документ:\t\t" + document.FileName,
"Кол-во фрагментов:\t" + document.GetFragments3D().Count,
" Индекс фрагмента:\t" + index,
" Имя файла:\t\t" + i.FilePath,
" Имя объкта:\t\t" + i.Name,
" Идентификатор:\t" + i.ObjectId,
" Полный путь:\t\t" + i.FullFilePath,
" Тело в которое входит в фрагмент:\t\t" + i.Body.Name,
" Получить тип объекта:\t\t" + i.GroupType.ToString(),
" Объект в сцене:\t\t" + i.InScene,
" Уровень:\t\t" + i.Level.Value,
" Guid:\t\t" + i.LinkedDocumentGuid.ToString(),
" Видимость :\t\t" + i.Visible,
" Видимость :\t\t" + i.VisibleInScene,
" Имя на дисплее :\t\t" + i.DisplayName,
" Количество элементов :\t\t" + i.Document.Bodies.Count,
" Управление прозрачностью :\t\t" + i.IsTransparencyOn,
" Свойство подавленности операции :\t\t" + i.Suppression.Suppress,
" Признак верхней операции :\t\t" + i.TopLevel,
" Верхняя операция в теле :\t\t" + i.TopOperation.Name,
" Включение в спецификацию :\t\t" + bomStatus,



"========================================================"
};

File.AppendAllLines(path, contents);
index++;

if (TFlex.Application.OpenFragmentDocument(i.FullFilePath) is Document fragment)
MetadataOutput(fragment);
}
}
Страницы: 1