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


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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 18 След.
Перебор страниц в документе
 
Анна, а просто переключить фокус на 2D-вид не получается, нужно обязательно закрыть активный 3D-вид?
Перебор страниц в документе
 
[QUOTE]Анна написал:
Написали в техподдержке:[/QUOTE]
а что толку, активизация 2D-вида не работает, если текущий активный вид 3D.
Получить все сборки, детали, стандартные изделия входящие в 3D модель
 
Анна, пример рекурсивной обработки документа и всех вложенных фрагментов, с последовательным выводом метаданных в файл "asm_info.log".

[CODE]
using System.IO;
using TFlex.Model;
using TFlex.Model.Model3D;
using System.Diagnostics;

namespace Test
{
   public class AsmInfo
   {
       private static readonly Document document = TFlex.Application.ActiveDocument;
       private static string path;


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

           path = document.FilePath + @"asm_info.log";

           if (File.Exists(path))
               File.Delete(path);

           MetadataOutput(document);

           if (File.Exists(path))
               Process.Start("notepad.exe", path);
       }

       private static void MetadataOutput(Document document)
       {
           int index = 0;

           foreach (var i in document.GetFragments3D())
           {
               string[] contents = {
                   "Документ:\t\t"         + document.FileName,
                   "Кол-во фрагментов:\t"  + document.GetFragments3D().Count,
                   "  Индекс фрагмента:\t" + index,
                   "  Имя файла:\t\t"      + i.FilePath,
                   "  Имя объкта:\t\t"     + i.Name,
                   "  Идентификатор:\t"    + i.ObjectId,
                   "  Полный путь:\t\t"    + i.FullFilePath,
                   "========================================================"
               };

               File.AppendAllLines(path, contents);
               index++;

               if (TFlex.Application.OpenFragmentDocument(i.FullFilePath) is Document fragment)
                   MetadataOutput(fragment);
           }
       }
   }
}
[/CODE]
Перебор страниц в документе
 
Анна, пример ниже включает вариант активизации страницы, если активный вид 3D, но метод [I]Activate[/I] почему то не работает. Если активный вид 2D, все нормально...

[CODE]
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);
           }
       }
   }
}
[/CODE]
Печать документов через макрос, Помогите разобраться с "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). тоже самое я сделал для режима "эскиз".
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 18 След.