Сообщество программистов Autodesk в СНГ

ADN Club => Inventor API => Тема начата: Сергей SSS от 24-04-2016, 19:11:53

Название: Перевод команд ilogic на VBA
Отправлено: Сергей SSS от 24-04-2016, 19:11:53
Как перевести эту команду на язык макроса:
modelName = IO.Path.GetFileName(ThisDrawing.ModelDocument.FullFileName)
Как я понимаю- это определение файла базовой модели с полным путем из чертежа.
Set в начале не помогло:
Set modelName = IO.Path.GetFileName(ThisDrawing.ModelDocument.FullFileName)
Ошибка 424 Object required
Название: Re: Перевод команд ilogic на VBA
Отправлено: Windcastle от 24-04-2016, 19:39:47
Set в начале не помогло:
Set modelName = IO.Path.GetFileName(ThisDrawing.ModelDocument.FullFileName)
Ошибка 424 Object required

Добрый вечер, как мне помнится Set ставится только перед данными типа Object!!!
Если modelName не Object, то лучше его таковым сделать :)

Хотя это странно, что Вы пытаетесь получить имя файла через
IO.Path.GetFileName(ThisDrawing.ModelDocument.FullFileName)
Название: Re: Перевод команд ilogic на VBA
Отправлено: Сергей SSS от 24-04-2016, 19:47:59
Если modelName не Object, то лучше его таковым сделать :)

Dim modelName As Object
Set modelName = IO.Path.GetFileName(ThisDrawing.ModelDocument.FullFileName)
Это не помогает
Название: Re: Перевод команд ilogic на VBA
Отправлено: Александр Ривилис от 24-04-2016, 19:48:53
Сергей SSS
А что в VBA есть IO.Path.GetFileName? Насколько я помню он есть только в VB.NET
А в VBA стандартной функции для этого нет. Вот вариант:
Код - Visual Basic [Выбрать]
  1. Function FileNameFromPath(strFullPath As String) As String
  2.  
  3.      FileNameFromPath = Right(strFullPath, Len(strFullPath) - InStrRev(strFullPath, "\"))
  4.  
  5. End Function
  6.  
  7. Function FileNameNoExtensionFromPath(strFullPath As String) As String
  8.  
  9.     Dim intStartLoc As Integer
  10.     Dim intEndLoc As Integer
  11.     Dim intLength As Integer
  12.  
  13.     intStartLoc = Len(strFullPath) - (Len(strFullPath) - InStrRev(strFullPath, "\") - 1)
  14.     intEndLoc = Len(strFullPath) - (Len(strFullPath) - InStrRev(strFullPath, "."))
  15.     intLength = intEndLoc - intStartLoc
  16.  
  17.     FileNameNoExtensionFromPath = Mid(strFullPath, intStartLoc, intLength)
  18.  
  19. End Function
Название: Re: Перевод команд ilogic на VBA
Отправлено: R.I.Chernov от 25-04-2016, 12:13:09
Сергей, не совсем понятно, что вам требуется? Опишите пожалуйста задачу, полагаю ее суть не в "Переводе команд из VBA" . а в получении какого-то результата.
П.С. По логике вещей "IO" - ссылка на объект. В вашем примере не понятно на какой.

П.П.С. Как я понял, вам требуется получить "FullFileName". Если это необходимо для текущего документа, то делается это так (для iLogic нужно удалить слово Set):
Код - Visual Basic [Выбрать]
  1. Sub Test_forum_2()
  2. Dim oDoc As Inventor.Document
  3. Set oDoc = ThisApplication.ActiveDocument
  4. MsgBox (oDoc.FullDocumentName)
  5. End Sub

Если вам требуется получить имя не текущего активного файла, а какого-то другого, то вместо oDoc надо поставить ссылку на другую деталь, сборку или чертеж инвентора.
Название: Re: Перевод команд ilogic на VBA
Отправлено: Алексей Романов от 27-04-2016, 14:12:44
Да уж, ситуация. Попробую разложить по полочкам.
modelName = IO.Path.GetFileName(ThisDrawing.ModelDocument.FullFileName)
Здесь два момента.
ThisDrawing.ModelDocument.FullFileName - это конструкция чисто iLogic: получения полного имени файла модели с первого вида на чертеже. На VBA это будет так:
Код - Visual Basic [Выбрать]
  1. ' активный документ
  2. Dim oDoc As DrawingDocument
  3. Set oDoc = ThisApplication.ActiveDocument
  4. ' первый вид на чертеже
  5. Dim dView As DrawingView
  6. Set dView = oDoc.ActiveSheet.DrawingViews(1)
  7. ' полное имя файла документа модели
  8. Dim dPatch As String
  9. dPatch = dView.ReferencedDocumentDescriptor.FullDocumentName
IO.Path.GetFileName - это чистый VB.NET, получение имени файла без пути. Банальная манипуляция со строками. На VBA это будет так:
Код - Visual Basic [Выбрать]
  1. ' имя файла без пути с расширением
  2. Dim dName As String
  3. dName = Right(dPatch, Len(dPatch) - InStrRev(dPatch, "\"))
  4. ' имя файла без пути и без расширения
  5. dName = Left(dName, Len(dName) - 4)
Удачи!..
Название: Re: Перевод команд ilogic на VBA
Отправлено: R.I.Chernov от 27-04-2016, 22:38:11
Да уж, ситуация. Попробую разложить по полочкам
Алексей, не могли бы вы еще немного "разложить по полочкам" для меня? :) Я не понимаю, а для чего такая сложность, с обращением к виду? У меня никогда не стояло такой задачи, но вроде можно получить имя документа с помощью :ThisApplication.ActiveDocument.FullDocumentName ? Или я какой-то тонкой разницы не уловил?
Название: Re: Перевод команд ilogic на VBA
Отправлено: Александр Ривилис от 27-04-2016, 23:48:56
Код - Visual Basic [Выбрать]
  1.    ' имя файла без пути с расширением
  2.    Dim dName As String
  3.     dName = Right(dPatch, Len(dPatch) - InStrRev(dPatch, "\"))
  4.     ' имя файла без пути и без расширения
  5.    dName = Left(dName, Len(dName) - 4)
Насчет последнего - это ты загнул. Это будет справедливо только если расширение будет трехсимвольным. В общем случае это не так.
Название: Re: Перевод команд ilogic на VBA
Отправлено: Алексей Романов от 28-04-2016, 14:36:33
R.I.Chernov, ты просто не понял вопрос, прочитай внимательно про первый момент. Конструкция iLogic возвращает имя файла МОДЕЛИ и это нужно повторить на VBA, а ты говоришь про имя файла чертежа)))
Александр, я не сильно загнул в данном случае, зачем усложнять))) Можно и так:
Код - Visual Basic [Выбрать]
  1. ' имя файла без расширения
  2. dName = Left(dName, InStrRev(dName, ".") - 1)
Название: Re: Перевод команд ilogic на VBA
Отправлено: Александр Ривилис от 28-04-2016, 14:47:54
Можно и так:
Побуду нудным. :) Что будет, если у файла нет расширения?
Название: Re: Перевод команд ilogic на VBA
Отправлено: Алексей Романов от 28-04-2016, 15:21:13
В данном случае у файла модели Инвентора есть расширение, причем трехбуквенное. Если фирма Autodesk уберет расширения, тогда можно так)))
Код - Visual Basic [Выбрать]
  1. If InStr(dName, ".") > 0 Then
  2.     dName = Left(dName, InStrRev(dName, ".") - 1)
  3. End If