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


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
Автоматическое получение конструкторской документации для 3D-сборки
 
Создана параметрическая 3D-сборка для ряда типоразмеров. Заданный типоразмер 3D-модели строится автоматически на основе выбора значения переменной из списка.

Для выбранного типоразмера требуется автоматически получать комплект конструкторской документации всех компонентов изделия (порядка 80 чертежей сборок, подсборок, деталей и спецификации) с возможностью вывода на печать и экспорта всей документации.

Каким образом решается данная задача, в т.ч. для предполагаемого варианта выполнения всех чертежей на отдельных страницах в одном главном сборочном файле?

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

Похожая задача без описания решения приведена
http://www.tflex-nord.narod.ru/html/area_use/mash_metal/pressform_01/pressform_01.htm

Спасибо за ответ.
Изменено: Алексей Шаганов - 05.12.2008 19:10:47
 
На указанном ресурсе, приведеный пример не может являться шаблоном, образцом и т.п. для Вашей, Алексей, задачи. В случае с пресс-формой, количество листов минимально. По-моему мнению подобный подход применим только для проектов 5-10 листов не более. К тому же на нашем предприятии СТП разрешает для проектов оснастки, типа пресс-форм и штампов, использовать обозначения входящих чертежей как -001, -002. Это является отступлением от ЕСКД, как Вы знаете подобным образом присваивается обозначения исполнениям. Но у нас пошли на подобное исключение по причине формирования комплектности чертежей на подобную оснастку и по тому, что в большинстве случаев - изготовление подобной оснастки у нас единичное и все входящие детали в другой оснастке применяется крайне редко. Проект той же пресс-формы - единичен для данного типоразмера и детали к другому типоразмеру не применимы.
Ваш случай ближе к проекту газоходов http://www.tflex-nord.narod.ru/html/area_use/energy/energy_03/energy_03.htm
В данном случае у фрагментов создано несколько (минимально) внешних переменных, значения которых меняются в редакторе сборки. В файле фрагментов - оформленные чертежи. После формирования сборки фрагменты выгружаются из сборки командой "Деталировка" из контекстного меню с текущими значениями внешних переменных и с заменой исходных файлов. Так вы получаете актуальную деталировку.
Изменено: Сергей Максимов - 05.12.2008 20:03:34
 
Сборка полностью выполнена "снизу-вверх". Таким образом, чертёж выбранного типоразмера (зависимой от одной переменной) каждой детали возможно получить в файле этой детали и без применения операции "Деталировка", предназначенной для получения размеров детали в режиме проектирования в контексте сборки. Также "Деталировка" позволяет получить чертежи только одного уровня сборки, для получения чертежей деталей подсборки необходимо открывать файл этой подсборки.

Мой вопрос в автоматическом получении из одного файла или другим удобным способом всей КД выбранного типоразмера большого сборочного изделия с несколькими уровнями подсборок.

Возможно ли использовать и как связь 2D и 3D фрагментов (пункт "Связь 2D и 3D фрагментов" главы "Создание сборки из 3D фрагментов" справки:…При вставке нового трёхмерного фрагмента в системе всегда создаётся и 2D фрагмент, ссылающийся на этот же файл…)? В чем особенность этого механизма?
 
Операция "Деталировка" как раз и предназначена для проектирования "снизу-вверх", в отличие от "Сохранить деталь" - для режима "Сверху-вниз".
А так Вам лучше написать макрос - для автоматической деталировки по уровням. Макрос должен перебирать все фрагменты, выгружать необходимые, а в выгруженных проверять наличие фрагментов для деталировки и при необходимости выгружать - так пока не дойдет до нижнего уровня.
Изменено: Сергей Максимов - 08.12.2008 19:25:23
 
Спасибо. Не могли бы Вы привести функции и примерный алгоритм для выполнения данной задачи? В Т-Флексе не программировал.
Изменено: Алексей Шаганов - 09.12.2008 17:30:07
 
Думаю для облегчения поиска лучше создать в каждом выгружаемом фрагменте или подсборке внешнюю переменную-идентификатор, например fragmDetal с любым значением.

Циклом foreach(Fragment someNameVar in doc.fragments) перебрать все фрагменты, вложенным циклом перебрать внешние переменные фрагмента, если найден фрагмент с переменной fragmDetal, то этот файл выгрузить с подстановкой значений переменных ( но я нашел только для 2D, хотя возможно это действует и для 3D - GetFragmentDocument(bool substitute)). Затем здесь же уже во вложенном цикле перебрать фрагменты в поисках фрагмента с указанной переменной и т.д. для всех уровней вложенности.

Сам пока таких задачек не решал, только могу предположить направление решения.
Изменено: Сергей Максимов - 09.12.2008 20:32:42
 
Цитата
Алексей Шаганов пишет:

Не могли бы Вы привести функции и примерный алгоритм для выполнения данной задачи?

