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

Статьи => Опубликованные статьи => Тема начата: Александр Ривилис от 24-02-2014, 02:30:07

Название: Как получить список канонических имен для плоттера?
Отправлено: Александр Ривилис от 24-02-2014, 02:30:07
Как получить список канонических имен для плоттера?
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Леонид Семенов от 25-04-2015, 21:58:53
Решил воспользоваться функцией из
http://adn-cis.org/kak-poluchit-spisok-kanonicheskix-imen-dlya-plottera.html (http://adn-cis.org/kak-poluchit-spisok-kanonicheskix-imen-dlya-plottera.html)
Но почему-то у меня переменная psDicts из
Код - C# [Выбрать]
  1. // Получаем словарь PlotSettings
  2. DBDictionary psDicts = (DBDictionary)t.GetObject(db.PlotSettingsDictionaryId, OpenMode.ForRead);
пустое, как-будто бы у меня нет ни одного плоттера.
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Александр Ривилис от 25-04-2015, 22:10:46
Приветствую на форуме. Какая версия AutoCAD? Что такое "пустой"? Нет элементов в списке или происходит исключение при попытке получения этого объекта?
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Леонид Семенов от 25-04-2015, 22:16:43
Я использую AutoCAD 2013.
вызов DBDictionary psDicts = (DBDictionary)t.GetObject(db.PlotSettingsDictionaryId, OpenMode.ForRead);
проходит без ошибок
Но в результате у меня "psDicts.Count = 0"
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Александр Ривилис от 25-04-2015, 22:36:03
А _PAGESETUP перед тем как выполнять это код делал? Для того, чтобы в psDicts что-то было необходимо сначала его назначить.
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Александр Ривилис от 26-04-2015, 17:02:13
Вообще же тебе нужно сначала получить список всех доступных плоттеров: http://adn-cis.org/poluchenie-vsex-dostupnyix-imen-plotterov.html
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Леонид Семенов от 28-04-2015, 19:54:24
Спасибо большое, Александр Ривилис.
Вся проблема была в _PAGESETUP. Теперь разобрался.
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Пашин Евгений от 03-05-2017, 12:26:42
Вся проблема была в _PAGESETUP. Теперь разобрался.

А что именно Вы делали с _pagesetup? Форма открылась, а что дальше?
После закрытия формы ничего не изменилось.
psDicts.Count у меня тоже = 0!
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Александр Ривилис от 03-05-2017, 12:54:28
Думаю, что должен быть назначен хотя бы один плоттер.
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Пашин Евгений от 03-05-2017, 13:04:01
Думаю, что должен быть назначен хотя бы один плоттер.

Назначен «DWG To PDF.pc3» - сойдёт? Может что-то ещё, а то опять psDicts.Count=0?

Мой код:

Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.DatabaseServices
  3. Imports Autodesk.AutoCAD.PlottingServices ' Чтобы можно было определить PlotConfigManager и всю информацию о плоттерах
  4. Public Class GALLURGY_ACCORECONSOLE_NETLOAD
  5.     <CommandMethod("GALGETCANONICALMEDIANAMESOFLAYOUTS")>
  6.     Public Sub GALGETCANONICALMEDIANAMESOFLAYOUTS()
  7.         Dim AcEditor As Autodesk.AutoCAD.EditorInput.Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
  8.         Dim AcDB As Database = AcEditor.Document.Database
  9.         Dim strPlotSetName As String = "DWG To PDF.pc3"
  10.         Dim PlotSettingExists As Boolean = False
  11.         Using tr As Transaction = AcDB.TransactionManager.StartTransaction()
  12.             Try
  13.                 Dim psDicts As DBDictionary = CType(tr.GetObject(AcDB.PlotSettingsDictionaryId, OpenMode.ForRead), DBDictionary)
  14.                 MsgBox(psDicts.Count) ' Здесь он и выдаёт 0
  15.                 For Each psDict As System.Collections.DictionaryEntry In psDicts
  16.                     Dim obj As Object = psDict.Value ' не понятно для чего эта штука нужна!!! Но оставил для чистоты эксперимента!!!
  17.                     Dim key As String = CType(psDict.Key, String)
  18.                     MsgBox(key)
  19.                     If key = strPlotSetName Then
  20.                         PlotSettingExists = True
  21.                     End If
  22.                 Next
  23.  
  24.                 If PlotSettingExists Then
  25.                     Dim plotSettingDic As DBDictionary = CType(tr.GetObject(AcDB.PlotSettingsDictionaryId, OpenMode.ForRead), DBDictionary)
  26.                     Dim setting As PlotSettings = CType(tr.GetObject(plotSettingDic.GetAt(strPlotSetName), OpenMode.ForRead), PlotSettings)
  27.                     Dim psv As PlotSettingsValidator = Autodesk.AutoCAD.DatabaseServices.PlotSettingsValidator.Current
  28.  
  29.                     psv.RefreshLists(setting)
  30.  
  31.                     Dim strMediaNameList As Specialized.StringCollection = psv.GetCanonicalMediaNameList(setting)
  32.  
  33.                     For Each str As String In strMediaNameList
  34.                         MsgBox(str)
  35.                     Next
  36.                 End If
  37.                 tr.Commit()
  38.             Catch ex As Exception
  39.                 MsgBox(ex.Message)
  40.             End Try
  41.         End Using
  42.     End Sub
  43. End Class

