サポート > PC-MAPPING ヒント集 > スクリプト > スクリプトによる背景ピクチャーの設定および表示切替
スクリプトによる背景ピクチャーの設定および表示切替
リレーションにより写真等のイメージデータを表示させた場合、そのイメージは別ウィンドウに表示されます。
そのため、プロジェクトの印刷時にそのイメージを取り込む事ができません。
しかし、リレーションにより背景ピクチャーとして表示する事で印刷が可能になります。
ここでは背景ピクチャーの設定をスクリプトで行う手順、および、背景ピクチャーの表示切替をVBスクリプト実行リレーションで行う手順について記述します。
■ サンプル
サンプルスクリプト[script28.zip(約264KB)]をダウンロードする
MapcomPark.pcm:サンプルプロジェクト
1.jpg〜511.jpg:背景ピクチャー用写真6枚(使用するのは1〜3.jpgのみ)
PictureSet.js:背景ピクチャー設定のサンプルJScript
PictureDisp.js:背景ピクチャー表示切替の実行リレーションのサンプルJScript
PictureSet.vbs:背景ピクチャー設定のサンプルVBScript
PictureDisp.vbs:背景ピクチャー表示切替の実行リレーションのサンプルVBScript

■ 準備
JScriptの場合「*.js」、VBScriptの場合「*.vbs」を記述します。
ここでは、「*.js」を例に記述します。

  1. ダウンロードしたファイルを「C:\sample\script28」フォルダーへ解凍します。

  2. 「MapcomPark.pcm」と「PictureSet.js」を開き、スクリプトのウィンドウをアクティブにして、[スクリプト]リボン-[スクリプト]-[スクリプトの実行]を実行します。
    ※「PictureSet.js」をユーザー定義メニューに登録して、そこから実行しても構いませんが、ここでは直接実行します。
    ただし、他のプロジェクトを開いていれば「MapcomPark.pcm」以外は閉じて下さい。


    上図のように設定した背景ピクチャーが全て表示されます。

  3. ポイントの属性照会を実行します。

    上図のように属性照会した背景ピクチャーのみが表示されます。

■ 解説
<PictureSet.js:背景ピクチャー設定のサンプルスクリプトについて>
このスクリプトはプロジェクトのポイントの内部属性に登録してあるデータベースをもとにイメージを背景ピクチャーに登録し表示しています。

要点1…レイヤーの座標系情報の取得
//レイヤオブジェクトの座標系情報のコピーオブジェクトを取得します。
var objCoord = objLyr.GetCopyOfCoordInfo();
//座標系情報(X, Y, 縮尺)
var dblLyrX = objCoord.InfoDouble(40);
var dblLyrY = objCoord.InfoDouble(41);
var dblLyrScale = objCoord.InfoDouble(44);

背景ピクチャーのサイズと設置場所の算出に必要な情報をここで取得します。
※このプロジェクトで用いている座標系はペーパー座標系なので他の座標系を用いている場合は適切なパラメーターを取得して下さい。

要点2…内部属性のデータベースの取得
//「ファイルパス」フィールドの値から画像パスを取得します。
var strPath = objFs.GetParentFolderName(objPrj.PathName) + "\\" + objDb.GetCell(i, lngFieldID, false);
//背景ピクチャーを読み込みます。
blnTemp = objPicture.Load(strPath);
//「種別」フィールドの値を取得します。
var strTitle = objDb.GetCell(i, lngFieldID2, false);
//「X座標」フィールドの値を取得します。
var dblX = objDb.GetCellAsDouble(i, lngFieldID3, false);
//「Y座標」フィールドの値を取得します。
var dblY = objDb.GetCellAsDouble(i, lngFieldID4, false);
//「サイズ(横幅[mm])」フィールドの値を取得します。
var dblSize = objDb.GetCellAsDouble(i, lngFieldID5, false);

データベースから「ファイルパス」を取得し、背景ピクチャーの設定に必要な「種別」、「X座標」、「Y座標」、「サイズ(横幅[mm])」を取得します。
※レコード番号は1からなのでFor文の始まりは1からスタートします。

