Ускоренная выгрузка dxf

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

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

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

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Ускоренная выгрузка dxf
« : 07-04-2017, 14:52:38 »
Для ускоренной выгрузки dxf из сборок:

Код - Visual Basic [Выбрать]
  1. Dim oCompDef As AssemblyComponentDefinition
  2. oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  3. Dim occ As ComponentOccurrence
  4. Dim oFile As String
  5. Dim oDoc As Document
  6.  
  7. For Each occ In oCompDef.Occurrences
  8.      If  occ.Definition.Type = 150995200 Then
  9.                 oFile = occ.ReferencedDocumentDescriptor.ReferencedFileDescriptor.FullFileName
  10.                         'открываю найденную листовую деталь
  11.                        oDoc = ThisApplication.Documents.Open(oFile, False)
  12.                         'выгружаю DXF
  13.                         fname = ThisDoc.Document.FullFileName.Remove(ThisDoc.Document.FullFileName.LastIndexOf("\")) & "\" & iProperties.Value("Project", "Part Number") & " " & iProperties.Value("Project","Description") & ".dxf"
  14.                         oDataIO = ThisDoc.Document.ComponentDefinition.DataIO
  15.                         sOut = "FLAT PATTERN DWG?AcadVersion=2000&INTERIORPROFILESLayer=0&OUTERPROFILELayer=0&FEATUREPROFILESLayer=0&InvisibleLayers=IV_UNCONSUMEND_SKETCHES­;IV_ALTREP​
  16.                         _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"
  17.                         oDataIO.WriteDataToFile(sOut, fname)
  18.                         oDoc.Update
  19.                         oDoc.Save
  20.                         oDoc.Close
  21.         End If        
  22. Next

Проблема в том, что команда на выгрузку выполняет сборка, а не листовая деталь. Выдаёт ошибку в строке oDataIO.WriteDataToFile(sOut, fname) :

Ошибка в правиле Правило2 в документе Перебор.iam
Параметр задан неверно. (Исключение из HRESULT: 0x80070057 (E_INVALIDARG))




Подскажите пожалуйста, как правильно реализовать идею.
« Последнее редактирование: 07-04-2017, 15:38:43 от Bookvoed »
Если долго мучиться - что-нибудь получится.

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Ускоренная выгрузка dxf
« Ответ #1 : 07-04-2017, 16:17:18 »
Не нашел объявления fname и oDataIO, я с dxf не работал, потому не понятно откуда ноги растут. Поясните что это, постараюсь что-то посоветовать.
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Ускоренная выгрузка dxf
« Ответ #2 : 07-04-2017, 16:34:26 »
Также поясните пожалуйста вот что: все манипуляции в API это программное исполнение того, что пользователь должен делать руками. Дело в том, что я не могу понять, что вы хотите сделать, даже на уровне "сделать руками". Я не нашел возможности экспорта в формат dxf в программе. Скажите "Файл - Сохранить копию как - Файлы DWFx" это то что вам нужно?
В программировании я новичок...но ненадолго! ;)

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

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Re: Ускоренная выгрузка dxf
« Ответ #3 : 07-04-2017, 16:43:36 »
dxf - Файл раскроя листового металла. Для того, чтобы получить его руками - нужно создать листовую деталь, создать её развёртку, вызвать контекстное меню прямо на развёртке, и выбрать "экспортировать грань".
Участок кода, после " 'выгружаю dxf " приходилось записывать в правило, в каждой листовой детали, чтобы потом, вызвав эти правила из главной сборки получить dxf .
Если в данном коде необходимо объявить fname и oDataIO, то подскажите пожалуйста кем их объявлять =)
Если долго мучиться - что-нибудь получится.

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Ускоренная выгрузка dxf
« Ответ #4 : 07-04-2017, 16:53:48 »
Если в данном коде необходимо объявить fname и oDataIO, то подскажите пожалуйста кем их объявлять =)
Ну по идее, если они не объявлены, вам компилятор должен ошибку выдавать. Хотя мб в Visual Basic это и не так, я такой себе программист ))
Судя по справке:
Parent Object: DataIO
DataIO.WriteDataToFile( Format As String, FileName As String )

То есть: oDataIO - это Inventor.oDataIO, sOut и fname - string.

