Перейти к содержанию

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


Рекомендуемые сообщения

Этот код нормально работает в оригинале и выбрасывает исключение в 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??

Ссылка на сообщение
Поделиться на другие сайты
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);
            }
        }
    }

 

Ссылка на сообщение
Поделиться на другие сайты
1 час назад, Светлана Мирончик сказал:

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

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

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

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

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

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

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

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

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

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

Изменено пользователем doctorraz
Ссылка на сообщение
Поделиться на другие сайты
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 секунд

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

-----------

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

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

Изменено пользователем doctorraz
Ссылка на сообщение
Поделиться на другие сайты

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

если настраивать 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

 

Изменено пользователем doctorraz
Ссылка на сообщение
Поделиться на другие сайты
14 часов назад, doctorraz сказал:

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

Конечно, спасибо за обратную связь

Ссылка на сообщение
Поделиться на другие сайты
В 13.09.2021 в 20:43, doctorraz сказал:

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

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

Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, Robink сказал:

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
В 15.09.2021 в 15:06, doctorraz сказал:

чертить ты можешь хоть палочками кружочками

Чур!

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Расскажите друзьям

    Нравится Официальный форум компании Нанософт? Расскажите друзьям!
×
×
  • Создать...