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


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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 18 След.
Печать документов через макрос, Помогите разобраться с "document.Print"
 
Дмитрий, в качестве параметра родительского окна нужно передать дескриптор главного окна приложения, например:

[CODE]
public static void Run()
{
   Document document = TFlex.Application.ActiveDocument;

   if (document == null)
       return;

   document.Print(TFlex.Application.ActiveMainWindow.Handle, true, true);
}
[/CODE]
Вопрос по API
 
[QUOTE]FRei написал:
Кстати, а как вывести что-нибудь в окошко выходные данные, для отладки?[/QUOTE]
я не пользуюсь отладчиком T-FLEX CAD, по-видимому метод TFlex.Log.Debug("")
Вопрос по API
 
FRei, ну не скромничайте, ваш уровень достаточный. вы можете легко оптимизировать модель, чтобы избавиться от дубликатов массива. т.е. нужно просто создать универсальный фрагмент, который принимает параметры на вход: символ и смещение, относительно ЛСК. а вся логика перестроения символа может быть основана на матрице из БД. вместо дубликата массива, нужно вставить фрагмент в сборку и определить параметры. в данном случае, используется единственный экземпляр многократно вставленный в сборку с различными параметрами. в качестве теста, можно сравнить производительность на большом массиве данных, скажем из 1000 символов, интересно что получится.
Вопрос по API
 
FRei, не знаю что вы хотите получить в конечном итоге. на мой взгляд, ваша модель получается слишком перегружена элементами построения. не проще использовать готовый фрагмент параметрического символа? к тому же, это даст существенный прирост производительности в процессе перестроения модели.
Вопрос по API
 
FRei, есть возможность добавить элементы в коллекцию исключений по индексу, например:
[CODE]
document.BeginChanges("");

linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(1), new Parameter(0)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(3), new Parameter(0)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(1), new Parameter(1)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(2), new Parameter(1)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(3), new Parameter(1)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(2), new Parameter(2)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(3), new Parameter(2)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(1), new Parameter(3)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(3), new Parameter(3)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(1), new Parameter(4)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(2), new Parameter(4)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(1), new Parameter(5)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(2), new Parameter(5)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(3), new Parameter(5)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(1), new Parameter(6)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(2), new Parameter(6)));
linearArray.Exclusions.Add(new Exclusion(linearArray, new Parameter(3), new Parameter(6)));

document.EndChanges();
[/CODE]
если понадобится обновить коллекцию исключений, нужно предварительно ее очистить:
[CODE]
linearArray.Exclusions.Clear();
[/CODE]
Вопрос по API
 
FRei, по поводу перебора элементов не уверен что это возможно.
пример изменения видимости объекта:

[CODE]
using TFlex.Model;
using TFlex.Model.Model3D;

namespace Test
{
   public class Class22
   {
       public static void Run()
       {
           Document document = TFlex.Application.ActiveDocument;

           if (document == null)
               return;

           foreach (ModelObject i in document.GetObjects())
           {
               if (i.GroupType == ObjectType.LinearArray && i.Name == "Линейный массив_1")
               {
                   LinearArrayOperation linearArray = i as LinearArrayOperation;

                   document.BeginChanges("");

                   linearArray.VisibleInScene = false;

                   document.EndChanges();

                   break;
               }
           }
       }
   }
}
[/CODE]
Пакетный экспорт в AutoCad, T-FLEX CAD Extension - плагин расширения стандартного интерфейса.
 
Гена C, эта сборка для версии T-FLEX CAD (15.1.68.0), но вы можете самостоятельно компилировать плагин для TF14 (нужно переопределить ссылки на TFlexAPI).
Пакетный экспорт в AutoCad, T-FLEX CAD Extension - плагин расширения стандартного интерфейса.
 
avm, чтобы плагин ( SpecCadBasicPlugin ) корректно работал в T-FLEX CAD (15.1.61.0), его нужно перекомпилировать под эту версию (см. вложение)...
Пакетный экспорт в AutoCad, T-FLEX CAD Extension - плагин расширения стандартного интерфейса.
 
