Pythonでマクロ:AnimatedImageControlを使ってみる

Libreofficeのダイアログ画面上で一組の画像をアニメーションのように自動的に順次見せるAnimatedImageControlを使ってみた。

このAnimatedImageControlを使ったBasic言語による雛形はここにある。これをPythonに翻訳した。注意点は:

  • insertImageSet(0, 画像ファイルパスの配列)というメソッドがある。Basic言語では画像ファイルパスの配列にはそのまま配列名を書く。Pythonでは画像ファイルパスの配列としてリストやタプルで構成することができるが、リストではダメでタプルで作ったものを使う。
  • インポートしたモジュールで定義されている定数を実引数に使うメソッド、例えばsetPosSize(10, 10, 1000, 900, モジュール定義の定数)。Basic言語ではcom.sun.star.awt.PosSize.POSSIZEのように階層構造をそのまま書く。Pythonではunoモジュールで定義されいる関数を使う。つまりuno.getConstantByName(“com.sun.star.awt.PosSize.POSSIZE”)

【マクロ】


#coding: utf-8
import uno
import screen_io as ui
import unohelper

def python_macro_clipart_anim(*arg):
#
#シート
  doc = XSCRIPTCONTEXT.getDocument()
  sheet = doc.Sheets[0]
  #データのある行数を調べる
  sRange = sheet.getCellRangeByName("A1")
  sCursor=sheet.createCursorByRange(sRange)
  sCursor.collapseToCurrentRegion()
  MaxDataRow = sCursor.Rows.Count-1
  ui.Print(MaxDataRow)
  items=[]
  imageURLs=[]
  for  i in range(MaxDataRow):
    item = sheet.getCellByPosition(0, i+1 ).String
    filePath = sheet.getCellByPosition(1, i+1 ).String
    #ui.Print(item)
    #ui.Print(filePath)
    items.append(item)
    imageURLs.append(uno.systemPathToFileUrl(filePath))
  imageURLsT=tuple(imageURLs)
#
#ダイアログ
  ctx = XSCRIPTCONTEXT.getComponentContext()
  smgr = ctx.getServiceManager()
  dialogM = smgr.createInstance('com.sun.star.awt.UnoControlDialogModel')
  # Size of DialogM
  dlgWth = 500
  dlgHgt = 400
  dialogM.Width = dlgWth
  dialogM.Height = dlgHgt
  dialogM.Title = "クリップアート・アニーション"
#ダイアログの生成とモデルの登録
  dialog = smgr.createInstance('com.sun.star.awt.UnoControlDialog')
  dialog.setModel(dialogM)
#
#
  animCtrlModel = smgr.createInstance('com.sun.star.awt.AnimatedImagesControlModel')
  animCtrlModel.insertImageSet(0, imageURLsT)
  animCtrlModel.StepTime = 1000		
  animCtrlModel.AutoRepeat = False
  animCtrlModel.ScaleMode = 1
#アニメーション・コントロールの登録
  animateCtrl = smgr.createInstance('com.sun.star.awt.AnimatedImagesControl')
  animateCtrl.setModel(animCtrlModel)
#
  dialog.addControl("animated", animateCtrl)
  POSSIZE = uno.getConstantByName("com.sun.star.awt.PosSize.POSSIZE")
  animateCtrl.setPosSize(10, 10, 1000, 900, POSSIZE)
#
#窓の生成そしてこの窓をダイアログ画面として使う
  window = smgr.createInstance('com.sun.star.awt.Toolkit')
  dialog.createPeer(window,None)		# None : OK / none : NG
#
  animateCtrl.startAnimation()

  dialog.execute()
  dialog.dispose()

属性StepTime=1000で個々画像を一秒間表示するはずだがこの値を変えて表示時間に変化はない。また属性AutoRepeat = Falseで一組の画像の表示は一度のはずだが繰り返し表示される。

粟(アワ)と吉備(キビ)そしてMillet

