WPF - XDL Tutorial

XDL PlanetView È°¿ë ù¹ø°

(piXoneer XDL Tutorial)

 

 

 

 

 

 NXPlanetView¸¦ È°¿ëÇÏ¿© ±¸ ±â¹Ý 2D µµ½Ã ȯ°æ¿¡¼­ ±â´ÉÈ°¿ë¹ýÀ» ÀÍÈ÷°í ¸¶¿ì½º À§Ä¡¿¡ µû¸¥ ÁÂÇ¥ µµ½Ã, ³ªÄ§¹Ý µµ½Ã, µµ½Ã ±â´ÉÀ» ±¸ÇöÇØ º¾´Ï´Ù.

 

 

2019. 04.

  

 

¸ñÂ÷

XDL PlanetView È°¿ë ù¹ø°... 1

1    »ç¿ëÇϱâ... 3

1.1    XDL ¿£Áø... 3

2    NXPlanetView¸¦ ÀÌ¿ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ ¸¸µé±â... 3

2.1    ±âº» ÇÁ·Î±×·¥ ÀÛ¼º... 3

2.2    ÇÁ·Î±×·¥ µðÀÚÀÎ... 6

2.3    ±â´É ¹× À̺¥Æ® Ãß°¡... 10

 

 

 

 

1     »ç¿ëÇϱâ

 

1.1    XDL ¿£Áø

¼³Ä¡ ÇÁ·Î±×·¥À¸·Î ¹èÆ÷µÇ´Â XDL ¿£ÁøÀº Visual Studio 2010 x86 Release ¹öÀüÀ¸·Î, Visual Studio 2010 ÀÌ»óÀÇ ¹öÀü¿¡¼­ »ç¿ë °¡´ÉÇÏ´Ù.

¾Æ·¡ÀÇ ¼³¸íÀº Visual Studio 2015À» ±âÁØÀ¸·Î ÇÏ°Ú´Ù.

2     NXPlanetView¸¦ ÀÌ¿ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ ¸¸µé±â

l  º» ¿¹Á¦ ÇÁ·Î±×·¥Àº NXPlanetView¿Í NXPlantLayer¸¦ ÀÌ¿ëÇÏ¿© Planet2D ¸ðµå »ó¿¡¼­ ±âº» »ç¿ë¹ýÀ» ÀÍÈ÷°í °£´ÜÇÑ µµ½Ã±â´ÉÀ» Ãß°¡ÇØ º¸µµ·Ï ÇÑ´Ù.

2.1    ±âº» ÇÁ·Î±×·¥ ÀÛ¼º

2.1.1     Visual Studio 2015À» ½ÇÇàÇÑ´Ù.

2.1.2     ¸Þ´º [ÆÄÀÏ]-[»õ·Î ¸¸µé±â]-[ÇÁ·ÎÁ§Æ®]¸¦ ¼±ÅÃÇÑ´Ù.

 

2.1.3     [»õ ÇÁ·ÎÁ§Æ®] ´ëÈ­»óÀÚ¿¡¼­ ¿ÞÂÊÀÇ ÅÛÇø´ â¿¡¼­ ¡°Visual C#¡±À» ¼±ÅÃÇÏ°í, ´ëÈ­»óÀÚ Áß°£ÀÇ ¸ñ·Ï¿¡¼­ ¡°WPF ÀÀ¿ë ÇÁ·Î±×·¥¡±À» ¼±ÅÃÇÑ´Ù

