Bentley二次开发教程08-元素变换及修改-单位

MicroStation单位

这里我们着重讨论一下MicroStation二次开发中单位的问题,因为元素时基于屏幕分辨率创建的,而我们需要写入的构件,如果需要与我们当前的单位所匹配,那么就必须在创建构件时,获得实际单位与屏幕分辨率的比值
关于修改主单位可以依次点击:File>Setting>File>Design File Settings
在这里插入图片描述

关于设置子单位的初衷:
设置子单位主要是为了英制单位服务的。我们知道1英尺等于12英寸,对于英制来说,我们可以将主单位设置为英尺,子单位设置为英寸。这样当你想输入2’5’'时,就可以直接输入2:5而不需要将5先转换成0.41666666666666667进而换算为2.416666666667.这种巧妙的设计对于公制来说反而显得多此一举了
在代码实现中,我们主要获取三种值,分别为用于获取主单位与分辨率的比值的UorPerMaster,用于获取子单位与分辨率单位的比值的UorPerSub和用于获取米与分辨率单位的比值的UorPerMeter。对于一些需要与主单位相同的情景,我们使用UorPerMaster进行单位的换算,但是,当我们在做一些标准构件时,比如说集水坑、钢筋、管线等,他不会因为当前主单位的不同尺寸有所改变,此时就需要使用UorPerMeter,保证在不同主单位条件下他们的换算关系是基于分辨率与米之间的

public static void CmdUnitConversion(string unparsed)
{
    double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//获取主单位与分辨率单位的比值
    double uorMeter = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMeter;//获取米与分辨率单位的比值
    double uorPerSub = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerSub;//获取子单位与分辨率单位的比值
    MessageBox.Show("UorPerMaster = "+ uorPerMas+ "\nUorPerMeter = "+uorMeter+ "\nuorPerSub = "+ uorPerSub);//提示框输出信息
}

元素变换

变换矩阵(DMatrix3d)

使用变换矩阵对元素进行移动,旋转等操作,它的用法十分灵活,可以使用它进行多为变换

public static void CmdElementTransformByMatrix(string unparsed)
{
    DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//定义当前激活的模型空间
    double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//获取主单位与分辨率单位的比值

    DPoint3d p1 = new DPoint3d(5 * uorPerMas, 5 * uorPerMas, 0);//定义形元素端点
    DPoint3d p2 = new DPoint3d(10 * uorPerMas, 5 * uorPerMas, 0);
    DPoint3d p3 = new DPoint3d(10 * uorPerMas, -5 * uorPerMas, 0);
    DPoint3d p4 = new DPoint3d(5 * uorPerMas, -5 * uorPerMas);
    DPoint3d[] pos = { p1, p2, p3, p4 };//将端点添加到端点集中

    ShapeElement shape = new ShapeElement(dgnModel, null, pos);//使用端点集定义形元素

    DMatrix3d matrix = new DMatrix3d(1, 0, 0, 0, 0, 1, 0, 1, 0);//定义变换矩阵
    DTransform3d trans = new DTransform3d(matrix);//定义变换几何            
    TransformInfo transform = new TransformInfo(trans);//使用变换几何定义变换信息
    shape.ApplyTransform(transform);//对形元素应用变换信息

    shape.AddToModel();//将在内存中定义形元素写入磁盘上文件的模型中
}

在本案例中,首先在XY平面内创建一个边长为10的形元素,然后使用变换矩阵,将Y坐标和Z坐标调换,后对形元素应用。生成结果我们可以看到的,在XZ平面生成了一个边长为10的形元素,其中原来Y的坐标值变成了Z值
在这里插入图片描述

平移

当我们需要对元素进行平移时,若使用变换矩阵的方式则需要首先对变换矩阵进行计算,十分麻烦,使用DTransform3d.fromTranslation()可以直接在输入参数中指定平移元素的XYZ坐标值,使用起来该更加方便

