【MS C++】关于角度标注

请教一下,在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();
	}
}

Parents
  • 插入的点不对,用我下边改过后的试试:

    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();
                }
            }
    

  • 谢谢郭老师,问题解决了。

Reply Children
No Data