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

31/10/2021

Как обеспечить синхронизацию AcDbMLeader с его стилем AcDbMLeaderStyle

Как обеспечить синхронизацию AcDbMLeader с его стилем AcDbMLeaderStyle

Вопрос: Если создавать мультивыноску (класс AcDbMLeader) при помощи команды _MLEADER, то эта мультивыноска будет следовать изменениям в её стиле мультивыноски (класс AcDbMLeaderStyle). А если создавать при помощи кода, то мультивыноска не следует за изменениями в стиле мултивыноски. Почему? И как сделать, чтобы поведение созданной программно мультивыноски было такой же, что и у созданной в команде _MLEADER?

Ответ: Для того, чтобы сделать такое поведение необходимо выполнить два условия:

1)      Необходимо вызвать метод  AcDbMLeader::setOverride  с параметром isOverride == false (это значит, что параметр не переопределён в мултивыноске и используется тот, который в стиле мультивыноски) и параметром propertyType соответствующим тому свойству, которое должно браться из стиля мультивыноски. Вызывать этот метод можно несколько раз с разными значениями propertyType.

2)      Необходимо вызвать метод AcDbMLeaderStyle::addPersistentReactor для того, чтобы добавить AcDbMLeader::objectId() к стилю мультивыноски, чтобы стиль был в курсе какие мультивыноски следует обновлять.

Пример:

Код - C++: [Выделить]
  1. static void RivilisCRML()
  2.     {
  3.       int ibx = 0;
  4.       int idx = 0;
  5.       double textHeight = 5;
  6.       AcGePoint3d point1, point2;
  7.       if (acedGetPoint(NULL, _T("\nFirst point: "), asDblArray(point1)) != RTNORM ||
  8.           acedGetPoint(asDblArray(point1), _T("\nSecond point: "), asDblArray(point2)) != RTNORM)
  9.           return;
  10.       AcDbObjectPointer<AcDbMLeaderStyle> pMLStyle(acdbCurDwg()->mleaderstyle(), AcDb::kForRead);
  11.       AcDbObjectPointer<AcDbMLeader> pMLeader;
  12.       pMLeader.create();
  13.       pMLeader->setDatabaseDefaults();
  14.       AcDbObjectId leaderId = addToDataBase(pMLeader);
  15.     
  16.       pMLeader->addLeader(ibx);
  17.       pMLeader->addLeaderLine(ibx, idx);
  18.       pMLeader->addFirstVertex(idx, point1);
  19.       pMLeader->addLastVertex(idx, point2);
  20.     
  21.       // pMLeader->setLayer(_T("Leaders"));
  22.       pMLeader->setColorIndex(0);
  23.     
  24.       if (point1.x > point2.x)
  25.       {
  26.         pMLeader->setDoglegDirection(ibx, AcGeVector3d(-1, 0, 0));
  27.         pMLeader->setTextAlignmentType(AcDbMLeaderStyle::kRightAlignment);
  28.       }
  29.       else
  30.       {
  31.         pMLeader->setDoglegDirection(ibx, AcGeVector3d(1, 0, 0));
  32.         pMLeader->setTextAlignmentType(AcDbMLeaderStyle::kLeftAlignment);
  33.       }
  34.     
  35.       pMLeader->setTextLocation(point2);
  36.     
  37.       AcDbMText* mText = new AcDbMText();
  38.       mText->setDatabaseDefaults();
  39.       mText->setContents(_T("TEST"));
  40.       mText->setTextStyle(pMLStyle->textStyleId());
  41.       mText->setTextHeight(textHeight);
  42.       mText->setLineSpacingStyle(AcDb::kExactly);
  43.       mText->setLayer(pMLeader->layer());
  44.       mText->setColorIndex(0);
  45.       pMLeader->setContentType(AcDbMLeaderStyle::kMTextContent);
  46.       pMLeader->setMText(mText);
  47.       delete mText;
  48.     
  49.       pMLeader->updateLeaderLinePosition();
  50.       pMLeader->setTextStyleId(pMLStyle->textStyleId());
  51.       // Указываем, что свойство текстового стиля берётся из стиля мултивыноски
  52.       pMLeader->setOverride(AcDbMLeader::PropertyOverrideType::kTextStyleId, false);
  53.       pMLeader->setMLeaderStyle(acdbCurDwg()->mleaderstyle());
  54.       // Указываем MLeaderStyle, что от него зависит MLeader
  55.       if (pMLStyle->upgradeOpen() == Acad::eOk)
  56.       {
  57.         pMLStyle->addPersistentReactor(leaderId);
  58.       }
  59.     
  60.     }

 

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