В общем даже не знаю, чем вам помочь, ибо мне надо сначала научиться это делать руками, потом разобраться с кодом, и лишь потом что-то подсказывать. У меня сейчас откровенно нет столько времени. Совет вам такой, отбросьте все переборы, и попробуйте реализовать экспорт для одной конкретной детали, как в примере из справки, потом будете "наращивать" более сложный вариант кода и мониторить, где "что-то пошло не так":
Код - Visual Basic [Выбрать]
  1. Public Sub WriteSheetMetalDXF()
  2.     ' Get the active document.  This assumes it is a part document.
  3.    Dim oDoc As PartDocument
  4.     Set oDoc = ThisApplication.ActiveDocument
  5.  
  6.     ' Get the DataIO object.
  7.    Dim oDataIO As DataIO
  8.     Set oDataIO = oDoc.ComponentDefinition.DataIO
  9.  
  10.     ' Build the string that defines the format of the DXF file.
  11.    Dim sOut As String
  12.     sOut = "FLAT PATTERN DXF?AcadVersion=R12&OuterProfileLayer=Outer"
  13.  
  14.     ' Create the DXF file.
  15.    oDataIO.WriteDataToFile sOut, "C:\temp\flat2.dxf"
  16. End Sub

В программировании я новичок...но ненадолго! ;)

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

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Re: Ускоренная выгрузка dxf
« Ответ #5 : 07-04-2017, 17:10:53 »
Для одной детали я этот метод освоил, всё работает. Если выгружать по одной - можно пальцы стереть до локтей )))
Здесь основной вопрос - как заставить код из правила в детали А работать в детали Б.
Если долго мучиться - что-нибудь получится.

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Ускоренная выгрузка dxf
« Ответ #6 : 07-04-2017, 20:06:15 »
Для одной детали я этот метод освоил, всё работает. Если выгружать по одной - можно пальцы стереть до локтей )))
Разумеется, что по одной никто вас не подбивает делать.
Здесь основной вопрос - как заставить код из правила в детали А работать в детали Б.
Что вы имеете ввиду?
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Ускоренная выгрузка dxf
« Ответ #7 : 07-04-2017, 20:22:34 »
Попробуйте пожалуйста вот что. Откройте деталь в которой есть развертка, и запустите такой вот код  и проверьте, работает ли? (я из вашего выкинул все лишнее):

Код - Visual Basic [Выбрать]
  1. Sub test()
  2.     Dim oDoc As PartDocument
  3.     oDoc = ThisApplication.ActiveDocument
  4.    
  5.     fname = ThisDoc.Document.FullFileName.Remove(ThisDoc.Document.FullFileName.LastIndexOf("\")) & "\" & iProperties.Value("Project", "Part Number") & " " & iProperties.Value("Project","Description") & ".dxf"
  6.     oDataIO = oDoc.ComponentDefinition.DataIO
  7.    
  8.     sOut = "FLAT PATTERN DWG?AcadVersion=2000&INTERIORPROFILESLayer=0&OUTERPROFILELayer=0&FEATUREPROFILESLayer=0&InvisibleLayers=IV_UNCONSUMEND_SKETCHES­;IV_ALTREP?
  9.     _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"
  10.     oDataIO.WriteDataToFile(sOut, fname)
  11.     oDoc.Update
  12.     oDoc.Save
  13.     oDoc.Close
  14. End Sub
В программировании я новичок...но ненадолго! ;)

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

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Re: Ускоренная выгрузка dxf
« Ответ #8 : 10-04-2017, 17:09:27 »
Как-то так

Если долго мучиться - что-нибудь получится.

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Ускоренная выгрузка dxf
« Ответ #9 : 10-04-2017, 18:47:49 »
Как-то так
Ну я вам про это и говорил, что надо реализовать сначала для 1 вхождения, так проще понять где именно ошибка. Раз не работает. надо продолжать упрощать код, пытаясь его в итоге привести к коду в примере. Вы говорили, что ошибка в строке "oDataIO.WriteDataToFile(sOut, fname)" , очевидно, что неверен один из аргументов. Дальше я бы вам посоветовал упростить одну из переменных, либо:
Код - Visual Basic [Выбрать]
  1. fname = "C:\temp\flat2.dxf"
либо:
Код - Visual Basic [Выбрать]
  1. sOut = "FLAT PATTERN DXF?AcadVersion=R12&OuterProfileLayer=Outer"

В общем надо понять, какая из них неверна, быть может обе.

В программировании я новичок...но ненадолго! ;)

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

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Re: Ускоренная выгрузка dxf
« Ответ #10 : 10-04-2017, 20:03:27 »
Вот так работает. Форум некорректно переносит строки (sOut, в частночти). Выгрузка для одной листовой детали уже отработана.

