[MSCE C++] DimensionHandler如何使用

各位老师好,想使用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元素的特性的。