Как обрезать вид на чертеже с помощью Inventor API?

Автор Тема: Как обрезать вид на чертеже с помощью Inventor API?  (Прочитано 9531 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн HelpForInventorAPIАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Здравствуйте, нужна помощь. Пишу программу на С#, добавил вид модели на чертеж. Теперь никак не могу найти команду для обрезки вида на чертеже. Эквивалент кнопки "Обрезка" или "Crop" на пользовательском интерфейсе. Идея - что бы программа сама обрезала вид. "DrawingCropViewCmd" тут не подходит.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Идея - что бы программа сама обрезала вид. "DrawingCropViewCmd" тут не подходит.
DrawingCropViewCmd очень даже подходит, нужно сначала выделить профиль по которому будет идти обрезка вида, а потом вызвать DrawingCropViewCmd

Код - Visual Basic [Выбрать]
  1. Sub CreateCropView()
  2.     Dim oDoc As DrawingDocument
  3.     Set oDoc = ThisApplication.ActiveDocument
  4.    
  5.     Dim oSheet As Sheet
  6.     Set oSheet = oDoc.Sheets(1)
  7.    
  8.     Dim oDrawingView As DrawingView
  9.     Set oDrawingView = oSheet.DrawingViews(1)
  10.    
  11.     Dim oSk As DrawingSketch
  12.     Set oSk = oDrawingView.Sketches.Add
  13.    
  14.     oSk.Edit
  15.     oSk.SketchCircles.AddByCenterRadius ThisApplication.TransientGeometry.CreatePoint2d(0, 0), 2
  16.     oSk.ExitEdit
  17.    
  18.     oDoc.SelectSet.Select oSk
  19.    
  20.     Dim oDef As ControlDefinition
  21.     Set oDef = ThisApplication.CommandManager.ControlDefinitions("DrawingCropViewCmd")
  22.     oDef.Execute
  23.    
  24. End Sub
  25.  

Оффлайн HelpForInventorAPIАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
mikazakov, Спасибо за отклик, по предложенному алгоритму всё работает. Но при создании чертежа в скрытом режиме обрезка не происходит. Поэтому я думал, что DrawingCropViewCmd не вариант. Есть ли какие то ещё способы указать на нужный эскиз кроме SelectSet.Select, которые выполнят обрезку вида при создании чертежа в срытом режиме? Или дело не в SelectSet.Select?

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Можно документ чертежа открыть в невидимом режиме и манипулировать им
Или же временно запретить обновление экрана через
ThisApplication.ScreenUpdating=false

А потом
ThisApplication.ScreenUpdating=true
ThisApplication.ActiveView.Update()

Оффлайн HelpForInventorAPIАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Чертеж так и планировалось создавать в невидимом режиме (false). Именно невидимом режиме при выполнении кода, приведённого вами ранее, создаётся эскиз на виде, но не происходит обрезка. Выполнение идёт дальше, при этом ни каких ошибок в этой части не возникает. В видимом режиме создания (true) всё обрезается как положено.
Цитировать
Или же временно запретить обновление экрана через
ThisApplication.ScreenUpdating=false

А потом
ThisApplication.ScreenUpdating=true
ThisApplication.ActiveView.Update()
Тоже не помогло. Использовал
Цитировать
ThisApplication.ScreenUpdating=false
до процедуры создания обрезки,
Цитировать
ThisApplication.ScreenUpdating=true
ThisApplication.ActiveView.Update()
после процедуры, но результат тот же - эскиз без обрезки вида.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Ну еще есть
Document.Update

Оффлайн HelpForInventorAPIАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Тот же результат (не работает). А если зайти с другой стороны. Это проблема у меня в коде и есть успешные прецеденты обрезки вида в скрытом режиме или этот функционал у данного метода отсутствует? И вообще это единственный способ обрезки? Help по поиску "DrawingCropViewCmd" нет результатов. Выглядит такой способ как костыль.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Тот же результат (не работает). А если зайти с другой стороны. Это проблема у меня в коде и есть успешные прецеденты обрезки вида в скрытом режиме или этот функционал у данного метода отсутствует? И вообще это единственный способ обрезки? Help по поиску "DrawingCropViewCmd" нет результатов. Выглядит такой способ как костыль.
И до конца не поняно что и где не работает. У вас какое то там хитрое воркфлоу

Оффлайн HelpForInventorAPIАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Данный упрощённый код иллюстрирует проблему, с которой я столкнулся. Ещё раз для контекста, при невидимом создании чертежа обрезка с помощью метода DrawingCropViewCmd не происходит.   ???
Код - C# [Выбрать]
  1. using Inventor;
  2. using System;
  3. using System.Runtime.InteropServices;
  4. namespace ConsoleApplication1
  5. {
  6.     class Program
  7.     {
  8.         static string path_for_part = @"D:\cube.ipt"; //путь к файлу
  9.        
  10.         [STAThread]
  11.         static void
  12.             Main(string[] args)
  13.         {
  14.             Console.WriteLine("1 - видимый режим\n0 - невидимый режим");
  15.             string choise;
  16.             choise = Console.ReadLine();
  17.             bool visibility; //режим создания
  18.             if (Convert.ToInt32(choise) == 1)
  19.             {
  20.                 visibility = true; //тут всё работает
  21.             }
  22.             else
  23.             {
  24.                 visibility = false; //тут уже нет
  25.             }
  26.            
  27.             Application InvApp = GetInventorApplication();
  28.             //Процесс создания файла детали из шаблонов по умолчанию
  29.             PartDocument oPartDoc;
  30.             PartComponentDefinition oPartCompDef;
  31.             DrawingDocument oDrawDoc;
  32.             oPartDoc = (PartDocument)InvApp.Documents.Add(DocumentTypeEnum.kPartDocumentObject,
  33.                 InvApp.FileManager.GetTemplateFile(DocumentTypeEnum.kPartDocumentObject), visibility);
  34.             oPartCompDef = oPartDoc.ComponentDefinition;
  35.             //Создаём эскиз на плоскости X-1, Y-2, Z-3
  36.             PlanarSketch oSketch;
  37.             oSketch = oPartCompDef.Sketches.Add(oPartCompDef.WorkPlanes[3]);
  38.             //Используем переходную геометрию для создания линий в эскизе
  39.             TransientGeometry transGeo;
  40.             transGeo = InvApp.TransientGeometry;
  41.             SketchPoints oSketchPoints;
  42.             //создаем контейнер для хранения точек
  43.             oSketchPoints = oSketch.SketchPoints;
  44.             SketchEntitiesEnumerator oRectangle;
  45.             //создаем прямоугольник по двум(одной) точкам и центру
  46.             oRectangle = oSketch.SketchLines.AddAsTwoPointCenteredRectangle(transGeo.CreatePoint2d(0, 0), transGeo.CreatePoint2d(5, 5));
  47.             Profile oProfile;
  48.             oProfile = oSketch.Profiles.AddForSolid();
  49.             //настраиваем параметры выдавливания
  50.             //создаем выдавливание
  51.             ExtrudeDefinition ExtrudeDef;
  52.             ExtrudeDef = oPartCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile, PartFeatureOperationEnum.kJoinOperation);
  53.             ExtrudeDef.SetDistanceExtent(10, PartFeatureExtentDirectionEnum.kPositiveExtentDirection);
  54.             ExtrudeFeature oExtrude;
  55.             //делаем выдавливание
  56.             oExtrude = oPartCompDef.Features.ExtrudeFeatures.Add(ExtrudeDef);
  57.             ReSaveFile(InvApp, oPartDoc); //сохраняем
  58.             oPartDoc.Close();
  59.             //создаём чертеж только что созданной детали
  60.             //Процесс создания файла чертежа из шаблонов по умолчанию
  61.             oDrawDoc = (DrawingDocument)InvApp.Documents.Add(DocumentTypeEnum.kDrawingDocumentObject, CreateVisible: visibility);
  62.             //Устанавливаем сслыку на лист.
  63.             Sheet oSheet;
  64.             oSheet = (Sheet)oDrawDoc.Sheets[1];
  65.             //Открываем модель (деталь, сборку) в скрытом режиме
  66.             _Document oModel = (_Document)InvApp.Documents.Open(path_for_part, false);
  67.             // Создаём точку для вставки центра вида
  68.             Point2d oDimPoint;
  69.             oDimPoint = InvApp.TransientGeometry.CreatePoint2d(oSheet.Width/ 2, oSheet.Height / 2);
  70.             //Создаём баозвый вид
  71.             DrawingView oBaseView = (DrawingView)oSheet.DrawingViews.
  72.             AddBaseView(oModel, oDimPoint, 1, ViewOrientationTypeEnum.kRightViewOrientation,
  73.             DrawingViewStyleEnum.kHiddenLineRemovedDrawingViewStyle);
  74.  
  75.             //делаем обрезку вида
  76.             DrawingSketch oSk;
  77.             oSk = oBaseView.Sketches.Add(); //создаём эскиз
  78.             oSk.Edit();
  79.             oSk.SketchCircles.AddByCenterRadius(transGeo.CreatePoint2d(0, 0), 2.5);
  80.             oSk.ExitEdit();
  81.             oDrawDoc.SelectSet.Select(oSk); //выделяем эскиз
  82.             ControlDefinition oDef;
  83.             oDef = InvApp.CommandManager.ControlDefinitions["DrawingCropViewCmd"]; //команда по обрезке
  84.             oDef.Execute();
  85.             oModel.Save();
  86.             ReSaveFile(InvApp, oDrawDoc); //сохраняем
  87.             oDrawDoc.Close();
  88.             //открываем чертеж
  89.             _ = (_Document)InvApp.Documents.Open(path_for_part.Replace(".ipt", ".idw"), true);
  90.  
  91.         }
  92.         static Application GetInventorApplication()
  93.         {
  94.             Application InvApp;
  95.             try
  96.             {
  97.                 //Попытка присоединится к загруженному в память Inventor
  98.                 InvApp = Marshal.GetActiveObject("Inventor.Application") as Application;
  99.             }
  100.             catch
  101.             {
  102.                 //Загрузка Inventor в память и присоединение к нему
  103.                 Type InvType = Type.GetTypeFromProgID("Inventor.Application");
  104.                 InvApp = Activator.CreateInstance(InvType) as Application;
  105.                 InvApp.Visible = true;
  106.             } return InvApp;
  107.         }
  108.         static void ReSaveFile(Application Inventor, PartDocument PartDoc)
  109.         {
  110.             try
  111.             {//Попытка сохранить файл впервые
  112.                 //создаем ссылку на файл
  113.                 PartDocument oTestDoc = (PartDocument)Inventor.Documents.ItemByName[path_for_part];
  114.                 //закрываем файл, если он открыт
  115.                 oTestDoc.Close(true);
  116.                 //сохраняем новый файл на место старого файла  
  117.                 PartDoc.SaveAs(path_for_part, false);
  118.             }
  119.             catch
  120.             {//Попытка сохранить файл c заменой
  121.                 PartDoc.SaveAs(path_for_part, false);
  122.             }
  123.  
  124.         }
  125.         static void ReSaveFile(Application Inventor, DrawingDocument oDrawDoc)
  126.         {
  127.             oDrawDoc.SaveAs(path_for_part.Replace(".ipt", ".idw"), false);
  128.         }
  129.     }
  130. }

