Jump to content

nanoCAD при установке принтера в SetPlotConfigurationName выбрасывает исключение


Recommended Posts

Этот код нормально работает в оригинале и выбрасывает исключение в nanoCAD

#if NC
using Apps = HostMgd.ApplicationServices;
using HostMgd.ApplicationServices;
using HostMgd.EditorInput;
using Teigha.DatabaseServices;
using Rtm = Teigha.Runtime;
#else
using Rtm=Autodesk.AutoCAD.Runtime;
using Apps=Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
#endif

namespace Rivilis
{
    public class Plotters
    {
        [Rtm.CommandMethod("GetCanonicalNames")]
        public void GetCanonicalNames()
        {
            Apps.Document doc = Application.DocumentManager.MdiActiveDocument;
            if (doc == null) return;
            Editor ed = doc.Editor;
            PlotSettingsValidator psv = PlotSettingsValidator.Current;
            using (PlotSettings settings = new PlotSettings(true))
            {
                foreach (string plotterDevice in psv.GetPlotDeviceList())
                {
                    // Нас будут интересовать только плоттеры,
                    // в имени которых есть строка PDF
                    if (plotterDevice.Contains("PDF"))
                    {
                        ed.WriteMessage("\nПлоттер: \'{0}\'", plotterDevice);
                        psv.SetPlotConfigurationName(settings, plotterDevice, null);/*на этой строке
                        Вызвано исключение: "Teigha.Runtime.Exception" в hostdbmgd.dll
                        Вызвано исключение: "System.Reflection.TargetInvocationException" в mscorlib.dll*/
                        psv.RefreshLists(settings);
                        foreach (string canonocalName in psv.GetCanonicalMediaNameList(settings))
                        {
                            ed.WriteMessage("\n  Каноническое имя: \'{0}\'", canonocalName);
                        }
                    }
                }
            }
        }
    }
}

В принципе я нашел как соломки подстелить...

перед установкой принтера:

settings.CopyFrom(layout);

но как мне кажется это не совсем правильно, должно и без этого работать... в оригинале же работает...

Собственно вопрос, как сделать что бы это работало, в nano??

Link to comment
Share on other sites

21 час назад, doctorraz сказал:

psv.SetPlotConfigurationName(settings, plotterDevice, null);

Обернуть в try-catch, тогда не будет стопориться на этой ошибке и в конце выдаст все форматы бумаги pdf-принтеров

Еще такой код сработает без ошибок с тем же результатом:

[Teigha.Runtime.CommandMethod("GetCanonicalNames")]
    public void GetPDFPlotters()
    {
        //Получение ссылки на активный документ
        HostMgd.ApplicationServices.Document doc = HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
        nanoCAD.Document comDoc = doc.AcadDocument as nanoCAD.Document;

        //Получение ссылки на редактор активного документа
        HostMgd.EditorInput.Editor ed = doc.Editor;

        //Получение ссылки на активный лист документа
        OdaX.IAcadLayout activeLayout = comDoc.ActiveLayout;

        //Получение списка доступных принтеров
        List<string> printers = new List<string>(comDoc.ActiveLayout.GetPlotDeviceNames());

        foreach(string p in printers)
        {
            if (p.Contains("PDF"))
            {
                ed.WriteMessage("\nПлоттер: \'{0}\'", p);
                activeLayout.ConfigName = p;
                foreach (string cmn in activeLayout.GetCanonicalMediaNames()) 
                    ed.WriteMessage("\n  Каноническое имя: \'{0}\'", cmn);
            }
        }
    }

 

  • Like 1
  • Thanks 1
Link to comment
Share on other sites

1 час назад, Светлана Мирончик сказал:

Обернуть в try-catch, тогда не будет стопориться на этой ошибке и в конце выдаст все форматы бумаги pdf-принтеров

Хм, об этом я не подумал, был уверен, что коль исключение, значит плоттер в конфиг не встал

Спасибо проверю

upd Проверил, действительно плоттер встает в конфиг, это многое меняет,

Спасибо еще раз!

1 час назад, Светлана Мирончик сказал:

Еще такой код сработает без ошибок с тем же результатом

