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


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Задание цвета фона страницы
 
vite, большое спасибо, получилось.
Задание цвета фона страницы
 
Спасибо, конечно, но где и в каком меню это можно сделать, я как бы и сам в курсе.
Вопрос был про то, как это сделать через API. И на него я ответ в справке не нашёл. Даже воспользовавшись волшебной кнопкой F1 :idontnow:
Задание цвета фона страницы
 
Коллеги, подскажите пожалуйста, где задается цвет фона страницы документа (чертежа). В свойствах класса Page ничего такого не нашел. :idontnow:
Раскрытие фрагмента в макросе, Не получается в макросе раскрыть фрагмент
 
В общем, на данном этапе цели такие: считать в чертеже количество размеров и допусков расположения, форм и т.д. Т.е., надо считать все элементы внутри форматки, на всех страницах и фрагментах. Все, что снаружи форматки, должно игнорироваться.

Сейчас у меня получилось вот что:
[CODE]using System;
using TFlex;
using TFlex.Model;
using TFlex.Model.Model2D;
using TFlex.Model.Model3D;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace CountDimNamespace
{
public class CountDimClass
{
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(
IntPtr hWnd,
int msg,
IntPtr wParam,
IntPtr lParam);

static /*readonly*/ Document doc = TFlex.Application.ActiveDocument;

public static void Undo()
{
SendMessage(TFlex.Application.Window.Handle, 0x0111, (IntPtr)0x0000045B, IntPtr.Zero);
}
//--------------------------------------------------------подсчет размеров--------------------------------------------------------------------------

public static int CountDim(Document doc,Page page)    //считаем количество размеров
{

   int k = 0;


foreach (Dimension dim in doc.GetDimensions())
  {
if(page == null || dim.Page.Name == "Эскиз" || dim.Page != doc.ActivePage)//считаем на активной странице
continue;
               
               if (dim.Page.Left.Value > dim.BoundRect.Left || dim.Page.Right.Value < dim.BoundRect.Right ||
   dim.Page.Top.Value < dim.BoundRect.Top   || dim.Page.Bottom.Value > dim.BoundRect.Bottom)
continue;
dim.Color = 40;
k++;
  }


foreach(DrawingView dview in doc.GetDrawingViews())
{
if (dview.Page.Left.Value > dview.BoundRect.Left || dview.Page.Right.Value < dview.BoundRect.Right ||
dview.Page.Top.Value < dview.BoundRect.Top   || dview.Page.Bottom.Value > dview.BoundRect.Bottom)
continue;
  foreach (Dimension dim in doc.GetDimensions())
  {
if(page == null || dim.Page.Name == "Эскиз" || dim.Page == doc.ActivePage)//считаем на всех страницах, кроме активной
continue;
               
               if (dim.Page.Left.Value > dim.BoundRect.Left || dim.Page.Right.Value < dim.BoundRect.Right ||
   dim.Page.Top.Value < dim.BoundRect.Top   || dim.Page.Bottom.Value > dim.BoundRect.Bottom)

continue;
dim.Color = 40;
k++;
  }
}

return k;

}

//------------------------------------------------------подсчет допусков форм, расположения и т.д.----------------------------------------------------

public static int CountFlim(Document doc,Page page)    //считаем количество допусков форм, расположения и т.д.
{

int k = 0;
foreach(Formlimits flim in doc.GetFormlimits())
{
if(page == null || flim.Page.Name == "Эскиз" || flim.Page != doc.ActivePage)//считаем на активной странице
continue;
               
               if (flim.Page.Left.Value > flim.BoundRect.Left || flim.Page.Right.Value < flim.BoundRect.Right ||
   flim.Page.Top.Value < flim.BoundRect.Top   || flim.Page.Bottom.Value > flim.BoundRect.Bottom)
continue;
               
flim.Color = 80;
k++;
  }

            foreach(DrawingView dview in doc.GetDrawingViews())
{
if (dview.Page.Left.Value > dview.BoundRect.Left || dview.Page.Right.Value < dview.BoundRect.Right ||
dview.Page.Top.Value < dview.BoundRect.Top   || dview.Page.Bottom.Value > dview.BoundRect.Bottom)
continue;

 foreach (Formlimits flim in doc.GetFormlimits())
  {
if(page == null || flim.Page.Name == "Эскиз" || flim.Page == doc.ActivePage)//считаем на всех страницах, кроме активной
continue;
               
               if (flim.Page.Left.Value > flim.BoundRect.Left || flim.Page.Right.Value < flim.BoundRect.Right ||
   flim.Page.Top.Value < flim.BoundRect.Top   || flim.Page.Bottom.Value > flim.BoundRect.Bottom)

continue;
flim.Color = 80;
k++;
  }
}

return k;

}

//------------------------------------------------раскрытие фрагментов----------------------------------------------------------------------

public static void CountDimFrag(Document doc, Page page)      //считаем размеры в 2D-фрагментах
{

foreach (Fragment frag in doc.GetFragments())
{
 if (frag.Page.Left.Value > frag.BoundRect.Left || frag.Page.Right.Value < frag.BoundRect.Right ||
     frag.Page.Top.Value < frag.BoundRect.Top   || frag.Page.Bottom.Value > frag.BoundRect.Bottom)
     continue;
FragmentExplodeOptions myExplodeOptions = new FragmentExplodeOptions();
myExplodeOptions.CreateConstructions = false;
myExplodeOptions.Silent = true;
myExplodeOptions.UniteInGroup = true;
frag.Explode(myExplodeOptions);
}
}

//----------------------------------------------------подсчет количества фрагментов--------------------------------------------------------------

public static int CountFrag(Document doc, Page page)
{
int f = 0;
foreach (Fragment frag in doc.GetFragments())
{
 if (frag.Page.Left.Value > frag.BoundRect.Left || frag.Page.Right.Value < frag.BoundRect.Right ||
     frag.Page.Top.Value < frag.BoundRect.Top   || frag.Page.Bottom.Value > frag.BoundRect.Bottom)
     continue;
 f++;
}
return f;
}

//---------------------------------------------------Main------------------------------------------------------------------------------------------

public static void подсчет_размеров()
{
doc.BeginChanges("");
if(doc == null)
return;

Form1Namespace.Form1 form = new Form1Namespace.Form1();

System.Windows.Forms.Application.Run(form);
}
}
}
[/CODE]

