うしブログ

うしブログ

趣味で運営する、GeoGebraの専門ブログ。

(作業メモ)StartPoint要検証(2行の場合;テキスト変更時未定義問題)

テキストサイズをピクセル単位で微調整する

はじめに

過去記事「テキストの高さ、および描画開始点の位置」*1(以下、単に「過去記事」という)では、テキストの高さ(単位はピクセル。heightとおく)が、テキストのxmlデータにおける「sizeM」という数値、および、フォントサイズ(pt)の2変数関数であることを確認した。

height = floor(1.5floor( pt(sizeM-1) )+1.5pt+6)

(ただし、heightの最小値は12)

また、過去記事では、あるheight, ptに対して、

sizeM* = (height - 5) / (1.5pt)

を、テキストのsizeMの値として設定する*2と、テキストの高さを、指定したheightに設定できる*3ことも分かった。

本記事では、これらの知見を応用して、テキストサイズをピクセル単位で微調整する方法を紹介する。

見本アプレット 

テキストサイズをピクセル単位で微調整する – GeoGebra

スクリプト

// void SetTextSize(string txtName, double height)
// 指定した名前のテキストオブジェクトの高さ(ピクセル数)を、指定した値に設定する。
function setTextSize(txtName,height){

  // アプレットの全xmlデータを取得
  var xml = ggbApplet.getXML();
  
  // <gui>〜</gui>内の<font  size="?"/>の値を取得して、ptとする。
  var indexOfGuiStart = xml.indexOf('<gui>');
  var indexOfGuiEnd = xml.indexOf('</gui>');
  var xmlGui = xml.slice(indexOfGuiStart,indexOfGuiEnd);

  var indexOfFontStart = xmlGui.indexOf('<font');
  var indexOfFontEnd = xmlGui.indexOf('/>', indexOfFontStart);
  var xmlFont = xmlGui.slice(indexOfFontStart,indexOfFontEnd);

  var indexOfSizeStart = xmlFont.indexOf('size');
  var indexOfQuotStart = xmlFont.indexOf('\"', indexOfSizeStart);
  var indexOfQuotEnd = xmlFont.indexOf('\"', indexOfQuotStart+1);
  var xmlSize = xmlFont.slice(indexOfQuotStart+1,indexOfQuotEnd);

  var pt = eval(xmlSize);

  // テキストの高さをheightにするためのsizeMの値を取得
  var sizeM = (height-5) / (1.5 * pt);

  // テキストのsizeMを変更
  //  対象の<element>〜</element>を取得
  var indexOfElementStart = xml.indexOf('<element type=\"text\" label=\"'+txtName+'\">');
  var indexOfElementEnd = xml.indexOf('</element>', indexOfElementStart);
  var xmlElement = xml.slice(indexOfElementStart,indexOfElementEnd+10);
  // xmlElement内に<font>タグがあるか?
  var indexOfElementFontStart = xmlElement.indexOf('<font');

  // xmlElement内に<font>タグがない場合の処理
  if(indexOfElementFontStart==-1){
  // </element>の直前にfontタグを挿入
  indexOfElementEnd = xmlElement.indexOf('</element>');
  var xmlElementToEval = xmlElement.slice(0,indexOfElementEnd)+'<font serif=\"false\" sizeM=\"'+sizeM+'\" size=\"0\" style=\"0\"/>'+xmlElement.slice(indexOfElementEnd);
  ggbApplet.evalXML(xmlElementToEval);
    return;
  }

  // 以下、xmlElement内に<font>タグがある場合の処理
  // sizeMの値を変更
  var indexOfSizeMStart = xmlElement.indexOf('sizeM');
  var indexOfSizeMStart = xmlElement.indexOf('sizeM');
  var indexOfSizeMQuotStart = xmlElement.indexOf('\"', indexOfSizeMStart);
  var xmlElementBefore = xmlElement.slice(0,indexOfSizeMQuotStart+1);
  var indexOfSizeMQuotEnd = xmlElement.indexOf('\"', indexOfSizeMQuotStart+1);
  var xmlElementAfter = xmlElement.slice(indexOfSizeMQuotEnd);
  xmlElementToEval = xmlElementBefore + sizeM + xmlElementAfter;
  ggbApplet.evalXML(xmlElementToEval);
}

バージョン情報

この記事は、以下のバージョンのGeoGebraを前提としています。

Version: 6.0.511.0-w (11 November 2018)

*1:

*2:sizeMの値を変更するには、オブジェクトのxmlデータを編集するメソッドである、ggbApplet.evalXML を用いる。

*3:なお、仕様上、テキストの高さをheightに設定できない場合は、height+1に設定される。過去記事参照。