天气与日历 切换到窄版

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

ObjectARX二次开发之自定义实体三角形

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
一、创建自定义实体
1、创建空白解决方案。

2、添加自定义实体工程(自定义三角行实体)

image

image

3、添加类,选择Custom Object Wizard,定义实体名,选择继承AcDbEntity实体基类

image

4、设置捕捉模式、数据读写格式规则

image

5、工程目录

image

6、编写实体在DWG、DXF文件读写

头文件中添加成员变量存储三角形顶点,添加构造函数

源文件中实现构造函数,

源文件中dwgOutFields、dwgInFields、dxfOutFields、dxfInFields函数进行变量存储和读取

源文件中subWorldDraw添加图形绘制

ArxCusEntity.h头文件

// (C) Copyright 2002-2007 by Autodesk, Inc.
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted,
// provided that the above copyright notice appears in all copies and
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.  AUTODESK, INC.
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//

//-----------------------------------------------------------------------------
//----- ArxCusEntity.h : Declaration of the ArxCusEntity
//-----------------------------------------------------------------------------
#pragma once

#ifdef DEMO_CUSTOMENTITY_MODULE
#define DLLIMPEXP __declspec(dllexport)
#else
//----- Note: we don't use __declspec(dllimport) here, because of the
//----- "local vtable" problem with msvc. If you use __declspec(dllimport),
//----- then, when a client dll does a new on the class, the object's
//----- vtable pointer points to a vtable allocated in that client
//----- dll. If the client dll then passes the object to another dll,
//----- and the client dll is then unloaded, the vtable becomes invalid
//----- and any virtual calls on the object will access invalid memory.
//-----
//----- By not using __declspec(dllimport), we guarantee that the
//----- vtable is allocated in the server dll during the ctor and the
//----- client dll does not overwrite the vtable pointer after calling
//----- the ctor. And, since we expect the server dll to remain in
//----- memory indefinitely, there is no problem with vtables unexpectedly
//----- going away.
#define DLLIMPEXP
#endif

//-----------------------------------------------------------------------------
#include "dbmain.h"

//-----------------------------------------------------------------------------
class DLLIMPEXP ArxCusEntity : public AcDbEntity {

public:
        ACRX_DECLARE_MEMBERS(ArxCusEntity) ;

protected:
        static Adesk::UInt32 kCurrentVersionNumber ;

public:
        ArxCusEntity () ;
        //重载构造函数
        ArxCusEntity (AcGePoint3d P1,AcGePoint3d P2,AcGePoint3d P3) ;
        virtual ~ArxCusEntity () ;

        //----- AcDbObject protocols
        //- Dwg Filing protocol
        virtual Acad::ErrorStatus dwgOutFields (AcDbDwgFiler *pFiler) const ;
        virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler *pFiler) ;

        //- Dxf Filing protocol
        virtual Acad::ErrorStatus dxfOutFields (AcDbDxfFiler *pFiler) const ;
        virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler *pFiler) ;

        //----- AcDbEntity protocols
        //- Graphics protocol
protected:
        virtual Adesk::Boolean subWorldDraw (AcGiWorldDraw *mode) ;
        virtual Adesk::UInt32 subSetAttributes (AcGiDrawableTraits *traits) ;

        //- Osnap points protocol
public:
        virtual Acad::ErrorStatus subGetOsnapPoints (
                AcDb::OsnapMode osnapMode,
                int gsSelectionMark,
                const AcGePoint3d &pickPoint,
                const AcGePoint3d &lastPoint,
                const AcGeMatrix3d &viewXform,
                AcGePoint3dArray &snapPoints,
                AcDbIntArray &geomIds) const ;
        virtual Acad::ErrorStatus subGetOsnapPoints (
                AcDb::OsnapMode osnapMode,
                int gsSelectionMark,
                const AcGePoint3d &pickPoint,
                const AcGePoint3d &lastPoint,
                const AcGeMatrix3d &viewXform,
                AcGePoint3dArray &snapPoints,
                AcDbIntArray &geomIds,
                const AcGeMatrix3d &insertionMat) const ;

        //- Grip points protocol
        virtual Acad::ErrorStatus subGetGripPoints (AcGePoint3dArray &gripPoints, AcDbIntArray &osnapModes, AcDbIntArray &geomIds) const ;
        virtual Acad::ErrorStatus subMoveGripPointsAt (const AcDbIntArray &indices, const AcGeVector3d &offset) ;
        virtual Acad::ErrorStatus subGetGripPoints (
                AcDbGripDataPtrArray &grips, const double curViewUnitSize, const int gripSize,
                const AcGeVector3d &curViewDir, const int bitflags) const ;
        virtual Acad::ErrorStatus subMoveGripPointsAt (const AcDbVoidPtrArray &gripAppData, const AcGeVector3d &offset, const int bitflags) ;

