| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Задание ориентации листа при печати

Задание ориентации листа при печати

Ответ
Поиск в этой теме
Непрочитано 17.08.2012, 08:02 #1
Задание ориентации листа при печати
Rask
 
Регистрация: 17.08.2012
Сообщений: 19

Помогите разобраться. Имеется рамка с альбомной ориентацией. На печать рамка выходит в книжной ориентации. Как я понимаю после задания параметров (печать ограниченной области), система должна сама определить ориентацию печати в PlotSetting.CanonicalMediaName. Пример кода:

psv.SetPlotWindowArea(ps, ext);
psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Window);
psv.SetUseStandardScale(ps, true);
psv.SetStdScaleType(ps, StdScaleType.ScaleToFit);
psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters);
psv.SetPlotCentered(ps, true);

psv.SetPlotConfigurationName(ps, PrintSetting.PrinterA4, null);

psv.RefreshLists(ps);

psv.SetCanonicalMediaName(ps, ps.CanonicalMediaName);

if (PrintSetting.monochrom)
psv.SetCurrentStyleSheet(ps, "monochrome.ctb");
Просмотров: 6421
 
Непрочитано 17.08.2012, 08:34
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


Язык программирования - тайна.
Под какое ПО пишется модуль - тайна (может, под свое приложение работаешь, может под Excel - кто ж его знает!)
Что такое и как объявляются psv, ps, ext и т.д. - тайна.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.08.2012, 09:25
#3
Rask


 
Регистрация: 17.08.2012
Сообщений: 19


И не тайна вовсе. Пишу плагин под Autocad на C#.
Полный текст функции
Код:
[Выделить все]
 private static bool PrintA3A4(Document acDoc, Transaction trans, Extents2d ext)
{
            acDoc.SendStringToExecute("_.ucs М , ", true, false, false);

            Point3d LeftDownPnt = new Point3d(ext.MinPoint[0], ext.MinPoint[1], 0);
            Point3d UpRightPnt = new Point3d(ext.MaxPoint[0], ext.MaxPoint[1], 0);
            Utility.ZoomWin(acDoc.Editor, LeftDownPnt, UpRightPnt);

            /// Строка с Entities
            BlockTableRecord btr = (BlockTableRecord)trans.GetObject(acDoc.Database.CurrentSpaceId, OpenMode.ForRead);

            /// Текущий лист (Рабочее поле - Model или Лист - Layout)
            Layout lo = (Layout)trans.GetObject(btr.LayoutId, OpenMode.ForRead);

            short bgPlot = (short)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("BACKGROUNDPLOT");

            /// Не забывать устанавливать переменную BACKGROUNDPLOT в 0, чтобы не было фоновой печати
            Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", 0);

            /// Необходим объект PlotInfo связанный с листом (Layout)
            PlotInfo pi = new PlotInfo();
            pi.Layout = btr.LayoutId;

            /// Необходим объект PlotSettings основанный на настройках листа Layout и которые мы впоследствии настроим
            PlotSettings ps = new PlotSettings(lo.ModelType);
            ps.CopyFrom(lo);

            /// PlotSettingsvalidator помогает создать действительный объект PlotSettings
            PlotSettingsValidator psv = PlotSettingsValidator.Current;

            /// Мы распечатаем по границам, центровано и с масштабом соответсвующим размеру области печати
            psv.SetPlotWindowArea(ps, ext);
            psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Window);
            psv.SetUseStandardScale(ps, true);
            psv.SetStdScaleType(ps, StdScaleType.ScaleToFit);
            psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters);
            psv.SetPlotCentered(ps, true);

            psv.SetPlotConfigurationName(ps, PrintSetting.PrinterA4, null);

            psv.RefreshLists(ps);

            psv.SetCanonicalMediaName(ps, ps.CanonicalMediaName);

            if (PrintSetting.monochrom)
                psv.SetCurrentStyleSheet(ps, "monochrome.ctb");

            /// Необходимо связать PlotInfo с PlotSettings и затем проверить его
            pi.OverrideSettings = ps;
            PlotInfoValidator piv = new PlotInfoValidator();
            piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;
            piv.Validate(pi);

            PlotEngine ple = PlotFactory.CreatePublishEngine();

            /// Создать диалог Progress для обеспечения информацией и пользователю отменить печать
            PlotProgressDialog ppd = new PlotProgressDialog(true, 1, true);
            try
            {
                using (ppd)
                {
                    ppd.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Custom Preview Progress");
                    ppd.set_PlotMsgString(PlotMessageIndex.SheetName, acDoc.Name.Substring(acDoc.Name.LastIndexOf("\\") + 1));
                    ppd.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "Cancel Job");
                    ppd.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Cancel Sheet");
                    ppd.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress");
                    ppd.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress");

                    ppd.LowerPlotProgressRange = 0;
                    ppd.UpperPlotProgressRange = 100;
                    ppd.PlotProgressPos = 0;

                    /// Для определения было ли уведомление начала печати успешным
                    ppd.OnBeginPlot();
                    ppd.IsVisible = true;
                    /// Вызвать эту функцию перед началом печати
                    ple.BeginPlot(ppd, null);

                    /// Печатаем на "железный "принтер
                    ple.BeginDocument(pi, acDoc.Name, null, 1, false, null);
    
                    // Который содерит один документ

                    ppd.OnBeginSheet();

                    ppd.LowerSheetProgressRange = 0;
                    ppd.UpperSheetProgressRange = 100;
                    ppd.SheetProgressPos = 0;

                    PlotPageInfo ppi = new PlotPageInfo();
                    ple.BeginPage(ppi, pi, true, null);
                    ple.BeginGenerateGraphics(null);
                    ppd.SheetProgressPos = 50;
                    ple.EndGenerateGraphics(null);

                    ///// Закончить лист

                    ple.EndPage(null);

                    ppd.SheetProgressPos = 100;
                    ppd.OnEndSheet();

                    // Finish the document

                    ple.EndDocument(null);

                    // And finish the plot

                    ppd.PlotProgressPos = 100;
                    ppd.OnEndPlot();
                    ple.EndPlot(null);
                }
            }
            catch
            {

            }
            ppd.Destroy();
            ple.Destroy();
            /// Вернуть BACKGROUNDPLOT начальное значение
            Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", bgPlot);
            return true;
}

