objectarx开发笔记4
在ObjectARX 中打开与关闭对象 (2)一个创建面域的小程序 (2)加工具条按钮的方法 (3)如何创建经过任意实体的选择集 (8)建立新选择集,以及将一个实体添加到一个存在的选择集中 (8)根据objectid获取ads_name (9)在ObjectARX 中打开与关闭对象对arxreference章节的个人理解,如有误解原文之意,请多多指正!Opening and Closing ObjectARX Objects本部分代码样例说明了打开与关闭对象的协议。
应用此协议之前,你必须确保你所操作的对象是数据库驻留对象。
此协议能够确保对象在访问时是内存中的实体(physically),而不需访问时其可以存储在硬盘上。
当你准备修改某个数据库驻留对象时,你首先需要将其打开,代码如下所示:acdbOpenObject(pObject, objId, AcDb::kForWrite);此函数有一个Mode parameter可以指出打开对象的方式是for read, write, or notify;仅当对象以AcDb::kForWrite方式打开时,你才可以修改此对象,否则只可以查询对象属性。
当完成修改或查询时,你必须显式的将其关闭,代码如下所示:pObject->close();如下代码样例改变一个实体(AcDbEntity)的颜色,如下所示:Acad::ErrorStatuschangeColor(AcDbObjectId entId, Adesk::UInt16 newColor){AcDbEntity *pEntity;acdbOpenObject(pEntity, entId,AcDb::kForWrite);pEntity->setColorIndex(newColor);pEntity->close();return Acad::eOk;}新的对象实例被以写的方式打开时,一些函数可以在打开对象时一并获取对象标识符(object ID),例如AcDbBlockTable::getAt()函数就是如此。
仅当对象被加入数据库(database)后才能将其关闭。
在对象被加入数据库之前,你拥有此对象并且随时可以将其删除。
然而请注意,一旦对象被加入数据库后,就不可以将其直接删除。
你可以调用AcDbObject::erase(),此函数将对象标记为已删除状态。
被标记为已删除状态的对象实际上一直存在于数据库,直到数据库被销毁时其生命期才真正结束。
然而,被标记为已删除状态的对象,不会随图形(drawing)一起作保存,其一直保持(remain)其删除前状态。
注意:直接删除已加入数据库的对象,会导致AutoCad异常终止。
一个创建面域的小程序view plaincopy to clipboardprint?1.static void ahlzlARX_test(void)2.{3. AcDbDatabase* pdb = acdbHostApplicationServices()->workingDatabase();4.5. AcDbBlockTable* pBlockTable;6. pdb->getBlockTable(pBlockTable, AcDb::kForRead);7.8. AcDbBlockTableRecord* pBlockTableRecord;9. pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);10.11. AcDbCircle* pEnt = new AcDbCircle(AcGePoint3d(1, 2, 0),AcGeVector3d::kZAxis,6);12. AcDbV oidPtrArray curveSegments, regions;13. curveSegments.append (pEnt);14. AcDbRegion::createFromCurves(curveSegments, regions);15.16. AcDbRegion *pRegion = static_cast<ACDBREGION *>(regions.at(0));17. pRegion->setDatabaseDefaults();18.19. pBlockTableRecord->appendAcDbEntity(pRegion);20.21. pBlockTable->close();22. pBlockTableRecord->close();23. pRegion->close();24.}加工具条按钮的方法static bool CCgToolApp::getApplication(LPDISPATCH * pVal){LPDISPATCH pDispatch = acedGetAcadWinApp()->GetIDispatch(TRUE);if (pDispatch == NULL)return false;*pVal = pDispatch;return true;}static bool CCgToolApp::getAcadMenuGroup(IAcadMenuGroup **pVal){IAcadApplication *acadApp = NULL;LPDISPATCH pDisp = NULL;if (!getApplication(&pDisp)){acadApp->Release();return false;}HRESULT hr = S_OK;hr = pDisp->QueryInterface(IID_IAcadApplication, (LPVOID*)&acadApp);if (FAILED(hr)){acadApp->Release();return false;}LPDISPATCH pTempDisp = NULL;IAcadMenuGroups *mnuGrps = NULL;long cnt = 0;//get the menu groupshr = acadApp->get_MenuGroups(&mnuGrps);if (FAILED(hr)){acadApp->Release();return false;}acadApp->Release();mnuGrps->get_Count(&cnt);//get AutoCAD menu group. say it is index 0.IAcadMenuGroup *mnuGrp = NULL;VARIANT vtName;vtName.vt = VT_I4;BSTR grpName;bool found = false;for (long i = 0; i < cnt; i++){vtName.lVal = i;hr = mnuGrps->Item(vtName, &mnuGrp);if (FAILED(hr))return false;hr = mnuGrp->get_Name(&grpName);CString cgrpName(grpName);if (pareNoCase(L"Acad") == 0){found = true;*pVal = mnuGrp;break;}}acadApp->Release();return found;}static bool CCgToolApp::getToolBar(IAcadToolbars **pVal, CString pName) {IAcadToolbars *tlbrs;tlbrs = *pVal;HRESULT hr = S_OK;long cnt = 0l;hr = tlbrs->get_Count(&cnt);IAcadToolbar *tlbr = NULL;BSTR tempName;VARIANT vtName;bool found = false;for (long i = 0; i < cnt; i++){vtName.vt = VT_I4;vtName.lVal = i;hr = tlbrs->Item(vtName, &tlbr);if (FAILED(hr))return found;hr = tlbr->get_Name(&tempName);CString tlbName(tempName);if(pareNoCase(pName) == 0){found = true;break;}tlbr->Release();}//tlbrs->Release();if (!found){acutPrintf(L"\n没有发现[%s]工具条!", pName);return found;}return found;}static void CCgToolApp::CreateToolbar(){IAcadMenuGroup *mnuGrp = NULL;if (!getAcadMenuGroup(&mnuGrp))return;//取得所有ToolbarIAcadToolbars *tlbrs = NULL;HRESULT hr = S_OK;hr = mnuGrp->get_Toolbars(&tlbrs);mnuGrp->Release();if (getToolBar(&tlbrs, L"cg工具")){tlbrs->Release();acutPrintf(L"\n[cg工具]工具条已经存在!");return;}//创建ToolbarIAcadToolbar *tlbr = NULL;hr = tlbrs->Add(L"cg工具", &tlbr);if (FAILED(hr))return;tlbrs->Release();//添加ButtonIAcadToolbarItem *button1 = NULL;IAcadToolbarItem *button2 = NULL;IAcadToolbarItem *button3 = NULL;long cnt;hr = tlbr->get_Count(&cnt);VARIANT index;index.vt = VT_I4;index.lVal = cnt + 1;VARIANT vtFalse;vtFalse.vt = VT_BOOL;vtFalse.boolVal = VARIANT_FALSE;//取得ARX模块路径TCHAR appFullPath[MAX_PATH];int len = GetModuleFileName(_hdllInstance, appFullPath, MAX_PATH);CString strBmpPath = appFullPath;strBmpPath = strBmpPath.Left(strBmpPath.ReverseFind('\\')) + L"\\bmp";CComBSTR smallIconName;CComBSTR largeIconName;hr = tlbr->AddToolbarButton(index, L"cgt1", L"acedGrRead模式", L"cgt1 ", vtFalse, &button1);smallIconName = strBmpPath + L"\\1.bmp";largeIconName = strBmpPath + L"\\1.bmp";button1->SetBitmaps(smallIconName, largeIconName);button1->Release();index.lVal = cnt + 2;hr = tlbr->AddToolbarButton(index, L"cgt2", L"acedDragGen模式", L"cgt2 ", vtFalse, &button2);smallIconName = strBmpPath + L"\\1.bmp";largeIconName = strBmpPath + L"\\1.bmp";button2->SetBitmaps(smallIconName, largeIconName);button2->Release();index.lVal = cnt + 3;hr = tlbr->AddToolbarButton(index, L"cgt3", L"AcEdJig模式", L"cgt3 ", vtFalse,&button3);smallIconName = strBmpPath + L"\\1.bmp";largeIconName = strBmpPath + L"\\1.bmp";button3->SetBitmaps(smallIconName, largeIconName);button3->Release();//定义菜单浮动(停泊)位置//tlbr->Dock(acToolbarDockTop);hr = tlbr->Float(120,720,1);int nLeft, nTop;hr = tlbr->get_Left(&nLeft);hr = tlbr->get_Top(&nTop);if (FAILED(hr))acutPrintf(L"\n浮动位置不确定!");else if(SUCCEEDED(hr))acutPrintf(L"\n%浮动位置:( %d, %d )", nTop, nLeft);//设置可见性VARIANT_BOOL bFlag = VARIANT_TRUE;tlbr->put_Visible(bFlag);tlbr->Release();//acutPrintf(L"\n[cg工具]工具条加载成功!");acutPrintf(L"\n");return;}如何创建经过任意实体的选择集我知道经过线型的选择集的构造方法pointlist=acutBuildList(RTPOINT,pt1, RTPOINT,pt2, RTPOINT,pt3, RTPOINT,pt4,0)acedSSGet(“F”,pointlist,NULL,NULL,ss name);如果是任意实体(比如,圆)呢?请指教创建经过任意实体的选择集resbuf *pSel;pSel = acutBuildList(RTDXF0,"CIRCLE",0);pointlist=acutBuildList(RTPOINT,pt1, RTPOINT,pt2, RTPOINT,pt3, RTPOINT,pt4,0)acedSSGet(“F”,pointlist,NULL,pSel,ssname);选择圆,同理可得建立新选择集,以及将一个实体添加到一个存在的选择集中acedSSAdd(NULL,NULL,ss); //建立一个空选择集if(acedSSAdd(A,ss,ss)!=RTNORM) //将A添加到一个选择集中{acutPrintf("添加A到选择集错误!/n");return BAD;}ARX程序很脆弱,容易出错,建议你在程序设计时加上出错处理。
ObjectARX2010学习笔记004:复制多段线点生成新多段线
ObjectARX2010学习笔记004:复制多段线点⽣成新多段线static void swtArxProject5plcopy(void){// Add your code for command swtArxProject5.plcopy here//定义对象名和点ads_name ename;ads_point pt;//如果没有选择到实体if(acedEntSel(NULL,ename,pt)!=RTNORM){return;}//定义并获取IDAcDbObjectId id;acdbGetObjectId(id,ename);//定义并获取实体AcDbEntity *pEnt;acdbOpenObject(pEnt,id,AcDb::kForRead);//定义点集AcGePoint2dArray pts;//判断是否是多段线if(pEnt->isKindOf(AcDbPolyline::desc())){//如果是,定义多段线AcDbPolyline *pPline=AcDbPolyline::cast(pEnt);//点数量int num=pPline->numVerts();//在点中循环for (int i=0;i<num;i++){AcGePoint2d pt;//取得每个点pPline->getPointAt(i,pt);//将点加⼊到点集pts.append(pt);}pPline->close();}//关闭实体pEnt->close();//创建多段线CreatePolyline(pts,1.0);}AcDbObjectId CreatePolyline(AcGePoint2dArray pts,double width){int numVertex =pts.length();AcDbPolyline *pPoly=new AcDbPolyline(numVertex);for (int i=0;i<numVertex;i++){pPoly->addVertexAt(i,pts.at(i),0,width,width);}AcDbObjectId polyId;pPoly->setColorIndex(1);polyId=PostToModelSpace(pPoly);pPoly->close();return polyId;}。
ObjectARX及MFC开发常见的问题及解决方法总结
工作中使用到ObjectARX及MFC开发遇到的问题及解决1、提示microsoft incremental linker已停止工作解决方法表现为:编译没错,生成时,弹出错误窗口;解决:工程属性-配置属性-连接器-常规,启用增量连接想,选择“否”图1参考网址:/gameking/archive/2012/02/11/2346814.html2、编译ARX程序时,提示:fatal error C1083: 无法打开包括文件:“type_traits”: No such fil e or directory分析:主要是ARX中的头文件,引用了MFC中的type_traits文件,而你的VS编译器可能没有该文件解决:从别人的机子找到VS的安装目录,把这个头文件拷贝过来,放在相应的位置上。
路径为:D:\Program Files\Microsoft Visual Studio 9.0\VC\include(我的VS装在D盘,如果你的不是在D盘,去相应的盘符中查找)两个文件:type_traitsxxtype_traitstype_traits.rar文件1-VS2008的该文件,解压后放到上面说的目录下参考网址:/biyusr/article/details/76149403、从公司拷回来的工程,肯定是没有问题的,但是在自己的机子上编译(用VS2008编译的,工程也是用VS2008创建的),但是提示:fatal error C1900: Il mismatch between 'P1' version '20080116' and 'P2' version '20070207'解决:没有安装VS2008SP1安装包,下载或者拷贝个安装包,安装下,在生成就没问题了。
参考网址:/bettermanlu/archive/2011/02/17/1956819.html4、error LNK2005: _DllMain@12 已经在dllmain.obj 中定义原因:你自己又定义了一个DllMain函数,而工程在创建的时候已经自动生成了一个DLLMain 函数;解决:方法1:如果你的DllMain没自己改写什么内容的话,直接删除自己定义的DllMain 函数就可;方法2:在DllMain文件中,加入如下代码,DLLMain函数之前,#ifdef _X86_extern "C" { int _afxForceUSRDLL; }#elseextern "C" { int __afxForceUSRDLL; }#endif该代码的目的:起到了强制执行你自定义的dllmain函数的作用参考网址:/alision082178/item/665fd93322f7244580f1a7045、自己编写ObjectARX程序,如果使用到对话框的话,就应该注意一些工程属性方面的设置,从创建工程到设置如下:1、创建新工程时,在项目选项中选“MFC AppWizard(DLL)",然后选MFC Extension DLL,然后输入项目名步骤1步骤2完成了工程的创建,下面进行工程属性的设置。
objectarx开发笔记2
刷新显示屏幕问题 (2)自定义实体时添加variable时相关问题 (2)用acdbOpenAcDbEntity打开实体后一定要关闭 (2)WCS到UCS的坐标转换 (2)选择过程中判断用户右键操作 (2)如何实现自定义实体Undo? (3)关于动态拖动的讨论 (3)刷新显示屏幕问题有时在程序中修改了实体,比如删除了实体,但在屏幕上没有及时地刷新,这时执行屏幕选取实体函数acedSSGet(),仍然能够选中原来的实体,明明它们已经删除了,这时怎么办呢,考虑用acedCommand(RTSTR, "REGEN", RTNONE);虽然也可以,但它会重新生成整个图形数据库,如果数据量很大,那么重生成的速度会很慢,这样就不可能在程序的一段循环语句中修改每一个实体后都对数据库重生成,那程序运行的时间大部分都花在刷新数据库上了,显然这不合理.解决方法:// 刷新显示屏幕actrTransactionManager->flushGraphics();acedUpdateDisplay();自定义实体时添加variable时相关问题问:用ObjectARX2007的Add Member Variable Wizard时出现页面错误怎么办?答:用vs2005自身的class view中的add variable就可以了。
用acdbOpenAcDbEntity打开实体后一定要关闭用acdbOpenAcDbEntity打开实体,不管是只读还是编辑方式,操作后都要关闭实体,否则再次打开时只能以只读方式打开。
WCS到UCS的坐标转换mbp为当前坐标(ads_point mbp),可以以下方法转换为wcs坐标。
struct resbuf wcs, ucs;wcs.restype = RTSHORT;wcs.resval.rint = 0;ucs.restype = RTSHORT;ucs.resval.rint = 1;acedTrans(mbp,&ucs,&wcs,0,mbp);选择过程中判断用户右键操作观察Acad2002的命令:mledit,这个命令运行后,用户需要选择操作对象,可是这个命令的选择功能有点特殊: 可以判断用户点了右键(等同直接按回车),,如果点了右键(或按回车),程序会退出.现在有个程序,也要选择一个对象,并且也想实现用户按回车(点击右键)后直接退出,我用的是acedEntSel函数,可是这些函数(包含acedNEntSelP..等.)都只能返回RENORM(正确选中),RTEROR(没有选中),用户按回车(点击右键)也是返回RTERROR请教下这里有没有解决的办法.int rc=acedEntSel("\nChoose a entity:",ent,pt);switch(rc){case RTCAN:acutPrintf("\nUser canceled.");break;case RTERROR:acutPrintf("\nNothing selected.");break;}如何实现自定义实体Undo?undo和redo实际上是调用了自定义实体的dwgInFields和dwgOutFields,你必须重载这个函数。
可视opendcl的学习笔记
ObjectDCL学习笔记(1)初识ObjectDCLAutoLisp简洁、易学、功能强大,可满足用户的绝大多数需求。
对一般的AutoCAD用户来说,AutoLisp 是进行开发的首选语言。
但AutoLisp使用的对话框编程语言DCL和PDB却实在不敢恭维,其功能、界面、编程方法都不能令人满意。
ObjectDCL应运而生。
1.安装和设置ObjectDCL1.1运行ObjectDCL文件包中的Setup.exe,一路Next下去,ObjectDCL就被安装到C:\Program Files\3rd Day Software\ObjectDCL文件夹中。
1.2在安装ObjectDCL的文件夹中,有ObjectDCL.arx和ObjectDCL2004.arx两个arx库文件。
ObjectDCL.arx用于Acad2000/2002,ObjectDCL2004.arx用于Acad2004。
为方便编程,把它们拷贝到Acad 的支持搜索路径中,或直接把安装ObjectDCL的文件夹设置为Acad的支持搜索路径。
1.3创建一个准备存放ObjectDCL编程结果的文件夹,假设为D:\MyOdcl。
把D:\MyOdcl也设置为Acad的支持搜索路径。
现在就可以开始学习ObjectDCL了。
2.启动和认识ObjectDCL在安装ObjectDCL的文件夹中,有个ObjectDCL.exe文件,它就是ObjectDCL的主程序。
运行ObjectDCL.exe,即进入ObjectDCL编辑环境。
ObjectDCL的主窗口很简洁,各菜单项的意义也很清楚,且大部分都在工具条和4个停靠子窗口中有对应的功能,而View菜单是ObjectDCL工具条和下面要说明的4个工具停靠子窗口的开关。
工具条中的第一个图标对应的是工程菜单Project的前5个菜单项,用来添加对话框窗体;工具条中的最后一个图标(照相机)对应的是工程菜单View/Edit Picture Folder菜单项,用来管理图形资源文件夹。
objectarx培训
► ► ► ► ► ► ► ► ► ► ► ► ► ► ► ► ► ► ► ► ►
AcDbBlockTableRecordIterator *pIterator = NULL; pTableRecpTableRec->newIterator(pIterator); //遍歷快表找出選擇實體ID //遍歷快表找出選擇實體ID for (pIterator->start(); !pIterator->done(); pIterator->step()) (pIterator!pIteratorpIterator{ AcDbEntity *pEnt = NULL; if(Acad::eOk != pIterator->getEntity(pEnt,AcDb::kForWrite)) pIterator{ continue; } AcDbObjectId objId; objId = pEnt->objectId(); pEntif (objId == NULL) { continue; } objIdArray.append(objId); pEntpEnt->close(); } delete pIterator; pTableRecpTableRec->close();
3 實體
► 3.1實體類的層次 3.1實體類的層次
AcdbEntity類 AcdbEntity類 ► 3.3 AcdbPolyline 類 ► 3.4 得到實體,修改實體,添加實體 得到實體,修改實體,
► 3.2
►
3.1實體類的層次 3.1實體類的層次
3.2 AcdbEntity類 AcdbEntity類
AcdbCircle *pCircle = new AcdbCircle(); AcDbBlockTable *pBlockTable = NULL; Acad::ErrorStatus es = acdbHostApplicationServices()acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pBlockTable,AcDb::kForRead); if (es != Acad::eOk ||pBlockTable == NULL) { return false; } AcDbBlockTableRecord *pBlockTableRec = NULL; es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTablepBlockTableRec,AcDb::kForWrite); if (es != Acad::eOk || pBlockTableRec == NULL) { pBlockTablepBlockTable->close(); return false; } pBlockTablepBlockTable->close(); pBlockTableRec->appendAcDbEntity(pCircle pBlockTableRec->appendAcDbEntity(pCircle ); pBlockTableRecpBlockTableRec->close();
objectarx 开发人员手册
ObjectARX开发人员手册目录一、ObjectARX开发简介1.1 什么是ObjectARX?1.2 ObjectARX的应用领域1.3 ObjectARX的基本原理1.4 ObjectARX的发展历程二、ObjectARX环境搭建2.1 开发环境准备2.2 ObjectARX SDK安装2.3 开发工具选择2.4 环境配置及注意事项三、ObjectARX开发入门3.1 基本概念及术语3.2 ObjectARX编程框架3.3 第一个ObjectARX程序四、ObjectARX开发核心知识4.1 对象模型4.2 数据访问和修改4.3 事件处理4.4 自定义命令和操作4.5 交互式绘图五、ObjectARX开发高级技巧5.1 高效数据管理5.2 多线程编程5.3 性能优化5.4 构建扩展应用程序六、ObjectARX开发实例6.1 绘图应用实例6.2 数据处理应用实例6.3 CAD环境集成实例6.4 其他领域实例七、ObjectARX开发注意事项7.1 内存管理7.2 线程安全7.3 安全性考虑7.4 与AutoCAD版本兼容性7.5 其他注意事项八、ObjectARX开发资源8.1 冠方文档和教程8.2 开发社区和论坛8.3 第三方扩展库8.4 实用工具和示例九、ObjectARX开发未来展望9.1 行业发展趋势9.2 技术更新和发展9.3 ObjectARX的发展方向一、ObjectARX开发简介1.1 什么是ObjectARX?ObjectARX是AutoCAD的二次开发接口,简单来说,它是AutoCAD的扩展开发评台。
通过ObjectARX,开发者可以利用C++、C#、VB等语言编写自定义应用程序,扩展和定制AutoCAD的功能,实现各种与CAD相关的应用开发。
1.2 ObjectARX的应用领域ObjectARX广泛应用于工程设计、土木工程、建筑设计、机械设计等领域。
开发者可以利用ObjectARX开发CAD扩展功能、自定义命令、数据处理工具、智能绘图等应用,帮助用户提高工作效率,满足特定行业的需求。
(完整版)ObjectARX学习笔记
一、CAD 版本和VC++的版本对应 (1)二、ObjectARX 实体创建 (1)三、创建直线实例 (1)五、修改图形对象的属性 (2)1、打开图形数据库的对象 (2)2、修改直线颜色实例 (3)六、用类组织函数 (4)七、提高CreateLine 函数的可重用性 (8)八、升级Visual Studio 试用版到正式版 (12)九、创建圆 (13)十、创建圆弧(“三点法”,“起点、圆心、终点法”,“起点、圆心、圆弧角度法”) (18)//添加计算常量的值的函数 (20)十一、创建多段线 (23)十二、创建正多边形 (25)一、CAD 版本和VC++的版本对应AutoCADVisual Studio2000——2002 VC6.02004——2006 VC7.0(2002)2007——2009 VC8.0(VC2005)2010——1012 VC20082013——2014 VC2010二、ObjectARX 实体创建1、注册一条直线命令2、在命令函数中添加创建直线对象函数(AcDbLine 类)AcGePoint3d ptStart();AcGePoint3d ptEnd();AcDbLine *pLine=new AcDbLine(ptStart,ptEnd);3 在命令函数中添加获得指向块表的指针相关代码AcDbBlockeTable *pBlockTable;acdbHostApplicationServices()->WorkingDataBase()->getBlockTable(pBlockTable,AcDb::kForRead);4、在命令函数中添加获得指向特定块表记录的指针的相关代码AcDbBlockTableRecord *pBlockTableRecord;pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);5、在命令函数中添加向块表记录中附加实体代码AcDbObjectId lineId;pBlockTabelRecord->appendAcDbEntity(lineId,pLine);6、在命令函数中添加关闭图形数据库各种对象的代码pBlockTable->close();pBlockTableRecord->close();pLine->close();三、创建直线实例Comme定义的执行结Acad::ErrorStatusnt [M1]: 一个在结构Acad 中表示函数的果四、五、修改图形对象的属性1、打开图形数据库的对象acdbOpenAcDbEntity(AcDbEntity *&pEnt,AcDbObjectIdErrorStatus枚举#include "StdAfx.h"lineId=CreatLine(); //修改直线颜色ChangeColor(lineId,1); }Comment [M3]: 这些函数都是放在acrxEntryPoint.cpp 文件中 Comment [M4]: 包含六、用类组织函数1、新建 ObjectARX 项目 CreatEnt2、新建两个 C++类 CreatEnt 和 ModifyEnt下头文件同用这个类保存创建实体的函数头文件#pragma once #include "StdAfx.h"CCreatEnt::~CCreatEnt(void){}AcDbObjectId CCreatEnt::CreatLine(){//在内存上创建一个新的AcDbLine对象AcGePoint3d ptStart(0,0,0);AcGePoint3d ptEnd(100,100,0);AcDbLine *pLine=new AcDbLine(ptStart,ptEnd);//获得指向块表的指针AcDbBlockTable *pBlockTable;acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);//获得指向特定块表记录的指针AcDbBlockTableRecord *pBlockTableRecord;pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);//将对象添加到块表记录中AcDbObjectId lineId;pBlockTableRecord->appendAcDbEntity(lineId,pLine);//关闭图形数据库的各种对象pBlockTable->close();pBlockTableRecord->close();pLine->close();return lineId;}头文件#pragma once#include "StdAfx.h"class CModifyEnt{public:CModifyEnt(void);~CModifyEnt(void);static Acad::ErrorStatus ChangeColor(AcDbObjectId entId,Adesk::UInt16 colorIndex); };源文件#include "StdAfx.h"#include "ModifyEnt.h"CModifyEnt::CModifyEnt(void){}CModifyEnt::~CModifyEnt(void){}Acad::ErrorStatus CModifyEnt::ChangeColor(AcDbObjectId entId, Adesk::UInt16 colorIndex) {AcDbEntity *pEntity;//打开图形数据库中的对象acdbOpenObject(pEntity,entId,AcDb::kForWrite);//修改实体颜色pEntity->setColorIndex(colorIndex);//关闭实体对象pEntity->close();return Acad::eOk;}AcrxEntryPoint.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.////-----------------------------------------------------------------------------// ----- acrxEntryPoint.cpp//-----------------------------------------------------------------------------#include "StdAfx.h"#include "resource.h"//修改直线颜色CModifyEnt::ChangeColor(lineId,1);}} ;Comment [M6]://-----------------------------------------------------------------------------IMPLEMENT_ARX_ENTRYPOINT(CCreatEntsApp)ACED_ARXCOMMAND_ENTRY_AUTO(CCreatEntsApp, mshlCreatEnts, ChangeColor, ChangeColor,ACRX_CMD_TRANSPARENT, NULL)七、提高CreateLine 函数的可重用性添加类CCreateEnt于是,CCreateEnt 类现在包含了两个静态成员函数:头文件#pragma once// 要包含 StdAfx#include "StdAfx.h"class CCreateLine{public:CCreateLine(void);~CCreateLine(void);};static AcDbObjectId PostToModelSpace(AcDbEntity *pEnt);static AcDbObjectId CreateL(AcGePoint3d ptStart,AcGePoint3d ptEnd);AcDbLine *pLine=new AcDbLine(ptStart,ptEnd);//AcDbObjectId lineId;lineId= CCreateLine::PostToModelSpace(pLine);return lineId;}AcDbObjectId CCreateLine::PostToModelSpace(AcDbEntity *pEnt){AcDbBlockTable *pBlockTable;acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);AcDbBlockTableRecord *pBlockTableRecord;pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);AcDbObjectId entId;pBlockTableRecord->appendAcDbEntity(entId,pEnt);pBlockTable->close();pBlockTableRecord->close();pEnt->close();return entId;}acrxEntryPoint.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.////-----------------------------------------------------------------------------// - mshlfengzhuanglei.AddLine command (do not rename)static void mshlfengzhuangleiAddLine(void){// Add your code for command mshlfengzhuanglei.AddLine hereAcGePoint3d ptStart(0,0,0);AcGePoint3d ptEnd(100,100,0);AcDbObjectId lineId;lineId=CCreateLine::CreateL(ptStart,ptEnd);}} ;//----------------------------------------------------------------------------- IMPLEMENT_ARX_ENTRYPOINT(CArxProject1App)ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, mshlfengzhuanglei, AddLine, AddLine, ACRX_CMD_MODAL, NULL)2013/11/27八、升级Visual Studio 试用版到正式版VS2008 注册方法:非常简单,在开始>设置>控制面版>添加或删除程序>卸载2008(名字不太记得了)>出现卸载界面>点击Next>输入上面CD-key ->出现成功画面即可完美将试用版升级成为正式版。
objectarx开发笔记4
objectarx开发笔记4在ObjectARX 中打开与关闭对象 (2)一个创建面域的小程序 (2)加工具条按钮的方法 (3)如何创建经过任意实体的选择集 (8)建立新选择集,以及将一个实体添加到一个存在的选择集中 (8)根据objectid获取ads_name (9)在ObjectARX 中打开与关闭对象对arxreference章节的个人理解,如有误解原文之意,请多多指正!Opening and Closing ObjectARX Objects本部分代码样例说明了打开与关闭对象的协议。
应用此协议之前,你必须确保你所操作的对象是数据库驻留对象。
此协议能够确保对象在访问时是内存中的实体(physically),而不需访问时其可以存储在硬盘上。
当你准备修改某个数据库驻留对象时,你首先需要将其打开,代码如下所示:acdbOpenObject(pObject, objId, AcDb::kForWrite);此函数有一个Mode parameter可以指出打开对象的方式是for read, write, or notify;仅当对象以AcDb::kForWrite方式打开时,你才可以修改此对象,否则只可以查询对象属性。
当完成修改或查询时,你必须显式的将其关闭,代码如下所示:pObject->close();如下代码样例改变一个实体(AcDbEntity)的颜色,如下所示:Acad::ErrorStatuschangeColor(AcDbObjectId entId, Adesk::UInt16 newColor) {AcDbEntity *pEntity;acdbOpenObject(pEntity, entId,AcDb::kForWrite);pEntity->setColorIndex(newColor);pEntity->close();return Acad::eOk;}新的对象实例被以写的方式打开时,一些函数可以在打开对象时一并获取对象标识符(object ID),例如AcDbBlockTable::getAt()函数就是如此。
ObjectARX开发常用资料
ARX开发常用资料一、ADS函数与ARX函数对比 (2)二、ARX里定义的数据类型 (10)三、结果类型码 (11)四、函数返回结果类型代码: (12)五、其它代码 (12)六、用户输入控制位代码:由函数acedInitGet()先发控制 (13)七、对象捕捉编码及设置对象捕捉代码 (13)八、CAD环境变量 (14)一、ADS函数与ARX函数对比二、ARX里定义的数据类型三、结果类型码四、函数返回结果类型代码:五、其它代码六、用户输入控制位代码:由函数acedInitGet()先发控制七、对象捕捉编码及设置对象捕捉代码ObjectArx修改捕捉模式实现方式//获取捕捉模式struct resbuf rb;acedGetVar(_T("osmode"), &rb);//设置捕捉模式struct resbuf *newsnap;newsnap=ads_buildlist(RTSHORT,n,0);acedSetVar(_T("osmode"), newsnap);acutRelRb(newsnap);八、CAD环境变量所谓系统变量就是一些参数,这些参数有些是可以在“选项”或其他对话框中进行设置的,有些这必须通过在命令行输入变量名进行设置,当然对于高手来说,还可以通过二次开发程序来进行控制。
CAD有很多的变量,例如FILL或FILLMODE控制填充的显示,ATTMODE控制块属性的显示,等等,了解一些常用的系统变量,当你的图纸出现一些问题时,你可以对出现问题的原因有些初步的判断,并可以通过修改变量设置快速解决。
在CAD(无论是AUTOCAD 还是浩辰CAD等其他CAD)的帮助中通常有可以系统变量的介绍,随时到帮助查询也非常方便。
我在网上看到一个CAD系统变量大全,放到这里,希望对您了解系统变量的作用有点帮助。
CAD的系统变量非常多,我们不可能记住所有变量的作用,我会用红色将一些大家可能会用到的变量标示出来,如果这个变量在对话框中无法设置,建议大家关注或记住,其他变量大家如果有需要时可以再查帮助或打开这篇博文里来查一查。
(完整版)objectarx开发笔记2
matrix[1][T]=usrpt[Y]; matrix[2][T]=usrpt[Z]; return RTNORM; } //函数名:acdbDragSset //功能:动态移动一个选择集 //选择集:ssetname //移动参照点:referpoint Acad::ErrorStatus acdbDragSset( ads_name ssetname, AcGePoint3d referpoint ) { ads_point rtpnt; int status; status=acedDragGen(ssetname, "\\n 请选择一个插入点:", 0, trancematrix, rtpnt); if(status!=RTNORM){ return Acad::eNotImplementedYet; } else{ AcGePoint3d newposition; newposition.set(rtpnt[X],rtpnt[Y],rtpnt[Z]); return acdbMoveSset(ssetname,referpoint,newposition); } }
The shortest way to do many things is
刷新显示屏幕问题............................................................................................................................2 自定义实体时添加 variable 时相关问题.........................................................................................2 用 acdbOpenAcDbEntity 打开实体后一定要关闭 ..........................................................................2 WCS 到 UCS 的坐标转换 ................................................................................................................2 选择过程中判断用户右键操作........................................................................................................2 如何实现自定义实体 Undo?..........................................................................................................3 关于动态拖动的讨论........................................................................................................................3
