objectarx2023开发记录---面积注记

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函数。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值