Подскажите пожалуйста, как правильно создавать Viewports .Net ?

Автор Тема: Подскажите пожалуйста, как правильно создавать Viewports .Net ?  (Прочитано 3886 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Здравствуйте друзья, только начал разбираться с программированием под autocad. Не могу понять как работать с видовыми на листе через API .Net. Создаю, примерно, как в документации и получается видовой экран, но без сетки. И сетку ни включить, ни выключить нельзя. Убираю позиционирование в видовом и сетка при создании появляется. Также заметил, что если не присвоить свойству CustomScale значения, то позиционирование не срабатывает. Есть ли какие то правила, как надо создавать видовые экраны, не прямоугольные. Если создавать видовой через команду (_.vports _p и т.д.) командной строки, то при переборе видовых экранов в листе только что созданного экрана не находит, только при смене на модель и обратно на лист он появляется в объектах листа (так же после создания таким способом видового в CurretnSpaceId почему то ничего нет, такое возможно?). Ниже пример, в нём как раз создается видовой без сетки и включить нельзя её уже никогда. Я что-то упускаю, но не пойму что. (всё сказанное проверил под 2016 и 2021 autocad)
Код - C# [Выбрать]
  1. public class MyCommands
  2.     {
  3.         [CommandMethod("all")]
  4.         public void Create()
  5.         {
  6.             NewLayout();
  7.             CreateVieport();
  8.         }
  9.  
  10.         [CommandMethod("createEmptyLayout")]
  11.         public void NewLayout()
  12.         {
  13.             string nameLayout = "MyLayout";
  14.  
  15.             Document doc = Application.DocumentManager.MdiActiveDocument;
  16.             Database DB = doc.Database;
  17.  
  18.             LayoutManager lm = LayoutManager.Current;
  19.  
  20.             ObjectId layoutId = lm.CreateLayout(nameLayout);
  21.  
  22.             lm.CurrentLayout = nameLayout;
  23.  
  24.             using (Transaction tr = DB.TransactionManager.StartTransaction())
  25.             {
  26.                 Layout layout = tr.GetObject(layoutId, OpenMode.ForRead) as Layout;
  27.  
  28.                 ObjectIdCollection LayoutIds = layout.GetViewports();
  29.                 if (LayoutIds.Count > 0)
  30.                 {
  31.                     Viewport vp = tr.GetObject(LayoutIds[1], OpenMode.ForWrite) as Viewport;
  32.                     vp.Erase();
  33.                 }
  34.                 tr.Commit();
  35.             }
  36.         }
  37.  
  38.         [CommandMethod("createVP")]
  39.  
  40.         public void CreateVieport()
  41.         {            
  42.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  43.             Database acCurDb = acDoc.Database;
  44.  
  45.             using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  46.             {
  47.                 BlockTable acBlkTbl;
  48.                 acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  49.                                              OpenMode.ForRead) as BlockTable;
  50.                                
  51.                 BlockTableRecord acBlkTblRec;
  52.                 acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.PaperSpace],
  53.                                                 OpenMode.ForWrite) as BlockTableRecord;
  54.                                
  55.                 Application.SetSystemVariable("TILEMODE", 0);
  56.                 acDoc.Editor.SwitchToPaperSpace();
  57.                                
  58.                 using (Viewport acVport = new Viewport())
  59.                 {
  60.                     acVport.CenterPoint = new Point3d(100, 100, 0);
  61.                     acVport.Width = 200;
  62.                     acVport.Height = 200;
  63.                    
  64.                     acVport.CustomScale = 2;
  65.                     acVport.ViewTarget = new Point3d(1000, 1000, 0);
  66.                     acVport.ViewCenter = new Point2d(0, 0);
  67.                    
  68.                     using (Circle acCirc = new Circle())
  69.                     {
  70.                         acCirc.Center = acVport.CenterPoint;
  71.                         acCirc.Radius = 100;
  72.                        
  73.                         acBlkTblRec.AppendEntity(acCirc);
  74.                         acTrans.AddNewlyCreatedDBObject(acCirc, true);
  75.                        
  76.                         acVport.NonRectClipEntityId = acCirc.ObjectId;
  77.                         acVport.NonRectClipOn = true;
  78.                     }
  79.                    
  80.                     acBlkTblRec.AppendEntity(acVport);
  81.                     acTrans.AddNewlyCreatedDBObject(acVport, true);
  82.  
  83.                     acVport.On = true;
  84.                     acVport.GridOn = true;
  85.                 }              
  86.                 acTrans.Commit();
  87.             }
  88.         }
  89.  
  90.     }

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Mirco,
Приветствую на форуме!
У нас принято правило: "Один вопрос - одна тема". Просьба в дальнейшем придерживаться его.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Создаю, примерно, как в документации и получается видовой экран, но без сетки. И сетку ни включить, ни выключить нельзя.
А где ты задаешь отображение сетки? В коде я этого не увидел. Давай пока в этой теме разберёмся с сеткой.
acVport.GridOn = true; - я думал это включает выключает отображение сетки в ВЭ?! В самом ВЭ F7 уже не работает.