private:
        //定义数组,存储三角形三个顶点
        AcGePoint3d m_verts[3];

} ;

#ifdef DEMO_CUSTOMENTITY_MODULE
ACDB_REGISTER_OBJECT_ENTRY_AUTO(ArxCusEntity)
#endif
ArxCusEntity.cpp

// (C) Copyright 2002-2007 by Autodesk, Inc.
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted,
// provided that the above copyright notice appears in all copies and
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.  AUTODESK, INC.
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//

//-----------------------------------------------------------------------------
//----- ArxCusEntity.cpp : Implementation of ArxCusEntity
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "ArxCusEntity.h"

//-----------------------------------------------------------------------------
Adesk::UInt32 ArxCusEntity::kCurrentVersionNumber =1 ;

//-----------------------------------------------------------------------------
ACRX_DXF_DEFINE_MEMBERS (
        ArxCusEntity, AcDbEntity,
        AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
        AcDbProxyEntity::kNoOperation, ARXCUSENTITY,
ARXDEMO_CUSTOMENTITYAPP
|Product Desc:     A description for your object
|Company:          Your company name
|WEB Address:      Your company WEB site address
)

//-----------------------------------------------------------------------------
ArxCusEntity::ArxCusEntity () : AcDbEntity () {
}

ArxCusEntity::ArxCusEntity( AcGePoint3d P1,AcGePoint3d P2,AcGePoint3d P3 )
{
        m_verts[0] = P1;
        m_verts[1] = P2;
        m_verts[2] = P3;
}
ArxCusEntity::~ArxCusEntity () {
}

//-----------------------------------------------------------------------------
//----- AcDbObject protocols
//- Dwg Filing protocol
Acad::ErrorStatus ArxCusEntity::dwgOutFields (AcDbDwgFiler *pFiler) const {
        assertReadEnabled () ;
        //----- Save parent class information first.
        Acad::ErrorStatus es =AcDbEntity::dwgOutFields (pFiler) ;
        if ( es != Acad::eOk )
                return (es) ;
        //----- Object version number needs to be saved first
        if ( (es =pFiler->writeUInt32 (ArxCusEntity::kCurrentVersionNumber)) != Acad::eOk )
                return (es) ;
        //----- Output params
        //.....写入成员变量数据
        for(int i=0; i< 3;i++){
                pFiler->writeItem(m_verts[i]);
        }

        return (pFiler->filerStatus ()) ;
}

Acad::ErrorStatus ArxCusEntity::dwgInFields (AcDbDwgFiler *pFiler) {
        assertWriteEnabled () ;
        //----- Read parent class information first.
        Acad::ErrorStatus es =AcDbEntity::dwgInFields (pFiler) ;
        if ( es != Acad::eOk )
                return (es) ;
        //----- Object version number needs to be read first
        Adesk::UInt32 version =0 ;
        if ( (es =pFiler->readUInt32 (&version)) != Acad::eOk )
                return (es) ;
        if ( version > ArxCusEntity::kCurrentVersionNumber )
                return (Acad::eMakeMeProxy) ;
        //- Uncomment the 2 following lines if your current object implementation cannot
        //- support previous version of that object.
        //if ( version < ArxCusEntity::kCurrentVersionNumber )
        //        return (Acad::eMakeMeProxy) ;
        //----- Read params
        //.....读取成员变量数值
        for (int i=0; i<3; i++)
        {
                pFiler->readItem(&m_verts[i]);
        }

        return (pFiler->filerStatus ()) ;
}

//- Dxf Filing protocol
Acad::ErrorStatus ArxCusEntity::dxfOutFields (AcDbDxfFiler *pFiler) const {
        assertReadEnabled () ;
        //----- Save parent class information first.
        Acad::ErrorStatus es =AcDbEntity::dxfOutFields (pFiler) ;
        if ( es != Acad::eOk )
                return (es) ;
        es =pFiler->writeItem (AcDb::kDxfSubclass, _RXST("ArxCusEntity")) ;
        if ( es != Acad::eOk )
                return (es) ;
        //----- Object version number needs to be saved first
        if ( (es =pFiler->writeUInt32 (kDxfInt32, ArxCusEntity::kCurrentVersionNumber)) != Acad::eOk )
                return (es) ;
        //----- Output params


        return (pFiler->filerStatus ()) ;
}

