ObjectARX模仿AutoCAD中多段线命令实现颜色,线型,闭合等

首先在acrxEntryPoint.cpp中注册一个命令:

IMPLEMENT_ARX_ENTRYPOINT(CARX_CreatePolylineApp)
ACED_ARXCOMMAND_ENTRY_AUTO(CARX_CreatePolylineApp, HH, AddPoly, AddPoly, ACRX_CMD_TRANSPARENT, NULL)

该命令的具体实现如下:

static void HHAddPoly(void)
	{
		int nColorIndex = 0; // 颜色索引值
		ads_real width = 0;  // 多段线的线宽
		int nIndex = 2;  // 当前输入点的次数
		ads_point ptStart; // 起点
		ads_point ptPrevious;// 前一个参考点
		ads_point ptCurrent; //当前拾取的点
		AcDbObjectId polyId; //多段线ID
	
		// 提示用户输入起点
		if (RTNORM != acedGetPoint(NULL, _T("\n输入第一点:"), ptStart))
		{
			return ;
		}
		
		// 输入第二点
		acedInitGet(NULL, _T("W C B F"));
		int rc = acedGetPoint(ptStart,_T("\n输入下一点 [宽度(W)/颜色(C)/闭合(B)]<完成(F)>:"), ptCurrent);
		while (RTNORM == rc || RTKWORD == rc)
		{
			if (RTKWORD == rc) // 如果用户输入了关键字
			{
				ACHAR keyWord[20];// 关键字
				//获取输入的关键字
				if (RTNORM != acedGetInput(keyWord))
				{
					return;
				}

				if (0 == _tcscmp(keyWord, _T("W")))
				{
					width = CAuxiliary::GetWidth();
					AcDbPolyline *pPoly = CAuxiliary::GetPolyLine(polyId);
					if (NULL == pPoly)
					{
						return;
					}
					pPoly->setConstantWidth(width);
					pPoly->close();
				}
				else if (0 == _tcscmp(keyWord, _T("C")))
				{
					nColorIndex = CAuxiliary::GetColorIndex();
					AcDbPolyline *pPoly = CAuxiliary::GetPolyLine(polyId);
					if (NULL == pPoly)
					{
						return;
					}
					pPoly->setColorIndex(nColorIndex);
					pPoly->close();
					
				}
				else if (0 == _tcscmp(keyWord, _T("B")))
				{
					if (nIndex < 3)
					{
						acutPrintf(_T("\n输入点个数不足,不能执行闭合操作"));
						return;
					}

					AcDbPolyline *pPoly = CAuxiliary::GetPolyLine(polyId);
					if (NULL == pPoly)
					{
						return;
					}
					pPoly->setClosed(Adesk::kTrue);
					pPoly->close();
					return;
				}
				else if (0 == _tcscmp(keyWord, _T("F")))
				{
					return;
				}
				else
				{
					acutPrintf(_T("\n无效的关键字."));
				}
			}
			else if (RTNORM == rc)  // 用户输入了点
			{
				acutPrintf(_T("\n输入点的坐标是(%.2f, %.2f, %.2f)"), ptCurrent[X], ptCurrent[Y], ptCurrent[Z]);
				
				if (2 == nIndex)
				{
					// 创建多段线
					polyId = CAuxiliary::CreatePolyline(ptStart, ptCurrent, width, nColorIndex);
				}
				else if (nIndex > 2)
				{
					//修改多段线
					CAuxiliary::AddPolyline(polyId, ptCurrent,nIndex, width, nColorIndex);
				}	

				++nIndex;
				acdbPointSet(ptCurrent, ptPrevious);//acdbPointSet宏: ads_point 变量值的复制
			}

			// 提示用户输入新的节点
			acedInitGet(NULL, _T("W C B F"));
			rc = acedGetPoint(ptPrevious, _T("\n输入下一点 [宽度(W)/颜色(C)/闭合(B)]<完成(F)>:"), ptCurrent);
		 }
	}

其中调用了一些函数,新建一个类CAuxiliary,具体实现如下:

***********************Auxiliary.h********************


#pragma once

class CAuxiliary
{
public:
	CAuxiliary(void);
	~CAuxiliary(void);

	//图形数据库
	static bool PostToModelSpace(AcDbEntity* pEnt, AcDbObjectId &entId);

