- UID
- 315
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-11
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
扩展AutoCAD的设计中心
AutoCAD设计中心
设计中心(Design Center)是什么?
设计中心是一个内置于AutoCAD 2000中的内容浏览器,通过设计中心可以查看系统中的文件,并可以直观地浏览文件中的内容。在设计中心里,还可以打开包括外部引用的图形文件,也可以将设计中心里打开的文件中的一些内容(例如图块、图层)拖拽到打开的文件中。对设计中心里的内容的显示方式,可以通过COM来进行自定义。设计中心具有强大的搜索功能,例如,可以通过指定名称的图块等信息来搜索所有的图形文件。此外,借助“Find”对话框,还可以将图形作为附件或块的形式完成插入操作。
1.1.必备的工具和背景知识
为顺利完成本教程,读者需要最新版本的ObjectARX向导(ObjectARX wizard),可以从以下网址下载它: http://adn.autodesk.com/techsupp/utilities/wizards2000.zip 并且,本文假设读者已经具备了ObjectARX、COM和ATL的基本知识。
1.2.如何扩展设计中心
AutoCAD设计中心提供了一个API,它用来提供与设计中心所含内容的有关信息。这个API由四个用于内容管理的组件对象模型(COM)接口所组成。其中两个接口(IAcDcContentBrowser 和IAcDcContentView)供组件提供者在AutoCAD设计中心中显示其内容,另外两个接口 (IacDcContentFinde和 IacDcContentFinderSite)供组件提供者参与到AutoCAD设计中心中的“Find”机制中。以下内容描述了这些接口的功能。此外,设计中心中还有另外一个接口(IAcPostDrop),它支持组件提供者对从AutoCAD设计中心中进行鼠标右键拖拽功能这一操作的处理。
IAcDcContentBrowser 接口
此接口在AutoCAD设计中心框架内执行,供组件用来对 'get' 和 'set' 的信息进行传递。 当组件的初始化方式被调用时,指向该接口的指针将被赋予该组件。而且,该指针也将被该组件缓存起来,用以反馈给框架。
IAcDcContentView 接口
此接口由组件执行,它用来供AutoCAD设计中心的框架从组件中获得内容的相关信息。
该接口用来查询一个组件,该组件本身已经作为AutoCAD设计中心的一个内容提供者注册过。在某些时候,该组件将被要求初始化其自身。
一旦完成初始化,该接口中的函数将随时被调用,以获得AutoCAD设计中心的“Fin-der”对话框中的相关信息。
IAcDcContentFinder 接口
该接口由组件来执行, 供AutoCAD设计中心的框架自组件中查询信息。该接口用来查询一个组件,该组件本身已经作为AutoCAD设计中心的一个内容提供者注册过。在某些时候,该组件将被要求初始化其自身。
一旦完成初始化,该接口中的函数将随时被调用,以获得AutoCAD设计中心的“Finder”对话框中的相关信息。
IAcDcContentFinderSite 接口
此接口在AutoCAD设计中心的框架内执行,供组件用来提供某一类型内容的搜索结果。
1.3. 注册一个AutoCAD设计中心组件所需的条件
为了使你的组件可以显示在AutoCAD设计中心里, 组件必须经过正确的注册。也就是说,在AutoCAD设计中心的注册条目中包含该组件。为得到正确的注册路径, 首先要获得AutoCAD的初始路径,这可以通过使用acrxProductKey()函数来实现。在初始路径的后面加上"\AutodeskApps\AcadDC"即可得到AutoCAD设计中心的路径。在AutoCAD设计中心路径的下一级别,是内容提供者的应用程序使用的键(Key)。以下几个段落给出了主键及其特定子键(Subkey)。
应用键 (Application Key)
该键提供给内容提供者,用来注册其自身并参与AutoCAD设计中心的定制模式。我们将使用该键。
扩展键(Extensions Key)
该键提供给内容提供者,用来注册其自身并参与AutoCAD设计中心桌面模式(此模式用于显示简单的文件和所含内容, 例如ADT使用的就是桌面模式)。
这些内容提供者只处理特定的扩展类型,并且不关心是否参与到AutoCAD设计中心的定制模式。本教程中不使用该键,我们只关心定制模式的设定。
类标识注册信息(CLASSID Registration)
在HKEY_CLASSES_ROOT下,是组件所需的最低注册条件。我们将初始化该键。
1.4. 生成一个实例工程
下面让我们使用设计中心的扩充功能完成一个实例工程。我们将自定义设计中心,使它能够显示三个多边形:一个三角形、一个矩形和一个六边形。同时我们还将对这些多边形进行拖拽操作。
我们将使用ObjectARX应用程序向导完成这一工程。从'File->New…'菜单中启动向导。在'New' 对话框中选择'Projects'选项卡(如果还没有选择该选项卡),然后从向导列表中选择 'ObjectARX 2000 AppWizard'。输入 'PolygonContents'作为工程名称,然后单击 'OK'按钮。
C:\My Documents\My Pictures\11.gif
随后出现的对话框是ObjectARX 2000 AppWizard。首先要输入注册开发商代号(本例中使用'Asdk')。确认选择了 'Com Server'复选框,它将激活 'Use ATL' 复选框。选择'MFC'复选框,同时去除 'Use ATL Extensions for Custom Objects' 复选框的选择。下面我们将使用一些MFC的选项,否则可以去除对它的选择。按 'Finish' 按钮后按 'OK' 按钮进入到下一个对话框。
C:\My Documents\My Pictures\22.gif
1.4.1. ObjectARX AppWizard生成的源代码
现在我们已经具有了一个工程, 它包含了一个使用ATL的ObjectARX应用程序的架构。项目中包括了若干文件,下面让我们从最先生成的文件入手调试。打开PolygonContent.cpp文件后,可以看到它提供了COM和ATL操作所需的函数。
CComModule _Module;
BEGIN_OBJECT_MAP(ObjectMap)
END_OBJECT_MAP()
// 定义唯一的扩展模块对象
AC_IMPLEMENT_EXTENSION_MODULE(PolygonContentDLL);
/////////////////////////////////////////////////////////////////////////////
// DLL入点
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lp保留*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
_hdllInstance = hInstance;
// 扩充DLL一次性初始化
PolygonContentDLL.AttachInstance(hInstance);
InitAcUiDLL();
_Module.Init(ObjectMap, hInstance, &LIBID_AsdkPOLYGONCONTENTLib);
DisableThreadLibraryCalls(hInstance);
} else if (dwReason == DLL_PROCESS_DETACH) {
// 若非法调用则终止
PolygonContentDLL.DetachInstance();
_Module.Term();
}
return TRUE; // ok
}
/////////////////////////////////////////////////////////////////////////////
// 用于确定DLL是否可以被OLE卸载
STDAPI DllCanUnloadNow(void)
{
return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;
}
1.4. 生成一个实例工程
下面让我们使用设计中心的扩充功能完成一个实例工程。我们将自定义设计中心,使它能够显示三个多边形:一个三角形、一个矩形和一个六边形。同时我们还将对这些多边形进行拖拽操作。
我们将使用ObjectARX应用程序向导完成这一工程。从'File->New…'菜单中启动向导。在'New' 对话框中选择'Projects'选项卡(如果还没有选择该选项卡),然后从向导列表中选择 'ObjectARX 2000 AppWizard'。输入 'PolygonContents'作为工程名称,然后单击 'OK'按钮。
随后出现的对话框是ObjectARX 2000 AppWizard。首先要输入注册开发商代号(本例中使用'Asdk')。确认选择了 'Com Server'复选框,它将激活 'Use ATL' 复选框。选择'MFC'复选框,同时去除 'Use ATL Extensions for Custom Objects' 复选框的选择。下面我们将使用一些MFC的选项,否则可以去除对它的选择。按 'Finish' 按钮后按 'OK' 按钮进入到下一个对话框。
1.4.1. ObjectARX AppWizard生成的源代码
现在我们已经具有了一个工程, 它包含了一个使用ATL的ObjectARX应用程序的架构。项目中包括了若干文件,下面让我们从最先生成的文件入手调试。打开PolygonContent.cpp文件后,可以看到它提供了COM和ATL操作所需的函数。
CComModule _Module;
BEGIN_OBJECT_MAP(ObjectMap)
END_OBJECT_MAP()
// 定义唯一的扩展模块对象
AC_IMPLEMENT_EXTENSION_MODULE(PolygonContentDLL);
/////////////////////////////////////////////////////////////////////////////
// DLL入点
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lp保留*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
_hdllInstance = hInstance;
// 扩充DLL一次性初始化
PolygonContentDLL.AttachInstance(hInstance);
InitAcUiDLL();
_Module.Init(ObjectMap, hInstance, &LIBID_AsdkPOLYGONCONTENTLib);
DisableThreadLibraryCalls(hInstance);
} else if (dwReason == DLL_PROCESS_DETACH) {
// 若非法调用则终止
PolygonContentDLL.DetachInstance();
_Module.Term();
}
return TRUE; // ok
}
/////////////////////////////////////////////////////////////////////////////
// 用于确定DLL是否可以被OLE卸载
STDAPI DllCanUnloadNow(void)
{
return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;
}
|
|