紀元前4000年ごろの金石併用時代のウクライナ周辺の考古学の本(英文)を読んでいると出土した陶器の破片に穀物の種による圧痕があり当時の栽培植物が推定できるという記述によく遭遇する。その栽培植物の一つにMillet(英語)がある。このMilletは英和辞書では①アワ(粟)、②キビ(吉備)となっている。併記されている学名がPanicum sativumとなっていることからこの植物はキビであることがわかる。

キビはインド原産であるが、アワは中央アジア、インド亜大陸などが原産地となっていてキビ以上に人類の食料として重要であったことが示唆されている、古代中国では北の地方ではアワが主食であった由。「米」という漢字も本来はアワを示す文字であったといわれている。米は華南のものであった。西から来た「米」が粟だったのかもしれない。

 

Pythonでマクロ:ImageControlでクリップアートのカタログを作成

ダイアログの部品の一つにImageControlがある。ダイアログに複数の画像を表示する機能を持ったコントロールである。いろんな使い道がありそうであるがここでは多数のクリップアートを表示する一種のカタログを作ってみることにする。

クリップアート・カタログ

上図のようにCalcのシート上にクリップアートのタイトルと画像ファイルへのpathが書かれたものがあるとする。マクロではこのシート上のデータを読み込んでダイアログ上にこれらのクリップアートが閲覧できる一種のカタログを作る。

ImageControlの詳細はここにある。特に重要な属性は

  • ImageURL:イメージデータのある場所をURL形式で指定する。
  • ScaleMode:ダイアログ上の決められた枠にどのように画像を表示するかを指定する。この値が2であると兎に角画像をこの枠に納めて表示する(ANISOTROPIC)。この値が1であると画像のアスペクト比を保持して表示する(ISOTROPIC)。

ファイルpathのURL形式への変換(またはその逆)はPythonでは以下のunoモジュールが使える:

 path = "/home/foo/Documents/file.odt"
url = uno.systemPathToFileUrl(path)
path = uno.fileUrlToSystemPath(url)

カタログはダイアログ画面に納まらないので垂直スクロールの機能を付ける。

【実行画面】

カタログ最初の画面
カタログ末尾の画面

 

 

 

 

 

 

 

 

【マクロ】


#coding: utf-8
import uno
import screen_io as ui
import unohelper
from com.sun.star.awt import XActionListener
from com.sun.star.awt import XAdjustmentListener

#「スクロールバー」の処理
class MyAdjustmentListener(unohelper.Base, XAdjustmentListener):
  def __init__(self, dlgHgt, catHgt, labs, imcs):
    self.labs = labs
    self.imcs = imcs
    self.scrollVMax=100
    self.dlgHgt=dlgHgt
    self.catHgt=catHgt
    self.labsPositionY0 = []
    self.imcsPositionY0 = []
    for i, lab in enumerate(labs):
      print(lab.PositionY, imcs[i].PositionY)
      self.labsPositionY0.append(lab.PositionY)
      self.imcsPositionY0.append(imcs[i].PositionY)
  def adjustmentValueChanged(self, event):
    ratio = event.Value/self.scrollVMax
    print(ratio)
    for i,lab in enumerate(self.labs):
      lab.PositionY = self.labsPositionY0[i]-(self.catHgt - self.dlgHgt)*ratio
      self.imcs[i].PositionY = self.imcsPositionY0[i]-(self.catHgt - self.dlgHgt)*ratio
    #print(event.Type)
    #print(event.Value)

def python_macro_clipart(*arg):
#
#シート
  doc = XSCRIPTCONTEXT.getDocument()
  sheet = doc.Sheets[0]
  #データのある行数を調べる
  sRange = sheet.getCellRangeByName("A1")
  sCursor=sheet.createCursorByRange(sRange)
  sCursor.collapseToCurrentRegion()
  MaxDataRow = sCursor.Rows.Count-1
  ui.Print(MaxDataRow)
  items=[]
  filePaths=[]
  for  i in range(MaxDataRow):
    item = sheet.getCellByPosition(0, i+1 ).String
    filePath = sheet.getCellByPosition(1, i+1 ).String
    #ui.Print(item)
    #ui.Print(filePath)
    items.append(item)
    filePaths.append(filePath)
