ObjectARX如何修改多行文字的格式

一 AutoCAD中多行文字的格式设置

AutoCAD在设置多行文字格式时使用了非常特殊的方式,多行文字整体可以有诸多格式属性,比如字高、颜色、旋转角度等等;但是,多行文字的每一个字符其实也可以有自己单独的格式。
比如,下面的多行文字整体是绿色,但是它其中的某一个字却可以是红色。
在这里插入图片描述
那么,CAD是怎么实现的呢?我们对这个多行文字执行list命令,执行结果如下:
在这里插入图片描述
从中我们可以看出,这个多行文字的内容竟然是:ab{\C1;c}de。这个{}括号括起来的就是字母’c’特有的格式,\C1;说明接下来的这个字符颜色索引为1号。CAD管这个叫做格式代码。我们看看格式代码都有哪些。
在这里插入图片描述

CAD就是根据上表的方式,确定了文字格式与格式代码之间的关系。也就是说,AcDbMText实体可以有整体的格式,但是其中每一个字符都可以有自己特定的格式,这个特定的格式由这个字符的格式代码控制
CAD允许你在外部文字编辑器中输入带格式代码的字符串,这样可以在CAD中生成特定格式的多行文字对象。具体可参见CAD帮助文档“在替换文字编辑器中设置多行文字的格式”。以下是一个示例。
在这里插入图片描述

二 ObjectARX如何设置多行文字的格式

我们知道了CAD设置多行文字格式的方式,那么在程序中设置多行文字格式就很简单了。比如说,我们需要让CAD多行文字统一显示为某个颜色,那么我们就应该去掉多行文字内容中所有诸如“\Cxxxx;”之类的格式代码,然后再设置多行文字对象的颜色。
这里额外说一句,千万不要简单的直接设置AcDbMText实体颜色,刚刚我们说过了,对里面单独设置的文字格式,这样设置不起作用
以下Demo代码可以统一修改一个多行文字实体所有字符的颜色。

//删掉多行文本中表征颜色的格式代码
void RemoveMTextColorField(AcDbMText* pMText)
{
	if (!pMText)
		return;

	TCHAR* psz = pMText->contents();
	CString sMText = psz;
	delete psz;

	if (sMText.GetLength() < 5)
		return;

	for (int iBegin = 0; iBegin < sMText.GetLength() - 1; iBegin++)
	{
		//CAD多行文字每个文字都可以拥有格式代码,需要删掉表征颜色的格式代码
		if (_T('\\') == sMText[iBegin])
		{
			if (_T('c') == tolower(sMText[iBegin + 1])) //这是表征颜色的格式代码
			{
				int iEnd;
				for (iEnd = iBegin + 2; iEnd < sMText.GetLength(); iEnd++)
					if (_T(';') == sMText[iEnd])
						break;

				if (iEnd < sMText.GetLength())
				{
					sMText.Delete(iBegin, iEnd + 1 - iBegin);
					iBegin--;
				}
				else
					break;
			}
			else		//排除多行文字字符'\'或者其他以\开头的格式代码
				iBegin++;
		}
	}
	
	pMText->setContents(sMText);
}

void CmdChangeMTextColor(void)
{
	Acad::ErrorStatus es;
	ads_name ename;
	ads_point pt;
	if (acedEntSel(_T("\nSelect a MText: "), ename, pt) != RTNORM) return;
	AcDbObjectId id = AcDbObjectId::kNull;
	acdbGetObjectId(id, ename);
	if (id == AcDbObjectId::kNull) return;
	AcDbObjectPointer<AcDbMText> pObj(id, AcDb::kForWrite);
	if ((es = pObj.openStatus()) != Acad::eOk)
	{
		if (es == Acad::eNotThatKindOfClass)
		{
			acutPrintf(_T("\nSelect a MText."));
		}
		else {
			acutPrintf(_T("\nError when opening the entity."));
		}
		return;
	}

	int iInput;
	if (RTNORM == acedGetInt(_T("\n请输入颜色索引号:"), &iInput))
	{
		AcDbMText *pMText = AcDbMText::cast(pObj.object());
		RemoveMTextColorField(pMText);
		pMText->setColorIndex(iInput);
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ObjetArx2004+VS2002前提:安装好以上两种软件创建步骤:1. 新建项目 Visual C++项目->选择ObjectARX/DBX/OMF->键入"Demo"项目名称 ->MFC Support中勾选Enxtension Dll->using MFC Shared DLL,其他取默认值2. 删除文件 在“解决方案资源管理器”中删除向导生成的acrxEntryPoint.cpp,DocData.cpp,DocData.h文件 同时可以在文件夹下彻底删除文件,后续步骤并不需要用到这3个文件3. 添加Demo.h文件 同时在Demo.h文件中加入代码 #pragma once #include"resource.h"3. 创建一个普通对话框,基于CDialog类,并生成类CDlgDemo4. 打开Demo.cpp文件,对这个文件要进行比较多的操作 ·注释掉"AFX_EXTENSION_MODULE DemoExtDLL ={ NULL, NULL };"这一句 ·添加#include "DlgDemo.h"头文件 ·添加函数DlgDemo(),具体见附件源文件代码 ·添加initApp(),unloadApp() ·注释掉DllMain中的"_hdllInstance =hInstance ;" ·在文件的末尾添加acrxEntryPoint() 这里需要提醒一下的是关于AC_IMPLEMENT_EXTENSION_MODULE(DemoDLL)的使用 涉及到了Dll资源的使用,所以DemoDLL在这里相当于一个连接AutoCAD和MFC的纽带, 保持整个Demo.cpp中,DemoDLL的一致5. 项目设置 菜单"工具"->"选项"->"项目"->"包含文件"->添加ObjectARX2004的inc目录 ->"库文件"->添加ObjectARX2004的lib目录6. 生成解决方案 一切pass,有2个警告rxapi.lib(libinit.obj) : warning LNK4099: 未发现 PDB“msvc.pdb” acedapi.lib(acedstub.obj) : warning LNK4099: 未发现 PDB“corehdr.pdb” 不用去管它,ObjectARX开发文档已经说明了这个问题的存在,不影响使用#至此为止,我们已经生成了MarkDemo.arx,在Debug目录下可以找到,下面将继续介绍如何在 AutoCAD2004菜单中自动加载Demo对话框

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Santiago

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值