»ç¿ëÀÚ°¡ ¿øÇÏ´Â °æ·Î¸¦ ¼±ÅÃÇÑ ´ÙÀ½ ÇÁ·ÎÁ§Æ® À̸§À» ¡°XDL_PlanetView1¡± À¸·Î ÀÔ·ÂÇÏ°í [»õ ÇÁ·ÎÁ§Æ®] ´ëÈ­»óÀÚÀÇ ¡°È®ÀΡ± ¹öÆ°À» Ŭ¸¯ÇÑ´Ù. ÀÌ ¹®¼­¿¡¼­´Â ´ëÈ­»óÀÚ ¿À¸¥ÂÊ ¾Æ·¡¿¡ ÀÖ´Â ¡°¼Ö·ç¼Ç¿ë µð·ºÅ͸® ¸¸µé±â¡±´Â ¼±ÅÃÇÏÁö ¾Ê°Ú´Ù. ¡°È®ÀΡ± ¹öÆ°À» ´©¸£¸é ÇÁ·ÎÁ§Æ®°¡ ±âº»ÀûÀ¸·Î »ý¼ºµÇ°í, È­¸é¿¡ WindowÀ» µðÀÚÀÎÇÒ ¼ö ÀÖ´Â È­¸éÀÌ ¶á´Ù. ¸¸¾à ¾Æ·¡¿Í °°Àº Window âÀÌ »ý¼ºµÇÁö ¾ÊÀ¸¸é, [¼Ö·ç¼Ç Ž»ö±â] â¿¡¼­ MainWindow.xaml¡±¸¦ ¸¶¿ì½º ´õºíŬ¸¯À» ÇÏ¿© âÀ» ¿¬´Ù.

 

 

2.1.4     ¼Ö·ç¼Ç Ž»ö±âÀÇ ÇÁ·ÎÁ§Æ® ÇϺÎÀÇ [ÂüÁ¶]ÀÇ ¿À¸¥ÂÊ ¸¶¿ì½º Ŭ¸¯À» ÅëÇØ [ÂüÁ¶Ãß°¡]¸¦ ¼±ÅÃÇÑ´Ù.

 

 

2.1.5  [ã¾Æº¸±â]ÅÇÀ¸·Î À̵¿ÇÑ ÈÄ ¡°C:\Pixoneer\XDL1.2\bin\¡±°æ·Î·Î À̵¿ÇÑ´Ù. CtrlÅ°¸¦ ´©¸¥ ä ¡°NXDL.dll¡±, ¡°NXPlanet.dll¡±, ¡°NXDLgr.dll¡± À» ¼±ÅÃÇÑ ÈÄ ¡°È®ÀΡ±¹öÆ°À» ¼±ÅÃÇÑ´Ù.

2.1.6  ¼Ö·ç¼Ç Ž»ö±âÀÇ ÇÁ·ÎÁ§Æ® ÇϺÎÀÇ [ÂüÁ¶]Ç׿¡ NXDL, NXDLgr, NXPlanetÀÌ Ãß°¡µÇ¾úÀ½À» È®ÀÎÇÑ´Ù.

 

2.1.7 NXPlanet ÄÁÆ®·ÑÀ» È°¿ëÇϱâ À§ÇØ MainWindow.xaml â¿¡ namespace¸¦ ´ÙÀ½°ú °°ÀÌ Ãß°¡ÇÑ´Ù

 

 

2.2    ÇÁ·Î±×·¥ µðÀÚÀÎ

 

 

 

Number

Name

Control type

Content

Items

¨ç

checkBoxInverseMouseButton

CheckBox

InverseMouseButton

 

¨è

checkBoxInverseMouseWheel

CheckBox

InverseMouseWheel

 

¨é

checkBoxRotatable

CheckBox

Rotatable

 

¨ê

comboBoxGrid

ComboBox

 

None

Degrees

GARS

¨ë

comboBoxScale

ComboBox

 

1000000

500000

100000

50000

10000

¨ì

buttonScaleApply

Button

Apply

 

¨í

checkBoxShowPBP

CheckBox

Show PBP

 

¨î

checkBoxShowStar

CheckBox

Show Star

 

¨ï

checkBoxStatusInfo

CheckBox

Show StatusInfo

 

¨ð

nxPlanetView1

NXPlanetView

 

 

¨ñ

nxPlanetLayer1

NXPlanetLayer

 

 

 

2.2.1     MainWindow.xaml â¿¡¼­ ±âº»À¸·Î »ý¼ºµÈ Grid ·¹À̾ƿô¿¡ Grid.ColumnDefinitionÀ» ÀÌ¿ëÇÏ¿© ¼¼ °³ÀÇ ColumnÀ» »ý¼ºÇÑ´Ù. ù ¹ø° Column¿¡´Â À§ÀÇ Ç¥¸¦ Âü°íÇÏ¿© µðÀÚÀÎÇÏ´Â ÀÛ¾÷À» ÇÑ´Ù. (¨ç~¨ï). µÎ ¹ø° ColumnÀº GridSpiltter ÄÁÆ®·ÑÀ» Á¤ÀÇÇÏ°í ¼¼ ¹ø° ColumnÀº NXPlanetView ÄÁÆ®·Ñ°ú NXPlanetLayerÀ» ¹èÄ¡ÇÑ´Ù.

