void set_display_font(HTuple hv_WindowHandle, HTuple hv_Size, HTuple hv_Font, HTuple hv_Bold,
HTuple hv_Slant)
{
// Local iconic variables
// Local control variables
HTuple hv_OS, hv_BufferWindowHandle, hv_Ascent;
HTuple hv_Descent, hv_Width, hv_Height, hv_Scale, hv_Exception;
HTuple hv_SubFamily, hv_Fonts, hv_SystemFonts, hv_Guess;
HTuple hv_I, hv_Index, hv_AllowedFontSizes, hv_Distances;
HTuple hv_Indices, hv_FontSelRegexp, hv_FontsCourier;
//This procedure sets the text font of the current window with
//the specified attributes.
//It is assumed that following fonts are installed on the system:
//Windows: Courier New, Arial Times New Roman
//Mac OS X: CourierNewPS, Arial, TimesNewRomanPS
//Linux: courier, helvetica, times
//Because fonts are displayed smaller on Linux than on Windows,
//a scaling factor of 1.25 is used the get comparable results.
//For Linux, only a limited number of font sizes is supported,
//to get comparable results, it is recommended to use one of the
//following sizes: 9, 11, 14, 16, 20, 27
//(which will be mapped internally on Linux systems to 11, 14, 17, 20, 25, 34)
//
//Input parameters:
//WindowHandle: The graphics window for which the font will be set
//Size: The font size. If Size=-1, the default of 16 is used.
//Bold: If set to 'true', a bold font is used
//Slant: If set to 'true', a slanted font is used
//
GetSystem("operating_system", &hv_OS);
// dev_get_preferences(...); only in hdevelop
// dev_set_preferences(...); only in hdevelop
if (0 != (HTuple(hv_Size == HTuple()).TupleOr(hv_Size == -1)))
{
hv_Size = 16;
}
if (0 != ((hv_OS.TupleSubstr(0, 2)) == HTuple("Win")))
{
//Set font on Windows systems
try
{
//Check, if font scaling is switched on
OpenWindow(0, 0, 256, 256, 0, "buffer", "", &hv_BufferWindowHandle);
HalconCpp::SetFont(hv_BufferWindowHandle, "-Consolas-16-*-0-*-*-1-");
GetStringExtents(hv_BufferWindowHandle, "test_string", &hv_Ascent, &hv_Descent,
&hv_Width, &hv_Height);
//Expected width is 110
hv_Scale = 110.0 / hv_Width;
hv_Size = (hv_Size * hv_Scale).TupleInt();
HalconCpp::CloseWindow(hv_BufferWindowHandle);
}
// catch (Exception)
catch (HalconCpp::HException& HDevExpDefaultException)
{
HDevExpDefaultException.ToHTuple(&hv_Exception);
//throw (Exception)
}
if (0 != (HTuple(hv_Font == HTuple("Courier")).TupleOr(hv_Font == HTuple("courier"))))
{
hv_Font = "Courier New";
}
else if (0 != (hv_Font == HTuple("mono")))
{
hv_Font = "Consolas";
}
else if (0 != (hv_Font == HTuple("sans")))
{
hv_Font = "Arial";
}
else if (0 != (hv_Font == HTuple("serif")))
{
hv_Font = "Times New Roman";
}
if (0 != (hv_Bold == HTuple("true")))
{
hv_Bold = 1;
}
else if (0 != (hv_Bold == HTuple("false")))
{
hv_Bold = 0;
}
else
{
hv_Exception = "Wrong value of control parameter Bold";
throw HalconCpp::HException(hv_Exception);
}
if (0 != (hv_Slant == HTuple("true")))
{
hv_Slant = 1;
}
else if (0 != (hv_Slant == HTuple("false")))
{
hv_Slant = 0;
}
else
{
hv_Exception = "Wrong value of control parameter Slant";
throw HalconCpp::HException(hv_Exception);
}
try
{
HalconCpp::SetFont(hv_WindowHandle, ((((((("-" + hv_Font) + "-") + hv_Size) + "-*-") + hv_Slant) + "-*-*-") + hv_Bold) + "-");
}
// catch (Exception)
catch (HalconCpp::HException& HDevExpDefaultException)
{
HDevExpDefaultException.ToHTuple(&hv_Exception);
//throw (Exception)
}
}
else if (0 != ((hv_OS.TupleSubstr(0, 2)) == HTuple("Dar")))
{
//Set font on Mac OS X systems. Since OS X does not have a strict naming
//scheme for font attributes, we use tables to determine the correct font
//name.
hv_SubFamily = 0;
if (0 != (hv_Slant == HTuple("true")))
{
hv_SubFamily = hv_SubFamily | 1;
}
else if (0 != (hv_Slant != HTuple("false")))
{
hv_Exception = "Wrong value of control parameter Slant";
throw HalconCpp::HException(hv_Exception);
}
if (0 != (hv_Bold == HTuple("true")))
{
hv_SubFamily = hv_SubFamily | 2;
}
else if (0 != (hv_Bold != HTuple("false")))
{
hv_Exception = "Wrong value of control parameter Bold";
throw HalconCpp::HException(hv_Exception);
}
if (0 != (hv_Font == HTuple("mono")))
{
hv_Fonts.Clear();
hv_Fonts[0] = "Menlo-Regular";
hv_Fonts[1] = "Menlo-Italic";
hv_Fonts[2] = "Menlo-Bold";
hv_Fonts[3] = "Menlo-BoldItalic";
}
else if (0 != (HTuple(hv_Font == HTuple("Courier")).TupleOr(hv_Font == HTuple("courier"))))
{
hv_Fonts.Clear();
hv_Fonts[0] = "CourierNewPSMT";
hv_Fonts[1] = "CourierNewPS-ItalicMT";
hv_Fonts[2] = "CourierNewPS-BoldMT";
hv_Fonts[3] = "CourierNewPS-BoldItalicMT";
}
else if (0 != (hv_Font == HTuple("sans")))
{
hv_Fonts.Clear();
hv_Fonts[0] = "ArialMT";
hv_Fonts[1] = "Arial-ItalicMT";
hv_Fonts[2] = "Arial-BoldMT";
hv_Fonts[3] = "Arial-BoldItalicMT";
}
else if (0 != (hv_Font == HTuple("serif")))
{
hv_Fonts.Clear();
hv_Fonts[0] = "TimesNewRomanPSMT";
hv_Fonts[1] = "TimesNewRomanPS-ItalicMT";
hv_Fonts[2] = "TimesNewRomanPS-BoldMT";
hv_Fonts[3] = "TimesNewRomanPS-BoldItalicMT";
}
else
{
//Attempt to figure out which of the fonts installed on the system
//the user could have meant.
QueryFont(hv_WindowHandle, &hv_SystemFonts);
hv_Fonts.Clear();
hv_Fonts.Append(hv_Font);
hv_Fonts.Append(hv_Font);
hv_Fonts.Append(hv_Font);
hv_Fonts.Append(hv_Font);
hv_Guess.Clear();
hv_Guess.Append(hv_Font);
hv_Guess.Append(hv_Font + "-Regular");
hv_Guess.Append(hv_Font + "MT");
{
HTuple end_val100 = (hv_Guess.TupleLength()) - 1;
HTuple step_val100 = 1;
for (hv_I = 0; hv_I.Continue(end_val100, step_val100); hv_I += step_val100)
{
TupleFind(hv_SystemFonts, HTuple(hv_Guess[hv_I]), &hv_Index);
if (0 != (hv_Index != -1))
{
hv_Fonts[0] = HTuple(hv_Guess[hv_I]);
break;
}
}
}
//Guess name of slanted font
hv_Guess.Clear();
hv_Guess.Append(hv_Font + "-Italic");
hv_Guess.Append(hv_Font + "-ItalicMT");
hv_Guess.Append(hv_Font + "-Oblique");
{
HTuple end_val109 = (hv_Guess.TupleLength()) - 1;
HTuple step_val109 = 1;
for (hv_I = 0; hv_I.Continue(end_val109, step_val109); hv_I += step_val109)
{
TupleFind(hv_SystemFonts, HTuple(hv_Guess[hv_I]), &hv_Index);
if (0 != (hv_Index != -1))
{
hv_Fonts[1] = HTuple(hv_Guess[hv_I]);
break;
}
}
}
//Guess name of bold font
hv_Guess.Clear();
hv_Guess.Append(hv_Font + "-Bold");
hv_Guess.Append(hv_Font + "-BoldMT");
{
HTuple end_val118 = (hv_Guess.TupleLength()) - 1;
HTuple step_val118 = 1;
for (hv_I = 0; hv_I.Continue(end_val118, step_val118); hv_I += step_val118)
{
TupleFind(hv_SystemFonts, HTuple(hv_Guess[hv_I]), &hv_Index);
if (0 != (hv_Index != -1))
{
hv_Fonts[2] = HTuple(hv_Guess[hv_I]);
break;
}
}
}
//Guess name of bold slanted font
hv_Guess.Clear();
hv_Guess.Append(hv_Font + "-BoldItalic");
hv_Guess.Append(hv_Font + "-BoldItalicMT");
hv_Guess.Append(hv_Font + "-BoldOblique");
{
HTuple end_val127 = (hv_Guess.TupleLength()) - 1;
HTuple step_val127 = 1;
for (hv_I = 0; hv_I.Continue(end_val127, step_val127); hv_I += step_val127)
{
TupleFind(hv_SystemFonts, HTuple(hv_Guess[hv_I]), &hv_Index);
if (0 != (hv_Index != -1))
{
hv_Fonts[3] = HTuple(hv_Guess[hv_I]);
break;
}
}
}
}
hv_Font = ((const HTuple&)hv_Fonts)[hv_SubFamily];
try
{
HalconCpp::SetFont(hv_WindowHandle, (hv_Font + "-") + hv_Size);
}
// catch (Exception)
catch (HalconCpp::HException& HDevExpDefaultException)
{
HDevExpDefaultException.ToHTuple(&hv_Exception);
//throw (Exception)
}
}
else
{
//Set font for UNIX systems
hv_Size = hv_Size * 1.25;
hv_AllowedFontSizes.Clear();
hv_AllowedFontSizes[0] = 11;
hv_AllowedFontSizes[1] = 14;
hv_AllowedFontSizes[2] = 17;
hv_AllowedFontSizes[3] = 20;
hv_AllowedFontSizes[4] = 25;
hv_AllowedFontSizes[5] = 34;
if (0 != ((hv_AllowedFontSizes.TupleFind(hv_Size)) == -1))
{
hv_Distances = (hv_AllowedFontSizes - hv_Size).TupleAbs();
TupleSortIndex(hv_Distances, &hv_Indices);
hv_Size = ((const HTuple&)hv_AllowedFontSizes)[HTuple(hv_Indices[0])];
}
if (0 != (HTuple(hv_Font == HTuple("mono")).TupleOr(hv_Font == HTuple("Courier"))))
{
hv_Font = "courier";
}
else if (0 != (hv_Font == HTuple("sans")))
{
hv_Font = "helvetica";
}
else if (0 != (hv_Font == HTuple("serif")))
{
hv_Font = "times";
}
if (0 != (hv_Bold == HTuple("true")))
{
hv_Bold = "bold";
}
else if (0 != (hv_Bold == HTuple("false")))
{
hv_Bold = "medium";
}
else
{
hv_Exception = "Wrong value of control parameter Bold";
throw HalconCpp::HException(hv_Exception);
}
if (0 != (hv_Slant == HTuple("true")))
{
if (0 != (hv_Font == HTuple("times")))
{
hv_Slant = "i";
}
else
{
hv_Slant = "o";
}
}
else if (0 != (hv_Slant == HTuple("false")))
{
hv_Slant = "r";
}
else
{
hv_Exception = "Wrong value of control parameter Slant";
throw HalconCpp::HException(hv_Exception);
}
try
{
HalconCpp::SetFont(hv_WindowHandle, ((((((("-adobe-" + hv_Font) + "-") + hv_Bold) + "-") + hv_Slant) + "-normal-*-") + hv_Size) + "-*-*-*-*-*-*-*");
}
// catch (Exception)
catch (HalconCpp::HException& HDevExpDefaultException)
{
HDevExpDefaultException.ToHTuple(&hv_Exception);
if (0 != (HTuple((hv_OS.TupleSubstr(0, 4)) == HTuple("Linux")).TupleAnd(hv_Font == HTuple("courier"))))
{
QueryFont(hv_WindowHandle, &hv_Fonts);
hv_FontSelRegexp = (("^-[^-]*-[^-]*[Cc]ourier[^-]*-" + hv_Bold) + "-") + hv_Slant;
hv_FontsCourier = (hv_Fonts.TupleRegexpSelect(hv_FontSelRegexp)).TupleRegexpMatch(hv_FontSelRegexp);
if (0 != ((hv_FontsCourier.TupleLength()) == 0))
{
hv_Exception = "Wrong font name";
//throw (Exception)
}
else
{
try
{
HalconCpp::SetFont(hv_WindowHandle, ((HTuple(hv_FontsCourier[0]) + "-normal-*-") + hv_Size) + "-*-*-*-*-*-*-*");
}
// catch (Exception)
catch (HalconCpp::HException& HDevExpDefaultException)
{
HDevExpDefaultException.ToHTuple(&hv_Exception);
//throw (Exception)
}
}
}
//throw (Exception)
}
}
// dev_set_preferences(...); only in hdevelop
return;
}
Halcon12 set_display_font 函数
最新推荐文章于 2024-03-20 09:00:17 发布