各位老师好,想使用DimensionHandler创建一个标注,但是DimensionHandler::CreateDimensionElement参数列表里,有IDimCreateData的结构需要定义,不知道该如何处理,还请老师明示,非常感谢
给您一个MSCE C#的例子,您可以仿照着用C++改写一下。CE版的C#和C++对象模型基本一致。
class CreateDimensionCallbacks : DimensionCreateData { private DimensionStyle m_dimStyle; private DgnTextStyle m_textStyle; private Symbology m_symbology; private LevelId m_levelId; private DirectionFormatter m_directionFormatter; public CreateDimensionCallbacks(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 int GetViewNumber() { return 0; } public override DMatrix3d GetDimensionRotation() { return DMatrix3d.Identity; } public override DMatrix3d GetViewRotation() { return DMatrix3d.Identity; } public override DirectionFormatter GetDirectionFormatter() { return m_directionFormatter; } } class CreateElement { public static void LinearAndAngularDimension(string unparsed) { DgnFile oFile = Session.Instance.GetActiveDgnFile(); DgnModel oModel = Session.Instance.GetActiveDgnModel(); double uorPerMast = oModel.GetModelInfo().UorPerMaster; DimensionStyle dimStyle = new DimensionStyle("DimStyle", oFile); dimStyle.SetBooleanProp(true, DimStyleProp.Placement_UseStyleAnnotationScale_BOOLINT); dimStyle.SetDoubleProp(1, DimStyleProp.Placement_AnnotationScale_DOUBLE); dimStyle.SetBooleanProp(true, DimStyleProp.Text_OverrideHeight_BOOLINT); dimStyle.SetDistanceProp(0.5 * uorPerMast, DimStyleProp.Text_Height_DISTANCE, oModel); dimStyle.SetBooleanProp(true, DimStyleProp.Text_OverrideWidth_BOOLINT); dimStyle.SetDistanceProp(0.4 * uorPerMast, DimStyleProp.Text_Width_DISTANCE, oModel); dimStyle.SetBooleanProp(true, DimStyleProp.General_UseMinLeader_BOOLINT); dimStyle.SetDoubleProp(0.01, DimStyleProp.Terminator_MinLeader_DOUBLE); dimStyle.SetBooleanProp(true, DimStyleProp.Value_AngleMeasure_BOOLINT); dimStyle.SetAccuracyProp ((byte)AnglePrecision.Use1Place, DimStyleProp.Value_AnglePrecision_INTEGER); DgnTextStyle textStyle = new DgnTextStyle("TestStyle", oFile); LevelId lvlId = Settings.GetLevelIdFromName("Default"); CreateDimensionCallbacks callbacks = new CreateDimensionCallbacks(dimStyle, textStyle, new Symbology(), lvlId, null); DimensionElement oDim = new DimensionElement(oModel, callbacks, DimensionType.SizeArrow); if (oDim.IsValid) { DPoint3d pt = new DPoint3d(0, -17 * uorPerMast, 0); oDim.InsertPoint(pt, null, dimStyle, -1); pt.X += 3*uorPerMast; oDim.InsertPoint(pt, null, dimStyle, -1); oDim.SetHeight(uorPerMast); oDim.AddToModel(); } oDim = new DimensionElement(oModel, callbacks, DimensionType.AngleSize); if (oDim.IsValid) { DPoint3d pt = new DPoint3d(7*uorPerMast, -13 * uorPerMast, 0); oDim.InsertPoint(pt, null, dimStyle, -1); pt = DPoint3d.FromXY (5*uorPerMast, -15*uorPerMast); oDim.InsertPoint(pt, null, dimStyle, -1); pt = DPoint3d.FromXY (9*uorPerMast, -15*uorPerMast); oDim.InsertPoint(pt, null, dimStyle, -1); oDim.SetHeight(uorPerMast); oDim.AddToModel(); } } }
Answer Verified By: guoguowusheng
谢谢符老师的回答,但是不太明白定义IDimCreateData的作用是干什么?
这个IDimCreateData是用来控制你创建出的Dimension元素的样子的。你看代码中需要先new一个派生于此的类的实例,new时需要指定Dimension元素的dimStyle、textStyle等特性。而在真正创建Dimension元素时,new DimensionElement中仅仅有这个实例而没有了dimStyle、textStyle等参数。
同样道理,C++的DimensionHandler::CreateDimensionElement中也只是通过指定IDimCreateData的一个实例来指定Dimension元素的特性的。