#
#ダイアログ
  ctx = XSCRIPTCONTEXT.getComponentContext()
  smgr = ctx.getServiceManager()
  dialogM = smgr.createInstance('com.sun.star.awt.UnoControlDialogModel')
  # Size of DialogM
  dlgWth = 150
  dlgHgt = 200
  dialogM.Width = dlgWth
  dialogM.Height = dlgHgt
  dialogM.Title = "クリップアート・カタログ"
#

#コントロールの作成・登録
  tabIndex = 0 
#スクロールバー
  scb1 = dialogM.createInstance('com.sun.star.awt.UnoControlScrollBarModel')
  tabIndex += 1
  scrollVMin=0
  scrollVMax=100
  scb1.Name = 'ScrollBar'
  scb1.TabIndex = tabIndex
  scb1.PositionX = dlgWth-10
  scb1.PositionY = 0
  scb1.Width = 10
  scb1.Height = dlgHgt
  scb1.Orientation=1
  scb1.ScrollValueMin = scrollVMin
  scb1.ScrollValueMax = scrollVMax
  scb1.LiveScroll= 1
  dialogM.insertByName('ScrollBar', scb1)
#タイトル・画像の登録
  imageX = 100
  imageY = int(imageX*3/4)
  labs=[]
  imcs=[]
  for i in range(MaxDataRow):
    #タイトル
    lab2 = dialogM.createInstance('com.sun.star.awt.UnoControlFixedTextModel')
    labY=10+(imageY+10+10)*i
    tabIndex += 1
    lab2.Name = items[i]
    lab2.TabIndex = tabIndex
    lab2.PositionX =10
    lab2.PositionY =labY
    lab2.Width = dlgWth - 10
    lab2.Height = 10
    lab2.Label = items[i]
    lab2.Align = 0					# 0 : Left / 1 : Center / 2 : Right
    lab2.Border = 0
    dialogM.insertByName(items[i], lab2)
    labs.append(lab2)
    #画像
    imc2 = dialogM.createInstance('com.sun.star.awt.UnoControlImageControlModel')
    imcY = labY+10
    tabIndex += 1
    imc2.Name = items[i]
    imc2.TabIndex = tabIndex
    imc2.PositionX = 10
    imc2.PositionY = imcY
    imc2.Width = imageX
    imc2.Height = imageY
    imc2.ImageURL = uno.systemPathToFileUrl(filePaths[i])
    imc2.ScaleMode = 1
    dialogM.insertByName(items[i]+'image', imc2)
    imcs.append(imc2)
#最終的なチェックボックス表の高さ
  catHgt=imcY + (imageY + 10)

# Create the dialog and set the model
#ダイアログの生成とモデルの登録
  dialog = smgr.createInstance('com.sun.star.awt.UnoControlDialog')
  dialog.setModel(dialogM)
#コントロールの登録
  cmdScb1 = dialog.getControl('ScrollBar')
#エヴェント監視(スクロールバー)
  scb1_listener = MyAdjustmentListener(dlgHgt, catHgt, labs, imcs)
  cmdScb1.addAdjustmentListener(scb1_listener)
#
#窓の生成そしてこの窓をダイアログ画面として使う
  window = smgr.createInstance('com.sun.star.awt.Toolkit')
  dialog.createPeer(window,None)		# None : OK / none : NG
#
  dialog.execute()
  dialog.dispose()

 

ノーベル医学・生理学賞:温度と触覚の受容体発見の2氏

今朝の新聞の記事のタイトルである。

熱いものに触ると熱く感じたり、ものを掴むとものの感触がえられるのは神経細胞の末端にその刺激を感ずる受容体があるからである。

今年のノーベル医学・生理学賞はこれら受容体を発見したデービット・ジュリアス米カリフォルニア大学教授と米ハワード・ヒューズ医学研究所のアダム・バタフーティアン博士が受賞した。

基礎的な研究が受賞したことは大変に喜ばしいことである。

 

ウシにシマウマ模様を描いてみた

今朝のラジオの地方ニュースである。

仙台にあるウシの放牧場で放牧しているウシに蝿などが集るのを減らす試みとして放牧しているウシに顔料でシマウマのような縞模様を描いてみた。

