Pythonでマクロ(付録):少しだけ実用的かな

LibreOfficeのマクロをPythonで書くことを調べてきたが、この付録ではほんの少しだけ実用的になるかなというマクロの話である。
Calcのシートにデータを入力(例えば住所録)するときにはプルダウン・メニュの「ツール」->「フォーム」を選ぶと入力窓が出てきて入力ができる。しかしこれでも機械的だと思われる。

そこでベタ書き用の入力窓が出てきて適当に住所をベタ書きするとそれをシートに転写してくれるようなマクロを作ってみた。
【マクロ】


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

class MyKeyListener(unohelper.Base, XKeyListener):
  def __init__(self, sheet, textf1):
    self.sheet = sheet
    self.textf1 = textf1
    self.row = 0
  def keyPressed( self,  event ):
    k = event.KeyCode
    c = event.KeyChar.value 
    mods = event.Modifiers
    # mods are additive
    # 0 - None
    # 1 - Shift
    # 2 - Ctrl
    # 4 - Alt
    # 8 - Super_R
    print(k, c, mods)
    if k == 1282:  #キー
      #表への書き出し
      self.row+=1
      print(self.row)
      textd = self.textf1.Text
      print(textd)
      sheetd=textd.split("\n")
      print(len(sheetd))
      for i, celld in enumerate(sheetd):
        self.sheet.getCellByPosition(i,self.row).String=celld 
      self.textf1.Text = ''

def createDialog(*args):
  ctx = XSCRIPTCONTEXT.getComponentContext()
  smgr = ctx.getServiceManager()
  dp = smgr.createInstanceWithContext("com.sun.star.awt.DialogProvider", ctx)
  dialog = dp.createDialog("vnd.sun.star.script:Standard.Dialog5?location=application")
#表
  doc = XSCRIPTCONTEXT.getDocument()
  sheet = doc.Sheets[0]
#コントロールの登録
  textf1 =  dialog.getControl("TextField1")
#エヴェント監視(Enterキーを検出)
  textf1_listener = MyKeyListener(sheet, textf1)
  textf1.addKeyListener(textf1_listener)
  dialog.execute()
  dialog.dispose()
文字入力窓を持つダイアログ

このマクロでは1つの入力の終わりはキーで行ったが、マウスをその窓に入れると終わりとするヴァージョンも作ってみた。
【マクロ】


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

class MyMouseListener(unohelper.Base, XMouseListener):
  def __init__(self, sheet, textf1):
    self.sheet = sheet
    self.textf1 = textf1
    self.row = 0
  def mouseEntered( self,  event ):
    #表への書き出し
    self.row+=1
    print(self.row)
    textd = self.textf1.Text
    print(textd)
    sheetd=textd.split("\n")
    print(len(sheetd))
    for i, celld in enumerate(sheetd):
      self.sheet.getCellByPosition(i,self.row).String=celld 
    self.textf1.Text = ''
    return False
  def mouseExited(self, event):
    return False
  def mousePressed(self, event):
    return False
  def mouseReleased(self, event):
    return False

def createDialog(*args):
  ctx = XSCRIPTCONTEXT.getComponentContext()
  smgr = ctx.getServiceManager()
  dp = smgr.createInstanceWithContext("com.sun.star.awt.DialogProvider", ctx)
  dialog = dp.createDialog("vnd.sun.star.script:Standard.Dialog5?location=application")
#表
  doc = XSCRIPTCONTEXT.getDocument()
  sheet = doc.Sheets[0]
#コントロールの登録
  textf1 =  dialog.getControl("TextField1")
#エヴェント監視(Enterキーを検出)
  textf1_listener = MyMouseListener(sheet, textf1)
  textf1.addMouseListener(textf1_listener)
  dialog.execute()
  dialog.dispose()

この例では意図しないタイミングでマウスを窓に入れてしまうのでインタフェースとしてはオリジナルのものがよいと思われる。

パノラマ風写真展:「組写真の世界」

パノラマ風写真展の第二弾。組写真の展示である。

  • 組写真は別フーレムのギャラリーとして表示するようにした。その際余計なリンクが表示されないようにした
  • 写真に繋がるホットスポットを

で示し、それと分るような画像にした。

新ニュートリノを探せ:茨城J-PARCで実験開始

今朝の新聞のサイセンス記事のタイトルである。

素粒子ニュートリノには「電子ニュートリノ」、「ミューニュートリノ」そして「タウニュートリノ」の3種類が知られているが、他にもあるらしい。それが「ステライルニュートリノ」(不毛ニュートリノ)である。

既存の三種のニュートリノはニュートリノ振動と呼ばれる現象で相互変換することが知られていてニュートリノに質量がある証拠とされている。

ステライルニュートリノもニュートリノ振動の際に現れるもので質量は既存のものより遥かに大きい可能性があり、見つかれば宇宙のダークマターの有力な候補になる。

これを見つける実験が大強度陽子加速器施設(J-PARC)で始まった。関連のプレスリリースはここ

パノラマ風写真展:「スクエア・フォーマット(6×6)の世界」

きれいなパノラマ風景を背景にして写真をみる試みです。

  • 画面左上の「正方形」をクリックすると全画面表示になります
  • 画面上でマウスでドラックするとその方向に回転する。
  • 画面上の「矢印」はパノラマシーンの切り替え、「info」は展示写真へ、クリックすると実行される。
  • マウスをマークの上の置くと「吹き出し」の説明がでる。

カンガルー描いた最古の絵:1万7千年前の岩絵と判明

今日の朝刊の記事のタイトルである。

オーストラリアでも後期旧石器時代の人々が描いた絵がみつかった。

西オーストラリア州北部のキンバリー地域にはオーストラリアの先住民のアポリジニーによって岩の表面に絵が描かれている。トカゲ、ヘビ、そしてカンガルーなどが描かれている。

画像はここ

この絵の年代が始めて判明した。

メルボルン大学の研究者たちは絵の表面にあるハチの巣の残骸などの年代測定をし、絵の描かれた年代を推定した。

これらの岩絵は1万7000年前ごろから1万4000年前ごろに描かれたということが初めて判明、後期旧石器時代の人々が描いたものである。