ADN Club > ObjectARX
AcDbMLeader обновление текстового стиля
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:
Спасибо Александр!
всё заработало!
не подскажите где можно про эти реакторы почитать?
в документации ничего ценного нету
Навигация
Перейти к полной версии