Последний раз редактировалось Кулик Алексей aka kpblc, 17.08.2012 в 09:35.
Rask вне форума  
 
Непрочитано 17.08.2012, 10:59
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


В лиспе есть функция vla-put-PlotRotation, в C# ищите, наверное, SetPlotRotation. 0 градусов - книжная, 90 - альбомная, 180 - книжная перевернутая, 270 - альбомная перевернутая. Как-то так вроде.
Do$ вне форума  
 
Автор темы   Непрочитано 17.08.2012, 11:18
#5
Rask


 
Регистрация: 17.08.2012
Сообщений: 19


Я уже находил эту функцию Только я думаю есть другие средства (т.е. не вручную) задавать ориентацию печати. У autocad'а происходит автоматическое определение ориентации и формата печати после задания параметров объекта PlotSeetings. Может и ошибаюсь. Вызов psv.SetPlotConfigurationName(ps, PrintSetting.PrinterA4, null) как я думаю задаёт в ps.CanonicalMediaName формат с ориентацией. Но почему-то задаётся не так как хочется.
Rask вне форума  
 
Непрочитано 18.08.2012, 00:06
#6
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Что бросается в глаза
Эта строка :

acDoc.SendStringToExecute("_.ucs М , ", true, false, false);
есть асинхронный вызов команды, что можно сделать:
вызвать документ из пространства AcadApplication
(пространство имен AutoCAD.Interop)
AcadDocument acAppDoc= acDoc as AcadDocument;
acAppDoc.SendCommand("_.ucs М , ");
что-то вроде этого
См. также:
http://adndevblog.typepad.com/autoca...nt-object.html
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 21.08.2012, 14:38
#7
Rask


 
Регистрация: 17.08.2012
Сообщений: 19


Раз уж коснулись этой команды. Подскажи пожалуйста команду перевода текущей системы координат к мировой, не используя командной строки.
Rask вне форума  
 
Непрочитано 21.08.2012, 16:29
#8
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
<phrase 1=


Rask, этот пост может помочь
bargool вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Задание ориентации листа при печати

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение Wipeout (Маскировка) при печати из листа. plaz AutoCAD 14 15.10.2019 11:21
Публикация листов подшивки с разными параметрами печати Vildar AutoCAD 23 28.01.2018 05:31
Толщины линий при печати из листа (ВЭ) nem AutoCAD 10 25.11.2011 14:16
При печати из пространства листа в режиме "РАМКА" (когда выделяем область печати) не видна ранее выделенная область печати! Где это можно настроить?? sergkovr AutoCAD 22 22.05.2011 19:23
задание области печати и экспорт в пдф dead_lyric AutoCAD 6 12.03.2010 10:47