	//通过ID获取对象
	static AcDbPolyline * GetPolyLine(AcDbObjectId polyId);

	//创建仅包含一条直线的多段线
	static AcDbObjectId CreatePolyline(ads_point ptStart, ads_point ptEnd, double width, int nColorIndex);

	//添加一条直线到多段线
	static void AddPolyline(AcDbObjectId polyId, ads_point ptCurrent,int nIndex, double width, int nColorIndex);
	
	//获取用户输入的线宽
	static ads_real GetWidth();

	//提示用户输入颜色索引值
	static int GetColorIndex();
};

 

***********************Auxiliary.cpp********************


#include "StdAfx.h"
#include "Auxiliary.h"
#include <atlstr.h>
#include <tchar.h>

CAuxiliary::CAuxiliary(void)
{
}

CAuxiliary::~CAuxiliary(void)
{
}

bool CAuxiliary::PostToModelSpace(AcDbEntity* pEnt, AcDbObjectId &entId)
{
	if (NULL == pEnt)
	{
		return false;
	}
	// 获得指向块表的指针
	AcDbBlockTable *pBlockTable = NULL;
	//workingDatabase()能够获得一个指向当前活动的图形数据库的指针,
	acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
	if (NULL == pBlockTable)
	{
		return false;
	}

	// 获得指向特定的块表记录(模型空间)的指针
	AcDbBlockTableRecord *pBlockTableRecord = NULL;
	pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
	if (NULL == pBlockTableRecord)
	{
		return false;
	}

	// 将AcDbLine类的对象添加到块表记录中
	pBlockTableRecord->appendAcDbEntity(entId, pEnt); 

	// 关闭图形数据库的各种对象
	pBlockTable->close();
	pBlockTableRecord->close();
	pEnt->close(); 

	return true;
}

AcDbPolyline * CAuxiliary::GetPolyLine(AcDbObjectId polyId)
{
	AcDbPolyline * pPoly(NULL);
	if (Acad::eOk != acdbOpenObject(pPoly, polyId, AcDb::kForWrite))
	{
		return NULL;
	}
	return pPoly;
}

AcDbObjectId CAuxiliary::CreatePolyline(ads_point ptStart, ads_point ptCurrent, double width,int nColorIndex)
{
	AcDbPolyline *pPoly = new AcDbPolyline;

	AcGePoint2d ptInsert = asPnt2d(ptStart);
	AcGePoint2d ptInsert1 = asPnt2d(ptCurrent);

	pPoly->addVertexAt(0, ptInsert, nColorIndex, width, width);
	pPoly->addVertexAt(1, ptInsert1, nColorIndex, width, width);

	AcDbObjectId polyId;
	if (!CAuxiliary::PostToModelSpace(pPoly, polyId))
	{
		acutPrintf(_T("\n加入图形数据库失败"));
		return NULL;
	}
	return polyId;
}

void CAuxiliary::AddPolyline(AcDbObjectId polyId, ads_point ptCurrent,int nIndex, double width, int nColorIndex)
{
	AcDbPolyline *pPoly = GetPolyLine(polyId);
	if (NULL == pPoly)
	{
		return;
	}
	AcGePoint2d ptInsert = asPnt2d(ptCurrent);
	pPoly->addVertexAt(nIndex - 1, ptInsert, nColorIndex, width, width);	
	pPoly->close();
}
ads_real CAuxiliary::GetWidth()
{
	ads_real width = 0;
	if (RTNORM == acedGetReal(_T("\n输入线宽:"), &width))
	{
		return width;
	}
	else
	{
		return 0;
	}
}

int CAuxiliary::GetColorIndex()
{
	int nColorIndex = 0;
	if (RTNORM != acedGetInt(_T("\n输入颜色索引值(0~256):"), &nColorIndex))
	{
		return 0;
	}

	// 处理颜色索引值无效的情况
	while (nColorIndex < 0 || nColorIndex > 256)
	{
		acedPrompt(_T("\n输入了无效的颜色索引."));
		if (RTNORM != acedGetInt(_T("\n输入颜色索引值(0~256):"), &nColorIndex))
		{
			return 0;
		}
	}

	return nColorIndex;
}

 

转载于:https://my.oschina.net/u/2930533/blog/777238

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值