| |
|
|
Как правильно в AutoCAD добавить пути для поиска файлов? Был такой вопрос в ветке ObjectARX, а как это можно сделать в NET?
|
|
|
|
Заслуженный посетитель
Сообщений: 8400
Баллов: 6962
Регистрация: 18-02-2009
Рыцарь ObjectARX
|
> Сергей (2007-06-27 00:19:02)Точно также. Только для вызова acedGetEnv и acedSetEnv использовать P/Invoke.
|
|
|
|
Заслуженный посетитель
Сообщений: 8400
Баллов: 6962
Регистрация: 18-02-2009
Рыцарь ObjectARX
|
| Код |
|---|
using System ; using System.Runtime.InteropServices; using System.Windows.Forms; using System.Text ; using Autodesk.AutoCAD.Runtime ; using Autodesk.AutoCAD.ApplicationServices ; using Autodesk.AutoCAD.DatabaseServices ; using Autodesk.AutoCAD.EditorInput ; using Autodesk.AutoCAD.Windows ; using AcRx = Autodesk.AutoCAD.Runtime ; using AcEd = Autodesk.AutoCAD.EditorInput ; using AcDb = Autodesk.AutoCAD.DatabaseServices ; using AcAp = Autodesk.AutoCAD.ApplicationServices ; using AcWin = Autodesk.AutoCAD.Windows ; [assembly: CommandClass(typeof(Rivilis.SetEnv))] namespace Rivilis { public class SetEnv { [System.Security.SuppressUnmanagedCodeSecurity] // Для AutoCAD 2006: [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi ,EntryPoint = "acedGetEnv")] // Для AutoCAD 2007 и выше: // [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode ,EntryPoint = "acedGetEnv")] extern static private Int32 acedGetEnv(string var, StringBuilder val); [System.Security.SuppressUnmanagedCodeSecurity] // Для AutoCAD 2006: [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi ,EntryPoint = "acedSetEnv")] // Для AutoCAD 2007 и выше: // [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode ,EntryPoint = "acedSetEnv")] extern static private Int32 acedSetEnv(string var, string val); static public void AddPath(string path) { StringBuilder buf = new StringBuilder(16536); acedGetEnv("ACAD", buf); buf.Append(";"); buf.Append(path); acedSetEnv("ACAD",buf.ToString()); } [CommandMethod("TESTENV")] // Пример использования функции SetEnv.AddPath() static public void test() { AcWin.OpenFileDialog dlg = new AcWin.OpenFileDialog("Выберите каталог:","","","",AcWin.OpenFileDialog.OpenFileDialogFlags.AllowFoldersOnly); DialogResult ds = dlg.ShowDialog(); if (ds == DialogResult.OK) { AddPath(dlg.Filename); } } } }
|
|
|
|
|
Заслуженный посетитель
Сообщений: 902
Баллов: 759
Регистрация: 02-03-2009
|
Александр, подскажите, пожалуйста, как сделать обратное действие - удалить эти пути? С P/Invoke я пока не сталкивался - сам не разберусь
|
|
|
|
Заслуженный посетитель
Сообщений: 327
Баллов: 301
Регистрация: 18-09-2009
|
| Цитата |
|---|
Александр Пекшев aka Modis пишет:
Александр, подскажите, пожалуйста, как сделать обратное действие - удалить эти пути? С P/Invoke я пока не сталкивался - сам не разберусь |
Не ленись юзать поиск.
Компьютер - это очень быстро действующий идиот. Он просто покорно делает в точности то, что вы ему сказали. [Бьярне Страуструп]
|
|
|
|
Заслуженный посетитель
Сообщений: 902
Баллов: 759
Регистрация: 02-03-2009
|
Спасибо конечно, но варианта покороче не существует?
|
|
|
|
Заслуженный посетитель
Сообщений: 327
Баллов: 301
Регистрация: 18-09-2009
|
| Цитата |
|---|
Александр Пекшев aka Modis пишет:
Спасибо конечно, но варианта покороче не существует? |
Из вопроса следует, что указанный линк даже не читался. В коде указанной статьи имелся такой фрагмент (в конце страницы указан его источник):
| Код |
|---|
[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("acad.exe", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
private static extern int acedSetEnv(string envName, StringBuilder NewValue);
|
Достаточно коротко.
Раз не утруждаешь себя чтением (хотя бы по диагонали, чтобы найти нужное) - более ссылок давать не буду.
Изменено:
Hwd - 22-09-2010 19:35:47
Компьютер - это очень быстро действующий идиот. Он просто покорно делает в точности то, что вы ему сказали. [Бьярне Страуструп]
|
|
|
|
Заслуженный посетитель
Сообщений: 902
Баллов: 759
Регистрация: 02-03-2009
|
Я это читал!
Чем
| Код |
|---|
[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("acad.exe", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
private static extern int acedSetEnv(string envName, StringBuilder NewValue); |
отличается от
| Код |
|---|
[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode ,EntryPoint = "acedSetEnv")]
extern static private Int32 acedSetEnv(string var, string val); |
Я просто не очень хорошо понял как это использовать, чтобы удалить нужный мне путь?
P.S. А может сильно "торможу" к вечеру 
|
|
|
|
Заслуженный посетитель
Сообщений: 327
Баллов: 301
Регистрация: 18-09-2009
|
| Цитата |
|---|
Александр Пекшев aka Modis пишет:
Чем
| Код |
|---|
[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("acad.exe", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
private static extern int acedSetEnv(string envName, StringBuilder NewValue); |
отличается от
| Код |
|---|
[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode ,EntryPoint = "acedSetEnv")]
extern static private Int32 acedSetEnv(string var, string val); |
|
Насколько я знаю - автор приведённого мною фрагмента кода всё тот же Александр Ривилис. Работу первого варианта не проверял, но уверен, что и он рабочий.
| Цитата |
|---|
Александр Пекшев aka Modis пишет:
Я просто не очень хорошо понял как это использовать, чтобы удалить нужный мне путь?
P.S. А может сильно "торможу" к вечеру |
Данный метод записывает в реестр твою версию строки, в которой перечислены каталоги, разделённые символом ";".
Т.е. ты сначала извлекаешь из реестра строку, содержащую в себе перечень каталогов поиска и выполняешь над ней Split(';'), получая массив строк. Удаляешь ненужные тебе и заново собираешь их в одну строку, разделяя каталоги символом ';'. Затем используешь ту функцию, которую тебе показали - она запишет собранную тобой строку обратно в реестр. Всё. Что в этом непонятного?
Всё это выполняется в коде, на который я тебе дал ссылку. Можно было и самому разобраться.
Компьютер - это очень быстро действующий идиот. Он просто покорно делает в точности то, что вы ему сказали. [Бьярне Страуструп]
|
|
|
|
Заслуженный посетитель
Сообщений: 902
Баллов: 759
Регистрация: 02-03-2009
|
Спасибо. Просто в Вашей ссылке Вы делали большой класс, большая часть которого мне не требуется. Из ваших 234 строк мне надо порядка 50. Признаю свою вину, что не разобрался полностью в Вашем коде => не выбрал нужные мне части. Приношу свои извинения
|
|
|
|
Заслуженный посетитель
Сообщений: 327
Баллов: 301
Регистрация: 18-09-2009
|
| Цитата |
|---|
Александр Пекшев aka Modis пишет:
Спасибо. Просто в Вашей ссылке Вы делали большой класс, большая часть которого мне не требуется. Из ваших 234 строк мне надо порядка 50. Признаю свою вину, что не разобрался полностью в Вашем коде => не выбрал нужные мне части. Приношу свои извинения |
Да не извиняйся ты
Просто постарайся быть повнимательней.
Компьютер - это очень быстро действующий идиот. Он просто покорно делает в точности то, что вы ему сказали. [Бьярне Страуструп]
|
|
|
|
Заслуженный посетитель
Сообщений: 8400
Баллов: 6962
Регистрация: 18-02-2009
Рыцарь ObjectARX
|
| Цитата |
|---|
Hwd пишет:
Насколько я знаю - автор приведённого мною фрагмента кода всё тот же Александр Ривилис. |
Как ни странно, но это так. И коду уже больше трех лет.
|
|
|
|
Заслуженный посетитель
Сообщений: 902
Баллов: 759
Регистрация: 02-03-2009
|
Сделал по аналогии с вышеприведенным кодом:
| Код |
|---|
static public void RemoveSupportFiles()
{
try
{
string CurDir = new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName;
string str1 = CurDir + @"\Res";
string str2 = CurDir + @"\Data";
StringBuilder buf = new StringBuilder(16536);
acedGetEnv("ACAD", buf);
buf.Replace(str1, "");
buf.Replace(str2, "");
buf.Replace(";;", ";");
acedSetEnv("ACAD", buf.ToString());
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
{ MessageBox.Show(ex.Message); }
} |
Протестировал несколько раз - все отлично работает
|
|
|
|
Заслуженный посетитель
Сообщений: 327
Баллов: 301
Регистрация: 18-09-2009
|
| Цитата |
|---|
Александр Пекшев aka Modis пишет:
CurDir + @"\Res" |
никогда не пиши так, как ты показал.
Подобные вещи делают таким образом:
| Код |
|---|
Path.Combine(CurDir, "Res");
|
Компьютер - это очень быстро действующий идиот. Он просто покорно делает в точности то, что вы ему сказали. [Бьярне Страуструп]
|
|
|
|
Заслуженный посетитель
Сообщений: 902
Баллов: 759
Регистрация: 02-03-2009
|
А если я использую такую вещь??:
| Код |
|---|
| CurDir + @"\Res\file.dwg" |
|
|
|
|
Заслуженный посетитель
Сообщений: 327
Баллов: 301
Регистрация: 18-09-2009
|
| Цитата |
|---|
Александр Пекшев aka Modis пишет:
CurDir + @"\Res\file.dwg" |
Вообще грамотней использовать Path.Combine(...).
В версии .net 4.0 можно было бы написать так: | Код |
|---|
| Path.Combine(CurDir, "Res", "file.dwg"); |
но в .Net 3.5 и ниже такой перегрузки метода нет. Приходится писать так:
| Код |
|---|
| Path.Combine(Path.Combine(CurDir, "Res"), "file.dwg"); |
ну или воспользоваться твоим вариантом, но вообще такой способ считается "некрасивым" что ли... Хотя в данной ситуации и | Код |
|---|
| Path.Combine(Path.Combine(CurDir, "Res"), "file.dwg"); |
красотой не блещет...
Изменено:
Hwd - 23-09-2010 21:19:55
Компьютер - это очень быстро действующий идиот. Он просто покорно делает в точности то, что вы ему сказали. [Бьярне Страуструп]
|
|
|
|
Заслуженный посетитель
Сообщений: 327
Баллов: 301
Регистрация: 18-09-2009
|
| Цитата |
|---|
| но в .Net 3.5 и ниже такой перегрузки метода нет. |
хотя можно самому реализовать недостающий функционал. Делается это так:
| Код |
|---|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string[] x = new string[] {"мама", "мыла", "раму", "папа", "смотрел", "телевизор" };
Console.WriteLine(Combine('\\', x));
Console.Read();
}
/// <summary>
/// Объединить массив строк, разделив их нужным символом
/// </summary>
/// <param name="ch">Символ, который следует использовать в качестве разделителя</param>
/// <param name="args">Коллекция строк, которую следует объединить в одну строку, используя
/// в качестве параметра разделителя первый параметр</param>
/// <returns></returns>
public static string Combine(char ch, string[] args)
{
StringBuilder sb = new StringBuilder();
foreach (string item in args)
{
sb.Append(string.Format("{0}{1}", item, ch));
}
string result = sb.ToString().Remove(sb.ToString().Length - 1);
return result;
}
}
}
|
Изменено:
Hwd - 23-09-2010 21:54:25
Компьютер - это очень быстро действующий идиот. Он просто покорно делает в точности то, что вы ему сказали. [Бьярне Страуструп]
|
|
|
|
|
|
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)
|