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

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

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

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

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


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


Да без проблем !
Вот тема где собраны все варианты http://forum.dwg.ru/showthread.php?t=104517
С блоками и не только справится самый первый вариант, даже если это будут не блоки, а СПДС.
maratovich вне форума  
 
Автор темы   Непрочитано 25.02.2014, 13:12
#3
ghost


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


Дело в том что это не совсем то что мне нужно... У меня уже есть программа написанная мной которая формирует эти блоки и производит кучу манипуляций с ними, в том числе в ней уже сформирована масса информации и про печать... Я хотел просто в эту программу дописать несколько методов "о печати" и она будет выводить все быстро и по нажатию одной кнопки... А так мне придется формировать все отдельно, а печатать с помощью дополнительной подпрограммы а это как то не удобно! Да и юзвери меня за долбают......
ghost вне форума  
 
Непрочитано 25.02.2014, 13:17
#4
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от ghost Посмотреть сообщение
Дело в том что это не совсем то что мне нужно...
По ссылке выше видим что .NET использует bargool , стучимся в личку к нему или в его тему и просим поделиться кодом.
maratovich вне форума  
 
Непрочитано 25.02.2014, 13:31
#5
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от ghost Посмотреть сообщение
Может кто то сталкивался с этим!? Подскажите хотя бы свойство или метод в который надо посмотреть , я уж дальше сам раскопаю...
Если возможно вывести на печать блоки без создания листов и видовых экранов , то это даже предпочтительней...
Где Вы до этого копали - если это даже в мурзилке есть.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 25.02.2014, 17:31
#6
Do$

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


Цитата:
Сообщение от maratovich Посмотреть сообщение
По ссылке выше видим что .NET использует bargool , стучимся в личку к нему или в его тему и просим поделиться кодом.
Код лежит в свободном доступе на githab. Ссылка - в шапке темы http://forum.dwg.ru/showthread.php?t=83750&page=18
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 25.02.2014, 21:32
#7
bargool


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Код лежит в свободном доступе на githab.
Я, правда, не уверен, что там самая последняя версия. Но вопрос создания листов/видовых экранов там корректный. По конкретным вопросам проконсультирую.
Начни с класса LayoutCreator. Именно он создает в итоге лист и нацеливает видовой экран на нужную область в модели.

----- добавлено через ~12 ч. -----
А. И вот ещё моя статейка на эту тему.
__________________
Алексей
bargool вне форума  
 
Автор темы   Непрочитано 27.02.2014, 11:04
#8
ghost


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


Спасибо всем за подсказки! Я нашел код...
Хотел спросить...
В классе LayoutCreator.cs есть метод CreateLayout в нем есть строка:
Код:
[Выделить все]
View.Zoom(new Point3d(0,0,0), new Point3d(layout.PlotPaperSize.X, layout.PlotPaperSize.Y, 0), new Point3d(), 1);
На сколько я понял этот "View" откуда то , от сюда:
Код:
[Выделить все]
using Bargool.Acad.Library;
Можно где то на метод Zoom глянуть?
ghost вне форума  
 
Непрочитано 27.02.2014, 11:08
#9
bargool


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


