- UID
- 779709
- 积分
- 102
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2018-9-13
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 bbbxxxccclt 于 2019-9-5 22:10 编辑
最近在学习ARX自定义实体,定义好后,在CAD上使用,发现输入命令执行后,CAD上没有自定义实体图,全选后有几个夹点,刷新CAD马上就崩溃;后来试了下,发现worlddraw不执行;到底是什么原因了呢?我用的CAD2013,VS2010,ARX2013;下面是代码,麻烦帮忙检查下到底问题出在哪里呢?
自定义实体.h;
 - <div>#pragma once
- #include "c:\objectarx\inc\dbmain.h"
- #include "stdafx.h"
- #include "stdarx.h"
- #include "acadstrc.h"
- #include "geassign.h"</div><div>
- /*
- #ifdef MYCUSTOMENTIY
- #define DLLIMPEXP __declspec( dllexport )
- #else
- #define DLLIMPEXP
- #endif
- */
- class MyCustomEntity :
- public AcDbEntity
- {
- public:</div><div> ACRX_DECLARE_MEMBERS(MyCustomEntity);
- MyCustomEntity();
- virtual ~MyCustomEntity(void);
- //virtual ACDB_PORT Adesk::Boolean subWorldDraw(AcGiWorldDraw *mode);
-
- void putVerts(AcGePoint3d p1,AcGePoint3d p2,AcGePoint3d p3,AcGePoint3d p4);
-
- protected:
- virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw* mode) override;
- virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray & osnapModes,
- AcDbIntArray & geomIds ) const override;</div><div> virtual Acad::ErrorStatus subMoveGripPointsAt(
- const AcDbIntArray & indices,
- const AcGeVector3d& offset
- ) override;
- virtual Acad::ErrorStatus subGetOsnapPoints(
- AcDb::OsnapMode osnapMode,
- Adesk::GsMarker gsSelectionMark,
- const AcGePoint3d& pickPoint,
- const AcGePoint3d& lastPoint,
- const AcGeMatrix3d& viewXform,
- AcGePoint3dArray& snapPoints,
- AcDbIntArray & geomIds
- )const override;
- virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d & xform)override;
- virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler*)override;
- virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const override;
- virtual Acad::ErrorStatus subGetGeomExtents(AcDbExtents & extents) const override;</div><div>
- private:
- AcGePoint3d m_PtA;
- AcGePoint3d m_PtAB;
- AcGePoint3d m_PtB;
- AcGePoint3d m_PtBA;
- //CString m_Text;
- };</div><div>
- </div>
自定义实体.cpp
- <div>#include "stdafx.h"
- #include "MyCustomEntity.h"</div><div>//1、自定义实体的类名2、当前文件版本3、当前控件版本4、代理实体处理标志5、Dfx0组码对应值6、类说明
- ACRX_DXF_DEFINE_MEMBERS(MyCustomEntity,AcDbObject,AcDb::kDHL_CURRENT,AcDb::kMReleaseCurrent,AcDbProxyEntity::kAllAllowedBits,自定义实体, "autoCAD")
-
- MAKE_ACDBOPENOBJECT_FUNCTION(MyCustomEntity);</div><div>MyCustomEntity::MyCustomEntity()
- {
- }
- MyCustomEntity::~MyCustomEntity(void)
- {
- }
- void MyCustomEntity::putVerts(AcGePoint3d p1,AcGePoint3d p2,AcGePoint3d p3,AcGePoint3d p4)
- {
- acutPrintf(_T("\n**输入角点了\n"));
- m_PtA = p1;
- m_PtAB = p2;
- m_PtB = p3;
- m_PtBA = p4;
-
- }</div><div> Acad::ErrorStatus MyCustomEntity::subGetGripPoints( AcGePoint3dArray& gripPoints, AcDbIntArray & osnapModes, \
- AcDbIntArray & geomIds ) const
- {
- gripPoints.append(m_PtA);
- gripPoints.append(m_PtAB);
- gripPoints.append(m_PtB);
- gripPoints.append(m_PtBA);
- gripPoints.append(AcGePoint3d((m_PtB.x+m_PtA.x)/2.0,\
- (m_PtB.y+m_PtA.y)/2.0,m_PtA.z));
- acutPrintf(_T("\n**夹点已经加载了**\n"));
- return (Acad::eOk);
- }
- Acad::ErrorStatus MyCustomEntity::subMoveGripPointsAt(
- const AcDbIntArray & indices,
- const AcGeVector3d& offset
- )
- {
- acutPrintf(_T("\n**已经移动夹点**"));
- assertWriteEnabled();
- for(int i=0; i<indices.length(); i++) {
- int idx = indices.at(i);
- // For A and center point
- if (idx==0 && idx==4) m_PtA += offset;
- // For AB and center point
- if (idx==1 && idx==4) m_PtAB += offset;
- // For B and center point
- if (idx==2 && idx==4) m_PtB += offset;
- // For BA and center point
- if (idx==3 && idx==4) m_PtBA += offset;
- }
- return (Acad::eOk);
- }</div><div>Acad::ErrorStatus MyCustomEntity::subGetOsnapPoints(
- AcDb::OsnapMode osnapMode,
- Adesk::GsMarker gsSelectionMark,
- const AcGePoint3d& pickPoint,
- const AcGePoint3d& lastPoint,
- const AcGeMatrix3d& viewXform,
- AcGePoint3dArray& snapPoints,
- AcDbIntArray & geomIds
- )const
- {</div><div> acutPrintf(_T("\n**捕捉点已经加载了"));
- assertReadEnabled();
- switch (osnapMode) {
- case AcDb::kOsModeEnd:
- snapPoints.append(m_PtA);
- snapPoints.append(m_PtAB);
- snapPoints.append(m_PtB);
- snapPoints.append(m_PtBA);
- break;
- case AcDb::kOsModeMid:
- snapPoints.append(m_PtA+((m_PtAB -\
- m_PtA).length()/2.0)*((m_PtAB-m_PtA).normalize()));
- snapPoints.append(m_PtAB+((m_PtB-\
- m_PtAB).length()/2.0)*((m_PtB-m_PtAB).normalize()));
- snapPoints.append(m_PtB+((m_PtBA-\
- m_PtB).length()/2.0)*((m_PtBA-m_PtB).normalize()));
- snapPoints.append(m_PtBA+((m_PtA-\
- m_PtBA).length()/2.0)*((m_PtA-m_PtBA).normalize()));
- break;
- case AcDb::kOsModeCen:
- snapPoints.append(AcGePoint3d((m_PtB.x+m_PtA.x)/2.0,\
- (m_PtB.y+m_PtA.y)/2.0, m_PtA.z));
- break;
- }</div><div> return (Acad::eOk); </div><div>}</div><div>Acad::ErrorStatus MyCustomEntity::subTransformBy(const AcGeMatrix3d & xform)
- {
- acutPrintf(_T("\n**已经变换吗了"));
- assertWriteEnabled();
- m_PtA.transformBy(xform);
- m_PtAB.transformBy(xform);
- m_PtB.transformBy(xform);
- m_PtBA.transformBy(xform);
- return (Acad::eOk);
- }
- Acad::ErrorStatus MyCustomEntity::dwgInFields(AcDbDwgFiler* pFiler){
- acutPrintf(_T("\nd**wginfields加载了"));
- assertWriteEnabled();
- AcDbObject::dwgInFields(pFiler);
- if (pFiler->filerType()==AcDb::kWblockCloneFiler)
- {
- AcDbHardPointerId Id;
- pFiler->readItem(&Id);
- }
- pFiler->readPoint3d(&m_PtA);
- pFiler->readPoint3d(&m_PtAB);
- pFiler->readPoint3d(&m_PtB);
- pFiler->readPoint3d(&m_PtBA);
- /*ACHAR* _temp=NULL;
- pFiler->readString(&_temp);
- m_Text.Format(_T("%s"),_temp);
- acutDelString(_temp);*/
- return pFiler->filerStatus();
- }
- Acad::ErrorStatus MyCustomEntity::dwgOutFields(AcDbDwgFiler* pFiler) const{
- acutPrintf(_T("\n**dwgoutfields已经加载了"));
- assertReadEnabled();
- AcDbObject::dwgOutFields(pFiler);</div><div> if (pFiler->filerType()==AcDb::kWblockCloneFiler)
- {
- pFiler->writeHardPointerId((AcDbHardPointerId)ownerId());
- }
- pFiler->writePoint3d(m_PtA);
- pFiler->writePoint3d(m_PtAB);
- pFiler->writePoint3d(m_PtB);
- pFiler->writePoint3d(m_PtBA);
- // pFiler->writeString(static_cast<const ACHAR*>(m_Text));
- return pFiler->filerStatus();
- }</div><div>
- Acad::ErrorStatus MyCustomEntity::subGetGeomExtents(AcDbExtents & extents) const
- {
- assertReadEnabled();
- AcGePoint3dArray vPos;
- vPos[0] = m_PtA;
- vPos[1] = m_PtAB;
- vPos[2] = m_PtB;
- vPos[3] = m_PtBA;
- AcGePoint3d vLeftBottom;
- AcGePoint3d vRightTob;
- vLeftBottom = vPos[0];
- vRightTob = vPos[0];</div><div> for (int i = 1; i < 4; i++)
- {
- if (vLeftBottom.x > vPos[i].x)
- vLeftBottom.x = vPos[i].x;
- if (vLeftBottom.y > vPos[i].y)
- vLeftBottom.y = vPos[i].y;
- if (vRightTob.x < vPos[i].x)
- vRightTob.x = vPos[i].x;
- if (vRightTob.y < vPos[i].y)
- vRightTob.y = vPos[i].y;
- }</div><div> extents.set(vLeftBottom, vRightTob);</div><div> return Acad::eOk;
- }</div><div>
- Adesk::Boolean
- MyCustomEntity::subWorldDraw (AcGiWorldDraw* mode)
- {
- acutPrintf(_T("\n加载了worlDraw"));
- assertReadEnabled();
- // 边界多段线
- AcGePoint3d pts[4];
- pts[0] = m_PtA;
- pts[1] = m_PtAB;
- pts[2] = m_PtB;
- pts[3] = m_PtBA;
- //mode->subEntityTraits().setSelectionMarker(1); // Mark 1
- //mode->subEntityTraits().setColor(1); // Red
- mode->geometry().polygon(4,pts);
- //mode->subEntityTraits().setSelectionMarker(2); // Mark 2
- mode->subEntityTraits().setColor(256);// ByLayer
- return Adesk::kTrue;
- }</div><div>
- </div>
复制代码 命令
 - <div>// (C) Copyright 2002-2012 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. ** 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.
