Bentley® MicroStation V8i Connect Edition 及更高版本支持 .dgn 文件的表格元素。.dgn 表格元素的结构和用途与 .dwg 表格元素相似。表格是由行和列排列的单元格集合。表格中的单元格由网格线分隔,.dgn 表格元素单元格只能包含文本数据。
要创建 .dgn 表格元素:
1) 将表格元素添加到 .dgn 模型或共享单元定义(如果可能),并使用 initTableDefaults() 函数对其进行初始化。表格元素使用文本样式来初始化其默认值并处理单元格文本数据。但它只存储文本样式索引。因此,它需要 .dgn 数据库来访问文本样式表。它还需要将分辨率单位 (UOR) 转换为工作单位比例因子(文本样式将其所有数据存储在 UOR 中,但如果您计划将表格元素用作 .dgn 模型的一部分,它必须使用模型工作单位)。
OdDgTableElementPtr pTableElement = OdDgTableElement::createObject();
m_pModel3d->addElement( pTableElement );
pTableElement->initTableDefaults();
2) 初始化后,设置表格主体文本样式。需要设置默认行高、默认列宽、最小表格单元格宽度和高度以及默认表格单元格边距偏移量。
OdDgTextStyleTableRecordPtr pTableTextStyle = pTextStyleTable->getDefaultData();
pTableTextStyle->setName(L"TableTextStyle");
pTableTextStyle->setTextHeight( 0.1 * dScaleToUORs );
pTableTextStyle->setTextWidth( 0.1 * dScaleToUORs );
pTableTextStyle->setFontEntryId( pFontTable->getFont("Arial")->getNumber() );
pTableTextStyle->setColorIndex(250);
pTextStyleTable->add( pTableTextStyle );
pTableElement->setBodyTextStyle( pTableTextStyle->getEntryId() );
3) 添加表格列和表格行。行和列的度量在创建后会用默认数据进行初始化。
pTableElement->addColumn();
…
pTableElement->addColumn();
pTableElement->addRow();
…
pTableElement->addRow();
4) 修改列和行的度量。以下是修改行和列度量的示例:
pTableElement->getRow(1)->setHeight( 0.2 * minor );
…
pTableElement->getColumn(1)->setWidth( 0.15 * major );
5) 合并表格单元格。多个表格单元格可以合并成一个大单元格。单元格合并有三个规则:
- 合并不能相互交叉。
- 只能合并矩形单元格区域。
- 合并的内容是左上角(基础)单元格中的内容。
OdDgTableElementMerge titleMerge;
titleMerge.setBaseRowIndex(0);
titleMerge.setBaseColumnIndex(0);
titleMerge.setRowCount(1);
titleMerge.setColumnCount(5);
pTableElement->addMerge( titleMerge );
6) 设置表格填充颜色。表格填充有两种类型。首先,每个单元格都可以填充。
pTableElement->getCell(1,4)->setFillColor(32);
此外,奇数和偶数填充颜色可以应用于表格的主体行。(表格元素包含不同类型的行。默认情况下,所有行都是主体行,但可以设置非零数量的标题行、页眉行和页脚行。)
pTableElement->setOddFillColor( 1 );
pTableElement->setOddFillColorFlag(true);
pTableElement->setEvenFillColor( 2 );
pTableElement->setEvenFillColorFlag(true);
7) 设置单元格内容。表格元素单元格只能包含文本数据。设置单元格内容有两种方法:
- 简单方法:使用函数“setCellText( const OdString& strText )”设置简单文本。该函数创建一个带有单元格文本样式的文本节点,并添加一个带有所需字符串的文本元素。
- 手动方法:设置具有不同颜色、大小、字体等的富文本,创建一个文本节点并用文本元素填充它,然后使用 setCellText(…) 函数进行设置。
OdDgTextNode3dPtr pMTextNode = OdDgTextNode3d::createObject();
OdDgText3dPtr pTextLine1 = OdDgText3d::createObject();
OdDgText3dPtr pTextLine2 = OdDgText3d::createObject();
…
pMTextNode->add( pTextLine1 );
pMTextNode->add( pTextLine2 );
…
pMTextNode->setDatabaseDefaults(m_pModel3d->database(), true);
pMTextNode->applyTextStyle( pMextStyle->elementId() );
pMTextNode->setJustification( OdDg::kCenterCenter );
pMTextNode->setLineSpacing(0.09);
pMTextNode->setLineSpacingType( OdDgTextExtendedProperties::kExact );
pTextLine1->applyTextStyle( pMextStyle->elementId() );
pTextLine2->applyTextStyle( pMextStyle->elementId() );
…
pTextLine1->setText(L"Multiline Text:");
pTextLine1->setCrCount(1);
pTextLine2->setText(L"- Line 1.");
pTextLine2->setItalics(true);
pTextLine2->setCrCount(1);
…
pTableElement->getCell(3,2)->setCellText( pMTextNode );
8) 您还可以设置文本位置、文本旋转、单元格边距类型和单元格边框的格式。
// Set text alignment “Center, Middle”
pTableElement->getCell(1,1)->setTextAlignment(OdDgTableCellElement::kCenterMiddle);
// modify cell borders.
OdDgTableCellSymbology borderData;
borderData.setColorIndex(3);
borderData.setLineStyle(2);
borderData.setLineWeight(3);
borderData.setLineVisibility(true);
pTableElement->getCell(3,2)->setTopBorder(borderData);
pTableElement->getCell(3,2)->setBottomBorder(borderData);
pTableElement->getCell(3,2)->setLeftBorder(borderData);
pTableElement->getCell(3,2)->setRightBorder(borderData);
本文中的所有代码均来自 ExDgnCreate 示例。请参阅它以获取有关表格创建的更多信息。