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


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Раскрытие фрагмента в макросе, Не получается в макросе раскрыть фрагмент
 
Пытался использовать метод Explode примерно так:
Код
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();
      }
   }
}

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

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

Страницы: Пред. 1 2
Ответы
 
В общем, на данном этапе цели такие: считать в чертеже количество размеров и допусков расположения, форм и т.д. Т.е., надо считать все элементы внутри форматки, на всех страницах и фрагментах. Все, что снаружи форматки, должно игнорироваться.

Сейчас у меня получилось вот что:
Код
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);
      }
   }
}

Код формы:

Код
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();
      }
   }
}

Для простого чертежа работает и считает правильно, теперь думаю, как это применить к сборке.
 
Сергей, можно сделать проще, без вызова команды Undo, например:
Код
using System.Collections.Generic;
using TFlex.Model;
using TFlex.Model.Model2D;

namespace Test
{
    public class DimensionsCounter
    {
        static int counter;
        static readonly Document document = TFlex.Application.ActiveDocument;

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

            ProcData data = new ProcData();
            ProcessingDimensions(document, data);

            document.Diagnostics.RemoveAll();
            document.Diagnostics.Add(new DiagnosticsMessage(
                DiagnosticsMessageType.Information,
                string.Format("Количество размеров в сборке: {0}", 
                counter)));

            PrintAllDimensions(data);
        }

        private static void ProcessingDimensions(Document document, ProcData data)
        {
            foreach (var dim in document.GetDimensions())
            {
                if (dim.Page.Name == "Эскиз")
                    continue;

                if (RectanglesValidate(dim.Page.Rectangle, dim.BoundRect))
                    continue;

                data.Dimensions.Add(dim);
                counter++;
            }

            foreach (var fr in document.GetFragments())
            {
                if (fr.Page.Name == "Эскиз")
                    continue;

                if (RectanglesValidate(fr.Page.Rectangle, fr.BoundRect))
                    continue;

                var child = fr.GetFragmentDocument();
                if (child == null)
                    continue;

                data.Items.Add(fr, new ProcData());
                ProcessingDimensions(child, data.Items[fr]);
            }
        }

        private static bool RectanglesValidate(
            TFlex.Drawing.Rectangle rc1, 
            TFlex.Drawing.Rectangle rc2)
        {
            return rc1.Left   > rc2.Left || 
                   rc1.Right  < rc2.Right || 
                   rc1.Top    < rc2.Right || 
                   rc1.Bottom > rc2.Bottom;
        }

        private static void PrintAllDimensions(ProcData data)
        {
            foreach (var dim in data.Dimensions)
            {
                document.Diagnostics.Add(new DiagnosticsMessage(
                    DiagnosticsMessageType.Information,
                    string.Format("Dimension [id: {0}, page: {1}]",
                    dim.ObjectId,
                    dim.Page.Name)));
            }

            foreach (var item in data.Items)
            {
                PrintAllDimensions(item.Value);
            }
        }
    }

    public class ProcData
    {
        public ProcData()
        {
            Dimensions = new List<Dimension>();
            Items = new Dictionary<Fragment, ProcData>();
        }

        public List<Dimension> Dimensions { get; private set; }
        public Dictionary<Fragment, ProcData> Items { get; private set; }
    }
}
T-FLEX CAD 17.1.6.0
Страницы: Пред. 1 2