Отмечено как Решение HelpForInventorAPI 24-03-2022, 21:45:15

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Похоже что в невидимом режиме фокус при выделении на эскизе не находится, поэтому команда обрезки заканчивается ничем
Вот вариант когда временно отключается обновление экрана через ScreenUpdating, чтоб не моргало, вроде работает
Код - C# [Выбрать]
  1. using Inventor;
  2. using System;
  3. using System.Runtime.InteropServices;
  4. namespace ConsoleApplication1
  5. {
  6.     class Program
  7.     {
  8.         static string path_for_part = @"D:\cube.ipt"; //путь к файлу
  9.  
  10.         [STAThread]
  11.         static void
  12.             Main(string[] args)
  13.         {
  14.             Console.WriteLine("1 - видимый режим\n0 - невидимый режим");
  15.             string choise;
  16.             choise = Console.ReadLine();
  17.             bool visibility; //режим создания
  18.             if (Convert.ToInt32(choise) == 1)
  19.             {
  20.                 visibility = true; //тут всё работает
  21.             }
  22.             else
  23.             {
  24.                 visibility = false; //тут уже нет
  25.             }
  26.    
  27.             Application InvApp = GetInventorApplication();
  28.  
  29.             if  (visibility == false) InvApp.ScreenUpdating = false;
  30.  
  31.             //Процесс создания файла детали из шаблонов по умолчанию
  32.             PartDocument oPartDoc;
  33.             PartComponentDefinition oPartCompDef;
  34.             DrawingDocument oDrawDoc;
  35.             oPartDoc = (PartDocument)InvApp.Documents.Add(DocumentTypeEnum.kPartDocumentObject,
  36.                 InvApp.FileManager.GetTemplateFile(DocumentTypeEnum.kPartDocumentObject), true);
  37.             oPartCompDef = oPartDoc.ComponentDefinition;
  38.             //Создаём эскиз на плоскости X-1, Y-2, Z-3
  39.             PlanarSketch oSketch;
  40.             oSketch = oPartCompDef.Sketches.Add(oPartCompDef.WorkPlanes[3]);
  41.             //Используем переходную геометрию для создания линий в эскизе
  42.             TransientGeometry transGeo;
  43.             transGeo = InvApp.TransientGeometry;
  44.             SketchPoints oSketchPoints;
  45.             //создаем контейнер для хранения точек
  46.             oSketchPoints = oSketch.SketchPoints;
  47.             SketchEntitiesEnumerator oRectangle;
  48.             //создаем прямоугольник по двум(одной) точкам и центру
  49.             oRectangle = oSketch.SketchLines.AddAsTwoPointCenteredRectangle(transGeo.CreatePoint2d(0, 0), transGeo.CreatePoint2d(5, 5));
  50.             Profile oProfile;
  51.             oProfile = oSketch.Profiles.AddForSolid();
  52.             //настраиваем параметры выдавливания
  53.             //создаем выдавливание
  54.             ExtrudeDefinition ExtrudeDef;
  55.             ExtrudeDef = oPartCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile, PartFeatureOperationEnum.kJoinOperation);
  56.             ExtrudeDef.SetDistanceExtent(10, PartFeatureExtentDirectionEnum.kPositiveExtentDirection);
  57.             ExtrudeFeature oExtrude;
  58.             //делаем выдавливание
  59.             oExtrude = oPartCompDef.Features.ExtrudeFeatures.Add(ExtrudeDef);
  60.             ReSaveFile(InvApp, oPartDoc); //сохраняем
  61.             oPartDoc.Close();
  62.             //создаём чертеж только что созданной детали
  63.             //Процесс создания файла чертежа из шаблонов по умолчанию
  64.             oDrawDoc = (DrawingDocument)InvApp.Documents.Add(DocumentTypeEnum.kDrawingDocumentObject, CreateVisible: true);
  65.             //Устанавливаем сслыку на лист.
  66.             Sheet oSheet;
  67.             oSheet = (Sheet)oDrawDoc.Sheets[1];
  68.             //Открываем модель (деталь, сборку) в скрытом режиме
  69.             _Document oModel = (_Document)InvApp.Documents.Open(path_for_part, false);
  70.             // Создаём точку для вставки центра вида
  71.             Point2d oDimPoint;
  72.             oDimPoint = InvApp.TransientGeometry.CreatePoint2d(oSheet.Width / 2, oSheet.Height / 2);
  73.             //Создаём баозвый вид
  74.             DrawingView oBaseView = (DrawingView)oSheet.DrawingViews.
  75.             AddBaseView(oModel, oDimPoint, 1, ViewOrientationTypeEnum.kRightViewOrientation,
  76.             DrawingViewStyleEnum.kHiddenLineRemovedDrawingViewStyle);
  77.  
  78.             //делаем обрезку вида
  79.             DrawingSketch oSk;
  80.             oSk = oBaseView.Sketches.Add(); //создаём эскиз
  81.             oSk.Edit();
  82.             oSk.SketchCircles.AddByCenterRadius(transGeo.CreatePoint2d(0, 0), 2.5);
  83.             oSk.ExitEdit();
  84.             oDrawDoc.SelectSet.Select(oSk); //выделяем эскиз
  85.  
  86.             Console.WriteLine(oDrawDoc.SelectSet.Count);
  87.  
  88.  
  89.             ControlDefinition oDef;
  90.             oDef = InvApp.CommandManager.ControlDefinitions["DrawingCropViewCmd"]; //команда по обрезке
  91.             oDef.Execute();
  92.            
  93.             oModel.Save();
  94.             ReSaveFile(InvApp, oDrawDoc); //сохраняем
  95.             oDrawDoc.Close();
  96.             //открываем чертеж
  97.             _ = (_Document)InvApp.Documents.Open(path_for_part.Replace(".ipt", ".idw"), true);
  98.             InvApp.ScreenUpdating = true;
  99.             InvApp.ActiveView.Update();
  100.         }
  101.         static Application GetInventorApplication()
  102.         {
  103.             Application InvApp;
  104.             try
  105.             {
  106.                 //Попытка присоединится к загруженному в память Inventor
  107.                 InvApp = Marshal.GetActiveObject("Inventor.Application") as Application;
  108.             }
  109.             catch
  110.             {
  111.                 //Загрузка Inventor в память и присоединение к нему
  112.                 Type InvType = Type.GetTypeFromProgID("Inventor.Application");
  113.                 InvApp = Activator.CreateInstance(InvType) as Application;
  114.                 InvApp.Visible = true;
  115.             }
  116.             return InvApp;
  117.         }
  118.         static void ReSaveFile(Application Inventor, PartDocument PartDoc)
  119.         {
  120.             try
  121.             {//Попытка сохранить файл впервые
  122.                 //создаем ссылку на файл
  123.                 PartDocument oTestDoc = (PartDocument)Inventor.Documents.ItemByName[path_for_part];
  124.                 //закрываем файл, если он открыт
  125.                 oTestDoc.Close(true);
  126.                 //сохраняем новый файл на место старого файла  
  127.                 PartDoc.SaveAs(path_for_part, false);
  128.             }
  129.             catch
  130.             {//Попытка сохранить файл c заменой
  131.                PartDoc.SaveAs(path_for_part, false);
  132.             }
  133.  
  134.         }
  135.         static void ReSaveFile(Application Inventor, DrawingDocument oDrawDoc)
  136.         {
  137.             oDrawDoc.SaveAs(path_for_part.Replace(".ipt", ".idw"), false);
  138.         }
  139.     }
  140. }
  141.  

