| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Существует ли аналог (findfile) в .NET?

Существует ли аналог (findfile) в .NET?

Ответ
Поиск в этой теме
Непрочитано 19.01.2010, 21:51 #1
Существует ли аналог (findfile) в .NET?
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 39,787

Понадобилось мне определить, находится ли некоторый файл в путях поддержки AutoCAD. В лиспе с этим просто - (findfile FileName) и вперед. В .NET я такого не нашел. Может, плохо искал?
Cейчас додуматься смог только до получения путей поддержки, разбора их в массив и последовательной проверки наличия файла. Мне такой подход не сильно нравится - приходится использовать Autodesk.AutoCAD.Interop. Подозреваю, что есть более простой способ. Если есть вариант решения - подскажите, пожалуйста (VB.NET или C#).
Использую VS2008 Standard Edition, dll пишется под AutoCAD 2008.
Спасибо.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Просмотров: 6258
 
Непрочитано 19.01.2010, 22:33
#2
Pavlukas


 
Регистрация: 18.01.2010
Сообщений: 16


Посмотри, вроде так

Document
doc =
Application.DocumentManager.MdiActiveDocument;

HostApplicationServices haser =
HostApplicationServices.Current;
string filepath =
haser.FindFile(fileName, doc.Database,
FindFileHint.Default)
Pavlukas вне форума  
 
Автор темы   Непрочитано 19.01.2010, 22:49
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Спасибо! Вроде бы понял свою ошибку
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.01.2010, 22:53
#4
Pavlukas


 
Регистрация: 18.01.2010
Сообщений: 16


Алексей вот код, но без обработки на ошибку, если файл не найден
namespace
FindFile
{
publicclassFindFile
{
[Autodesk.AutoCAD.Runtime.
CommandMethod("FindFile")]
publicvoid PathFileFind()
{
Autodesk.AutoCAD.ApplicationServices.
Document doc =
Autodesk.AutoCAD.ApplicationServices.
Application.DocumentManager.MdiActiveDocument;
Autodesk.AutoCAD.DatabaseServices.
HostApplicationServices haser =
Autodesk.AutoCAD.DatabaseServices.
HostApplicationServices.Current;
Autodesk.AutoCAD.EditorInput.
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
Autodesk.AutoCAD.EditorInput.
PromptResult res1 = ed.GetString(" : ");
string path =
haser.FindFile(
res1.StringResult,
doc.Database,
Autodesk.AutoCAD.DatabaseServices.
FindFileHint.Default
);
ed.WriteMessage(path);
}
}
}
Pavlukas вне форума  
 
Непрочитано 19.01.2010, 23:43
#5
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Существует. Вариантов как минимум два. Первый:
Код:
[Выделить все]
string filename; // Имя файла,  который мы будем искать в путях доступа
string fullpath = HostApplicationServices.Current.FindFile( 
         filename, HostApplicationServices.WorkingDatabase, 
         FindFileHint.Default);
Ну а второй - вызов acedFindFile через P/Invoke
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 20.01.2010, 08:26
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Александр Ривилис, то есть второй вариант выполнять по аналогу с кодом Танзилло (DBUtils.cs)?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.01.2010, 08:49
#7
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Александр Ривилис, то есть второй вариант выполнять по аналогу с кодом Танзилло (DBUtils.cs)?
Да. Организовать вызов функции из соответствующей автокадовского dll-файла (в данном случае из acad.exe). Это общий принцип. Если чего-то нет в ObjectARX .NET, но есть в ObjectARX (без .NET) - нужно использовать P/Invoke
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 20.01.2010, 08:54
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Понял, буду пробовать Спасибо
Pavlukas, благодарствую. Я сделал аналогично:
Код:
[Выделить все]
using System;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;

using AcDb = Autodesk.AutoCAD.DatabaseServices;

namespace test
{
  class FileOperations
  {
    public static string PathFindFile(string FileName, string DefaultValue)
    {
      string Result;
      Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
      try
      {
        Result = AcDb.HostApplicationServices.Current.FindFile(FileName, doc.Database, FindFileHint.Default);
      }
      catch (System.Exception ex)
      {
        Result = DefaultValue;
      }
      return Result;
    }

  }
}
Вроде работает...
P.S. Александр, я окончательно и бесповоротно запутался в импорте ObjectARX-функций Очень много сопутствующих вопросов возникло, а разобраться пока не смог.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 20.01.2010 в 11:03.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.01.2010, 09:02
#9
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Если в указанной версии AutoCAD используется .Net Framework версии не ниже 3.0, то ещё один способ такой (я так проверяю в AutoCAD 2009):
Код:
[Выделить все]
...
//AutoCAD namespaces
using acad = Autodesk.AutoCAD.ApplicationServices.Application;
...
/// <summary>
/// Метод определяет наличие файла в путях поддержки, прописанный в настройках AutoCAD.
/// </summary>
/// <param name="fileName">Имя искомого файла (вместе с указанием расширения)</param>
/// <returns>Если файл обнаружен - возвращается строковое представление каталога, в котором этот файл находится. Если файл не найден - возвращается null.</returns>
        private string FileExistsInAcadSupportDirectories(string fileName)
        {
            return acad.UserConfigurationManager.OpenCurrentProfile().OpenSubsection("General").ReadProperty("ACAD", string.Empty).ToString().Split(';').Where(n => n != string.Empty).FirstOrDefault(n => File.Exists(Path.Combine(n, fileName)));            
        }
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 25.01.2010 в 09:08.
hwd вне форума  
 
Автор темы   Непрочитано 25.01.2010, 09:06
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Нда... До такой строки я точно додуматься не смогу еще очень долго.
Но за информацию спасибо
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.01.2010, 09:39
#11
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от hwd Посмотреть сообщение
Если в указанной версии AutoCAD используется .Net Framework версии не ниже 3.0, то ещё один способ такой (я так проверяю в AutoCAD 2009):
Это не полный аналог (findfile), т.к. не проверяются:
1) текущий каталог;
2) каталог, содержащий текущий чертеж;
3) каталог содержащий acad.exe.
Александр Ривилис вне форума  
 
