Hatena::Groupuwsc

CX's UWSC Diary

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

2008-03-16はてなハイク - パレットメーカー

パレットメーカー

| 22:19 |  パレットメーカー - CX's UWSC Diary を含むブックマーク はてなブックマーク -  パレットメーカー - CX's UWSC Diary

  • ソース

hatena_haiku_palette_maker.uws [ダウンロード]

// ---------------------------------------------------------
// File : hatena_haiku_palette_maker.uws
// ---------------------------------------------------------
// <概要>
// ・このスクリプトはWindows 自動化ソフト「UWSC」を使った「はてなハイク」自動化スクリプトです。
// ・このスクリプトは「はてなハイク」で2色から多色パレットを生成するスクリプトです。
// 
// <使用上の注意>
// ・ブラウザは最大化にしてご利用ください。
// ・キャンバスの左上の座標(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/23 Ver0.03 RGB2HSV() 関数に誤りがあった為修正。小数が正しく計算されていなかった。
// 2008/03/16 Ver0.02 混色の生成方法を変更。HSV 値でソートするよう変更。ソースコードを整理。
// 2008/03/12 Ver0.01 とりあえず版作成。

Option Explicit

Public g_x = 263       // キャンバスX座標(左上の座標)
//Public g_y = 376       // キャンバスY座標(左上の座標)
Public g_y = 377       // キャンバスY座標(左上の座標)
//Public g_y = 295       // キャンバスY座標(左上の座標)
Public g_height = 100  // キャンバスの幅(未使用)
Public g_width = 100   // キャンバスの高さ(未使用)
Public g_r = 3         // 円の半径
Public g_colors = 3    // ツールボックス上の色数(白、色1、色2)
Public g_pi = 3.14159265 // PI
Public g_winID_haiku = 0
Public g_wait = 5

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

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

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

Main()

Procedure Main()
    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 = 20
    MakeColor_太さの異なる筆で混色を作成( start_x, start_y )
    MakeColor_細筆で丸を描いて混色を作成( start_x, start_y )
    
    // 作成した色を取得
    GetColorRecordset( rs, start_x, start_y, width, height )
    
    // 上段で色作成
    start_x = g_x + 20
    start_y = g_y
    width = 300
    height = 10
    MakeColor_線を交差させて混色を作成( start_x, start_y, width, height )
    MakeColor_取得した色を用いて混色を作成( rs, start_x, start_y )

    // 作成した色を取得
    GetColorRecordset( rs, start_x, start_y, width, height )
    
    // 下段にパレットを描画
    start_x = g_x
    start_y = g_y + 10
    MakePalette( rs, start_x, start_y )
Fend

Procedure MakeColor_太さの異なる筆で混色を作成( start_x, start_y )
    Dim pos_x
    Dim pos_y
    Dim color
    For color = (g_colors-1) To 0 Step -1
        筆の色を色番号で選択( color )
        Dim i
        For i = 2 To 0 Step -1
            pos_x = start_x + color
            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_細筆で丸を描いて混色を作成( start_x, start_y )
    筆の太さを選択( 0 ) // 細筆
    Dim pos_x
    Dim pos_y
    Dim color
    Dim tmp_g_r
    tmp_g_r = g_r
    For color = (g_colors-1) To 0 Step -1
        筆の色を色番号で選択( color )
        Dim i
        For i = 2 To 0 Step -1
            pos_x = start_x + color
            pos_y = start_y + i
            g_r = i + 1
            丸を描く( pos_x, pos_y )
        Next
    Next
    g_r = tmp_g_r
Fend


Procedure MakeColor_線を交差させて混色を作成( start_x, start_y, width, height )
    Dim color
    For Color = 1 To (g_colors-1)
        筆の色を色番号で選択( color )
        BTN(LEFT, DOWN, start_x,       start_y        + color, g_wait)
        BTN(LEFT, UP,   start_x+width, start_y+height - color, g_wait)
        筆の色を色番号で選択( g_colors-color )
        BTN(LEFT, DOWN, start_x,       start_y+height - color, g_wait)
        BTN(LEFT, UP,   start_x+width, start_y        + color, 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 MakePalette( rs, start_x, start_y )
    筆の太さを選択( 0 )
    
    rs.MoveFirst
    Dim pos_x
    Dim pos_y
    pos_x = start_x
    pos_y = start_y
    Dim n
    //n = 0
    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 32)*6
        pos_y = start_y + Int( n / 32)*6
        
        四角形を描く( 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"
    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

Procedure 丸を描く( x, y )
    Dim n
    n = 12 // 数を大きくすると滑らかになりますが重くなります
    N角形を描く( x, y, n )
Fend

Procedure 三角形を描く( x, y )
    Dim n
    n = 3
    N角形を角度を付けて描く( x, y, n, 30 )
Fend

Procedure 四角形を描く( x, y )
    Dim n
    n = 4
    N角形を角度を付けて描く( x, y, n, 45 )
Fend

Procedure 六角形を描く( x, y )
    Dim n
    n = 5
    N角形を描く( x, y, n )
Fend

Procedure 星を描く( x, y )
    Dim angle
    angle = 0
    星を角度を付けて描く( x, y, angle )
Fend

Procedure N角形を描く( x, y, n )
    Dim angle
    angle = 0
    N角形を角度を付けて描く( x, y, n, angle )
Fend

Procedure N角形を角度を付けて描く( x, y, n, angle )
    Dim t
    Dim pos_x
    Dim pos_y
    Dim prev_x
    Dim prev_y
    t = 0 + angle
    prev_x = Int(g_r * Cos( g_pi * t / 180 )) + x + g_r
    prev_y = Int(g_r * Sin( g_pi * t / 180 )) + y + g_r
    
    // Step(360/N) にすると、N角形になります。
    For t = 0 + angle To 360 + angle Step (360/n)
        BTN(LEFT, DOWN, prev_x, prev_y, g_wait)
        pos_x = Int(g_r * Cos( 2 * g_pi * t / 360 )) + x + g_r
        pos_y = Int(g_r * Sin( 2 * g_pi * t / 360 )) + y + g_r
        BTN(LEFT, UP, pos_x, pos_y, g_wait)
        prev_x = pos_x
        prev_y = pos_y
    Next
Fend

Procedure 星を角度を付けて描く( x, y, angle )
    Dim pos_x
    Dim pos_y
    Dim prev_x
    Dim prev_y
    
    Dim theta
    Dim theta_diff
    theta = g_pi * 72 / 180
    theta_diff = g_pi * angle / 180
    
    Dim x_array[5]
    Dim y_array[5]

    x_array[0] = x + Int( g_r * Sin( 0 * theta - theta_diff ) )
    y_array[0] = y + Int( g_r * Cos( 0 * theta - theta_diff ) )
    x_array[1] = x + Int( g_r * Sin( 2 * theta - theta_diff ) )
    y_array[1] = y + Int( g_r * Cos( 2 * theta - theta_diff ) )
    x_array[2] = x + Int( g_r * Sin( 4 * theta - theta_diff ) )
    y_array[2] = y + Int( g_r * Cos( 4 * theta - theta_diff ) )
    x_array[3] = x + Int( g_r * Sin( 1 * theta - theta_diff ) )
    y_array[3] = y + Int( g_r * Cos( 1 * theta - theta_diff ) )
    x_array[4] = x + Int( g_r * Sin( 3 * theta - theta_diff ) )
    y_array[4] = y + Int( g_r * Cos( 3 * theta - theta_diff ) )
    x_array[5] = x + Int( g_r * Sin( 5 * theta - theta_diff ) )
    y_array[5] = y + Int( g_r * Cos( 5 * theta - theta_diff ) )

    prev_x = x_array[0]
    prev_y = y_array[0]

    Dim i
    For i = 0 To 5
        BTN(LEFT, DOWN, prev_x, prev_y, g_wait)
        pos_x = x_array[i]
        pos_y = y_array[i]
        Print "i = [" + i + "], pos_x = [" + pos_x + "], pos_y = [" + pos_y + "]"
        BTN(LEFT, UP, pos_x, pos_y, g_wait)
        prev_x = pos_x
        prev_y = pos_y
    Next
    
Fend

Procedure 指定回数ドットを描く( x, y, nCount )
    Dim i
    For i = 1 To nCount
        BTN(LEFT,CLICK, x, y, g_wait)
    Next
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
 |