Оффлайн HelpForInventorAPIАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Спасибо за науку! Вся кутерьма с невидимостью затевалась для повышения быстродействия программы. В принципе ваш вариант по скорости выдаёт примерно такие же результаты. Будем продолжать)) ;D

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Вся кутерьма с невидимостью затевалась для повышения быстродействия программы.
Я скажу следующее, когда будет сделан AddIn (dll-файл) вместо exe-файла, тогда программный код будет выполнятся на порядок быстрее

Оффлайн HelpForInventorAPIАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Тогда как лучше поступать? Полностью писать и отлаживать программу под отдельное приложение (exe), а потом интегрировать в инвентор или сразу писать программу как AddIn-dll? В первом варианте кажется упрощён этап отладки приложения, но не потребуется ли переписка кода при интеграции в инвентор? Под перепиской кода я подразумеваю глобальные изменения в коде.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Ну для начала надо изучить вопрос работы с AddIn, что бы заранее знать особенности и что бы потом проще было код перевести в AddIn.
Когда то я писал мануал на эту тему
https://mihakazakov.wixsite.com/inventor-api/publications
Там есть особенности из приложения (exe) нельзя картинку передать в Инвенторовскую часть, плюс при работе с событиями Инвентора приложение (exe) может подглючивать, потому как событие Инвентора запускается в отдельном потоке, а сам Инвентор однопоточный.
 AddIn тоже можно отлаживать в вижуал студи. Но у вижуал студио неудобно состояние Инвентора наблюдать, состояние Инвентора удобнее смотреть через встроенный VBA инвентора.

Оффлайн HelpForInventorAPIАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Кстати, да, спасибо за все ваши мануалы)) Очень помогли в освоении базовых понятий. По AddIn и кнопкам я мельком глянул, проникся, много думал))) Буду изучать! :D