虫を追い払う仕草の頻度は模様を付けていないウシと比較すると7割程度減少するという結果になった由。有効らしい。ただ同じ実験の二回目ではこの値は3割と落ちてくる。虫も学習しているのかもしれない。

因みのシマウマの縞模様は多くの人の興味を引くらしくその効果については実に多くの説がある。詳しくはここを参照してもらいたい。

大英博物館:北斎の「失われた作品」初公開

今朝の新聞の記事のタイトルである。

葛飾北斎の特別展が30日から大英博物館で始まる。北斎の「失われた作品」と言われた未公開作品100点余りが世界で初めて公開される。北斎の未出版の図鑑「万物絵本大全図」の下絵(版画になる前の絵)103点が中心となっている。

展示作品の一部(大英博物館)

展示作品の一部(大英博物館)

Pythonでマクロ:スクロールバーの実装

Pythonでマクロ:チェックボックス再論ではダイアログ上にチェックボックスを自動的に作成する問題を考えた。チェックボックスが多くなるとチェックボックスがダイアログ画面に納まらなくなる。(垂直)スクロールバーの出番である。

スクロールバーのモデルの詳細はここにある。

スクロールバーのツマミを動かすと
イヴェントが発生するがこのイヴェントの監視とイヴェント処理メッソド(adjustmentValueChanged)の詳細はここにある。

チェックボックスは上図のようにダイアログ画面に納まらない縦長の紙に書かれていると想像してみる。このイヴェント処理メッソドではスクロールバーのツマミの位置の値(ScrollValue)を使ってこの縦長の紙の方を動かして紙のどの部分をダイアログ画面で見せるかを計算し個々のチェックボックスのダイアログ画面上の座標を変えてやる。

実行例の画像

最初のダイアログ画面
最後の外アログ画面

スクロール・ツマミの動きに対してダイアログ画面をスムーズに変化させるにはスクロール属性LiveScrollをtrueにしておくとよい。

最後にマクロ本体を載せておく:


#coding: utf-8
import uno
import screen_io as ui
import unohelper
from com.sun.star.awt import XActionListener
from com.sun.star.awt import XAdjustmentListener

#「スクロールバー」の処理
class MyAdjustmentListener(unohelper.Base, XAdjustmentListener):
  def __init__(self, dlgHgt, ckbxsHgt, ckbxs):
    self.ckbxs = ckbxs
    self.scrollVMax=100
    self.dlgHgt=dlgHgt
    self.ckbxsHgt=ckbxsHgt
    self.ckbxPositionY0 = []
    for ckbx in ckbxs:
      print(ckbx.PositionY)
      self.ckbxPositionY0.append(ckbx.PositionY)
  def adjustmentValueChanged(self, event):
    ratio = event.Value/self.scrollVMax
    print(ratio)
    for i,ckbx in enumerate(self.ckbxs):
      ckbx.PositionY = self.ckbxPositionY0[i]-(self.ckbxsHgt - self.dlgHgt)*ratio
      print( i,  self.ckbxPositionY0[i], ckbx.PositionY)
    #print(event.Type)
    #print(event.Value)
#「完了」ボタンの処理
class FinishedListener(unohelper.Base, XActionListener):
  def __init__(self, ckbxs, sheet):
    self.ckbxs = ckbxs
    self.sheet=sheet
  def actionPerformed(self, evnt):
    for i,ckbx in enumerate(self.ckbxs):
      if(ckbx.State):
        self.sheet.getCellByPosition(1, i+1 ).String = '○'
      #ui.Print(ckbx.State)
#「リセット」ボタンの処理
class ResetListener(unohelper.Base, XActionListener):
  def __init__(self, ckbxs):
    self.ckbxs = ckbxs
  def actionPerformed(self, evnt):
    for ckbx in self.ckbxs:
      ckbx.State=0

