您现在的位置是:首页 > 测绘学会 > 学术交流
 

2007年版图式中点类元素表现方法的研究

 

2007年版图式中点类元素表现方法的研究

  1,谢  2

1无锡市测绘院有限责任公司,江苏 无锡 2140312江苏省测绘工程院,江苏 南京 210013

    2007830,中华人民共和国国家质量监督检验检疫总局、中国国家标准化管理委员会发布了《国家基本比例尺地图图式第一部分:1:500 1:1000 1:2000地形图图式》。为了适应数字测绘生产的需要,笔者进行了1:500 1:1000 1:2000图式点类符号的制作(基于AUTOCAD)。本文简要介绍了在AUTOCAD中运用ObjectARX制作点类符号的方法。

关键词  ObjectARX;面向对象程序设计;地形图图式

中图分类号:                       文献标识码:                             文章编号:

 

1 前言

地形图图式是地图符号样式和描绘规则的规范。为了统一国家制图标准,保证地图质量,由国家测绘业务主管部门根据地图的用处、比例尺、地图要素的特点以及印制的可能性等统一制定。现行国家标准和测绘行业标准的1:500 1:1000 1:2000地形图图式是:GB/T7929-19951:500 1:1000 1:2000地形图图式》, 这些图式标准已实施多年,它们在我国测绘生产中起到了重要的作用。为了适应现今数字测绘生产的需要,解决地形图系列自身不协调以及与其他相关标准不协调的问题,建立新的地形图数据生产与建库标准体系,国家测绘局对地形图图式进行了修订并调整了地形图图式系列的结构。新发布的GB/T 20257.1-2007《国家基本比例尺地图图式的第1部分:1:500 1:1000 1:2000地形图图式》(以下简称2007年版图式)已于2007830发布。2007年版图式中规定了相应比例尺地形图上表示各种地物、地貌要素的符号、注记和颜色标准,以及使用这些符号的原则、要求和基本方法。

2研究目的

2.1建立自定义点类图元模型

根据2007年版图式技术标准,建立点类图元信息模型。在此模型的基础上参照GIS数据要求选择数据存储的内容和方式,探索CAD操作和GIS整理得完美结合。

2.2采用OOP技术进行AutoCAD的二次开发

由于AutoCAD的广泛普及,其DWG文件已成为事实上的工业标准。我们面对的许多用户要求提供AutoCAD平台的地形图信息系统。所以,此项目的第二个目的是研究AutoCAD的二次开发的技术和手段,采用OOP技术,即面向对象程序设计技术,拓展AutoCAD的功能使之适应2007年版图式的需要。

3本论文的主要内容

本论文主要讨论了采用面向对象程序设计技术进行AutoCAD的二次开发的技术和手段,完成了点类图元的设计和实现。首先,介绍了AutoCAD的各种二次开发的技术,主要讨论基于ObjectARXOOP技术;然后,介绍了使用ObjectARX进行AutoCAD的二次开发的工具和开发环境及配置;最后,重点说明点类图元的设计和实现。

4 AutoCAD的二次开发技术

第一大类是AutoLISPAutoLISP是一种解释性的语言。使用AutoLISP进行开发,方便快捷,能迅速的学习掌握,投入使用,但缓慢的运行速度和有限的功能是AutoLISP的******问题。基本上,AutoLISP适用于把现有命令组合成一个新命令来使用。后来又推出了VisualLISP开发工具,其本质上与AutoLISP相同,只是使开发过程更容易,更易于理解。

第二大类是使用ActiveXCOM技术。ACAD使用COM技术把数据传送给ActiveX程序。程序处理后再传回ACAD。这个过程有点像浏览器浏览网站的过程。这种方法在编写上比Lisp复杂,但速度更快,功能更强劲。但是在某些对速度要求相当高的运算和涉及CAD内部的应用上会显得力不从心。

第三大类是ADS开发。ADS(AutoCAD Development System)是针对使用C语言的开发者的。对于AutoCAD来说,ADS程序和AutoLISP程序没有什么区别。一个ADS程序实际上是由一组外部函数组成,它们由AutoLISP解释器来加载调用,ADS程序本身并不能直接和AutoCAD进行通讯,目前AutoDesk已经停止了对使用CADS的支持。