Acad::ErrorStatus ArxCusEntity::dxfInFields (AcDbDxfFiler *pFiler) {
        assertWriteEnabled () ;
        //----- Read parent class information first.
        Acad::ErrorStatus es =AcDbEntity::dxfInFields (pFiler) ;
        if ( es != Acad::eOk || !pFiler->atSubclassData (_RXST("ArxCusEntity")) )
                return (pFiler->filerStatus ()) ;
        //----- Object version number needs to be read first
        struct resbuf rb ;
        pFiler->readItem (&rb) ;
        if ( rb.restype != AcDb::kDxfInt32 ) {
                pFiler->pushBackItem () ;
                pFiler->setError (Acad::eInvalidDxfCode, _RXST("\nError: expected group code %d (version #)"), AcDb::kDxfInt32) ;
                return (pFiler->filerStatus ()) ;
        }
        Adesk::UInt32 version =(Adesk::UInt32)rb.resval.rlong ;
        if ( version > ArxCusEntity::kCurrentVersionNumber )
                return (Acad::eMakeMeProxy) ;
        //- Uncomment the 2 following lines if your current object implementation cannot
        //- support previous version of that object.
        //if ( version < ArxCusEntity::kCurrentVersionNumber )
        //        return (Acad::eMakeMeProxy) ;
        //----- Read params in non order dependant manner
        while ( es == Acad::eOk && (es =pFiler->readResBuf (&rb)) == Acad::eOk ) {
                switch ( rb.restype ) {
                        //----- Read params by looking at their DXF code (example below)
                        //case AcDb::kDxfXCoord:
                        //        if ( version == 1 )
                        //                cen3d =asPnt3d (rb.resval.rpoint) ;
                        //        else
                        //                cen2d =asPnt2d (rb.resval.rpoint) ;
                        //        break ;
                       
                       
                        default:
                                //----- An unrecognized group. Push it back so that the subclass can read it again.
                                pFiler->pushBackItem () ;
                                es =Acad::eEndOfFile ;
                                break ;
                }
        }
        //----- At this point the es variable must contain eEndOfFile
        //----- - either from readResBuf() or from pushback. If not,
        //----- it indicates that an error happened and we should
        //----- return immediately.
        if ( es != Acad::eEndOfFile )
                return (Acad::eInvalidResBuf) ;

        return (pFiler->filerStatus ()) ;
}

//-----------------------------------------------------------------------------
//----- AcDbEntity protocols
Adesk::Boolean ArxCusEntity::subWorldDraw (AcGiWorldDraw *mode) {
        assertReadEnabled () ;

        //绘制图形
        for (int i =0; i < 3 ;i++)
        {
                int nextIndex = i +1;
                if(i ==2)
                {
                        nextIndex = 0;
                }

                AcGePoint3d points[2];
                points[0] = m_verts[i];
                points[1] = m_verts[nextIndex];
                mode->geometry().polyline(2,points);
        }

        return (AcDbEntity::subWorldDraw (mode)) ;
}


Adesk::UInt32 ArxCusEntity::subSetAttributes (AcGiDrawableTraits *traits) {
        assertReadEnabled () ;
        return (AcDbEntity::subSetAttributes (traits)) ;
}

        //- Osnap points protocol
Acad::ErrorStatus ArxCusEntity::subGetOsnapPoints (
        AcDb::OsnapMode osnapMode,
        int gsSelectionMark,
        const AcGePoint3d &pickPoint,
        const AcGePoint3d &lastPoint,
        const AcGeMatrix3d &viewXform,
        AcGePoint3dArray &snapPoints,
        AcDbIntArray &geomIds) const
{
        assertReadEnabled () ;
        return (AcDbEntity::subGetOsnapPoints (osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds)) ;
}

Acad::ErrorStatus ArxCusEntity::subGetOsnapPoints (
        AcDb::OsnapMode osnapMode,
        int gsSelectionMark,
        const AcGePoint3d &pickPoint,
        const AcGePoint3d &lastPoint,
        const AcGeMatrix3d &viewXform,
        AcGePoint3dArray &snapPoints,
        AcDbIntArray &geomIds,
        const AcGeMatrix3d &insertionMat) const
{
        assertReadEnabled () ;
        return (AcDbEntity::subGetOsnapPoints (osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds, insertionMat)) ;
}

