doctorraz Posted September 12, 2021 Report Share Posted September 12, 2021 Этот код нормально работает в оригинале и выбрасывает исключение в 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?? Quote Link to comment Share on other sites More sharing options...
Светлана Мирончик Posted September 13, 2021 Report Share Posted September 13, 2021 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 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted September 13, 2021 Author Report Share Posted September 13, 2021 (edited) 1 час назад, Светлана Мирончик сказал: Обернуть в try-catch, тогда не будет стопориться на этой ошибке и в конце выдаст все форматы бумаги pdf-принтеров Хм, об этом я не подумал, был уверен, что коль исключение, значит плоттер в конфиг не встал Спасибо проверю upd Проверил, действительно плоттер встает в конфиг, это многое меняет, Спасибо еще раз! 1 час назад, Светлана Мирончик сказал: Еще такой код сработает без ошибок с тем же результатом Через COM уже неинтересно.. Да и дольше наверное будет.. надо будет потестить если тру взлетит)) upd Try взлетел, теперь потестю0)) Edited September 13, 2021 by doctorraz 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted September 13, 2021 Author Report Share Posted September 13, 2021 (edited) 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 September 13, 2021 by doctorraz 2 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted September 13, 2021 Author Report Share Posted September 13, 2021 (edited) рано я обрадовался((( если настраивать 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 September 14, 2021 by doctorraz 2 Quote Link to comment Share on other sites More sharing options...
Светлана Мирончик Posted September 14, 2021 Report Share Posted September 14, 2021 14 часов назад, doctorraz сказал: Собственно вопрос.к ТП .. править будут??? Конечно, спасибо за обратную связь Quote Link to comment Share on other sites More sharing options...
Robink Posted September 15, 2021 Report Share Posted September 15, 2021 В 13.09.2021 в 20:43, doctorraz сказал: мне одному кажется, что с nanoNET Api что то не то? С печатью если только, в остальном хорошо. Quote Link to comment Share on other sites More sharing options...
doctorraz Posted September 15, 2021 Author Report Share Posted September 15, 2021 2 часа назад, Robink сказал: С печатью если только, в остальном хорошо офф Не сомневаюсь, пока на печати завис По крайней мере в моей конторке чертить ты можешь хоть палочками кружочками, но на бумаге должно быть красиво т.е. печать наше все Quote Link to comment Share on other sites More sharing options...
Kreator Posted September 17, 2021 Report Share Posted September 17, 2021 В 15.09.2021 в 15:06, doctorraz сказал: чертить ты можешь хоть палочками кружочками Чур! 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted November 14, 2022 Author Report Share Posted November 14, 2022 В 14.09.2021 в 11:08, Светлана Мирончик сказал: спасибо за обратную связь нана 6177, воз и ныне там(((( 1 Quote Link to comment Share on other sites More sharing options...
Lion007 Posted November 19, 2022 Report Share Posted November 19, 2022 а что если попробовать вместо psv.SetPlotConfigurationName(settings, plotterDevice, null); написать psv.SetPlotConfigurationName(settings, plotterDevice, ""); в смысле, вместо null подсунуть пустую строку. а то там какой-то сомнительный каст в коде... 2 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted November 19, 2022 Author Report Share Posted November 19, 2022 (edited) 12 минут назад, Lion007 сказал: вместо null подсунуть пустую строку. а то там какой-то сомнительный каст в коде... Спасибо попробую, но если настраивать пространство, layout или модель , то null эксэпшн не выбрасывает, а вот если настраивать просто конфигурацию в пространстве то эксепшен, хотя настройки применяются Edited November 19, 2022 by doctorraz Quote Link to comment Share on other sites More sharing options...
Lion007 Posted November 19, 2022 Report Share Posted November 19, 2022 это надо на натуре смотреть - с какого перепуга оно себя так ведет... Quote Link to comment Share on other sites More sharing options...
doctorraz Posted November 19, 2022 Author Report Share Posted November 19, 2022 @Lion007 немного разгребусь на работе скину тестовый примерчик Quote Link to comment Share on other sites More sharing options...
Lion007 Posted November 19, 2022 Report Share Posted November 19, 2022 2 часа назад, doctorraz сказал: немного разгребусь на работе скину тестовый примерчик не надо, я из первого поста взял в общем, посмотрел я, в чем засада... null ни при чем, это я зря его заподозрил. а дело в том, что надо иногда смотреть на сообщения об ошибках (это я в основном себе, но и прочим может пригодиться) честно было написано - прилетел эксцепшен eNoDatabase. и прилетел он совершенно, в общем-то, законно - у плот-сеттингов, которым пытаются сделать SetPlotConfigurationName датабэйзу взяться неоткуда - он же new! самое смешное, что единственный честный способ с этим бороться - это добавить эти плот-сеттинги в нужный датабэйз. то есть пишем что-то примерно такое using (PlotSettings settings = new PlotSettings(true)) { db.AddDBObject(settings); // временно добавляем - чтобы былО // blah-blah settings.Erase(); // удаляем - оно нам там на самом деле не нужно } насколько правомочно требование, чтобы плот-сеттинги для SetPlotConfigurationName были в добавлены в чертеж - бог весть. Судя по коду, который при этом выполняется - то этот самый датабэйз там на самом деле нужен, и ругается оно совершенно законно. Так что это, в общем, не баг - это разница в поведении. вообще, уже было неоднократно отмечено, что нанокадские АПИ зачастую более "жестки" в требованиях - АС некоторые вещи (пусть даже и не очень правильные) прощает, а NC - нет... но это уж так сложилось исторически.зы : что характерно, в плюсовом коде никаких эксцепшенов не летит, а возвращается честный эррор-код eNoDatabase. ну а за подарочки в виде эксцепшенов - надо благодарить того придурка, который эти эксцепшены придумал. ну и заодно тех его последователей, которые их норовят повсюду применить. такая вот хистория... 1 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted November 19, 2022 Author Report Share Posted November 19, 2022 53 минуты назад, Lion007 сказал: SetPlotConfigurationName датабэйзу взяться неоткуда - он же new! Но при этом настройка применяется.. Т.е. исключения как бы нет, коль код выполнился.. Иль крест снять иль трусы надеть... определиться бы 1 Quote Link to comment Share on other sites More sharing options...
Lion007 Posted November 19, 2022 Report Share Posted November 19, 2022 а дело просто в том, что там делается много-много всего. а эксцепшен вылетает уже в самом конце, при попытке что-то там в этом плотсеттинге датабэйзно-специфическое донастроить. 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted November 19, 2022 Author Report Share Posted November 19, 2022 2 минуты назад, Lion007 сказал: а дело просто в том, что там делается много-много всего. а эксцепшен вылетает уже в самом конце, при попытке что-то там в этом плотсеттинге датабэйзно-специфическое донастроить Возможно создатели оригинала не просто так , сделали именно так? Кстати через COM исключения нет.. там поведение более приближено к оригиналу В принципе ты подсказал, как обойти.. Крстылем больше, меньше.. некритично добавлено через 2 минуты И всежэж. Коль настройка применилась.. почему исключение? Транзакцию оно конечно откатит, но аналогичное поведение вне транзакции.. выскочило исключение, но операция выполнена.. это как? добавлено через 3 минут Просто интересно сколько еще таких граблей в наноапи раскидано... добавлено через 5 минут Все жэж это бага Если исключение значит не выполнено Если выполнено зачем исключение? Чините добавлено через 7 минут Хотя коль все настроилось... логичней убрать эксепшн Quote Link to comment Share on other sites More sharing options...
Lion007 Posted November 19, 2022 Report Share Posted November 19, 2022 ну так я и не говорю, что это прям правильно а почему оно так получается... фиг его знает, если честно! вариантов может быть несколько, но если меняются какие-то апликационные состояния (а они-таки запросто могут меняться - те же списки форматов пишется в регистри) - то транзакция ни разу не поможет, транзакция-то на датабэйз! а логика происходящего... ну, примерно как в случае неаккуратного пересоздания файла. навроде bool recreateFileXXX(filename) { erase(filename); // удаляем старый, все OK return createNewXXX(filename); // а тут не получилось, хорошо если не упало } и получится, что старый файл удалили, а новый не создался, т.е. оно выполнилось наполовину так и тут - сеттинги есть, но настроились только частично. ну и от себя могу добавить, что этот самый плотсеттингвалидатор - штука дюже гнилая и непонятная... утверждать, что там все как надо - я ни разу не пытаюсь. исключительно рассказал откуда ошибка и как побороть! 2 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted November 19, 2022 Author Report Share Posted November 19, 2022 (edited) 22 часа назад, Lion007 сказал: исключительно рассказал откуда ошибка и как побороть! спасибо еще раз, тем боле будет работать там и тут!!! Upd заходи в эту ветку почаще.. Где ты появляешься в API просветление происходит! Edited November 20, 2022 by doctorraz 1 Quote Link to comment Share on other sites More sharing options...
Kreator Posted November 20, 2022 Report Share Posted November 20, 2022 В 19.11.2022 в 17:22, doctorraz сказал: Все жэж это бага Если исключение значит не выполнено Если выполнено зачем исключение? Чините Ох допросишься - будет исключение и работать не будет 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.