Обновление листа после изменения размеров листа

Автор Тема: Обновление листа после изменения размеров листа  (Прочитано 10719 раз)

0 Пользователей и 6 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн YusufАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
здравствуйте, подскажите что надо сделать, для нормального отображения листов после изменении размеров листов. Меняю размеры листов согласно блока расположенного в нем, размеры листа задаю Extents, размеры меняются  в настройках выставляется Extents,  делаю превью печати все нормально, но в листе отображение не актуальное. Regen не помогает, иногда даже артефакты висят,  например вьюпорт из листа отображающий модель не исчезает при зуме, при переключении листов и тд.


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Yusuf,
Подробнее что и как ты делаешь. Желательно с кодом, кодом, который можно проверить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн YusufАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Yusuf,
Подробнее что и как ты делаешь. Желательно с кодом, кодом, который можно проверить.

Вот код меняющий размер листа
Код - C# [Выбрать]
  1.         public void SetLayoutPlotSetting()
  2.         {
  3.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  4.             Database acCurDb = acDoc.Database;
  5.             StandartCopier standartCopier = new StandartCopier();
  6.             PlotConfigManager.SetCurrentConfig(standartCopier.Pc3Location);
  7.  
  8.             using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  9.             {
  10.                 Layout acLayout;
  11.  
  12.                 var layouts = LayoutModels.OrderBy(x => x.Layout.TabOrder).ToList();
  13.  
  14.                 foreach (var layout in layouts)
  15.                 {
  16.                     acLayout = acTrans.GetObject(layout.LayoutPlotId,
  17.                         OpenMode.ForRead) as Layout;
  18.  
  19.                     if (acLayout == null) continue;
  20.                     var plotArea = acLayout.Extents;
  21.                     // Output the name of the current layout and its device
  22.                     acDoc.Editor.WriteMessage("\nCurrent layout: " +
  23.                                               acLayout.LayoutName);
  24.  
  25.                     acDoc.Editor.WriteMessage("\nCurrent device name: " +
  26.                                               acLayout.PlotConfigurationName);
  27.  
  28.                     // Get the PlotInfo from the layout
  29.                     PlotInfo acPlInfo = new PlotInfo();
  30.                     acPlInfo.Layout = acLayout.ObjectId;
  31.  
  32.                     // Get a copy of the PlotSettings from the layout
  33.                     PlotSettings acPlSet = new PlotSettings(acLayout.ModelType);
  34.                     acPlSet.CopyFrom(acLayout);
  35.  
  36.                     // Update the PlotConfigurationName property of the PlotSettings object
  37.                     PlotSettingsValidator acPlSetVdr = PlotSettingsValidator.Current;
  38.                     //acPlSetVdr.SetCurrentStyleSheet(acPlSet, "monochrome.ctb");
  39.                     bool isHor = layout.PrintModel.IsFormatHorizontal();
  40.  
  41.                     acPlSetVdr.SetPlotType(acPlSet, PlotType.Extents);
  42.                     acPlSetVdr.SetPlotRotation(acPlSet, isHor ? PlotRotation.Degrees000 : PlotRotation.Degrees090);
  43.                     acPlSetVdr.SetPlotWindowArea(acPlSet, Get2dExtentsFrom3d(plotArea));
  44.                     acPlSetVdr.SetStdScaleType(acPlSet, StdScaleType.ScaleToFit);
  45.  
  46.                     // Center the plot
  47.                     acPlSetVdr.SetPlotCentered(acPlSet, true);
  48.  
  49.                     acPlSetVdr.SetPlotConfigurationName(acPlSet, "DWG_To_PDF_Uzle.pc3",
  50.                         layout.CanonicalName);
  51.                     acPlSetVdr.SetZoomToPaperOnUpdate(acPlSet, true);
  52.  
  53.                     // Update the layout
  54.                     acLayout.UpgradeOpen();
  55.                     acLayout.CopyFrom(acPlSet);
  56.                    
  57.                     //TODO refresh layout
  58.  
  59.                     // Output the name of the new device assigned to the layout
  60.                     acDoc.Editor.WriteMessage("\nNew device name: " +
  61.                                               acLayout.PlotConfigurationName);
  62.                    
  63.                     Active.Editor.Regen();
  64.                 }
  65.  
  66.                 // Save the new objects to the database
  67.                 acTrans.Commit();
  68.                
  69.             }
  70.  
  71.         }
  72.  

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Yusuf,
Ну как минимум нужно изменить параметры основного Viewport.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн YusufАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Yusuf,
Ну как минимум нужно изменить параметры основного Viewport.
даже если нет вьюпорта, на листе не корректно отображается, как на картинке сверху, если вручную изменяю параметры печати и верну обратно, например с Portrait на Landscape и верну на Portrait т.е ничего не меняется, просто активна кнопка "применить к листу", нажимаю  то отображается все нормально

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
даже если нет вьюпорта
А ты проверь, вызвав Layout.GetViewports
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн YusufАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
даже если нет вьюпорта
А ты проверь, вызвав Layout.GetViewports
да есть оказывается, получается первый id в коллекции, это id основного вьюпорта? а какие параметры надо менять?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Yusuf,
Ну как минимум ширину и высоту Viewport и его центр. И не забыть вызвать Viewport.UpdateDisplay()
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн YusufАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Yusuf,
Ну как минимум ширину и высоту Viewport и его центр. И не забыть вызвать Viewport.UpdateDisplay()
ширина и высота выставляется, согласно размера блока, она задается в Papersize или это другое? Viewport.UpdateDisplay() делаю, значит надо центр изменить только, вычислить центр блока-форматки и задать вьюпорту, если я правильно понял

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
ширина и высота выставляется, согласно размера блока, она задается в Papersize или это другое?
Другое. Это ты выставлял размеры для Layout. А теперь тебе нужно задать размеры основного Viewport для этого Layout.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн YusufАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
ширина и высота выставляется, согласно размера блока, она задается в Papersize или это другое?
Другое. Это ты выставлял размеры для Layout. А теперь тебе нужно задать размеры основного Viewport для этого Layout.
не получается, все так же как и было, нормально отображается только активный layout, к предыдущему коду добавил после строки 51, перед  acLayout.UpgradeOpen() вот это
Код - C# [Выбрать]
  1.                     var viewports = acLayout.GetViewports();
  2.                     var vp = acTrans.GetObject(viewports[0],
  3.                         OpenMode.ForWrite) as Viewport;
  4.                     vp.Width = plotArea.MaxPoint.X - plotArea.MinPoint.X;
  5.                     vp.Height =  plotArea.MaxPoint.Y - plotArea.MinPoint.Y;
  6.                     var center_x = plotArea.MinPoint.X + vp.Width / 2;
  7.                     var center_y = plotArea.MinPoint.Y + vp.Height / 2;
  8.                     vp.ViewCenter = new Point2d(center_x,center_y);
  9.                     vp.UpdateDisplay();
  10.  