public static void CmdElementMove(string unparsed)
{
    DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//定义当前激活的模型空间
    double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//获取主单位与分辨率单位的比值

    DPoint3d startPo = DPoint3d.Zero;//定义直线起点
    DPoint3d endPo = new DPoint3d(10* uorPerMas,0,0);//定义直线终点
    DSegment3d segment = new DSegment3d(startPo,endPo);//定义几何直线
    LineElement line = new LineElement(dgnModel,null, segment);//定义线元素

    DPoint3d transInfo = new DPoint3d(0,5*uorPerMas,0);//定义平移信息 在本文中即向上平移五个单位
    DTransform3d trans = DTransform3d.FromTranslation(transInfo);//定义变换几何
    TransformInfo transform = new TransformInfo(trans);//使用变换几何定义变换信息
    line.ApplyTransform(transform);//对线元素应用变换信息

    line.AddToModel();//将线元素写入模型
}

在本案例中,首先在内存中定义了一个起点在基点,端点在(10,0,0)的直线,然后通过DPoint3d定义XYZ三个方向的平移距离,最后对直线进行应用。从结果我们可以看到,最初被定义的直线向Y方向平移5各单位。
在这里插入图片描述

绕基点旋转(Rotation)

当我们需要对元素进行旋转式,我们可以直接使用DTransform3d.Rotation()方法,其中,第一个参数定义旋转轴的向量,第二个参数记录旋转角度

public static void CmdElementRotateWithDefaultAxis(string unparsed)
{
    DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//定义当前激活的模型空间
    double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//获取主单位与分辨率单位的比值

    DPoint3d startPo = new DPoint3d(-10 * uorPerMas, 0, 0);//定义直线起点
    DPoint3d endPo = new DPoint3d(10 * uorPerMas, 0, 0);//定义直线终点
    DSegment3d segment = new DSegment3d(startPo, endPo);//定义几何直线
    LineElement line = new LineElement(dgnModel, null, segment);//定义线元素

    DVector3d vector = DVector3d.UnitZ;//定义旋转轴向量
    Angle angle = new Angle();//定义角度
    angle.Degrees = 45;//设置旋转角度为45度
                
    DTransform3d trans = DTransform3d.Rotation(vector, angle);//定义变换几何
    TransformInfo transform = new TransformInfo(trans);//使用变换几何定义变换信息
    line.ApplyTransform(transform);//对线元素应用变换信息

    line.AddToModel();//将线元素写入模型
}

在本案例中,首先创建了 一个起点在(-10,0,0),终点在(10,0,0)的直线,然后定义相关属性,这里我们设置其旋转轴方向为Z方向,选择45度,生成的结果即在线元素生产时旋转了45度
在这里插入图片描述

绕自定义轴旋转(Rotation)

当我们需要以指定的基准轴对元素进行旋转时,上面的方法就无法满足要求了,因此我们需要使用DTransform3d.FromRotationAroundLine(),在这个方法中我们需要首先依次定义旋转基点,旋转轴,旋转角度。

public static void CmdElementRotateWithCustomAxis(string unparsed)
{
    DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//定义当前激活的模型空间
    double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//获取主单位与分辨率单位的比值

    DPoint3d startPo = new DPoint3d(-10 * uorPerMas, 0, 0); ;//定义直线起点
    DPoint3d endPo = new DPoint3d(10 * uorPerMas, 0, 0);//定义直线终点
    DSegment3d segment = new DSegment3d(startPo, endPo);//定义几何直线
    LineElement line = new LineElement(dgnModel, null, segment);//定义线元素

    DVector3d vector = DVector3d.UnitZ;//定义旋转轴向量
    Angle angle = new Angle();//定义角度
    angle.Degrees = 45;//设置旋转角度为45度

    DTransform3d trans = DTransform3d.FromRotationAroundLine(new DPoint3d(5*uorPerMas,5*uorPerMas,0),vector, angle);//定义变换几何            
    TransformInfo transform = new TransformInfo(trans);//使用变换几何定义变换信息
    line.ApplyTransform(transform);//对线元素应用变换信息

    line.AddToModel();//将线元素写入模型
}

