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


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
Перебор страниц в документе
 
Здравствуйте! В документе есть несколько страниц (Страница1, Страница2, Спецификация), Страница1 активная. Подскажите пожалуйста, как макросом можно перебрать все страницы документа и сделать Страницу2 активной, выполнить определенные действия, сделать Срецификацию активной, выполнить определенный действия и вернуться к Странице1?
 
Анна, пример ниже включает вариант активизации страницы, если активный вид 3D, но метод Activate почему то не работает. Если активный вид 2D, все нормально...

Код
using TFlex.Model;
using TFlex.Model.Model2D;
using System.Windows.Forms;

namespace Test
{
    public class TestMacro
    {
        public static void Run()
        {
            Document document = TFlex.Application.ActiveDocument;
            Page activePage = null;

            if (document == null)
                return;

            foreach (var i in document.GetPages())
            {
                if (document.ActivePage == null)
                {
                    activePage = i; // если нет активной страницы, сохраняем первую страницу из коллекции

                    foreach (var v in document.Views)
                    {
                        if (v is View2D)
                        {
                            v.Activate(); // что-то случилось с методом Activate...
                            break;
                        }
                    }
                }
                else if (activePage == null)
                    activePage = document.ActivePage; // в противном случае, сохраняем активную страницу

                switch (i.PageType) // определение типа страницы
                {
                    case PageType.Normal: // Обычная
                        if (document.ActiveView is View2D)
                        {
                            document.ActiveView.Page = i; // активизируем страницу
                            MessageBox.Show(i.Name);
                        }
                        break;
                    case PageType.BillOfMaterials: // Спецификация
                        if (document.ActiveView is View2D)
                        {
                            document.ActiveView.Page = i; // активизируем спецификацию
                            MessageBox.Show(i.Name);
                        }
                        break;
                }
            }

            if (document.ActivePage != null && activePage != null)
            {
                // активизируем ранее сохраненную страницу
                document.ActiveView.Page = activePage;
                MessageBox.Show(activePage.Name);
            }
        }
    }
}
T-FLEX CAD 16.0.56.0
 
vite, спасибо большое! Все работает!

Единственно заменила
Код
switch (g.PageType) // определение типа страницы
на
Код
PageType p_type = g.PageType;
switch (p_type) // определение типа страницы
так как C# ругался на тип "g.PageType".
 
Написали в техподдержке:
Код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using TFlex.Model;
using TFlex.Model.Model2D;
using TFlex.Model.Model3D;

namespace NewMacroNamespace
{
   public class NewMacroClass
   {
      private static readonly string changeName = "Работа со страницами документа";
        private static readonly string page1Name = "Страница 1";
        private static readonly string page2Name = "Страница 2";
        private static readonly string specPageName = "Спецификация";
      private static readonly string pageNotFoundMsg = "Не найдена страница: ";
        private static readonly string viewNotFoundMsg = "Не найден 2D вид";

        public static void Run()
        {
            Document document = TFlex.Application.ActiveDocument;
            if (document == null)
                return;
            try
            {
                document.BeginChanges(changeName);
                RunPageOperations(document);
                document.EndChanges();
            }
            catch (Exception msg)
            {
                MessageBox.Show(msg.ToString());
            }
        }

        private static void RunPageOperations(Document document)
        {
            View2D view2D = GetView2D(document);
            if (view2D != null)
            {
                //работа со страницей 2
                Page page2 = GetPageByName(document, page2Name);
                if (page2 != null)
                {
                    SetActivePage(document, view2D, page2);

                    //действия со страницей2
                    //...
                }
            else
                {
                    MessageBox.Show(string.Format(pageNotFoundMsg + page2Name));
                }

                //работа со страницей спецификация
                Page specificationPage = GetPageByName(document, specPageName);
                if (specificationPage != null)
                {
                    SetActivePage(document, view2D, specificationPage);

                    //действия со страницей2
                    //...
                }
            else
                {
                    MessageBox.Show(string.Format(pageNotFoundMsg + specPageName));
                }

                //возврат к исходной странице 
                Page page1 = GetPageByName(document, page1Name);
                if (page1 != null)
                {
                    SetActivePage(document, view2D, page1);
                }
            else
                {
                    MessageBox.Show(string.Format(pageNotFoundMsg + page1Name));
                }
            }
            else
            {
                MessageBox.Show(viewNotFoundMsg);
            }
        }   

      private static void SetActivePage(Document document, View2D view2D, Page page2)
        {
            view2D.Page = page2;
            document.Activate();
            view2D.Activate();
            //document.Save();
        }

        private static View2D GetView2D(Document document)
        {
            View2D view2D = document.ActiveView as View2D;
            if (view2D == null)
                view2D = document.Views.Select(v => v as View2D).Where(v => v != null).FirstOrDefault();
            if (view2D == null)
                view2D = document.Open2DView() as View2D;
            if (view2D == null)
                return null;
            return view2D;
        }

        private static Page GetPageByName(Document sourceDocument, string receivePageName)
        {
            return sourceDocument.GetPages().Where(page => page.Name == receivePageName).FirstOrDefault();
        }
   }
}
 
Цитата
Анна написал:
Написали в техподдержке:
а что толку, активизация 2D-вида не работает, если текущий активный вид 3D.
T-FLEX CAD 16.0.56.0
 
Ответили с техподдержки:
Код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using TFlex.Model;
using TFlex.Model.Model2D;
using TFlex.Model.Model3D;

namespace NewMacroNamespace
{
   public class NewMacroClass
   {
      private static readonly string changeName = "Активировать 2D вид";

      public static void Run()
        {
            Document document = TFlex.Application.ActiveDocument;
            if (document == null)
                return;
            try
            {
                document.BeginChanges(changeName);
                Activate2DView(document);
                document.EndChanges();
            }
            catch (Exception msg)
            {
                MessageBox.Show(msg.ToString());
            }
        }

        public static void Activate2DView(Document document)
        {
            View2D view2D = document.ActiveView as View2D;
            if (view2D == null)
                view2D = document.Views.Select(v => v as View2D).Where(v => v != null).FirstOrDefault();
            if (view2D == null)
                view2D = document.Open2DView() as View2D;
            if (view2D == null)
            return;
         //закрыть 3D вид(отображается только 2D вид)
          Close3DView(document);

            document.Activate();
            view2D.Activate();
            document.Save();
        }
      
      private static void Close3DView(Document document)
        {
            var views3D = document.Views.Select(v => v as View3D).Where(v => v != null);
            if (views3D != null)
            {
                foreach (var view3D in views3D)
                {
                    view3D.Close();
                }
            }
        }   
   }
}
 
Анна, а просто переключить фокус на 2D-вид не получается, нужно обязательно закрыть активный 3D-вид?
T-FLEX CAD 16.0.56.0
Страницы: 1