Hatena::Groupuwsc

CX's UWSC Diary

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

2008-03-12はてなハイク - カラーパレットを生成するテスト

カラーパレットを生成するテスト

| 03:31 |  カラーパレットを生成するテスト - CX's UWSC Diary を含むブックマーク はてなブックマーク -  カラーパレットを生成するテスト - CX's UWSC Diary


  • ソース
Option Explicit

Public g_x = 263 // キャンバスX座標
Public g_y = 370 // キャンバスY座標
Public g_height = 10
Public g_width = 20
Public g_r = 8  // 円の半径
Public g_pi = 3.14159265 // PI
Public g_winID_haiku = 0
Public g_wait = 5

// DataTypeEnum
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

    rs = CreateOleObj("ADODB.Recordset")
    rs.Fields.Append( "color", adInteger )
    rs.Fields.Append( "x", adInteger )
    rs.Fields.Append( "y", adInteger )
    rs.Open
    
    Dim color
    Dim x
    Dim y
    For y = g_y to g_y + g_height
        For x = g_x To g_x + g_width
            color = PeekColor( x, y )
            // 白色の情報は記録しない
            Ifb color <> $FFFFFF Then
                rs.AddNew()
                rs.Fields("color").Value = color
                rs.Fields("x").Value = x
                rs.Fields("y").Value = y
                rs.Update()
            EndIf
        Next
    Next
    
    rs.Sort = "color" // 平均色を求めてソートすると良いかも?
    
    // 重複レコードの削除
    rs.MoveLast
    Dim last_color
    last_color = -1
    While !rs.Bof() And !rs.Eof()
        color = rs.Fields(0).Value
        Ifb color = last_color Then
            rs.Delete()    // 重複レコードの場合、カレントレコードを削除
        EndIf
        rs.MovePrevious()
        last_color = color
    Wend

    rs.MoveFirst
    Dim pos_x
    Dim pos_y
    pos_x = g_x + 20
    pos_y = g_y + 20
    Dim n
    //n = 0
    n = -1
    While !rs.Bof() And !rs.Eof()
        n = n + 1
        color = rs.Fields(0).Value
        x = rs.Fields(1).Value
        y = rs.Fields(2).Value
        Print "color = [" + Format( color, 0, -1 ) + "], " + _
              "x = [" + rs.Fields(1).Value + "], " + _
              "y = [" + rs.Fields(2).Value + "]" + _
        筆の色をスポイトで選択( x, y )
        pos_x = g_x + 20 + Int( n Mod 10 ) * g_r * 2
        pos_y = g_y + 20 + Int( n / 10 ) * g_r * 2
        四角形を描く( pos_x, pos_y )
        塗りつぶし  ( pos_x, pos_y )
        rs.MoveNext()
    Wend
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 はてなハイクで描く( strLines[] )
    Dim strLine
    
    Dim dotChar
    Dim nColorIndex

    Dim max_x
    Dim max_y
    max_y =  Length(strLines)
    
    Dim pos_x
    Dim pos_y
    Dim x
    Dim y

    Dim nLarge
    nLarge = 12
    For y = 0 To max_y - 1
        strLine = strLines[y]
        max_x = Length(strLine)
        For x = 0 To max_x - 1
            pos_x = g_x + x * nLarge
            pos_y = g_y + y * nLarge
            dotChar = Copy( strLine, x + 1, 1 )
            nColorIndex = 色番号を取得( dotChar )
            Print "pos(" + x + "," + y + ") = [" + dotChar + "](" + nColorIndex + ")"
            Ifb nColorIndex <> -1 Then
                筆の色を色番号で選択( nColorIndex )
                //三角形を描く( pos_x, pos_y )
                四角形を描く( pos_x, pos_y )
                //丸を描く( pos_x, pos_y )
                //星を描く( pos_x, pos_y )
                塗りつぶし( pos_x, pos_y )
            EndIf
        Next
    Next
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 )
    //N角形を描く( x, y, n )
Fend

Procedure 四角形を描く( x, y )
    Dim n
    n = 4
    N角形を角度を付けて描く( x, y, n, 45 )
    //N角形を描く( x, y, n )
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
        Print "t = [" + t + "], 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, 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   // 筆の位置の間隔
    //BTN(LEFT, DOWN, x + nWidth * nWide, y, g_wait)
    //BTN(LEFT, UP,   x + nWidth * nWide, y, g_wait)
    指定座標をクリック( x + nWidth * nWide, y )
Fend

Procedure 色を選択( dotChar )
    Dim nColor
    nColor = 色番号を取得( dotChar )
    筆の色を色番号で選択( nColor )
Fend

Procedure 筆の色を色番号で選択( nColor )
    Dim x
    Dim y
    Dim nWidth
    x = g_x + 83  // 白絵の具の位置
    y = g_y - 14  // 白絵の具の位置
    nWidth = 14 // 絵の具の位置の間隔
    //BTN(LEFT, DOWN, x + nWidth * nColor, y, g_wait)
    //BTN(LEFT, UP,   x + nWidth * nColor, y, g_wait)
    //Print "x = [" + x + "], nWidth = [" + nWidth + "], nColor = [" + nColor + "]"
    指定座標をクリック( 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 )
    //MMV( x, y, g_wait )
    //BTN( LEFT, CLICK, x, y, g_wait )
    //Print "指定座標をクリック : x = [" + x + "], y = [" + y + "]"
    BTN( LEFT, DOWN,  x, y, g_wait )
    BTN( LEFT, UP,    x, y, g_wait )
Fend

Function 色番号を取得( dotChar )
    Public HashTbl colorTable
    // 色名→色番号変換
    colorTable["無"] = -1 // 透明
    colorTable["白"] = 0  // 白
    colorTable["薄"] = 1  // 薄い灰色
    colorTable["灰"] = 2  // 灰色
    colorTable["黒"] = 3  // 黒
    colorTable["赤"] = 4  // 赤
    colorTable["茶"] = 5  // 茶色
    colorTable["肌"] = 6  // 肌色
    colorTable["黄"] = 7  // 黄色
    colorTable["緑"] = 8  // 緑
    colorTable["深"] = 9  // 深緑
    colorTable["青"] = 10  // 青
    colorTable["紫"] = 11  // 紫

    Result = colorTable[dotChar]
Fend
 |