在本案例中,我们首先创建一个起点在(-10,0,0),终点在(10,0,0,)的直线,然后定义相关属性,这里我们设置其旋转轴方向为基点坐标,Z方向,旋转445度,生成的结果即在线元素设置的基点生成时旋转了45度。下图中我们可以看到,在模型中创建的起点在(-10,0,0),终点在(10,0,0)的直线,绕设置基点(5,5,0)点选择45度的结果与程序生成的结果一致
在这里插入图片描述
整体缩放(Scale)
当我们需要对元素做整体的缩放处理时,就需要使用到DTransform3d.Scale(),其中的系数指的是缩放的比例

public static void CmdElementScale1(string unparsed)
{
    DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//定义当前激活的模型空间
    double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//获取主单位与分辨率单位的比值

    DPoint3d p1 = new DPoint3d(-5*uorPerMas,5*uorPerMas,0);//定义形元素端点
    DPoint3d p2 = new DPoint3d(5*uorPerMas,5*uorPerMas,0);
    DPoint3d p3 = new DPoint3d(5*uorPerMas,-5*uorPerMas,0);
    DPoint3d p4 = new DPoint3d(-5*uorPerMas,-5*uorPerMas);
    DPoint3d[] pos = { p1,p2,p3,p4};//将端点添加到端点集中

    ShapeElement shape = new ShapeElement(dgnModel,null,pos);//使用端点集定义形元素

    DTransform3d trans = DTransform3d.Scale(2);//定义变换几何            
    TransformInfo transform = new TransformInfo(trans);//使用变换几何定义变换信息
    shape.ApplyTransform(transform);//对形元素应用变换信息

    shape.AddToModel();//将形元素写入模型
}

在本案例中,首先定义了一个边长为10的形元素,然后我们对这个形元素进行2倍的缩放处理,从结果可以看出,原本边长为10的形元素,然后我们对这个形元素进行2倍的缩放处理,从结果可以看出,原本边长为10的正方形形元素经过缩放处理后变成了边长为20的形元素
在这里插入图片描述

部分缩放(Scale)

当我们需要对指定的轴线方向进行拉伸缩放时,上面的整体缩放就无法满足我们的需求了,此时需要使用DTransform3d.Scale(),并分别输入XYZ方向的缩放大小,此时元素将按照三个方向分别进行拉伸

public static void CmdElementScale2(string unparsed)
{
    DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//定义当前激活的模型空间
    double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//获取主单位与分辨率单位的比值

    DPoint3d p1 = new DPoint3d(-5 * uorPerMas, 5 * uorPerMas, 0);//定义形元素端点
    DPoint3d p2 = new DPoint3d(5 * uorPerMas, 5 * uorPerMas, 0);
    DPoint3d p3 = new DPoint3d(5 * uorPerMas, -5 * uorPerMas, 0);
    DPoint3d p4 = new DPoint3d(-5 * uorPerMas, -5 * uorPerMas);
    DPoint3d[] pos = { p1, p2, p3, p4 };//将端点添加到端点集中

    ShapeElement shape = new ShapeElement(dgnModel, null, pos);//使用端点集定义形元素

    DTransform3d trans = DTransform3d.Scale(2,1,1);//定义变换几何            
    TransformInfo transform = new TransformInfo(trans);//使用变换几何定义变换信息
    shape.ApplyTransform(transform);//对形元素应用变换信息

    shape.AddToModel();//将形元素写入模型
}

在本案例中,首先定义一个边长为10的正方形,然后使用部分缩放对X方向进行缩放,Y方向和Z方向不进行缩放,从结果我们可以看到,X方向被拉伸了2倍,Y方向和Z方向未进行拉伸
在这里插入图片描述

镜像(Mirror)

当我们需要对元素进行镜像时,就需要使用DTransform3d.TryMirrorPointToPoint(),首先我们需要定义两个镜像点,元素会基于这两个点进行镜像

