20190225

FEMAPのVBA(APIプログラミング)を使った その2。

さくらのブログって、文字数制限あるのか。
「内容の文字数が長すぎます」ってエラーが返ってきた。
文字数至上主義の私にとっては寝耳に水。

全編10,000文字オーバーだったのが、分割されちゃった。ぐすん。

というわけで、二つに分かれます。

プロパティの編集

今回は、あまりいじらない。
来月以降にいじる。
マテリアルを新しく作っているので、プロパティに設定しないとダメ。だからその部分だけやる。

プロパティを新しく作る

プロパティのときも、一行追加するだけで作れる。マテリアルも何も設定されていない。
ただ、やはり、この程度の事をするだけらば、GUIで作ったほうがいい。

Sub Main
Dim App As femap.model
Set App = feFemap()

App.feProp.Put(1)

End Sub

プロパティにいろいろ設定することを考えると、下の書き方のほうが賢明。

Sub Main
Dim App As femap.model
Set App = feFemap()

Dim Plop1 As femap.Prop
Set Plop1 = App.feProp
Plop1.Put(Plop1.NextEmptyID()) ' 次の(空の)IDに、putする。

End Sub

新規に作ったプロパティに、新規に作ったマテリアルをセットする。

  1. マテリアルを作成
  2. 1で作ったマテリアルを、プロパティにセットする。
Sub Main
Dim App As femap.model
Set App = feFemap()

Dim Mat1 As femap.Matl
Set Mat1 = App.feMatl
Mat1.Ex = 100000
Mat1.Nuxy = 0.3
Mat1.Put(Mat1.NextEmptyID()) ' 次の(空の)IDに、putする。

Dim Plop1 As femap.Prop
Set Plop1 = App.feProp ' App.feAppMessage(1, "Material ID" & Mat1.ID)
Plop1.matlID = Mat1.ID
Plop1.Put(Plop1.NextEmptyID()) ' 次の(空の)IDに、putする。

End
Sub

line elementのbar element(バー要素)のプロパティを作るには。

3次元梁要素。断面形状の設定とかの設定をしたい。
line elementのbar elementのL形鋼とかH型(I型)鋼だとかを作りたい。

Sub Main
Dim App As femap.model
Set App = feFemap()
Dim Mat1 As femap.Matl
Set Mat1 = App.feMatl
Mat1.Ex = 100000
Mat1.Nuxy = 0.3
Mat1.Put(Mat1.NextEmptyID()) ' 次の(空の)IDに、putする。
Dim Plop1 As femap.Prop
Set Plop1 = App.feProp
Dim Plop2 As femap.Prop
Set Plop2 = App.feProp
Dim Plop3 As femap.Prop
Set Plop3 = App.feProp
' App.feAppMessage(1, "Material ID" & Mat1.ID)
Plop1.matlID = Mat1.ID
'''''''''''''''''''''''
'''ここまでは、さっきと一緒'''
'''''''''''''''''''''''