¸ÕÀú Grid¸¦ ¼¼ °³ÀÇ ColumnÀ¸·Î ³ª´«´Ù. ±× ´ÙÀ½À¸·Î ù ¹ø° Column¿¡ µµ±¸»óÀÚ¸¦ ÀÌ¿ëÇÏ¿© CheckBox¿Í Button ÄÁÆ®·Ñ µîÀ» ÀÌ¿ëÇØ µðÀÚÀÎÇÑ´Ù(Ç¥ Âü°í). ÀÚ¼¼ÇÑ XAMLÄÚµå´Â »ùÇÃÀ» Âü°íÇÑ´Ù.

 

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="210*"/>
            <ColumnDefinition Width="5"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
<Grid Grid.Column="0">

¡¦

 
</Grid>
</Grid>

 

2.2.2     µÎ ¹ø° Column¿¡ GridSplitterÀ» ¹èÄ¡ÇÏ¿© Á¿츦 ±¸ºÐÇÑ´Ù. ¾Æ·¡ÀÇ Äڵ带 Ãß°¡Çϰųª µµ±¸»óÀÚ¿¡¼­ GridSplitterÀ» ²ø¾î´Ù ¹èÄ¡ÇÑ´Ù.

 

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="210*"/>
            <ColumnDefinition Width="5"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
<Grid Grid.Column="0">


¡¦


</Grid>
<GridSplitter Grid.Column="1"/>

</Grid>

 

2.2.3     ¼¼ ¹ø° Cell¿¡ WindowsFormsHost ÄÁÆ®·ÑÀ» ¹èÄ¡ÇÑ´Ù. ÀÌ´Â Window forms¸¦ Hosting ÇØÁÖ´Â °³Ã¼À̸ç Window Forms ControlÀ» »ç¿ëÇÒ ¶§ ÀÌ¿ëµÈ´Ù. (WindowFormIntegration¿Í System.Window.Forms À» ¾î¼Àºí¸®¿¡ ´ëÇÑ ÂüÁ¶ Ãß°¡¸¦ ÇÑ´Ù.)

2.2.4     ¾Õ¼­ Ãß°¡ÇÑ namespaceÀÎ nxPlanetÀ» ÀÌ¿ëÇÏ¿© NXPlanetViewÄÁÆ®·ÑÀ» ºÒ·¯¿Â´Ù. ÀÌ NXPlanetViewÀÇ À̸§(Name)Àº nxPlanetView1À¸·Î ÇÑ´Ù.

 

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="210*"/>
            <ColumnDefinition Width="5"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
<Grid Grid.Column="0">


¡¦


</Grid>
<GridSplitter Grid.Column="1" Width="5" />

<WindowsFormsHost Grid.Column="2" Margin="3,0,0,3">
            <nxPlanet:NXPlanetView x:Name="nxPlanetView1">
           
            </nxPlanet:NXPlanetView>
 </WindowsFormsHost>
</Grid>

 

2.2.5     À̾ NXPlanetView ÄÁµå·Ñ À§¿¡ NXPlanetLayerÀ» ¿Ã·Á ³õ´Â´Ù. NXPlanetLayerÀÇ À̸§(Name)Àº nxPlanetLayer1À̶ó°í ÇÑ´Ù.

 

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="210*"/>
            <ColumnDefinition Width="5"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
<Grid Grid.Column="0">


¡¦


</Grid>
<GridSplitter Grid.Column="1" Width="5" />

<WindowsFormsHost Grid.Column="2" Margin="3,0,0,3">
            <nxPlanet:NXPlanetView x:Name="nxPlanetView1">
           <nxPlanet:NXPlanetView.Controls>
                    <nxPlanet:NXPlanetLayer x:Name="nxPlanetLayer1"/>
           </nxPlanet:NXPlanetView.Controls>
            </nxPlanet:NXPlanetView>
 </WindowsFormsHost>
</Grid>

 

