ObjectARX创建一条直线并把该直线设置为某一新建图层(尚有缺陷)

ObjectARX创建一条直线并把该直线设置为某一新建图层

项目场景:绘制对线并设置图层

画一条线, 并且给这条线设置一个具有新名字的新图层,

但这里有个遗留问题: 如果设置的新的图层名字原本已经有了, 则会把这条线设置到0层, 而不是直接把这条直线设置到已经有重名的那个图层

这个遗留问题等后续再解决吧. 暂时记录下

解决方案:对张帆书中代码进行了修改

  1. 首先是创建一条直线
		AcGePoint3d ptStart(0, 0, 0);
		AcGePoint3d ptEnd(-100, 100, 0);
		AcDbObjectId lineId = CLineUtil::Add(ptStart, ptEnd);

创建后再用SetLayer函数进行图层设置

CEntityUtil::SetLayer(lineId, _T("站场图层"))
  1. 然后用设置图层的函数把这条直线设置上图层信息
void CEntityUtil::SetLayer(AcDbObjectId EntityId, const TCHAR* layerName)
{
	AcDbEntity* pEnt = NULL;
	if (acdbOpenObject(pEnt,EntityId, AcDb::kForWrite)==Acad::eOk)
	{
		AcDbLayerTable* pLayerTbl;
		acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForWrite);

		if (pLayerTbl->has(layerName))
		{
			acedPrompt(_T("图层已经存在!"));
			pEnt->setLayer(layerName);
			pLayerTbl->close();
			pEnt->close();
			return;
		}
		else
		{
			AcDbLayerTableRecord* pLayerTblRcd;
			pLayerTblRcd = new AcDbLayerTableRecord;
			pLayerTblRcd->setName(layerName);

			AcDbObjectId layerTblRcdId;
			pLayerTbl->add(layerTblRcdId, pLayerTblRcd);
			acdbHostApplicationServices()->workingDatabase()->setClayer(layerTblRcdId);
			pEnt->setLayer(layerTblRcdId);

			pLayerTblRcd->close();
			pLayerTbl->close();
			pEnt->close();
		}
	}
	else
	{
		pEnt->close();
		acutPrintf(_T("实体对象有错误!"));
	}
}

上面的SetLayer函数中的缺陷等后续章节学习后再回头思考问题和解决


张帆书中的SetLayer代码是假设在dwg中已经有了要设置的图层了, 再把对象按照这个既有图层的名字来给对象设置,

如果在dwg中没有要设置的图层, 那么就会赋给对象一个0层作为默认

//张帆书中原版的设置图层代码:
void CEntityUtil::SetLayer(AcDbObjectId EntityId, const TCHAR* layerName)
{
	AcDbEntity* pEnt = NULL;
	if (acdbOpenObject(pEnt, EntityId, AcDb::kForWrite) == Acad::eOk)
	{
		pEnt->setLayer(layerName);
		pEnt->close();
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值