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

24/01/2022

Как создать несколько видовых экранов модели с помощью API?

Вопрос:

Я хотел бы создать несколько видовых экранов в пространстве модели, например, четыре видовых экрана, которые делили бы экран на четыре равных части, как четыре разных вида одной и той же модели. Кроме того, я хотел бы делать это автоматически для каждого чертежа, который я создаю из пользовательского интерфейса. Как этого можно добиться при помощи ObjectARX?

Ответ:

В приведенном ниже примере кода показано, как создать четыре видовых экрана в пространстве модели с возможными разными представлениями модели. Для простоты задаются только параметры просмотра первого видового экрана.

Что касается выполнения этой обработки на каждом новом чертеже, то нам поможет выполнение нашего кода в реакторе AcApDocManagerReactor::documentCreated

Код - C++: [Выделить]
  1. void CreateViewPorts(AcDbDatabase* pDatabase, const ACHAR* vpName)
  2. {
  3.  AcDbViewportTable *pVT;
  4.  pDatabase->getSymbolTable(pVT, AcDb::kForWrite);
  5.  
  6.  AcDbDictionary* pVisualStyleDic;
  7.  pDatabase->getVisualStyleDictionary(pVisualStyleDic, AcDb::kForRead);
  8.  
  9.  AcGePoint2d ll, ur;
  10.  AcDbObjectId vStyleId;
  11.  
  12.  AcDbViewportTableRecord* pVTR1=new AcDbViewportTableRecord;
  13.  ll.set(0,0);
  14.  ur.set(0.5,0.5);
  15.  
  16.  pVisualStyleDic->getAt(L"2dWireframe", vStyleId);
  17.  
  18.  pVTR1->setCenterPoint(AcGePoint2d(0, 0));
  19.  pVTR1->setHeight(100);
  20.  pVTR1->setWidth(100);
  21.  pVTR1->setVisualStyle(vStyleId);
  22.  pVTR1->setViewDirection(AcDb::kTopView);
  23.  pVTR1->setLowerLeftCorner(ll);
  24.  pVTR1->setUpperRightCorner(ur);
  25.  pVTR1->setName(vpName);
  26.  
  27.  AcDbViewportTableRecord *pVTR2=new AcDbViewportTableRecord;
  28.  ll.set(0,0.5);
  29.  ur.set(0.5,1);
  30.  pVTR2->setLowerLeftCorner(ll);
  31.  pVTR2->setUpperRightCorner(ur);
  32.  pVTR2->setName(vpName);
  33.  
  34.  AcDbViewportTableRecord *pVTR3=new AcDbViewportTableRecord;
  35.  ll.set(0.5,0);
  36.  ur.set(1,0.5);
  37.  pVTR3->setLowerLeftCorner(ll);
  38.  pVTR3->setUpperRightCorner(ur);
  39.  pVTR3->setName(vpName);
  40.  
  41.  AcDbViewportTableRecord *pVTR4=new AcDbViewportTableRecord;
  42.  ll.set(0.5,0.5);
  43.  ur.set(1,1);
  44.  pVTR4->setLowerLeftCorner(ll);
  45.  pVTR4->setUpperRightCorner(ur);
  46.  pVTR4->setName(vpName);
  47.  
  48.  
  49.  pVT->add(pVTR1);
  50.  pVT->add(pVTR2);
  51.  pVT->add(pVTR3);
  52.  pVT->add(pVTR4);
  53.  
  54.  pVT->close();
  55.  
  56.  pVTR1->close();
  57.  pVTR2->close();
  58.  pVTR3->close();
  59.  pVTR4->close();
  60.  
  61.  acedCommandS(RTSTR, L"_.-VPORTS", RTSTR, L"_R", RTSTR, vpName, RTNONE);
  62. }

 

Источник: https://adndevblog.typepad.com/autocad/2012/07/how-to-create-multiple-model-space-viewports-from-api.html

 

Автор перевода: Александр Ривилис
Опубликовано 24.01.2022