ADN Club > ObjectARX

AcDbMLeader обновление текстового стиля

(1/3) > >>

begiz:
Добрый вечер,
Такая ситуация :
1. я создаю мултивыноски программно
2. с ними всё хорошо в плане отображения

НО! если я в настройках стиля выноски меняю например стиль текста (средствами автокада, не програмно),
то это изменение не отображается и не применяется к выноске пока я её не сдвину.

Если я создаю мултивыноску не програмно, это изменение отображается моментально

отсюда вывод, что я как-то не так или не до конца инициализирую выноску когда создаю програмно.
может там какой то реактор прицепить нужно или еще чтото?


--- Код - C++ [Выбрать] ---AcDbObjectPointer<AcDbMLeader> pMLeader;pMLeader.create();pMLeader->setDatabaseDefaults();pMLeader->addLeader(ibx);pMLeader->addLeaderLine(ibx, idx);pMLeader->addFirstVertex(idx, point1);pMLeader->addLastVertex(idx, point2);                pMLeader->setLayer(_T("Leaders"));pMLeader->setColorIndex(BYLAYER);                 AcDbMText * mText = new AcDbMText();mText->setDatabaseDefaults();mText->setContents(_T("TEST"));mText->setTextStyle(textStyleId);mText->setTextHeight(textHeight);mText->setLineSpacingStyle(AcDb::kExactly);mText->setLayer(pMLeader->layer());mText->setColorIndex(BYLAYER);pMLeader->setContentType(AcDbMLeaderStyle::kMTextContent);pMLeader->setMText(mText);delete mText;if (point1.x > point2.x)        {           pMLeader->setDoglegDirection(ibx, AcGeVector3d(-1, 0, 0));           pMLeader->setTextAlignmentType(AcDbMLeaderStyle::kRightAlignment);        }        else        {           pMLeader->setDoglegDirection(ibx, AcGeVector3d(1, 0, 0));           pMLeader->setTextAlignmentType(AcDbMLeaderStyle::kLeftAlignment);        } pMLeader->setTextLocation(point2); pMLeader->setMLeaderStyle(mlStyleId);pMLeader->updateLeaderLinePosition(); leaderId = addToDataBase(pMLeader);pMLeader->close(); 

Александр Ривилис:
Я не увидел в этом коде вызова pMLeader->setTextStyleId(textStyleId)

Александр Ривилис:
begiz,
Оказалось не всё так просто. Я поэкспериментировал и так и не смог повторить поведение, аналогичное тому как это происходит с MLEADER, созданным обычной командой AutoCAD. Отправил запрос в ADN DevHelp. По результатам отпишусь.

Александр Ривилис:
Только отправил запрос в ADN DevHelp, как меня осенило, что требуется связать AcDbMLeaderStyle с AcDbMLeader - иначе как же ему знать, что требуется обновить AcDbMLeader после изменения AcDbMLeaderStyle. Думаю (хотя и не проверял), что это повлияет не только на изменение текстового стиля.

--- Код - C++ [Выбрать] ---static void RivilisCRML(){  int ibx = 0;  int idx = 0;  double textHeight = 5;  AcGePoint3d point1, point2;  if (acedGetPoint(NULL, _T("\nFirst point: "), asDblArray(point1)) != RTNORM ||      acedGetPoint(asDblArray(point1), _T("\nSecond point: "), asDblArray(point2)) != RTNORM)       return;  AcDbObjectPointer<AcDbMLeaderStyle> pMLStyle(acdbCurDwg()->mleaderstyle(), AcDb::kForRead);  AcDbObjectPointer<AcDbMLeader> pMLeader;  pMLeader.create();  pMLeader->setDatabaseDefaults();  AcDbObjectId leaderId = addToDataBase(pMLeader);   pMLeader->addLeader(ibx);  pMLeader->addLeaderLine(ibx, idx);  pMLeader->addFirstVertex(idx, point1);  pMLeader->addLastVertex(idx, point2);   // pMLeader->setLayer(_T("Leaders"));  pMLeader->setColorIndex(0);   if (point1.x > point2.x)  {    pMLeader->setDoglegDirection(ibx, AcGeVector3d(-1, 0, 0));    pMLeader->setTextAlignmentType(AcDbMLeaderStyle::kRightAlignment);  }  else  {    pMLeader->setDoglegDirection(ibx, AcGeVector3d(1, 0, 0));    pMLeader->setTextAlignmentType(AcDbMLeaderStyle::kLeftAlignment);  }   pMLeader->setTextLocation(point2);   AcDbMText* mText = new AcDbMText();  mText->setDatabaseDefaults();  mText->setContents(_T("TEST"));  mText->setTextStyle(pMLStyle->textStyleId());  mText->setTextHeight(textHeight);  mText->setLineSpacingStyle(AcDb::kExactly);  mText->setLayer(pMLeader->layer());  mText->setColorIndex(0);  pMLeader->setContentType(AcDbMLeaderStyle::kMTextContent);  pMLeader->setMText(mText);  delete mText;   pMLeader->updateLeaderLinePosition();  pMLeader->setTextStyleId(pMLStyle->textStyleId());  pMLeader->setOverride(AcDbMLeader::PropertyOverrideType::kTextStyleId, false);  pMLeader->setMLeaderStyle(acdbCurDwg()->mleaderstyle());  // Указываем MLeaderStyle, что от него зависит MLeader  if (pMLStyle->upgradeOpen() == Acad::eOk)  {    pMLStyle->addPersistentReactor(leaderId);  } }

begiz:
Спасибо Александр!
всё заработало!

не подскажите где можно про эти реакторы почитать?
в документации ничего ценного нету

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии