2019年9月23日月曜日

Python+Kivy 備忘録 ディレクトリ検索編

ネットで漁ったソースをくっつけ合わせて動けばOKという、ダメPGそのもののコーディングをしているのですが、KVファイルを介在させない FileChooser のコードすら日本語のページでは検索できなかったのですよ。いわんやディレクトリのみ検索をや、という状況になりまして。またもや休日が吹っ飛んだ結果がこちらになります。
コード

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

from os.path import join, isdir

#from kivy.uix.filechooser import FileChooserListView
from kivy.uix.filechooser import FileChooserIconView

#class DirectoryChooser(FileChooserListView):
class DirectoryChooser(FileChooserIconView):
  def is_dir(self,directory,filename):
    return isdir(join(directory,filename))

class MyWidget(BoxLayout):
  orientation='vertical'
  def __init__(self,**kwargs):
    super(MyWidget,self).__init__(**kwargs)
    self.dc =DirectoryChooser(size_hint_y=1)
    self.dc.filters=[self.dc.is_dir]
    self.add_widget(self.dc)

class MyApp(App):
  def build(self):
    layout = MyWidget()
    return layout

if __name__ == '__main__':
  MyApp().run()

※追記 ubuntu20.04 上の python3 + python3-kivy にて動作を確認しました
※追記 Android + Kivy Launcher 上ですと4.4~6までしか動作しないようです
尚、コメントアウトしている FileChooserListView の行と FileChooserIconView を入れ替えるとリストビュー型になります。

うーん。やっぱりKVファイル挟まない方が書きやすいと思う私は旧人類なんでしょうかねえ?

2019年9月19日木曜日

Python+Kivy 備忘録 画面遷移編

はい、Tips書くほど賢く無い、PG辞めて10年以上(現役期間より辞めた後の時間の方が長くなってしまいました)の人間が何を書いているんだって話ですけど、
歳なんで物忘れが激しいのですよ。
で、今回作った物はこんな感じ。
boxlayout 継承クラスの Display クラスの中に、boxlayout 継承クラスの SubDisplay クラスを作りまして、SubDisplay クラスの中にあるボタンを押すことで、SubDisplay クラスの再描画をやらせましょうというサンプルです。

change ボタンを押すと以上の二つの画面が交互に切り替わります。

コード

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label

class BtnChangeYoko(Button):
  def on_press(self):
    self.parent.parent.lMode.text='Yoko'
    self.parent.DrawYoko()

class BtnChangeTate(Button):
  def on_press(self):
    self.parent.parent.lMode.text='Tate'
    self.parent.DrawTate()
class SubDisplay(BoxLayout):
  def DrawTate(self):
    self.clear_widgets()
    self.orientation='vertical'
    b1 =BtnChangeYoko(text='change',size_hint_y=1)
    b2 =Button(text='dummy',size_hint_y=2)
    self.add_widget(b1)
    self.add_widget(b2)
  def DrawYoko(self):
    self.clear_widgets()
    self.orientation='horizontal'
    b1 =BtnChangeTate(text='change',size_hint_x=1)
    b2 =Button(text='dummy',size_hint_x=2)
    self.add_widget(b1)
    self.add_widget(b2)
class Display(BoxLayout):
  orientation='vertical'
  def __init__(self,**kwargs):
    super(Display,self).__init__(**kwargs)
    self.lMode = Label(text='Mode',size_hint_y=1)
    self.boxSub = SubDisplay(size_hint_y=9)
    self.add_widget(self.lMode)
    self.add_widget(self.boxSub)
    self.boxSub.DrawYoko()

class TestApp(App):
  def build(self):
    layout = Display()
    return layout

if __name__=='__main__':
  TestApp().run()

※追記 ubuntu20.04 上の python3 + python3-kivy にて動作を確認しました
※追記 Android 4.4/5/6/8 上の Kivy Launcher にて動作を確認しました 
ミソは button 継承クラスの BtnChange~ クラスのコールバック関数 on_press の中身。
各ボタンは SubDisplay クラスの子になるのですが、親の親である Display クラスの子の label (lMode)を書き換えて、親クラス SubDisplay の再描画関数 Draw~ を呼んでいます。

  • なんでこんなコードを書いたの?