Оу, не выложена..
На самом деле, код метода взят не заморачиваясь - из мурзилки
Код:
[Выделить все]
 public static void Zoom(Point3d pMin, Point3d pMax, Point3d pCenter, double dFactor)
{
// Get the current document and database
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
int nCurVport = System.Convert.ToInt32(Application.GetSystemVariable("CVPORT"));
// Get the extents of the current space no points
// or only a center point is provided
// Check to see if Model space is current
if (acCurDb.TileMode == true)
{
	if (pMin.Equals(new Point3d()) == true &&
	    pMax.Equals(new Point3d()) == true)
	{
		pMin = acCurDb.Extmin;
		pMax = acCurDb.Extmax;
	}
}
else
{
	// Check to see if Paper space is current
	if (nCurVport == 1)
	{
		// Get the extents of Paper space
		if (pMin.Equals(new Point3d()) == true &&
		    pMax.Equals(new Point3d()) == true)
		{
			pMin = acCurDb.Pextmin;
			pMax = acCurDb.Pextmax;
		}
	}
	else
	{
		// Get the extents of Model space
		if (pMin.Equals(new Point3d()) == true &&
		    pMax.Equals(new Point3d()) == true)
		{
			pMin = acCurDb.Extmin;
			pMax = acCurDb.Extmax;
		}
	}
}
// Start a transaction
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
	// Get the current view
	using (ViewTableRecord acView = acDoc.Editor.GetCurrentView())
	{
		Extents3d eExtents;
		// Translate WCS coordinates to DCS
		Matrix3d matWCS2DCS;
		matWCS2DCS = Matrix3d.PlaneToWorld(acView.ViewDirection);
		matWCS2DCS = Matrix3d.Displacement(acView.Target - Point3d.Origin) * matWCS2DCS;
		matWCS2DCS = Matrix3d.Rotation(-acView.ViewTwist,
		                               acView.ViewDirection,
		                               acView.Target) * matWCS2DCS;
		// If a center point is specified, define the min and max
		// point of the extents
		// for Center and Scale modes
		if (pCenter.DistanceTo(Point3d.Origin) != 0)
		{
			pMin = new Point3d(pCenter.X - (acView.Width / 2),
			                   pCenter.Y - (acView.Height / 2), 0);
			pMax = new Point3d((acView.Width / 2) + pCenter.X,
			                   (acView.Height / 2) + pCenter.Y, 0);
		}
		// Create an extents object using a line
		using (Line acLine = new Line(pMin, pMax))
		{
			eExtents = new Extents3d(acLine.GeometricExtents.MinPoint,
			                         acLine.GeometricExtents.MaxPoint);
		}
		// Calculate the ratio between the width and height of the current view
		double dViewRatio;
		dViewRatio = (acView.Width / acView.Height);
		// Tranform the extents of the view
		matWCS2DCS = matWCS2DCS.Inverse();
		eExtents.TransformBy(matWCS2DCS);
		double dWidth;
		double dHeight;
		Point2d pNewCentPt;
		// Check to see if a center point was provided (Center and Scale modes)
		if (pCenter.DistanceTo(Point3d.Origin) != 0)
		{
			dWidth = acView.Width;
			dHeight = acView.Height;
			if (dFactor == 0)
			{
				pCenter = pCenter.TransformBy(matWCS2DCS);
			}
			pNewCentPt = new Point2d(pCenter.X, pCenter.Y);
		}
		else // Working in Window, Extents and Limits mode
		{
			// Calculate the new width and height of the current view
			dWidth = eExtents.MaxPoint.X - eExtents.MinPoint.X;
			dHeight = eExtents.MaxPoint.Y - eExtents.MinPoint.Y;
			// Get the center of the view
			pNewCentPt = new Point2d(((eExtents.MaxPoint.X + eExtents.MinPoint.X) * 0.5),
			                         ((eExtents.MaxPoint.Y + eExtents.MinPoint.Y) * 0.5));
		}
		// Check to see if the new width fits in current window
		if (dWidth > (dHeight * dViewRatio)) dHeight = dWidth / dViewRatio;
		// Resize and scale the view
		if (dFactor != 0)
		{
			acView.Height = dHeight * dFactor;
			acView.Width = dWidth * dFactor;
		}
		// Set the center of the view
		acView.CenterPoint = pNewCentPt;
		// Set the current view
		acDoc.Editor.SetCurrentView(acView);
	}
	// Commit the changes
	acTrans.Commit();
}
__________________
Алексей
bargool вне форума  
 
Автор темы   Непрочитано 20.03.2014, 11:27
#10
ghost


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


Подскажите пожалуйста почему методом CreateLayout класса LayoutCreator.cs нельзя создать несколько листов в одной транзакции!? Я пытался создать сразу несколько листов в одной транзакции что бы не наблюдать "фееричное" шоу, о создании листов и переключения между ними , но в одной транзакции почему то создается ровно один лист и вылитает ошибка при создании второго листа... Если можно разъясните пожалуйста в общих чертах теорию или ткните пожалуйста где можно про это почитать...
ghost вне форума  
 
Непрочитано 21.03.2014, 09:46
#11
bargool


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


