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


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 След.
Раскрытие фрагмента в макросе, Не получается в макросе раскрыть фрагмент
 
Пытался использовать метод 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".

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

 
Код
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;
         foreach (Fragment frag in doc.GetFragments())
         {
         FragmentExplodeOptions myExplodeOptions = new FragmentExplodeOptions();
         myExplodeOptions.CreateConstructions = false;
         myExplodeOptions.Silent = true;
         myExplodeOptions.UniteInGroup = true;
         frag.Explode(myExplodeOptions);
         }
      }
   }
}
 
Работает, но мне потом надо посчитать количество размеров в фрагменте и вылезает уже "не открыт блок отмены действий".
Возможно, есть другой способ сосчитать размеры фрагмента?..
 
Цитата
Сергей написал:
Работает, но мне потом надо посчитать количество размеров в фрагменте и вылезает уже "не открыт блок отмены действий".
Возможно, есть другой способ сосчитать размеры фрагмента?..
Считайте потом, что хотите)
Код
using System.Windows.Forms;
using TFlex.Model;
using TFlex.Model.Model2D;

namespace NewMacroNamespace
{
    public class NewMacroClass
    {
        public static void Explode_Frag()
        {
            Document doc = TFlex.Application.ActiveDocument;
            foreach (Fragment frag in doc.GetFragments())
            {
                FragmentExplodeOptions myExplodeOptions = new FragmentExplodeOptions();
                myExplodeOptions.CreateConstructions = false;
                myExplodeOptions.Silent = true;
                myExplodeOptions.UniteInGroup = true;
                frag.Explode(myExplodeOptions);
            }
                doc.BeginChanges("Подсчёт размеров");
                string dimensions = doc.GetDimensions().Count.ToString();
                MessageBox.Show("Размеров во фрагменте = " + dimensions, "Информация");
                doc.CancelChanges();
        }
    }
}
Изменено: Sila Musli - 15.06.2020 22:53:24
 
Отлично, спасибо!
А можно ли теперь вернуть фрагмент к первоначальному, нераскрытому состоянию?))
 
Цитата
Сергей написал:
Отлично, спасибо!
А можно ли теперь вернуть фрагмент к первоначальному, нераскрытому состоянию?))
Тогда, нужно сделать копию фрагмента, оригинал скрыть, разрушать копию. Вопрос - зачем всё это?
 
Для нормирования чертежа, чтобы не заниматься этим вручную
 
Цитата
Сергей написал:
Для нормирования чертежа, чтобы не заниматься этим вручную
А разрушать нужно, чтоб посчитать графику?

Так можно просто пробежаться по всем вложенным и взять из них статистику.
 
Сергей, для отмены или повтора операции, можно применить системную команду, например:
Код
#define TF16

using System;
using System.Runtime.InteropServices;
using TFlex.Model;
using TFlex.Model.Model2D;

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

        static readonly Document document = TFlex.Application.ActiveDocument;

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

            bool hasSelected = false;
            
            foreach (var obj in document.Selection.GetAllObjects())
            {
                if (!obj.IsKindOf(ObjectType.Fragment))
                    continue;

                var fragment = obj as Fragment;
                if (!Explode(fragment))
                    continue;

                hasSelected = true;
            }

            if (!hasSelected)
            {
                document.Diagnostics.Add(new DiagnosticsMessage
                    (DiagnosticsMessageType.Information, 
                    "Необходимо выбрать фрагмент!"));
            }
        }

        private static bool Explode(Fragment fragment)
        {
            var opt = new FragmentExplodeOptions
            {
                CreateConstructions = true,
                Silent = true,
                UniteInGroup = true
            };

            var path = fragment.FullFilePath;

            if (fragment.Explode(opt))
            {
                document.Diagnostics.Add(new DiagnosticsMessage
                    (DiagnosticsMessageType.Information, string.Format
                    ("Раскрытие фрагмента: {0}", path)));
                return true;
            }

            return false;
        }

        public static void Undo()
        {
            if (document == null)
                return;
#if TF16
            TFlex.Application.RunSystemCommand("Undo", null, null);
#else
            SendMessage(TFlex.Application.ActiveMainWindow.Handle, 0x0111, 
                (IntPtr)0x0000045B, IntPtr.Zero);
#endif
            document.Diagnostics.Add(new DiagnosticsMessage
                (DiagnosticsMessageType.Information, "Отмена последней операции"));
        }

        public static void Redo()
        {
            if (document == null)
                return;
#if TF16
            TFlex.Application.RunSystemCommand("Redo", null, null);
#else
            SendMessage(TFlex.Application.ActiveMainWindow.Handle, 0x0111,
                (IntPtr)0x0000045D, IntPtr.Zero);
#endif
            document.Diagnostics.Add(new DiagnosticsMessage
                (DiagnosticsMessageType.Information, "Повтор последней операции"));
        }
    }
}
Изменено: vite - 18.06.2020 06:21:17
T-FLEX CAD 17.1.6.0
 
