[Inventor 2016, C#] Экспорт эскиза в файл DXF/DWG

Автор Тема: [Inventor 2016, C#] Экспорт эскиза в файл DXF/DWG  (Прочитано 7210 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Здравствуйте.
В этой теме мне посоветовали задать вопрос здесь.

В Inventor есть команда "Экспортировать эскиз как..."

Пытаюсь сделать тоже самое с помощью C#
Код - C# [Выбрать]
  1.             Inventor.Application m_inventorApp = null;
  2.             // Try to get an active instance of Inventor
  3.             try
  4.             {
  5.                 m_inventorApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application") as Inventor.Application;
  6.             }
  7.             catch (Exception ex)
  8.             {
  9.                 MessageBox.Show(ex.Message.ToString());
  10.             }
  11.  
  12.             // If not active, create a new Inventor session
  13.             if (m_inventorApp == null)
  14.             {
  15.                 Type inventorAppType = System.Type.GetTypeFromProgID("Inventor.Application");
  16.                 m_inventorApp = System.Activator.CreateInstance(inventorAppType) as Inventor.Application;
  17.             }
  18.  
  19.  
  20.  
  21.             Document doc = m_inventorApp.ActiveDocument;
  22.             if (doc != null && doc.DocumentType.Equals(DocumentTypeEnum.kPartDocumentObject))
  23.             {
  24.                 PartDocument pDoc = (PartDocument)doc;
  25.  
  26.                 //TranslatorAddIn oDWGAddIn = (TranslatorAddIn)m_inventorApp.ApplicationAddIns.get_ItemById("{C24E3AC4-122E-11D5-8E91-0010B541CD80}");// dwg
  27.                 TranslatorAddIn oDWGAddIn = (TranslatorAddIn)m_inventorApp.ApplicationAddIns.get_ItemById("{C24E3AC2-122E-11D5-8E91-0010B541CD80}");// dxf
  28.                 if (!oDWGAddIn.Activated)
  29.                 {
  30.                     oDWGAddIn.Activate();
  31.                 }
  32.  
  33.                 TranslationContext oContext = m_inventorApp.TransientObjects.CreateTranslationContext();
  34.                 oContext.Type = IOMechanismEnum.kFileBrowseIOMechanism;
  35.                 NameValueMap oOptions = m_inventorApp.TransientObjects.CreateNameValueMap();
  36.                 DataMedium oDataMedium = m_inventorApp.TransientObjects.CreateDataMedium();
  37.  
  38.  
  39.                 if (oDWGAddIn.get_HasSaveCopyAsOptions(m_inventorApp.ActiveDocument, oContext, oOptions))
  40.                 {
  41.                     string sPlugInPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
  42.                     sPlugInPath = System.IO.Path.Combine(sPlugInPath, " ").Trim();
  43.  
  44.                     string sExportFileSettings = @"C:\Users\ragman\Documents\Inventor\MyConfig2015.ini";
  45.  
  46.                     if (System.IO.File.Exists(sExportFileSettings))
  47.                     {
  48.                         oOptions.Value["Export_Acad_IniFile"] = sExportFileSettings;
  49.                     }
  50.  
  51.                 }
  52.                 oOptions.Value["Solid"] = true;
  53.  
  54.                 String sSavePath = @"D:\Sketch-true.dwg";
  55.                 oDataMedium.FileName = sSavePath;
  56.  
  57.                 if (System.IO.File.Exists(sSavePath))
  58.                 {
  59.                     System.IO.File.Delete(sSavePath);
  60.                 }
  61.  
  62.                 try
  63.                 {
  64.                     oOptions.Value["Sketch"] = true;   // Output sketches.
  65.                     oDWGAddIn.SaveCopyAs(m_inventorApp.ActiveDocument, oContext, oOptions, oDataMedium);
  66.                 }
  67.                 catch (Exception ex)
  68.                 {
  69.                     MessageBox.Show(ex.Message.ToString());
  70.                 }
  71.  
  72.  
  73.                 sSavePath = @"D:\Sketch-false.dwg";
  74.                 oDataMedium.FileName = sSavePath;
  75.  
  76.                 if (System.IO.File.Exists(sSavePath))
  77.                 {
  78.                     System.IO.File.Delete(sSavePath);
  79.                 }
  80.  
  81.                 try
  82.                 {
  83.                     oOptions.Value["Sketch"] = false;   // Output sketches.
  84.                     oDWGAddIn.SaveCopyAs(m_inventorApp.ActiveDocument, oContext, oOptions, oDataMedium);
  85.                 }
  86.                 catch (Exception ex)
  87.                 {
  88.                     MessageBox.Show(ex.Message.ToString());
  89.                 }
  90.             }
  91.  

Подать на вход команде
Код - C# [Выбрать]
  1. oDWGAddIn.SaveCopyAs(m_inventorApp.ActiveDocument, oContext, oOptions, oDataMedium);
вместо m_inventorApp.ActiveDocument Sketch не удается - получаю ошибку.


По примеру отсюда пользуюсь опцией
Код - C# [Выбрать]
  1. oOptions.Value["Sketch"] = true;
Но она только включает и выключает экспорт всех видимых эскизов в файл DWG.






А вот как выполнить экспорт конкретного эскиза как это делает Inventor?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Приветствую на форуме!
Перед тем как отправлять вопрос в ADN DevHelp, хочу уточнить Inventor 2016 со всеми обновлениями? Если нет, то предварительно установите их и проверьте снова. Все обновления здесь: https://knowledge.autodesk.com/support/inventor-products/downloads?release=2016

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Было установлено:
Inventor2016_SP1.exe
Inventor2016_SP2.exe
Inventor2016_SP2 update 1 (INV20210_x64).msp

На всякий случай установил еще и Inventor 2016.2.2 Hotfix

Приложение Autodesk для ПК показывает что у меня все обновлено


Результат тот же.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Хорошо. Отправляю в ADN DevHelp. Как только будет информация - сообщу. Думаю, что придётся подождать недельку-другую. У них сейчас Autodesk University на носу и все силы брошены на подготовку.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Спасибо. Это совершенно не срочно.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Запрос отправил. Ждём.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение ragman 15-11-2016, 15:55:11

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Получил сегодня ответ с рекомендацией проверить такой код:
Код - Visual Basic [Выбрать]
  1. Sub main()
  2.  Dim partdoc As PartDocument
  3.  Set partdoc = ThisApplication.ActiveDocument
  4.  Dim selectedsketch As Sketch
  5.  Set selectedsketch = partdoc.SelectSet(1) ' Подразумевается, что эскиз выбран.
  6. Dim oDataIO As DataIO
  7.  Set oDataIO = selectedsketch.DataIO
  8.  oDataIO.WriteDataToFile "DXF", "D:\Temp\mysketch.dxf"
  9. End Sub
Сообщи работает он или нет.

P.S.: По аналогии нашел такой пример: http://adndevblog.typepad.com/manufacturing/2012/05/exporting-flat-pattern-as-dwgdxf.html
Так что похоже и в dwg-формат можно выводить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Александр Ривилис, если скопировать приведенный код в правило iLogic, то работает.
Но когда попытался адаптировать код к C#
Код - C# [Выбрать]
  1. PartDocument pDoc = (PartDocument)m_inventorApp.ActiveDocument;
  2. Sketch selectedSketch = (Sketch)pDoc.SelectSet[1];
  3. DataIO oDataIO = selectedSketch.DataIO;
  4. oDataIO.WriteDataToFile("DXF", "D:\test.dxf"); // строка 51
то на строке с ошибкой получаю
Цитировать
System.Runtime.InteropServices.COMException не обработано
  ErrorCode=-2147467259
  Message=Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))
  Source=""
  StackTrace:
       в System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
       в Inventor.DataIO.WriteDataToFile(String Format, String FileName)
       в inventorTest.Form1.button1_Click(Object sender, EventArgs e) в C:\Users\Ragman\Documents\Visual Studio 2015\Projects\inventorTest\inventorTest\Form1.cs:строка 51
       в System.Windows.Forms.Control.OnClick(EventArgs e)
       в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       в System.Windows.Forms.Control.WndProc(Message& m)
       в System.Windows.Forms.ButtonBase.WndProc(Message& m)
       в System.Windows.Forms.Button.WndProc(Message& m)
       в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       в inventorTest.Program.Main() в C:\Users\Ragman\Documents\Visual Studio 2015\Projects\inventorTest\inventorTest\Program.cs:строка 16
       в System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       в System.Threading.ThreadHelper.ThreadStart()
  InnerException:
