1、求解多边形的面积;
for (int i = 0; i < count; i++)
{
double temp = ptonly[i].x * ptonly[i + 1].y - ptonly[i + 1].x * ptonly[i].y;
area += temp;
}
2、创建多行文字,标注面积;
static void setArea(CString s, AcGePoint2d p)
{
//获取文字样式表
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);
AcDbMText* ptr = new AcDbMText();
ptr->setContents(_T("\\L") + s + _T("\\l"));
ptr->setTextHeight(0.5);
ptr->setRotation(0);
ptr->setColorIndex(2);//1=红,2=黄,7=白
//关联宋体样式
ptr->setTextStyle(styleId);
//对正模式设置--正中
ptr->setAttachment(AcDbMText::kMiddleCenter);//备用:kBottomLeft、kTopLeft
AcGePoint3d pm(p.x, p.y, 0);
ptr->setLocation(pm);//设置对正模式时,需使用此函数插入点,setpositin()函数无效
pBTR->appendAcDbEntity(ptr);
ptr->close();
pBT->close();
pBTR->close();
}
ptr->setContents(_T("\\L") + s + _T("\\l"));
表示添加多行文字的下划线,\\L标识下划线起始位置,\\l标识下划线结束位置。
3、计算面积注记插入点;
//计算面积标记插入点
double minX = ptonly[0].x, minY = ptonly[0].y, area = 0;
double maxX = ptonly[0].x, maxY = ptonly[0].y;
for (int i = 0; i < count; i++)
{
double temp = ptonly[i].x * ptonly[i + 1].y - ptonly[i + 1].x * ptonly[i].y;
area += temp;
}
for (int i = 1; i < count - 1; i++)
{
if (minX > ptonly[i].x)
{
minX = ptonly[i].x;
}
if (minY > ptonly[i].y)
{
minY = ptonly[i].y;
}
if (maxX < ptonly[i].x)
{
maxX = ptonly[i].x;
}
if (maxY < ptonly[i].y)
{
maxY = ptonly[i].y;
}
}
area *= 0.5;
double centerX, centerY;
centerX = (minX + maxX) / 2;
centerY = (minY + maxY) / 2;
//面积计算及标注
CString s_a;
AcGePoint2d position_a(centerX, centerY);
s_a.Format(_T("%.2f"), fabs(area));
计算插入点思路,求得多边形最小外接矩形,获取其左下角和右上角的坐标点,将其平均后,得到面积标记插入点的位置。
CString类型存储double或int类型数据时,使用Format函数。

169

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



