APP下载

基于AutoCAD自定义实体的初步研究

2012-09-22王光昇周丽珠刘允周义军

城市勘测 2012年2期
关键词:实体测绘编码

王光昇,周丽珠,刘允,周义军

(天津市测绘院,天津 300381)

1 引言

在过去的十年中,基于AutoCAD的地形图成图软件在我们国内制图,设计领域一直占据着主导地位,这主要是因为AutoCAD软件在表现线划图形上方便易用以及Autodesk的品牌效应。但从根本上来讲,Autodesk的一系列产品中,并没有多少功能是专门为我们测绘行业设计的,所以AutoCAD软件自然也不是为测绘行业量身定做的。但是传统的测绘成图软件,如广州开思、南方开思软件通过“堆砌”的方式将CAD原生要素,如文本、点、线等拼凑成地形要素的模样,从图面上来说,达到了表现地形的目的。这种成图方式在从手工制图向数字化成图转变过程中起到了不可替代的作用。然而在信息化测绘的今天,它的弊端就显现出来了,数据冗余、图形零散、编辑困难等。可以说,在这种成图方式中,过于注重图面表示,没有突出“信息”的作用。我们必须调整数据采集及成图方式以适应信息化测绘要求。AutoCAD的ObjectARX开发工具为我们提供了自定义实体技术,它可以帮助我们定制自己的地形图要素,极大地优化数据组织结构,提高数据应用效率。由于自定义实体可以用程序控制要素的外观显示,所以,就可以根据不同的用户信息动态表达出不同的外观图形,这更贴近信息化测绘的需要。

2 设计思想

下面结合实例来分析一下定制自定义实体的基本思路。

2.1 实例

我们自定义了一个符号对象MYSYMBOL,可以用来表现控制点,如图1所示。

图1 自定义符号类

2.2 设计

(1)通用性

设计的自定义对象,一般用来表示一大类要素,而不是某一个具体的要素。当然对于某些特殊的要素要定义专门的自定义对象。如图1所示的控制点对象,对象的名字为MYSYMBOL,之所以命名为Symbol,是因为我们想让这个对象能尽可能地表现所有点状要素,如高程点、独立符号等,如表1所示。

自定义对象的通用性 表1

表1中表现的符号并不是固定不变的,所用的符号样式也是与编码一一对应的。这种对应关系由外部配置文件进行管理。

(2)编码驱动

一般我们都是以编码来标识地物要素的,这一点没有任何疑义,但是传统成图软件是借用CAD内部对象的thickness属性来存储编码。为什么用它呢,因为它基本上是唯一可以在属性面板中修改而不影响二维平面图形显示的。但是thickness实际上是代表要素在三维空间中的厚度,如果我们把二维图形切换到三维坐标系下,就可以看到thickness带来的影响了,所以用它存储编码显然是不合适的。而对于块符号对象根本是没有thickness的,我们还需要通过符号名称把编码与地物联系起来,逻辑关系复杂化了。

所以我们在自定义对象时,我们为每个自定义对象都添加一项字符串类型的编码属性(Code),就可以做到编码与要素一一对应,而且字符串类型值不会产生类似Thickness的双精度损失问题。

(3)属性状态控制

在考虑自定义对象的通用性的同时,还要符合用户的实际应用。表现高程点时,在属性面板中就不应该显示“样式”属性,即对于不同的对象要显示不同的属性项,如图2所示。

图2 自定义对象属性状态控制

(4)开放性

自定义的对象与一般的AutoCAD对象工作原理是相同。为了提高由自定义对象数据的使用效率,应该为用户提供编辑接口,使得用户可以用程序批量处理数据。

如图1、图2所示,编码属性是禁用的,因为不允许用户随意修改它,但是用户可以通过程序修改编码。

3 程序实现

3.1 建立自定义实体的基本过程

一般创建自定义实体的过程为:

(1)创建DBX工程和ARX工程。DBX工程用来管理自定义实体类,负责自定义实体的读、写、显示等操作;ARX工程包含了程序入口点,在ARX命令函数中创建自定义实体对象实例,并可以在AutoCAD中加载运行。

(2)在“项目依赖项”中设置ARX工程依赖于DBX工程;

(3)如果想使自定义实体支持ActiveX自动化功能,还要为DBX工程添加ATL COM Wrapper对象;

(4)如果想在属性面板中显示自定义的属性,必须在自定义实体类中实现subGetClassID函数,然后在新生成的*_i.c头文件中复制CLSID并将其赋值给subGetClassID函数的参数*pClsid,如:

3.2 自定义实体工作流程

由DBX工程生成的自定义实体不能在AutoCAD环境中独立运行,需要由ARX应用程序创建实例对象并添加到CAD数据库中;而COM Wrapper对象对自定义对象进行二次封装,为用户提供编程接口。这样用户就可以很方便地访问自定义对象的属性和方法了。在CAD环境中,用户通过属性面板修改图形属性的操作,都是借助于COM Wrapper这个中间媒介来访问自定义对象的;而有些操作,如拖拽夹点、平移、缩放等,则是直接访问自定义对象,如图3所示。

图3 自定义对象工作流程

3.3 依据编码绘符号

我们在ini文件中存储每个要素的配置信息,如:

