objectarx开发笔记2
ObjectARX开发教程(转)——第2课:AutoCAD数据库

ObjectARX开发教程(转)——第2课:AutoCAD数据库第2课:AutoCAD数据库介绍AutoCAD数据库的结构每个AutoCAD图形代表⼀个存储在⼏种对象中的数据库结构。
打开⼯程图时,AutoCAD会⾃⼰创建⼀个有组织的⾼效数据库。
该数据库包含⽤于创建基本⼯程图的最少数据。
最少的数据量由诸如图层,线型,⽂本样式等对象表⽰。
这样,您将获得第0层,标准字体,连续样式等。
在AutoCAD 2000版中,您可以与MDI环境同时使⽤多个图形。
此功能提供了极⼤的灵活性,但在处理多个图纸时也有些⿇烦。
在本课程中,我们将不讨论MDI⽅⾯,但是ObjectARX应⽤程序可能会要求它。
数据如何存储数据库维护需要绘图的每种对象。
这些对象存储在容器(容器)中,这些容器是为管理相同类型的对象⽽创建的特殊对象。
这样,我们就可以使⽤适当的存储⽅法和过程来存储实体,类,版式等。
存储在数据库中的每个对象都接收⼀个称为ObjectId的标识符。
该标识符在同⼀AutoCAD会话中是唯⼀的,并且在每个对象的整个⽣命周期内有效。
ObjectId由其数据库⽣成,因此您不必关⼼它是如何创建的。
在ObjectARX内部,我们有3种基本类型的对象:实体:图形对象(直线,圆弧,⽂本等);容器(隔间):⽤于存储和管理对象集(图层表,轮廓表等)的特殊对象;对象集:⾮图形对象(组,布局等)。
创建对象要使⽤ObjectARX创建对象,我们有⼀些基于对象类型和要存储对象的公式(⼤多数情况下,我们需要将对象存储在⾃⼰的隔间中)。
基本上,您将执⾏以下操作:将指针包含在要创建的对象中,并将其称为new运算符;使⽤此指针,调⽤对象的适当⽅法以更改其属性;获取指向您要在其中创建对象的数据库的指针(通常是当前数据库);打开⼀个存储数据的容器;通过其指针精确调⽤对象存储⽅法;获取对象的标识符(ObjectId)(由容器⾃动⽣成);完成所有对象集(包括隔离专区和刚刚创建的对象)的关闭过程。
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的系统变量非常多,我们不可能记住所有变量的作用,我会用红色将一些大家可能会用到的变量标示出来,如果这个变量在对话框中无法设置,建议大家关注或记住,其他变量大家如果有需要时可以再查帮助或打开这篇博文里来查一查。
AUTOCAD二次开发笔记(ObjectARX)---全部

AUTOCAD二次开发笔记(ObjectARX)---全部编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(AUTOCAD二次开发笔记(ObjectARX)---全部)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为AUTOCAD二次开发笔记(ObjectARX)---全部的全部内容。
ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad2008+ObjectArx2008)在一个做CAD二次开发的公司做Web开发,感觉可提升的空间很小。
有必要研究一下公司的产品开发,以利发展。
一、首先安装好vs05与cad2008安装cad的时候也没有什么特别,加载到虚拟光驱,安装过程中有个错误提示,不影响继续。
二、安装ObjectArx2008直接打开解压缩到某个目录即可。
比如C:\ObjectARX 2008然后打开C:\ObjectARX 2008\utils\ObjARXWiz目录,运行ArxWizards.msi这样在新建C++项目的时候会出现ObjectARX项目,如图三、包含文件工具—〉选项—>项目和解决方案-〉VC++目录,如图所示:包含文件(添加图中前两个目录即可)库文件(添加图中前两个目录即可)四、新建ObjectARX项目,完成后添加MFC支持,如图所示:然后直接点finish打开acrxEntryPoint.cpp点击左上角的a>按钮,然后新建一个命令。
如图:只需要修改Internation Name与Localized Name为testcmd即可添加完成后,会在acrxEntryPoint。
ObjectARX(实训讲义二)自定义实体

