您的位置:首页 > 其它

p3d创建仪表的步骤

2017-09-04 14:08 239 查看
Sample Folders and Files

Description

SDKSample.vcproj 

Visual Studio project file. Select this to open up the whole project in Visual Studio.

\inc\gauges.h 

包含面板和仪表系统使用的变量、宏和其他结构。在构建仪表时,必须将该文件包含在内。 

\inc\gps_info.h 

用于GPS系统的头文件。

\C-Gauge Samples\makefile 

用于从命令行构建示例代码。

\C-Gauge Samples\SDK.h

\C-Gauge Samples\SDK.rc
 

定义度量常量、变量和样本测量代码所使用的资源。

\C-Gauge Samples\SDK.cpp 

项目的主要源文件。

\C-Gauge Samples\SDK.attitude.cpp 

包含姿态指示源,并提供一个sprite示例。

\C-Gauge Samples\SDK.control_surfaces.cpp 

包含控件表面的源代码,并提供一个滑块示例。

\C-Gauge Samples\SDK.fuel.cpp 

包含燃料表源,并提供一个例子。

\C-Gauge Samples\SDK.fuel_selector.cpp 

包含燃料选择器源并提供一个基于图标的示例。

\C-Gauge Samples\SDK.temperature.cpp 

包含温度显示源并提供一个字符串和图标示例。

\C-Gauge Samples\SDK.wiskey.cpp 

包含威士忌罗盘的来源,并提供一个移动的图像示例。

\C-Gauge Samples\SDK.FlightMap.cpp 

包含一个简单的gps标准,并提供了一个实现“owner draw”量表的示例。 

\C-Gauge Samples\res 

包含与样本测量器使用的资源位图。

\C-Gauge Samples\SDK.FlightInfo.xml

XML Gauge string.

 

 

示例的目标是创建一个名为sdk . gau的文件。这个文件供面板系统使用。这个是一个带有扩展的Windows
DLL并由面板系统加载的.gau

 

第一步:定义变量和资源

这个SDK提供的示例代码在三个文件中完成了这些关键定义:

 SDK.h

 SDK.cpp

 SDK.rc

 

 

SDK.h: 定义测量仪资源

其结构如下:

下面是一系列的# define指令,它们设置了版本信息以及c++预处理器中的一些常量

#define         VERSION_MAJOR           1

#define         VERSION_MINOR           0

#define         VERSION_BUILD           0

// magic to get the preprocessor to do what we want

#define     lita(arg) #arg

#define     xlita(arg) lita(arg)

#define     cat3(w,x,z) w##.##x##.##z##\000

#define     xcat3(w,x,z) cat3(w,x,z)

#define     VERSION_STRING xlita(xcat3 (VERSION_MAJOR,VERSION_MINOR,VERSION_BUILD))

#ifndef           VS_VERSION_INFO

#define           VS_VERSION_INFO         0x0001

#endif
下面的代码用于定义使用的资源(与态度指标样本有关(SDK.attitude.cpp))

 

// Attitude Bitmaps

//

#define           BMP_ATTITUDE_SMALL_BACKGROUND       0x1000

#define           BMP_ATTITUDE_SMALL_CARD1            0x1100

#define           BMP_ATTITUDE_SMALL_MASK1            0x1101

#define           BMP_ATTITUDE_SMALL_CARD2            0x1200

#define           BMP_ATTITUDE_SMALL_MASK2            0x1201
这些常数的实际的具体连接的.bmp文件发生在SDK.rc
中。

通过将十六进制值增加500,您可以识别低分辨率和高分辨率的位图。

#define BMP_1024_AIRSPEED_BACKGROUND        1000

#define BMP_1280_AIRSPEED_BACKGROUND        1500
示例SDK.h为样本表文件使用的所有位图资源定义了常量值。

 

 

 

SDK.rc: 将资源ID和位图文件关联在一起

注意其包含了#include "sdk.h"

下面是版本信息

BEGIN

    BLOCK "StringFileInfo"

    BEGIN

        BLOCK "040904b0"

        BEGIN

            VALUE "CompanyName", "Your Company\0"

            VALUE "FileDescription", "Gauge\0"

            VALUE "FileVersion", VERSION_STRING

            VALUE "LegalCopyright", "Your Copyright.\0"

            VALUE "ProductName", "Your Product\0"

            VALUE "ProductVersion", VERSION_STRING

        END

    END

    BLOCK "VarFileInfo"

    BEGIN

        VALUE "Translation", 0x409, 1200

    END

END
 

下面是SDK中定义的每个resource_id定义在(SDK.h
)与合适的相关.bmp文件相关连

// Attitude Bitmaps

//

BMP_ATTITUDE_SMALL_BACKGROUND BITMAP      DISCARDABLE       "res\\SDK.Attitude.bg.BMP"

BMP_ATTITUDE_SMALL_CARD1      BITMAP      DISCARDABLE       "res\\SDK.Attitude.card1.BMP"

BMP_ATTITUDE_SMALL_MASK1      BITMAP      DISCARDABLE       "res\\SDK.Attitude.mask1.BMP"

BMP_ATTITUDE_SMALL_CARD2      BITMAP      DISCARDABLE       "res\\SDK.Attitude.card2.BMP"

BMP_ATTITUDE_SMALL_MASK2      BITMAP      DISCARDABLE       "res\\SDK.Attitude.mask2.BMP"
 

 

 

 

SDK.cpp:命名和定位指示器,包含资源文件和输出指针

注意包含gauges.h和SDK.h头文件

然后进行各个模块的编写,各个模块的编写都有一定的规则,规则如下:

/////////////////////////////////////////////////////////////////////////////

// Attitude

/////////////////////////////////////////////////////////////////////////////

#define           GAUGE_NAME        "Attitude"

#define           GAUGEHDR_VAR_NAME gaugehdr_attitude

#define           GAUGE_W                 100

#include "SDK.Attitude.cpp"

/////////////////////////////////////////////////////////////////////////////

// Control Surfaces

/////////////////////////////////////////////////////////////////////////////

#define           GAUGE_NAME        "Control_Surfaces"

#define           GAUGEHDR_VAR_NAME gaugehdr_control_surfaces

#define           GAUGE_W                 100

#include "SDK.Control_Surfaces.cpp"

/////////////////////////////////////////////////////////////////////////////

// Fuel

/////////////////////////////////////////////////////////////////////////////

#define           GAUGE_NAME        "Fuel"

#define           GAUGEHDR_VAR_NAME gaugehdr_fuel

#define           GAUGE_W                 100

#include "SDK.Fuel.cpp"
 

其他仪表重复上面的代码,GAUGE_NAME为被指定为表名称的字符串,这个表名用在Panel.cfg
file under the [windowXX] 的部分,下面部分就是如何在Panel.cfg 里面定义表

gauge00=SDK!Attitude, 247, 58

gauge01=SDK!Control_Surfaces, 370, 160

gauge02=SDK!Fuel, 146, 57
GAUGEHDR_VAR_NAME被指定在Gauge Table 里面,Gauge Table 在下面介绍。

GAUGE_W被指定了一个值,用于度量标准的x轴设计单位的数量。

#include "SDK_xxx.cpp只是在编译中包含每个规格的特定规格代码文件。

/////////////////////////////////////////////////////////////////////////////

// Gauge table entries

/////////////////////////////////////////////////////////////////////////////

GAUGE_TABLE_BEGIN()

      GAUGE_TABLE_ENTRY(&gaugehdr_attitude)

      GAUGE_TABLE_ENTRY(&gaugehdr_control_surfaces)

      GAUGE_TABLE_ENTRY(&gaugehdr_fuel)

      GAUGE_TABLE_ENTRY(&gaugehdr_fuel_selector)

      GAUGE_TABLE_ENTRY(&gaugehdr_temperature)

      GAUGE_TABLE_ENTRY(&gaugehdr_wiskey)

      GAUGE_TABLE_ENTRY(&gaugehdr_flightmap)

GAUGE_TABLE_END()
因此表可以导出一个指针

 

 

第二步:设置仪表的头

在每个示例规范源文件的开头,您将看到类似这样的代码片段

 

//    Set up gauge header

char attitude_gauge_name[]    = GAUGE_NAME;

extern PELEMENT_HEADER        attitude_list;

extern MOUSERECT        attitude_mouse_rect[];
代码为gauge header使用的下列变量赋值

 

PELEMENT_HEADER:确定哪个度量宏构成了背景

MOUSERECT识别鼠标矩形

 

GAUGE_HEADER_FS700(GAUGE_W, attitude_gauge_name, &attitude_list, attitude_mouse_rect, 0, 0, 0, 0);
然后,代码填充了GAUGE_HEADER_FS700的值,它是仪表头的宏,仪表头是一个结构,它定义了面板系统用来控制仪表DLL的接口。必须导出仪表头,以向面板系统公开仪表接口,下面演示其在代码中的使用

GAUGE_HEADER_FS700(GAUGE_W, attitude_gauge_name, &attitude_list, attitude_mouse_rect, 0, 0, 0, 0);

这里是其宏的语法

#define GAUGE_HEADER_FS700(default_size_mm, gauge_name, element_list, pmouse_rect, pgauge_callback, user_data, parameters, usage)

其成员含义如下:

default_size_mm

在设计单元中,默认的X轴尺寸。这个值设置为SDK.cpp中的GAUGE_W

gauge_name

在SDK.cpp中定义的名称 

element_list

一个指向元素列表中的第一个绘图元素的指针 

pmouse_rect

指向鼠标矩形的指针

pgauge_callback

一个指向整个仪表的函数的指针。这将传递一个消息给系统。如果没有使用0。

user_data

一个32位的空间,你可以使用任何你想要的数据。如果没有使用0。

parameters

包含字符串的字段,一个指向该字符串的指针被放置在仪表头中,为了方便使用,在仪表毁掉函数中,如果不使用给0

usage 

不用,使用0

 

这个GAUGE_HEADER_FS700 创建了一个结构体GAUGEHDR 和一个变量gauge_header,面板系统使用gauge_header变量来初始化每个绘图元素。大多数面板API函数使用gauge_header作为一个参数传递你将经常使用这个变量

 

 

第三步:模拟系统失败

FAILURE_RECORD 失败记录

你将使用FAILURE_RECORD结构体 来定义系统,如果失败,则反映在一边上,结构体如下:

 

typedef     struct      FAILURE_RECORD

{

      FAILURE_KEY       key;

      FAILURE_ACTION    action;

      PVOID             reserved;

}

FAILURE_RECORD, *PFAILURE_RECORD, **PPFAILURE_RECORD;
 

下面演示了如何为燃油表构建该结构体:

 

FAILURE_RECORD    fuel_fail[] =

{

      {FAIL_SYSTEM_ELECTRICAL_PANELS,   FAIL_ACTION_ZERO},

      {FAIL_GAUGE_FUEL_INDICATORS,      FAIL_ACTION_FREEZE},

      {FAIL_NONE,                       FAIL_ACTION_NONE}

}

 {FAILURE_KEYFAILURE_ACTION

系统故障被列在FAILURE_KEY枚举中(定义在gauges.h[/u]中)

 

FAIL_NONE 

标志着失败记录的结束

OLD_FAIL_SYSTEM_

ELECTRICAL
 

过时的,禁止使用

FAIL_SYSTEM_ENGINE 

制定引擎系统故障

FAIL_SYSTEM_PITOT_STATIC 

Specifies a pitot-static system failure.

FAIL_SYSTEM_VACUUM 

Specifies a vacuum system failure.

FAIL_GAUGE_ADF 

Specifies an ADF gauge system failure.

FAIL_GAUGE_AIRSPEED 

Specifies an airspeed gauge system failure.

FAIL_GAUGE_ALTIMETER 

Specifies an altimeter gauge system failure.

FAIL_GAUGE_ATTITUDE 

Specifies an attitude gauge system failure.

FAIL_GAUGE_COMMUNICATIONS 

Specifies a COM1 communication gauge system failure.

FAIL_GAUGE_FUEL_INDICATORS 

Specifies a fuel indicators gauge system failure.

FAIL_GAUGE_GYRO_HEADING 

Specifies a gyro heading gauge system failure.

FAIL_GAUGE_MAGNETIC_COMPASS 

Specifies a magnetic compass gauge system failure.

FAIL_GAUGE_NAVIGATION_VOR1 

Specifies a navigation VOR1 gauge system failure.

FAIL_GAUGE_NAVIGATION_VOR2 

Specifies a navigation VOR2 gauge system failure.

FAIL_GAUGE_ TRANSPONDER 

Specifies a transponder gauge system failure.

FAIL_GAUGE_TURN_COORDINATOR 

Specifies a turn coordinator gauge system failure.

FAIL_GAUGE_VERTICAL_SPEED 

Specifies a vertical speed indicator gauge system failure.

FAIL_SYSTEM_ELECTRICAL_PANELS 

Specifies a failure of the electrical panel.

FAIL_SYSTEM_ELECTRICAL_AVIONICS 

Specifies a failure of the electrical avionics.

FAIL_GAUGE_COMMUNICATIONS_COM2 

Specifies a COM2 communication gauge system failure.

 

FAILURE_ACTION:可以使用定义的FAILURE_ACTION
枚举中的值,建立一个标准元素来响应失败记录中显示的一个或多个系统故障

FAIL_ACTION_NONE = 0

Takes no action. This type of failure record is typically used as the background static image for covering a gauge.

FAIL_ACTION_FREEZE

Freezes the gauge element at its last updated position. The element's MODULE_VAR variable(s) will not be updated.

(MODULE_VAR relates to the various gauge token variables accessible to the panel system from the simulation engine. See the section on
Token Variables for more information.)

FAIL_ACTION_ZERO

Sets the element MODULE_VAR variable(s) to 0.

FAIL_ACTION_NO_DRAW

Erases the element and doesn't draw it again.

 

第四步:Using the Gauge Macros使用仪表所定义的宏

在不同的样本测量器的源处移动一点,你会看到不同的宏被用来传递仪表和面板系统之间的参数。这些宏定义在Gauges.h

 

Sliders Example

要创建一个滑块使用MAKE_SLIDER宏
#define     MAKE_SLIDER(      NAME,                         \

                              RES_ID,                       \

                              NEXT_LIST,                    \

                              FAILURE,                      \

                              DRAW_FLAGS,                   \

                              ASI_FLAGS,                    \

                              POSITION_X, POSITION_Y,       \

                              SOURCE_VAR_X, CALLBACK_X, SCALE_X,  \

                              SOURCE_VAR_Y, CALLBACK_Y, SCALE_Y )
使用特定于滑块的信息填充结构,例如以下内容SDK.Control_Surfaces.cpp

MAKE_SLIDER

(

      cs_slider_trim,

      BMP_CS_SMALL_TRIM,

      NULL,

      0,

      IMAGE_USE_ERASE | IMAGE_USE_TRANSPARENCY,

      0,

      20,44,

      MODULE_VAR_NONE, NULL, 0,

      ELEVATOR_TRIM, NULL, -100

)
这个代码在 SDK.control_surfaces.cpp 中包含四个独立的MAKE_SLIDER宏,用于每个不同的滑块使用

 

PELEMENT_HEADER

PELEMENT_HEADER         cs_sliders_list[] =

{

      &cs_slider_trim.header,

      &cs_slider_ailerons.header,

      &cs_slider_elevator.header,

      &cs_slider_rudder.header,

      NULL

};

MAKE_SLIDER

(

       cs_slider_ailerons,

       BMP_CS_SMALL_AILERONS,

       NULL,

       0,

       IMAGE_USE_ERASE | IMAGE_USE_TRANSPARENCY,

       0,

       95, 6,        AILERON_DEFLECTION, NULL, 100,

       MODULE_VAR_NONE, NULL, 0

)

PELEMENT_HEADER            cs_sliders_list1[] =

{

       &cs_slider_ailerons.header,

       NULL

};    \\ END OF FIRST SLIDER MACRO

 

MAKE_SLIDER(

       cs_slider_elevator,

       BMP_CS_SMALL_ELEVATOR,

       &cs_sliders_list1,

       0,

       IMAGE_USE_ERASE | IMAGE_USE_TRANSPARENCY,

       0,

       98, 46,

       MODULE_VAR_NONE, NULL, 0,

       ELEVATOR_DEFLECTION, NULL, -70

)

PELEMENT_HEADER            cs_sliders_list2[] =

{

       &cs_slider_elevator.header,

       NULL

};    \\ END OF SECOND SLIDER MACRO

MAKE_SLIDER

(

       cs_slider_rudder,

       BMP_CS_SMALL_RUDDER,

       &cs_sliders_list2,

       0,

       IMAGE_USE_ERASE | IMAGE_USE_TRANSPARENCY,

       0,

       94, 83,

       RUDDER_DEFLECTION, NULL, 80,

       MODULE_VAR_NONE, NULL, 0

)

PELEMENT_HEADER            cs_sliders_list3[] =

{

       &cs_slider_rudder.header,

       NULL

};     \\ END OF THIRD SLIDER MACRO
 
 

第5步:Making the Background Image

设置背景图片

 

设置背景图片为仪表,使用MAKE_STATIC 宏,事例使用的背景图片是是Control_surfaces.cpp

 

 

一下是MAKE_STATIC 宏的定义:

 

#define     MAKE_STATIC(      NAME,                   \

                              RES_ID,                 \

                              NEXT_LIST,              \

                              FAILURE,                \

                              DRAW_FLAGS,             \

                              ASI_FLAGS,              \

                              POSITION_X, POSITION_Y )\
 

一下是Control_surfaces.cpp 使用宏的案例:

 

MAKE_STATIC

(

      cs_background,

      BMP_CS_SMALL_BACKGROUND,

      &cs_sliders_list,

      NULL,

      IMAGE_USE_TRANSPARENCY,

      0,

      0,0

)

PELEMENT_HEADER         cs_list     = &cs_background.header;
 

 

Step 6: Defining Mouse Rectangles

定义鼠标

 

 

Step 7: Compiling and Using Your Gauges

 

完成并且使用你的仪表。

 

 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息