ObjectArx调用cad内部命令

PhdArxCadCmd.h

#pragma once
#include <memory>
#include <mutex>
 
 
class PhdArxCadCmd final
{
public:
	static PhdArxCadCmd* Instance();
 
private:
	PhdArxCadCmd() = default;
 
	static std::unique_ptr<PhdArxCadCmd> m_self;	//声明静态对象
 
public:
	//关闭命令回显
	void EchoOff() const;
 
	//刷新图纸
	bool CallRegen() const;
 
	//设置标注线性比例
	bool SetDimLineScale(double dValue) const;
 
	//设置标注全局比例
	bool SetDimScale(double dValue) const;
 
	//设置区域覆盖是否显示边框
	bool SetWipeoutShow(bool bShow = false) const;
 
	//设置倒圆角半径
	bool SetFilletRadius(double dRadius) const;
	//调用cad命令倒圆角
	bool FilletByCommand(AcDbObjectId& idArc,const AcDbObjectId& idLine1, const AcDbObjectId& idLine2) const;
 
	//定位实体
	bool OrientationEnt(const AcDbObjectId& idEnt) const;
 
	//zoom显示全部实体
	bool ZoomAllEnt() const;
 
	//zoom窗口
	bool ZoomWindow(const AcGePoint3d& ptMin,const AcGePoint3d& ptMax) const;
 
};
 
//宏定义
#define g_ArxCadCmd PhdArxCadCmd::Instance()

PhdArxCadCmd.cpp

#include "stdafx.h"
#include "../stdafx.h"
#include "PhdArxCadCmd.h"
#include <acedCmdNF.h>
 
//初始化静态成员变量
std::unique_ptr<PhdArxCadCmd> PhdArxCadCmd::m_self;
 
PhdArxCadCmd* PhdArxCadCmd::Instance()
{
	//判断智能指针对象是否为空
	if (m_self.get() == nullptr)	//双重检查
	{
		//定义互斥量对象
		static std::mutex mutex;
		//定义智能锁对象
		std::lock_guard<std::mutex> alock(mutex);
		//判断智能指针对象对否为空
		if (m_self.get() == nullptr)
		{
			//创建实例,并绑定智能指针
			m_self.reset(new PhdArxCadCmd);
		}
	}
 
	return m_self.get();
}
 
void PhdArxCadCmd::EchoOff() const
{
	resbuf var;
	int nRs = acedGetVar(_T("CMDECHO"), &var);
	if (var.resval.rint)//打开了命令回显
	{
		//ObjectARX已经将acedCommand函数升级为acedCommandS函数, 使用该函数需要添加头文件”acedCmdNF.h”。
		acedCommandS(RTSTR, _T("CMDECHO"), RTSHORT, 0, RTNONE);
	}
}
 
bool PhdArxCadCmd::CallRegen() const
{
	int nRet = acedCommandS(RTSTR, _T("REGEN"), RTNONE);
	return nRet == RTNORM;
}
 
bool PhdArxCadCmd::SetDimLineScale(double dValue) const
{
	//int nRet = acedCommand(RTSTR, _T("DIMLFAC"), RTREAL, dValue, RTNONE);
	int nRet = acedCommandS(RTSTR, _T("DIMLFAC"), RTREAL, dValue, RTNONE);
	return nRet == RTNORM;
}
 
bool PhdArxCadCmd::SetDimScale(double dValue) const
{
	//int nRet = acedCommand(RTSTR, _T("DIMSCALE"), RTREAL, dValue, RTNONE);
	int nRet = acedCommandS(RTSTR, _T("DIMSCALE"), RTREAL, dValue, RTNONE);
	return nRet == RTNORM;
}
 
bool PhdArxCadCmd::SetWipeoutShow(bool bShow /*= false*/) const
{
	int nRet;
	if (bShow)
	{
		//nRet = acedCommand(RTSTR, _T("wipeout"), RTSTR, _T("f"), RTSTR, _T("on"), RTNONE);
		nRet = acedCommandS(RTSTR, _T("wipeout"), RTSTR, _T("f"), RTSTR, _T("on"), RTNONE);
	}
		
	else
	{
		//nRet = acedCommand(RTSTR, _T("wipeout"), RTSTR, _T("f"), RTSTR, _T("off"), RTNONE);
		nRet = acedCommandS(RTSTR, _T("wipeout"), RTSTR, _T("f"), RTSTR, _T("off"), RTNONE);
	}
		
	return nRet == RTNORM;
}
 