確かにKV言語を使うと綺麗な配置のGUIが作れるんですけどね、ちょっと変わった動きや、画面の再描画処理を書き始めると…

「悪い、やっぱ辛えわ」

となりまして、なんというか kv と python の二つの仕様を跨いだ書き方を調べながら書くのが面倒というか、昔 MFC 継承クラスを作っていたので「何を作ったら良いかは解るけど、どう書いたら良いか判らない」事が頻発しまして、

「俺、コード直書きの事、好きだわ」

になってしまったのですよ。
実は作っているアプリでディレクトリ名を取得する処理を書いていて、FileChooser を調べたりしていたのですが、どうにも煩雑な処理になってきまして。シングルタップでディレクトリ名取得、ダブルタップで下階層へ移動するようにコールバックを改造するにはどうするんだ?となった折、流石に kv を交えているのは厳しいと。

そんな訳で、慣れるか壁にぶち当たるまでは kv 無しの kivy 道を走る事になりそうです。

2019年9月13日金曜日

夏休みの宿題2

E2沼ったんですけど、鋼材が4桁?になってるんですけどっ!
ネジを使う余裕もねェ
イベントの出し惜しみあるあるですが、今回はE1が独仏、E2が伊+アークロイヤル、E3が米英を全力で出してOKらしいですね。
E2甲で、量産型ビスマルク3(Lv80)を2隻投入したりしていましたが、ラスダンまでは余裕で突破できたもののその後ドはまり、イタリア戦艦を投入した挙句、援軍投入でクリアしました。
今回は組み分けが簡単なので、割となんとかなりそうですが、ラストはお約束のギミック地獄だとか。残りの資材を考えると、甲でクリアできるかは微妙ですが、掘りが終っているので挑戦せざるを得ません。

異常に暑い9月も急速に秋になるようで、我が家の温度計がこんな事になっているのですが…
1日で74%→47%
コレが不快指数だったか湿度だったかは忘れましたが、これだけ下がったせいか、起きた時にウィルス性の腹痛が…。
この時期怖いですねえ。

さて、前回(9/8)の宿題その1のスクリプトはその後全乗せ版の開発がとん挫したのですが、もう一つの宿題のお話。
お前の夏休みいつまであるんだよって時期ですが…

宿題その2アンドロイド+ Python で開発をするお話
…と、題していながら実は今回開発まで入れていません。

  • あらまし
とある事情で安く量産できる道具を作る必要がありまして、当時は中国産 Windows タブレットに Linux を載せて Pyton+Tkinter で開発していました。
…が、ここのページでしょっちゅう書いてある通り、安い 32Bit タブレットは Linux からも見放されつつあります。
更に、中華ウィンドウズタブレットは「8インチ以下のタブレットにタダで Windows (Bing)を載せる」という MS 社の施策や、Intel の Atom に乗っかった製品です。
ところが現在 MS社はタダで Windows を撒いていませんし(20年1月の Win7 終了後に Win10 が伸び悩んだ場合再開するかもしれませんが…)、Atom も Intel が開発を終了したため16年頃まであんなに乱造された中華ウィンドウズタブレットは今や絶滅危惧種になりつつあります。

となるとタブレットのスタンダード、 Android で開発をするしかないという方向になった訳です。(流石に、モバイル Windows や Linux は復活しないだろうし、Kirin OS が天下を取る未来もなさそうですし)

ただ、Python はともかく、GUI 操作系のライブラリが無いと難航しそうなの自明でした。とは言え、Android 上で動く Tkinter というのが見つけられなかった為、一歩下がって Python+Kivy に挑戦することに。これを実現できる開発環境が QPython という事まで判っていざ開発となったのですが…

  • 私にとっての QPython