//- Grip points protocol
Acad::ErrorStatus ArxCusEntity::subGetGripPoints (
        AcGePoint3dArray &gripPoints, AcDbIntArray &osnapModes, AcDbIntArray &geomIds
) const {
        assertReadEnabled () ;
        //----- This method is never called unless you return eNotImplemented
        //----- from the new getGripPoints() method below (which is the default implementation)

        return (AcDbEntity::subGetGripPoints (gripPoints, osnapModes, geomIds)) ;
}

Acad::ErrorStatus ArxCusEntity::subMoveGripPointsAt (const AcDbIntArray &indices, const AcGeVector3d &offset) {
        assertWriteEnabled () ;
        //----- This method is never called unless you return eNotImplemented
        //----- from the new moveGripPointsAt() method below (which is the default implementation)

        return (AcDbEntity::subMoveGripPointsAt (indices, offset)) ;
}

Acad::ErrorStatus ArxCusEntity::subGetGripPoints (
        AcDbGripDataPtrArray &grips, const double curViewUnitSize, const int gripSize,
        const AcGeVector3d &curViewDir, const int bitflags
) const {
        assertReadEnabled () ;

        //----- If you return eNotImplemented here, that will force AutoCAD to call
        //----- the older getGripPoints() implementation. The call below may return
        //----- eNotImplemented depending of your base class.
        return (AcDbEntity::subGetGripPoints (grips, curViewUnitSize, gripSize, curViewDir, bitflags)) ;
}

Acad::ErrorStatus ArxCusEntity::subMoveGripPointsAt (
        const AcDbVoidPtrArray &gripAppData, const AcGeVector3d &offset,
        const int bitflags
) {
        assertWriteEnabled () ;

        //----- If you return eNotImplemented here, that will force AutoCAD to call
        //----- the older getGripPoints() implementation. The call below may return
        //----- eNotImplemented depending of your base class.
        return (AcDbEntity::subMoveGripPointsAt (gripAppData, offset, bitflags)) ;
}

二、创建测试项目
1、在解决方案下创建Arx测试项目,引用自定义实体

设置测试项目为当前启动项目,鼠标右键引用自定义实体工程

image

2、在测试项目中添加用户命令,添加自定义实体头文件

// (C) Copyright 2002-2007 by Autodesk, Inc.
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted,
// provided that the above copyright notice appears in all copies and
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.  AUTODESK, INC.
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//

//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"
#include "../Demo_CustomEntity/ArxCusEntity.h"

//-----------------------------------------------------------------------------
#define szRDS _RXST("Arx")

//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CDemo_TSTCustomEntityApp : public AcRxArxApp {

public:
        CDemo_TSTCustomEntityApp () : AcRxArxApp () {}

        virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
                // TODO: Load dependencies here

                // You *must* call On_kInitAppMsg here
                AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
               
                // TODO: Add your initialization code here

                return (retCode) ;
        }

        virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
                // TODO: Add your code here

                // You *must* call On_kUnloadAppMsg here
                AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

                // TODO: Unload dependencies here

                return (retCode) ;
        }

        virtual void RegisterServerComponents () {
        }


        // - ArxDemo_TSTCustomEntity._MyCommand1 command (do not rename)
        static void ArxDemo_TSTCustomEntity_MyCommand1(void)
        {
                // Add your code for command ArxDemo_TSTCustomEntity._MyCommand1 here
                //定义自定义实体
                ArxCusEntity *pArxArxCusEntity = new ArxCusEntity(AcGePoint3d(0,0,0),AcGePoint3d(100,0,0),AcGePoint3d(100,100,30));

                AcDbBlockTable *pBlockTable =NULL;
                //打开块表
                acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);
                AcDbBlockTableRecord *pBockTableRecord = NULL;
                //打开模型空间
                pBlockTable->getAt(ACDB_MODEL_SPACE,pBockTableRecord,AcDb::kForWrite);
                AcDbObjectId lineId;
                //添加实体到模型空间
                pBockTableRecord->appendAcDbEntity(lineId,pArxArxCusEntity);
                pBlockTable->close();
                pBockTableRecord->close();
                pArxArxCusEntity->close();
        }
} ;

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CDemo_TSTCustomEntityApp)

ACED_ARXCOMMAND_ENTRY_AUTO(CDemo_TSTCustomEntityApp, ArxDemo_TSTCustomEntity, _MyCommand1, MyCommand1, ACRX_CMD_TRANSPARENT, NULL)

[code]https://www.icode9.com/content-4-1412589.html[/code]

 

 

 

 

ObjectARX二次开发之自定义实体三角形
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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