NXPlanetView´Â ´Ù¾çÇÑ NXPlanetLayerXXXXXµéÀ» ´ãÀ» ¼ö ÀÖ´Â ÄÁÅ×À̳ÊÀÌ´Ù. Áï, NXPlanetView´Â ´Ù¾çÇÑ ·¹À̾ ±¸¼ºÇÏ¿© ±¸ ±â¹Ý ±â´ÉÀ» ´Ù¾çÇÏ°Ô ±¸ÇöÇÒ ¼ö ÀÖ´Ù. NXPlanetLayer´Â PlanetView¿¡ Ãß°¡µÇ¾î XDL ¿£Áø¿¡¼­ ¹ß»ýÇÏ´Â À̺¥Æ®¸¦ ¿ÜºÎ ¾îÇø®ÄÉÀ̼ǿ¡¼­ ó¸®ÇÒ ¼ö ÀÖ´Ù. µðÀÚÀÎÀÌ ¿Ï·áµÇ¸é ¾Æ·¡¿Í °°Àº âÀ» ¾òÀ» ¼ö ÀÖ´Ù.

 

 

2.2.6     ¼Ö·ç¼ÇÀ» ºôµåÇÏ°í ½ÇÇàÇÑ´Ù.

 

 

2.3    ±â´É ¹× À̺¥Æ® Ãß°¡

2.3.1     Window âÀ» ¼±ÅÃÇÏ°í [¼Ó¼º] â - [À̺¥Æ® ] ¸Þ´º¸¦ ¼±ÅÃÇÑ µÚ ¡°Loaded¡± À̺¥Æ®¸¦ ´õºí Ŭ¸¯ÇÑ´Ù.

 

 

¡°Loaded¡± À̺¥Æ®¸¦ ´õºí Ŭ¸¯Çϸé, ¡°Window_Loaded¡± ÇÔ¼ö°¡ ÀÚµ¿ÀûÀ¸·Î Ãß°¡µÇ°í ¾Æ·¡¿Í °°ÀÌ Ãß°¡ÀûÀÎ ±â´ÉÀ» ±¸ÇöÇÒ ¼ö ÀÖµµ·Ï MainWindow.xaml.csÀ¸·Î À̵¿ÇÏ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¾Æ·¡¿Í °°ÀÌ Äڵ带 Ãß°¡ÇÑ´Ù.

using Pixoneer.NXDL;
using Pixoneer.NXDL.NGR;
using Pixoneer.NXDL.NXPlanet;

namespace XDL_PlanetView1
{

public partial class MainWindow : Window
   {
public MainWindow()
       {
            InitializeComponent();
            nxPlanetView1.BackColor = System.Drawing.Color.Black;
}

       private void Form1_Load(object sender, EventArgs e)
       {
         // Camera À§Ä¡ ¼³Á¤
         XGeoPoint gpEye = XGeoPoint.FromDegree(127.4, 38.0, 1500000);
         nxPlanetView1.SetCameraPosition(gpEye, XAngle.FromDegree(0.0));

         // ÄÁÆ®·ÑÀÇ Ãʱ⠼³Á¤
         checkBoxInverseMouseButton.Checked = nxPlanetView1.InverseMouseButton;
         checkBoxInverseMouseWheel.Checked = nxPlanetView1.InverseMouseWheel;
         checkBoxRotatable.Checked = nxPlanetView1.Rotatable;

         checkBoxShowPBP.Checked = nxPlanetView1.ShowPBP;
         checkBoxShowStar.Checked = true;
         checkBoxShowStatusInfo.Checked = nxPlanetView1.ShowStatusInfo;

         if (nxPlanetView1.GridType == NXPlanetView.eGridType.GridNone)
             comboBoxGrid.SelectedIndex = 0;
         else if (nxPlanetView1.GridType == NXPlanetView.eGridType.GridDegrees)
             comboBoxGrid.SelectedIndex = 1;
         else if (nxPlanetView1.GridType == NXPlanetView.eGridType.GridGARS)
             comboBoxGrid.SelectedIndex = 2;
         else
             comboBoxGrid.SelectedIndex = 0;

        // È­¸é °»½Å ¿äû
         nxPlanetView1.RefreshScreen();
       }
   }
}

2.3.2     ¨ç~¨ï ÄÁÆ®·ÑÀ» °¢°¢ µðÀÚÀθðµå¿¡¼­ ¼±ÅÃÇÑ ÈÄ ´õºí Ŭ¸¯ÇÑ´Ù.

ÄÁÆ®·Ñ¿¡¼­ ¸¶¿ì½º·Î ´õºí Ŭ¸¯ÇÏ¸é ´ëÇ¥ÀûÀÎ À̺¥Æ®¿¡ ´ëÇØ ÀÚµ¿ÀûÀ¸·Î ÇÔ¼ö°¡ Ãß°¡µÈ´Ù. ¾Æ·¡¿Í °°ÀÌ Äڵ带 MainWindow.xaml.cs¿¡ Ãß°¡ÇÑ´Ù.

private void checkBoxInverseMouseButton_Checked(object sender, RoutedEventArgs e)
{
     // PlanetView´Â ±âº»ÀûÀ¸·Î ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°Àº È­¸é À̵¿À», ¿À¸¥ÂÊ ¹öÆ°Àº 
// È­¸éȸÀü ±â´ÉÀ» ´ã´çÇÑ´Ù.
     // ÀÌ ±â´ÉÀ» ÀüȯÇÏ·Á¸é NXPlanetViewÀÇ InverseMouseButtonÀ» true·Î 
// ¼³Á¤ÇÏ¸é µÈ´Ù.
      nxPlanetView1.InverseMouseButton = true;
}
        
private void checkBoxInverseMouseButton_UnChecked(object sender, RoutedEventArgs e)
{
     // PlanetView´Â ±âº»ÀûÀ¸·Î ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°Àº È­¸é À̵¿À», ¿À¸¥ÂÊ ¹öÆ°Àº 
// È­¸éȸÀü ±â´ÉÀ» ´ã´çÇÑ´Ù.
     // ÀÌ ±â´ÉÀ» Àüȯ ÈÄ ÇØÁ¦ÇÏ·Á¸é NXPlanetViewÀÇ InverseMouseButtonÀ» 
// false·Î ¼³Á¤ÇÏ¸é µÈ´Ù.                     
      nxPlanetView1.InverseMouseButton = false;
}

private void checkBoxInverseMouseWheel_Checked(object sender, RoutedEventArgs e)
{
     // PlanetView´Â ±âº»ÀûÀ¸·Î ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°Àº È­¸é À̵¿À», ¿À¸¥ÂÊ ¹öÆ°Àº 
// È­¸éȸÀü ±â´ÉÀ» ´ã´çÇÑ´Ù.
     // ÀÌ ±â´ÉÀ» ÀüȯÇÏ·Á¸é NXPlanetViewÀÇ InverseMouseButtonÀ» true·Î
// ¼³Á¤ÇÏ¸é µÈ´Ù.
      nxPlanetView1.InverseMouseWheel = true;
}

private void checkBoxInverseMouseWheel_Unchecked(object sender, RoutedEventArgs e)
{
      // PlanetView´Â ±âº»ÀûÀ¸·Î ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°Àº È­¸é À̵¿À», ¿À¸¥ÂÊ ¹öÆ°Àº 
// È­¸éȸÀü ±â´ÉÀ» ´ã´çÇÑ´Ù.
      // ÀÌ ±â´ÉÀ» Àüȯ ÈÄ ÇØÁ¦ÇÏ·Á¸é NXPlanetViewÀÇ InverseMouseButtonÀ»
// false·Î ¼³Á¤ÇÏ¸é µÈ´Ù.
       nxPlanetView1.InverseMouseWheel = false;
}

private void checkBoxRotatable_Checked(object sender, RoutedEventArgs e)
{
      // NXPlanetViewÀÇ Rotatable ¼Ó¼ºÀ» ¼³Á¤ÇÏ·Á¸é È­¸éȸÀü ¿©ºÎ¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
       nxPlanetView1.Rotatable = true;
}

private void checkBoxRotatable_Unchecked(object sender, RoutedEventArgs e)
{
      // NXPlanetViewÀÇ Rotatable ¼Ó¼ºÀ» ¼³Á¤ÇÏ·Á¸é È­¸éȸÀü ¿©ºÎ¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
       nxPlanetView1.Rotatable = false;
}

private void comboBoxGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
       if (comboBoxGrid.SelectedIndex == 0)  // None
       {
           nxPlanetView1.GridType = NXPlanetView.eGridType.GridNone;
       }
       else if (comboBoxGrid.SelectedIndex == 1)  // Degree
       {
           nxPlanetView1.GridType = NXPlanetView.eGridType.GridDegrees;
       }
       else if (comboBoxGrid.SelectedIndex == 2)  // GARS
       {
           nxPlanetView1.GridType = NXPlanetView.eGridType.GridGARS;
       }
 }

 

À̾ Äڵ带 Ãß°¡ÇÑ´Ù.

private void buttonScaleApply_Click(object sender, RoutedEventArgs e)
{
    double mapAltitude = 1500000.0;
    int scaleIndex = comboBoxScale.SelectedIndex;
    if (scaleIndex == 0)        // 1000000
         mapAltitude = 
nxPlanetView1.GetMapAltitude(NXPlanetView.eMapScale.Scale_1000000);
    else if (scaleIndex == 1)   // 500000
         mapAltitude = 
nxPlanetView1.GetMapAltitude(NXPlanetView.eMapScale.Scale_500000);
    else if (scaleIndex == 2)   // 100000
         mapAltitude = 
nxPlanetView1.GetMapAltitude(NXPlanetView.eMapScale.Scale_100000);
    else if (scaleIndex == 3)   // 50000
         mapAltitude = 
nxPlanetView1.GetMapAltitude(NXPlanetView.eMapScale.Scale_50000);
    else if (scaleIndex == 4)   // 10000
         mapAltitude = 
nxPlanetView1.GetMapAltitude(NXPlanetView.eMapScale.Scale_10000);

    // ÇöÀçÀÇ Camera Á¤º¸ °¡Á®¿À±â
    NXCameraState state = nxPlanetView1.GetCameraState();

    XGeoPoint eyePos = new XGeoPoint();
    eyePos.lond = state.lonEye.deg;
    eyePos.latd = state.latEye.deg;
    eyePos.hgt = mapAltitude

    // À§Ä¡¸¦ À¯ÁöÇÑ »óÅ·Πī¸Þ¶óÀÇ ³ôÀ̸¸ ¼öÁ¤ÇÏ¿© ¼³Á¤
    nxPlanetView1.SetCameraPosition(eyePos, XAngle.FromDegree(0.0));
    nxPlanetView1.RefreshScreen();
}

private void checkBoxShowPBP_Checked(object sender, RoutedEventArgs e)
{
     // ÁöÇü Áöµµ À§¿¡ ÅؽºÆ®ÇüÅÂÀÇ Áö¸íÀ» ÁßøÇÏ¿© µµ½ÃÇÒ ¼ö Àִµ¥, 
// ÀÌ¿¡ ´ëÇÑ ¿©ºÎ¸¦ ¼³Á¤ÇÑ´Ù.
     nxPlanetView1.ShowPBP = true;
     nxPlanetView1.RefreshScreen();
}

private void checkBoxShowPBP_Unchecked(object sender, RoutedEventArgs e)
{
      // ÁöÇü Áöµµ À§¿¡ ÅؽºÆ®ÇüÅÂÀÇ Áö¸íÀ» ÁßøÇÏ¿© µµ½ÃÇÒ ¼ö Àִµ¥, 
// ÀÌ¿¡ ´ëÇÑ ¿©ºÎ¸¦ ¼³Á¤ÇÑ´Ù.
      nxPlanetView1.ShowPBP = false;
      nxPlanetView1.RefreshScreen();
}

private void checkBoxShowStar_Checked(object sender, RoutedEventArgs e)
{
      // È­¸é Ãà¼Ò¸¦ Çؼ­ Áöµµ ¿µ¿ª ¹ÛÀ¸·Î ¹þ¾î³ª´Â °æ¿ì, ¹è°æ º°À» Ãß°¡µµ½Ã ¿©ºÎ¸¦
// ¼³Á¤ÇÑ´Ù.
      nxPlanetView1.ShowStar = true;
      nxPlanetView1.RefreshScreen();
}

private void checkBoxShowStar_Unchecked(object sender, RoutedEventArgs e)
{
      // È­¸é Ãà¼Ò¸¦ Çؼ­ Áöµµ ¿µ¿ª ¹ÛÀ¸·Î ¹þ¾î³ª´Â °æ¿ì, ¹è°æ º°À» Ãß°¡µµ½Ã ¿©ºÎ¸¦ 
// ¼³Á¤ÇÑ´Ù.
      nxPlanetView1.ShowStar = false;
      nxPlanetView1.RefreshScreen();
}