Без фееричного шоу не обойтись. По крайней мере, в лоб.
Насколько я помню, необходимо обязательно перейти на лист с помощью LayoutManager.CurrentLayout иначе не будет сформировано BlockTableRecord для этого листа (опять же, я давно этим занимался, уже плохо помню). Это было выяснено эмпирическим путём. Возможно, эту штуку можно и обойти, но я уже не стал влезать глубже. Если найдёте способ - очень прошу поделиться, ибо при большом кол-ве листов получается ооооочень долго.
А внутри одной транзакции можно и несколько листов делать. Я просто такую структуру делал для меньшей связности. Что бы классы более высокого уровня абстракции не знали обо всех этих ваших транзакциях.
__________________
Алексей
bargool вне форума  
 
Непрочитано 23.03.2014, 12:20
#12
kikoko


 
Регистрация: 12.12.2004
***
Сообщений: 6


Цитата:
Сообщение от ghost Посмотреть сообщение
... Может кто то сталкивался с этим!?
Цитата:
Сообщение от ghost Посмотреть сообщение
... Если возможно вывести на печать блоки без создания листов и видовых экранов , то это даже предпочтительней...
Если я понял !
Для Zoom To Block мой VB Sample Code:
Код:
[Выделить все]
Sub Zoom_2_Block() ' для 2D Model Space
        Dim cent(0 To 2) As Double
        Dim MinP(0 To 2) As Double
        Dim MaxP(0 To 2) As Double
        Dim BlObject As AcadEntity
        Dim ZBundX, ZBundY, ZMagn As Double
On Error Resume Next
        BlObject = ThisDrawing.HandleToObject(BHndl)  ' BHndl из другой Sub , Public BHndl As String
        If Not BlObject Is Nothing Then
            ' cent(0) = BlObject.InsertionPoint(0)
            ' cent(1) = BlObject.InsertionPoint(1)
            ' cent(2) = 0.0#
            BlObject.GetBoundingBox(MinP, MaxP)
' ZoomWindow Method :
           ThisDrawing.Application.ZoomWindow(MinP, MaxP)
' ZoomCenter Method :
            cent(0) = (MinP(0) + MaxP(0)) / 2 : cent(1) = (MinP(1) + MaxP(1)) / 2 : cent(2) = 0.0#
            ZBundX = Math.Abs(MinP(0) - MaxP(0)) : ZBundY = Math.Abs(MaxP(1) - MinP(1))
            If ZBundX >= ZBundY Then
                ZMagn = ZBundX
            Else
                ZMagn = ZBundY
            End If
            ThisDrawing.Application.ZoomCenter(cent, ZMagn)