ARX命令
Arx中定 义的资源
© 2007 Autodesk 34
构造对 话框
非模态对话框
• 让对话框能让用户输入操作 • 响应AutoCAD定义的一个消息
#ifndef WM_ACAD_MFC_BASE #define WM_ACAD_MFC_BASE #endif #ifndef WM_ACAD_KEEPFOCUS #define WM_ACAD_KEEPFOCUS 1) #endif onAcadKeepFocus
© 2007 Autodesk 15
其它重要重载函数
• 设置自定义实体的捕捉函数
getOsnapPoints()
• 对平移,复制,镜像等操作的响应函数
transformBy()
• 生成代理实体的图形形状函数
saveAs()
• 相交函数
interSectWith()
• 炸开函数
Explode()
© 2007 Autodesk 16
© 2007 Autodesk 9
类别判断函数
• 最基础的类AcRxObject提供了类型识别函数
virtual AcRxClass* isA() const; static AcRxClass* gpDesc; static AcRxClass* desc(); static CMyClass * cast(const AcRxObject* inPtr)
© 2007 Autodesk 35
(1000)
(WM_ACAD_MFC_BASE +
AdUi和AcUi的介绍和使用
• 用来建立与AutoCAD界面风格一致的控件库 • CAdUi类可用于任何应用程序于任何Autodesk产品的交互 作用 • CAcUi类派生于CAdUi类,并专用于AutoCAD
(完整版)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向导创建螺钉实例的程序步骤(1)启动VS2005,选择【File/New/Project】,系统弹出如图1所示的对话框。
从项目列表中选择【ObjectARX/DBX/OMF Project】选项,输入ScutStds作为项目名称,指定适当的保存位置,单击【OK】。
图1(2)系统弹出如图2所示的对话框,输入你的注册名称(不要以数字开头),注意在MFC Support这一项选择AutoCAD MFC Extension Support选项,其他选项都使用默认值,单击【Finish】,完成项目的创建。
图2(3)在项目中增加一个类来封装自定义函数,选择【Project/Add Class】,弹出的对话框中选择【C++ Class】,单击【Add】,系统弹出如图3所示的对话框,输入CUtilEnts作为新类的名称,单击【Finish】完成。
图3(4)在左侧栏中进入Class View,选中刚刚新建的类CUtilEnts右键点击【Add/Add Function】,这类里增加一个函数AppendEntity,弹出如图所示的对话框,参照图中所示修改其属性。
单击【Finish】完成。
图4此时系统自动生成一个UtilEnts.h的头文件和一个UtilEnts.cpp的源文件。
//此函数将实体添加到图形数据库的模型空间,这样才能使创建的实体被显示出来AcDbObjectId AppendEntity(AcDbEntity *pEnt); //函数实现(在源文件UtilEnts.cpp中) { //获得指向块表的指针AcDbBlockTable *pBlockTable;acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable,AcDb::kForRead); //获得指向特定的块表记录(模型空间)的指针AcDbBlockTableRecord *pBlockTableRecord;pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite); //将AcDbLine类的对象添加到块表记录中AcDbObjectId EntityId;pBlockTableRecord->appendAcDbEntity(EntityId, pEnt);//关闭图形数据库的各种对象pEnt->close();pBlockTable->close();pBlockTableRecord->close();return EntityId;}如同上述步骤再添加一个函数DrawLine,见如图所示的操作。
第二章ObjectARX类库简介
第⼆章ObjectARX类库简介ObjectARX环境包含下列⼏组类和函数:AcRx ⽤于绑定应⽤程序及运⾏时类的注册和标识的类。
AutoCAD Registration Extension;AcEd 注册本地AutoCAD命令和AutoACD事件通知的类。
AutoCAD Envent Directory;AcDb AutoCAD数据库类。
AutoCAD DataBase ;AcGi 显⽰AutoACD实体的图形类。
AutoCAD Graph Interface;AcGe 公⽤线性数学和⼏何学对象应⽤类。
AutoCAD Geometry Entity;AcRx库提供了⼀些系统级类,⽤于DLL的初始化和链接及运⾏时类的注册和标识。
该库的基类是AcRxObject,它提供如下功能:对象运⾏时类标识和继承分析、运⾏时向既有类添加新协议、对象⽐较测试、对象复制。
运⾏时类型标识是AcRxObject的每个⼦类都有⼀个相关的类描述者对象(AcRxClass类型),⽤于运⾏时类型的标识。
最常⽤函数:AcRxObject::isA(); ⽤于类识别,被识别的类必须能够测试其类型。
AcRxObject::isKindOf(); 也是⽤于类识别,但这⾥的类能够被测试其类型,或者测试其派⽣类的类型。
AcRxObject::desc(); 返回类名。
AcRxObject::cast(); 试图将⼀个基类转换成更⾼级的类。
如果转换成功,基类对象的指针将是转换后类型的指针。
该库也可以对应⽤程序进⾏加锁或解锁。
使⽤函数::acrxUnlockApplication()可以使应⽤程序不可卸载。
AcEd库提供定义和注册新的AutoCAD命令的类,新命令的操作性能与AutoCAD内部命令是完全⼀样的。
我们定义的新命令被当作本地命令是因为它们与AutoACD内部命令具有相同的内部结构(AcEdCommandStack)。
AcEd库还提供编辑器反应器和⼀套与AutoCAD通信的全局函数。
最新ObjectARX(实训讲义二)自定义实体
© 2007 Autodesk
16
次常用重载函数
• 深度克隆
DeepClone wblockClone
© 2007 Autodesk
17
设计良好的程序架构
• 自定义实体代码集中在DBX工程中 • 用户交互操作UI (user interface)代码放在 ARX工程中 • DBX 独立存在. • ARX 依赖于 DBX
© 2007 Autodesk
6
AcDbLine
如何实现自定义实体
• 创建一个新类 • 从合适的类派生
• 实现AcRxObject的协议
• 添加到运行时类层次图中
© 2007 Autodesk
7
运行时类型识别(RTTI)
• Runtime Type Identification (RTTI) • 协议扩充 • AcRxClass Class 来描述每一个自定义类
存储自定义数据 扩展实体的功能
连动操作 拖拽 捕捉
拉伸
……
© 2007 Autodesk
4
自定义对象
• 两类自定义对象
从AcDbObject派生
从AcDbEntity派生
AcDbEntity从AcDbObject派生,包括了AcDbObject的所有 功能。因此这里以讲解从AcDbEntity派生的实体为主,
appName comparedTo dxfName isDerivedFrom myParent
name
proxyFlags
© 2007 Autodesk
8
建立运行时类层次
• rxInit (static) • gpDesc (static variable) • newAcRxClass • acrxBuildClassHierarchy
(完整版)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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
刷新显示屏幕问题 (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,你必须重载这个函数。
而且当你调用修改这个实体属性的函数时,要先调用assertWriteEnabled。
关于动态拖动的讨论
acedgetpoint()针对直线
acedGrRead()针对矩形
如果想实现复杂的拖动变换用AcEdJig类或用AcedDragen函数
我开发一个ARX程序,需动态反馈,需要知道当前光标位置。
用acedGrRead时,不能实现OSnap。
用acedGetPoint可获得最点及实现OSnap,但不能动态反馈。
使用acedGetPoint函数,同时创建另一线程使用acedGrRead实现动态反馈,确总是AutoCAD崩溃(使用::GetMouseCursor()及鼠标勾子也同样)。
望哪位高手能解我所惑
不知道下面代码对你有没有帮助!!!!
////////////////////////////////////////////////////////////
//动态移动选择集
////////////////////////////////////////////////////////////
//跟踪矩阵(无限制)
int trancematrix(ads_point usrpt,ads_matrix matrix)
{
int i,j;
for(i=0;i<=3;i++) for(j=0;j<=3;j++) matrix[i][j]=0,0;
for(i=0;i<=3;i++) matrix[i][i]=1.0;
matrix[0][T]=usrpt[X];
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);
}
}
请参考acedDragGen()函数定义
CAD里面用Arx实现拖动的效果:继承AcEdJig类,ARX samples下polysamp 中有相关的例子。