请教一下,在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: 杨 昊霖
请问老师,我这用.net模仿的代码,测试运行时在约121行附近出错了,请问我该如何修正。谢谢。
class CreateDimCallback : DimensionCreateData { private DimensionStyle m_dimStyle; private DgnTextStyle m_textStyle; private Symbology m_symbology; private LevelId m_levelId; private DirectionFormatter m_directionFormatter; public CreateDimCallback(DimensionStyle dimStyle, DgnTextStyle textStyle, Symbology symb, LevelId levelId, DirectionFormatter formatter) { m_dimStyle = dimStyle; m_textStyle = textStyle; m_symbology = symb; m_levelId = levelId; m_directionFormatter = formatter; } public override DimensionStyle GetDimensionStyle() { return m_dimStyle; } public override DgnTextStyle GetTextStyle() { return m_textStyle; } public override Symbology GetSymbology() { return m_symbology; } public override LevelId GetLevelId() { return m_levelId; } public override DirectionFormatter GetDirectionFormatter() { return m_directionFormatter; } public override int GetViewNumber() { return 0; } public override DMatrix3d GetDimensionRotation() { return DMatrix3d.Identity; } public override DMatrix3d GetViewRotation() { return DMatrix3d.Identity; } } private void CreateAngleDimension2() { double g_1mu = ActiveDgnModel.GetModelInfo().UorPerMeter; DgnFile dgnFile = ActiveDgnModel.GetDgnFile(); DimensionStyle dimStyle = DimensionStyle.GetSettings(dgnFile); DgnTextStyle txtStyle = DgnTextStyle.GetSettings(dgnFile); LevelHandle dimLevel = ActiveDgnModel.GetOrCreateLevel("Default"); LevelId lvId = dimLevel.LevelId; Symbology symb = new Symbology { Style = 0, Weight = 0, Color = 0 }; DirectionFormatter dirFormatter = new DirectionFormatter(ActiveDgnModel); var callback = new CreateDimCallback(dimStyle, txtStyle, symb, dimLevel.LevelId, dirFormatter); //EditElementHandle dimElem; //if (SUCCESS != DimensionHandler.CreateDimensionElement(dimEeh, *createDimdata, DimensionType.AngleLines, // true, ActiveModel)) //{ // return; //} DimensionElement dimElem = new DimensionElement(ActiveDgnModel, callback, DimensionType.AngleLines); dimElem.SetLevelId(dimLevel.LevelId); //EditElementHandle lineEeh, lineEeh1; DPoint3d pt1 = DPoint3d.FromXYZ(0, 0, 0); DPoint3d pt2 = DPoint3d.FromXYZ(10 * g_1mu, 0, 0); //DSegment3d seg = DSegment3d.From(pt1, pt2); DPoint3d pt3 = DPoint3d.FromXYZ(0, 0, 0); DPoint3d pt4 = DPoint3d.FromXYZ(0, 10 * g_1mu, 0); //DSegment3d seg2 = DSegment3d.From(pt3, pt4); DPoint3d pt5 = DPoint3d.FromXYZ(5 * g_1mu, 5 * g_1mu, 0); // LineHandler.CreateLineElement(lineEeh, nullptr, seg, true, *ACTIVEMODEL); // lineEeh.AddToModel(); LineElement lineEle = new LineElement(ActiveDgnModel, null, new DSegment3d(pt1, pt2)); lineEle.SetLevelId(dimLevel.LevelId); lineEle.AddToModel(); LineElement lineEle1 = new LineElement(ActiveDgnModel, null, new DSegment3d(pt3, pt4)); lineEle1.SetLevelId(dimLevel.LevelId); lineEle1.AddToModel(); // // LineHandler.CreateLineElement(lineEeh1, nullptr, seg2, true, *ACTIVEMODEL); // lineEeh1.AddToModel(); AssociativePoint assocPt1 = new AssociativePoint(), assocPt3 = new AssociativePoint(); assocPt1.InitializeKeypoint(0, 2, 0, 1); assocPt1.SetRoot(lineEle.ElementId, new ElementId(), 0); assocPt3.InitializeKeypoint(1, 2, 0, 1); assocPt3.SetRoot(lineEle1.ElementId, new ElementId(), 1); //IDimensionEdit* iDimEdit = dynamic_cast<IDimensionEdit*>(&dimElem.GetHandler()); //DimensionEdit dimensionEdit = dimElem as DimensionEdit; BentleyStatus bentleyStatus = dimElem.InsertPoint(pt1, assocPt1, dimStyle, -1); Trace.Assert(bentleyStatus == BentleyStatus.Success); // if (SUCCESS != iDimEdit->InsertPoint(dimElem, &pt1, &assocPt1, DimStyle, -1)) // { // return; // } bentleyStatus = dimElem.InsertPoint(pt4, assocPt3, dimStyle, -1); Trace.Assert(bentleyStatus == BentleyStatus.Success); /// 这里的断言没有成功。 // if (SUCCESS != iDimEdit->InsertPoint(dimElem, &pt4, &assocPt3, DimStyle, -1)) // { // return; // } bentleyStatus = dimElem.InsertPoint(pt2, null, dimStyle, -1); Trace.Assert(bentleyStatus == BentleyStatus.Success); // if (SUCCESS != iDimEdit->InsertPoint(dimElem, &pt2, nullptr, DimStyle, -1)) // { // return; // } dimElem.SetRotationMatrix(DMatrix3d.Identity); //EditElementHandle dimEeh; //iDimEdit->SetRotationMatrix(dimEeh, RotMatrix.FromIdentity()); if (dimElem.IsValid) { dimElem.AddToModel(); } }
搜索
复制
这个值应该是0
谢谢郭老师,问题解决了。