Непрочитано 25.01.2010, 10:17
#12
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Это не полный аналог (findfile), т.к. не проверяются:
1) текущий каталог;
2) каталог, содержащий текущий чертеж;
3) каталог содержащий acad.exe.
проверки п.п. 2 и 3 можно без проблем добавить.
про п.1 не понял - "текущий каталог" чего? У меня только 2 варианта ответа, но они перечислены в п.п. 2 и 3.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 25.01.2010 в 10:28.
hwd вне форума  
 
Непрочитано 25.01.2010, 11:49
#13
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от hwd Посмотреть сообщение
проверки п.п. 2 и 3 можно без проблем добавить.
Конечно можно. Я просто уточнил, что приведенный код это не учитывает.
Цитата:
Сообщение от hwd Посмотреть сообщение
про п.1 не понял - "текущий каталог" чего? У меня только 2 варианта ответа, но они перечислены в п.п. 2 и 3.
Текущий каталог в том смысле, в котором это подразумевает Windows. Обычно это то, что задано в поле "Рабочая папка" ярлыка AutoCAD, но программно может быть изменено.
Александр Ривилис вне форума  
 
Непрочитано 25.01.2010, 11:58
#14
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Текущий каталог в том смысле, в котором это подразумевает Windows. Обычно это то, что задано в поле "Рабочая папка" ярлыка AutoCAD, но программно может быть изменено.
В какой последовательности происходит поиск?

предполагаю такую:
1. Каталог, в котором находится файл (если он уже сохранён).
2. каталог, в котором находится acad.exe
3. Рабочая папка
4. Последовательная проверка всех каталогов, прописанных в ветке реестра, которую я обрабатываю в своём коде.

прошу поправить меня, если ошибаюсь.
Цитата:
Крыс
Нда... До такой строки я точно додуматься не смогу еще очень долго.
Но за информацию спасибо
Настоятельно рекомендую это. Не пожалеешь ни разу...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 25.01.2010 в 12:06.
hwd вне форума  
 
Непрочитано 25.01.2010, 12:10
#15
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от hwd Посмотреть сообщение
В какой последовательности происходит поиск?
ObjectARX Reference говорит нам:
Цитата:
  1. The current directory
  2. The directory that contains the current drawing file
  3. The directories named by the ACAD environment variable (if this variable has been specified)
  4. The directory that contains the AutoCAD program files
Александр Ривилис вне форума  
 
Непрочитано 25.01.2010, 12:11
#16
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
ObjectARX Reference говорит нам:
аке, спасибо
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 13.08.2010, 00:11
#17
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
ObjectARX Reference говорит нам:
Вспомнил об этой теме, доработал код. Результат здесь. В указанном линке показано, как можно управлять каталогами поиска.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Существует ли аналог (findfile) в .NET?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AUTOCAD 2010 перестал переключаться в многооконный режим. Проблемы с переменными Андрей Х. AutoCAD 24 27.05.2015 10:17
Локализация руководства разработчика по .Net API AutoCAD hwd .NET 22 08.09.2010 19:17
Как можно из LISP запросить у юзера выделить произвольные элементы и затем вызвать аналог WMFOUT для сохранения их в изображении? lexluther LISP 4 12.08.2009 11:44