def python_macro_scbar(*arg):
#
#シート
  doc = XSCRIPTCONTEXT.getDocument()
  sheet = doc.Sheets[0]
  #データのある行数を調べる
  sRange = sheet.getCellRangeByName("A1")
  sCursor=sheet.createCursorByRange(sRange)
  sCursor.collapseToCurrentRegion()
  MaxDataRow = sCursor.Rows.Count-1
  ui.Print(MaxDataRow)
  items=[]
  for  i in range(MaxDataRow):
    item = sheet.getCellByPosition(0, i+1 ).String
    #ui.Print(item)
    items.append(item)
#
#ダイアログ
  ctx = XSCRIPTCONTEXT.getComponentContext()
  smgr = ctx.getServiceManager()
  dialogM = smgr.createInstance('com.sun.star.awt.UnoControlDialogModel')
  # Size of DialogM
  dlgWth = 150
  dlgHgt = 150
  dialogM.Width = dlgWth
  dialogM.Height = dlgHgt
  dialogM.Title = "選択ダイアログ"
#

#コントロールの作成・登録
#ラベル
  lab1 = dialogM.createInstance('com.sun.star.awt.UnoControlFixedTextModel')
  tabIndex = 0
  lab1.Name = 'FixedLabel'
  lab1.TabIndex = tabIndex
  lab1.PositionX =0
  lab1.PositionY =0
  lab1.Width = dlgWth - 10
  lab1.Height = 10
  lab1.Label = "選択(複数)してください。"
  lab1.Align = 1					# 0 : Left / 1 : Center / 2 : Right
  lab1.Border = 0
  lab1.TextColor = 0xff0000
  lab1.Enabled = 1
  dialogM.insertByName('FixedLabel', lab1)
#スクロールバー
  scb1 = dialogM.createInstance('com.sun.star.awt.UnoControlScrollBarModel')
  tabIndex += 1
  scrollVMin=0
  scrollVMax=100
  scb1.Name = 'ScrollBar'
  scb1.TabIndex = tabIndex
  scb1.PositionX = dlgWth-10
  scb1.PositionY = 0
  scb1.Width = 10
  scb1.Height = dlgHgt
  scb1.Orientation=1
  scb1.ScrollValueMin = scrollVMin
  scb1.ScrollValueMax = scrollVMax
  scb1.LiveScroll= 1
  dialogM.insertByName('ScrollBar', scb1)
#ボタン
  btn1 = dialogM.createInstance('com.sun.star.awt.UnoControlButtonModel')
  tabIndex += 1
  btn1.Name = 'OkBtn'
  btn1.TabIndex = tabIndex
  btn1.PositionX = dlgWth-50
  btn1.PositionY = dlgHgt/2 - 20
  btn1.Width = 32
  btn1.Height = 10
  btn1.Label = '完了'
  btn1.PushButtonType = 0		# 1 : OK
  dialogM.insertByName('OkBtn', btn1)
#
  btn2 = dialogM.createInstance('com.sun.star.awt.UnoControlButtonModel')
  tabIndex += 1
  btn2.Name = 'ResetBtn'
  btn2.TabIndex = tabIndex
  btn2.PositionX = dlgWth-50
  btn2.PositionY = dlgHgt/2 + 20
  btn2.Width = 32
  btn2.Height = 10
  btn2.Label = 'リセット'
  btn2.PushButtonType = 0		# 1 : OK
  dialogM.insertByName('ResetBtn', btn2)
#チェックボックス
  ckbxs=[]
  for i in range(MaxDataRow):
    ckbx = dialogM.createInstance('com.sun.star.awt.UnoControlCheckBoxModel')
    tabIndex += 1
    ckbxsHgt = 15+15*i+10
    ckbx.Name = items[i]
    ckbx.TabIndex = tabIndex
    ckbx.PositionX = 10
    ckbx.PositionY = ckbxsHgt
    ckbx.Width = 100
    ckbx.Height = 15
    ckbx.Label = items[i]
    # Dialog Modelの仕様に CheckBox Button1 の仕様を設定
    dialogM.insertByName(items[i], ckbx)
    ckbxs.append(ckbx)
  #最終的なチェックボックス表の高さ
  ckbxsHgt=ckbxsHgt+15