private void checkBoxStatusInfo_Checked(object sender, RoutedEventArgs e)
{
       // XDL ¿£ÁøÀÇ µµ½Ã »óÅ Á¤º¸¸¦ È­¸é¿¡ µµ½Ã ¿©ºÎ¸¦ ¼³Á¤ÇÑ´Ù.
       nxPlanetView1.ShowStatusInfo = true;
       nxPlanetView1.RefreshScreen();
}

private void checkBoxStatusInfo_Unchecked(object sender, RoutedEventArgs e)
{
       // XDL ¿£ÁøÀÇ µµ½Ã »óÅ Á¤º¸¸¦ È­¸é¿¡ µµ½Ã ¿©ºÎ¸¦ ¼³Á¤ÇÑ´Ù.
       nxPlanetView1.ShowStatusInfo = false;
       nxPlanetView1.RefreshScreen();
}

 

¸¶Áö¸·À¸·Î View»ó¿¡¼­ ¸¶¿ì½º À§Ä¡¿¡ ´ëÇÑ ÁÂÇ¥¸¦ È­¸éµµ½ÃÇÏ°í, ³ªÄ§¹ÝÀ» È­¸é¿¡ Ãß°¡Çϵµ·Ï ÇÏ°Ú´Ù. ¸ÕÀú ¸¶¿ì½º È­¸é ÁÂÇ¥¸¦ ÀúÀåÇÏ´Â º¯¼ö¿Í È­¸éµµ½Ã¸¦ À§ÇÑ º¯¼ö¸¦ »ý¼ºÇÑ´Ù.

public partial class MainWindow : Window
{
// ¸¶¿ì½º È­¸é ÁÂÇ¥¸¦ ÀúÀåÇÏ´Â º¯¼ö¿Í È­¸éµµ½Ã¸¦ À§ÇÑ º¯¼ö»ý¼º
    private XVertex2d scrPos = new XVertex2d();
    private XTextPrinter textPrinter = new XTextPrinter();
    private XTexture compassTexture = new XTexture();

    public MainWindow()
    {
        InitializeComponent();

// °ü·Ã ±â´ÉÀ» À§ÇÑ Äڵ带 Ãß°¡ÇÑ´Ù.
        nxPlanetView1.BackColor = Color.Black;

        Font coordFont = new Font("Gulim", 12, FontStyle.Regular |
 FontStyle.Bold);
        if (!textPrinter.Initialize(coordFont))
        {
            System.Diagnostics.Debug.WriteLine(
"Fail to initialize text printer for coordinate display!");
        }

        if (!compassTexture.Load("c:\\Pixoneer\\XDL1.2\\Resource\\compass.png"))
        {
            System.Diagnostics.Debug.WriteLine(
"Fail to load compass texture!");
        }
    }
}

 

³ªÄ§¹Ý À̹ÌÁö·Î »ç¿ëÇÏ´Â ¡°compass.png¡± ÆÄÀÏÀÌ ¿¹Á¦ ÄÚµå¿Í °°Àº °æ·Î¿¡ ¾øÀ¸¸é, ¿¹Á¦ »ùÇà ÇÁ·Î±×·¥ ¾ÐÃà ÆÄÀÏ¿¡ ÀÖ´Â ÆÄÀÏÀ» ÀÌ¿ëÇϱ⠹ٶõ´Ù.

2.3.3     nxPlanetLayer1À» ¼±ÅÃÇÏ¿© ¡°OnWndProc¡± À̺¥Æ®¿Í ¡°OnOrthoRender¡± À̺¥Æ® ÇÔ¼ö¸¦ Ãß°¡ÇÏ¿© Äڵ带 ÀÛ¼ºÇÑ´Ù.

