ObjectARX学习笔记(十九)--如何设置扩展字典的数据AcDbDictionary
来源:互联网 发布:淘宝官方下载电脑版 编辑:程序博客网 时间:2024/04/27 10:06
//扩展字典xtsndict// (C) Copyright 1996-2006 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.//// Description://// This program demonstrates using extension dictionaries.// Two commands are defined in this program: CREATE, and// LISTXREC.// // The CREATE command calls the function createXrecord()// which instantiates an xrecord object and adds it to the// extension dictionary of a user selected object.// // The LISTXREC command calls the listXrecord() function// which opens the extension dictionary of a user selected// object, looks for the xrecord created by the CREATE// command and then calls the printList() function to print// out the data stored in the xrecord.#if defined(_DEBUG) && !defined(AC_FULL_DEBUG)#error _DEBUG should not be defined except in internal Adesk debug builds#endif#include <stdlib.h>#include <rxobject.h>#include <rxregsvc.h>#include <aced.h>#include <dbsymtb.h>#include <adslib.h>#include <dbxrecrd.h>#include <acestext.h>#include "tchar.h"void createXrecord();void listXrecord();AcDbObject* selectObject(AcDb::OpenMode);void printList(struct resbuf* pBuf);void initApp();void unloadApp();extern "C"AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode, void*);// The createXrecord() functions creates an xrecord object, // adds data to it, and then adds the xrecord to the extension // dictionary of a user selected object.// // THE FOLLOWING CODE APPEARS IN THE SDK DOCUMENT.//voidcreateXrecord(){ AcDbXrecord *pXrec = new AcDbXrecord; AcDbObject *pObj; AcDbObjectId dictObjId, xrecObjId; AcDbDictionary* pDict; pObj = selectObject(AcDb::kForWrite); if (pObj == NULL) { return; } // Try to create an extension dictionary for this // object. If the extension dictionary already exists, // this will be a no-op. // pObj->createExtensionDictionary(); // Get the object ID of the extension dictionary for the // selected object. // dictObjId = pObj->extensionDictionary(); pObj->close(); // Open the extension dictionary and add the new // xrecord to it. // acdbOpenObject(pDict, dictObjId, AcDb::kForWrite); pDict->setAt(_T("ASDK_XREC1"), pXrec, xrecObjId); pDict->close(); // Create a resbuf list to add to the xrecord. // struct resbuf* head; ads_point testpt = {1.0, 2.0, 0.0}; head = acutBuildList(AcDb::kDxfText, _T("This is a test Xrecord list"), AcDb::kDxfXCoord, testpt, AcDb::kDxfReal, 3.14159, AcDb::kDxfAngle, 3.14159, AcDb::kDxfColor, 1, AcDb::kDxfInt16, 180, 0); // Add the data list to the xrecord. Notice that this // member function takes a reference to a resbuf NOT a // pointer to a resbuf, so you must dereference the // pointer before sending it. // pXrec->setFromRbChain(*head); pXrec->close(); acutRelRb(head);}// The listxrecord() functions gets the xrecord associated with the // key "ASDK_XREC1" and lists out its contents by passing the resbuf // list to the function printList().// voidlistXrecord(){ AcDbObject *pObj; AcDbXrecord *pXrec; AcDbObjectId dictObjId; AcDbDictionary *pDict; pObj = selectObject(AcDb::kForRead); if (pObj == NULL) { return; } // Get the object ID of the object's extension dictionary. // dictObjId = pObj->extensionDictionary(); pObj->close(); // Open the extension dictionary and get the xrecord // associated with the key ASDK_XREC1. // acdbOpenObject(pDict, dictObjId, AcDb::kForRead); pDict->getAt(_T("ASDK_XREC1"), (AcDbObject*&)pXrec, AcDb::kForRead); pDict->close(); // Get the xrecord's data list and then close the xrecord. // struct resbuf *pRbList; pXrec->rbChain(&pRbList); pXrec->close(); printList(pRbList); acutRelRb(pRbList);}// END CODE APPEARING IN SDK DOCUMENT.// The selectObject() function prompts the user to select an // entity or enter an object's handle. It then proceeds to // open the object/entity and return a pointer to it.// AcDbObject*selectObject(AcDb::OpenMode openMode){ ads_name en; ads_point pt; TCHAR handleStr[132]; AcDbObjectId eId; Acad::ErrorStatus retStat; int ss; // Allow user to either pick an entity, // or type in the object handle. // acedInitGet(RSG_OTHER, _T("Handle _Handle")); ss = acedEntSel(_T("\nSelect an Entity or enter") _T(" 'H' to enter its handle: "), en, pt); switch (ss) { case RTNORM: // got it! break; case RTKWORD: if ((acedGetString(Adesk::kFalse, _T("Enter Valid Object Handle: "), handleStr) == RTNORM) && (acdbHandEnt(handleStr, en) == RTNORM)) { break; } // Fall-through intentional // default: acutPrintf(_T("Nothing Selected, Return Code==%d\n"), ss); return NULL; } // Now, exchange the ads_name for the object Id... // retStat = acdbGetObjectId(eId, en); if (retStat != Acad::eOk) { acutPrintf(_T("\nacdbGetObjectId failed")); acutPrintf(_T("\nen==(%lx,%lx), retStat==%d\n"), en[0], en[1], eId); return NULL; } AcDbObject* pObj; if ((retStat = acdbOpenObject(pObj, eId, openMode)) != Acad::eOk) { acutPrintf(_T("acdbOpenEntity failed: ename:") _T("(%lx,%lx), mode:%d retStat:%d"), en[0], en[1], openMode, retStat); return NULL; } return pObj;}// The printList() function takes a linked list of resbufs // as an argument. Walks the list printing out the restypes // and resval values one set per line.// voidprintList(struct resbuf* pBuf){ int rt, i; TCHAR buf[133]; for (i = 0;pBuf != NULL;i++, pBuf = pBuf->rbnext) { if (pBuf->restype < 0) rt = pBuf->restype; else if (pBuf->restype < 10) rt = RTSTR; else if (pBuf->restype < 38) rt = RT3DPOINT; else if (pBuf->restype < 60) rt = RTREAL; else if (pBuf->restype < 80) rt = RTSHORT; else if (pBuf->restype < 100) rt = RTLONG; else if (pBuf->restype < 106) rt = RTSTR; else if (pBuf->restype < 148) rt = RTREAL; else if (pBuf->restype < 290) rt = RTSHORT; else if (pBuf->restype < 330) rt = RTSTR; else if (pBuf->restype < 370) rt = RTENAME; else if (pBuf->restype < 999) rt = RT3DPOINT; else rt = pBuf->restype; switch (rt) { case RTSHORT: if (pBuf->restype == RTSHORT) acutPrintf(_T("RTSHORT : %d\n"), pBuf->resval.rint); else acutPrintf(_T("(%d . %d)\n"), pBuf->restype, pBuf->resval.rint); break; case RTREAL: if (pBuf->restype == RTREAL) acutPrintf(_T("RTREAL : %0.3f\n"), pBuf->resval.rreal); else acutPrintf(_T("(%d . %0.3f)\n"), pBuf->restype, pBuf->resval.rreal); break; case RTSTR: if (pBuf->restype == RTSTR) acutPrintf(_T("RTSTR : %s\n"), pBuf->resval.rstring); else acutPrintf(_T("(%d . \"%s\")\n"), pBuf->restype, pBuf->resval.rstring); break; case RT3DPOINT: if (pBuf->restype == RT3DPOINT) acutPrintf( _T("RT3DPOINT : %0.3f, %0.3f, %0.3f\n"), pBuf->resval.rpoint[X], pBuf->resval.rpoint[Y], pBuf->resval.rpoint[Z]); else acutPrintf( _T("(%d %0.3f %0.3f %0.3f)\n"), pBuf->restype, pBuf->resval.rpoint[X], pBuf->resval.rpoint[Y], pBuf->resval.rpoint[Z]); break; case RTLONG: acutPrintf(_T("RTLONG : %dl\n"), pBuf->resval.rlong); break; case -1: case RTENAME: acutPrintf(_T("(%d . <Entity name: %8lx>)\n"), pBuf->restype, pBuf->resval.rlname[0]); break; case -3: acutPrintf(_T("(-3)\n")); } if ((i == 23) && (pBuf->rbnext != NULL)) { i = 0; acedGetString(0, _T("Press <ENTER> to continue..."), buf); } } return;}// Initialization function called in acrxEntryPoint// during the kInitAppMsg case. This is where commands// are added to the AcEd command stack.// voidinitApp(){ acedRegCmds->addCommand(_T("ASDK_EXTDICT_COMMANDS"), _T("ASDK_CREATE"), _T("CREATE"), ACRX_CMD_MODAL, createXrecord); acedRegCmds->addCommand(_T("ASDK_EXTDICT_COMMANDS"), _T("ASDK_LISTXREC"), _T("LISTXREC"), ACRX_CMD_MODAL, listXrecord);}// Clean up function called in acrxEntryPoint during the// kUnloadAppMsg case. This app's command group is// removed from the AcEd command stack.// voidunloadApp(){ acedRegCmds->removeGroup(_T("ASDK_EXTDICT_COMMANDS"));}// ARX entry point.//AcRx::AppRetCodeacrxEntryPoint(AcRx::AppMsgCode msg, void* appId){ switch (msg) { case AcRx::kInitAppMsg: acrxDynamicLinker->unlockApplication(appId);acrxDynamicLinker->registerAppMDIAware(appId); initApp(); break; case AcRx::kUnloadAppMsg: unloadApp(); } return AcRx::kRetOK;}
0 0
- ObjectARX学习笔记(十九)--如何设置扩展字典的数据AcDbDictionary
- ObjectARX学习笔记(十七)--如何添加扩展记录xrecord
- ObjectARX学习笔记(三十二)----如何设置AcDbMText对齐方式
- ObjectARX学习笔记(三十三)----如何设置打断实体AcDbCurve
- ObjectARX学习笔记(二)----中如何设置实体的颜色setColorIndex
- ObjectARX学习笔记(三)----中如何设置实体所在的图层setLayer
- ObjectARX学习笔记(六)----如何设置点的样式和大小 CAD二次开发
- ObjectARX学习笔记(十六)--如何设置CAD选项对话框的配置AcApProfileManagerReactor反应器
- ObjectArx学习笔记-设置字体样式
- php学习笔记(十九)mysqli扩展库的多语句查询、事物处理以及字符集设置
- ObjectARX-学习笔记
- ObjectARX-学习笔记
- ObjectARX学习笔记
- ObjectArx学习笔记-画线
- ObjectArx学习笔记-acedGetXXX
- 数据字典学习笔记
- ObjectARX学习笔记(四)----中如何得到当前模块的句柄 HMODEL
- ObjectARX学习笔记(廿八)---如何计算两条线段的交点AcGeLineSeg3d
- Android清理设备内存详细完整示例(二)
- maven war包的plugin配置
- Struts2中Action配置中的各项默认值
- 传记
- 个人学习-Struts2
- ObjectARX学习笔记(十九)--如何设置扩展字典的数据AcDbDictionary
- 关于Windows高DPI
- android程序奔溃异常捕捉
- C#中双问号(??)在检测Null方面的带来的方便
- 分布式文件系统(未完)
- Kali Linux 安全渗透教程<第六更>1.4.2 安装至USB驱动器Kali Linux
- Android清理设备内存详细完整示例(一)
- Android MediaPlayer架构图解
- MySql安装后各种错误解决办法