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

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

    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)之间的距离,应该怎么构造旋转矩阵