www.mxdraw.com
内容索引主面
前一个向上下一个
IMxDrawDimension 接口

表示AutoCAD中所有标注实体类型的类的基类型

IDL
[ object, uuid(8A9CBCF3-EC92-438B-8AD7-9266865BC6BA), dual, nonextensible, helpstring("IMxDrawDimension interface"), pointer_default(unique) ]
interface IMxDrawDimension : IMxDrawEntity;

MxDrawDimension.idl

例如: 修一个标注长度,标注的直线也跟着变化,C#例子

用来选择实体对象.
        MxDrawUiPrEntity getEntity = new MxDrawUiPrEntity();
        getEntity.message = "选择实体";
      
        // 设置选择过滤条件.
        MxDrawResbuf selFilter = new MxDrawResbuf();

        // 5020是实体类型的DXF组码. DIM是类型。
        selFilter.AddStringEx("ALIGNEDDIMENSION",5020);
        getEntity.setFilter(selFilter);

        // 开始选择实体。

        if(getEntity.go() != MCAD_McUiPrStatus.mcOk)
            return;

        // 得到选择的实体.
        MxDrawEntity ent = getEntity.Entity();

        if (ent == null)
            return;

        if (!(ent is MxDrawDimAligned) )
        {
            return;
        }

        // 得到选择的标注.
        MxDrawDimAligned dimAligned = (MxDrawDimAligned)ent;

        // 尺寸标注改成60
        double dNewDist = 60.0;

        // 当前标注的两个点坐标。
        MxDrawPoint pt1 = dimAligned.XLine1Point;
        MxDrawPoint pt2 = dimAligned.XLine2Point;

        // 计算pt1到pt2的向量.
        MxDrawVector3d vec = pt2.SumVector(pt1);

        // 把向量单位化
        vec.Normalize();

        //把向长度变成新距离.
        vec.Mult(dNewDist);

        // 算出在新距离下的新的坐标点。

        MxDrawPoint newPt = new MxDrawPoint();
        newPt.x = pt1.x;
        newPt.y = pt1.y;
    
        newPt.Add(vec);
    


        // 修改尺寸标注.
        dimAligned.XLine2Point = newPt;
        dimAligned.RecomputeDimBlock(true);

        // 查找尺寸标的直线段。并修改它。

        MxDrawResbuf filter = new MxDrawResbuf();
        filter.AddStringEx("LINE",5020);

        MxDrawSelectionSet ss = new MxDrawSelectionSet();
        // 得到标注的开始点上的实体.
        // 搜索精度。

        double dTol = 10;//axMxDrawX1.ViewLongToDocCoord(3);

        MxDrawPoint selPt1 = new MxDrawPoint();
   
        MxDrawPoint selPt2 = new MxDrawPoint();
  

        selPt1.x = pt1.x - dTol;
        selPt1.y = pt1.y - dTol;

        selPt2.x = pt1.x + dTol;
        selPt2.y = pt1.y + dTol;
        ss.Select(MCAD_McSelect.mcSelectionSetCrossing, selPt1, selPt2, filter);

    

        // 可能会得到多个实体,遍历所有实体,找到标注的直线对象。

        for(int i = 0;  i < ss.Count;i++)
        {
            MxDrawEntity findEnt = ss.Item(i);
            if (!(findEnt is MxDrawLine))
            {
                continue;
            }
            MxDrawLine line = (MxDrawLine)findEnt;

            // 得到直线的两个点坐标。
            MxDrawPoint sPt = line.StartPoint;
            MxDrawPoint ePt = line.EndPoint;

            double dDis1 = sPt.DistanceTo(pt1);
            double dDis2 = ePt.DistanceTo(pt1);

            if(dDis1 > dDis2)
            {
                if (dDis2 > dTol)
                    continue;

                if(sPt.DistanceTo(pt2) > dTol)
                    continue;
                // 直线的开始点,在pt2附近
                line.StartPoint = newPt;
                break;
            }
            else
            {
                if(dDis1 > dTol)
                    continue;

                if(ePt.DistanceTo(pt2) > dTol)
                    continue;

                // 直线的结束点,在pt2附近
                line.EndPoint = newPt;
                break;
            }

        }
        axMxDrawX1.ZoomAll();

例如: 得到图上所有标注的标注文本

        //  定义一个构造选择集对象。

        MxDrawSelectionSet ss = new MxDrawSelectionSet();

        // 选择图上所有对象.
        ss.AllSelect();

        for(int i = 0; i < ss.Count;i++)
        {
            // 遍历到一个对象。
            MxDrawEntity ent = (MxDrawEntity) ss.Item(i);

             if (ent is MxDrawDimension)
             {
                 // 如果是一个标注对象.
                 MxDrawDimension dim = (MxDrawDimension)ent;

                 // 得到标注对象文本.
                 String sTxt = dim.DimensionText;
                 if(sTxt.Length == 0)
                 {
                     // 如果文本为空,表示,标注文字是自动生成的
                     // 打碎标注对象,得到里面的文字对象.
                    MxDrawResbuf ret = dim.GetProp("ExplodeEx");

                    for(int j = 0; j < ret.Count;j++)
                    {
                        MxDrawMcDbObject obj = ret.AtObject(i);
                        if(obj == null)
                            continue;

                     
                        if(obj is MxDrawMText)
                        {
                            // 该对象是个多行文本

                            // 取到文字对象,得到文字符串.
                            MxDrawMText txt = (MxDrawMText)obj;
                            sTxt = txt.Contents;
                            break;
                        }
                        else if(obj is MxDrawText)
                        {
                            // 该对象是个单行文本
                             MxDrawText txt = (MxDrawText)obj;
                            sTxt = txt.TextString;
                            break;
                        }

      
                    }
                 }

                 // 显示得到文字内容
                 MessageBox.Show(sTxt);

                 // 显示对象的线型
                 MessageBox.Show(ent.LineType);
             }

        }
Copyright (c) 2010. All rights reserved.
你认为该帮助怎么样? 发送反馈信息!