Отмечено как Решение Александр Ривилис 30-05-2020, 20:25:20

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Сравни свой код и этот:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(LayoutAndViewports.MyCommands))]
  10.  
  11. namespace LayoutAndViewports
  12. {
  13.   public class MyCommands
  14.   {
  15.     [CommandMethod("all")]
  16.     public void Create()
  17.     {
  18.       NewLayout();
  19.       CreateVieport();
  20.     }
  21.  
  22.     [CommandMethod("createEmptyLayout")]
  23.     public void NewLayout()
  24.     {
  25.       string nameLayout = "MyLayout";
  26.  
  27.       Document doc = Application.DocumentManager.MdiActiveDocument;
  28.       Database db = doc.Database;
  29.  
  30.       LayoutManager lm = LayoutManager.Current;
  31.  
  32.       ObjectId layoutId = lm.CreateLayout(nameLayout);
  33.       using (Transaction tr = db.TransactionManager.StartTransaction())
  34.       {
  35.         Layout layout = tr.GetObject(layoutId, OpenMode.ForWrite) as Layout;
  36.         layout.Initialize();
  37.         tr.Commit();
  38.       }
  39.  
  40.       lm.SetCurrentLayoutId(layoutId);
  41.  
  42.       using (Transaction tr = db.TransactionManager.StartTransaction())
  43.       {
  44.         Layout layout = tr.GetObject(layoutId, OpenMode.ForRead) as Layout;
  45.         ObjectIdCollection vportIds = layout.GetViewports();
  46.         if (vportIds.Count > 1)
  47.         {
  48.           Viewport vp = tr.GetObject(vportIds[1], OpenMode.ForWrite) as Viewport;
  49.           vp.Erase();
  50.         }
  51.         tr.Commit();
  52.       }
  53.     }
  54.  
  55.     [CommandMethod("createVP")]
  56.  
  57.     public void CreateVieport()
  58.     {
  59.       Document doc = Application.DocumentManager.MdiActiveDocument;
  60.       Database db = doc.Database;
  61.       doc.Editor.SwitchToPaperSpace();
  62.       Application.SetSystemVariable("TILEMODE", 0);
  63.  
  64.       using (Transaction tr = db.TransactionManager.StartTransaction())
  65.       {
  66.         BlockTable bt = tr.GetObject(db.BlockTableId,
  67.                                      OpenMode.ForRead) as BlockTable;
  68.  
  69.         BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.PaperSpace],
  70.                                         OpenMode.ForWrite) as BlockTableRecord;
  71.  
  72.         Viewport vport = new Viewport();
  73.         btr.AppendEntity(vport);
  74.         vport.On = true;
  75.         vport.GridIncrement = new Vector2d(100, 100);
  76.         vport.GridOn = true;
  77.         vport.GridMajor = 10;
  78.         vport.CenterPoint = new Point3d(100, 100, 0);
  79.         vport.Width = 200;
  80.         vport.Height = 200;
  81.  
  82.         vport.CustomScale = 2;
  83.         vport.ViewTarget = new Point3d(1000, 1000, 0);
  84.         vport.ViewCenter = new Point2d(0, 0);
  85.  
  86.         tr.AddNewlyCreatedDBObject(vport, true);
  87.  
  88.         Circle circ = new Circle();
  89.         circ.Center = vport.CenterPoint;
  90.         circ.Radius = 100;
  91.         btr.AppendEntity(circ);
  92.         tr.AddNewlyCreatedDBObject(circ, true);
  93.         vport.NonRectClipEntityId = circ.ObjectId;
  94.         vport.NonRectClipOn = true;
  95.  
  96.         tr.Commit();
  97.       }
  98.     }
  99.   }
  100. }

Мой код работает так как ты хотел?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Мой код работает так как ты хотел?
Спасибо. Да, он работает верно. Я задумывался о том, чтобы настроить сначала сетку, но не знал что именно настраивать. Это так работает? Даже инкремент настраивал.  Я видимо, что-то не знаю, но как мне в следующий раз понимать, что нужно еще что-то настроить и в каком порядке? Как вы дошли до этого? А почему в примере, в документации у autodesk просто включалась сетка? Как это работает? А много еще таких "приколов" в этом api?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Это так работает?
Да.
Я видимо, что-то не знаю, но как мне в следующий раз понимать, что нужно еще что-то настроить и в каком порядке?
Спрашивай, если что-то не будет работать.
Как вы дошли до этого?
Опыт (> 30 лет) и интуиция. :)
А много еще таких "приколов" в этом api?
Очень. :D
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение