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

ADN Club => Inventor API => Тема начата: R.I.Chernov от 25-02-2015, 11:51:00

Название: Расположение документа
Отправлено: R.I.Chernov от 25-02-2015, 11:51:00
Доброго времени суток, уважаемые форумчане! Помогите пожалуйста разобраться с таким вот вопросом:
Если зайти в свойства любого документа (используя ПКМ), то на вкладке "Общие" есть свойство "Расположение". Можно ли обратиться в этому свойству программно? Если сформулировать по-другому: мне необходимо получить название папки, в которой хранится документ.

П.С. Я понимаю, что это можно сделать чем-то вроде: "возьмем полный путь файла и вычтем из него название файла", но мне бы хотелось. чтобы в определении названия папки не участвовало каких-либо переменных (например название файла), потому как, при изменении последнего, строка кода будет требовать корректировки.
Название: Re: Расположение документа
Отправлено: Александр Ривилис от 25-02-2015, 14:52:09
Не думаю, что в Inventor API есть прямое свойство для получения каталога, в котором содержится файл, но зато есть свойство Document.FullFileName из которого достаточно просто получить каталог. Достаточно отсекать с конца строки по одному символу пока "не упрешься" в "\" или в ":" или в "/". Всё что останется и будет "папка, в которой хранится документ".
Название: Re: Расположение документа
Отправлено: Алексей Романов от 25-02-2015, 15:13:31
на вкладке "Общие" есть свойство "Расположение". Можно ли обратиться в этому свойству программно?
Это не свойство, программно обратиться не получится. Вот один из вариантов получения папки файла:
Код - vb.net [Выбрать]
  1. Dim nameDoc As String = m_inventorApplication.ActiveDocument.FullFileName
  2. Dim patchDoc As String = nameDoc.Remove(nameDoc.LastIndexOf("\"), nameDoc.Length - nameDoc.LastIndexOf("\"))
В iLogic Инвентора есть такая фича: ThisDoc.Path
Название: Re: Расположение документа
Отправлено: Александр Ривилис от 25-02-2015, 15:24:58
Алексей Романов
IMHO не совсем правильно. В случае если файл находится в корневом каталоге, то путь к каталогу должен быть не "X:" , а "X:\". Во всех остальных случаях без обратного слэша на конце: "X:\Directory1\Directory2\...\DirectoryN"

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F15566%2F7842324.3%2F0_f7b1d_258fd5e0_orig.png&hash=996341f21114aee0cde2b785926d5e97)

Название: Re: Расположение документа
Отправлено: Алексей Романов от 25-02-2015, 16:09:20
IMHO не совсем правильно.
Я в курсе. При работе в АИ расположение файлов в корне диска это нонсенс, работа ведется с проектами, а там без папок не обойтись. Если кому приспичит, то сделать проверку и дописать слэш не проблема. При формировании полного пути файла слэш все равно приходится дописывать (если формирования ведется не средствами FSO)...
Название: Re: Расположение документа
Отправлено: R.I.Chernov от 25-02-2015, 16:55:07
Спасибо за ваши ответы.
Прокопался два часа, так и не нашел аналога метода "LastIndexOf" для VBA. Алексей, вы не можете мне с этим помочь?
Название: Re: Расположение документа
Отправлено: Алексей Романов от 25-02-2015, 17:18:33
Алексей, вы не можете мне с этим помочь?
Без проблем, хотел же еще как вариант привести...
Код - Visual Basic [Выбрать]
  1. Dim asDoc As String: asDoc = ThisApplication.ActiveDocument.FullFileName
  2. Dim patchDoc As String: patchDoc = Left(asDoc, InStrRev(asDoc, "\") - 1)
Название: Re: Расположение документа
Отправлено: R.I.Chernov от 25-02-2015, 17:23:27
Спасибо, Алексей!
Это смешно, но спустя еще десять минут я нашел ответ, но быстрее вас выложить не успел :)

П.С. В очередной раз убедился, какой я еще зеленый - не знал, что в VBA можно в одну строку объявить переменную и задать ей значение... :)
Название: Re: Расположение документа
Отправлено: Алексей Кулик от 25-02-2015, 17:47:02
Нннууу... Как бы не совсем :) Обрати внимание на символ ":" - фактически это разделение двух или более разных операторов. В VBA полно записей вида:
Код - Visual Basic [Выбрать]
  1. Dim arPt(2) as Double
  2. arPt(0) = 0# : arPt(1)= 1# : arPt(2) = 3#
Сам я в свое время на этом хорошо мозг поломал...
Название: Re: Расположение документа
Отправлено: R.I.Chernov от 25-02-2015, 17:55:43
Спасибо!  Я тут уже успел поэкспериментировать и написать тьму всего в одну строку... :) Подскажите пожалуйста, правильно ли я понял, разделение операторов двоеточием по сути аналогично записи с новой строки?
П.С. Если не сложно, просветите пожалуйста, что за значение такое "arPt(0) = 0#" ? Что означает решетка?
Название: Re: Расположение документа
Отправлено: Александр Ривилис от 25-02-2015, 17:58:48
правильно ли я понял, разделение операторов двоеточием по сути аналогично записи с новой строки?
Да
Если не сложно, просветите пожалуйста, что за значение такое "arPt(0) = 0#"
Нулевому элементу массива arPt присваивается длинный плавающий (Double) нуль.
https://msdn.microsoft.com/en-us/library/s9cz43ek.aspx
Название: Re: Расположение документа
Отправлено: R.I.Chernov от 26-02-2015, 12:21:47
Спасибо, Александр. Почитал сегодня и, честно говоря, так и не понял в итоге, каким образом используются данные символы. В смысле как ими манипулировать, и в каких именно ситуациях они нужны и полезны. Ну например в вашем примере вы же объявляете массив как double, что тогда дает символ решетки?
Как появится свободное время, придется в этом разобраться :)

