Автоматическая выгрузка dxf из твердых тел детали

Автор Тема: Автоматическая выгрузка dxf из твердых тел детали  (Прочитано 15014 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 33
  • Карма: 0
Добрый день!
Возник насущный вопрос! Возможно ли в APi в автоматической режиме выгружать дхф в деталях содержащий несколько "твердых тел"?
Стандартно, инвентор просит создать из твердых тел отдельные детали и уже потом с них выгружать развертки, хотелось бы узнать, возможно ли выгрузка сразу разверток сразу из детали?


Оффлайн mikazakov

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

Если шибко охота, можно попытаться делать это через создание однотельных производных деталей в скрытом режиме. потом эти файлы удалять.

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

  • ADN OPEN
  • Сообщений: 33
  • Карма: 0
Если нет другого решения, то не могли бы подсказать, как программно создать из списка твердых тел "однотелые производные детали"?

Отмечено как Решение Александр Ривилис 24-01-2022, 16:24:17

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
как программно создать из списка твердых тел "однотелые производные детали"?
Как то так. Вызвать макрос при отдельно открытой многотельной листовой детали и наслаждаться.

Код - Visual Basic [Выбрать]
  1. Option Explicit
  2.  
  3. Sub SaveUnfoldSolidsToDXF()
  4. Dim pd As PartDocument: Set pd = ThisApplication.ActiveDocument
  5.  
  6. If pd.ComponentDefinition.Type <> kSheetMetalComponentDefinitionObject Then
  7. MsgBox ("Нужна листовая деталь.")
  8. Exit Sub
  9. End If
  10.  
  11. If pd.ComponentDefinition.SurfaceBodies.Count < 2 Then
  12. MsgBox ("Нужна многотельная деталь.")
  13. Exit Sub
  14. End If
  15.  
  16.  
  17. 'Перебор по количеству солидов
  18. Dim i As Integer
  19. For i = 1 To pd.ComponentDefinition.SurfaceBodies.Count
  20. 'Создать производную деталь невидимую для пользователя
  21. Dim derivePart As PartDocument: Set derivePart = ThisApplication.Documents.Add(kPartDocumentObject, ThisApplication.FileManager.GetTemplateFile(kPartDocumentObject), false)  '!!!!
  22.  
  23. 'Подготовка к созданию производного компонента
  24. Dim dpc As DerivedPartUniformScaleDef
  25. Set dpc = derivePart.ComponentDefinition.ReferenceComponents.DerivedPartComponents.CreateUniformScaleDef(pd.fullFileName)
  26.  
  27. Dim j As Integer
  28.  
  29. 'Выделить текущий солид
  30. For j = 1 To pd.ComponentDefinition.SurfaceBodies.Count
  31. If i <> j Then dpc.Solids.Item(i).IncludeEntity = False
  32. Next
  33.  
  34. ' Создать производный компонент
  35. Call derivePart.ComponentDefinition.ReferenceComponents.DerivedPartComponents.Add(dpc)
  36.  
  37. 'конвертировать производную деталь в листовой материал Document.SubType to Sheetmetal
  38. derivePart.SubType = "{9C464203-9BAE-11D3-8BAD-0060B0CE6BB4}"
  39.  
  40. Dim sheetCompDef As SheetMetalComponentDefinition: Set sheetCompDef = derivePart.ComponentDefinition
  41. Dim baseSheetCompDef As SheetMetalComponentDefinition: Set baseSheetCompDef = pd.ComponentDefinition
  42.  
  43.  'Разрешить изменение толщины листовой детали
  44.    sheetCompDef.UseSheetMetalStyleThickness = False
  45.  
  46. ' Изменение толщины
  47.    Dim oThicknessParam As Parameter
  48.     Set oThicknessParam = sheetCompDef.Thickness
  49.   oThicknessParam.Value = baseSheetCompDef.Thickness.Value
  50.  
  51. 'Создание развертки
  52. Call sheetCompDef.Unfold
  53. 'Сохранить в DXF
  54.  ' Get the DataIO object.
  55.    Dim oDataIO As DataIO
  56.     Set oDataIO = derivePart.ComponentDefinition.DataIO
  57.  
  58.     ' Build the string that defines the format of the DXF file.
  59.    Dim sOut As String
  60.     sOut = "FLAT PATTERN DXF?AcadVersion=R12&OuterProfileLayer=Outer"
  61.  
  62.     ' Create the DXF file.
  63.    oDataIO.WriteDataToFile sOut, pd.File.fullFileName & "-" & CStr(i) & ".dxf"
  64.  
  65. 'Закрыть производную деталь без сохранения
  66. derivePart.Close (True)
  67.  
  68. Next
  69.  
  70. End Sub
  71.  

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Здравствуйте. Заранее извиняюсь за комментарии к посту пятилетней давности.
При выгрузке dxf(используя правило) получаются ровно в 10 раз меньше своего исходного размера, т.е. развертка детали в инвенторе 500х500, на чертеже dxf 50x50.
При выгрузке "руками" - всё в порядке.
Предположу, что dxf выгружается по определённому шаблону, но где искать - не знаю. В папке с шаблонами чертежей, деталей и пр. его нет.
Подскажите, куда копать?
Если долго мучиться - что-нибудь получится.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
При выгрузке dxf(используя правило) получаются ровно в 10 раз меньше своего исходного размера, т.е. развертка детали в инвенторе 500х500, на чертеже dxf 50x50.
Такое чувство, что разные единицы измерения (миллиметры и сантиметры).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Была такая мысль, проверял. Везде указаны мм, по умолчанию.
Если долго мучиться - что-нибудь получится.

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

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

Оффлайн mikazakov

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

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
если что то настройки находятся
C:\Users\Public\Documents\Autodesk\Inventor 2022\Design Data\DWG-DXF

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Так вот сразу и не скажешь, а какой функцией экспорт делается?
Обычно выгружаю так:

Код - Visual Basic [Выбрать]
  1. fname = ThisDoc.Document.FullFileName.Remove(ThisDoc.Document.FullFileName.LastIndexOf("\")) & "\" & iProperties.Value("Project", "Part Number")  & " " & iProperties.Value("Project","Description") & ".dxf"
  2. oDataIO = ThisDoc.Document.ComponentDefinition.DataIO
  3. sOut = "FLAT PATTERN DWG?AcadVersion=2000&INTERIORPROFILESLayer=0&OUTERPROFILELayer=0&FEATUREPROFILESLayer=0&InvisibleLayers=IV_UNCONSUMEND_SKETCHES­;IV_ALTREP​_BACK;IV_ALTREP_FRONT;IV_ARC_CENTERS;IV_TOOL_CENTE​R_DOWN;IV_TOOL_CENTER;IV_ARC_CENTERS;IV_TANGENT;IV_BEND;IV_BEND_DOWN&SplineTolerance Double 0.01"
  4. oDataIO.WriteDataToFile(sOut, fname)
  5. ThisDoc.Save
Если долго мучиться - что-нибудь получится.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Попробуйте с опцией
AcadVersion=R12

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Попробуйте с опцией
AcadVersion=R12
Не помогло, к сожалению.
Если долго мучиться - что-нибудь получится.

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Bookvoed,
Тут что-то есть по этому поводу: https://knowledge.autodesk.com/support/inventor/troubleshooting/caas/sfdcarticles/sfdcarticles/DXF-export-of-a-sheet-metal-face-follows-original-document-unit-even-after-it-is-changed-in-Inventor.html
Насколько я понял, данный код проверяет наличие шаблона (flat pattern), и при его отсутствии, создаёт его.
Шаблон у меня подтягивается.
Если долго мучиться - что-нибудь получится.

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
д
Возможно ли в принудительном порядке выгружать dxf в миллиметрах?
Т.е. выставлять единицы измерения перед конвертацией в dxf.
Извиняюсь за кривое цитирование.
Если долго мучиться - что-нибудь получится.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Т.е. выставлять единицы измерения перед конвертацией в dxf.
Где выставлять единицы измерения? В файле модели?

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Где выставлять единицы измерения? В файле модели?
Я хочу понять, где при выгрузке сбиваются единицы измерения. Как я понимаю, это происходит либо в шаблоне C:\Users\Public\Documents\Autodesk\Inventor 2022\Design Data\DWG-DXF, хотя я не нашёл там упоминания единиц измерения.
Либо это происходит в модели.
Если долго мучиться - что-нибудь получится.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Возможно ли в принудительном порядке выгружать dxf в миллиметрах?
Т.е. выставлять единицы измерения перед конвертацией в dxf.
Извиняюсь за кривое цитирование.
Ну хоть файл с примером выложите, что бы предметно разговаривать.

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Вот этот файл. Бьюсь с ним который месяц :-[
Если долго мучиться - что-нибудь получится.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
К сожалению ваш листовой файл многотельный.
Он без создания производной детали даже не разворачивается.
Выберете какое из тел нужно разворачивать



Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Запустите правило "Выгрузка". Он выгрузит dxf с обоих солидов.
Если долго мучиться - что-нибудь получится.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
посмотрел
у меня все нормально выгружается в акаде все в миллиметрах


Вот мой файл настроек экспорта разверток:



Может у вас что с акадом при просмотре dxf-файлов

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Разобрался. Проблема была в шаблонах деталей. Добавил шаблон standard.ipt, и всё заработало как надо.
Большое спасибо за помощь!
Если долго мучиться - что-нибудь получится.

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Приветствую! Столкнулся с проблемой: dxf не выгружается, если деталь содержит больше двух твёрдых тел. Подскажите, пожалуйста, в чём может быть проблема. Файл приложил.
Если долго мучиться - что-нибудь получится.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Приветствую! Столкнулся с проблемой: dxf не выгружается, если деталь содержит больше двух твёрдых тел. Подскажите, пожалуйста, в чём может быть проблема. Файл приложил.
Не удивительно, даже в пользовательском интерфейсе нельзя такое сделать. Нужно с многотельного листового материала делать производный компонент с каждого тела по отдельности, а потом уже разворачивать.

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Приветствую! Столкнулся с проблемой: dxf не выгружается, если деталь содержит больше двух твёрдых тел. Подскажите, пожалуйста, в чём может быть проблема. Файл приложил.
Не удивительно, даже в пользовательском интерфейсе нельзя такое сделать. Нужно с многотельного листового материала делать производный компонент с каждого тела по отдельности, а потом уже разворачивать.
Попробовал с многотельного листового материала сделать детали с трёх твёрдых тел, а потом выгрузить их. Выдаёт ошибку. Мне кажется странным то, что два тела выгрузить можно, а три - нет. Или я что-то не так  понял?
Если долго мучиться - что-нибудь получится.

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Приветствую! Столкнулся с проблемой: dxf не выгружается, если деталь содержит больше двух твёрдых тел. Подскажите, пожалуйста, в чём может быть проблема. Файл приложил.
Не удивительно, даже в пользовательском интерфейсе нельзя такое сделать. Нужно с многотельного листового материала делать производный компонент с каждого тела по отдельности, а потом уже разворачивать.
Ошибка вылетает в 57 строке, при количестве твёрдых тел больше трёх.
Код - Visual Basic [Выбрать]
  1. Dim pd As PartDocument:  pd = ThisApplication.ActiveDocument
  2.  
  3. If pd.ComponentDefinition.Type <> kSheetMetalComponentDefinitionObject Then
  4. MsgBox ("Нужна листовая деталь.")
  5. Exit Sub
  6. End If
  7.  
  8. If pd.ComponentDefinition.SurfaceBodies.Count < 2 Then
  9. MsgBox ("Нужна многотельная деталь.")
  10. Exit Sub
  11. End If
  12.  
  13.  
  14. 'Перебор по количеству солидов
  15. Dim i As Integer
  16. For i = 1 To pd.ComponentDefinition.SurfaceBodies.Count
  17. 'Создать производную деталь невидимую для пользователя
  18. Dim derivePart As PartDocument:  derivePart = ThisApplication.Documents.Add(kPartDocumentObject, ThisApplication.FileManager.GetTemplateFile(kPartDocumentObject), False)  '!!!!
  19.  
  20. 'Подготовка к созданию производного компонента
  21. Dim dpc As DerivedPartUniformScaleDef
  22.  dpc = derivePart.ComponentDefinition.ReferenceComponents.DerivedPartComponents.CreateUniformScaleDef(pd.FullFileName)
  23.  
  24. Dim j As Integer
  25.  
  26. 'Выделить текущий солид
  27. For j = 1 To pd.ComponentDefinition.SurfaceBodies.Count
  28. If i <> j Then dpc.Solids.Item(i).IncludeEntity = False
  29. Next
  30.  
  31. ' Создать производный компонент
  32. Call derivePart.ComponentDefinition.ReferenceComponents.DerivedPartComponents.Add(dpc)
  33.  
  34. 'конвертировать производную деталь в листовой материал Document.SubType to Sheetmetal
  35. derivePart.SubType = "{9C464203-9BAE-11D3-8BAD-0060B0CE6BB4}"
  36.  
  37. Dim sheetCompDef As SheetMetalComponentDefinition:  sheetCompDef = derivePart.ComponentDefinition
  38. Dim baseSheetCompDef As SheetMetalComponentDefinition:  baseSheetCompDef = pd.ComponentDefinition
  39.  
  40.  'Разрешить изменение толщины листовой детали
  41.    sheetCompDef.UseSheetMetalStyleThickness = False
  42.  
  43. ' Изменение толщины
  44.    Dim oThicknessParam As Parameter
  45.      oThicknessParam = sheetCompDef.Thickness
  46.   oThicknessParam.Value = baseSheetCompDef.Thickness.Value
  47.  'Сохранить в DXF
  48.  ' Get the DataIO object.
  49.    Dim oDataIO As DataIO
  50.      oDataIO = derivePart.ComponentDefinition.DataIO
  51.  
  52.     ' Build the string that defines the format of the DXF file.
  53.    Dim sOut As String
  54.     sOut = "FLAT PATTERN DXF?AcadVersion=R12&OuterProfileLayer=Outer"
  55.         fname = pd.File.FullFileName & "-" & CStr(i) & ".dxf"
  56.     ' Create the DXF file.
  57.    oDataIO.WriteDataToFile (sOut, fname)
  58.  
  59. 'Закрыть производную деталь без сохранения
  60. derivePart.Close (True)
  61.  
  62. Next
Если долго мучиться - что-нибудь получится.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
прикольно тестовый файл уже в 2023 версии, у меня пока стоит 2022, на выходных качну и поставлю 2023

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Есть подозрение, что неправильно выделяется текущее твёрдое тело.
Если долго мучиться - что-нибудь получится.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
после запуска вашего макроса
создается производная деталь с двумя телами, конечно Инвентор такое разворачивать не будет


Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Если я правильно понял, то причина в выделении твёрдого тела подлежащего выгрузке, в этом участке кода:

Код - Visual Basic [Выбрать]
  1. 'Выделить текущий солид
  2. For j = 1 To pd.ComponentDefinition.SurfaceBodies.Count
  3. If i <> j Then dpc.Solids.Item(i).IncludeEntity = False
  4. Next

Подскажите, пожалуйста, как поправить.
Если долго мучиться - что-нибудь получится.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
нужно итератор вместо i поставить j во второй строчке

Код - Visual Basic [Выбрать]
  1. For j = 1 To pd.ComponentDefinition.SurfaceBodies.Count
  2. If i <> j Then dpc.Solids.Item(j).IncludeEntity = False
  3. Next

Оффлайн Bookvoed

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Всё работает. Огромное спасибо за помощь!
Если долго мучиться - что-нибудь получится.

Оффлайн filat

  • ADN Club
  • ****
  • Сообщений: 262
  • Карма: 2
Конвертор DataIO применим только к листовым деталям? Если простую деталь нужно сохранить в dxf, то только через чертеж? Для чертежа нужна какая-то процедура конвертации или достаточно при SaveAs указать имя с нужным расширением?

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
DataIO
Влад сохранение простой модели в формат DXF не имеет смысла, поскольку DXF-формат сам по себе плоский а деталь объемная.
Поэтому только через создание плоского вида на чертеже.

Оффлайн filat18

  • ADN OPEN
  • Сообщений: 25
  • Карма: 1
Для чертежа нужна какая-то процедура конвертации или достаточно при SaveAs указать имя с нужным расширением?

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Для чертежа нужна какая-то процедура конвертации или достаточно при SaveAs указать имя с нужным расширением?
Ну у тебя через SaveAs получается? Если получается, то пользуйся