# Create the dialog and set the model
#ダイアログの生成とモデルの登録
  dialog = smgr.createInstance('com.sun.star.awt.UnoControlDialog')
  dialog.setModel(dialogM)
#コントロールの登録
  cmdBtn1 = dialog.getControl('OkBtn')
  cmdBtn2 = dialog.getControl('ResetBtn')
  cmdScb1 = dialog.getControl('ScrollBar')
#エヴェント監視(ボタンが押されたとき)
  btn1_listener = FinishedListener(ckbxs, sheet)
  cmdBtn1.addActionListener(btn1_listener)
  btn2_listener = ResetListener(ckbxs)
  cmdBtn2.addActionListener(btn2_listener)
#エヴェント監視(スクロールバー)
  scb1_listener = MyAdjustmentListener(dlgHgt, ckbxsHgt, ckbxs)
  cmdScb1.addAdjustmentListener(scb1_listener)
#
#窓の生成そしてこの窓をダイアログ画面として使う
  window = smgr.createInstance('com.sun.star.awt.Toolkit')
  dialog.createPeer(window,None)		# None : OK / none : NG
#
  dialog.execute()
  dialog.dispose()

Pythonでマクロ:チェックボックス再論

アンケート調査のように多数の質問項目がありそれにチェックを入れるような状況を想定したLibreofficeのマクロをPythonで作る問題である。

以前にはチェック項目が少ないばあいのマクロを紹介した。チェック項目が多くなると手動でチェック欄を設定するが大変になる。

問題はこうだ:

Calcシートサンプル
Calcシートサンプル

画像のようにLibreofficeのCalcのシート上に多くのチェック項目が書かれているとする。これらにチェック欄を設定(フォームやダイアログ上のチェックボックス)することである。

ここでは

ダイアログのマクロでCalcシート上のチェック項目を読み込み必要な個数のチェックボックスをダイアログの中に自動的に作る。ユーザはこのチェックボックスに必要なチェックを入れ「完了」ボタンを押すとその結果がシートに反映される。「リセット」ボタンは全てのチェック欄のリセットに使う。

マクロの実行画面
マクロの実行画面

マクロの本体は長いので最後に載せた。このマクロはシート上のチェック項目の多寡に拘わらず使えるが、チェック項目は多くなったときにはチェックボックスがダイアログ画面をはみ出してしまう。ダイアログに縦スクロールを付けてダイアログ画面を制御できればよいわけであるがこれは未実装である。

【マクロ】

#coding: utf-8>

import uno
import screen_io as ui
import unohelper
from com.sun.star.awt import XActionListener

#「完了」ボタンの処理
class FinishedListener(unohelper.Base, XActionListener):
  def __init__(self, ckbxs, sheet):
    self.ckbxs = ckbxs
    self.sheet=sheet
  def actionPerformed(self, evnt):
    for i,ckbx in enumerate(self.ckbxs):
      if(ckbx.State):
        self.sheet.getCellByPosition(1, i+1 ).String = '○'
      #ui.Print(ckbx.State)
#「リセット」ボタンの処理
class ResetListener(unohelper.Base, XActionListener):
  def __init__(self, ckbxs):
    self.ckbxs = ckbxs
  def actionPerformed(self, evnt):
    for ckbx in self.ckbxs:
      ckbx.State=0

def python_macro_ckbx(*arg):
#
#シート
  doc = XSCRIPTCONTEXT.getDocument()
  sheet = doc.Sheets[0]
  #データのある行数を調べる
  sRange = sheet.getCellRangeByName("A1")
  sCursor=sheet.createCursorByRange(sRange)
  sCursor.collapseToCurrentRegion()
  MaxDataRow = sCursor.Rows.Count-1
  ui.Print(MaxDataRow)
  items=[]
  for  i in range(MaxDataRow):
    item = sheet.getCellByPosition(0, i+1 ).String
    #ui.Print(item)
    items.append(item)
#
#ダイアログ
  ctx = XSCRIPTCONTEXT.getComponentContext()
  smgr = ctx.getServiceManager()
  dialogM = smgr.createInstance('com.sun.star.awt.UnoControlDialogModel')
  # Size of DialogM
  dlgWth = 150
  dlgHgt = 200
  dialogM.Width = dlgWth
  dialogM.Height = dlgHgt
  dialogM.Title = "選択ダイアログ"
