领域对象(BPObject)在BIMBase里边分为图形对象(BPGraphicElement)和非图形对象(BPNonGraphicElement),图形对象尤其重要,用户能够看见的对象基本都是图形对象,比如墙、标高、轴网等。对象是可序列化的,即是可被保存到p3d工程文件中。

3.1.1 相关类图

1)三维图形对象相关

三维图形对象类图见图3-1,列出的是领域对象数据架构。自定义领域对象,可直接从BPGraphicElement继承,内建的专业对象继承自共同的一个基类BPCommonElement

图3-1 图形对象类图

2)二维对象

二维对象常用于绘制标注等内容,类图见图3-2。

图3-2 二维对象类图

注意:本书并没有列出所有的类,而是一些重要的基础类,其它类请参考BIMBaseAPI.chm帮助文档。

3.1.2 如何获取对象

1)通过BPDataKey获取对象

BIMBase中的对象都有一个BPDataKey,我们可以通过BPDataKeyBPDocument中获取这个元素。

BPDataKey key = new BPDataKey();
key.classId = 1123;
key.objectId = 25;
BPDocument doc = BPApplication.singleton().activeDocument;
BPObject obj = BPObjectUtil.getObjFromData(doc, key);

代码3-1 通过BPDataKey获取对象

使用上面方法的缺陷是用户必须知道这个对象的BPDataKey才行。一般可通过其它接口获取相应的BPDataKey,然后调用该接口获取对象。

2)获取选择的对象

使用BPDocument的selection属性,用户可以获得被选中的元素。

BPDocument doc = BPApplication.singleton().activeDocument;
for (int i = 0;i < doc.selection.count; i++)
{
    BPGraphics graphic = doc.selection.getElement(i);
    BPDataKey key = graphic.getGraphicElement();
    BPObject obj = BPObjectUtil.getObjFromData(doc, key);
}

代码3-2 通过BPDataKey获取对象

  • 通过classId获取对象

    BIMBase API提供接口通过classId获取某个类型的所有对象,具体代码如下所示。
BPDocument doc = BPApplication.singleton().activeDocument;
List<BPDataKey> eleList = BPGraphicElementUtil.getGraphicElementsByClassId(doc, 1123);
foreach(var key in eleList)
{
    BPObject obj = BPObjectUtil.getObjFromData(doc, key);
}

代码3-3 通过classId获取对象

  • 获取某个模型空间的所有对象

    BIMBase API提供接口获取某个模型空间的所有对象,具体代码如下所示。
BPDocument doc = BPApplication.singleton().activeDocument;
BPModel model = doc.modelManager.activeModel;
List<BPDatakey> eleList = BPGraphicElementUtil.getGraphicElementsOfModel(doc, model);
foreach(var key in eleList)
{
    BPObject obj = BPObjectUtil.getObjFromData(doc, key);
}

代码3-4 获取某个模型空间的所有对象

3.1.3 获取和修改元素参数

1)获取参数

元素都有参数,用户可以通过文档查找对象的所有参数条目,然后通过BPObject的getValue接口获取到元素的参数。

2)修改参数

用户可以BPObject的setValue接口修改元素的参数。

3.1.4 重要的方法

1)对象的位置

通过BPGraphicElement的setPlacement方法,可设置对象的位置,对象的位置包含对象的偏移和旋转信息。

2)获取对象的图素信息

通过BPGraphicElement的getGraphics方法,可获取对象的图素信息,用于几何解析和复用。

3.1.5 领域对象的创建

1)内建对象的创建

BIMBase图形对象的创建一般使用对象的构造函数,对象构造出来以后,调用addToModel接口将对象放置到相应的模型空间。

BPDocument doc = BPApplication.singleton().activeDocument;
BPModel model = doc.modelManager.activeModel;
GePoint3d PointS = new GePoint3d(9000, 900, 0);
GePoint3d PointE = new GePoint3d(9000, 0, 0);
BPModelLine line = new BPModelLine(PointS, PointE);
BIMBaseCS.BPStatus sta = line.addToDocument(model);

代码3-5 内建对象的获取

2)自建对象的创建

当BIMBase中已有对象不能满足用户需求时,用户可通过实现一个继承自BPGraphicElement的类,构造自己的对象,主要分为以下两步:

  • 创建对象的数据表(schema),用于在工程中保存对象,见附录二;
  • 实现继承自BPGraphicElement的类,见示例代码3-6;
[BPElementClassAttribute(schemaName = "DemoSchema", className = "CubeDemo")]
public class CubeDemo : BPGraphicElement
{
    int mWidth = 300;
    int mLength = 600;
    int mHeight = 1000;
    [BPPropertyDefinitionAttribute(fieldName = "Length")]
    public int length
    {
        get { return mLength; }
        set { mLength = value; }
    }
    [BPPropertyDefinitionAttribute(fieldName = "Width")]
    public int width
    {
        get { return mWidth; }
        set { mWidth = value; }
    }
    [BPPropertyDefinitionAttribute(fieldName = "Height")]
    public int height
    {
        get { return mHeight; }
        set { mHeight = value; }
    }
    protected override BIMBaseCS.Core.BPGraphics _createGraphics(BPModel model)
    {
        BIMBaseCS.Core.BPGraphics graphics = new BPGraphics(model);
        List<GePoint3d> listp = new List<GePoint3d>();
        listp.Add(new GePoint3d(length, 0, 0));
        listp.Add(new GePoint3d(length, width, 0)); listp.Add(new GePoint3d(0, width, 0));
        listp.Add(new GePoint3d(0, 0, 0));
        BIMBaseCS.Geometry.GeCurveArray curve = GeCurveArray.createLinestringArray(listp, GeCurveArray.BoundaryType.Outer, false);
        GeExtrusionInfo info = new GeExtrusionInfo(curve, new GeVec3d(0, 0, height), true);
        IGeSolidBase solid = IGeSolidBase.createExtrusion(info);
        graphics.addSolid(solid);
        return graphics;
    }
}

代码3-6 实现自己的构件对象

示例代码3-6继承自BPGraphicElement的类Cube,主要完成了如下几个工作:

  • 通过特性BPElementClassAttribute定义了Cube类对应的表单TestSchema及表CubeTest
  • 定义三个属性length,width,height,并通过特性BPPropertyDefinitionAttribute分别定义属性对应的表中字段。
  • 重写BPGraphicElement中的_createGraphics(BPModel)接口,根据Cube的length、width、height构造立方体图形。

    实现了一个自定义的立方体构件,如图3-3所示,通过立方体的长、宽、高进行构造。

图3-3 立方体构件
至此,自建对象Cube构造完毕,可同内建对象一样通过addToDocument接口保存到工程中。