Код - 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)
Если долго мучиться - что-нибудь получится.

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Ускоренная выгрузка dxf
« Ответ #11 : 11-04-2017, 18:10:20 »
Тогда если оба аргумента в "oDataIO.WriteDataToFile(sOut, fname)" работают верно, для одной детали, знаит ошибка в самой ссылке "oDataIO" в переборе.

Во-первых, если я ничего не путаю, то для манипуляции с файлами, не требуется их открывать, т.е. вам не нужна строка "oDoc = ThisApplication.Documents.Open(oFile, False)"
Сылку на документ в переборе я бы задавал так:
Код - Visual Basic [Выбрать]
  1. oDoc =occ.Definition.Document
а ссылка на "oDataIO" по идее должна быть:
Код - Visual Basic [Выбрать]
  1. oDataIO = oDoc.ComponentDefinition.DataIO
и соответственно надо подкорректировать "fname " как то так:
Код - Visual Basic [Выбрать]
  1. fname = oDoc.FullFileName.Remove(oDoc.FullFileName.LastIndexOf("\")) & "\" & iProperties.Value("Project", "Part Number") & " " & iProperties.Value("Project","Description") & ".dxf"
Насчет последней строки не уверен, надо проверять, является ли мой код эквивалентом, но опять таки советую это делать для одной детали.
В программировании я новичок...но ненадолго! ;)

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

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Re: Ускоренная выгрузка dxf
« Ответ #12 : 13-04-2017, 13:45:16 »
Большое спасибо. Выгружает как надо, но есть одно "но". Если в сборке присутствует производная деталь - правило выдаёт ошибку.

Код - Visual Basic [Выбрать]
  1. Dim oCompDef As AssemblyComponentDefinition
  2. oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  3. Dim occ As ComponentOccurrence
  4. Dim oDoc As Document
  5. Dim oFile As String
  6. Dim y As Integer
  7.  
  8. For Each oDoc In oCompDef.Document.AllReferencedDocuments
  9.                 occ = oCompDef.Occurrences.AllReferencedOccurrences(oDoc).Item(1)
  10.                 If  occ.Definition.Type = 150995200 Then
  11.                         oFile = occ.ReferencedDocumentDescriptor.ReferencedFileDescriptor.FullFileName
  12.                         fname = oDoc.FullFileName.Remove(oDoc.FullFileName.LastIndexOf("\")) & "\" & iProperties.Value(occ.Name, "Project", "Part Number") & " " & iProperties.Value(occ.Name, "Project","Description") & ".dxf"
  13.                         oDataIO = oDoc.ComponentDefinition.DataIO
  14.                         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"
  15.                         oDataIO.WriteDataToFile(sOut, fname)
  16.             End If        
  17. Next
Если долго мучиться - что-нибудь получится.

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Ускоренная выгрузка dxf
« Ответ #13 : 13-04-2017, 14:07:14 »
Если в сборке присутствует производная деталь - правило выдаёт ошибку.
Поясните, что имено вы называете производной деталью?
В программировании я новичок...но ненадолго! ;)

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

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Re: Ускоренная выгрузка dxf
« Ответ #14 : 13-04-2017, 14:24:41 »
Я имею в виду производный компонент, ReferenceComponent, если не ошибаюсь.
Ошибку выдаёт в строке:
Код - Visual Basic [Выбрать]
  1. occ = oCompDef.Occurrences.AllReferencedOccurrences(oDoc).Item(1)
Причем если и исходный, и производный компоненты находятся в одной сборке - правило работает.
« Последнее редактирование: 13-04-2017, 15:40:00 от Bookvoed »
Если долго мучиться - что-нибудь получится.