#

#コントロールの作成・登録
#ラベル
  lab1 = dialogM.createInstance('com.sun.star.awt.UnoControlFixedTextModel')
  tabIndex = 0
  lab1.Name = 'FixedLabel'
  lab1.TabIndex = tabIndex
  lab1.PositionX = 10
  lab1.PositionY = 10
  lab1.Width = 100
  lab1.Height = 10
  lab1.Label = "選択(複数)してください。"
  lab1.Align = 1					# 0 : Left / 1 : Center / 2 : Right
  lab1.Border = 0
  lab1.TextColor = 0xff0000
  lab1.Enabled = 1
  dialogM.insertByName('FixedLabel', lab1)
#ボタン
  btn1 = dialogM.createInstance('com.sun.star.awt.UnoControlButtonModel')
  tabIndex += 1
  btn1.Name = 'OkBtn'
  btn1.TabIndex = tabIndex
  btn1.PositionX = dlgWth-50
  btn1.PositionY = dlgHgt/2 - 20
  btn1.Width = 32
  btn1.Height = 10
  btn1.Label = '完了'
  btn1.PushButtonType = 0		# 1 : OK
  dialogM.insertByName('OkBtn', btn1)
#
  btn2 = dialogM.createInstance('com.sun.star.awt.UnoControlButtonModel')
  tabIndex += 1
  btn2.Name = 'ResetBtn'
  btn2.TabIndex = tabIndex
  btn2.PositionX = dlgWth-50
  btn2.PositionY = dlgHgt/2 + 20
  btn2.Width = 32
  btn2.Height = 10
  btn2.Label = 'リセット'
  btn2.PushButtonType = 0		# 1 : OK
  dialogM.insertByName('ResetBtn', btn2)
#チェックボックス
  ckbxs=[]
  for i in range(MaxDataRow):
    ckbx = dialogM.createInstance('com.sun.star.awt.UnoControlCheckBoxModel')
    tabIndex += 1
    ckbx.Name = items[i]
    ckbx.TabIndex = tabIndex
    ckbx.PositionX = 10
    ckbx.PositionY = 15+15*i+10
    ckbx.Width = 100
    ckbx.Height = 15
    ckbx.Label = items[i]
    # Dialog Modelの仕様に CheckBox Button1 の仕様を設定
    dialogM.insertByName(items[i], ckbx)
    ckbxs.append(ckbx)

# Create the dialog and set the model
#ダイアログの生成とモデルの登録
  dialog = smgr.createInstance('com.sun.star.awt.UnoControlDialog')
  dialog.setModel(dialogM)
#コントロールの登録
  cmdBtn1 = dialog.getControl('OkBtn')
  cmdBtn2 = dialog.getControl('ResetBtn')
#エヴェント監視(ボタンが押されたとき)
  btn1_listener = FinishedListener(ckbxs, sheet)
  cmdBtn1.addActionListener(btn1_listener)
  btn2_listener = ResetListener(ckbxs)
  cmdBtn2.addActionListener(btn2_listener)
#
#窓の生成そしてこの窓をダイアログ画面として使う
  window = smgr.createInstance('com.sun.star.awt.Toolkit')
  dialog.createPeer(window,None)		# None : OK / none : NG
#
  dialog.execute()
  dialog.dispose()

ギルガメシュ叙事詩の粘土板:30年ぶりイラクへ帰還

今朝の新聞の記事のタイトルである。

メソポタミア文明を象徴するギルガメシュ叙事詩の粘土板が30年ぶりに郷土のイラクに帰還されたというニュースである。

この粘土板は元々イラクの博物館にあったものであるが、湾岸戦争のときに盗難にあった。幾多の変遷を経て米国ワシントンの博物館に持ち込まれた。

返還式ではイラクのフンマーディ文化相は「イラク社会に自尊心や自信を取り戻したに等しい」と語った。

このギルガメシュ叙事詩は紀元前1500年ごろのもので人類最古の文学と考えられている。