public static void CmdElementMirror(string unparsed)
{
    DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//定义当前激活的模型空间
    double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//获取主单位与分辨率单位的比值

    DPoint3d p1 = new DPoint3d(5 * uorPerMas, 5 * uorPerMas, 0);//定义形元素端点
    DPoint3d p2 = new DPoint3d(10 * uorPerMas, 5 * uorPerMas, 0);
    DPoint3d p3 = new DPoint3d(10 * uorPerMas, -5 * uorPerMas, 0);
    DPoint3d p4 = new DPoint3d(5 * uorPerMas, -5 * uorPerMas);
    DPoint3d[] pos = { p1, p2, p3, p4 };//将端点添加到端点集中

    ShapeElement shape = new ShapeElement(dgnModel, null, pos);//使用端点集定义形元素
    shape.AddToModel();//将形元素写入模型    

    DPoint3d mirrorPo1 = new DPoint3d(5 * uorPerMas,0,0);//定义镜像点1
    DPoint3d mirrorPo2 = new DPoint3d(-5 * uorPerMas, 0, 0);//定义镜像点2
    DTransform3d.TryMirrorPointToPoint(mirrorPo1, mirrorPo2, out DTransform3d mirrorTrans);//根据两镜像点定义变换几何
    TransformInfo transform = new TransformInfo(mirrorTrans);//使用变换几何定义变换信息
    shape.ApplyTransform(transform);//对形元素应用变换信息
    shape.AddToModel();//将形元素写入模型    

    DSegment3d segment = new DSegment3d(mirrorPo1,mirrorPo2);//定义几何直线
    LineElement line = new LineElement(dgnModel,null, segment);//定义线元素
    line.AddToModel();//将线元素写入模型
}

在本案例中,首先我们在X轴右侧创建一个才为5,宽为10的矩形形元素,然后通过我们定义的两个镜像点对元素进行镜像操作,右侧生成的形元素即为镜像后生成的结果
在这里插入图片描述

复制(Copy)

当我们需要对元素进行复制时,我们就需要使用到DoCopy()方法,这种复制的方法不限于在当前模型空间内复制,还可以执行跨模型的复制操作。这里需要注意的是,对ElementCopyContext对象调用Dispose是必要的。ElementCopyContext的Dispose方法执行一些无法再终接器中完成的任务。如果程序未能调用Dispose,则复制的元素可能不完整

public static void CmdElementCopy(string unparsed)
{
    DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//定义当前激活的模型空间
    double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//获取主单位与分辨率单位的比值

    DPoint3d p1 = new DPoint3d(5 * uorPerMas, 5 * uorPerMas, 0);//定义形元素端点
    DPoint3d p2 = new DPoint3d(10 * uorPerMas, 5 * uorPerMas, 0);
    DPoint3d p3 = new DPoint3d(10 * uorPerMas, -5 * uorPerMas, 0);
    DPoint3d p4 = new DPoint3d(5 * uorPerMas, -5 * uorPerMas);
    DPoint3d[] pos = { p1, p2, p3, p4 };//将端点添加到端点集中

    ShapeElement shape = new ShapeElement(dgnModel, null, pos);//使用端点集定义形元素
    shape.AddToModel();//将形元素写入模型          

    using (ElementCopyContext context = new ElementCopyContext(dgnModel))
        context.DoCopy(shape);
    /*
     * 在大多数情况下,您不需要设置任何选项。以上代码将图元从一个模型复制到另一个模型,确保复制的图元具有所有属性
     * 对ElementCopyContext对象调用Dispose是必要的。ElementCopyContext的Dispose方法执行一些无法在终结器中完成的任务。因此,如果程序未能调用Dispose,则复制的元素可能不完整
     */
}

在本案例中,我们首先创建了一个形元素,然后在当前模型中使用复制方法对形元素进行复制。从结果我们可以看到模型中生产了两个形元素
在这里插入图片描述## 删除(Delete)
当我们对元素进行管理时,肯定会对元素执行删除操作,使用到的方法即为DeleteFromModel()。

public static void CmdElementDelete(string unparsed)//Case:ElementDeleteExample
{
    DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//定义当前激活的模型空间

    long id = 1400;//定义需要获取的元素ID
    Element elem= dgnModel.FindElementById(new ElementId(ref id));//使用ID在模型中寻找所属元素

    if(elem!=null)//判断元素是否被成功获取
    {
        elem.DeleteFromModel();//在模型中删除获取到的元素
    }            
}       

在本案例中,我们预先在模型中创建了一个形元素,我们在属性界面获得该元素的ID,然后使用元素ID找到对应的元素,使用DeleteFromModel()删除元素
在这里插入图片描述
在这里插入图片描述

  • 28
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值