Код формы:

[CODE]using System;
using System.Windows.Forms;
using CountDimNamespace;
using TFlex;
using TFlex.Model;
using TFlex.Model.Model2D;
using TFlex.Model.Model3D;

namespace Form1Namespace
{
 public partial class Form1
 {
  int frag = 0;

       public Form1()
       {
int dim = 0, flim = 0;
           InitializeComponent();
Document doc = TFlex.Application.ActiveDocument;

frag = CountDimClass.CountFrag(doc,doc.ActivePage);

label6.Text = Convert.ToString(frag);

doc.EndChanges();
CountDimClass.CountDimFrag(doc,doc.ActivePage);
doc.BeginChanges("");

dim = CountDimClass.CountDim(doc,doc.ActivePage);
flim = CountDimClass.CountFlim(doc,doc.ActivePage);

label2.Text = Convert.ToString(dim);
label4.Text = Convert.ToString(flim);

doc.EndChanges();
}


private void button1_Click(object sender, System.EventArgs e)
{
int i = 0;
Document doc = TFlex.Application.ActiveDocument;
doc.BeginChanges("");
for (i = 0; i < frag+1; i++)
{
CountDimClass.Undo();
}

doc.EndChanges();

Dispose();
}
}
}
[/CODE]

Для простого чертежа работает и считает правильно, теперь думаю, как это применить к сборке.
Раскрытие фрагмента в макросе, Не получается в макросе раскрыть фрагмент
 
Получилось реализовать все это дело  через раскрытие фрагментов, подсчет размеров и откат методом Undo с количеством раз по числу фрагментов.
Теперь думаю, как посчитать размеры в файлах сборки. Через 3D фрагменты не получилось, поискал в API, кроме TFlex.Application.GetDocumentExternalFileLinks (возвращает все имеющиеся в модели ссылки на внешние файлы) не нашёл.
Может быть, есть ещё какой-нибудь перечислитель деталей сборки...
Раскрытие фрагмента в макросе, Не получается в макросе раскрыть фрагмент
 
vite, компилятор теперь ругается на TFlex.Application.ActiveMainWindow, увы.

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

Склоняюсь к тому, что придется создавать копию фрагмента, раскрывать его, считать размеры и потом как-то удалять эту самую копию... Ну или у нас успеют перейти на 16-ю версию, пока я в этом буду ковыряться)).
Раскрытие фрагмента в макросе, Не получается в макросе раскрыть фрагмент
 
vite, с командой Undo получилось примерно то, что хотел, но только в 16-й версии, а для меня сейчас актуальна 15-я (а она не понимает TFlex.Application.RunSystemCommand).

Sila Musli, код работает, осталось в нем разобраться)))
Раскрытие фрагмента в макросе, Не получается в макросе раскрыть фрагмент
 
[QUOTE]Sila Musli написал:
А разрушать нужно, чтоб посчитать графику?[/QUOTE]
Да, посмотрел справку по API и не нашел там методов или свойств, чтобы обратиться к размерам фрагмента.

[QUOTE]Sila Musli написал:
Так можно просто пробежаться по всем вложенным и взять из них статистику.[/QUOTE]
А не подскажете, как это сделать? В каком направлении искать? Мне ведь надо будет еще считать размеры во всех деталях сборки, если это будет сборка...

[QUOTE]vite написал:
Сергей , для отмены или возврата операции, можно применить системную команду, например:[/QUOTE]
Спасибо, попробую.
Раскрытие фрагмента в макросе, Не получается в макросе раскрыть фрагмент
 
Для нормирования чертежа, чтобы не заниматься этим вручную
Раскрытие фрагмента в макросе, Не получается в макросе раскрыть фрагмент
 
Отлично, спасибо!
А можно ли теперь вернуть фрагмент к первоначальному, нераскрытому состоянию?))
Раскрытие фрагмента в макросе, Не получается в макросе раскрыть фрагмент
 
Работает, но мне потом надо посчитать количество размеров в фрагменте и вылезает уже "не открыт блок отмены действий".
Возможно, есть другой способ сосчитать размеры фрагмента?..
Раскрытие фрагмента в макросе, Не получается в макросе раскрыть фрагмент
 
Пытался использовать метод Explode примерно так:[CODE]using System;
using TFlex.Model;
using TFlex.Model.Model2D;
using TFlex.Model.Model3D;

namespace NewMacroNamespace
{
public class NewMacroClass
{
public static void Explode_Frag()
{
Document doc = TFlex.Application.ActiveDocument;
doc.BeginChanges("");
foreach (Fragment frag in doc.GetFragments())
{
frag.Explode(false);
}
doc.EndChanges();
}
}
}[/CODE]

Все компилируется, но при запуске макроса выскакивает ошибка "Cannot explode fragment from within undo block".

Возможно, кто-нибудь что-нибудь подскажет...

Страницы: 1