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

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

BRICSCAD2014. Печать из модели в PDF

Ответ
Поиск в этой теме
Непрочитано 08.08.2018, 10:37 #1
BRICSCAD2014. Печать из модели в PDF
veb86
 
Проектировщик электрических сетей
 
Пенза
Регистрация: 17.01.2014
Сообщений: 117

Здравствуйте! Наш проектный институт коснулась эта PDF напасть, теперь всех разработчиков заставляют PDFить самим по листам, склеивать и сдавать. Мной четыре года назад был разработан модуль разбиения по листам из модели. Модуль кустарный но устраивает. Сейчас встал вопрос к модулю прикрутить печаталку ПДФ. Полазив в интернете нашел вот такой код:
Код:
[Выделить все]
    using System;
    using System.Globalization;
    using System.Linq;
    using System.Text.RegularExpressions;
    using Autodesk.AutoCAD.ApplicationServices;
    using Autodesk.AutoCAD.DatabaseServices;
    using Autodesk.AutoCAD.Geometry;
    using Autodesk.AutoCAD.LayerManager;
    using Autodesk.AutoCAD.PlottingServices;
    using Autodesk.AutoCAD.Runtime;
    using System.Runtime.InteropServices;
    using Exception = System.Exception;
    using PlotType = Autodesk.AutoCAD.DatabaseServices.PlotType;
     
    namespace AutocadTestProject {
        public class AutocadTest : IExtensionApplication {
          [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedTrans")]
          static extern int acedTrans13(double[] point, IntPtr fromRb,  IntPtr toRb, int disp, double[] result);
          [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedTrans")]
          static extern int acedTrans12(double[] point, IntPtr fromRb, IntPtr toRb,  int disp, double[] result);
          static int acedTrans(double[] point, IntPtr fromRb, IntPtr toRb, int disp, double[] result)
          {
            return Application.Version.Major > 12 ?
              acedTrans13(point, fromRb, toRb, disp, result) :
              acedTrans12(point, fromRb, toRb, disp, result);
          }
     
            public string DocumentName;
     
            [CommandMethod("PrintTest1")]
            public void Test1() {
                var scale = 50;
                var doc = Application.DocumentManager.MdiActiveDocument;
                DocumentName = doc.Name;
                try {
                    using (doc.LockDocument()) {
                        using (var tr = doc.TransactionManager.StartTransaction()) {
                            var db = doc.Database;
                            using (var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable) {
                                if (bt == null) throw new Exception("block table is null");
                                using (var model_space = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord) {
                                    if (model_space == null) throw new Exception("model space is null");
                                    using (var layout = tr.GetObject(model_space.LayoutId, OpenMode.ForRead) as Layout) {
                                        if (layout == null) throw new Exception("layout is null");
                                        SetPlotSettingsAndPrint(@"DWG to PDF.pc3", layout, scale);
                                    }
                                }
                            }
                            tr.Commit();
                        }
                    }
                } catch (Exception exception) {
                    doc.Editor.WriteMessage("Exception: " + exception.Message);
                }
            }
     
            public void SetPlotSettingsAndPrint(string plotter_name, Layout layout, double scale, int copy_count = 1) {
                var psv = PlotSettingsValidator.Current;
                using (var ps = new PlotSettings(layout.ModelType)) {
                    ps.CopyFrom(layout);
                    psv.SetPlotConfigurationName(ps, plotter_name, null);
                    psv.RefreshLists(ps);
                    var media_name = SetClosestMediaName(ps, new Point2d(210, 297));
                    if (String.IsNullOrEmpty(media_name)) {
                        throw new Exception("Paper format not found");
                    }
                    psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters);
                    psv.SetPlotOrigin(ps, Point2d.Origin);
                    psv.SetUseStandardScale(ps, false);
                    psv.SetCustomPrintScale(ps, new CustomScale(1, 1.004 * scale));
                    psv.SetPlotRotation(ps, ps.PlotRotation == PlotRotation.Degrees000 ? PlotRotation.Degrees180 : PlotRotation.Degrees270);
                    Point3d p1 = new Point3d(0.126985232607694, -0.501646732562222, 0);
                    Point3d p2 = new Point3d(10500.1269852326, 14849.4983532674, 0);
     
                    ResultBuffer rbFrom = new ResultBuffer(new TypedValue(5003, 0)),
                                 rbTo =   new ResultBuffer(new TypedValue(5003, 2));
                    double[] p1res = new double[] { 0, 0, 0 };
                    double[] p2res = new double[] { 0, 0, 0 };
                    acedTrans(p1.ToArray(), rbFrom.UnmanagedObject, rbTo.UnmanagedObject,  0, p1res);
                    acedTrans(p2.ToArray(), rbFrom.UnmanagedObject, rbTo.UnmanagedObject,  0, p2res);
                    psv.SetPlotWindowArea(ps, new Extents2d(p1res[0], p1res[1], p2res[0], p2res[1]));
                    psv.SetPlotType(ps, PlotType.Window);
    //                psv.SetPlotCentered(ps, info.PrintCenteredUse);
                    ps.PrintLineweights = true;
                    for (var i = 0; i < copy_count; i++) {
                        PrintLayout(ps, layout.ObjectId, layout.LayoutName, @"c:\temp.pdf");
                    }
                }
            }
     
            private class SelectedMedia {
                public double Offset = 0.0;
                public string Name = "";
                public PlotRotation Rotation = PlotRotation.Degrees000;
     
                public void Update(string name, double offset, PlotRotation rotation_type) {
                    Name = name;
                    Offset = offset;
                    Rotation = rotation_type;
                }
            }
     
            public string SetClosestMediaName(PlotSettings ps, Point2d need_layout_size, bool match_printable_area = true) {
                var psv = PlotSettingsValidator.Current;
                psv.SetUseStandardScale(ps, false);
                psv.SetStdScaleType(ps, StdScaleType.ScaleToFit);
                psv.RefreshLists(ps);
     
                var canonical_media_name_list = psv.GetCanonicalMediaNameList(ps);
                var selected = new SelectedMedia {
                    Offset = 0.0,
                    Name = "",
                    Rotation = PlotRotation.Degrees000,
                };
     
                foreach (var name in canonical_media_name_list) {
                    var width = 0.0;
                    var height = 0.0;
                    var fast_size = true;
                    try {
                        var locale_name = psv.GetLocaleMediaName(ps, name);
                        var size = GetSizeByLocaleMediaName(locale_name);
                        width = size.X;
                        height = size.Y;
                    } catch {
                        psv.SetCanonicalMediaName(ps, name);
                        psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters);
                        width = ps.PlotPaperSize.X;
                        height = ps.PlotPaperSize.Y;
                        fast_size = false;
                    }
     
                    var rotation_type = width + 0.1 < need_layout_size.X || height + 0.1 < need_layout_size.Y ? PlotRotation.Degrees090 : PlotRotation.Degrees000;
                    var offset = Math.Abs(width * height - need_layout_size.X * need_layout_size.Y);
                    if (String.IsNullOrEmpty(selected.Name) || offset < selected.Offset) {
                        selected.Update(name, offset, rotation_type);
                    }
                    if (rotation_type == PlotRotation.Degrees090 && (height < need_layout_size.X || width < need_layout_size.Y)) continue;
                    if (fast_size) {
                        psv.SetCanonicalMediaName(ps, name);
                        psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters);
                        width = ps.PlotPaperSize.X;
                        height = ps.PlotPaperSize.Y;
                    }
                    if (match_printable_area) {
                        width -= (ps.PlotPaperMargins.MinPoint.X + ps.PlotPaperMargins.MaxPoint.X);
                        height -= (ps.PlotPaperMargins.MinPoint.Y + ps.PlotPaperMargins.MaxPoint.Y);
                    }
                    offset = Math.Abs(width * height - need_layout_size.X * need_layout_size.Y);
     
                    if (String.IsNullOrEmpty(selected.Name) || offset < selected.Offset) {
                        selected.Update(name, offset, rotation_type);
                        if (Math.Abs(selected.Offset) < 0.01) break;
                    }
                }
     
                psv.SetCanonicalMediaName(ps, selected.Name);
                psv.SetPlotRotation(ps, selected.Rotation);
                return psv.GetLocaleMediaName(ps, selected.Name);
            }
     
            private Point2d GetSizeByLocaleMediaName(string locale_media_name) {
                var reg = new Regex(@"^.+?\((\d+(?:[,.]\d*)?)[^\d]+(\d+(?:[,.]\d*)?)[^\d]+\)$");
                if (!reg.IsMatch(locale_media_name)) {
                    locale_media_name = String.Format("temp({0})", locale_media_name);
                }
                var matches = reg.Matches(locale_media_name);
                var x = Convert.ToDouble(matches[0].Groups[1].Value.Replace(",", "."), NumberFormatInfo.InvariantInfo);
                var y = Convert.ToDouble(matches[0].Groups[2].Value.Replace(",", "."), NumberFormatInfo.InvariantInfo);
                var point = new Point2d(x, y);
                return point;
            }
     
            public void PrintLayout(PlotSettings plot_settings, ObjectId layout_id, string layout_name, string filename = "") {
                var bg_plot = Application.GetSystemVariable("BACKGROUNDPLOT");
                try {
                    Application.SetSystemVariable("BACKGROUNDPLOT", 0);
     
                    if (PlotFactory.ProcessPlotState != ProcessPlotState.NotPlotting) throw new Exception("Плоттер в данный момент занят");
                    using (var plot_info = new PlotInfo {Layout = layout_id}) {
                        plot_info.OverrideSettings = plot_settings;
                        Print(layout_name, plot_info, filename);
                    }
     
                } finally {
                    Application.SetSystemVariable("BACKGROUNDPLOT", bg_plot);
                }
            }
     
            protected void Print(string layout_name, PlotInfo plot_info, string filename) {
                using (var plot_info_validator = new PlotInfoValidator {MediaMatchingPolicy = MatchingPolicy.MatchEnabled}) {
                    plot_info_validator.Validate(plot_info);
                }
                using (var plot_engine = PlotFactory.CreatePublishEngine()) {
                    using (var plot_dialog = new PlotProgressDialog(false, 1, true)) {
                        plot_dialog.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Печать листа");
                        plot_dialog.set_PlotMsgString(PlotMessageIndex.SheetName, String.Format(" Печатается лист : {0}", layout_name));
                        plot_dialog.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Отмена печати");
                        plot_dialog.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Выполнение печати:");
     
                        plot_dialog.LowerPlotProgressRange = 0;
                        plot_dialog.UpperPlotProgressRange = 100;
                        plot_dialog.PlotProgressPos = 0;
     
                        plot_dialog.OnBeginPlot();
                        plot_dialog.IsVisible = true;
     
                        plot_engine.BeginPlot(plot_dialog, null);
                        plot_engine.BeginDocument(plot_info, DocumentName, null, 1, !String.IsNullOrEmpty(filename), filename);
     
                        plot_dialog.OnBeginSheet();
                        plot_dialog.LowerSheetProgressRange = 0;
                        plot_dialog.UpperSheetProgressRange = 100;
                        plot_dialog.SheetProgressPos = 0;
     
                        using (var plot_page_info = new PlotPageInfo()) {
                            plot_engine.BeginPage(plot_page_info, plot_info, true, null);
                            plot_engine.BeginGenerateGraphics(null);
                            plot_dialog.SheetProgressPos = 50;
                            plot_engine.EndGenerateGraphics(null);
                            plot_engine.EndPage(null);
                        }
     
                        plot_dialog.SheetProgressPos = 100;
                        plot_dialog.OnEndSheet();
     
                        plot_engine.EndDocument(null);
     
                        plot_dialog.PlotProgressPos = 100;
                        plot_dialog.OnEndPlot();
                        plot_engine.EndPlot(null);
                    }
                }
            }
     
            public void Initialize() {
                    
            }
     
            public void Terminate() {
                
            }
        }
    }