Эскиз в обоих случаях выбран в дереве проектирования.

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Прошу прощения. Уже сам нашел у себя ошибку
Правильный код
Код - C# [Выбрать]
  1. oDataIO.WriteDataToFile("DXF", @"D:\test.dxf"); // строка 51

Таким образом этот способ работает. Файл DXF получается.

А вот код для вывода эскиза в файл DWG.
Код - C# [Выбрать]
  1. oDataIO.WriteDataToFile("DWG", @"D:\test.dwg");

Проверить в какие форматы можно вывести объект oDataIO можно так
Код - C# [Выбрать]
  1. string[] formats = new string[100];
  2. StorageTypeEnum[] storage = new StorageTypeEnum[100];
  3. oDataIO.GetOutputFormats(ref formats, ref storage);

Для PlanarSketch formats будет содержать только два варианта: DWG и DXF.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Прошу прощения. Уже сам нашел у себя ошибку
Правильный код
Код - C# [Выбрать]
  1. oDataIO.WriteDataToFile("DXF", @"D:\test.dxf"); // строка 51

Таким образом этот способ работает. Файл DXF получается.
А dwg пробовали?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Александр Ривилис, да попробовал (см. выше).
Спасибо за помощь.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Отлично! Сообщу в ADN DevHelp, что их помощь оказалась удачной!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Обнаружилась неприятная проблема - при экспорте эскиза не выгружается геометрия точек.
Т.е. в детали из шапки есть эскиз 3, в котором есть только одна точка для сверловки отверстия.
Если попытаться сделать экспорт эскиза 3, то получаем либо пустой файл DWG, либо испорченный DXF.
Это происходит при любом методе экспорта - как через код, так и в ручную.
Кто может сказать - это баг, фича или я где-то ошибся с настройками?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Это происходит при любом методе экспорта - как через код, так и в ручную.
Кто может сказать - это баг, фича или я где-то ошибся с настройками?
Думаю, что это баг. Особенно если вручную тот же результат.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение