Hatena::Groupuwsc

CX's UWSC Diary

Windows 自動化ツール「UWSC」を使って何が出来るかを探求する日記です。構文をマスターしたい方はこちらをどうぞ→UWSC 基礎文法最速マスター
こくばん.in」投稿サンプル
アインシュタイン マリオとクッパ 千円札(見本) 猫
eピアノ」「Google Moog」自動演奏サンプル
eピアノ Google Moog
はてなロクロ」投稿サンプル
マリオ テトリス デフォルトさん はてなロゴ 全自動マリオ 3Dプロッタ
はてなハイク」投稿サンプル
デフォルトさん カラーパレット カラーパレット マリオ ルイージ カラーパレット 日本地図
 | 

2008-03-26はてなハイク - 日本地図プロッター for Wacom Color

日本地図プロッター for Wacom Color

| 03:58 |  日本地図プロッター for Wacom Color - CX's UWSC Diary を含むブックマーク はてなブックマーク -  日本地図プロッター for Wacom Color - CX's UWSC Diary

  • ソース

hatena_haiku_japan_map_plotter_for_wacom_color.uws [ダウンロード]

hatena_haiku_japan_map_plotter_for_wacom_color.bmp [ダウンロード]

// ---------------------------------------------------------
// File : hatena_haiku_japan_map_plotter_for_wacom_color.uws
// ---------------------------------------------------------
// <概要>
// ・このスクリプトはWindows 自動化ソフト「UWSC」を使った「はてなハイク」自動化スクリプトです。
// ・このスクリプトは「はてなハイク」で「日本地図」を生成するスクリプトです。
// 
// <使用上の注意>
// ・ブラウザは最大化にしてご利用ください。
// ・キャンバスの左上の座標(X,Y座標)をあらかじめ設定しておく必要があります。
// ・初期設定値
//      Public g_x = 263 … キャンバスX座標
//      Public g_y = 376 … キャンバスY座標
// ・以下の環境でスクリプトの動作確認済みです。
//   ・解像度:1280x1024, Windows XP(クラシックモード) + IE7(ウィンドウ最大化。タスクバーは下に配置)
// ・中断する場合は [Alt] + [F2] です。動作中にウィンドウを切り替えないでください。誤動作します。
//
// <使用ツール>
// ■ UWSC Free版 Ver4.4
// http://www.uwsc.info/download.html
// 
// <スクリプトを作成した人>
// id:cx20
// 
// <変更履歴>
// 2008/03/26 Ver0.01 とりあえず版作成。

Option Explicit

Public g_x = 263       // キャンバスX座標(左上の座標)
Public g_y = 377       // キャンバスY座標(左上の座標)
//Public g_y = 295       // キャンバスY座標(左上の座標)
Public g_height = 100  // キャンバスの幅(未使用)
Public g_width = 100   // キャンバスの高さ(未使用)
//Public g_r = 3         // 円の半径
Public g_r = 5         // 円の半径
Public g_pi = 3.14159265 // PI
Public g_winID_haiku = 0
//Public g_wait = 5
Public g_wait = 0

// ADO
Const adStateClosed = 0
Const adStateOpen = 1
Const adInteger = 3

// 「ペイント」のウィンドウIDを取得
Public g_winID_mspaint = GETID("ペイント")
Ifb g_winID_mspaint = -1 Then
   MsgBox( "ペイントが起動していない為、スクリプトを終了します。" )
   ExitExit
EndIf

g_winID_haiku = はてなハイクのウィンドウIDを取得()
Ifb g_winID_haiku = -1 Then
    MsgBox( "はてなハイク が起動していない為、スクリプトを終了します。" )
    ExitExit
EndIf

// 「はてなハイク」ページをアクティブ化
ACW(g_winID_haiku)

Main()

Procedure Main()
    Public HashTbl baseColor

    Dim rs
    MakeRecordset( rs )
    
    Dim start_x
    Dim start_y
    Dim width
    Dim height
    //----------------------------------------------
    // 混色を作成
    //----------------------------------------------
    start_x = g_x
    start_y = g_y
    width = 20
    height = 10

    //SetColorTable( baseColor, "白:0,薄:1,灰:2,黒:3,赤:4,茶:5,肌:6,黄:7,緑:8,深:9,青:10,紫:11" )
    SetColorTable( baseColor, "色1:0,色2:1,色3:2" )
    MakeColor_太さの異なる筆で混色を作成( baseColor, start_x, start_y )
    MakeColor_細筆で丸を描いて混色を作成( baseColor, start_x, start_y )

    // 作成した色を取得
    GetColorRecordset( rs, start_x, start_y, width, height )
    
    // 上段で色作成
    start_x = g_x + 20
    start_y = g_y
    width = 300
    height = 18
    MakeColor_線を交差させて混色を作成( baseColor, start_x, start_y, width, height )
    MakeColor_取得した色を用いて混色を作成( rs, start_x, start_y )

    // 作成した色を取得
    GetColorRecordset( rs, start_x, start_y, width, height )
    
    start_x = g_x + 20
    start_y = g_y + 20
    width = 196
    height = 229
    ペイントの内容をはてなハイクで描く( rs, start_x, start_y, width, height )

Fend

Procedure SetColorTable( Var baseColor[], strColorTable )
    baseColor = HASH_REMOVEALL
    Dim strNameValue
    strNameValue = Token( ",", strColorTable )
    Dim strName
    Dim strValue
    While Length(strNameValue) > 0
        strName = Token( ":", strNameValue )
        Print "Name = [" + strName + "], Value = [" + strNameValue + "]"
        baseColor[strName] = Val(strNameValue)
        strNameValue = Token( ",", strColorTable )
    Wend
Fend

Procedure ペイントの内容をはてなハイクで描く( rsPalette, start_x, start_y, width, height )
    // 「ペイント」をアクティブ化
    ACW(g_winID_mspaint)

    Dim rsCanvas
    MakeRecordset( rsCanvas )

    Dim start_pos_x = Status( g_winID_mspaint, ST_CLX ) + 61  // ツールボックスのサイズを考慮
    Dim start_pos_y = Status( g_winID_mspaint, ST_CLY ) + 6   // ツールボックスのサイズを考慮
    
    Dim pos_x
    Dim pos_y

    Dim color
    Dim depth
    Dim x
    Dim y
    Dim color_b
    Dim color_g
    Dim color_r
    Dim color_h
    Dim color_s
    Dim color_v
    For y = 0 To height - 1
        For x = 0 To width - 1
            pos_x = start_pos_x + x
            pos_y = start_pos_y + y
            color = PeekColor( pos_x, pos_y )
            color_b = (color And $FF0000)/(256*256)
            color_g = (color And $00FF00)/(256)
            color_r = (color And $0000FF)
            RGB2HSV( color_r, color_g, color_b, color_h, color_s, color_v )
            depth = Int((color_b + color_g + color_r))
            // 白色の情報は記録しない
            //Ifb color <> $FFFFFF Then
                rsCanvas.AddNew()
                rsCanvas.Fields("color").Value = color
                rsCanvas.Fields("r").Value = color_r
                rsCanvas.Fields("g").Value = color_g
                rsCanvas.Fields("b").Value = color_b
                rsCanvas.Fields("h").Value = color_h
                rsCanvas.Fields("s").Value = color_s
                rsCanvas.Fields("v").Value = color_v
                rsCanvas.Fields("depth").Value = depth
                rsCanvas.Fields("x").Value = x
                rsCanvas.Fields("y").Value = y
                rsCanvas.Update()
            //EndIf
        Next
    Next

    // 「はてなハイク」ページをアクティブ化
    ACW(g_winID_haiku)

    Dim key
    key = キーコードを取得( "N" )
    KBD(key, CLICK,     g_wait)
    
    For y = 0 To height - 1
        For x = 0 To width - 1
            color = GetColorFromCanvasRecordset( rsCanvas, x, y )
            筆の色をパレットから選択( rsPalette, color )
            
            BTN(LEFT,DOWN, start_x + x, start_y + y    , g_wait)
            BTN(LEFT,UP,   start_x + x, start_y + y + 1, g_wait)
        Next
    Next

Fend

Function GetColorFromCanvasRecordset( rs, Var x, Var y )
    Dim color
    Dim strFilter
    strFilter = "x = " + x + " And y = " + y
    rs.Filter = strFilter
    
//    Print "strFilter = [" + strFilter + "]"
    Ifb !rs.Bof() And !rs.Eof() Then
        color = rs.Fields("color").Value
        //Print "x = [" + x + "], y = [" + y + "], color = [" + color + "]"
        Print "x = [" + x + "], y = [" + y + "], color = [" + Format( color, 0, -1 ) + "]"
    EndIf
    
    Result = color
Fend

Procedure 筆の色をパレットから選択( rs, color )
    Dim color_r
    Dim color_g
    Dim color_b

    color_b = (color And $FF0000)/(256*256)
    color_g = (color And $00FF00)/(256)
    color_r = (color And $0000FF)
    Dim strFilter
    //strFilter = "color = " + color
    strFilter = "r >= " + (color_r-5) + " And r <= " + (color_r + 5) + " And " + _
                "g >= " + (color_g-5) + " And g <= " + (color_g + 5) + " And " + _
                "b >= " + (color_b-5) + " And b <= " + (color_b + 5)
    rs.Filter = strFilter
    
    Print "strFilter = [" + strFilter + "]"
    Dim x
    Dim y
    Ifb !rs.Bof() And !rs.Eof() Then
        x = rs.Fields("x").Value
        y = rs.Fields("y").Value
        筆の色をスポイトで選択( x, y )
        Print "x = [" + x + "], y = [" + y + "]"
    EndIf
Fend

Procedure MakeColor_太さの異なる筆で混色を作成( Var baseColor[], start_x, start_y )
    Dim pos_x
    Dim pos_y
    Dim color
    Dim nColors
    nColors = Length(baseColor)
    Dim n
    For n = nColors - 1 To 0 Step -1
        color = baseColor[n, HASH_VAL]
        筆の色を色番号で選択( color )
        Dim i
        For i = 2 To 0 Step -1
            pos_x = start_x + n
            pos_y = start_y + i
            筆の太さを選択( i )
            BTN(LEFT, DOWN, pos_x, pos_y, g_wait)
            BTN(LEFT, UP,   pos_x+1, pos_y+1, g_wait)
        Next
    Next
Fend

Procedure MakeColor_細筆で丸を描いて混色を作成( Var baseColor[], start_x, start_y )
    筆の太さを選択( 0 ) // 細筆
    Dim pos_x
    Dim pos_y
    Dim color
    Dim nColors
    nColors = Length(baseColor)
    Dim tmp_g_r
    tmp_g_r = g_r
    Dim n
    For n = nColors - 1 To 0 Step -1
        color = baseColor[n, HASH_VAL]
        筆の色を色番号で選択( color )
        Dim i
        For i = 2 To 0 Step -1
            pos_x = start_x + n
            pos_y = start_y + i
            g_r = i + 1
            丸を描く( pos_x, pos_y )
        Next
    Next
    g_r = tmp_g_r
Fend


Procedure MakeColor_線を交差させて混色を作成( Var baseColor[], start_x, start_y, width, height )
    Dim color
    Dim nColors
    nColors = Length(baseColor)
    Dim n
    For n = 1 To nColors - 1
        color = baseColor[n, HASH_VAL]
        筆の色を色番号で選択( color )
        BTN(LEFT, DOWN, start_x,       start_y        + n, g_wait)
        BTN(LEFT, UP,   start_x+width, start_y+height - n, g_wait)
        筆の色を色番号で選択( nColors-color )
        BTN(LEFT, DOWN, start_x,       start_y+height - n, g_wait)
        BTN(LEFT, UP,   start_x+width, start_y        + n, g_wait)
    Next
Fend

Procedure MakeColor_取得した色を用いて混色を作成( rs, start_x, start_y )
    rs.MoveFirst
    Dim pos_x
    Dim pos_y
    pos_x = start_x
    pos_y = start_y
    Dim n
    n = -1
    Dim color
    Dim color_r
    Dim color_g
    Dim color_b
    Dim color_h
    Dim color_s
    Dim color_v
    Dim depth
    Dim x
    Dim y
    While !rs.Bof() And !rs.Eof()
        n = n + 1
        x = rs.Fields("x").Value
        y = rs.Fields("y").Value
        筆の色をスポイトで選択( x, y )

        pos_x = start_x + Int( n Mod 100)*3
        pos_y = start_y + Int( n / 100)*3 + Random(3)
        //四角形を描く( pos_x, pos_y )
        丸を描く( pos_x, pos_y )

        rs.MoveNext()
    Wend
Fend

Procedure MakeRecordset( Var rs )
    rs = CreateOleObj("ADODB.Recordset")
    rs.Fields.Append( "color", adInteger )
    rs.Fields.Append( "r", adInteger )
    rs.Fields.Append( "g", adInteger )
    rs.Fields.Append( "b", adInteger )
    rs.Fields.Append( "h", adInteger )
    rs.Fields.Append( "s", adInteger )
    rs.Fields.Append( "v", adInteger )
    rs.Fields.Append( "depth", adInteger )
    rs.Fields.Append( "x", adInteger )
    rs.Fields.Append( "y", adInteger )
    rs.Open
Fend

Procedure TruncateRecordset( Var rs )
    Ifb rs.State() = adStateOpen And rs.RecordCount() > 0 Then
        rs.MoveLast()
        While !rs.Bof() And !rs.Eof()
            rs.Delete()
            rs.MovePrevious()
        Wend
    EndIf
Fend

Procedure GetColorRecordset( Var rs, start_x, start_y, width, height )
    TruncateRecordset( rs )
    
    Dim color
    Dim depth
    Dim x
    Dim y
    Dim color_b
    Dim color_g
    Dim color_r
    Dim color_h
    Dim color_s
    Dim color_v
    For y = start_y to start_y + height
        For x = start_x To start_x + width
            color = PeekColor( x, y )
            color_b = (color And $FF0000)/(256*256)
            color_g = (color And $00FF00)/(256)
            color_r = (color And $0000FF)
            RGB2HSV( color_r, color_g, color_b, color_h, color_s, color_v )
            depth = Int((color_b + color_g + color_r))
            // 白色の情報は記録しない
            Ifb color <> $FFFFFF Then
                rs.AddNew()
                rs.Fields("color").Value = color
                rs.Fields("r").Value = color_r
                rs.Fields("g").Value = color_g
                rs.Fields("b").Value = color_b
                rs.Fields("h").Value = color_h
                rs.Fields("s").Value = color_s
                rs.Fields("v").Value = color_v
                rs.Fields("depth").Value = depth
                rs.Fields("x").Value = x
                rs.Fields("y").Value = y
                rs.Update()
            EndIf
        Next
    Next
    
    SortColorRecordset( rs )
Fend

Procedure SortColorRecordset( rs )
    
    //rs.Sort = "v,s,h,depth,r,g,b"
    rs.Sort = "h,s,v"
    //rs.Sort = "h,v,s"
    //rs.Sort = "v,h,s"
    Dim color
    Dim depth
    // 重複レコードの削除
    rs.MoveLast()
    Dim last_color
    last_color = -1
    While !rs.Bof() And !rs.Eof()
        color = rs.Fields("color").Value
        depth = rs.Fields("depth").Value
        Ifb color = last_color Then
            rs.Delete()    // 重複レコードの場合、カレントレコードを削除
        EndIf
        rs.MovePrevious()
        last_color = color
    Wend
    rs.MoveFirst()
Fend

Procedure ClearCanvas( start_x, start_y, width, height )
    Dim key
    key = キーコードを取得( "L" )
    KBD(key, CLICK,     g_wait)
    
    Dim color
    color = 0 // 白
    筆の色を色番号で選択( color )
    
    Dim x
    Dim y
    For y = start_y To start_y + height
        BTN(LEFT, DOWN, start_x,         y, g_wait)
        BTN(LEFT, UP,   start_x + width, y, g_wait)
    Next
Fend

// <参考>
// http://laputa.cs.shinshu-u.ac.jp/~gtakano/prog3.html
// http://laputa.cs.shinshu-u.ac.jp/~gtakano/RGB2HSV.c
Procedure RGB2HSV( R, G, B, Var H, Var S, Var V )
    Dim Z
    Dim tmp_r
    Dim tmp_g
    DIm tmp_b
    V = max_color( R, G, B )
    Z  = min_color( R, G, B )
    Ifb ( Int(V) <> Int(0.0) ) Then
        S = Int(( V - Z ) / V * 100.00)
    Else
        S = Int(0.0)
    EndIf
    
    Ifb ( Int( V - Z ) <> Int(0) ) Then
        tmp_r = ( V - R ) / ( V - Z )
        tmp_g = ( V - G ) / ( V - Z )
        tmp_b = ( V - B ) / ( V - Z )
    Else
        tmp_r = 0.0
        tmp_g = 0.0
        tmp_b = 0.0
    EndIf
    
    Ifb ( V = R ) Then
        H = Int(60 * ( tmp_b - tmp_g ))        // 60 = PI/3
    ElseIf ( V = G ) Then
        H = Int(60 * ( 2 + tmp_r - tmp_b ))
    Else
        H = Int(60 * ( 4 + tmp_g - tmp_r ))
    EndIf
    
    Ifb ( H < 0.0 ) Then
        H = Int(H + 360)
    EndIf
Fend

Function max_color( r, g, b )
    Dim ret
    Ifb ( r > g ) Then
        Ifb ( r > b ) Then
            ret = r
        Else
            ret = b
        EndIf
    Else
        Ifb ( g > b ) Then
            ret = g
        Else
            ret = b
        EndIf
    EndIf
    Result = ret
Fend

Function min_color( r, g, b )
    Dim ret
    Ifb ( r < g ) Then
        Ifb ( r < b ) Then
            ret = r
        Else
            ret = b
        EndIf
    Else
        IFb ( g < b ) Then
            ret = g
        Else
            ret = b
        EndIf
    EndIf
    Result = ret
Fend

Function はてなハイクのウィンドウIDを取得()
    Dim winID = 0

    // 「はてなハイク」のウィンドウIDを取得(IE6/IE7 版)
    winID = GETID("はてなハイク","IEFrame")
    Ifb winID <> -1 Then
        Result = winID
        Exit
    EndIf
    
    // 「はてなハイク」のウィンドウIDを取得(Firefox 版)
    winID = GETID("はてなハイク","MozillaUIWindowClass")
    Ifb winID <> -1 Then
        Result = winID
        Exit
    EndIf

    Result = winID
Fend

Procedure 塗りつぶし( x, y )
    Dim key
    key = キーコードを取得( "B" )
    KBD(key, CLICK,     g_wait)
    指定座標をクリック( x + g_r, y + g_r )
    key = キーコードを取得( "L" )
    KBD(key, CLICK,     g_wait)
Fend

Function キーコードを取得( strDirection )
    // ■ はてなハイクのお絵かきキーボードショートカット一覧
    // http://d.hatena.ne.jp/hatenahaiku/20080122/1200970790
    Public HashTbl directionTable
    directionTable["C"] = VK_C // 通常のペン
    directionTable["V"] = VK_V // 補完しないペン
    directionTable["B"] = VK_B // バケツツール
    directionTable["L"] = VK_L // ラインツール
    directionTable["1"] = VK_1 // ペンの太さ
    directionTable["2"] = VK_2 // ペンの太さ
    directionTable["3"] = VK_3 // ペンの太さ
    directionTable["0"] = VK_0 // ペンの太さ
    directionTable["N"] = VK_N // アンチエイリアスオフ

    directionTable["→"] = VK_RIGHT
    directionTable["←"] = VK_LEFT
    directionTable["↓"] = VK_DOWN
    directionTable["↑"] = VK_UP

    Result = directionTable[strDirection]
Fend

Function 筆の太さを取得( toolName )
    Public HashTbl toolNameTable
    // 太さ→番号変換
    toolNameTable["細"] = 0  // 細い
    toolNameTable["小"] = 1  // 小
    toolNameTable["中"] = 2  // 中
    toolNameTable["大"] = 3  // 大

    Result = toolNameTable[toolName]

    Print "toolName = [" + toolName + "]"
    Print "tool_no = [" + Result + "]"
Fend

Procedure 筆の太さを選択( nWide )
    Dim x
    Dim y
    Dim nWidth
    x = g_x + 5   // 細筆の位置
    y = g_y - 14  // 細筆の位置
    nWidth = 18   // 筆の位置の間隔
    指定座標をクリック( x + nWidth * nWide, y )
Fend

Procedure 筆の色を色番号で選択( nColor )
    Dim x
    Dim y
    Dim nWidth
    x = g_x + 83  // 白絵の具の位置
    y = g_y - 14  // 白絵の具の位置
    nWidth = 14 // 絵の具の位置の間隔
    指定座標をクリック( x + nWidth * nColor, y )
Fend

Procedure 筆の色をスポイトで選択( x, y )
    Dim key
    key = VK_CTRL
    KBD(key, DOWN,     g_wait*2)
    指定座標をクリック( x, y )
    KBD(key, UP,      g_wait)
Fend

Procedure 指定座標をクリック( x, y )
    BTN( LEFT, DOWN,  x, y, g_wait )
    BTN( LEFT, UP,    x, y, g_wait )
Fend
 |