尺寸标注元素中的旋转矩阵


我们在创建尺寸标注元素时,可以通过Bentley.DgnPlatformNET.Elements.DimensionElement的构造函数来创建,其函数原型如下所示:

public DimensionElement(DgnModel model, DimensionCreateData createData, DimensionType dimType);

可以看到函数参数中有一个“DimensionCreateData”类型,其定义如下所示:

public abstract class DimensionCreateData
    {
        protected DimensionCreateData();

        public abstract DMatrix3d GetDimensionRotation();
        public abstract DimensionStyle GetDimensionStyle();
        public abstract DirectionFormatter GetDirectionFormatter();
        public abstract LevelId GetLevelId();
        public abstract Symbology GetSymbology();
        public abstract DgnTextStyle GetTextStyle();
        public abstract int GetViewNumber();
        public abstract DMatrix3d GetViewRotation();
}

这是一个“abstract”的类型,在创建尺寸标注元素时,提供了尺寸标注元素所需的尺寸标注样式,符号化属性等信息。其中有两个返回“DMatrix3d”类型的成员函数:GetDimensionRotation和GetViewRotation。这两个旋转矩阵共同决定了尺寸标注元素的方向,我们先看GetViewRotation是如何影响新创建的尺寸标注元素的。如下图所示的两个尺寸标注元素:

通过keyin命令“analyze element”可以看到这两个标注元素属性中两个旋转矩阵的值如下所示:

可以看到两个尺寸标注元素的Rotation是一样的都是标准矩阵,而View Rotation是不一样的,左边的是标准矩阵,而右边的是底视图(Bottom View)的旋转矩阵,正是由于View Rotation的不同导致的两个尺寸标注元素的文字之间有一个镜像的效果。我们从底视图上观察的话效果如下所示:

所以我们在创建尺寸标注元素时,如果需要这样的效果的话,是需要通过View Rotation来控制的。而另外一个GetDimensionRotation函数返回的旋转矩阵控制的是什么呢?我们先看下图所示的这个尺寸标注元素:

通过keyin命令“analyze element”可以查到其标注点坐标以及旋转矩阵如下所示:

可以看到这里尺寸标注元素标注的是两个点在X轴方向上的长度,那么如果我们要标注出两个点之间的距离的话该如何实现呢?这里我们就要以这两个点构成的向量为X轴去构造一个旋转矩阵,在GetDimensionRotation函数中返回就可以了。下图是标注出这两个点之间距离的尺寸标注元素:

其旋转矩阵如下所示:

可以看到Rotation中第一列的三个值构成的向量即这两个点之间的向量标准化或者说单位化(方向不变,长度变为1)后的值。