Цитата
Sila Musli написал:
А разрушать нужно, чтоб посчитать графику?
Да, посмотрел справку по API и не нашел там методов или свойств, чтобы обратиться к размерам фрагмента.

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

Цитата
vite написал:
Сергей , для отмены или возврата операции, можно применить системную команду, например:
Спасибо, попробую.
 
Цитата
Сергей написал:
А не подскажете, как это сделать?
Ну рекурсивно пробежаться по всему проекту, да поспрашивать у фрагментов количество размеров.
Код
using System.Windows.Forms;
using TFlex.Model;
using TFlex.Model.Model2D;

namespace Dimensions
{
    public class Program
    {
        public static void Main()
        {

            Document document = TFlex.Application.ActiveDocument;
            int counter = document.GetDimensions().Count;
            MessageBox.Show("Всего размеров в проекте = " + Foo(document, counter), "Заголовок");
        }
        static int Foo(Document document, int counter) 
        {
            if (document == null)
            {
                return counter;
            }
            else
            {
                foreach (Fragment fragment in document.GetFragments())
                {
                    Document documentDoc = fragment.GetFragmentDocument();
                    if (documentDoc == null)
                    {
                        return counter;
                    }
                    else
                    {
                        counter = Foo(documentDoc, counter + documentDoc.GetDimensions().Count);
                    }
                }
                return counter;
            }
        }
    }
}

Проверьте, я только учусь API и C#, так что не уверен в работоспособности кода)
 
vite, с командой Undo получилось примерно то, что хотел, но только в 16-й версии, а для меня сейчас актуальна 15-я (а она не понимает TFlex.Application.RunSystemCommand).

Sila Musli, код работает, осталось в нем разобраться)))
 
Цитата
Сергей написал:
код работает, осталось в нем разобраться)))
Я не уверен, но мне кажется нужно пропускать повторяющиеся фрагменты при учёте, т.к. фрагменты могут быть вставлены n-раз.
 
Сергей, см. исправление выше ( #9 )
чтобы макрос работал в T-FLEX 15 версии, закомментируйте первую строку
Код
//#define TF16
T-FLEX CAD 17.1.6.0
 
vite, компилятор теперь ругается на TFlex.Application.ActiveMainWindow, увы.

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

Склоняюсь к тому, что придется создавать копию фрагмента, раскрывать его, считать размеры и потом как-то удалять эту самую копию... Ну или у нас успеют перейти на 16-ю версию, пока я в этом буду ковыряться)).
 
Цитата
Сергей написал:
похоже, способ с перебором размеров фрагментов не подойдет, потому что так считаются все размеры фрагмента, а нужны только те, которые видно на чертеже.
Никто не мешает посчитать только те что на страницах, в ТЗ про эти нюансы не было ни слова) Просто добавить условие - считать только на 2д страницах с типом "Обычная".
 
Цитата
Сергей написал:
компилятор теперь ругается на TFlex.Application.ActiveMainWindow
по видимому, в T-FLEX CAD 15 нужно использовать свойство TFlex.Application.Window (в T-FLEX CAD 16 оно помечено как устаревшее).
T-FLEX CAD 17.1.6.0
 
Получилось реализовать все это дело через раскрытие фрагментов, подсчет размеров и откат методом Undo с количеством раз по числу фрагментов.
Теперь думаю, как посчитать размеры в файлах сборки. Через 3D фрагменты не получилось, поискал в API, кроме TFlex.Application.GetDocumentExternalFileLinks (возвращает все имеющиеся в модели ссылки на внешние файлы) не нашёл.
Может быть, есть ещё какой-нибудь перечислитель деталей сборки...
 
Цитата
Сергей написал:
Получилось реализовать все это дело через раскрытие фрагментов, подсчет размеров и откат методом Undo с количеством раз по числу фрагментов.
Теперь думаю, как посчитать размеры в файлах сборки. Через 3D фрагменты не получилось, поискал в API, кроме TFlex.Application.GetDocumentExternalFileLinks (возвращает все имеющиеся в модели ссылки на внешние файлы) не нашёл.
Может быть, есть ещё какой-нибудь перечислитель деталей сборки...
Я всё уже выкладывал. Пока не ясно, зачем так мудрить и что не получается.
 
Цитата
Сергей написал:
Через 3D фрагменты не получилось
вы можете сохранить кол-во размеров в переменную.
Код
document.GetDimensions().Count
считать каждое значение переменной в каждом фрагменте.
https://www.tflex.ru/forum/index.php?PAGE_NAME=message&FID=10&TID=3706&TITLE...
просуммировать.
Цитата
Сергей написал:
посчитать количество размеров в фрагменте
размеры которые в 2Д или 3Д?
по всем спискам объектов нужно будет пройтись. ИМХО, 2Д размеры лежат на 2Д страницах, 3Д соответственно на РП.

Хотя еще есть какая то статистика
но она врет
Изменено: FRei - 03.07.2020 17:34:27
Страницы: 1 2 След.