はい、 QPython とは何か?はググれば判ります。いろんな事情から否定的な書き方をする方は少ないと思いますが…
私が触った感覚から書くと「オラついた残念な天才が作った開発環境」です。
スマホ単体で開発ができるコンパクトな環境、Kivy が利用可能など、コンセプトは良かったのですが…
バージョン毎に互換性が無い。
なにが酷いって上位互換すら無い。QPython は QPYPI という項目のサブ項目 LIBRARIES からサブのライブラリを取得する事になっていて、Kivy もココから落としてくるのですが…。
バージョンによって落とせるライブラリがマチマチ。
いろんなサイトや教書では QPython で Kivy を使う場合は Ver 2.0.6 を推奨していますが、9月現在動作せず、私の環境では 2.0.10 でないと動作しませんでした。
インストールは Playストアを通さず qpython.com から直接行うのですが、インストールしたらすぐに Playストアで自動アップデートを無効にしないと「勝手に開発環境がバージョンアップして動作しなくなる」という恐ろしい状況に直面します。

体験したというよりは まったく理解を 超えていたのだが……

「おれは QPyton をインストールしてテストコードの実行を確認したと思ったら
いつのまにかバージョンアップして動作不能になっていた」

おれも 何をされたのか わからなかった…(3日程ハマる)

…夏の休日が…
で、Ver2.0.10 で開発を始めたわけですよ。QPython の Editer は初めて開くとファイル名が Untitle となり、セーブ時にフォルダを選びます。
が、再度 Editer を起動すると最後に開いたソースコードを開きます。
ちなみに、 Editer の右上の「+」ボタンを押すと「セーブ先フォルダを指定した」新規作成ができます。

…インストール後初回以外フォルダーを指定してソースをセーブする事ができない?
正直、流石にこんな低レベルな仕様バグはありえないだろうと思っていろいろ操作方法を探しました。
Kivy を使ったアプリは通常 Python のコードを書く main.py があり、 GUI の設定関係を書き込む .kv ファイルを同フォルダに書く必要があります。
流石に .kv ファイルのセーブ方法が無いなんて…
ココで1週間ほどハマりました。夏休みに開発する予定だったのに予定が全て吹っ飛びました。

ちなみに、この問題は裏技的に解決できます。

1.Editer 上の「+」ボタンを押して File でソースを作成してセーブ。

2.Explorer を開いて scripts フォルダを開く。


3.先ほどセーブしたファイルがあるハズなので長押し。


4.右側に3個の項目ボタンが出るので、×を選択して削除。

5.再度 Editer を起動させると最後にセーブしたソースが無いので、フォルダ選択可能な新規ソース作成ができます。

…開発環境のデバッグが必要なんて、ポルナレフが過労死しそうです。
結局こんなしょうもない環境を使うわけにはいかず、Linux 上の Geany で極力ライブラリを使わずに アプリ開発を行い、 Android 上の動作確認をする時のみ QPython を使用する事になりました。

…デバッグもできない連中に開発環境を作らせないで欲しいものです

2019年9月8日日曜日

続・夏休みの宿題1

3日にはE2のラスダンに入ったのにまだ突破できまてません。
というか、空襲銀タコがバグっていたとか、「空襲力弱くしてました」…詫び空襲再びですか。

せっかくいい感じでリギングが終ってきているので流れを止めたくなかったのですが、
Blender のスクリプト作成…案外簡単に終わりました。

最も難しかった所は、 Python の文字列配列の扱いが判らなかった所…オイオイ。
相変わらず if ネストの深い残念なコードです。
以下コード

# pair vertexgroup maker

import bpy

if bpy.context.mode == 'OBJECT':
    # print all selected objects
    for obj in bpy.context.selected_objects:
        print(obj.name)
       
        if obj.type == 'MESH':
            list_add = []
            for vg in obj.vertex_groups:
                pair_name = ''
                length = len(vg.name)
                if vg.name[length-2:] == '.L':
                    pair_name = vg.name[:length-1]+'R'
                if vg.name[length-2:] == '.R':
                    pair_name = vg.name[:length-1]+'L'
                if pair_name != '':
                    if not obj.vertex_groups.get(pair_name):
                        list_add.append(pair_name)
           
            for name in list_add:
                print(name)
                obj.vertex_groups.new(name)

…多分9/2に書いた全工程を自動化する『全部入り』も結構簡単に作れるような気がします。
そこまでできたらリギング再開で体幹の作成に入りますかねえ。
尚、既にボーンを左右対称にした際にボーンの角度制限がうまく行かない(というかベタコピーされてしまう)
事が判明しています。コレに関しては Blender の問題なのでなんとも。Blender 2.8 だと直っていたりするんでしょうかね?