第四大类是使用C++ObjectARX开发。ObjectARX中的ARX表示AutoCAD运行时扩展(AutoCAD Runtime eXtension),它提供了以C++为基础的面向对象的开发环境及应用程序接口。使用这种方式,所开发出的ARX程序实质上是一个动态链接库(DLL),它和AutoCAD共享地址空间并且直接和AutoCAD进行通讯。对于经常需要和AutoCAD通讯的应用程序来说,ARX程序运行最块。除了速度上的提高之外,ARX程序还可以创建新的类(Class),这些类可以为其它程序共享,从而充分利用面向对象编程的优点。ARX程序创建的实体几乎和AutuCAD的内在实体是完全等同的。当然,强大功能是有代价的,由于和AutoCAD共享地址空间并且直接和AutoCAD进行通讯,一旦ARX程序由于错误而崩溃,CAD也会同时崩溃。这对ObjectArx开发提出了更高的要求,需要更缜密的逻辑思维。

5开发环境及配置

操作系统:Microsoft Windows 2000,Windows Me,Windows XP

编译系统:Microsoft Visual Studio 2005

CAD版本:AutoCAD 2007ObjectARX 2007 Add-Ins

硬件需求:Pentium4 1Ghz或以上

6点类图元的设计与实现

AcDbEntity类是所有具有图形表现的数据库对象的基类。AcDbCurve类(曲线类)是ObjectARX提供给用户的可以从其继承的一个类。它是诸如AcDbArc,AcDbCircle,AcDbEllipse,AcDbSpline等所有实体类的基类。此基类提供了如下的一些功能:判断点与曲线的关系,找到曲线的偏移曲线,找到曲线在某一个平面上的投影曲线等等。

创建自定义点类图元包括以下步骤(见图1):

1)从AcDbEntity派生一个自定义基类MdsBaseEntityDbMdsBaseEntityDb主要描述了所有点、线、面图元的一些共性,如代码、比例等;

2)从MdsBaseEntityDb派生一个点基类MdsBasePointDb、线基类MdsBaseLineDb、面基类MdsBaseFaceDbMdsBasePointDb主要描述了所有点类元素的一些共性,如点位、方向等;

3)从MdsBasePointDb派生一个自定义实体类图元MdsCtrlPointDb(控制点)、MdsOnePointDb(单点)等,MdsCtrlPointDb是个控制点实体点类,主要描述了控制点的点名、点号、等级、年份等,MdsOnePointDb主要符号描述,根据代码可以绘出不同的符号;

4)重载要求的AcDbEntity虚函数及派生基类虚函数;

5)重载支持自定义功能的其他函数;

6)如果要为自定义实体创建托拽序列,执行自定义的AcEdJig

图一:图元结构

下面为头文件"MdsBaseEntityDb.h"部分内容:

//////////////////MdsBaseEntityDb.h /////////////////////////////

class DLLIMPEXP MdsBaseEntity : public AcDbEntity /* AcDbCurve */ {

public:

     ACRX_DECLARE_MEMBERS(MdsBaseEntity) ;

public:

     MdsBaseEntity () ;

     virtual ~MdsBaseEntity () ;

//////////////////需要重载的函数/////////////////////////////////

     virtual Acad::ErrorStatus  set(MdsBaseEntity* p) ;

     virtual Acad::ErrorStatus dwgOutFields (AcDbDwgFiler *pFiler) const ;

     virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler *pFiler) ;

     virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);

     virtual Acad::ErrorStatus getOsnapPoints (

         AcDb::OsnapMode osnapMode,……) const ;

     virtual Acad::ErrorStatus getGripPoints (AcGePoint3dArray &gripPoints, ……) const ;

     virtual Acad::ErrorStatus moveGripPointsAt (const AcDbIntArray &indices, const AcGeVector3d &offset) ;

     virtual Acad::ErrorStatus getClassID(CLSID* pClsid) const;

//////////////////自定义类的特性数据///////////////////////////////

     static Adesk::UInt32 kbCurrentVersionNumber ;

     AcGeVector3d           m_normal;

     AcGeVector3d           m_direction;

     long                   m_coding;

     double                 m_blc;

     bool                   m_isdisplay;

     ACHAR*                 m_note;

     ACHAR*                 m_name;

     ACHAR*                 m_date;

……

//////////////////自定义类的函数///////////////////////////////////

public:

     long               get_coding() const;

     Acad::ErrorStatus  set_coding(const  long p);

     double             get_blc() const;

     virtual Acad::ErrorStatus  set_blc(const double p);

     bool               get_isdisplay() const;

     Acad::ErrorStatus  set_isdisplay(const bool p) ;

……

} ;

下面为头文件" MdsBasePointDb.h"部分内容:

//////////////////MdsBasePointDb.h /////////////////////////////

class DLLIMPEXP MdsBasePoint : public MdsBaseEntity {

public:

     ACRX_DECLARE_MEMBERS(MdsBasePoint) ;

public:

     MdsBasePoint () ;

     virtual ~MdsBasePoint () ;

//////////////////需要重载的函数/////////////////////////////////

     virtual Acad::ErrorStatus  set(MdsBasePoint* p) ;

     virtual Acad::ErrorStatus dwgOutFields (AcDbDwgFiler *pFiler) const ;

     virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler *pFiler) ;

     virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);

     virtual Acad::ErrorStatus getOsnapPoints (AcDb::OsnapMode osnapMode,……) const ;  

     virtual Acad::ErrorStatus getGripPoints (AcGePoint3dArray &gripPoints, ……) const ;

……

//////////////////自定义类的特性数据///////////////////////////////

     AcGePoint3d            m_refpoint;

     double                 m_bigao;

//////////////////自定义类的函数///////////////////////////////////

public:

     AcGePoint3d        get_refpoint() const ;

     Acad::ErrorStatus  set_refpoint(const AcGePoint3d& p);

……

} ;

下面为头文件" MdsCtrlPoint Db.h"部分内容:

//////////////////MdsCtrlPoint Db.h /////////////////////////////

class DLLIMPEXP MdsCtrlPoint : public MdsBasePoint {

public:

     ACRX_DECLARE_MEMBERS(MdsCtrlPoint) ;

protected:

     static Adesk::UInt32 kCurrentVersionNumber ;

public:

     MdsCtrlPoint () ;

     virtual ~MdsCtrlPoint () ;

//////////////////需要重载的函数/////////////////////////////////

     virtual Acad::ErrorStatus  set(MdsCtrlPoint* p) ;

     virtual Acad::ErrorStatus dwgOutFields (AcDbDwgFiler *pFiler) const ;

     virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler *pFiler) ;

     virtual Adesk::Boolean worldDraw (AcGiWorldDraw *mode) ;

     virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);

……

//////////////////自定义类的函数///////////////////////////////////

public:

    AcGePoint3d        get_txtpoint() const ;

    Acad::ErrorStatus  set_txtpoint(const AcGePoint3d& p);

    const ACHAR*      get_cptname() const;

    Acad::ErrorStatus  set_cptname(const ACHAR* p);

    const ACHAR*      get_cptgrade() const;

……

//////////////////自定义类的特性数据///////////////////////////////

private:

     AcGePoint3d            m_txtpoint;

     ACHAR*                 m_cptname;

     static CLSID  s_clsid;

……

private:

//////////////////////////////画控制点/////////////////////////////

     Adesk::Boolean draw_pointfromcoding(AcGiWorldDraw *mode);

     Adesk::Boolean draw_text(AcGiWorldDraw *mode);

} ;

7结束语

点类图元的的实现,为GIS地理信息系统的建立打下坚实的基础,在使用过程中点类图元信息规范、使用操作方便话,提高了生产效率,具有很高的研究价值和实用价值。

 

Application Studying on the point elements in the 2007 cartographic symbols.

Chen Qi1Xie Fei2

1Wuxi Surceying &Mapping Institute Co.,Ltd.Wuxi Jangsu 214031

Surveying and Mapping Engineering Institute ofJiang Su Province, Nanjing Jiangsu 210013

AbstractIn August 30th of 2007, "Cartographic symbols for national fundamental scale mapsPart 1:Specifications for cartographic symbols 1:500 1:1000 & 1:2000 topographic maps" was published by the General Administration of Quality Supervision,Inspection and Quarantine of the People's Republic of China and the Standardization Administration of the People's Republic of China. For accommodating with the digital mapping, a set of  cartographic symbols of 1:500 1:1000 & 1:2000  were developed based on the software AUTOCAD by the author. In the article,some difference between the updated and the old cartographic symbols  and the method of developing them using the ObjectARX API of the AUTOCAD were described.

Key wordsObjectARX; OOP; Cartographic symbols;



用户名:
密 码:
1 0510-82852987 61234612346123461234612346123461234612346123461234