avm, у меня windows 8.1, но это не столь критично. если вы используете T-FLEX CAD (15.1.61.0), должно быть делали переустановку компонентов поддержки T-FLEX CAD, в составе которой, должен быть Framework .NET 4. важно, чтобы все необходимые компоненты были установлены.
Пакетный экспорт в AutoCad, T-FLEX CAD Extension - плагин расширения стандартного интерфейса.
 
avm, на моей стороне проблем не наблюдается: ( https://www.youtube.com/watch?v=4KT99SIpXVU )
Пакетный экспорт в AutoCad, T-FLEX CAD Extension - плагин расширения стандартного интерфейса.
 
avm, попробуйте удалить плагин через меню: Настройка>Приложения..., и повторно подключить его...
Пакетный экспорт в AutoCad, T-FLEX CAD Extension - плагин расширения стандартного интерфейса.
 
avm, по-видимому я забыл обновить сборку именно для (15.1.61.0). обновите сборку, теперь должно работать...
Пакетный экспорт в AutoCad, T-FLEX CAD Extension - плагин расширения стандартного интерфейса.
 
avm, вы можете прикрепить исходные файлы?
Изменено: vite - 27.08.2018 17:11:53
Пакетный экспорт в AutoCad, T-FLEX CAD Extension - плагин расширения стандартного интерфейса.
 
avm, текущая сборка плагина компилировалась на базе API (15.1.61.0). чтобы воспроизвести ошибку, нужно описать последовательность действий и данные ввода.
Вопрос по API
 
FRei, возможно...
Вопрос по API
 
FRei, если очень нужно, могу предложить временное решение:
[CODE]
using System;
using System.Runtime.InteropServices;
using TFlex.Model;

namespace TFlex
{
   public class Factory : PluginFactory
   {
       public override Plugin CreateInstance()
       {
           return new PluginInstance(this);
       }

       public override Guid ID
       {
           get
           {
               return new Guid("{83FC6A2C-16BD-4F00-A067-7AB1038E4553}");
           }
       }

       public override string Name
       {
           get
           {
               return "T-FLEX CAD Extension";
           }
       }
   }
   
   public partial class PluginInstance : Plugin
   {
       const int GWLP_WNDPROC = (-4);
       const uint WM_KEYDOWN = 0x0100;

       [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr", CharSet = CharSet.Auto)]
       private static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex);

       [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto)]
       private static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

       [DllImport("user32.dll", EntryPoint = "CallWindowProc", CharSet = CharSet.Auto)]
       private static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);

       private delegate IntPtr WinProcDelegate(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);

       private static IntPtr handle = IntPtr.Zero;
       private static IntPtr oldWndProc = IntPtr.Zero;
       private WinProcDelegate newWndProc;
       
       private IntPtr WindowProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
       {
           if (uMsg == WM_KEYDOWN)
           {
               switch ((int)wParam)
               {
                   case 0x21: // PAGE UP
                       RotateView(45);
                       break;
                   case 0x22: // PAGE DOWN
                       RotateView(-45);
                       break;
               }
           }

           return CallWindowProc(oldWndProc, hWnd, uMsg, wParam, lParam);
       }

       private void RotateView(float angle)
       {
           Document document = TFlex.Application.ActiveDocument;
           Model.Model3D.View3D view3D = (document.ActiveView as Model.Model3D.View3D);
           Model.Model3D.View3D.Parameters p = view3D.GetParameters();
           p.AutoResize = true;
           p.CameraType = Model.Model3D.View3D.CameraType.Orthographic;
           p.Angle = (p.Angle + angle);
           view3D.SetParameters(p);
       }
     
       public PluginInstance(Factory factory) : base(factory) {}
       
       protected override void NewDocumentCreatedEventHandler(DocumentEventArgs args)
       {
           args.Document.AttachPlugin(this);
       }
       
       protected override void DocumentOpenEventHandler(DocumentEventArgs args)
       {
           args.Document.AttachPlugin(this);
       }
       
       protected override void ViewActivatedEventHandler(ViewEventArgs args)
       {
           base.ViewActivatedEventHandler(args);

           if (args.View is Model.Model3D.View3D)
           {
               if (handle == IntPtr.Zero)
               {
                   handle = args.View.HWnd;
                   newWndProc = new WinProcDelegate(WindowProc);
                   oldWndProc = GetWindowLongPtr(handle, GWLP_WNDPROC);
                   SetWindowLongPtr(handle, GWLP_WNDPROC, Marshal.GetFunctionPointerForDelegate(newWndProc));
               }
               else if (handle != args.View.HWnd)
               {
                   oldWndProc = GetWindowLongPtr(handle, GWLP_WNDPROC);
                   SetWindowLongPtr(handle, GWLP_WNDPROC, Marshal.GetFunctionPointerForDelegate(newWndProc));
               }
           }
       }

       protected override void ViewDeactivatedEventHandler(ViewEventArgs args)
       {
           base.ViewDeactivatedEventHandler(args);

           if (handle != IntPtr.Zero)
           {
               SetWindowLongPtr(handle, GWLP_WNDPROC, oldWndProc);
               newWndProc = null;
               handle = IntPtr.Zero;
           }
       }
   }
}
[/CODE]
этот код нужно компилировать в модуль расширения DLL. стандартный вариант поворота работает в режиме просмотра (клавиши: PgUp и PgDn). тоже самое я сделал для режима "эскиз".
Вопрос по API
 
FRei, вы меня не правильно поняли, нужно получить доступ к оконной процедуре главного окна приложения для обработки события [I]KeyPressEventHandler[/I], чего пока нет в API. классы [I]PluginCommand[/I] и [I]CustomCommand[/I] просто реализуют интерфейс пользовательских команд, которые внутри также имеют свои обработчики. эти классы предоставляют немного больше возможностей для расширенной обработки команд меню. т.е. сначала выполняется команда меню, потом обрабатывается контекст клавиатуры. несмотря на то, что макрос частично отрабатывает на событии [I]ViewActivated[/I], он по прежнему работает некорректно. у меня, к примеру, неправильно работает селектор. по мимо прочего, каждый клик мыши повторно запускает метод [I]Run[/I].
Вопрос по API
 
FRei, этот пример нельзя использовать в контексте события [I]ViewActivated[/I]. должен быть обработчик событий типа [I]KeyPressEventHandler[/I] на уровне класса [I]Plugin[/I].
Вопрос по API
 
FRei, самый простой способ обработки события [I]KeyEventArgs[/I] через класс расширения [I]CustomCommand[/I], например:
[CODE]
using System.Windows.Forms;
using TFlex.Command;
using TFlex.Model;

namespace Test
{
   public class UserCommand : CustomCommand
   {
       public UserCommand(CommandState cmd) : base (cmd)
       {

       }

       public override void OnKeyPressed(TFlex.Command.KeyEventArgs e)
       {
           if (e.Code == TFlex.KeyCode.keyC_B)
           {
               MessageBox.Show("Key code: Ctrl + B"); // обработка команды пользователя
           }

           base.OnKeyPressed(e); // передача управления для обработки стандартных команд приложения
       }
   }

   public class TestMacro
   {
       static readonly Document document = TFlex.Application.ActiveDocument;

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

           CommandState cmd = new CommandState();
           UserCommand userCommand = new UserCommand(cmd);
           userCommand.Run(document.ActiveView);
       }
   }
}
[/CODE]
чтобы корректно запустить макрос, нужно подключить событие [I]ViewActivated[/I] в редакторе макросов (см. вложение). Когда один из видов документа будет активным, сработает макрос [I]TestMacro[/I], который запустит цикл обработки команд пользователя.
Пакетное сохранение GRB в PDF формат
 
avm, именно так.
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 18 След.