- //</div><div>//-----------------------------------------------------------------------------
- //----- acrxEntryPoint.cpp
- //-----------------------------------------------------------------------------
- #include "StdAfx.h"
- #include "resource.h"
- #include "MyCustomEntity.h"
- //-----------------------------------------------------------------------------
- #define szRDS _RXST("cxb")</div><div>//-----------------------------------------------------------------------------
- //----- ObjectARX EntryPoint
- class ConeTestXiangMuApp : public AcRxArxApp {</div><div>public:
- ConeTestXiangMuApp () : AcRxArxApp () {}</div><div> virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
- // TODO: Load dependencies here</div><div> // You *must* call On_kInitAppMsg here
- AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ; </div><div> MyCustomEntity::rxInit();
- //acrxUnlockApplication(pkt);
- // acrxRegisterAppMDIAware(pkt);
- acrxBuildClassHierarchy();
- acutPrintf(_T("........."));
-
- // TODO: Add your initialization code here</div><div> return (retCode) ;
- }</div><div> virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
- // TODO: Add your code here</div><div> // You *must* call On_kUnloadAppMsg here
- AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
- deleteAcRxClass(MyCustomEntity::desc());
- acutPrintf(_T("+++++++"));
- // TODO: Unload dependencies here</div><div> return (retCode) ;
- }</div><div> virtual void RegisterServerComponents () {
- }
-
- // The ACED_ARXCOMMAND_ENTRY_AUTO macro can be applied to any static member
- // function of the ConeTestXiangMuApp class.
- // The function should take no arguments and return nothing.
- //
- // NOTE: ACED_ARXCOMMAND_ENTRY_AUTO has overloads where you can provide resourceid and
- // have arguments to define context and command mechanism.
-
- // ACED_ARXCOMMAND_ENTRY_AUTO(classname, group, globCmd, locCmd, cmdFlags, UIContext)
- // ACED_ARXCOMMAND_ENTRYBYID_AUTO(classname, group, globCmd, locCmdId, cmdFlags, UIContext)
- // only differs that it creates a localized name using a string in the resource file
- // locCmdId - resource ID for localized command</div><div> // Modal Command with localized name
- // ACED_ARXCOMMAND_ENTRY_AUTO(ConeTestXiangMuApp, cxbMyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL)
- static void cxbMyGroupMyCommand () {
- // Put your command code here
- ads_point pt1,pt2;
- if (acedGetPoint(NULL,_T("指定第一个点:\n"),pt1) != RTNORM)
- return;
- if (acedGetCorner(pt1,_T("指定第二个点:\n"),pt2) != RTNORM)
- return;</div><div> MyCustomEntity * pEnt = new MyCustomEntity();
- pEnt->putVerts(asPnt3d(pt1),AcGePoint3d(pt2[X],pt1[Y],pt1[Z]),asPnt3d(pt2),AcGePoint3d(pt1[X],pt2[Y],pt2[Z]));
- AcDbBlockTable *pBlockTable;
- acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable,AcDb::kForRead);
- AcDbBlockTableRecord *pBlockTableRecord;
- pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
- pBlockTable->close();
- AcDbObjectId retId = AcDbObjectId::kNull;</div><div> pBlockTableRecord->appendAcDbEntity(retId, pEnt);
- if (!retId.isNull())
- {
- acutPrintf(_T("有id了"));
- }
- pBlockTableRecord->close();
- pEnt->close();
- }</div><div> // Modal Command with pickfirst selection
- // ACED_ARXCOMMAND_ENTRY_AUTO(ConeTestXiangMuApp, cxbMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET)
- static void cxbMyGroupMyPickFirst () {
- ads_name result ;
- int iRet =acedSSGet (ACRX_T("_I"), NULL, NULL, NULL, result) ;
- if ( iRet == RTNORM )
- {
- // There are selected entities
- // Put your command using pickfirst set code here
- }
- else
- {
- // There are no selected entities
- // Put your command code here
- }
- }</div><div> // Application Session Command with localized name
- // ACED_ARXCOMMAND_ENTRY_AUTO(ConeTestXiangMuApp, cxbMyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION)
- static void cxbMyGroupMySessionCmd () {
- // Put your command code here
- }</div><div> // The ACED_ADSFUNCTION_ENTRY_AUTO / ACED_ADSCOMMAND_ENTRY_AUTO macros can be applied to any static member
- // function of the ConeTestXiangMuApp class.
- // The function may or may not take arguments and have to return RTNORM, RTERROR, RTCAN, RTFAIL, RTREJ to AutoCAD, but use
- // acedRetNil, acedRetT, acedRetVoid, acedRetInt, acedRetReal, acedRetStr, acedRetPoint, acedRetName, acedRetList, acedRetVal to return
- // a value to the Lisp interpreter.
- //
- // NOTE: ACED_ADSFUNCTION_ENTRY_AUTO / ACED_ADSCOMMAND_ENTRY_AUTO has overloads where you can provide resourceid.
-
- //- ACED_ADSFUNCTION_ENTRY_AUTO(classname, name, regFunc) - this example
- //- ACED_ADSSYMBOL_ENTRYBYID_AUTO(classname, name, nameId, regFunc) - only differs that it creates a localized name using a string in the resource file
- //- ACED_ADSCOMMAND_ENTRY_AUTO(classname, name, regFunc) - a Lisp command (prefix C:)
- //- ACED_ADSCOMMAND_ENTRYBYID_AUTO(classname, name, nameId, regFunc) - only differs that it creates a localized name using a string in the resource file</div><div> // Lisp Function is similar to ARX Command but it creates a lisp
- // callable function. Many return types are supported not just string
- // or integer.
- // ACED_ADSFUNCTION_ENTRY_AUTO(ConeTestXiangMuApp, MyLispFunction, false)
- static int ads_MyLispFunction () {
- //struct resbuf *args =acedGetArgs () ;
-
- // Put your command code here</div><div> //acutRelRb (args) ;
-
- // Return a value to the AutoCAD Lisp Interpreter
- // acedRetNil, acedRetT, acedRetVoid, acedRetInt, acedRetReal, acedRetStr, acedRetPoint, acedRetName, acedRetList, acedRetVal</div><div> return (RTNORM) ;
- }
-
- } ;</div><div>//-----------------------------------------------------------------------------
- IMPLEMENT_ARX_ENTRYPOINT(ConeTestXiangMuApp)</div><div>ACED_ARXCOMMAND_ENTRY_AUTO(ConeTestXiangMuApp, cxbMyGroup, MyCommand, mmm, ACRX_CMD_MODAL, NULL)
- ACED_ARXCOMMAND_ENTRY_AUTO(ConeTestXiangMuApp, cxbMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, NULL)
- ACED_ARXCOMMAND_ENTRY_AUTO(ConeTestXiangMuApp, cxbMyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION, NULL)
- ACED_ADSSYMBOL_ENTRY_AUTO(ConeTestXiangMuApp, MyLispFunction, false)</div><div>
- </div>
|
|