Как программно видовой экран сфокусировать на блоке в пространстве модели(AutoCAD 2012 NET С#) - Страница 2
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как программно видовой экран сфокусировать на блоке в пространстве модели(AutoCAD 2012 NET С#)

Как программно видовой экран сфокусировать на блоке в пространстве модели(AutoCAD 2012 NET С#)

Ответ
Поиск в этой теме
Непрочитано 24.02.2014, 18:02
Как программно видовой экран сфокусировать на блоке в пространстве модели(AutoCAD 2012 NET С#)
ghost
 
Регистрация: 19.12.2011
Сообщений: 35

Доброго времени суток!
Пытаюсь сделать программку которая бы находила в пространстве модели определенные блоки,создавала из них листы с видовыми экранами четко по границам блока и выводила сплошняком на печать.....
После некоторого гугления я нашел этот форум: "http://www.acadnetwork.com/index.php?topic=50.0" Там есть код который позволяет создавать листы с видовыми экранами, но теперь я не могу понять как этот видовой экран нацелить на блок в пространстве модели... Может кто то сталкивался с этим!? Подскажите хотя бы свойство или метод в который надо посмотреть , я уж дальше сам раскопаю...
Если возможно вывести на печать блоки без создания листов и видовых экранов , то это даже предпочтительней...
Заранее спасибо за любую помощь !!!
Просмотров: 8385
 
Непрочитано 28.03.2014, 09:22
#21
bargool


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


Ко всему прочему, нужно сделать Regen(), что бы изменения отобразились
__________________
Алексей
bargool вне форума  
 
Автор темы   Непрочитано 31.03.2014, 15:48
#22
ghost


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


Спасибо всем большое! Все вроде получилось и работает хорошо! Еще пришлось добавить LockDocument();
Без него выдавало ошибку eLockViolation...

----- добавлено через ~20 ч. -----
Хотел спросить еще один момент про печать листов... Да простит меня всемогущий модер...

Суть вот в чем! Для печати и просмотра я использую три метода:

Код:
[Выделить все]
 
        public static void PreviewAllSheets(string PrinterName)
        {
            if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
            {
                int layoutNum = 0;
                bool isFinished = false;
                bool isReadyForPlot = false;

                if (layoutsToPlot == ) return;

                while (!isFinished)
                {
                    PreviewEngineFlags flags = PreviewEngineFlags.Plot;
                    if (layoutNum > 0) flags |= PreviewEngineFlags.PreviousSheet;
                    if (layoutNum < layoutsToPlot.Count - 1) flags |= PreviewEngineFlags.NextSheet;

                    PlotEngine pre = PlotFactory.CreatePreviewEngine((int)flags);
                    using (pre)
                    {
                        PreviewEndPlotStatus stat = MultiplePlotOrPreview(pre, true, layoutsToPlot, layoutNum, "", PrinterName);
                        if (stat == PreviewEndPlotStatus.Next)
                        {
                            layoutNum++;
                        }
                        else if (stat == PreviewEndPlotStatus.Previous)
                        {
                            layoutNum--;
                        }
                        else if (stat == PreviewEndPlotStatus.Normal || stat == PreviewEndPlotStatus.Cancel)
                        {
                            isFinished = true;
                        }
                        else if (stat == PreviewEndPlotStatus.Plot)
                        {
                            isFinished = true;
                            isReadyForPlot = true;
                        }
                    }
                }
                if (isReadyForPlot)
                {
                    try
                    {
                        PlotEngine ple = PlotFactory.CreatePublishEngine();
                        using (ple)
                        {
                            PreviewEndPlotStatus stat = MultiplePlotOrPreview(ple, false, layoutsToPlot, -1, "c:\\multisheet-previewed-plot",PrinterName);
                        }
                    }
                    catch (Autodesk.AutoCAD.Runtime.Exception aex)
                    {
                        MessageBox.Show("Ошибка пакетной печати: " + aex.Message);
                    }
                }
            }
            else
            {
                MessageBox.Show("\nДругая печать находиться в процессе.");
            }
        }

         public static void PlotAllSheets(string PrinterName)
        {
            Database db = HostApplicationServices.WorkingDatabase;
            Transaction tr = db.TransactionManager.StartTransaction();

            if (layoutsToPlot == null) return;
            if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
            {
                try
                {
                    PlotEngine ple = PlotFactory.CreatePublishEngine();
                    Test(PrinterName);
                    using (ple)
                    {
                        PreviewEndPlotStatus stat = MultiplePlotOrPreview(ple, false, layoutsToPlot, -1, "c:\\multisheet-previewed-plot", PrinterName);
                    }
                }
                catch(Autodesk.AutoCAD.Runtime.Exception aex)
                {
                    MessageBox.Show("Ошибка пакетной печати: "+ aex.Message);
                }
            }
            else
            {
                MessageBox.Show("\nДругая печать находиться в процессе.");
            }
            tr.Commit();
        }

        static PreviewEndPlotStatus MultiplePlotOrPreview(PlotEngine pe, bool isPreview, ObjectIdCollection layoutSet, int layoutNumIfPreview, string filename, string PrinterName)
        {
            try
            {
                Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                Editor ed = doc.Editor;
                Database db = doc.Database;

                PreviewEndPlotStatus ret = PreviewEndPlotStatus.Cancel;

                ObjectIdCollection layoutsToPlot2;

                if (isPreview && layoutNumIfPreview >= 0)
                {
                    layoutsToPlot2 = new ObjectIdCollection();
                    layoutsToPlot2.Add(layoutSet[layoutNumIfPreview]);
                }
                else
                {
                    ObjectId[] ids = new ObjectId[layoutSet.Count];
                    layoutSet.CopyTo(ids, 0);
                    layoutsToPlot2 = new ObjectIdCollection(ids);
                }
                Transaction tr = db.TransactionManager.StartTransaction();
                using (tr)
                {
                    PlotProgressDialog ppd = new PlotProgressDialog(isPreview, layoutsToPlot2.Count, true);
                    using (ppd)
                    {
                        int numSheet = 1;
                        foreach (ObjectId btrId in layoutsToPlot2)
                        {
                            BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
                            Layout lo = (Layout)tr.GetObject(btr.LayoutId, OpenMode.ForRead);

                            PlotSettings ps = new PlotSettings(lo.ModelType);
                            ps.CopyFrom(lo);

                            PlotSettingsValidator psv = PlotSettingsValidator.Current;

                            psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Extents);
                            psv.SetUseStandardScale(ps, true);
                            psv.SetStdScaleType(ps, StdScaleType.ScaleToFit);
                            psv.SetPlotCentered(ps, true);
                            psv.SetPlotConfigurationName(ps, PrinterName, "A4");

                            PlotInfo pi = new PlotInfo();
                            pi.Layout = btr.LayoutId;
                            LayoutManager.Current.CurrentLayout = lo.LayoutName;
                            pi.OverrideSettings = ps;

                            PlotInfoValidator piv = new PlotInfoValidator();
                            piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;
                            piv.Validate(pi);
                            ppd.set_PlotMsgString(PlotMessageIndex.SheetName, doc.Name.Substring(doc.Name.LastIndexOf("\\") + 1) + " - " + lo.LayoutName);

                            if (numSheet == 1)
                            {
                                ppd.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Custom Preview Progress");
                                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;
                                pe.BeginPlot(ppd, null);
                                pe.BeginDocument(pi, doc.Name, null, 1, !isPreview, filename);
                            }
                            ppd.LowerSheetProgressRange = 0;
                            ppd.UpperSheetProgressRange = 100;
                            ppd.SheetProgressPos = 0;

                            PlotPageInfo ppi = new PlotPageInfo();
                            pe.BeginPage(ppi, pi, (numSheet == layoutsToPlot2.Count), null);
                            ppd.OnBeginSheet();

                            pe.BeginGenerateGraphics(null);
                            ppd.SheetProgressPos = 50;
                            pe.EndGenerateGraphics(null);
                            PreviewEndPlotInfo pepi = new PreviewEndPlotInfo();
                            pe.EndPage(pepi);
                            ret = pepi.Status;

                            ppd.SheetProgressPos = 100;
                            ppd.OnEndSheet();
                            numSheet++;
                            ppd.PlotProgressPos += (100 / layoutsToPlot2.Count);
                        }
                        pe.EndDocument(null);
                        ppd.PlotProgressPos = 100;
                        ppd.OnEndPlot();
                        pe.EndPlot(null);
                    }
                }
                return ret;
            }
            catch (Autodesk.AutoCAD.Runtime.Exception aex)
            {
                MessageBox.Show("Ошибка создания видового экрана:" + aex.Message);
                PreviewEndPlotStatus ret2 = PreviewEndPlotStatus.Cancel;
                return ret2;
            }
        }
Но при предпросмотре и печати через раз, выскакивает исключение: eLayoutNotCurrent бывает выскакивают и другие исключения , в общем работает не стабильно!
И не чего не печатается на физические принтеры... На виртуальный "DoPDF" принтер вроде печатается когда не происходит исключение...
Кроме того печатается почему то довольно долго, хотя нет не какой сложной графики "Черно-белая таблица".
Я подумал! И решил что если лист "NotCurrent" надо его делать "Current" перед печатью, создал такой метод и запустил его перед печатью:
Код:
[Выделить все]
 
public static void Test(string PrinterName)
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            Transaction tr = db.TransactionManager.StartTransaction();
            using (tr)
            {
                try
                {
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(layoutsToPlot[0], OpenMode.ForRead);
                    Layout lo = (Layout)tr.GetObject(btr.LayoutId, OpenMode.ForRead);

                    PlotSettings ps = new PlotSettings(lo.ModelType);
                    ps.CopyFrom(lo);

                    PlotSettingsValidator psv = PlotSettingsValidator.Current;

                    psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Extents);
                    psv.SetUseStandardScale(ps, true);
                    psv.SetStdScaleType(ps, StdScaleType.ScaleToFit);
                    psv.SetPlotCentered(ps, true);
                    psv.SetPlotConfigurationName(ps, PrinterName, "A4");

                    PlotInfo pi = new PlotInfo();
                    pi.Layout = btr.LayoutId;

                    LayoutManager.Current.CurrentLayout = lo.LayoutName;
                    pi.OverrideSettings = ps;

                    PlotInfoValidator piv = new PlotInfoValidator();
                    piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;
                    piv.Validate(pi);
                    tr.Commit();
                }
                catch (Autodesk.AutoCAD.Runtime.Exception aex)
                {
                    MessageBox.Show("Ошибка при первичной настройке листа: "+aex.Message);
                }
            }
        }
и таки частично помогло , eLayoutNotCurrent перестал вываливаться ,но все равно не печатает почему то...
Если кто сталкивался подскажите пожалуйста куда обратить внимание или что нужно дополнительно дописать!?
И может ли быть проблема в том что я имя принтера указываю полностью, вроде такого "\\Comp5\HP LaserJet 1200 Series PCL 6"!? Строки эти я беру из системы!

Последний раз редактировалось ghost, 01.04.2014 в 11:29.
ghost вне форума  
 
Непрочитано 28.04.2014, 10:33
#23
LeonIII


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


Круто!
А не подскажете, как на чертеже отобразить масштаб видового экрана?
в свойства "Пользовательский масштаб" = 1.
как сделать, чтобы внизу чертежа отображалось "масштаб 1:1000 в 1 см 10 м"
LeonIII вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как программно видовой экран сфокусировать на блоке в пространстве модели(AutoCAD 2012 NET С#)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Плохо видно внешнюю ссылку через видовой экран на листе casaatik AutoCAD 3 02.11.2011 12:11