2019年9月2日月曜日

夏休みの宿題1

イベントE2の2ゲージ目攻略中。なんか前回と打って変わって低難度の短期決戦の予感。
御蔵もGetできましたし、コマンダンテの2隻目も来ました、どうなってるんだ今回。

さて、おまえの休日宿題ばっかりだなってお話です。

宿題その1 Blender

半身状態で人体の生成をしている訳ですが、流石に夏の間に半身で編集する部分(四肢)は終わらせようと思っていた訳です。
で、こちら。

ラジオ体操みたいな動きしていますが、肩回りです。

流石に多少の破綻は出ましたが、許容範囲なのかなあという所。
最初は三角筋がジンバルを起こしたりしていましたが、多少は改善しています(直し切れていませんが)。

背面からがこんな感じ。

筋肉の描写が美しくないというか、所謂「キレて」ないのですが、主張の激しい肩甲骨の動きは気に入っています。

で、パッと見両面化しているように見えますが、オブジェクトのモディファイアに「ミラー」を追加しただけです。


ウェイト付片面モデルの両面化
そろそろ体幹を作るにあたり、両面化しようとしまして、
まあ、いろいろ資料本読んだりネットで調べたりしたんですがねえ…
基本方針としては、人体である以上左右対称なので(正確には左右が完全対称な人間はほぼ居ませんが)、仕上げ以外は常に半身で編集しようと思っています。
このため、両面化の作業は極力自動化、簡略化したかったのですが…
一手致命的な部分が出てしまいまして…
(以降はVer2.79のお話になります)


  • 0.作業前のモデル

名称やウェイトの状態はこんな感じ


  • 1.左右の命名

左側のボーンの語尾に「.L」右側に「.R」と変名してくれる処理。
アーマチュアを編集モードで選択(特定ボーンのみ選択したい等の事情がなければ「Aキー」で全選択)

3Dビュー上にマウスカーソルを置いて「Wキー」でスペシャルメニューを開く
「オートネーム左右」を選択
これでボーン名称の語尾に左右が付き、対応する頂点グループ名も変名される。


  • 2.左右対称ボーンを作る

上記と同様にスペシャルメニューを開いて「対称化」を選択

尚、中心軸上のボーンも同時に選択してもボーンは増えない模様。
このため、雑に「Aキー」でボーンを全選択してもよさげ。


  • 3.対称となる頂点グループを作る

例では「~.L 」の頂点グループが出来たので、対称となる「~.R 」を作る
オブジェクトを選択し、頂点グループメニューから、
右側の「+」ボタンを押して頂点グループを追加。
追加時のデフォルトネーム「Group」を適宜左右対称の頂点グループ名に変名


  • 4.オブジェクトの左右対称化

オブジェクトを選択し、モディファイア(レンチマーク)→追加→ミラー
「ミラー」モディファイアの適用ボタンを押す
以上の方法で片側のみモデルの両側化はできるのですが…

3の工程が手作業!
…頂点グループの数が一桁ならやれなくも無いデスが、
私のモデルは既に200本近いウェイトに影響のあるボーンが存在しています。
…コレ、自動化するスクリプトを組まないと体幹周りのリギングに入れないのではないでしょうか…
17年以来2年ぶりのスクリプト… Python とは言え内容をすっかり忘れているのですが…

2019年8月13日火曜日

沼だったり闇だったりする話

ひと月ばかり更新が滞っているのですが…

  • 実はジャンク関係が絶不調なのですよ。

事の発端は「例のボード」事マイニング用 RX470 を買ったことに起因するのですが。
なぜか一回り大きいチップ抵抗が部屋にありまして、
はんだ付けを行ったのですが、端子にはんだが付かない。
後にチップ抵抗に精密機器用のはんだしか付かない事に気づいたのですが後の祭り、パターンが剥離してしまい、アウト。…まあ、コレは別に良いです。高難度で失敗前提ですし。
その後、憂さ晴らしでパソコン工房さんがアウトレットで出していた RX570 4G を購入。
コレは良い買い物で、実は未開封なのに1万円を切っていました。ありがたくメインマシンに乗せ…られなかったのです。