Отмечено как Решение Yusuf 21-04-2021, 16:10:25

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
нормально отображается только активный layout,
Значит переключайся на него.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно без переключения листов попробовать этот код: https://adn-cis.org/forum/index.php?topic=2786.msg9912#msg9912
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн YusufАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Можно без переключения листов попробовать этот код: https://adn-cis.org/forum/index.php?topic=2786.msg9912#msg9912
нет, 2 метод попробовал не получается, хоть с модели запускаю, почемуто только один нормально отображается, наверно без переключения никак

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Код - vb.net [Выбрать]
  1.                 If (acLayoutMgr.CurrentLayout <> "Model") Then
  2.                         CadDoc.SendStringToExecute("_.MSPACE" & vbCrLf, True, False, False) ' без этого получаю координаты из пространства листа
  3.  
  4.                         Dim acVportTblRec As Viewport
  5.                         acVportTblRec = acTrans.GetObject(CadDoc.Editor.ActiveViewportId, OpenMode.ForRead)
  6.                         acVportTblRec.UpdateDisplay() ' всё равно выводит координаты как будто я всё еще в пространстве листа
  7.                         rtfTemp.Text = "Координаты" & vbCrLf ' Собираю всё что могу, но числа не подходят ни куда.
  8.                         rtfTemp.Text = rtfTemp.Text & "CenterPoint " & FormatNumber(acVportTblRec.CenterPoint(0), 1) & "x" & FormatNumber(acVportTblRec.CenterPoint(1), 1) & "x" & FormatNumber(acVportTblRec.CenterPoint(2), 1) & vbCrLf
  9.                         rtfTemp.Text = rtfTemp.Text & "ViewCenter " & FormatNumber(acVportTblRec.ViewCenter(0), 1) & "x" & FormatNumber(acVportTblRec.ViewCenter(1), 1) & vbCrLf
  10.                         rtfTemp.Text = rtfTemp.Text & "ViewDirection " & FormatNumber(acVportTblRec.ViewDirection(0), 1) & "x" & FormatNumber(acVportTblRec.ViewDirection(1), 1) & "x" & FormatNumber(acVportTblRec.ViewDirection(2), 1) & vbCrLf
  11.                         rtfTemp.Text = rtfTemp.Text & "ViewTarget " & FormatNumber(acVportTblRec.ViewTarget(0), 1) & "x" & FormatNumber(acVportTblRec.ViewTarget(1), 1) & "x" & FormatNumber(acVportTblRec.ViewTarget(2), 1)
  12.                         ' Dim acPlSetVdr As PlotSettingsValidator = PlotSettingsValidator.Current ' тут все настройки печати
  13.                     End If

Здравствуйте тоже не пойму как обновить, то есть если я вначале переключусь на лист и войду в редактирование содержимого видового экрана, то ViewTarget не равен нулю и координаты центра совершенно не поддаются логике, если же выполняю код выше, то фактически видовой экран активен для редактирования, но координаты центра в пространстве листа, а не модели.  Нужны координаты содержимого видового экрана.