''''''''''''
''' H型鋼 '''
''''''''''''
Plop1.type = 2 ' これで、バー要素になった。
Dim danmen() As Varinat
ReDim danmen(5)
danmen(0) = 100.
danmen(1) = 75.
danmen(2) = 75.
danmen(3) = 8.
danmen(4) = 8.
danmen(5) = 5.
Plop1.ComputeStdShape(9, danmen, 0, 0, False, False, False ) ' H形鋼(9)の、断面形状情報はdanmenに入れたやつで(H100x75)、オリエンテーションは右(=0)で、断面プロパティの評価方法は自動(=0)、その他はFalse。とりあえず。動くかのtestなので。
Plop1.Put(Plop1.NextEmptyID()) ' 次の(空の)IDに、putする。
''''''''''''
''' □型鋼 '''
''''''''''''
Plop2.matlID = Mat1.ID ' Materialは、全部一緒。
Plop2.type = 2 ' バー要素。
''''''''''失敗例''''''''''''''''''''''''''''''
' □型鋼の断面形状の情報は3つだが。間違った長さの引数を入れても、断面形状の計算が始まらない。
' せっかく早く帰ったのに、下の様なコードを書いていたらまったく動かず。
' 20~翌0.10まで格闘して、「接点制限版じゃ一回しか断面計算できないんだ…」と思い始めていた。
' ReDim danmen(2)
' danmen(0) = 50.
' danmen(1) = 50.
' danmen(2) = 3.2
''''''''''失敗例''''''''''''''''''''''''''''''
ReDim danmen(5) ' あくまでも、断面形状の引数は5(0~5までの6つ。)□型鋼の断面形状の情報は3つ。
danmen(0) = 50.
danmen(1) = 50.
danmen(5) = 3.2' GUIで、6っぽいところに値があったから、まさかと思い入力したら。まさかだった。
Plop2.ComputeStdShape(2, danmen, 0, 0, False, False, False ) ' 角形鋼(2)、断面形状情報は縦・横・厚(□50x50x3.2)
Plop2.Put(Plop2.NextEmptyID()) ' 次の(空の)IDに、putする。
''''''''''''
''' L型鋼 '''
''''''''''''
Plop3.matlID = Mat1.ID ' Materialは、全部一緒。
Plop3.type = 2 ' バー要素。
ReDim danmen(5) ' 断面形状はL型。
danmen(0) = 50. ' 高さ
danmen(1) = 50. ' 幅
danmen(4) = 4. ' 厚さ下。
danmen(5) = 4. '
Plop3.ComputeStdShape(11, danmen, 0, 0, False, False, False ) ' L形鋼(11)、断面形状情報は縦・横・厚(□50x50x3.2)
Plop3.Put(Plop3.NextEmptyID()) ' 次の(空の)IDに、putする。

End Sub

これで、bar要素のプロパティはできたと思う。
下に、その他の値を入力したら、何になるのか書いた。

しかし、それ以上に、断面形状の引数の配列の、どのインデックスに数値を入力するのかが難しい。
特にL型とボックスなどの6つ長さ情報いらないやつ。
Lは[0,1,4,5]、□は[0,1,5]に入れるべし…そんなのわかるか!!

GUIをよく見て、狙いをさだめないと、断面形状の計算が始まりません。
→メッセージに何も表示されなかったら、正常に断面が入力されていない。
→断面の配列を使いまわすのであれば、初期化などについても、気を付けられたし。前のが残っちゃってたり。

proprtyのtype一覧
プロパティのタイプ入力すべきID
ロッド1
バー2
チューブ3
リンク4
ビーム5
スプリング6
DOFスプリング7
カーブドビーム8
ギャップ9
プロットオンリー10
プレート(線形)17
プレート(2次)18
平面ひずみ(線形)19
平面ひずみ(2次)20
軸対称(線形)23
軸対称(2次)24
ソリッド(線形)25
ソリッド(2次)26
質量27
質量マトリクス28
剛体29
剛性マトリクス30
カーブドチューブ31
平面プロットオンリー32
コンタクト34
軸対称シェル(線形)35
軸対称シェル(2次)36
2次ビーム37

↑のほかにも書いてあった。
2しか使ってないが。

ComputeStdShapeの引数
ComputeStdShape( シェイプID, 断面形状, オリエンテーション(右なら0), 断面プロパティの評価方法(自動なら0), せん断中心のオフセット, ねじれ定数の計算の有無(ありならTrue), stress_recovery  )

という感じで使うらしい。
これをやった後、Putすると、ちゃんと断面形状の設定されたプロパティができあがる。

シェイプID

シェイプIDには、数値を入れる。
シェイプID以外にも、FEMAP constantで用意されている。
→FSHP_Cとか、FSHP_Lとかでも代用可能。書かないが。

  • 標準断面
形状
1長方形バー
2長方形チューブ
5円形バー
6円形チューブ
9I型
10チャネル
11アングル
  • Nastran断面
形状
16Rod
17Tube
18L
19I
20Channel
22Box
23Bar
24Cross
25H

よくわからないのは書かなかったが、上記以外にももっとあった。
使ったのは2,9,11だけだけど。

その他は、適当。

断面形状の評価方法は自動(=0)。
Boolianなら、ほぼ容赦なくFalse。

断面形状

必要な数だけ、配列に入れて入力にする。
必要な数は、シェイプIDによって変わってくる。
そのシェイプをGUIで編集するときの順番通りに配列を作る。

これがものすごく難しかった。配列の大きさは、(5)で指定(0~5までの6個)でないと、計算されない。

posted by yuchan at 07:00 | Comment(0) | FEMAP

FEMAPのVBA(APIプログラミング)を使った その1。

V11.1.1だけど、10.4でも使えるでしょ。多分。

FemapのVBA(APIプログラミング)を使う。
ほとんどGUIでできるようになっているので、あまり使う機会がない。
しかし、GUIでは機械的に条件を少し変えて繰り返すなどの操作ができないのでそれについてやってみる。

FemapのVBAの実行方法

APIプログラミングのウィンドウにコードを貼り付けて
みどりの三角ボタンを押すだけ。

ショートカットの設定のせいで困ることもある

ショートカットキーを設定していると、「APIプログラミング」のウィンドウが使いづらくなります。
私は、「P」にジオメトリのポイントを設定しているのですが、Pを押すと座標ウィンドウが立ち上がるために、「APIプログラミング」のウィンドウでPropertyと入力できなくなりました。

だから、コードは貼り付け。コードはテキストエディタなどで書いて保存しています。
ソースコードの記録を取っておくという観点からは、このやり方のほうがいいのかもしれません。

もしも、ショートカットを設定するときは、Ctrl+〜とかにした方がいいと思います。

Shiftは、アルファベット大文字入力の時困る。komaru_(Shift)KOMARU
VBAは、変数名などををキャメルケースで書くことが多い。
スネークケースではない。だから、大文字は使えるようにしておきたい。

僕なら、Altキーをショートカットに使ったりしない。

「僕なら」。
えらい人が言ったらその通りにしたいけど…。

Altは、便利キーなので、ショートカットの設定に使うのは、個人的にやめたほうがいいと思う。

Alt便利機能コマンド
ノードのマージAlt→T→K→N→Alt+S→Enter→Alt+M→Enter
測長Alt→T→E→D

「キーボードから手を放さないというだけで、こんなにストレスが減るのか!」

APIのreference等

書き方がわからないときは下記3つが役に立つ。

  • apiフォルダ
    カスタムツールのツールディレクトリから、apiというフォルダが見れる。ここにvbaのサンプルが入っている。
    while文の条件式の書き方は必見。
  • メソッド/プロパティ一覧
    「APIプログラミング」ウィンドウの、上部のアイコンの左から4番目。関数、メソッド、プロパティの名前がわかる。詳しい使い方は、下のReferenceに書いてある。
  • FEMAPのReference
    上記の「メソッド/プロパティ一覧」内の「?」ボタンから飛べる。
    関数の入力、出力の説明が書いてある。API以外のreferenceと共通。

こんな関数あり!?

いろいろ書物が充実しておりますが、それでも関数の使い方がわからず、迷走しました。
具体的には、入力も出力も、関数の引数の中に入れてしまう関数があった。
引数は、かならずしも全て入力というわけではないのか。

これはVBA流なのか?pythonしかやったことないから分からん。

整数型の注意点

VBAの整数型にはInteger型とLONG型がありました。

FEMAPでモデリングしていると、エレメント数や節点数が10万(100,000)を超える事は結構あると思う。
そういう意味でも、6万とちょっと(0含めて65536)のバリエーションしか作れないINTEGER型を使うべきではない。
そもそも、FEMAPのAPIで使う場合には、LONG型が要求されるので、INTEGERは使う機会がない。

入れられる値
INTEGER(整数)型-32,768〜32,767の整数。
LONG(長整数)型-2,147,483,648〜2,147,483,647の整数。

もしVBAじゃなくPythonだったなら、INTの桁数に制限が無かったのに。

マテリアルの編集

マテリアルの情報の取得(→messageに表示)

表示するだけなので、GUIでやった方が早い。

Sub Main
' 使用する前に
' マテリアルをアクティブにしてください。
' アクティブになっていない事があります。

Dim App As femap.model
Set App = feFemap()

Dim a As femap.matl ' 『aって言ったら、femap.matlの事ですよ』の宣言。
Set a = App.feMatl ' 『App(既に用意していたfemapのmodel)の中のfeMatl(femap.matlが、値のデータ型)として、a(femap.matl)を入れますよ。』
' 上記Setが無い場合→API エラー (行番号 11): (10094) OLEオートメーション:オブジェクト変数が初期化されていません。

' aは、何も入っていない空っぽの状態。
a.Get(App.feMatl.Active) ' すでに作ってある、アクティブなマテリアルを、aに取得する。→すでに作ってあるアクティブなマテリアルの情報を取り出せる。
App.feAppMessage(1, a.Ex & " young module") ' ヤング率をmessageに表示してみた。

' 書き換えもできるが、aを上書きしただけではだめ。
' aをputしないと反映されない。

End
Sub

マテリアルを新しく作る

マテリアルを新しく作るだけなら、初期設定に一行追加するだけ。
ただ、この程度の事をするだけらば、GUIで作ったほうがいい。

Sub Main
Dim App As femap.model
Set App = feFemap()

App.feMatl.Put() ' マテリアルを新しく作ったり、上書きしたりするときに使う。

End Sub

これで、マテリアルが新しく作られた。
等方性マテリアルとなっているかと思う。

マテリアルの値を設定

マテリアルの値を詳しく設定するには、どうするのかというと、

×上記のputしてから、それを作りこむ

〇App(femap.model.feMatl)にsetしたfemap.Matlに値を入れて、それをputする。

Sub Main
Dim App As femap.model
Set App = feFemap()

Dim Mat1 As femap.Matl
Set Mat1 = App.feMatl
Mat1.Ex = 100
Mat1.Nuxy = 0.3

Mat1.Put(Mat1.NextEmptyID()) ' 次の(空の)IDに、putする。

End Sub

これも、一個のマテリアルを設定するだけならば、GUIでやった方が早い。
しかし、値を変えて連続で何個も解析するならば、これを使う価値は出てくる。

すでにあるマテリアルを編集したい場合。

上記では、新規にマテリアルを作った。
しかし、既存のマテリアルの値をいじりたいときもあると思う。

そういう時は、

  1. Getしてから
  2. いじって
  3. Putする。

さっきのデータがあるとして、

Sub Main
Dim App As femap.model
Set App = feFemap()

Dim Mat2 As femap.Matl
Set Mat2 = App.feMatl
Mat2.Get(1) ' 1. Getして、
Mat2.Ex = 2.06e+11 ' 2. いじって、
Mat2.Nuxy = 0.3 ' 2. いじって、
Mat2.Put(1) ' 最初のIDに、putする。 ' 3. Putする。

End Sub

メモリ節約のために オブジェクトの消滅

Referenceの「5. FEMAP Entityオブジェクト」に載っていたが、メモリ量の削減のためには以下のやり方がいいらしい。

  • Set し直す→前にSetされていたオブジェクトが消える。
  • Set ○○ = Nothing → ○○が無くなる。

FemapのAPIの基本

ダイアログを出す機能 femap.Set

ユーザーにダイアログで選ばせて、そのエレメントを変数に入れる。

その変数を、関数に入れて処理する。

Sub Main
Dim App As femap.model
Set App = feFemap()

Dim surfSet As femap.Set
Set surfSet = App.feSet

' femap.setを使う。モデルのfeSetにセットして使う。
' モデルのfesetは、選択するダイアログを出す「Select」が使える。
Dim solidSet As femap.Set
Set solidSet = App.feSet()

' ソリッドエレメントを選択するダイアログを出す。選択した結果は、solidSetに保管される。
rc = solidSet.Select( FT_ELEM, False, "Select element. エレメントを選択。")

End Sub

ソリッドだけでなく、線や面を選ぶダイアログも、これを使う。
何を選択できるようになるかは、一番目の引数で決まる。
一番目の引数は、zdatatype。「メソッド/プロパティ一覧」で紹介されているだけでも50以上種類があった。

選択させたいものzdatatype引数は番号でも可。zdatatypeでなくても可。
エレメントFT_ELEM8
ジオメトリ(ソリッド)FT_SOLID39
ジオメトリ(面)FT_SURFACE5
ノードFT_NODE7

(自分にとっての)プログラミングの基本

先週やったかもしれないが再掲。

vbaのfor構文(と、0埋め(ゼロパッディング))

vbaのfor構文は下記でできる。
ここでは、messageを変えるだけ。

for構文(0から1まで、0.1刻み。)
Sub Main
Dim App As femap.model
Set App = feFemap()

For i_1 = 0 To 1 Step 0.1
App.feAppMessage(1, i_1) ' 変数i_1の中身をmessageに表示する。
Next i_1

End Sub
ゼロ埋め

あと、ゼロ埋めもやっといた。
条件を変えて解析を流したけど、ファイルの名前のせいでソートしにくいって時に使える。

Format(1, “000000”) ‘ “000001”と返ってくる。はず。

これは、画像ファイルなどを書き出した後、ファイル名のソートがしやすくなるなどの利点があるので、for構文とセットでやっておきたい。
(まぁ、ファイルの作成日時などでソートしてもいい気がするけど。)

Sub Main
Dim App As femap.model
Set App = feFemap()
For i_1 = 0 To 10
i_2 = Format(i_1, "000")' ゼロ埋めしたi_1。000と指定する事で、3桁表示になる。
App.feAppMessage(1, i_2)
Next i_1

End Sub
続きを読む
posted by yuchan at 07:00 | Comment(332) | FEMAP

20190128

FemapのVBA(APIプログラミング)で文字列の表示

月末なのに、一回も書いていなかった。
長続きが目的なので、一応書いておく。
本当は、もう少し内容が充実するはずだったのだけれども。

FEMAPのVBA

FEMAPのVBAは、「APIプログラミング」というところから利用できました。
これを使って、文字列を表示したいと思います。

メッセージボックス

まずは、メッセージボックスから。

MsgBox “Analysis complete!”

これは、VBAの機能なので、FEMAPの機能ではない。

メッセージの欄に、文字を出す。

Sub Main
Dim App As femap.model
Set App = feFemap()

App.feAppMessage(1, "aaa")
End Sub

でもできるし、

Sub Main
feFemap.feAppMessage(0, "aaa")
End Sub

でもできた。

閉じる

ウィンドウを閉じる機能も試した。

Sub Main
Dim App As femap.model
Set App = feFemap()

App.feFileClose(False)
End Sub

画像を保存する。

Sub Main
Dim App As femap.model
Set App = feFemap()

App.feFilePictureSave2(True, 0, 12, "012.png")
End Sub

引数は、

  • 1番目 boolian

    • True ファイルダイアログが出現。
    • False 何もしない。
  • 2番目 FPRG_DESKTOP
    1~3の数字化FPRG_DESKTOPを入力。

  1. 1. 0: FPRG_WINDOW
  2. 1: FPRG_LAYOUT
  3. 2: FPRG_DESKTOP
  • 3番目 zPictFormat
    1~12の数字かzPictFormatを入力。

  1. FPM_BMP
  2. FPM_METAFILE
  3. FPM_PLACEMF
  4. FPM_JPEG
  5. FPM_BMPSERIES
  6. FPM_AVI
  7. FPM_JT
  8. 不明
  9. FPM_GIF
  10. FPM_GIFANIM
  11. FPM_TIF
  12. FPM_PNG

そうそう。12がやりたかったんだよ。

  • 4番目 タイトル 文字列
    ダブルコーテーションで囲もう。

posted by yuchan at 07:00 | Comment(0) | FEMAP

20181224

計算力学技術者試験の問題集 自炊(裁断→スキャン)→リネーム、クロップ等の記録

やっと、計算力学技術者試験が終わった。12/15。固体、振動、流体とあるが、今年は振動を受けた。来年は固体。
来年に向けて、固体用のファイルを作った。
固体のファイルを作った時に、画像ファイルをリネームしたりクロップした。
携帯で読みやすくなった。

今年は、受験資格のソフトウェア使用経験を満たすため、通信講座に時間をかけた。そのため、試験勉強がおろそかになった。受かったかどうか自信はない。

裁断する

問題集は薄い。だから裁断機でも切れる。
裁断は、本文が切れたりしなければ何でもいい。
分厚い本ならば、かんなで背表紙を削ってもいい。かんながあればの話。

かんなは、案外安い。右の裁断機、2011年頃買ったら10000位したような気がした。気のせいかもしれないが。一回で数十枚しか切れないので、重労働になる。

後の加工を考えると、この時点で、余白を切り取ってしまった方がよかったのかもしれない。

スキャンする

スキャナーは、適当。
読み取り速度とかあるのかもしれないけど、よくわからない。

一枚一枚、手で紙を入れ替えるやつは、やめたほうがいい。
紙が自動的に、吸い込まれてくやつがいい。
精度は、ファイルサイズと読みやすさから検討。

三種類ある。

  1. パタパタするやつ。
  2. 吸い込むやつ
  3. 本のまま、めくって写真をとるやつ。
  4. 手で走査するやつ。
1234の順に並べた。2が高いけどおすすめ。ただ、紙の粉が詰まる。1は苦行。3は試してない。紙の粉の心配が無くてよさそうだが。
4は失敗するのが目に見えてる。昔家にあったfaxのスキャナが、4のタイプだった。手で動かすから、手があらぬ方向に動いたら全体的にゆがむ。読み取りスピード以上の速さで手を動かしたら、当然文字が飛ぶ。1のタイプでは、原稿を動かさないかぎり、そういうことが起こらない。

画像をクロップする

数百問を手作業でクロップする。
問〇-〇ってところを認識してクロップとかできればいいけど、そんなテクニックは知らない。できない。
裁断するときに、余白を切り取ってしまった方がよかったのかもしれない。

↓ サンプルとして、作ったものを載せる。文章に意味はない。

ワードで作ったような問題集だったので、ワードで作ってみた。かなり再現性高いと思う。

0001.png0002.png

ファイル名は、問題→回答順

紙の本の、問題集は、問題パートと、回答パートが分かれてしまっていた為、いちいちめくるのが大変だった。
問題→回答→問題→回答…この順番に並べ替える。
問題を奇数、回答を偶数で保存すると便利。

問題集は、順番通りのファイル名にしなければ、読みづらい。

リネームするマクロ

リネームするマクロを作った。
下のマクロは、偶数奇数を考えていない。少し書き直さないと、偶奇で保存できない。

os.rename(j, dirnm + r”/“ + “%05.f”%i + “%s”%(j)[-4:])

のiの部分を、2iとか、2i+1にすれば、何とかなるかも。よくあるやり方。

使用すると、フォルダ内の全てのファイル名が連番に変更されてしまう、恐ろしいマクロです。元に戻す方法は無い。

  1. 実行すると、フォルダ選択ダイアログが表示
  2. 選んだフォルダ内のすべてのファイルが、ファイル名順にソートされてから、5桁の0埋めの連番でリネームされる。
# coding: utf-8

import Tkinter
import tkFileDialog
import glob
import os


dirnm = tkFileDialog.askdirectory(title="Caution! carefully use.")

fnames = glob.glob(dirnm + r"/" + "*")
fnames = sorted(fnames)
lfname = len(fnames)

for i,j in enumerate(fnames):
print("%05.f"%i + "%s"%(j)[-4:])
os.rename(j, dirnm + r"/" + "%05.f"%i + "%s"%(j)[-4:])

縦長のページが、読みづらい

出来上がった画像ファイルは、スマホを横にして読みたい。
だから、画像ファイルは、横長がいい。横長にして、できるだけ大きい文字を見たい。
縦横比は、スマホにぴったりの16:9がいい。
なのに問題によっては、縦に長い画像になってしまう。
特に回答。

そんな時のために、画像をクロップするpythonのマクロを作った。

使用すると、フォルダ内の全てのjpgファイルが16:9に変更→分割されてしまう、恐ろしいマクロです。 かといって元のファイルを消すわけでもないので、そこまで怖くないかも。

# coding:utf-8

from PIL
import Image
import os, glob
import tkFileDialog


fld = tkFileDialog.askdirectory()
list = glob.glob(fld + "/" + ur"*.png") + glob.glob(fld + "/" + ur"*.jpg")

print list

for i in list:
im = Image.open('%s'%(i))
im_width, im_height = im.size

im_new_height = im_width / 16 * 9#縦のピクセル数 pixcel数の指定がしたいので、intの方が都合がいい。
last_height = im_height - im_new_height

if im_new_height*1.2 < im_height:#想定よりも1.2倍縦長ならば...
div_num = im_height / im_new_height
sft = (im_height - last_height) / div_num

if sft<im_new_height*1.7:
div_num += 1
else:
div_num += 2

shift = last_height / (div_num-1)

for i2 in range(div_num):
xl, yu, xr, yl = 0, i2*shift, im_width, im_new_height+i2*shift
im_crop = im.crop((xl, yu, xr, yl))
print i
print i2
im_crop.save('%s_%02.f%s'%(i[:-4], i2, i[-4:]))
print('%s_%02.f%s'%(i[:-4], i2, i[-4:]))
#print("%s, %s, %s, %s"%(xl, yu, xr, yl))
im_crop.close()

else:
print('%s'%(i))

im.close()
上の二つのファイルを保存したフォルダに対して実行すると、
  • 問の画像(すでに横長)に関しては、何も出てこない。
  • 解答の画像(縦長)は、分割されたファイルが出てくる。元の画像はそのまま。
  • ファイル名は00001_00, 00001_01, 00001_02, 00001_03, となっているはず。

こんな感じ。



0002_00.png 0002_01.png




0002_02.png 0002_03.png




一日20ファイル(10問)を目安に、やっていこうと思っている。

posted by yuchan at 07:00 | Comment(0) | python

20181103

ハーフマラソンを走った。

タグ:マラソン

KOBEマリンパークマラソンを走った。

KOBEマリンパークマラソンを走った。

ハーフマラソンを走った。一応完走したが、測定器トラブルのため、完走証明書が発行されていない。残念。
(まぁ、紙切れのために走ったのではないから。。。)

20181222追記。完走証明は、後日ちゃんと来た。サイトになぜか自分の写真も写ってて、よかった。

よかった点

  • 景色がいい
  • 近くの大学に荷物置き場があった。(屋外ではなかった)
  • 参加者がそれほど多くない。
  • 閉会式はちゃんと見れた。

よくなかった点

  • 途中、獣の糞のような臭い(動物園のにおい)がするところがあった。
  • 測定器トラブルがあり、即日発行のはずの完走記録証明がまだ来てない。
  • ハーフと10kmでコースに違いがあるらしいが、考えないで走ってしまった。多分ショートカットはしていないはず。
  • 走った後のおむすびが、おいしく感じられなかった。これは、走ったすぐ後だったせいかも。

今回学んだこと

  • インナーは、ブリーフにすべき。トランクスで走ると、男は玉がこすれる。
  • 日射しが疲れる。
    外で走ると、こんなにも疲労するのかと感じた。外で、日射しを浴びる特訓をする必要を感じた。休日に晴れたら、数時間携帯をいじる事で、特訓とする。  今気づいた。特訓=練。
  • 20 km(以上)走って鍛えるべき。
    今までは1h10kmで鍛えていた。そしたら、10kmちょうどで失速。1日20km走る。いや、2時間とかか?とにかく、フルマラソンに必要な体力が足りていない。
  • 外で走ると疲れる。ジムのマシンより疲れる。
    走り始めたころは、「ジムのトレッドミルで走った方が疲れる」と思っていたが、慣れたら逆。トレッドミルで走る方が楽。

  • マシン慣れで、ペースがつかめない。
    あと、マシンで走り慣れてしまうと、地面を走ったときにペースがつかめない。前半は、ジムのペースより、ちょっと遅めで走れていたと思う。

  • スタート直後の混雑で、ペースがつかめなくない。
    なるべく落ち着いて走ったつもりだったが、前が詰まっているように感じた。そういう場合は抜かした。それを繰り返していく内に、自分の実力以上の速さで走る羽目になってしまった。

  • エイドの給水は、1カップの水の量が少ない。小さい紙コップに1/5くらいしか入っていない。
    ガブガブ飲みたかった。ガブガブ飲みたいのなら、自分で1L持っていくべきだったかも。

  • エイド多過ぎ。
    よく考えたら、「5kmに一回給水」くらいのペースで走るべきだった。水分を取るたびにもたついて遅れが発生していたし、水分を取った後、一定時間確実に遅くなってた。反省。
  • 砂利道では、小石が足裏に刺さる。痛い。
荷物置き場ちゃんとしてたし、携帯もっていけばよかった。写真取れんかった。盗難を恐れて、もっていかんかった。

いつのまにやら、このブログに計10万回アクセスしていただいていた。
ありがとうございます。
多分7割はクローラのようなbotだとは思いますが、クローラもありがとうございます。
続きを読む
タグ:マラソン
posted by yuchan at 07:00 | Comment(1) | マラソン