开发小记

(基于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.读取完毕. 

你可能感兴趣的:(数据结构,c,数据库,null)