背景,需要在CAD中写入某些内容,此时,需要创建单行文字,设置为宋体,指定文字高度和位置,以及旋转角度等。
1、代码解析
首先,需要获取数据库的文字样式表,使用getAt函数,如下:
//获取文字样式表
AcDbTextStyleTable* pTextStyleTab;
acdbHostApplicationServices()->workingDatabase()
->getTextStyleTable(pTextStyleTab, AcDb::kForWrite);
//simsun.ttc(宋体的字体文件名称)
AcDbTextStyleTableRecord* pTextStyleTabRcd;
pTextStyleTabRcd = new AcDbTextStyleTableRecord();
//获取宋体字样
pTextStyleTab->getAt(_T("宋体"), pTextStyleTabRcd, AcDb::kForRead);
其次,获取样式表记录的对象ID,如下:
//添加到样式表
pTextStyleTab->add(pTextStyleTabRcd);
//获取对象ID
AcDbObjectId styleId = pTextStyleTabRcd->objectId();
//释放指针,不然实体无法删除等操作
pTextStyleTabRcd->close();
pTextStyleTab->close();
然后,创建单行文字,如下:
AcDbText* ptr = new AcDbText();
CString str = s[i];
double height = 0.3;
AcGePoint3d position1(position[i].x, position[i].y, 0);
double rotation1 = rotation[i];
ptr->setTextString(str);
ptr->setHeight(height);
ptr->setRotation(rotation1);
ptr->setColorIndex(2);//1=红,2=黄,7=白
//关联宋体样式
ptr->setTextStyle(styleId);
//对正模式设置--正中
ptr->setHorizontalMode(AcDb::kTextMid);
ptr->setVerticalMode(AcDb::kTextVertMid);
ptr->setAlignmentPoint(position1);//设置对正模式时,需使用此函数插入点,setpositin()函数无效
使用函数总结:
getAt();-----获取宋体样式
objectId();-----获取样式表记录的ID
close();-----关闭对应指针
setTextString();-----设置文字内容
setHeight();-----设置文字高度
setRotation();-----设置旋转角度,需放入弧度值
setColorIndex(2);-----设置文字颜色,1=红,2=黄,7=白
setTextStyle();----关联宋体样式函数
setHorizontalMode();----设置对正模式
setVerticalMode();----设置对正模式
setAlignmentPoint();----调用对正模式后,需要使用此函数设置插入点位置
appendAcDbEntity();----将实体添加到块表记录中
2、完整代码:
static void setWenzi(std::vector<CString> s, std::vector<AcGePoint2d> position, std::vector<double> rotation)
{
//获取文字样式表
AcDbTextStyleTable* pTextStyleTab;
acdbHostApplicationServices()->workingDatabase()
->getTextStyleTable(pTextStyleTab, AcDb::kForWrite);
//simsun.ttc(宋体的字体文件名称)
AcDbTextStyleTableRecord* pTextStyleTabRcd;
pTextStyleTabRcd = new AcDbTextStyleTableRecord();
//获取宋体字样
pTextStyleTab->getAt(_T("宋体"), pTextStyleTabRcd, AcDb::kForRead);
//设置新的字体名称并关联字体文件(需放在CAD字体文件夹目录下)
//pTextStyleTabRcd->setName(_T("宋体 常规"));//字体显示名称
//pTextStyleTabRcd->setFileName(_T("simsun.ttc"));//字体文件名称,打开控制面板,打开字体文件夹,右键字体属性查看
//添加到样式表
pTextStyleTab->add(pTextStyleTabRcd);
//获取对象ID
AcDbObjectId styleId = pTextStyleTabRcd->objectId();
//释放指针,不然实体无法删除等操作
pTextStyleTabRcd->close();
pTextStyleTab->close();
//添加到块表中
AcDbBlockTable* pBT;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForRead);
AcDbBlockTableRecord* pBTR;
pBT->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite);
size_t cc = s.size();
for (int i = 0; i < cc; i++)
{
AcDbText* ptr = new AcDbText();
CString str = s[i];
double height = 0.3;
AcGePoint3d position1(position[i].x, position[i].y, 0);
double rotation1 = rotation[i];
ptr->setTextString(str);
ptr->setHeight(height);
ptr->setRotation(rotation1);
ptr->setColorIndex(2);//1=红,2=黄,7=白
//关联宋体样式
ptr->setTextStyle(styleId);
//对正模式设置--正中
ptr->setHorizontalMode(AcDb::kTextMid);
ptr->setVerticalMode(AcDb::kTextVertMid);
ptr->setAlignmentPoint(position1);//设置对正模式时,需使用此函数插入点,setpositin()函数无效
pBTR->appendAcDbEntity(ptr);
ptr->close();
}
pBT->close();
pBTR->close();
}
2280

被折叠的 条评论
为什么被折叠?



