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

Статьи => Опубликованные статьи => Тема начата: Александр Ривилис от 18-06-2013, 03:27:37

Название: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Александр Ривилис от 18-06-2013, 03:27:37
Как установить путь к двум и более каталогам конфигурации принтеров (PrinterConfigPath) при помощи AutoCAD .NET API? (http://adn-cis.org/kak-ustanovit-put-k-dvum-i-bolee-katalogam-konfiguraczii-printerov-%28printerconfigpath%29-net.html)
Название: Re: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Вильдар от 17-09-2015, 17:36:34
Почему проверяется Ver <= 12, ведь у 2012 версии Major = 18.
Код - C# [Выбрать]
  1.     public static class Env
  2.     {
  3.         static int Ver = AcAp.Application.Version.Major;
  4.         // AutoCAD 2007...2012
  5.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedGetEnv")]
  6.         extern static private Int32 acedGetEnv12(string var, StringBuilder val);
  7.         // AutoCAD 2013...
  8.         [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedGetEnv")]
  9.         extern static private Int32 acedGetEnv13(string var, StringBuilder val);
  10.         static public string GetEnv(string var)
  11.         {
  12.             StringBuilder val = new StringBuilder(16536);
  13.             if (Ver <= 12) acedGetEnv12(var, val); else acedGetEnv13(var, val);
  14.             return val.ToString();
  15.         }
  16.         // AutoCAD 2007...2012
  17.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedSetEnv")]
  18.         extern static private Int32 acedSetEnv12(string var, string val);
  19.         // AutoCAD 2013...
  20.         [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedSetEnv")]
  21.         extern static private Int32 acedSetEnv13(string var, string val);
  22.         static public void SetEnv(string var, string val)
  23.         {
  24.             if (Ver <= 12) acedSetEnv12(var, val); else acedSetEnv13(var, val);
  25.         }
  26.  
  27.     }
Название: Re: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Александр Ривилис от 17-09-2015, 19:01:43
Почему проверяется Ver <= 12, ведь у 2012 версии Major = 18.
Конечно ты прав. Это опечатка. Исправил.
Название: Re: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Doublefish от 07-07-2016, 09:46:14
Env.GetEnv(var) В 2014 работает нормально, но в AutoCAD 2015 и выше возвращает "пусто", а в режиме отладки работает.
Подскажите пожалуйста, что нужно сделать чтобы это работало в 2015 и выше не только в режиме отладки?
Название: Re: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Александр Ривилис от 07-07-2016, 13:10:47
но в AutoCAD 2015 и выше возвращает "пусто", а в режиме отладки работает.
Это что-то новенькое. Не сталкивался.
Название: Re: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Александр Ривилис от 07-07-2016, 13:26:49
Вспомнил:
У функции acedGetEnv в ObjectARX 2015 новая сигнатура:
Код - C++ [Выбрать]
  1. int            acedGetEnv (const ACHAR *sym, ACHAR  *var, size_t nBufLen);
вместо той, которая была раньше:
Код - C++ [Выбрать]
  1. int            acedGetEnv (const ACHAR *sym, ACHAR  *var);
Так что код должен быть какой-то такой (не проверял):
Код - C# [Выбрать]
  1. [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedGetEnv")]
  2. extern static private Int32 acedGetEnv15(string var, StringBuilder val, UIntPtr valLen);
  3.  
  4. static public string GetEnv(string var)
  5. {
  6.   StringBuilder val = new StringBuilder(16536);
  7.   if (Ver <= 18)
  8.     acedGetEnv12(var, val);
  9.   else if (Ver <= 19)
  10.     acedGetEnv13(var, val);
  11.   else
  12.     acedGetEnv15(var, val, new UIntPtr(16536));
  13.   return val.ToString();
  14. }
Название: Re: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Doublefish от 07-07-2016, 15:04:46
Не задано acedGetEnv13 ...
Название: Re: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Вильдар от 07-07-2016, 18:39:34
А импорт функции для 2013 у тебя объявлен?
Код - C# [Выбрать]
  1.          // AutoCAD 2013,2014
  2.         [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedGetEnv")]
  3.         extern static private Int32 acedGetEnv13(string var, StringBuilder val);

Полный код примерно такой:
Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Александр Ривилис от 07-07-2016, 18:49:30
Не задано acedGetEnv13 ...
Я так понимаю, что ты просто заменил
Код - C# [Выбрать]
  1. [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedGetEnv")]
  2. extern static private Int32 acedGetEnv13(string var, StringBuilder val);
на
Код - C# [Выбрать]
  1. [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedGetEnv")]
  2. extern static private Int32 acedGetEnv15(string var, StringBuilder val, UIntPtr valLen);
вместо того, чтобы добавить это определение.
Название: Re: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Doublefish от 08-07-2016, 08:01:45
Всё заработало - спасибо.
Возможно имеет смысл дополнить исходную статью на сайте.
Название: Re: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Александр Ривилис от 08-07-2016, 17:18:24
Не проверял, но вроде бы вместо P/Invoke acedGetEnv можно использовать HostApplicationServices.Current.GetEnvironmentVariable:
Код - C# [Выбрать]
  1. static public string GetEnv(string var)
  2. {
  3.   return HostApplicationServices.Current.GetEnvironmentVariable(var);
  4.   //StringBuilder val = new StringBuilder(16536);
  5.   //if (Ver <= 18)
  6.   //  acedGetEnv12(var, val);
  7.   //else if (Ver <= 19)
  8.   //  acedGetEnv13(var, val);
  9.   //else
  10.   //  acedGetEnv15(var, val, new UIntPtr(16536));
  11.   //return val.ToString();
  12. }
Название: Re: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Вильдар от 08-07-2016, 17:35:35
А для установки параметра нет метода?
Название: Re: Как установить путь к двум и более каталогам конфигурации принтеров
Отправлено: Александр Ривилис от 08-07-2016, 17:36:26
А для установки параметра нет метода?
Увы. Не нашел.