bool PhdArxCadCmd::SetFilletRadius(double dRadius) const
{
	//int nRet = acedCommand(RTSTR, _T("_fillet"), RTSTR, _T("r"), RTREAL, dRadius, RTNONE);
	int nRet = acedCommandS(RTSTR, _T("_fillet"), RTSTR, _T("r"), RTREAL, dRadius, RTNONE);
	return nRet == RTNORM;
}
 
bool PhdArxCadCmd::FilletByCommand(AcDbObjectId& idArc, const AcDbObjectId& idLine1, const AcDbObjectId& idLine2) const
{
	AcDbPoint* pt = new AcDbPoint(AcGePoint3d::kOrigin);
	AcDbObjectId ptId = g_ArxUtility->PostToModelSpace(pt);
 
	ads_name name1, name2;
	acdbGetAdsName(name1, idLine1);
	acdbGetAdsName(name2, idLine2);
	//int nRet = acedCommand(RTSTR, _T("_fillet"), RTENAME, name1, RTENAME, name2, RTNONE);
	int nRet = acedCommandS(RTSTR, _T("_fillet"), RTENAME, name1, RTENAME, name2, RTNONE);
	if (nRet != RTNORM)
	{
		g_ArxCommand->DeleteEnt(ptId);
		return false;
	}
		
	//得到圆弧id
	ads_name lastEnt;
	acdbEntLast(lastEnt);
	acdbGetObjectId(idArc, lastEnt);
	if (idArc == ptId)
	{
		g_ArxCommand->DeleteEnt(ptId);
		return false;
	}
	else
	{
		g_ArxCommand->DeleteEnt(ptId);
		return true;
	}
}
 
bool PhdArxCadCmd::OrientationEnt(const AcDbObjectId& idEnt) const
{
	AcDbEntityPointer pEnt(idEnt, AcDb::kForWrite);
	if (Acad::eOk != pEnt.openStatus())
		return false;
	AcDbExtents extent;
	pEnt->getGeomExtents(extent);
	pEnt->highlight();	//设置实体为高亮状态
	AcGePoint3d ptMin = extent.minPoint();
	AcGePoint3d ptMax = extent.maxPoint();
	double dWidth = fabs(ptMax.x - ptMin.x);
	double dHeight = fabs(ptMax.y - ptMin.y);
	AcGePoint3d CenterPt;
	CenterPt.x = (ptMax.x + ptMin.x) / 2;
	CenterPt.y = (ptMax.y + ptMin.y) / 2;
	ptMax.x = CenterPt.x + (dWidth / 2) * 2;
	ptMax.y = CenterPt.y + (dHeight / 2) * 2;
	ptMin.x = CenterPt.x - (dWidth / 2) * 2;
	ptMin.y = CenterPt.y - (dHeight / 2) * 2;
 
	CString strCommand;
	strCommand.Format(_T("ZOOM\nw\n%lf,%lf,%lf\n%lf,%lf,%lf\n"), ptMin.x, ptMin.y, ptMin.z, ptMax.x, ptMax.y, ptMax.z);
	acDocManager->sendStringToExecute(acDocManager->curDocument(), strCommand, true, false, false);
	return true;
}
 
bool PhdArxCadCmd::ZoomAllEnt() const
{
	//int nRet = acedCommand(RTSTR, _T("zoom"), RTSTR, _T("a"), RTNONE);
	int nRet = acedCommandS(RTSTR, _T("zoom"), RTSTR, _T("a"), RTNONE);
	return nRet == RTNORM;
}
 