' ************
            BlObject.Highlight(True)
            ThisDrawing.Utility.Prompt(vbCrLf & "Zoom2Block: " & BHndl  & vbCrLf)
        Else
            MsgBox("In Model Space not Block : " &  BHndl ! ", MsgBoxStyle.Critical, "Zoom2Block")
        End If
    End Sub
Затем можно -> Plot Display ... наверное
Цитата:
Сообщение от ghost Посмотреть сообщение
... Подскажите хотя бы свойство или метод в который надо посмотреть , я уж дальше сам раскопаю...
Off topic ! -> http://forum.dwg.ru/showthread.php?p...4&#post1208384

Последний раз редактировалось kikoko, 24.03.2014 в 11:10.
kikoko вне форума  
 
Автор темы   Непрочитано 24.03.2014, 10:45
#13
ghost


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


Цитата:
Сообщение от kikoko Посмотреть сообщение
Если я понял !
Для Zoom To Block мой VB Sample Code:
Мне нужно не совсем зуммирование... Мне нужно по сути, сделать пакетную печать , определенных блоков в пространстве модели предварительной разбивкой на листы "Layout" и созданием видовых экранов "Viewports" которые нацелены каждый на свой блок из пространства модели!
ghost вне форума  
 
Непрочитано 24.03.2014, 10:48
#14
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от ghost Посмотреть сообщение
Мне нужно не совсем зуммирование... Мне нужно по сути, сделать пакетную печать , определенных блоков в пространстве модели предварительно разбив на листы "Layout" и созданием видовых экранов "Viewports" которые нацелены каждый на свой блок из пространства модели!
Ну вот же есть тема, там все варианты собраны, и для вашей задачи тоже. Поиск рулит.
Пакетная печать множества рамок (форматов) из пространства модели
maratovich вне форума  
 
Автор темы   Непрочитано 24.03.2014, 11:00
#15
ghost


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


Уважаемый bargool хотел еще спросить про удаление листов... У Вас в коде есть метод для удаления не инициализированных листов, а если нужно удалить уже инициализированные листы!? Я такого метода не нашел... И чем вообще отличается удаление инициализированных листов от не инициализированных? PS. Извиняюсь что немного не по теме!

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от maratovich Посмотреть сообщение
Ну вот же есть тема, там все варианты собраны, и для вашей задачи тоже. Поиск рулит.
Пакетная печать множества рамок (форматов) из пространства модели
Я эту тему как раз изучаю! Просто это я подробнее объяснил для "kikoko" что именно я ищу... Потому что он немного меня не правильно понял...
ghost вне форума  
 
Непрочитано 24.03.2014, 11:08
#16
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от ghost Посмотреть сообщение
Я эту тему как раз изучаю! Просто это я подробнее объяснил для "kikoko" что именно я ищу...
Да, с блоками это намного интересней (в плане затраченного времени).
maratovich вне форума  
 
Непрочитано 25.03.2014, 09:12
#17
bargool


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


Цитата:
Сообщение от ghost Посмотреть сообщение
И чем вообще отличается удаление инициализированных листов от не инициализированных?
Ничем. Просто в моей программе была необходимость удалять именно те листы, на которые ни разу не заходил пользователь.
__________________
Алексей
bargool вне форума  
 
Автор темы   Непрочитано 27.03.2014, 16:48
#18
ghost


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


Может вы подскажите почему этот метод, который я взял из вашего кода и немного переделал:

Код:
[Выделить все]
/// <summary>
        /// Метод удаляет неинициализированные листы
        /// </summary>
        public static void DeleteNoninitializedLayouts()
        {
            Database wdb = HostApplicationServices.WorkingDatabase;
            DocumentLock dl = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
            LayoutManager laytmgr = LayoutManager.Current;
            laytmgr.CurrentLayout = "Модель";

            using (Transaction tr = wdb.TransactionManager.StartTransaction())
            {
                try
                {
                    DBDictionary dic = (DBDictionary)tr.GetObject(wdb.LayoutDictionaryId, OpenMode.ForRead);

                    foreach (DBDictionaryEntry entry in dic)
                    {
                        Layout layout = (Layout)tr.GetObject(entry.Value, OpenMode.ForRead);
                        //if (!layout.ModelType && layout.GetViewports().Count == 0
                        if (layout.LayoutName.IndexOf("Кабельный") != -1)
                        {
                            if (dic.Count > 1)
                            {
                                if (!dic.IsWriteEnabled)
                                    dic.UpgradeOpen();
                                dic.Remove(entry.Value);
                                layout.UpgradeOpen();
                                layout.Erase(true);
                                Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager
                                    .MdiActiveDocument.Editor.WriteMessage("\nУдаляю лист " + layout.LayoutName + Environment.NewLine);
                            }
                        }
                        
                    }
                    laytmgr.CurrentLayout = "Модель";
                    tr.Commit();
                    dl.Dispose();
                }
                catch (Autodesk.AutoCAD.Runtime.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
Вызывает такое исключение:

Вернее не сам метод , а после удаления листов этим методом все сначала проходит нормально! Но во первых вкладки листов не исчезают сразу после него... А исчезают только при переключении листа... А когда происходит переключение листа , то выскакивает исключение как на картинке... Хотя я переключаю на не удаленный лист...
Изображения
Тип файла: jpg Ошибка.JPG (8.8 Кб, 843 просмотров)
ghost вне форума  
 
Непрочитано 27.03.2014, 20:37
#19
Do$

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


Навскидку, есть подозрение, что метод удаляет все листы в документе. А этого делать нельзя.
P.S.
Код:
[Выделить все]
layout.LayoutName.IndexOf("Кабельный") != -1
http://msdn.microsoft.com/ru-ru/libr...v=vs.110).aspx
P.P.S
В данном случае, еще неплохо учитывать регистр. И как-то убедиться, что хотя бы один лист остается.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 27.03.2014, 22:42
#20
Александр Ривилис

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


LayoutManager.DeleteLayout не лучше ли?
Александр Ривилис вне форума  
 
Непрочитано 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