Как задать версию AutoCAD при экспорте DXF.

Автор Тема: Как задать версию AutoCAD при экспорте DXF.  (Прочитано 4161 раз)

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

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

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Доброго времени суток, уважаемые форумчане. Помогите пожалуйста разобраться в вопросе. Написал метод для экспорта в DXF.
Код - C# [Выбрать]
  1. internal static void ExportToDXF (PlanarSketch planarSketch, string dxfFilePath)
  2. {
  3.     Inventor.DataIO oDataIO = planarSketch.DataIO;
  4.     try
  5.     {
  6.         oDataIO.WriteDataToFile("DXF", dxfFilePath);
  7.     }
  8.     catch
  9.     {
  10.         MessageBox.Show("ExportToDXFError");
  11.     }
  12. }

 У меня все работает, экспортируется в версии, сохраненной в настройках инвентора. А на другом компьютере нет. Судя по всему, надо явно задавать версию автокада при сохранении DXF, не могу понять, как это сделать. Или может знаете, как по-другому решить проблему?
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Нагуглил где-то и пробовал вместо "DXF" аргументом подставлять "FLAT PATTERN DXF?AcadVersion=2010", выдает ошибку. Хотя судя по всему это вобще не то, так как я эскиз экспортирую, а не массив.
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
В соседней теме про Event Watcher подсмотрел. Этой штукой можно отследить нужный мне код?
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
В соседней теме про Event Watcher подсмотрел. Этой штукой можно отследить нужный мне код?
Это точно не из этой оперы, через это можно вызвать только окно для сохранения а имя придется вписывать ручками

Нагуглил где-то и пробовал вместо "DXF" аргументом подставлять "FLAT PATTERN DXF?AcadVersion=2010", выдает ошибку. Хотя судя по всему это вобще не то, так как я эскиз экспортирую, а не массив.
Похоже что это на эскиз не распространяется, но я спрошу у разработчиков как связь с ними найду.

Попробуйте заранее сохранить настройки экспорта в ini-файле как на скриншоте:



Оффлайн slavnov07

  • ADN OPEN
  • Сообщений: 11
  • Карма: 1
Всем привет, думаю тут можно глянуть там как раз ссылка на .ini файл используется https://adndevblog.typepad.com/manufacturing/2012/08/save-a-drawing-to-dwg-dxf-format-using-additional-options-in-an-ini-file.html
« Последнее редактирование: 02-03-2021, 08:34:10 от slavnov07 »

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Спасибо за помощь. Я вчера тоже пол ночи читал про что-то подобное, возникает такой вопрос:
Я осуществляю экспорт через DataIO.WriteDataToFile(), во всех примерах на экспорт используется AddIn для экспорта DXF. Причем и тут и там это применяют для детали из листового материала, тогда как я хочу сохранить эскиз. Вот собственно сам вопрос:
1. можно ли каким-то образом использовать настройку, сохраненную в файл ***.ini при использовании DataIO.WriteDataToFile()?
2. если нет, то каким образом прикрутить DWGAddIn.SaveCopyAs() для задачи с эскизом. Там второму аргументу (TranslationContext) нужно задавать тип enum IOMechanismEnum, и не понятно, какой именно выбирать, описание в мануале отсутствует.
В программировании я новичок...но ненадолго! ;)

Оффлайн slavnov07

  • ADN OPEN
  • Сообщений: 11
  • Карма: 1
тот же код есть и в справке API:

