В общем, на данном этапе цели такие: считать в чертеже количество размеров и допусков расположения, форм и т.д. Т.е., надо считать все элементы внутри форматки, на всех страницах и фрагментах. Все, что снаружи форматки, должно игнорироваться.
Сейчас у меня получилось вот что:
[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]
Для простого чертежа работает и считает правильно, теперь думаю, как это применить к сборке.