Цитата |
---|
Алексей Шаганов пишет:
Не могли бы Вы привести функции и примерный алгоритм для выполнения данной задачи? |
Выдернул часть касающуюся деталирования деталей. Не отлаживал. Прошу прощения если пойдет косо. Здесь остался не относящийся к самой деталировке код, но для надежности работы и в случае если после отладки у пользователя возникают ошибки этот код помогает ее локализовать.
Счетчик фрагментов хранится в аттрибутах файла сборки, чтобы не повторялись имена фрагментов. Имена фрагментов присваиваются по имени детали. К сожалению качество кода упирается во время, а его нет.
Еще раз извиняюсь.
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();
}
//------------------------------------------------
}
}