找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 583|回复: 3

扩展AutoCAD的设计中心

[复制链接]
发表于 2002-1-19 09:56:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
扩展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;

}

 
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-6-20 15:49:31 | 显示全部楼层
wuxian123 :
能不能把完整的程序贴出来供大家学习学习?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-6-20 20:01:23 | 显示全部楼层
最初由 hope 发布
[B]wuxian123 :
能不能把完整的程序贴出来供大家学习学习? [/B]


呵呵!这可不是我编的,是转贴的!好像就是再Autodesk的中文站上的!

我要有这水平就好了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-6-22 10:29:50 | 显示全部楼层
太深了看不懂
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-15 19:39 , Processed in 0.399969 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表