bool PhdArxCadCmd::ZoomWindow(const AcGePoint3d& ptMin, const AcGePoint3d& ptMax) const
{
	int nRet = acedCommandS(RTSTR, _T("zoom"), RTSTR, _T("w"), RT3DPOINT, asDblArray(ptMin),
		RT3DPOINT, asDblArray(ptMax), RTNONE);
	return nRet == RTNORM;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ObjectARX是一个开发工具包,用于创建定制的AutoCAD应用程序。它是由Autodesk开发的,用于扩展和增强AutoCAD的功能。ObjectARX允许开发人员使用C++、.NET和其他编程语言创建插件、宏和其他扩展,以满足用户的特定需求。 ObjectARX for AutoCAD 2020是最新版本的ObjectARX,专门为AutoCAD 2020版本定制开发的。它提供了与AutoCAD的最新功能和改进的兼容性,使开发人员能够开发高度集成、高度定制的AutoCAD应用程序。 使用ObjectARX for AutoCAD 2020,开发人员可以利用AutoCAD的强大功能,如二维和三维绘图、设计和建模工具,来创建个性化的工作流程和定制工具。他们可以访问和操纵AutoCAD的对象模型,如图层、块、实体等,以及访问图形数据库的数据。 ObjectARX for AutoCAD 2020还包括了对最新的AutoCAD功能的支持,如新的DWG文件格式、图形视觉化和呈现功能、云存储和协作能力等。开发人员可以充分利用这些功能,为用户提供更强大、更高效的定制工具和功能。 总而言之,ObjectARX for AutoCAD 2020是一个强大的开发工具包,可以帮助开发人员创建定制的AutoCAD应用程序,满足用户的特定需求,并利用AutoCAD最新的功能和改进,提供更强大、更高效的定制工具和功能。 ### 回答2: ObjectARX for AutoCAD 2020是一种用于AutoCAD 2020的开发工具包,它允许开发者通过自定义的方式扩展和定制AutoCAD的功能。 ObjectARX是Autodesk提供的强大的应用程序编程接口(API),允许开发者使用C++语言编写插件和应用程序,以访问和操纵AutoCAD中的对象、实体和命令ObjectARX for AutoCAD 2020提供了许多功能和功能,使开发者能够创建各种各样的自定义解决方案。一些常见的应用包括自定义命令、自定义实体、自定义图形界面等。通过使用ObjectARX,开发者可以通过添加新的命令和功能来满足特定的工作流程需求,提高生产效率。 该开发工具包还提供了许多用于操作和管理AutoCAD图形对象的类和函数,例如创建和编辑实体、块、层等。借助这些工具,开发者可以轻松地与AutoCAD中的图形数据进行交互,实现自定义的二维和三维图形操作。 ObjectARX for AutoCAD 2020还支持与其他Autodesk产品的集成,例如Autodesk Revit和Navisworks等。这意味着开发者可以在不同的Autodesk应用程序之间共享数据和功能,实现更加灵活和高效的工作流程。 总的来说,ObjectARX for AutoCAD 2020是一个强大的开发工具包,使开发者能够创建和定制各种自定义解决方案,满足特定的工作流程需求,并提高AutoCAD的生产效率。 ### 回答3: ObjectARX for AutoCAD 2020(AutoCAD 2020 的 ObjectARX)是一种开发框架,用于自定义和扩展 AutoCAD 2020 的功能。ObjectARX 允许开发者使用 C++ 编程语言创建自己的 AutoCAD 插件,以满足特定的设计需求。 使用 ObjectARX,开发者可以利用 AutoCAD 2020 中的各种功能和特性来创建定制化的工具和功能,例如自定义命令、菜单、工具栏等。它还允许开发者与 AutoCAD 2020 中的各个对象进行交互,包括图形实体、图层、块定义、属性等。通过 ObjectARX 可以轻松地访问和修改 AutoCAD 中的图形数据。 ObjectARX for AutoCAD 2020 提供了丰富的 API(应用程序编程接口),开发者可以使用这些 API 来操纵图形数据、执行各种操作和实现自定义功能。同时,ObjectARX 还提供了强大的调试工具,方便开发者进行代码的调试和错误修复。 使用 ObjectARX,开发者可以开发出适用于各种特殊需求的 AutoCAD 插件,如自动化绘图、批量处理、数据导出等。这些插件能够大大提高工作效率,并且根据项目需求进行定制,满足不同用户的不同要求。 总之,ObjectARX for AutoCAD 2020 是一个强大的开发框架,用于自定义和扩展 AutoCAD 2020 的功能。它提供了丰富的 API 和调试工具,可以帮助开发者创建出适应特定需求的定制化工具和功能,提高工作效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值