BIMBase API可直接创建表格,相关对象包括BPTableEntityBPTableCellEntityBPTableEntityManager,常用接口见下表。

表7-10 表格对象常用接口

方法 描述
setColmnNum(int) 设置表格列数
setRowNum(int) 设置表格行数
setColWidths(double) 设置表格列宽(列宽一致)
setRowHeight(double) 设置表格行高(行高一致)
setColWidthsArray(vector) 设置表格列宽数组
setRowHeightArray(vector) 设置表格行高数组
addCellForTable() 给表格添加单元格

表7-11 表格单元数据说明

成员名 数据类型 说明
m_rowIndex int 单元格行号
m_colIndex int 单元格列号
m_isMerged bool 是否为合并单元
m_context BPMTextEntity 单元格内容

表7-12 表格管理常用接口

方法 描述
inserColumnfromLeft(int, double) 从左侧插入列
inserColumnfromRight(int, double) 从右侧插入列
inserRowfromTop(int, double) 从上插入行
inserRowfromBottom(int, double) 从下插入行
deleteColumnFromTable(int) 删除列
deleteRowFromTable(int) 删除行
splitCellsInTable(int, int) 拆分单元格
mergeCellsInTable(BPTableCellEntity,BPTableCellEntity) 合并单元格
setContextEntityForCell(BPGraphicElementP, int, int) 设置单元格的多行文字
getContextEntityFromCell(BPEntityId&, int, int) 获取单元格内多行文字的EntityId

示例代码7-8创建了一个当前工程中Cube对象的列表。首先获取当前工程所有Cube对象,创建表格,在表格中展示每个Cube对象的长、宽、高信息。

//获取当前工程所有立方体
vector<DemoObject::CubeDemo> vctCube;
BPProjectP pProject = BPApplication::getInstance().getProjectManager()->getMainProject();
if (pProject == nullptr)
    return;
BPEntityArray entityArray;
BPEntityUtil::getEntities(entityArray, *pProject, PBM_SCHEMA_Demo, PBM_CLASS_CUBE_Demo);
if (entityArray.getCount() == 0)
    return;

for (int i = 0; i < entityArray.getCount(); i++)
{
    BPEntityPtr curr = entityArray.getByIndex(i);
    if (!curr || !curr.isValid())
        continue;

    BIMBase::Core::BPDataPtr ptrData = BPDataUtil::getDataOnEntity(*curr);
    if (!ptrData.isValid())
        continue;
    //根据根据实例初始化
    CubeDemo pbCube;
    pbCube.initFromData(*ptrData);
    vctCube.push_back(pbCube);
}
if (vctCube.size() == 0)
{
    AfxMessageBox(_T("请先布置立方体"));
        return;
}


if (pProject == nullptr)
    return;
//创建表格
BPTableEntityP table = new BPTableEntity;
table->setRowNum(vctCube.size() + 2);
table->setColumnNum(4);
table->setColWidths(10000);
table->setRowHeight(2000);
table->addCellForTable();

BPModelBaseP pModel = pProject->getActiveModel();
if (pModel == nullptr)
    return;
BPTableEntityManager tablemanager = BPTableEntityManager(table);

table->setTransform(p3d::GeTransform::create(0, 20000, 0));
p3d::P3DStatus status = table->addToProject(*pProject, pModel->GetModelId());

auto fun = [&](PString sCur,bool bUnderlinedCur,bool bBold, UInt32 colorCur, double HangingIndentCur, int cellR,int cellC)
{
    //创建一个文字
    BPMTextEntity pbmtext;
    BPFont font1 = BIMBase::Core::BPFontUtil::getDefaultTrueTypeFont();
    //多行文字之间的段落设置
    MTextParagraphPropertiesAppenderPtr ptrAppender = new MTextParagraphPropertiesAppender;
    ptrAppender->isFullJustified = false;
    ptrAppender->mtext_FirstLineIndent = 0;
    ptrAppender->mtext_HangingIndent = HangingIndentCur;
    pbmtext.appendTextPart(ptrAppender);
    //多行文字属性设置
    MTextRunPropertiesAppenderPtr ptrRunAppender = new MTextRunPropertiesAppender;
    ptrRunAppender->color = colorCur;
    ptrRunAppender->isBold = bBold;
    ptrRunAppender->isItalic = false;
    ptrRunAppender->isUnderlined = bUnderlinedCur;
    ptrRunAppender->isOverlined = false;
    ptrRunAppender->font = font1;
    ptrRunAppender->overrideFontSize = true;
    ptrRunAppender->fontSize = GePoint2d::create(400, 600);
    pbmtext.appendTextPart(ptrRunAppender);
    //多行文字内容设置
    MTextTextLineAppenderPtr ptrTextAppender = new MTextTextLineAppender;
    ptrTextAppender->mtextLine = sCur;
    pbmtext.appendTextPart(ptrTextAppender);
    tablemanager.setContextEntityForCell(&pbmtext, cellR, cellC);
};

//表头
fun(L"立方体属性表", false,true, 2,1, 0, 2);
fun(L"序号", true, false, 0, 0,1, 0);
fun(L"长度", false, false, 0, 0,1, 1);
fun(L"宽度", true, false, 0,0, 1, 2);
fun(L"高度", false, false, 0,0, 1, 3);

BPTableCellEntity cell1, cell2;
cell1.m_rowIndex = 0;
cell1.m_colIndex = 0;
cell2.m_rowIndex = 0;
cell2.m_colIndex = 3;
tablemanager.mergeCellsInTable(cell1, cell2);

//表格内容
for (int n = 0; n < vctCube.size(); n++)
{
    CString str,strL,strW,strH;
    str.Format(_T("%d"),n+1);
    strL.Format(_T("%d"), vctCube[n].getLength());
    strW.Format(_T("%d"), vctCube[n].getWidth());
    strH.Format(_T("%d"), vctCube[n].getHeight());
    fun(str.GetString(), false, false, 0, 0, n + 2, 0);
    fun(strL.GetString(), false, false, 0, 0, n + 2, 1);
    fun(strW.GetString(), false, false, 0, 0, n + 2, 2);
    fun(strH.GetString(), false, false, 0, 0, n + 2, 3);
}

代码7-8:表格创建