基本术语
1.属性
例如: 图元有属性,如线图元可以有这样的类型 —— 线段、直线、点划线;线还有一个线宽属性 —— 粗的、细的;文本图元有一个字型属性如 Helvetica。所有的图元都有一个色彩属性。
2.属性映像
程序中要使用的图元属性均保存在映像器里。一个映像就是一个由标记和属性组成的数组。
3.驱动器:驱动器是为绘制视图做准备的。驱动器或与一个窗口或与一个绘图仪文件有关。使用的最终目的是为了视图的需要。
4.图形设备:默认下,图形设备会与当前的工作站联系,从而来监控屏幕和色彩映像的预定状态。
5.图形对象:用来管理一组图元。一个图形对象可以对图元进行编辑、添加或移除等操作。默认下,图形对象是空的、可以拖动的、可绘制的、可拾取的,它既不会被显示也不会被突出显示。
6.图元:图元是可拽的图形元件,它已经在模型空间中给予了定义。图元可以是线、文本,也可以是图像。对图元进行显示时图像和文本必须保持同样的尺寸。线除标记以外其他的属性都可以被修改。图元一定要保存在图形对象中。
7.模型空间:整个 2D 空间就是模型空间的一部分,它由一个初始中心点和一个尺寸来定义。
8.更新:这是个搜索视图中显示列表的过程,目的是查找每一个可视的图形对象,更新是在视图映射中实现的。然而,对于每一个图形对象的更新过程是需要请求每个图形对象自身的绘制方法来实现。同时每个图形对象又需调用其图元的绘制方法。
9.视图:视图是由一组排列在显示列表中的图形对象构成。但它能够为拾取和绘制图形对象时提供方法。
10.视图映射:是从模型空间的中心和尺寸范围内定义的一个平方区域,其目的是用来选择要被显示的图元。
11.工作空间:窗口驱动的工作场所就是窗口的工作空间。对于一个绘图仪驱动,它的工作空间就是图纸的页面尺寸。
创建二维图形显示流程
要创建一个 2D 图形对象并将它们显示到屏幕上,具体步骤:
1、创建标记映像
2、创建属性映像
3、定义连接图形设备
4、创建一个窗口
5、创建窗口驱动
6、安装映像
7、创建一个视图
8、创建视图映射
9、创建一个或更多与视图有关的图形对象
10、创建与图形对象有关的图元
11、获取驱动的工作空间
12、更新在驱动中的视图
A.创建标记映像
标记映像定义了一组可以在程序中使用的标记(图标)。
B.创建属性映像
映像是为了实现色彩、线型、线宽以及文本字型而创建的,同时映像又是用来引用已给定一个整值的属性才定义的。Aspect_GenericColorMap、Aspect_TypeMap、Aspect_WidthMap、Aspect_FontMap
C. 创建 2D 驱动
在 Windows 平台下创建 2D 视图的实现示例如下:
Handle(WNT_GraphicDevice) TheGraphicDevice = ...;
TCollection_ExtendedString aName(“2DV”);
my2DViewer = new V2d_Viewer(TheGraphicDevice,aName.ToExtString());
D.安装映像
当 2D 视图已经被创建时可以提早对映像进行安装。例:
my2DViewer->SetColorMap(colormap);
my2DViewer->SetTypeMap(typmap);
my2DViewer->SetWidthMap(widthmap);
my2DViewer->SetFontMap(fntmap)
E.创建视图
在 Windows 下创建视图示例如下:
Handle(WNT_Window) aWNTWindow;
aWNTWindow = new WNT_Window(TheGraphicDevice, GetSafeHwnd());
aWNTWindow->SetBackground(Quantity_NOC_MATRAGRAY);
Handle(WNT_WDriver) aDriver = new WNT_WDriver(aWNT_Window);
myV2dView = new V2d_View(aDriver, my2dViewer, 0,0,50)
F.创建可显示的对象
Void myPresentableObject::Compute (
const Handle(Prs_Mgr_PresentationManager2D)&aPresentationManager,
const Handle(Graphic2d_GraphicObject)& aGrObj,
const Standard_Integer aMode)
{
...
}
G.创建图元
使用 Graphic2d 包的资源来创建图元。创建一个数组的示例,目的是用不同的线宽和色彩来填充三个有不同半径的圆。
Handle(Graphic2d_Circle) tcircle[4];
Quantity_Length radius;
for (i=1; i<=4; i++)
{
radius = Quantity_Length (i);
tcircle[i-1] = new Graphic2d_Circle (aGrObj, 4.0, 1.0, radius);
tcircle[i-1]->SetColorIndex (i);
tcircle[i-1]->SetWidthIndex (1);
}
添加一个填充好的矩形到图形对象中,它会从视图映像的外部添加进去。
TColStd_Array1OfReal aListX (1, 5);
TColStd_Array1OfReal aListY (1, 5);
aListX (1) = -7.0; aListY (1) = -1.0;
aListX (2) = -7.0; aListY (2) = 1.0;
aListX (3) = -5.0; aListY (3) = 1.0;
aListX (4) = -5.0; aListY (4) = -1.0;
aListX (5) = -7.0; aListY (5) = -1.0;
Handle(Graphic2d_Polyline) rectangle =new Graphic2d_Polyline (go, 0., 0., aListX, aListY);
rectangle->SetColorIndex (6);
rectangle->SetWidthIndex (1);
rectangle->SetTypeOfPolygonFilling(Graphic2d_TOPF_FILLED);
rectangle->SetDrawEdge(Standard_True);
图像处理
示例代码:
Handle(Image_Image) anImage;
if (XwdImage || RgbImage)
{
anImage =AlienUser->ToImage ();
Handle(Graphic2d_Image) gImage = new Graphic2d_Image
(aGrObj, anImage, 0., 0., 0., 0.,Aspect_CP_CENTER);
}
//Graphic2d_ImageFile
OSD_Path aPath (“C:\test.xwd”);
OSD_File aFile (aPath);
Handle(Graphic2d_ImageFile)gImageFile=new
Graphic2d_ImageFile (aGrObj,aFile,0.,0.,0.,0.,
Aspect_CP_Center, 1);
gImageFile->SetZoomable(Standard_True);
文本处理
Graphic2d_Text 的构造器会从模型空间获得一个参考点和一个角度来作为一个依据,当然它也会指派给图形对象。需要注意的是除非要使用角度文本,否则角度是要被忽略的。例如:
TCollection_ExtendedString str1 (”yellow Courier-bold”);
TCollection_ExtendedString str2 (”red Helevetica-bold”);
TCollection_ExtendedString str3 (”green Aspect_TOF_DEFAULT”);
Handle(Graphic2d_Text) t1 = new Graphic2d_Text(aGrObj, str1, 0.3, 0.3, 0.0);
Handle(Graphic2d_Text) t2 = new Graphic2d_Text(aGrObj, str2, 0.0, 0.0, 0.0);
Handle(Graphic2d_Text) t3 = new Graphic2d_Text(aGrObj, str3, -0.3, -0.3, 0.0);
t1->SetFontIndex (1); t1->SetColorIndex (1);
t2->SetFontIndex (2); t2->SetColorIndex (2);
t3->SetFontIndex (3); t3->SetColorIndex (3);
标记处理
标记是一种图元,当视图被缩放时需要保持它的原始尺寸。标记是可以使用的,例如作为对尺寸的参考时。
1.向量标记
每个标记取得一个 XY 坐标点作为它的参考点。构造器也会从 XY 坐标中取得一对坐标作为这些参考点的偏移量。例如:
TColStd_Array1OfReal rListX (1, 5);
TColStd_Array1OfReal rListY (1, 5);
rListX (1) = -0.3; rListY (1) = -0.3;
rListX (2) = -0.3; rListY (2) = 0.3;
rListX (3) = 0.3; rListY (3) = 0.3;
rListX (4) = 0.3; rListY (4) = -0.3;
rListX (5) = -0.3; rListY (5) = -0.3;
Handle(Graphic2d_Polyline) rp =new Graphic2d_Polyline (aGrObj, rListX, rListY);
2.索引标记
一旦标记映像被创建,索引标记就会被添加到一个图形对象上了。例:
Handle (Graphic2d_Marker) xmkr = new Graphic2d_Marker
(aGrObj, 1, 0.04, 0.03, 0.0, 0.0, 0.0);
Handle (Graphic2d_Marker) plusmkr = new Graphic2d_Marker
(aGrObj, 2, 0.04, 0.0, 0.0, 0.0, 0.0);
Handle (Graphic2d_Marker) oplusmkr = new Graphic2d_Marker
(aGrObj, 3, 0.04, -0.03, 0.0, 0.0, 0.0);
使用缓冲器进行绘制
缓冲器的用途就是在不删除背景环境的情况下快速绘制场景的一部分区域。缓冲器包含一组要被移动的、旋转的或在视图的前向平面内绘制场景所需的图形对象或图元。例如:在视图中绘制一个非常复杂的场景。创建一个有图元色彩index 10 和字型 index 4 的图元缓冲器:
buffer = new Graphic2d_Buffer (view, 0., 0., 10, 4);
//添加图形对象或图元
buffer->Add (go);
buffer->Add (tcircle[1]);
buffer->Add (t1);
//在视图中加速缓冲器
buffer->Post ();
//在上面的视图中移动、旋转或测量缓冲器
buffer->Move (x,y); buffer->Rotate (alpha);
buffer->Scale (zoom_factor);
//在视图中不加速缓冲器
buffer->Unpost ();