(基于DWGdirect 1.13.02 构建AutoCAD格式文件)
AutoCAD数据库架构:
ACAD文件建立过程:
1. 创建数据库
OdDbDatabasePtr pDwg = CDwgRW::m_Svcs.createDatabase();
......
2. 构建256调色板.
m_aColor[1] = (int)RGB(255,0,0); m_aColor[2] = (int)RGB(255,255,0);
......
m_aColor[254] = (int)RGB(192,192,192); m_aColor[255] = (int)RGB(255,255,255);
........
3. 构建线型表
创建线形,填充线型表
OdDbLinetypeTablePtr pTable;
OdDbLinetypeTableRecordPtr pEntry;
OdDbObjectId id;
pTable = ,_pDwgData->getLinetypeTableId().safeOpenObject(OdDb::kForWrite);
pEntry = OdDbLinetypeTableRecord::createObject();
id = pTable->add(pEntry);
.......
4. 构建图层(略)
5. 构建文字样式(略)
6. 构建尺寸样式(略)
7. 构建块定义及块中实体
创建块(pEntry为用户自定义块)
OdDbBlockTablePtr pTable = _pDwgData->getBlockTableId().safeOpenObject(OdDb::kForWrite);
OdDbBlockTableRecordPtr pEntry = OdDbBlockTableRecord::createObject();
id = pTable->add(pEntry);
往块中加实体
OdDbLinePtr pLine = OdDbLine::createObject();
Id= pEntry ->appendOdDbEntity(pLine);
“块引用”于”块定义”的关联
OdDbBlockReferencePtr pBR = OdDbBlockReference::createObject();
pBR->setBlockTableRecord(objID);
.......
8. 创建实体并加到ACAD模型空间.
打开空间(pBlock为模型空间块)
OdDbBlockTableRecordPtr pBlock = pDwgData->getModelSpaceId().safeOpenObject(OdDb::kForWrite);
创建ACAD实体:
如直线的创建
OdDbLinePtr pLine; = OdDbLine::createObject();
加到空间
pBlock->appendOdDbEntity(pEnt);
.........
9. 多行文本
获取文本数据结构.
匹配已有文字样式
OdDbTextStyleTablePtr pTextStyles = m_pDwgData->getTextStyleTableId().openObject();
OdDbSymbolTableIteratorPtr pIter = pTextStyles->newIterator();
for (pIter->start(); !pIter->done(); pIter->step())
{
OdDbTextStyleTableRecordPtr pTextStyle = pIter->getRecordId().safeOpenObject();
}
未匹配到则创建文字样式.
OdDbTextStyleTableRecordPtr pStyle = OdDbTextStyleTableRecord::createObject();
id = pTextStyles ->add(pStyle)
创建多行文本
OdDbMTextPtr pOdText = OdDbMText::createObject();
加宽度格式’/w’串,设置字符宽度(非汉字).
设置文字样式:pOdText->setTextStyle(handle);
设置多行文字的格式串:
如:”/fFangSong_GB2312;b1|i0|c134|p0; 你好!”; (bicp分别表示:粗\斜\字符集\字体间距族)
设置字高/字串/基点.
......
最后加到模型空间中.
10. 写文件
OdRxObjectImpl<OdWrFileBuf> fb;
fb.open(lpstrFile);
((OdDbDatabase*)pDatabase)->writeFile(&fb, (OdDb::SaveType) OdDb::kDwg,(OdDb::DwgVersion) OdDb::vAC18, true);
11. 有关图素显示缓冲区
任何图素都可看成由”直线段/圆弧/文字”三个基本图元构成.
CDrawUnitBuffer
{
LINE //线显示缓冲
{
//起始点坐标
//颜色
//线形
//线宽
//显示模式
//线型比例
}
CIRCLE //圆显示缓冲
{
//原心
//半径
//颜色
//线形
//线宽
//线型比例
//起始角
//终止角
//信息,顺逆
}
TEXT //文字显示缓冲
{
//显示的模式
//基点//颜色
//实心类型(实心,空心)
m_dThick; //突出
m_dXScale; //x轴方向的比例
m_dYScale; //y轴方向的比例
m_dXRotate; //x轴方向的旋转
m_dYRotate; //y轴方向的旋转
m_czText[256]; //该字串的内容
//文本的字体属性
m_nHeight; //单位度量的字体高度
m_nWidth; //逻辑单位度量的字体的平均宽度
m_nEscapement; //字体标注行的逆时针方向的旋转角度
m_nOrientation; //角度
m_nLineWidth; //形文字时的线宽,256等同于 1mm
m_nWeight; //重量既字体的粗细程度(磅)
m_bUnderline; //下划线
m_bItalic; //斜体
m_cStrikeOut; //中间划线
m_nCharSet; //字符集
m_nOutPrecision; //输出精度
m_nClipPrecision; //裁剪精度
m_nQuality; //质量(草图,印刷)
m_nPitchAndFamily; //字体间距和属于哪个族
m_lpszFacename[256];//字体名称
m_dSpace; //字间间距
m_bAbsolutePos; //按绝对位置画
m_nManner; //画的方式,指定高度是否将ExternalLeading等计算在内,宏定义m_uFlag; //标识
m_SymblRect; //文字/符号盖线
m_uSymblFlag; //文字/符号盖线
}
}
ACAD文件的数据读取 :
1. 装载DWG数据
CDwgRW* m_pDwgRW->OpenFile(lpstrSrcFile);
void *pDWGDb = NULL;
m_pDwgRW->GetDatabase(pDWGDb);
2. 调色板/线型/层/文字样式/标注样式
3. 打散代理实体/表格/区域.
4. 处理外部引用
5. 创建块
6. 遍历模型空间实体
OdDbBlockTableRecordPtr pBlock = m_pDwgData->getModelSpaceId().safeOpenObject();
OdDbObjectIteratorPtr pEntIter = pBlock->newIterator();
for (; !pEntIter->done(); pEntIter->step())
{
OdDbEntityPtr pEnt = pEntIter->objectId().safeOpenObject();
if(pEnt->isKindOf(OdDbPoint::desc())) //点
{}
else if(pEnt->isKindOf(OdDbLine::desc())) //线
{}
Else if(pEnt->isKindOf(OdDbCircle::desc())) //圆弧
………………
}
7.读取完毕.