Через COM уже неинтересно..

Да и дольше наверное будет.. надо будет потестить если тру взлетит))

upd Try взлетел, теперь потестю0))

Edited by doctorraz
  • Like 1
Link to comment
Share on other sites

3 часа назад, doctorraz сказал:

Да и дольше наверное будет

упсс, дольше это не про нану, что СОМ, что NET...

неизменно быстрый результат (((

Цитата

Net 00:00:07.2953333

COM 00:00:07.4555951

Для сравнения оригинальный САD

Цитата

Net 00:00:01.4964241

Пока не умею, подрубать из Net COM AutoCAD, поэтому без теста COM

 

Спойлер




#if NC
using Apps = HostMgd.ApplicationServices;
using HostMgd.ApplicationServices;
using HostMgd.EditorInput;
using Teigha.DatabaseServices;
using Rtm = Teigha.Runtime;
#else
using Rtm = Autodesk.AutoCAD.Runtime;
using Apps = Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
#endif
using System.Diagnostics;
namespace Rivilis
{
    public class Plotters
    {
        [Rtm.CommandMethod("GetCanonicalNames")]
        public void GetCanonicalNames()
        {
            Apps.Document doc = Application.DocumentManager.MdiActiveDocument;
            if (doc == null) return;
            Editor ed = doc.Editor;

            PlotSettingsValidator psv = PlotSettingsValidator.Current;
            Stopwatch s = Stopwatch.StartNew();
            using (PlotSettings settings = new PlotSettings(true))
            {
                foreach (string plotterDevice in psv.GetPlotDeviceList())
                {
                    try
                    {
                        psv.SetPlotConfigurationName(settings, plotterDevice, null);
                    }
                    catch { }

                    psv.RefreshLists(settings);
                    foreach (string canonocalName in psv.GetCanonicalMediaNameList(settings))
                    { }
                }
            }
            s.Stop();
            ed.WriteMessage("Net {0}",
                s.Elapsed
                );
#if NC
            nanoCAD.Document comDoc = doc.AcadDocument as nanoCAD.Document;
            OdaX.IAcadLayout activeLayout = comDoc.ActiveLayout;
            s.Restart();
            //Получение списка доступных принтеров
            foreach (string plotterDevice in comDoc.ActiveLayout.GetPlotDeviceNames())
            {
                activeLayout.ConfigName = plotterDevice;
                foreach (string cmn in activeLayout.GetCanonicalMediaNames())
                { }
            }

            s.Stop();
            ed.WriteMessage("COM {0}",
                s.Elapsed
                );
#endif
        }
    }
}

 

хотя честно говоря считать тут секунды бесполезно... это жэж nanoпечать..

Процесс  весьма небыстрый

------------

еще побочный эффект COM, что бы было красиво надо запомнить и потом вернуть на место текущий принтер

в Net  using все разрулит (ничо не было ))

---------

PS

если написать код, что бы не было исключений, а именно

с ps.CopyFrom(layout);

то в nano обновляет за:

Цитата

Конфиг обновлен за: 00:00:07.4611046 секунд

это с учетом записи Всех плоттеров и бумаги в  текстовый файл

-----------

Однозначно это БАГА

Собственно вопрос.к ТП .. править будут???

Edited by doctorraz
  • Like 2
Link to comment
Share on other sites

рано  я обрадовался(((

если настраивать PlotSettings через PlotSettingsValidator надо каждое свойство в тру оборачивать.. /// ага OnError Resume Next, по всему коду((((это безумное время обработки, проще тогда из экселя подключаться, по времени то же будет)

мне одному кажется, что с nanoNET Api что то не то?

я конечно костыликов Try на ровном месте разложу, но как то это некрасиво получается(((

upd не разложу try , очень долго получается

ЗЫ обернул все свойства PlotSettings, настроилось сохранилось, работает, но какойто недокод получился((((

Спойлер


                    try
                    {
                        psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters);//единицы эксэпшн
                    }
                    catch { }
                    //
                    psv.SetCurrentStyleSheet(ps, "monochrome.ctb");//стиль дает настроить
                    try
                    {
                        psv.SetPlotRotation(ps, counter);// PlotRotation эксэпшн
                    }
                    catch { }
//и такой недокод дальше((((

 

------------------------------

upd

не удержался и потестил CopyFrom VS Try Cath

Спойлер

  /// <summary>
        /// Тест скорости создания настроек параметров печати CopyFrom VS Try Cath
        /// </summary>
        /// 
        [Trtm.CommandMethod("t-SpeedPagSet")]
        public void tSpeedPagSet()
        {
            App.Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            //----------------------
            Stopwatch s = new Stopwatch();
            int counter = 1000;
            
            // тест ps.CopyFrom(layout);
            s.Start();
            using (Transaction Tx = db.TransactionManager.StartTransaction())
            {
                ObjectId layoutId = LayoutManager.Current.GetLayoutId
                 (LayoutManager.Current.CurrentLayout);
                Layout layout = Tx.GetObject(layoutId, OpenMode.ForWrite) as Layout;

                for (int i = 0; i < counter; i++)
                {
                    PlotSettings ps = new PlotSettings(layout.ModelType);
                    PlotSettingsValidator psv = PlotSettingsValidator.Current;
                    ps.CopyFrom(layout);
#if NC
                    psv.SetPlotConfigurationName(ps, "Встроенный PDF-принтер", "ISO A2 (420.00 x 594.00 мм)");
#else
                    psv.SetPlotConfigurationName(ps,
                        "DWF6 ePlot.pc3", "ANSI_A_(8.50_x_11.00_Inches)");
#endif
                    psv.RefreshLists(ps);
                    psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters);
                    //
                    psv.SetCurrentStyleSheet(ps, "monochrome.ctb");//стиль monochrome.ctb
                    //проверкой ориентации форматки, крутить бумагу в нано ротатион в АС
                    psv.SetPlotRotation(ps, PlotRotation.Degrees000);
                    // https://adn-cis.org/forum/index.php?topic=10114.msg45976#msg45976
                    //TODO: 000 транслировать в DCS
                    Point2d minPoint2d = new Point2d(0.0, 0.0);//лев низ
                    Point2d maxPoint2d = new Point2d(420.0, 420.0);//прав верх 594.0
                    Extents2d points = new Extents2d(minPoint2d, maxPoint2d);
                    psv.SetPlotWindowArea(ps, points);
                    psv.SetPlotType(ps, Tds.PlotType.Window);
                    psv.SetUseStandardScale(ps, false);
                    psv.SetCustomPrintScale(ps, new CustomScale(1, 1));
                    psv.SetPlotCentered(ps, true);
                    ps.PrintLineweights = true;
                    ps.PlotSettingsName = String.Format("{0}{1}", i.ToString(), "PS");
                    ps.AddToPlotSettingsDictionary(db);
                    Tx.AddNewlyCreatedDBObject(ps, true);
                    psv.RefreshLists(ps);
                }
                Tx.Commit();
            }
            s.Stop();
            ed.WriteMessage("\nCopyFrom to {0}",
                s.Elapsed
                );


            s.Start();
            using (Transaction Tx = db.TransactionManager.StartTransaction())
            {
                ObjectId layoutId = LayoutManager.Current.GetLayoutId
                 (LayoutManager.Current.CurrentLayout);
                Layout layout = Tx.GetObject(layoutId, OpenMode.ForWrite) as Layout;

                for (int i = 0; i < counter; i++)
                {
                    PlotSettings ps = new PlotSettings(layout.ModelType);
                    PlotSettingsValidator psv = PlotSettingsValidator.Current;
#if NC
                    try { psv.SetPlotConfigurationName(ps, "Встроенный PDF-принтер", "ISO A2 (420.00 x 594.00 мм)"); }
                    catch { }

#else
                    psv.SetPlotConfigurationName(ps,
                        "DWF6 ePlot.pc3", "ANSI_A_(8.50_x_11.00_Inches)");
#endif
                    psv.RefreshLists(ps);
                    try { psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters); }
                    catch { }
                    //
                    psv.SetCurrentStyleSheet(ps, "monochrome.ctb");//стиль monochrome.ctb

                    //проверкой ориентации форматки, крутить бумагу в нано ротатион в АС
                    try { psv.SetPlotRotation(ps, PlotRotation.Degrees000); }
                    catch { }
                    // https://adn-cis.org/forum/index.php?topic=10114.msg45976#msg45976
                    //TODO: 000 транслировать в DCS
                    Point2d minPoint2d = new Point2d(0.0, 0.0);//лев низ
                    Point2d maxPoint2d = new Point2d(420.0, 420.0);//прав верх 594.0
                    Extents2d points = new Extents2d(minPoint2d, maxPoint2d);
                    try { psv.SetPlotWindowArea(ps, points); }
                    catch { }
                    try { psv.SetPlotType(ps, Tds.PlotType.Window); }
                    catch { }
                    try { psv.SetUseStandardScale(ps, false); }
                    catch { }
                    try { psv.SetCustomPrintScale(ps, new CustomScale(1, 1)); }
                    catch { }
                    try { psv.SetPlotCentered(ps, true); }
                    catch { }
                    ps.PrintLineweights = true;
                    ps.PlotSettingsName = String.Format("Try {0}{1}", i.ToString(), "PS");
                    ps.AddToPlotSettingsDictionary(db);
                    Tx.AddNewlyCreatedDBObject(ps, true);
                    psv.RefreshLists(ps);
                }
                Tx.Commit();
            }
            s.Stop();
            ed.WriteMessage("\nTryCatch to {0}",
                s.Elapsed
                );
        }

 

результат

Цитата

CopyFrom to 00:00:02.8590511

TryCatch to 00:00:05.9412292

Просьба починить PlotSettingsValidator

 

Edited by doctorraz
  • Like 2
Link to comment
Share on other sites

В 13.09.2021 в 20:43, doctorraz сказал:

мне одному кажется, что с nanoNET Api что то не то?

С печатью если только, в остальном хорошо.

Link to comment
Share on other sites

2 часа назад, Robink сказал:

С печатью если только, в остальном хорошо

офф Не сомневаюсь, пока на печати завис 

По крайней мере в моей конторке чертить ты можешь хоть палочками кружочками, но на бумаге должно быть красивоbiglol.gif.dcce0b3e66842cf4b4d723439f321f38.gif

т.е. печать наше все

Link to comment
Share on other sites

  • 1 year later...
В 14.09.2021 в 11:08, Светлана Мирончик сказал:

спасибо за обратную связь

нана 6177, воз и ныне там((((

  • Like 1
Link to comment
Share on other sites

а что если попробовать вместо

psv.SetPlotConfigurationName(settings, plotterDevice, null);

написать

psv.SetPlotConfigurationName(settings, plotterDevice, ""); 

в смысле, вместо null подсунуть пустую строку. а то там какой-то сомнительный каст в коде...
 

  • Like 2
Link to comment
Share on other sites

12 минут назад, Lion007 сказал:

вместо null подсунуть пустую строку. а то там какой-то сомнительный каст в коде...

Спасибо попробую, но

если настраивать пространство, layout или модель , то null эксэпшн не выбрасывает, а вот если настраивать просто конфигурацию в пространстве то эксепшен, хотя настройки применяются

Edited by doctorraz
Link to comment
Share on other sites

2 часа назад, doctorraz сказал:

немного разгребусь на работе скину тестовый примерчик

не надо, я из первого поста взял :)
в общем, посмотрел я, в чем засада... null ни при чем, это я зря его заподозрил.
а дело в том, что надо иногда смотреть на сообщения об ошибках :) (это я в основном себе, но и прочим может пригодиться)
честно было написано - прилетел эксцепшен eNoDatabase. и прилетел он совершенно, в общем-то, законно - у плот-сеттингов, которым пытаются сделать SetPlotConfigurationName датабэйзу взяться неоткуда - он же new!
самое смешное, что единственный честный способ с этим бороться - это добавить эти плот-сеттинги в нужный датабэйз. то есть пишем что-то примерно такое

using (PlotSettings settings = new PlotSettings(true))
{
  db.AddDBObject(settings); // временно добавляем - чтобы былО
  // blah-blah
  settings.Erase(); // удаляем - оно нам там на самом деле не нужно
}

насколько правомочно требование, чтобы плот-сеттинги для SetPlotConfigurationName были в добавлены в чертеж - бог весть. Судя по коду, который при этом выполняется - то этот самый датабэйз там на самом деле нужен, и ругается оно совершенно законно. Так что это, в общем, не баг - это разница в поведении.

вообще, уже было неоднократно отмечено, что нанокадские АПИ зачастую более "жестки" в требованиях - АС некоторые вещи (пусть даже и не очень правильные) прощает, а NC - нет... но это уж так сложилось исторически.

зы что характерно, в плюсовом коде никаких эксцепшенов не летит, а возвращается честный эррор-код eNoDatabase. ну а за подарочки в виде эксцепшенов - надо благодарить того придурка, который эти эксцепшены придумал. ну и заодно тех его последователей, которые их норовят повсюду применить.
такая вот хистория...

  • Like 1
  • Thanks 1
Link to comment
Share on other sites

53 минуты назад, Lion007 сказал:

SetPlotConfigurationName датабэйзу взяться неоткуда - он же new!

Но при этом настройка применяется..

Т.е. исключения как бы нет, коль код выполнился..

Иль крест снять иль трусы надеть... определиться бы 

  • Haha 1
Link to comment
Share on other sites

а дело просто в том, что там делается много-много всего. а эксцепшен вылетает уже в самом конце, при попытке что-то там в этом плотсеттинге датабэйзно-специфическое донастроить.

  • Like 1
Link to comment
Share on other sites

2 минуты назад, Lion007 сказал:

а дело просто в том, что там делается много-много всего. а эксцепшен вылетает уже в самом конце, при попытке что-то там в этом плотсеттинге датабэйзно-специфическое донастроить

Возможно создатели оригинала не просто так , сделали именно так?

Кстати через COM исключения нет.. там поведение более приближено к оригиналу

В принципе ты подсказал, как обойти..

Крстылем больше, меньше.. некритично

добавлено через 2 минуты

И всежэж.  Коль настройка применилась.. почему исключение?

Транзакцию оно конечно откатит, но аналогичное поведение вне транзакции.. выскочило исключение, но операция выполнена.. это как?

добавлено через 3 минут

Просто интересно сколько еще таких граблей в наноапи раскидано...

добавлено через 5 минут

Все жэж это бага

Если исключение значит не выполнено

Если выполнено зачем исключение?

Чините

добавлено через 7 минут

Хотя коль все настроилось... логичней убрать эксепшн

Link to comment
Share on other sites

ну так я и не говорю, что это прям правильно :)
а почему оно так получается... фиг его знает, если честно! вариантов может быть несколько, но если меняются какие-то апликационные состояния (а они-таки запросто могут меняться - те же списки форматов пишется в регистри) - то транзакция ни разу не поможет, транзакция-то на датабэйз!
а логика происходящего... ну, примерно как в случае неаккуратного пересоздания файла.
навроде
bool recreateFileXXX(filename)
{
  erase(filename); // удаляем старый, все OK
  return createNewXXX(filename); // а тут не получилось, хорошо если не упало
}

и получится, что старый файл удалили, а новый не создался, т.е. оно выполнилось наполовину :)
так и тут - сеттинги есть, но настроились только частично.
ну и от себя могу добавить, что этот самый плотсеттингвалидатор - штука дюже гнилая и непонятная... утверждать, что там все как надо - я ни разу не пытаюсь.
исключительно рассказал откуда ошибка и как побороть! :)

  • Like 2
Link to comment
Share on other sites

22 часа назад, Lion007 сказал:

исключительно рассказал откуда ошибка и как побороть!

спасибо еще раз, тем боле будет работать там и тут!!!

 Upd заходи в эту ветку почаще..

Где ты появляешься в API просветление происходит!

Edited by doctorraz
  • Like 1
Link to comment
Share on other sites

В 19.11.2022 в 17:22, doctorraz сказал:

Все жэж это бага

Если исключение значит не выполнено

Если выполнено зачем исключение?

Чините

Ох допросишься - будет исключение и работать не будет :D:offtopic:

  • Haha 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...