メインマシンは10年以上も古い 2006 年製 Antec のケースなので、
専用電源

もケース設計も古く…ケースを魔改造して

玄人志向の電源付けてなんとか起動したのですが…

パーツがとんでもなく余ってしまいまして、1台組み上げる事になったのです。
そして、メインマシンの Ryzen 5 2600 + RX570 をゲーム用、新規に組み上げた i7 3770 + RX460 を事務用にしようとしたのですが…

…OSインストールが終っていざ環境移植って段になってボードのスプラッシュが出たまま20分OSが起動しないのですよ。
最低限のパーツだけ繋げて起動した所、ボードから嗅ぎなれた匂いが。見たらメモリの一つのアンプICと思われる部分から火が出てました。

5月から数えてマザーボード3枚、グラフィックボード3枚、メモリ1枚が大破。後日調べてみた所、メモリ3枚(24GB)がマザーの不良により焼けていた事が判明。
…ノートパソコン買えるって。
特にマザーボードは酷いもので、秋葉原最終処分場で買った LGA1155 マザーが電源しか入らず BIOS が上がらない。
これはまあ、2000円だったし、諦めたのですが。
じゃんぱらで買ったボードも同様で、初期不良で持っていって不具合が再現出来て返金。
同日に別のじゃんぱらで買ったボードが前述のボードです。(いや、不具合出した店で中古マザーを連続で買うなってのは判るんですが、LGA1155 の中古マザーを秋葉原で扱っているのはココだけなんですよ)

ビデオボードは例のボードがダメになった(正確には出力端子周りだけなので、クロスファイア専用等使い道はある)ので、ちょっと興味のあった Quadoro4000 を購入。…うーん10年前のボードにしては健闘してるんですが…とっても熱い。90度以上の熱が出る上に画面が乱れる。明らかに薄型にするには無理がある。で、ビデオボードファンを換装しようとしたのですが、そんな古いボード用のファンは無い為、N460GTX という大きなファンが付いた古いボードを買って、無理やり合体。

裏側。ネジ穴が合わないのでピアノ線で無理やり止めている
画面は出力できるのですが、なんか変な出力となり、デバイスを調べると「デバイスを認識できません」…どうやって画面を出しているんだ WIndows10 。多分、GPUは生きてるけど、VRAM が死んだとか画面出力回路だけ生きていて、Core i7 の内臓 GPU の画像を出力しているとかだとは思いますが、かなり難解な状況になり流石に廃棄と相成りました。

…今年は運が無いのかなあ。
そして今日、自転車で遠出したついでに寄ったハードオフで3500円のマザーボードを買ってしまいました…沼だなあ。



  • 日本を不景気にする話

こんなものが届きまして。
日本を不景気にするぞーと意気込んだのですが、実は収入額に関する記述ってないのですね、コレ。
あと、中にこんな紙が入っていたのですが…
好景気感に忖度しろって事なんですかね?

2019年7月12日金曜日

小指から………こう…

リギングを初めて一番最初に手のボーンを作り、指標として拳を作っていたわけですよ。
当時は動作を作らずにポーズだけで見ていたのですが、動作をつけてみました。
「何を握った→力だ」と某地上最強の生物は言っていますが、
実際拳を作って握るのは手のひらの肉です。

そこで、指の内側の肉をストレッチボーンで作ってリギングをやり直し、
かつ、拳頭を作り直してみました。
拳頭は膝の膝蓋骨とちがい、実際に骨が在る訳では無く、関節の骨頭な訳なんですが…


曲げた際に指が太ります。又拳頭が前に出るようになりました。

リギングしていなかった小指の付け根の筋肉が縮みます。


これでもまだまだなんですけどね。これ以上やると沼る…
リギングの開始が17年の11月頃なので流石に2年程経つと多少は進歩します…というか人体一つのモデリングが5年経っても終わらないという手の遅さが恐ろしい…
未だに指の間に隙間が見えるのですが、指の手のひら側の曲げて膨らむ部分が三角錐なのでどうしも隙間ができます。
5角以上にすれば埋まると思いますが、多ポリゴン化はウェイトが十分に吟味されてからにしたいので保留。
ちなみボーンのビフォーアフター
うーん手だけでボーン数が…