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

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

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

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

veb86 вне форума Вставить имя

Здравствуйте! Наш проектный институт коснулась эта 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
Просмотров: 1676
 
Непрочитано 08.08.2018, 11:16
#2
Сергей812


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


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


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


Нет 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
Пенза
Сообщений: 97


Цитата:
Сообщение от 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
Сообщений: 5,522


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

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


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


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


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

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


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

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


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

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

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,202
Отправить сообщение для Александр Ривилис с помощью 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
Сообщений: 877


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


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


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

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


Всем привет! Решил написать об успехах и сказать большое спасибо всем. кто помог мне с моей проблемой. Александр Ривилис - Вам особенно спасибо. Я бы не за что не нашел этот сайт где написано про "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

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||