天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 52|回复: 0

ObjectArx调用cad内部命令

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]PhdArxCadCmd.h

#pragma once
#include <memory>
#include <mutex>

/***********************************************
   >   Class Name: PhdArxCadCmd
   >     Describe: Arx调用cad命令(单例类)
   >       Author: peihaodong
   > Created Time: 2021年7月22日
   >         Blog: https://blog.csdn.net/phd17621680432
   >           QQ: 841382590
**********************************************/

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;
}
[/code]

 

 

 

 

ObjectArx调用cad内部命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 10:38 , Processed in 0.113742 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表