要点3…イメージの情報取得
//空のイメージを生成し、そのオブジェクトを取得します。
var objImage = objApp.CreateImage();
//イメージデータを読み込みます。
blnTemp = objImage.Load(strPath);
//イメージデータの幅(ピクセル)
var lngImWidth = objImage.Width;
//イメージデータの高さ(ピクセル)
var lngImHeight = objImage.Height;

イメージデータを読み込み、背景ピクチャーのサイズと設置場所の算出に必要な幅と高さを取得します。

要点4…背景ピクチャーの座標系情報の設定
//背景ピクチャーオブジェクトの座標系情報のコピーオブジェクトを取得します。
var objCoord = objLyr.GetCopyOfCoordInfo();
//座標系情報
objCoord.InfoDouble(40) = lngImWidth;
objCoord.InfoDouble(41) = lngImHeight;
objCoord.InfoDouble(44) = dblSize * dblLyrScale / lngImWidth;
objCoord.InfoDouble(45) = (dblX + 3) * dblLyrScale / 1000;
objCoord.InfoDouble(46) = (dblY + 3) * dblLyrScale / 1000;
//指定した座標系情報オブジェクトを背景ピクチャーオブジェクトに登録します。
blnTemp = objPicture.SetCoordInfo(objCoord);

※このプロジェクトで用いている座標系はペーパー座標系なので他の座標系を用いている場合は適切なパラメーターを設定して下さい。

<PictureDisp.js:背景ピクチャー表示切替のスクリプト実行リレーションのサンプルスクリプトについて>
このスクリプトはスクリプト実行リレーションのためのスクリプトで、引数としてレコード番号を受け取り、そのレコードに対するベクターの背景ピクチャーのみを表示させます。

要点1…レコード番号の取得
//カンマで区切られた文字列(引数)の個数を取得します。
if(objApp.GetNumOfParams() == 1){
//カンマで区切られた文字列をlngParam番目の引数として処理します。
var lngRecNum = parseInt(objApp.GetParam(0));
}else{
objApp.MessageBox("パラメータの設定に誤りがあります。");
return;
}

まず、リレーション実行時に引き渡されるレコード番号を受け取ります。

要点2 …全背景ピクチャーの非表示
//ベクタプロジェクトに登録されている背景ピクチャーの数を取得します。
for(i = 0; i < objPrj.GetNumOfPicture(); i++){
//ベクタプロジェクトに登録されている背景ピクチャーのコピーオブジェクトを取得します。
var objPicture = objPrj.GetCopyOfPicture(i);
//[プロジェクトエキスパート]-[背景ピクチャー]パネルの「表示・非表示」ボタン
objPicture.DispFlag = false;
//指定した背景ピクチャーへ背景ピクチャーオブジェクトの情報を上書きコピーします。
blnTemp = objPrj.SetPicture(i, objPicture);
}

一旦、全ての背景ピクチャーを非表示します。

要点3…指定のベクタの背景ピクチャーの表示
//ベクタプロジェクトに登録されている背景ピクチャーのコピーオブジェクトを取得します。
var objPicture = objPrj.GetCopyOfPicture(lngRecNum - 1);
//[プロジェクトエキスパート]-[背景ピクチャー]パネルの「表示・非表示」ボタン
objPicture.DispFlag = true;
//指定した背景ピクチャーへ背景ピクチャーオブジェクトの情報を上書きコピーします。
blnTemp = objPrj.SetPicture(lngRecNum - 1, objPicture);

受け取ったレコード番号と背景ピクチャーの登録順番号は数えの始まりが異なるので「lngRecNum - 1」となります。

<MapcomPark.pcm:サンプルプロジェクトについて>
このプロジェクトにはスクリプト実行リレーションが設定されています。

「写真」フィールドにリレーションが設定されています。
実行するスクリプトファイル名と、引数としてリレーション実行するベクタの内部番号(レコード番号)を次のような書式でリレーションフィールドに記述します(△は半角スペース)。
PictureDisp.js△@Rec
「X座標」、「Y座標」フィールドには計算フィールド$PosX、$PosYが設定されています。
「サイズ(横幅[mm])」フィールドにはプロジェクト上で表示したいイメージの大きさ(ここではペーパー座標系)、「ファイルパス」フィールドにはイメージのファイルパスが設定されています。