为自定义对象类添加TCHAR*类型的成员变量mCode,该变量用来标识要素编码;添加用于表示符号位置的 AcGePoint3d类型的成员变量 mCenter。在subWorldDraw函数中根据编码从ini文件中读取符号名称,如高程点的符号名称为SYM-DM-001,然后绘制符号:

其他成员变量根据图形表现的需要添加,本例中的成员变量还包括:

3.4 支持二次开发

理论上来讲,AutoCAD内部实体能够实现的功能,自定义实体都实现。例如,可以通过LISP/VBA等编程手段操作一般对象,那在自定义实体中如何实现呢?

(1)支持AutoLISP编程

我们经常使用entget函数查看修改对象的属性,如用语名(entget(car(entsel)))查看图1所示的控制点的数据表:

((-1.<图元名:7ed03d38>)(0."MYSYMBOL")(330.<图元名:7ed01cf8>)(5."7D7")(100."AcDbEntity")(67.0)(410."Model")(8."0")(62.1)(100."CMySymbol")(90 .1)(1 ."1110101000")(10 217.633 193.896 156.72)(11

219.597 193.931 156.72)(210 0.0 0.0 1.0)(2 ."张湾岭")(340.<图元名:7ed01c88>)(40.1.0)(90.1)(41.0.0)(42 .1.0)(211 1.0 0.0 0.0))

在数据表中,我们可以根据DXF组码进行过滤选择,如根据编码进行选择:

(ssget"x"(list(cons 1"1110101000")))

这样就可以在AutoLISP中建立选择集进行循环处理了。

要想在上述数据表中添加编码、点名等成员变量信息,我们需要在自定义实体类的dxfInFields、dxfOut-Fields函数中读取和写入成员变量。

(2)支持VisualLISP编程

当我们对自定义对象的属性和方法进行了COM封装后,就可以通过VisualLISP操作自定义对象了。当然在应用VisualLISP函数前要先用vlax-ename->vla-object函数将实体名转成对象。

3.5 自定义对象的COM封装

要实现对自定义对象的COM封装,需要以下几步:

(1)首先要建立一个ATL对象类,该类要继承几个接口对象:IOPMPropertyExpander、IOPMPropertyExtensionImpl、IAcadEntityDispatchImpl;

(2)在IDL文件中编辑接口属性和方法;

(3)在COM类中定义并实现接口属性;

(4)在属性映射表OPMPROP_MAP中添加自定义属性入口;

(5)要改变属性面板中文本框中的显示名称,需要在GetDisplayName(DISPID dispID,BSTR*pBstr)函数中对dispID的值为0x401的pBstr参数赋新值;

(6)属性面板中要改变每个分类的名称,需要在GetCategoryName函数中针对不同的PROPCAT参数值,修改BSTR参数的名称;

(7)在Editable函数中控制属性的可编辑性,在ShowProperty函数中控制属性是否可见。

3.6 定义动态属性

为了使自定义对象的属性表达更加灵活,我们为自定义对象定义了两类属性,一类是静态的,即前文提到的COM包装类中的属性,另一类是动态属性,用来存储与图形本身无关的属性,如图4中的“符号属性”所示。

图4 动态属性

COM包装类中的属性直接存储到对象自身数据表中,而动态属性我们存储在对象扩展字典的扩展记录中。这样在查询的时候,可以根据扩展记录的关键字直接得到。如图4所示,需要定义两种用于生成动态属性的类,一个是派生于IDynamicProperty接口的用于处理字符串数据类型的类;一个派生于IDynamicEnumProperty的用于处理枚举类型的类。在处理枚举类型动态属性数据时,需要注意的是,OPM仅处理VT_I4类型的数据,即LONG类型,所以在GetPropValueData(LONG index,VARIANT*pValue)函数中,pValue必须赋值为LONG类型,如存储当前ComboBox下拉列表的索引,或者存储对象的ID等。

4 结语

目前基于AutoCAD中的地形图成图软件,只有基于自定义实体技术才能最大限度地保证要素的完整性、优化数据组织方式。尽管软件开发的难度大、周期长,但是对于它的研究仍然具有重要的意义。

[1]宋延杭,王川,李永宣.ObjectARX实用指南[M].北京:人民邮电出版社,1999

[2]老大中,赵占强.AutoCAD 2000ARX二次开发实例精粹[M].北京:国防工业出版社,2001

[3]Charles McAuley.AutoCAD 2000ObjectARX编程指南[M].北京:机械工业出版社,2000

[4]张长勋.AutoCAD VisualLISP程序开发技术[M].北京:国防工业出版社,2005

[5]余承飞,方勇.AutoCAD 2000二次开发技术(Object-ARX)[M].北京:人民邮电出版社,1999

[6]Autodesk.ObjectARX开发指南.1999

猜你喜欢

实体测绘编码
基于SAR-SIFT和快速稀疏编码的合成孔径雷达图像配准
《全元诗》未编码疑难字考辨十五则
子带编码在图像压缩编码中的应用
前海自贸区:金融服务实体
浙江省第一测绘院
工程测绘中GNSS测绘技术的应用
Genome and healthcare
04 无人机测绘应用创新受青睐
实体的可感部分与实体——兼论亚里士多德分析实体的两种模式
两会进行时:紧扣实体经济“钉钉子”