П.С. Вот та же статья на русском https://msdn.microsoft.com/ru-ru/library/s9cz43ek.aspx (https://msdn.microsoft.com/ru-ru/library/s9cz43ek.aspx)
Название: Re: Расположение документа
Отправлено: Александр Ривилис от 26-02-2015, 12:25:24
Ну например в вашем примере вы же объявляете массив как double, что тогда дает символ решетки?
В принципе он необязателен в этом случае. Можно было написать и 0.0
Обязателен символ в том случае когда тип не определен и тип значения по-умолчанию не совпадает с тем, которое необходимо по смыслу.
Название: Re: Расположение документа
Отправлено: R.I.Chernov от 26-02-2015, 12:27:58
Можно было написать и 0.0
А что мешает написать просто 0, без дробной части? Я может что-то не так делаю, но объявленные массивы double корректно работали при присвоении их членам по сути целых значений. Я для себя понял, что подразумевается, что дробная часть равна нулю. Или я ошибаюсь?
Название: Re: Расположение документа
Отправлено: brigval от 26-02-2015, 12:32:01
Алексей, вы не можете мне с этим помочь?
Без проблем, хотел же еще как вариант привести...
Код - Visual Basic [Выбрать]
  1. Dim asDoc As String: asDoc = ThisApplication.ActiveDocument.FullFileName
  2. Dim patchDoc As String: patchDoc = Left(asDoc, InStrRev(asDoc, "\") - 1)

Иногда удобно путь преобразовать в массив с разделителем "\". И обработать его.
Название: Re: Расположение документа
Отправлено: Александр Ривилис от 26-02-2015, 12:38:01
но объявленные массивы double
Я говорил про необъявленные типы, когда именно по суффиксу # понимается, что это литерал типа Double.
Название: Re: Расположение документа
Отправлено: R.I.Chernov от 26-02-2015, 13:17:22
Я говорил про необъявленные типы, когда именно по суффиксу # понимается, что это литерал типа Double.

Подскажите пожалуйста, вот этот суффикс несет только информационный характер, или же он что-то значит для программы?
Название: Re: Расположение документа
Отправлено: R.I.Chernov от 26-02-2015, 13:23:13
Иногда удобно путь преобразовать в массив с разделителем "\". И обработать его.
Если не трудно, поясните пожалуйста, что это значит... для "двухмесячных" программистов как я :)
Название: Re: Расположение документа
Отправлено: Алексей Кулик от 26-02-2015, 14:18:23
Код - Visual Basic [Выбрать]
  1. Dim strFileName As String
  2.     strFileName = "c:\test\file.txt"
  3. Dim arStr() As String
  4.     arStr = Split(strFileName, "\")
И потом проверь, что хранится в arStr
Название: Re: Расположение документа
Отправлено: R.I.Chernov от 26-02-2015, 14:37:52
И потом проверь, что хранится в arStr
Я понял,большое спасибо. А не подскажете, есть ли команда, чтобы определить, сколько в массиве элементов. Ну например я загнал полное имя файла в массив, использовав слеш как разделитель, получается чтобы мне получить имя непосредственно файла, мне нужен последний член данного массива... а как узнать, какой он по счету? Или чтобы "слепить" имя папки, в которой хранится файл, мне нужны все члены кроме последнего, опять таки я не умею определять сколько их. Или если есть массив который объявлен как "dim arrayname(55 to 59) as integer"... можно ли как-нибудь определить сколько членов в массиве и с которого начинается?
Название: Re: Расположение документа
Отправлено: Алексей Кулик от 26-02-2015, 14:45:51
UBound(arStr) - индекс последнего элемента массива. Если в модуле VBA установлена опция Option Base 0 (принято по умолчанию), то индексация начинается с 0. Соответственно в варианте #18 получим UBound(arStr) = 2.
P.S. И вообще-то есть такое правило: один вопрос = одна тема. Иначе и ориентироваться тяжело, и ответ на вопрос найти тоже не самая тривиальная задача.
Название: Re: Расположение документа
Отправлено: Александр Ривилис от 26-02-2015, 14:57:35
Подскажите пожалуйста, вот этот суффикс несет только информационный характер, или же он что-то значит для программы?
В ряде случае он значит для программы. 0# и 0.0 - это одно и тоже.
Название: Re: Расположение документа
Отправлено: R.I.Chernov от 26-02-2015, 15:03:15
В ряде случае он значит для программы. 0# и 0.0 - это одно и тоже.
Спаибо!
Название: Re: Расположение документа
Отправлено: R.I.Chernov от 26-02-2015, 15:09:51
UBound(arStr) - индекс последнего элемента массива. Если в модуле VBA установлена опция Option Base 0 (принято по умолчанию), то индексация начинается с 0. Соответственно в варианте #18 получим UBound(arStr) = 2.
P.S. И вообще-то есть такое правило: один вопрос = одна тема. Иначе и ориентироваться тяжело, и ответ на вопрос найти тоже не самая тривиальная задача.

Спасибо! Насчет "один вопрсо - одна тема" ..прошу прощения, как то диалог сам собой задался. В дополнение таки напишу ответ на свой вопрос, основываясь на получнную от вас информацию:
UBound(arrayname) - индекс последнего члена, LBound(arrayname) - индекс первого члена, UBound(arrayname) - LBound(arrayname) + 1 количество членов массива.
Для моего примера "dim arrayname(55 to 59) as integer" это 59, 55 и 5 соответственно.
П.С. закрываем тему :)