Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Mirco от 30-05-2020, 16:44:52

Название: Подскажите пожалуйста, как правильно создавать Viewports .Net ?
Отправлено: Mirco от 30-05-2020, 16:44:52
Здравствуйте друзья, только начал разбираться с программированием под 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.     }
Название: Re: Подскажите пожалуйста, как правильно создавать Viewports .Net ?
Отправлено: Александр Ривилис от 30-05-2020, 17:40:54
Mirco,
Приветствую на форуме!
У нас принято правило: "Один вопрос - одна тема". Просьба в дальнейшем придерживаться его.
Название: Re: Подскажите пожалуйста, как правильно создавать Viewports .Net ?
Отправлено: Александр Ривилис от 30-05-2020, 17:42:46
Создаю, примерно, как в документации и получается видовой экран, но без сетки. И сетку ни включить, ни выключить нельзя.
А где ты задаешь отображение сетки? В коде я этого не увидел. Давай пока в этой теме разберёмся с сеткой.
Название: Re: Подскажите пожалуйста, как правильно создавать Viewports .Net ?
Отправлено: Mirco от 30-05-2020, 18:04:22
Создаю, примерно, как в документации и получается видовой экран, но без сетки. И сетку ни включить, ни выключить нельзя.
А где ты задаешь отображение сетки? В коде я этого не увидел. Давай пока в этой теме разберёмся с сеткой.
acVport.GridOn = true; - я думал это включает выключает отображение сетки в ВЭ?! В самом ВЭ F7 уже не работает.
Название: Re: Подскажите пожалуйста, как правильно создавать Viewports .Net ?
Отправлено: Александр Ривилис от 30-05-2020, 18:21:20
Сравни свой код и этот:
Код - 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. }

Мой код работает так как ты хотел?
Название: Re: Подскажите пожалуйста, как правильно создавать Viewports .Net ?
Отправлено: Mirco от 30-05-2020, 18:32:46
Мой код работает так как ты хотел?
Спасибо. Да, он работает верно. Я задумывался о том, чтобы настроить сначала сетку, но не знал что именно настраивать. Это так работает? Даже инкремент настраивал.  Я видимо, что-то не знаю, но как мне в следующий раз понимать, что нужно еще что-то настроить и в каком порядке? Как вы дошли до этого? А почему в примере, в документации у autodesk просто включалась сетка? Как это работает? А много еще таких "приколов" в этом api?
Название: Re: Подскажите пожалуйста, как правильно создавать Viewports .Net ?
Отправлено: Александр Ривилис от 30-05-2020, 20:01:52
Это так работает?
Да.
Я видимо, что-то не знаю, но как мне в следующий раз понимать, что нужно еще что-то настроить и в каком порядке?
Спрашивай, если что-то не будет работать.
Как вы дошли до этого?
Опыт (> 30 лет) и интуиция. :)
А много еще таких "приколов" в этом api?
Очень. :D