автор Александр Ривилис
Как я понял с небольшими доработками, а именно подача координат и выбор размеров листов, он меня должен был полностью удовлетворить если бы не одно но... Мы используем Bricscad...
Первая проблема отсутствие в брикскаде все что касается plot_dialog, я как понял это диалоговое окно, для моего кустарного модуля такая роскошь особо не нужна, комментами выпилил.
Вторая и самая плохая проблема, в коде используется вот такаие строчки:
Код:
[Выделить все]
[DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedTrans")]
      static extern int acedTrans13(double[] point, IntPtr fromRb,  IntPtr toRb, int disp, double[] result);
      [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedTrans")]
      static extern int acedTrans12(double[] point, IntPtr fromRb, IntPtr toRb,  int disp, double[] result);
      static int acedTrans(double[] point, IntPtr fromRb, IntPtr toRb, int disp, double[] result)
      {
        return Application.Version.Major > 12 ?
          acedTrans13(point, fromRb, toRb, disp, result) :
          acedTrans12(point, fromRb, toRb, disp, result);
      }
Не много подправив Брикскад при запуске говорит следующее"не удается найти точку входа "acedtrans" в DLL "bricscad.exe" поиск в интернете не дал результата и не понятно вообще есть в bricscad-е этот acedtrans. Помогите кто сталкивался с такой проблемой, можно ли обойтись без acedtrans или подскажите как печатать по-другому(с использованием какого нибудь стороннего принтера или еще чего нибудь). Если кто сталкивался накидайте ссылки на другие методы печати из автокада (брикскад не найдете мне кажется) в vb.net или C#.net
Просмотров: 4219
 
Непрочитано 08.08.2018, 11:16
#2
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,337


http://adndevblog.typepad.com/autoca...pi-in-net.html
поэкспериментировал в свое время с печатью в акаде - пришел к выводу, что настроенные наборы параметров листов самое оптимальное: вручную раз настроил, проверил сразу же - как выводится. А программно только уже только подставлять.
Сергей812 вне форума  
 
Непрочитано 08.08.2018, 15:03
#3
Oleg T


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


Нет BricsCAD2014, есть версия 14 .
Начиная с версии 15 публикация в PDF (одностраничные либо многостраничные файлы) из листов с настройками принтера осуществляется отлично, так что оптимально было бы просто обновить программу.
Причем без проблем осуществляется копипаст любых текстовых данных из полученных PDF-файлов, что вроде как тоже уже требуется.

Мы тоже работаем в бриксе, но версия 15 (обновили в свое время в основном как раз из-за возможности публикации), а для быстрого создания листов из модели (для тех, кто в листах ну никак не хочет) я приспособил вот это:
http://forum.dwg.ru/showthread.php?t=124456&page=3

Последний раз редактировалось Oleg T, 08.08.2018 в 15:16.
Oleg T вне форума  
 
Автор темы   Непрочитано 09.08.2018, 15:35
#4
veb86

Проектировщик электрических сетей
 
Регистрация: 17.01.2014
Пенза
Сообщений: 117


Цитата:
Сообщение от Oleg T Посмотреть сообщение
Нет BricsCAD2014, есть версия 14 .
так что оптимально было бы просто обновить программу.
Это надо ходить, просить, а потом тебе это как великую благодать преподносят. Они же мне место обновили, а я в выходной работать не хочу.

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
http://adndevblog.typepad.com/autoca...pi-in-net.html
поэкспериментировал в свое время с печатью в акаде - пришел к выводу, что настроенные наборы параметров листов самое оптимальное: вручную раз настроил, проверил сразу же - как выводится. А программно только уже только подставлять.
Поясните пожалуйста. А как подставлять, я как понимаю речь идет об пространстве листа. У меня нет большого опыта пользования пространствами листа. У меня все чертежи в пространстве модели. Т.е. мне вначале надо из модели создать листы и их печатать?
veb86 вне форума  
 
Непрочитано 09.08.2018, 16:03
#5
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,337


Цитата:
Сообщение от veb86 Посмотреть сообщение
Т.е. мне вначале надо из модели создать листы и их печатать?
ну да - я сторонник использования стандартных вещей по возможности с дополнением автоматизацией при необходимости)
Сергей812 вне форума  
 
Непрочитано 09.08.2018, 23:05
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,283
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от veb86 Посмотреть сообщение
автор Александр Ривилис
Да ну? Не помню, чтобы я писал что-то подобное.
Александр Ривилис вне форума  
 
Непрочитано 09.08.2018, 23:19
#7
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,337


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Не помню, чтобы я писал что-то подобное.
похоже на это - ответ №8
Сергей812 вне форума  
 
Непрочитано 09.08.2018, 23:23
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,283
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
похоже на это - ответ №8
А! Ну так моего там всего пару строк - преобразование из WCS в DCS.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 10.08.2018, 09:26
#9
veb86

Проектировщик электрических сетей
 
Регистрация: 17.01.2014
Пенза
Сообщений: 117


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
похоже на это - ответ №8
Все правильно, я оттуда скопировал

Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
А! Ну так моего там всего пару строк - преобразование из WCS в DCS.
Может быть Вы подскажите что делать с bricscad-ом и печатью? Предложенные варианты с созданием видовых окон я попробую, но хотелось бы своим кодом. Мне надо, не так много.
Может быть Вы знаете другие методы печати? не этим кодом?
veb86 вне форума  
 
Непрочитано 10.08.2018, 11:28
#10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,283
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от veb86 Посмотреть сообщение
Может быть Вы подскажите что делать с bricscad-ом и печатью?
Нет. Я с ним не работаю и особенностей его API не знаю.
Если немного погуглить, то можно найти такое: https://sites.google.com/site/avcprg/bricscad-net
Цитата:
acedTrans Как и другие внешние функции переехала из accore.dll в brx18.dll т.е. стала зависимой от версии
И там дальше пример её использования.

Последний раз редактировалось Александр Ривилис, 10.08.2018 в 11:53.
Александр Ривилис вне форума  
 
Непрочитано 10.08.2018, 12:02
#11
baksconstructor


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


Цитата:
Сообщение от veb86 Посмотреть сообщение
Может быть Вы подскажите что делать с bricscad-ом и печатью? Предложенные варианты с созданием видовых окон я попробую, но хотелось бы своим кодом. Мне надо, не так много.
Может быть Вы знаете другие методы печати? не этим кодом?
Судя по этому скрину достучаться до Брикса через API можно. И это версия V12.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.jpg
Просмотров: 31
Размер:	235.0 Кб
ID:	205237  
baksconstructor вне форума  
 
Непрочитано 10.08.2018, 14:06
#12
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,337


Цитата:
Сообщение от baksconstructor Посмотреть сообщение
Судя по этому скрину достучаться до Брикса через API можно.
лучше уж первоисточники указывать)
Teigha.DatabaseServices Namespace и далее к классам печати, насколько вижу из схемы
Сергей812 вне форума  
 
Автор темы   Непрочитано 07.09.2018, 17:28
#13
veb86

Проектировщик электрических сетей
 
Регистрация: 17.01.2014
Пенза
Сообщений: 117


Всем привет! Решил написать об успехах и сказать большое спасибо всем. кто помог мне с моей проблемой. Александр Ривилис - Вам особенно спасибо. Я бы не за что не нашел этот сайт где написано про "acedTrans Как и другие внешние функции переехала из accore.dll в brx18.dll т.е. стала зависимой от версии"
Как всегда я делаю долго, но результаты есть.... В общем после того как я поменял Acedtrans и исправил еще какие то баги (вызванные нехваткой функций в брикскаде) произошло чудо и я получил свой первый ПДФ, радости было море, на горизонте за брезжила свобода от ПДФования, которая порядком надоела за полтора месяца. Я правда стараюсь ее спихнуть на кого нибудь, но как то коллектив косится
В общем пришлось по перепиливать свое разбиение листов и подготовить все для печати. Еще найден был баг, распечатать командой можно только один раз потом брикскад надо закрывать и запускать снова. После вызова этой функции PlotFactory.CreatePublishEngine(); повторный ее вызов вызывает ошибку. ее надо как то уничтожить, в целом для меня не критично печатать и закрывать брикскад. Но если кто то знает что нужно добавить в код (см первое сообщение) что бы можно избавится от этой проблемы буду очень рад.
В рамках перепиливания освоил XMLSerialization, понравилось
Печатаю на принтере PDF24 PDF все печатается, и я сразу по файльно получаю чертежи. Правда получаю postScript которые тот же PDF24 перепечатывает, быстро и просто, не долго, а если печатать микрософт ПДФ то он получает сразу PDF (но в нем только А4 и А3).
В итоге результат есть, не без багов конечно, но норм. Надо почистить код и возвращаться к основному проекту, а то zamtmn наверное меня потерял
veb86 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > BRICSCAD2014. Печать из модели в PDF

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка: вид модели не найден bboysyndrom AutoCAD 0 09.07.2018 09:09
Проблема вывода 3д модели на печать. VilandIR AutoCAD 3 11.06.2013 08:06
Как отключить регенерацию модели перед печатью? adu AutoCAD 20 16.05.2013 21:14
Печать из модели в файле DWF. Yapp AutoCAD 47 26.02.2013 03:34
Опять про печать из модели нескольких листов gizmo_zx Программирование 2 28.09.2010 12:33