2 利用Object ARX实现交互排版交互排版是本方法的重要组成部分,是否有强有力的交互排版工具将直接影响到横断面图的绘制效率.我们分析了实现交互排版的难点,认为它主要有两个问题要解决:横断面在图形中的重新定位和分页桩号记录的处理.现在AutoCAD提供了先进的ObjectARX技术,我们利用这项技术来解决这两个问题.2.1 横断面在图形中的重新定位在横断面图交互排版中,横断面的重新定位非常频繁,提供良好的定位手段非常必要.
交互排版是本方法的重要组成部分,是否有强有力的交互排版工具将直接影响到横断
面图的绘制效率.我们分析了实现交互排版的难点,认为它主要有两个问题要解决:横断
面在图形中的重新定位和分页桩号记录的处理.现在AutoCAD提供了先进的ObjectARX技
术,我们利用这项技术来解决这两个问题.
2.1 横断面在图形中的重新定位
在横断面图交互排版中,横断面的重新定位非常频繁,提供良好的定位手段非常必要.
原来横断面图中每个横断面都是由线段和文字等基本实体组成的,重新定位时要将需要移
动的每个实体都选到,操作起来非常麻烦,后来将每个横断面做成块,这样整体移动起来
比较方便,但对于想移动横断面中的一部分如标注表,就要将块炸开,重新回到基本实体
的状态.标注表是整个横断面的一部分,用户在使用过程中希望整个横断面移动时,标注
表要跟着移动;而移动标注表时,横断面的其他部分不动.利用AutoCAD中块的概念实现
上述功能非常困难.
我们利用Object ARX中自定义实体技术,定义了一个如下横断面图实体,其中包含了
两个位置控制点,分别控制横断面的位置和标注表的位置:
class CrossSectionDrawing:public AcDbEntity
{ …… doublem_Stake;//横断面桩号
AcGePoint3dPos_Center;//横断面的位置控制点
AcGePoint3dPos_Pane;//标注表的位置控制点
……
}
标注表的几何位置由控制点Pos_Pane来确定,横断面图实体中其他部分的几何位置由
控制点Pos_Center来确定,控制点Pos_Center和Pos_Pane的初始相对位置由路基宽度和
填挖情况来确定.
当用户使用鼠标选择实体时,getGripPoints()函数会返回实体中定义的抓取点,并在
屏幕上显示,我们重载getGripPoints()函数,将两个控制点加入到返回的抓取点列表中,
这样两个控制点就可作为抓取点显示在屏幕上.当用户将选中的抓取点进行拖动操作,
AutoCAD就调用moveGripPointsAt()函数,重新计算相应部分的几何位置,这样就实现了
重新定位.
使用过程中,用户只需选择要重新定位的横断面,拖动不同的抓取点就可以完成整个
横断面的重新定位和标注表的单独重新定位,使用起来非常方便.
2.2 分页桩号记录的处理
从前述的工作流程我们可以看到,分页桩号是整个横断面图绘制过程中的一个纽带,
它确定了横断面图每页起始桩号,在交互排版过程中由于要增加或减少横断面它不断地被
62 计算机辅助工程 2000
————————————————————————————————————————————
修改.如果分页桩号是通过人工管理的,在横断面图绘制过程中用户必须花较多的精力来
关注分页桩号的变化情况,这样不利于提高效率,而且容易出错.所以分页桩号必须由系
统自动管理,让用户的精力集中于具体的排版工作.
在绘制横断面图对话框中我们设置了一个变量记录分页桩号,在当前横断面图中添加
横断面时,命令由绘制横断面图对话框发出,记录分页桩号的变量可以直接修改;但当删
除横断面时,命令由AutoCAD发出,这时需要修改记录分页桩号的变量,用以往方式处理
非常困难.
在Object ARX中提供了对通告——反应器机制的支持.当AutoCAD系统中的一个事件
发生时,某些对象(我们称为通告者notifiers)就自动地将该事件传递到其它对象.例如:
当用户拷贝,删除或修改一个对象时,每个事件的相应的通告就会自动触发.接收事件的
AutoCAD对象就是反应器.反应器在它能够从通告者那里接受事件之前,必须明确地添加到
该通告者的反应器列表中.
我们以数据库反应器类为基类定义了新的反应器类,并重载了在数据库对象上接受
erased()通告的函数:
class DbModReactor : public AcDbDatabaseReactor
{
public:
virtual void objectErased(const AcDbDatabase* dwg,const AcDbObject*
dbObj,Adesk::Boolean pErased = Adesk::kTrue);
};
当用户利用AutoCAD 命令删除实体时,objectErased()函数被触发,它先获取删除对
象的类名,如果是CrossSectionDrawing类,再获取被删除横断面的桩号,随后修改绘制
横断面图对话框中记录分页桩号的变量,这样就实现了分页桩号的自动管理.
在应用中必须先产生绘制横断面图对话框,再产生一个DbModReactor对象,并通过
addReactor()函数将其加入到当前图形数据库的反应器列表中,这样通告——反应器机制
才能实现.
利用Object ARX技术使横断面的交互排版灵活方便,提高了横断面图的绘制效率.
3 结 论
本文根据人机一体的思想,在横断面图绘制过程中采用自动绘图和交互排版相结合的
新方法,使横断面图的绘制效率得到很大的提高.利用先进的ObjectARX技术在AutoCAD
环境中实现了提出的新方法.
No.3 一种实现横断面图绘制的新方法 63
————————————————————————————————————————————
参 考 文 献
12
张国峰.C++语言及其程序设计教程.电子工业出版社
Autodesk Inc . ObjectARX Reference Manual.
A New Method of Drawing Cross Section
Zhuang Jiafeng
(No.2 Highway Mapping and Design Institute,Wuhan,430052)
ABSTRACT The problem of Drawing Cross Section in road CAD is discussed in this
paper. Using ObjectARX programming technology implements Cross Section’s
Automatic Drawing and Interactive typesetting. This method improves efficiency of
Drawing Cross Section.