Код - vb.net [Выбрать]
  1. Public Sub PublishDWG()
  2.     ' Get the DWG translator Add-In.
  3.     Dim DWGAddIn As TranslatorAddIn
  4.     Set DWGAddIn = ThisApplication.ApplicationAddIns.ItemById("{C24E3AC2-122E-11D5-8E91-0010B541CD80}")
  5.  
  6.     'Set a reference to the active document (the document to be published).
  7.     Dim oDocument As Document
  8.     Set oDocument = ThisApplication.ActiveDocument
  9.  
  10.     Dim oContext As TranslationContext
  11.     Set oContext = ThisApplication.TransientObjects.CreateTranslationContext
  12.     oContext.Type = kFileBrowseIOMechanism
  13.  
  14.     ' Create a NameValueMap object
  15.     Dim oOptions As NameValueMap
  16.     Set oOptions = ThisApplication.TransientObjects.CreateNameValueMap
  17.  
  18.     ' Create a DataMedium object
  19.     Dim oDataMedium As DataMedium
  20.     Set oDataMedium = ThisApplication.TransientObjects.CreateDataMedium
  21.  
  22.     ' Check whether the translator has 'SaveCopyAs' options
  23.     If DWGAddIn.HasSaveCopyAsOptions(oDocument, oContext, oOptions) Then
  24.  
  25.         Dim strIniFile As String
  26.         strIniFile = "C:\tempDWGOut.ini"
  27.         ' Create the name-value that specifies the ini file to use.
  28.         oOptions.Value("Export_Acad_IniFile") = strIniFile
  29.     End If
  30.  
  31.     'Set the destination file name
  32.     oDataMedium.FileName = "c:\tempdwgout.dwg"
  33.  
  34.     'Publish document.
  35.     Call DWGAddIn.SaveCopyAs(oDocument, oContext, oOptions, oDataMedium)
  36. End Sub

и описание IOMechanismEnum Enumerator  тоже:
kDataDropIOMechanism 13058 A data drop IO operation.
kFileBrowseIOMechanism 13059 A file browse IO operation.
kPasteSpecialIOMechanism 13060 A paste special IO operation.
kUnspecifiedIOMechanism 13057 An unspecified IO operation

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Да,я читал, спасибо. Тока они ActiveDocument аргументом отправляют в метод SaveCopyAs(). Я как раз пытаюсь понять, как мне туда эскиз залепить.
В программировании я новичок...но ненадолго! ;)

Оффлайн slavnov07

  • ADN OPEN
  • Сообщений: 11
  • Карма: 1
попробуй для начала вручную без кода создай любой эскиз например круг/прямоугольник и попробуй выгрузи в dxf, открой dxf и посмотри что получится, если все ОК и эскиз на месте, значит и кодом должно сработать, это же пространство модели тут вроде как нет понятия выгрузить только эскиз, можно выгрузить модель в которой он будет. т.е. они как раз всю модель как active doc и выгружают

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Код, который я привел вначале - рабочий. Из эскиза можно выгружать и руками и программно. Проблема в том, что руками выбирать версию дает, а как сделать это программно - вопрос.
В программировании я новичок...но ненадолго! ;)

Оффлайн slavnov07

  • ADN OPEN
  • Сообщений: 11
  • Карма: 1
так там ini файл этот как раз используется, сохрани конфиг под какую тебе надо версию и выгружай себе =) версия как раз в нем хранится, вторая строчка ini:
[EXPORT SELECT OPTIONS]
AUTOCAD VERSION=AutoCAD 2007
CREATE AUTOCAD MECHANICAL=No
USE TRANSMITTAL=No
USE CUSTOMIZE=No

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
В общем вот такой код написал:
Код - C# [Выбрать]
  1. internal static void ExportToDXF (PlanarSketch planarSketch)
  2.     {
  3.         Inventor.Application oApp = (Inventor.Application) planarSketch.Application;
  4.         TranslatorAddIn DXFAddIn;
  5.         DXFAddIn = (TranslatorAddIn) oApp.ApplicationAddIns.ItemById["{C24E3AC4-122E-11D5-8E91-0010B541CD80}"];
  6.  
  7.         Inventor.TransientObjects oTO = oApp.TransientObjects;
  8.  
  9.         Inventor.TranslationContext oContext = oTO.CreateTranslationContext();
  10.         oContext.Type = IOMechanismEnum.kFileBrowseIOMechanism;
  11.         //oContext.Type = IOMechanismEnum.kDataDropIOMechanism;
  12.         //oContext.Type = IOMechanismEnum.kPasteSpecialIOMechanism;
  13.         //oContext.Type = IOMechanismEnum.kUnspecifiedIOMechanism;
  14.  
  15.         Inventor.DataMedium oDataMedium = oTO.CreateDataMedium();
  16.         Inventor.NameValueMap oOptions = oTO.CreateNameValueMap();
  17.  
  18.         // тут выдает ошибку
  19.         if (DXFAddIn.HasSaveCopyAsOptions[planarSketch, oContext, oOptions])
  20.         {
  21.             Debug.WriteLine("True");
  22.         }
  23.  
  24.         string optionPath = @"C:\Users\Public\Documents\Autodesk\Inventor 2020\Design Data\DWG - DXF\exportdxfParams.ini";
  25.         string dxfFilePath = @"D:\AddInDFX.dxf";
  26.         oOptions.Value["Export_Acad_IniFile"] = optionPath;
  27.         oDataMedium.FileName = dxfFilePath;
  28.         DXFAddIn.SaveCopyAs(planarSketch, oContext, oOptions, oDataMedium);
  29.     }