OnWndProc À̺¥Æ®´Â NXPlanetLayer°¡ Ãß°¡µÇ¾î ÀÖ´Â ViewÀÇ À©µµ¿ì À̺¥Æ®¸¦ ¿ÜºÎ¿¡¼­ ¹Þ¾Æ¼­ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. OnOrthoRender´Â NXPlanetLayer°¡ Ãß°¡µÇ¾î ÀÖ´Â ViewÀÇ Ortho-renderingÀÌ ¿Ï·áµÈ ÈÄ ¾îÇø®ÄÉÀ̼ǿ¡¼­ Ãß°¡ÀûÀÎ ÀÛ¾÷À» ±¸ÇöÇØ¾ß ÇÒ ÇÊ¿ä°¡ ÀÖÀ» ¶§ »ç¿ëÇÏ¸é µÈ´Ù. Âü°í·Î NXPlanetViewÀÇ ³»ºÎ Rendering ¼öÇà->OnRender À̺¥Æ® ¹ß»ý->NXPlanetViewÀÇ ³»ºÎ OrthoRendering ¼öÇà->OnOrthoRender À̺¥Æ® ¹ß»ý ¼ø¼­·Î ÀÌ·ç¾îÁø´Ù. ÄÚµå´Â ¾Æ·¡¿Í °°´Ù.

private bool nxPlanetLayer1_OnWndProc(object sender, NXPlanetDrawArgs e, ref System.Windows.Forms.Message m)
{
      if (m.Msg == Pixoneer.NXDL.XWndMsg.XWM_MOUSEMOVE)
      {
           scrPos.x = Pixoneer.NXDL.XWndMsg.GetLowValue(m.LParam);
           scrPos.y = Pixoneer.NXDL.XWndMsg.GetHighValue(m.LParam);
           nxPlanetView1.RefreshScreen();
       }
       return default(bool);
}


private bool nxPlanetLayer1_OnOrthoRender(object sender, NXPlanetDrawArgs e)
 {
       if (nxPlanetView1 == null) return false;

       XVertex3d posWorld = new XVertex3d();
       // È­¸é ÁÂÇ¥¸¦ À§°æµµ ÁÂÇ¥·Î º¯È¯
       XGeoPoint gpPoint = 
nxPlanetView1.ScreenToGeographic(scrPos.x, scrPos.y);
       posWorld.x = scrPos.x;
       posWorld.y = scrPos.y;
       posWorld.z = 0.0;

       String str = gpPoint.lond.ToString() + ", " + gpPoint.latd.ToString();

       // È­¸é¿¡ ÅؽºÆ® ÁÂÇ¥¸¦ µµ½Ã
bool result = textPrinter.Print(str, posWorld, Pixoneer.NXDL.NGR.eTextAlign.Align_Center, System.Drawing.Color.White, true, System.Drawing.Color.DarkBlue);

       // ³ªÄ§¹Ý µµ½Ã
       if (!compassTexture.SendTextureToDevice()) return false;

       NXCameraState state = nxPlanetView1.GetCameraState();

       int nXSize = compassTexture.Width;
       int nYSize = compassTexture.Height;

       e.Graphics.glDisable(XGraphics.GL_DEPTH_TEST);
       e.Graphics.glEnable(XGraphics.GL_BLEND);

       e.Graphics.glBindTexture(XGraphics.GL_TEXTURE_2D, (uint)compassTexture.GLTextureID);
       e.Graphics.glColor3f(1.0f, 1.0f, 1.0f);

       e.Graphics.glPushMatrix();
       e.Graphics.glTranslated(100.0, 100.0);
       e.Graphics.glRotated(-state.azimuth.deg, 0.0, 0.0, 1.0);

       e.Graphics.glBegin(XGraphics.GL_QUADS);
       e.Graphics.glTexCoord2f(0, 1); e.Graphics.glVertex3d(-nXSize / 2, -nYSize / 2, 0);
       e.Graphics.glTexCoord2f(0, 0); e.Graphics.glVertex3d(-nXSize / 2,  nYSize / 2, 0);

       e.Graphics.glTexCoord2f(1, 0); e.Graphics.glVertex3d(nXSize / 2, nYSize / 2, 0);
       e.Graphics.glTexCoord2f(1, 1); e.Graphics.glVertex3d(nXSize / 2, -nYSize / 2, 0);
       e.Graphics.glEnd();

       e.Graphics.glPopMatrix();

       e.Graphics.glDisable(XGraphics.GL_BLEND);
       e.Graphics.glEnable(XGraphics.GL_DEPTH_TEST);

       return default(bool);
}

 

2.3.4     ¼Ö·ç¼ÇÀ» ºôµåÇÏ°í ½ÇÇàÇÑ´Ù.