Windows 10, AutoCAD 2017 x64
Подгружены ссылки AcCoreMgd.dll, AcMgd.dll и AcDbMgd.dll - может что-то лишнее из них?
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Александр Ривилис от 03-05-2017, 13:43:08
Или у тебя какой-то глюк с AutoCAD или ты что-то не то делаешь (это более вероятно). Посмотри видео. Там видно, что информация о Plot Settings в словаре PlotSettingsDictionary появляется только после того, как эти установки добавлены:



Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Пашин Евгений от 03-05-2017, 14:03:05
Александр Наумович, я извиняюсь.

Добавил Набор1, теперь отобразился один элемент, настроенный на DWG To PDF.pc3. Однако он показал мне его имя, а не канонические имена форматов принтера DWG To PDF.pc3. То есть он так и не определил канонические имена форматов принтера.

И ещё, а как-то можно обойтись без этой процедуры добавления нового набора? Это не только неудобно, но и ещё странно.

И ещё мне Ваш плагин понравился, которым Вы пользуетесь - где-нибудь его можно скачать?
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Александр Ривилис от 03-05-2017, 14:53:17
И ещё мне Ваш плагин понравился, которым Вы пользуетесь - где-нибудь его можно скачать?
ARXDBG и MGDDBG - утилиты для анализа AutoCAD, чертежа и т.д. (http://adn-cis.org/forum/index.php?topic=7274.0)
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Александр Ривилис от 03-05-2017, 15:00:04
Однако он показал мне его имя, а не канонические имена форматов принтера DWG To PDF.pc3. То есть он так и не определил канонические имена форматов принтера.
Теоретически в этом коде должен был показать канонические имена:
Код - vb.net [Выбрать]
  1. Dim strMediaNameList As Specialized.StringCollection = psv.GetCanonicalMediaNameList(setting)
  2.  
  3. For Each str As String In strMediaNameList
  4.     MsgBox(str)
  5. Next
  6.  
Обратил внимание на то, что у тебя PlotSettings открывается OpenMode.ForRead, а в исходном примере OpenMode.ForWrite
Вполне возможно, что требуется открывать ForWrite

Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Александр Ривилис от 03-05-2017, 15:01:58
Пашин Евгений
Посмотри этот пример: http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-946669A9-E813-4D12-828A-44986E388AA2
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Пашин Евгений от 03-05-2017, 15:10:09
ARXDBG и MGDDBG - утилиты для анализа AutoCAD, чертежа и т.д.

Работает :) Только я не знаю где посмотреть все канонические имена форматов принтера.
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Александр Ривилис от 03-05-2017, 15:11:01
Работает :) Только я не знаю где посмотреть все канонические имена форматов принтера.
Пашин Евгений
Посмотри этот пример: http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-946669A9-E813-4D12-828A-44986E388AA2
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Пашин Евгений от 03-05-2017, 15:33:26
Посмотри этот пример: http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-946669A9-E813-4D12-828A-44986E388AA2

Работает!!! И без всяких заморочек с _pagesetup и код запредельно простой.


Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.DatabaseServices
  3. Imports Autodesk.AutoCAD.PlottingServices ' Чтобы можно было определить PlotConfigManager и всю информацию о плоттерах
  4. Public Class GALLURGY_ACCORECONSOLE_NETLOAD
  5.     <CommandMethod("GALGETCANONICALMEDIANAMESOFLAYOUTS")>
  6.     Public Sub GALGETCANONICALMEDIANAMESOFLAYOUTS()
  7.         Dim acDoc As Autodesk.AutoCAD.ApplicationServices.Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
  8.         ' Новый PlotSettings
  9.         Using plSet As PlotSettings = New PlotSettings(True)
  10.             Dim acPlSetVdr As PlotSettingsValidator = PlotSettingsValidator.Current
  11.             ' Устанавливаем плоттер и формат, НО я решил попробовать ничего в формат не добавлять!!! Только имя принтера!!!
  12.             acPlSetVdr.SetPlotConfigurationName(plSet, "DWG_To_PDF_Gallurgy.pc3", Nothing)
  13.             Dim cnt As Integer = 0
  14.             For Each mediaName As String In acPlSetVdr.GetCanonicalMediaNameList(plSet)
  15.                 ' Вывод имён по каноническому имени mediaName
  16.                 MsgBox(mediaName & " | " & acPlSetVdr.GetLocaleMediaName(plSet, cnt))
  17.                 cnt = cnt + 1
  18.             Next
  19.         End Using
  20.     End Sub
  21. End Class
  22.  

Намного проще, чем мне казалось.
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Пашин Евгений от 03-05-2017, 15:35:51
Александр Наумович, огромное Вам спасибо! Разобрался!!! У этой темы вроде бы нет решения, так может это решение отметим?!
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Пашин Евгений от 03-05-2017, 15:45:18
Я думаю, стоит и статью по данной теме переписать.
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Александр Ривилис от 03-05-2017, 16:09:03
Я думаю, стоит и статью по данной теме переписать.
Я другую статью написал: http://adn-cis.org/kak-poluchit-spisok-dostupnyix-plotterov-formatov-v-autocad.html
Название: Re: Как получить список канонических имен для плоттера?
Отправлено: Пашин Евгений от 04-05-2017, 06:34:08
Я другую статью написал: http://adn-cis.org/kak-poluchit-spisok-dostupnyix-plotterov-formatov-v-autocad.html

Вот и прекрасно.