Выдернул часть касающуюся деталирования деталей. Не отлаживал. Прошу прощения если пойдет косо. Здесь остался не относящийся к самой деталировке код, но для надежности работы и в случае если после отладки у пользователя возникают ошибки этот код помогает ее локализовать.
Счетчик фрагментов хранится в аттрибутах файла сборки, чтобы не повторялись имена фрагментов. Имена фрагментов присваиваются по имени детали. К сожалению качество кода упирается во время, а его нет.
Еще раз извиняюсь.

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

namespace MacroNameSpace
{
public class NewMacroClass
{
//-------------------------------------------------------------------------------------
//Составим функцию FindVar поиска переменной по имени
private static Variable FindVar(Document doc,string name)
{
foreach(Variable var in doc.Variables)
if (var.Name == name) return var;
return null;
}
//------------------------------------------------------------------------------------
public static void Деталировка()
{
Document doc = TFlex.Application.ActiveDocument;
if (doc.FilePath=="")
{
doc.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information,"Необходимо сохранить проект!"));
return;
}
doc.BeginChanges("Аттрибуты");

if(!doc.Attributes.HaveAttribute("CounterFrag"))
doc.Attributes.SetIntAttribute("CounterFrag",0);
int counter = doc.Attributes.GetIntAttribute("CounterFrag");
doc.EndChanges();

// ---------Подготовим место хранения протокола работы макроса - LogFurn в случае нештатного поведения у пользователя можно отслеживать на чем споткнулись

string str = TFlex.Application.SystemPath;
str += "\\Macros\\Log";
if (!Directory.Exists(str))
Directory.CreateDirectory(str);
FileStream furn = File.Create(str+"\\LogFurn.txt");
StreamWriter furnTxt = new StreamWriter (furn); // создание протокола
furnTxt.WriteLine("Протокол "+ doc.FileName.ToString()+" создан");
furnTxt.Flush();
//--------------
string NameFrag = ""; // Имя сдеталированного фрагмента

double FlagDet=1; // Флаг обновления/установки детали. (0 - деталь деталировать)
bool flag = false;
string Name = "";
string Identif = "";

doc.BeginChanges("Деталировка");


int i=0;
foreach (Fragment Frag in doc.Fragments)
{
flag = false;

foreach(TFlex.Model.FragmentVariableValue FV in Frag.VariableValues)
if (FV.Name=="FlagDet")
if (FV.RealValue != 0) continue; // Если указано - деталь не вставлять не обновлять, то перейти к следующему


Document Adp = Frag.OpenPart();
furnTxt.WriteLine("Открыт в режиме деталировки = " + NameFrag); furnTxt.Flush();
Adp.BeginChanges("Считываем переменные");


foreach(TFlex.Model.FragmentVariableValue FV in Adp.VariableValues)
{
if (FV.Name=="$Наименование") Name = FV.TextValue;
if (FV.Name=="$Обозначение") Identif = FV.TextValue;
}

Adp.EndChanges();

// ----файл с новыми параметрами, запишем в директорию изделия.
string newName = string.Concat(Path.GetDirectoryName(doc.FileName),
"\\", Name," ",Identif.Replace("/", "_"), ".grb");
// ----обозначение детали с замененной дробью на подчеркивание. Если в обозначении встречаются дроби.

Adp.SaveAs(newName);
furnTxt.WriteLine("Деталь сохранена здесь: " + newName);
furnTxt.Flush();

Adp.Close();

NameFrag = Name + "~"+ counter.ToString(); // Имя сдеталированного фрагмента; Разделение тильдой для исключения совпадений.

foreach(TFlex.Model.FragmentVariableValue FV in Frag.VariableValues)
{
if (FV.Name=="FlagDet") FV.RealValue = 1; // Взвести флаг не вставлять / не обновлять деталь
if (FV.Name=="$NameFrag")
FV.TextValue = NameFrag; // Имя фрагмента потомка.

}

// Изменим ссылку и имя фрагмента на новые.


foreach (Fragment3D Frag in doc.Fragments3D)
{
foreach(TFlex.Model.FragmentVariableValue FV in Frag.VariableValues)
{
if (FV.Name=="$NameFrag")
if (FV.TextValue != NameFrag) continue;
Frag.Name = NameFrag;
Frag.FileName = string.Concat(Name," ",Identif.Replace("/", "_"), ".grb");
}
}


doc.EndChanges();
doc.Save();
++counter; // для вставленной новой детали изменить счетчик
}

doc.BeginChanges("Аттрибуты2");
doc.Attributes.SetIntAttribute("CounterFrag",counter);
furnTxt.WriteLine("В сборке счетчик изменен на " + counter); furnTxt.Close();

doc.EndChanges();
doc.Save();
}
//------------------------------------------------
}
}
 
PS
В 11 версии появились новые возможности макросов при деталировке.
Здесь я их не использовал. Это куски кода писанные под 9 версией.
Страницы: 1