Выдает ошибку еще на свойстве DXFAddIn.HasSaveCopyAsOptions[]. Пробовал в oContext.Type подставлят все возможные значения. Складывается впечатление, что не работает этот код с эскизами и что надо использовать метод oDataIO.WriteDataToFile(). Но тогда вопрос, где хранится настройка, которая определяет, в какую версию экспортируется файл. Может это зависит от программы, который на компе ассоциируется с автокадовскими файлами? Просто у меня стоит нанокад, и файлы открываются. А у человека стоит 2017 автокад, и файлы не открываются, как если бы я руками сохранил их в 2018 версию. Может ли быть, что инвентор обращается, например к нанокаду, тот дает инфу, что максимально поздняя версия, которая открывается - 2010, и инвентор ее берет как версию для экспорта эскиза? А типо в автокаде не предусмотрено возвращать ограничение, и инвентор использует свои настройки по умолчанию?
В программировании я новичок...но ненадолго! ;)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
if (DXFAddIn.HasSaveCopyAsOptions[planarSketch, oContext, oOptions])
Квадратные скобки???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Да. Как я понял,  это считается свойством, но получается по индексу. Хотя не уверен, что правильно сформулировал )) Ну с круглыми скобками он ругается, что это не метод. Если то же самое делать с деталью, то ошибки нет и в dxf экспортируется.
В программировании я новичок...но ненадолго! ;)

Оффлайн slavnov07

  • ADN OPEN
  • Сообщений: 11
  • Карма: 1
правильно ругается, по примеру ему active document нужен, а ты ему planarSketch передаешь, это то о чём я выше писал, ему нужна ссылка на сборку/деталь как на документ, а не ссылка на эскиз

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
правильно ругается, по примеру ему active document нужен, а ты ему planarSketch передаешь
В этом и смысл данной темы )) мне не нужно экспортировать документ, мне нужно экспортировать эскиз.
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Я тут понял, что накосячил, что dxf с детали создается, но не открывается )) но если документом подставить чертеж, то все ок. Я к тому, что код рабочий, но на эскизе выдает ошибки, видно он только под экспорт документов написан.
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 23-03-2021, 20:49:03

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
В общем я не придумал ничего умнее, чем запихнуть эскиз в чертеж, а потом загнать его в DXF. Хотя конечно это дичь полная, потому как oDataIO.WriteDataToFile() на некоторых компьютерах сохраняет в старую версию автокада, а на некоторых в соответствующую текущей версии инвентора, а значит где-то должна быть прописана данная настройка ((( У меня на компьютере, так вобще, целый месяц сохранял в старую, а потом в один момент перестал, ну в смысле начал сохранять в новой версии, что я не смог их открывать нормально старым автокадом ))

Извиняюсь, хотел кодом поделиться, потом понял, что могут придраться заказчики насчет "авторских прав".
В программировании я новичок...но ненадолго! ;)