请教一下,在Dimension标注的过程中,通过DimensionType来选择标注类型,当我选择不同类型的时候,需要设置的插入点也不同,比如对于普通的长度标注DimensionType::SizeArrow最少需要设置2个插入点,而对于DimensionType::AngleAxis任意角度的标注来说需要设置3个插入点。但是当我在测试DimensionType::AngleLines的时候,要标注两条直线之间的角度,我测试通过设置插入点的方法没有成功,再MS里面的操作方法是选择两条直线和任意点来完成标注,但是我看帮助文档里面没有找到设置关联元素的方法,对于标注和X轴之间的角度也一样,请问一下该如何正确设置两条直线间角度的标注。我的代码如下。
public class CreateDimensionCallbacks : public IDimCreateData { private: DimensionStylePtr m_dimStyle; DgnTextStylePtr m_textStyle; Symbology m_symbology; LevelId m_levelId; DirectionFormatterPtr m_directionFormatter; RotMatrix m_rot1; RotMatrix m_rot2; public: CreateDimensionCallbacks(DimensionStylePtr dimstyle, DgnTextStylePtr textstyle, Symbology symb, LevelId levelId, DirectionFormatterPtr formatter, RotMatrix rot1, RotMatrix rot2) { m_dimStyle = dimstyle; m_textStyle = textstyle; m_symbology = symb; m_levelId = levelId; m_directionFormatter = formatter; m_rot1 = rot1; m_rot2 = rot2; } virtual DimensionStyleCR _GetDimStyle() const { return *m_dimStyle; } virtual DgnTextStyleCR _GetTextStyle() const { return *m_textStyle; } virtual Symbology _GetSymbology() const { return m_symbology; } virtual LevelId _GetLevelID() const { return m_levelId; } virtual DirectionFormatterCR _GetDirFormat() const { return *m_dirFormatter; } virtual int _GetViewNumber() const { return 0; } virtual RotMatrixCR _GetDimRMatrix() const { return m_rot1; } virtual RotMatrixCR _GetViewRMatrix() const { return m_rot2; } virtual bool _GetAnnScaleAllowed() const { return true; } }; void CreateDime() { EditElementHandle dimEeh; double g_1mu = ISessionMgr::GetActiveDgnModelP()->GetModelInfoCP()->GetUorPerMeter(); DgnFilePtr pActiveDgnFile = ISessionMgr::GetActiveDgnFile(); DgnModelP pActiveModel = ISessionMgr::GetActiveDgnModelP(); DimensionStylePtr pDimStyle = DimensionStyle::GetSettings(*pActiveDgnFile); DgnTextStylePtr textStyle = DgnTextStyle::GetSettings(*pActiveDgnFile); LevelId lvId = pActiveModel->GetLevelCache().GetLevelByName(L"Default").GetLevelId(); Symbology symb; symb.style = 0; symb.weight = 0; symb.color = 0; DirectionFormatterPtr dirFormatter = DirectionFormatter::Create(*pActiveModel); RotMatrixCR rMatrix1 = RotMatrix::FromIdentity(); RotMatrixCR rMatrix2 = RotMatrix::FromIdentity(); CreateDimensionCallbacks createDimdata = new CreateDimensionCallbacks(pDimStyle, textStyle, symb, lvId, dirFormatter, rMatrix1, rMatrix2); if (SUCCESS != DimensionHandler::CreateDimensionElement(dimEeh, createDimdata, DimensionType::AngleLines, true, *pActiveModel)) { return; } EditElementHandle lineEeh, lineEeh1; DPoint3d pt1 = DPoint3d::From(0, 0, 0); DPoint3d pt2 = DPoint3d::From(10 * g_1mu, 0, 0); DSegment3d seg = DSegment3d::From(pt1, pt2); DPoint3d pt3 = DPoint3d::From(0, 0, 0); DPoint3d pt4 = DPoint3d::From(0, 10 * g_1mu, 0); DSegment3d seg2 = DSegment3d::From(pt3, pt4); DPoint3d pt5 = DPoint3d::From(5 * g_1mu, 5 * g_1mu, 0); LineHandler::CreateLineElement(lineEeh, nullptr, seg, true, *ACTIVEMODEL); lineEeh.AddToModel(); LineHandler::CreateLineElement(lineEeh1, nullptr, seg2, true, *ACTIVEMODEL); lineEeh1.AddToModel(); AssocPoint assocPt1, assocPt3; AssociativePoint::InitKeypoint(assocPt1, 0, 2, 0, 1); AssociativePoint::SetRoot(assocPt1, lineEeh.GetElementId(), 0); AssociativePoint::InitKeypoint(assocPt3, 1, 2, 0, 1); AssociativePoint::SetRoot(assocPt3, lineEeh.GetElementId(), 0); IDimensionEdit* iDimEdit = dynamic_cast<IDimensionEdit*>(&dimEeh.GetHandler()); iDimEdit->InsertPoint(dimEeh, &pt1, &assocPt1, *pDimStyle, -1); iDimEdit->InsertPoint(dimEeh, &pt3, &assocPt3, *pDimStyle, -1); iDimEdit->InsertPoint(dimEeh, &pt5, nullptr, *pDimStyle, -1); iDimEdit->SetRotationMatrix(dimEeh, RotMatrix::FromIdentity()); if (dimEeh.IsValid()) { dimEeh.AddToModel(); } }
插入的点不对,用我下边改过后的试试:
void CreateDime() { EditElementHandle dimEeh; double g_1mu = ISessionMgr::GetActiveDgnModelP()->GetModelInfoCP()->GetUorPerMeter(); DgnFilePtr pActiveDgnFile = ISessionMgr::GetActiveDgnFile(); DgnModelP pActiveModel = ISessionMgr::GetActiveDgnModelP(); DimensionStylePtr pDimStyle = DimensionStyle::GetSettings(*pActiveDgnFile); DgnTextStylePtr textStyle = DgnTextStyle::GetSettings(*pActiveDgnFile); LevelId lvId = pActiveModel->GetLevelCache().GetLevelByName(L"Default").GetLevelId(); Symbology symb; symb.style = 0; symb.weight = 0; symb.color = 0; DirectionFormatterPtr dirFormatter = DirectionFormatter::Create(*pActiveModel); RotMatrixCR rMatrix1 = RotMatrix::FromIdentity(); RotMatrixCR rMatrix2 = RotMatrix::FromIdentity(); CreateDimensionCallbacks* createDimdata = new CreateDimensionCallbacks(pDimStyle, textStyle, symb, lvId, dirFormatter, rMatrix1, rMatrix2); if (SUCCESS != DimensionHandler::CreateDimensionElement(dimEeh, *createDimdata, DimensionType::AngleLines, true, *pActiveModel)) { return; } EditElementHandle lineEeh, lineEeh1; DPoint3d pt1 = DPoint3d::From(0, 0, 0); DPoint3d pt2 = DPoint3d::From(10 * g_1mu, 0, 0); DSegment3d seg = DSegment3d::From(pt1, pt2); DPoint3d pt3 = DPoint3d::From(0, 0, 0); DPoint3d pt4 = DPoint3d::From(0, 10 * g_1mu, 0); DSegment3d seg2 = DSegment3d::From(pt3, pt4); DPoint3d pt5 = DPoint3d::From(5 * g_1mu, 5 * g_1mu, 0); LineHandler::CreateLineElement(lineEeh, nullptr, seg, true, *ACTIVEMODEL); lineEeh.AddToModel(); LineHandler::CreateLineElement(lineEeh1, nullptr, seg2, true, *ACTIVEMODEL); lineEeh1.AddToModel(); AssocPoint assocPt1, assocPt3; AssociativePoint::InitKeypoint(assocPt1, 0, 2, 0, 1); AssociativePoint::SetRoot(assocPt1, lineEeh.GetElementId(), 0); AssociativePoint::InitKeypoint(assocPt3, 1, 2, 0, 1); AssociativePoint::SetRoot(assocPt3, lineEeh1.GetElementId(), 1); IDimensionEdit* iDimEdit = dynamic_cast<IDimensionEdit*>(&dimEeh.GetHandler()); if (SUCCESS != iDimEdit->InsertPoint(dimEeh, &pt1, &assocPt1, *pDimStyle, -1)) { return; } if (SUCCESS != iDimEdit->InsertPoint(dimEeh, &pt4, &assocPt3, *pDimStyle, -1)) { return; } if (SUCCESS != iDimEdit->InsertPoint(dimEeh, &pt2, nullptr, *pDimStyle, -1)) { return; } iDimEdit->SetRotationMatrix(dimEeh, RotMatrix::FromIdentity()); if (dimEeh.IsValid()) { dimEeh.AddToModel(); } }
Answer Verified By: 杨 昊霖
郭老师,我这里还是不行,我调试的时候,在第二个插入点的时候就返回了,就是这一行代码
if (SUCCESS != iDimEdit->InsertPoint(dimEeh, &pt4, &assocPt3, *pDimStyle, -1)) { return; }
第二次调用AssociativePoint::SetRoot(assocPt3, lineEeh1.GetElementId(), 1);时,请确认用的是lineEeh1,我修改的时候发现您调的是lineEeh
成功了,谢谢郭老师,我粗心大意了,关于插入点我还需要多研究研究
郭老师,麻烦再请教一个问题,我在C++利用Dimension标注的时候,想导入一个RotMatrixCR旋转矩阵,标注2点之间的距离,我在三维中成功了,但是在二维里怎么试都不行,我看了其他帖子,也还是不行,比如说我想标注点(0,0,0)和点(10,5,0)之间的距离,应该怎么构造旋转矩阵