objectarx开发记录---边长注记功能

1、将配合直角+偶数边功能使用。

2、代码


//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"



//-----------------------------------------------------------------------------
#define szRDS _RXST("AA")

const double PI = 301415926;

//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CArxProject_App : public AcRxArxApp {

public:
	CArxProject_App () : AcRxArxApp () {}

	virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
		// TODO: Load dependencies here

		// You *must* call On_kInitAppMsg here
		AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
		
		// TODO: Add your initialization code here

		return (retCode) ;
	}

	virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
		// TODO: Add your code here

		// You *must* call On_kUnloadAppMsg here
		AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

		// TODO: Unload dependencies here

		return (retCode) ;
	}

	virtual void RegisterServerComponents () {
	}
	
	static void AAMyGroupZZ () {
		// Put your command code here

		std::vector<AcGePoint2d> pt;
		int num = 0;
		GetPolylineCoordinates(pt, num);

		if (num == 0)
		{
			return;
		}

		pt.push_back(pt[0]); num++;

		std::vector<AcGePoint2d> positionC;//计算文字插入点位置
		std::vector<double> angle;//计算文字插入点位置
		std::vector<CString> dis;//计算文字内容--边长
		
		BiaoJi(dis, positionC, angle, pt, num);
		setWenzi(dis, positionC, angle);

	}

	static void BiaoJi(std::vector<CString> &dis, 
		std::vector<AcGePoint2d> &positionC, std::vector<double> &angle,
		std::vector<AcGePoint2d> pt,int num)
	{
		//有向面积法,正-逆时针,负-顺时针
		double A = 0;
		for (int i = 0; i < num - 1; i++)
		{
			A += pt[i].x * pt[i + 1].y - pt[i + 1].x * pt[i].y;
		}


		for (int i = 0; i < num - 1; i++)
		{
			//获取每条边的极角值(弧度值)
			double angle1;
			double pi = 4 * atan(1);
			angle1 = atan2(pt[i + 1].y - pt[i].y, pt[i + 1].x - pt[i].x);
			if (angle1 < 0)
			{
				angle1 += 2 * pi;
			}

			int bb = 0, cc = 0, dd = 0;
			if (angle1 > pi / 2 && angle1 <= 1.5 * pi)
			{
				bb = 1;
			}
			if (angle1 > 2 * pi)
			{
				cc = 1;
			}

			if (cc == 1 || bb == 1)
			{
				dd = 1;
			}

			//处理文字方向
			while (dd == 1)
			{
				if (angle1 > pi / 2 && angle1 <= 1.5 * pi)
				{
					angle1 += pi;
					bb = 1;
				}
				else
				{
					bb = 0;
				}

				if (angle1 > 2 * pi)
				{
					angle1 -= 2 * pi;
					cc = 1;
				}
				else
				{
					cc = 0;
				}

				if (bb == 1 || cc == 1)
				{
					dd = 1;
				}
				else
				{
					dd = 0;
				}
			}
			angle.push_back(angle1);


			//计算距离值
			double d = pt[i].distanceTo(pt[i + 1]);
			CString a;
			a.Format(_T("%.2f"), d);
			dis.push_back(a);

			//计算插入点位置
			double x1, y1;
			x1 = pt[i].x + pt[i + 1].x;
			y1 = pt[i].y + pt[i + 1].y;

			AcGeVector2d v = pt[i + 1] - pt[i];
			AcGeVector2d v2 = v.normalize();

			x1 /= 2;
			y1 /= 2;

			AcGePoint2d pc(x1, y1);//线段中点坐标
			AcGePoint2d pz = pc + v2 * 0.5;//距离中点0.5米沿线段方向的坐标
			AcGePoint2d pE;

			if (A > 0)
			{
				//逆时针旋转90度
				AcGeVector2d vc1 = pz - pc;
				AcGeVector2d vc12(-vc1.y, vc1.x);
				pE = pc + vc12;
			}

			if (A < 0)
			{
				//顺时针旋转90度
				AcGeVector2d vc1 = pz - pc;
				AcGeVector2d vc12(vc1.y, -vc1.x);
				pE = pc + vc12;
			}

			positionC.push_back(pE);
		}
	}

	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.5;

			AcGePoint3d position1(position[i].x, position[i].y, 0);

			double rotation1 = rotation[i];

			ptr->setTextString(str);
			ptr->setHeight(height);
			ptr->setRotation(rotation1);

			//关联宋体样式
			ptr->setTextStyle(styleId);

			//对正模式设置--正中
			ptr->setHorizontalMode(AcDb::kTextMid);
			ptr->setVerticalMode(AcDb::kTextVertMid);

			ptr->setAlignmentPoint(position1);//设置对正模式时,需使用此函数插入点,setpositin()函数无效

			pBTR->appendAcDbEntity(ptr);
			ptr->close();
		}

		pBT->close();
		pBTR->close();

	}

	static void GetPolylineCoordinates(std::vector<AcGePoint2d>& pA, int& num)
	{
		ads_name ss;

		resbuf rb;
		rb.restype = 0;
		rb.resval.rstring = _T("LWPOLYLINE");
		rb.rbnext = NULL;

		int rt = acedSSGet(_T("-b:S"), NULL, NULL, &rb, ss);
		if (rt == RTNORM)
		{
			acutPrintf(TEXT("已选1个\n"));
			ads_name entres;
			acedSSName(ss, 0, entres);

			AcDbObjectId ssId;
			acdbGetObjectId(ssId, entres);

			AcDbEntity* pEnt;
			acdbOpenObject(pEnt, ssId, AcDb::kForRead);

			if (pEnt->isKindOf(AcDbPolyline::desc()))
			{
				AcDbPolyline* pPolyline;
				pPolyline = AcDbPolyline::cast(pEnt);
				num = pPolyline->numVerts();
				//acutPrintf(TEXT("num:%d\n"), num);

				for (int j = 0; j < num; j++)
				{
					AcGePoint2d pt;
					if (pPolyline->getPointAt(j, pt) == eOk)
					{
						pA.push_back(pt);
					}
				}
				pPolyline->close();
			}
			pEnt->close();
			acedSSFree(entres);
		}
		else if (rt == RTCAN)
		{
			acutPrintf(TEXT("取消\n"));
		}
		else if (rt == RTREJ)
		{
			acutPrintf(TEXT("输入无效\n"));
		}
		else
		{
			acutPrintf(TEXT("输入失效2\n"));
		}
		acedSSFree(ss);
	}


	// Modal Command with pickfirst selection
	// ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject_App, AAMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET)
	static void AAMyGroupMyPickFirst () {
		ads_name result ;
		int iRet =acedSSGet (ACRX_T("_I"), NULL, NULL, NULL, result) ;
		if ( iRet == RTNORM )
		{
			// There are selected entities
			// Put your command using pickfirst set code here
		}
		else
		{
			// There are no selected entities
			// Put your command code here
		}
	}

	// Application Session Command with localized name
	// ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject_App, AAMyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION)
	static void AAMyGroupMySessionCmd () {
		// Put your command code here
	}

	static int ads_MyLispFunction () {
		//struct resbuf *args =acedGetArgs () ;
		
		// Put your command code here

		//acutRelRb (args) ;
		
		// Return a value to the AutoCAD Lisp Interpreter
		// acedRetNil, acedRetT, acedRetVoid, acedRetInt, acedRetReal, acedRetStr, acedRetPoint, acedRetName, acedRetList, acedRetVal

		return (RTNORM) ;
	}
	
} ;

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CArxProject_App)

ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject_App, AAMyGroup, ZZ, ZZ, ACRX_CMD_MODAL, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject_App, AAMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject_App, AAMyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION, NULL)
ACED_ADSSYMBOL_ENTRY_AUTO(CArxProject_App, MyLispFunction, false)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值