Quantcast
Channel: ドナドナされるプログラマのメモ
Viewing all 552 articles
Browse latest View live

ワム80000 モデルあらためて完

$
0
0

エッジ消去処理や、変なポリゴンの修正をした。なんだかんだで20時間ぐらいかけてるな、このモデル・・・。

f:id:donadonasan:20180813225858p:plain

ワム80000 シーマ(仮)さん作成pmxをSketchUp用に変換

試しに、ぴぴっとレンダリング

f:id:donadonasan:20180813230333p:plain

よし、色合いも大丈夫そうだし、今度こそ完成で。


ブレーキカーに着手

$
0
0

ブレーキカーに着手。

まだこんなかんじ。詳細な各部寸法がわからん・・。

f:id:donadonasan:20180814215557p:plain

ブレーキカー更新

$
0
0

 今日は、各コンポーネント内にあったゴミデータを掃除した。

ブレーキカーについては、車高の変更と機器の装着をした。ちなみに、黄色いのはメタローチという装置だそうだ。聴いたこと無いものだったので調べたら、メタル+アプローチの合成語で昔日立が使っていた商標の模様。要するに金属の接近を検知する近接センサである。こいつで貨車の車輪が近づいたことを検知するみたい。

今日はここまで。明日はブレーキの詳細を作る予定。

f:id:donadonasan:20180816235156p:plain

平行ではない、かつ交わらない線を滑らかに繋げる簡易的な方法

$
0
0

f:id:donadonasan:20180819130600p:plain

モデリングをしていると、平行ではない、かつ交わらない(つまり、ねじれの位置にある)2本の線をなめらかにつなげる曲線を描きたくなる。たとえば、柔らかいケーブルを2点間でつなげる場合だ。検索の仕方が下手なのか、どうやればいいのか解説しているページがなかったので独自にやり方を考えてみた。

f:id:donadonasan:20180819131444p:plain

 

滑らかに繋げる の定義

「滑らかに繋げる」の条件を定義する。円弧と直線が滑らかにつながる条件は、円弧のもととなる円と直線が接すること。これを描き方で言い換えると、「円弧の中心点が直線の端部から円弧の半径の距離にいること」となる。

2本の平行な直線を滑らかに繋げる場合

2本の平行な直線を滑らかにつなげたいならば両者の中間に円弧の中心を置き、半円を描いてつなげれば、少なくとも滑らかにはつながる。

2本の交わる直線を滑らかに繋げる場合

f:id:donadonasan:20180819133343p:plain

平行ではないが延長すると交わる直線の場合は、以下の手順で滑らかに繋げることができる。

1. 直線を延長し、交点を見つける。

f:id:donadonasan:20180819135453p:plain

2. 交点を中心とした円を描き、直線と交点までの距離を確認する。

f:id:donadonasan:20180819135646p:plain

3. 等距離でない場合は、遠い方を延長して等距離にする。

f:id:donadonasan:20180819135904p:plain

4. 垂直二等分線を描くため、両端を結ぶ直線を描く。(円は邪魔なので消しました)

f:id:donadonasan:20180819140045p:plain

5. 交点から直線の中点へと線を描く(これが垂直二等分線)。円弧の中心はこの直線上にある。必要に応じて延長する。

f:id:donadonasan:20180819140423p:plain

f:id:donadonasan:20180819140525p:plain

5. 直先端部と垂直な直線が垂直二等分線と交わる場所が、円弧の中心となる。

f:id:donadonasan:20180819140848p:plain

ちなみに、SketchUp!だと2点円弧を選べば上記4, 5は不要である。

f:id:donadonasan:20180819133637p:plain

2本の平行ではなく交わらない(ねじれの位置にある)直線を滑らかに結ぶ場合

 本題である。この条件では、両方の直線に対し同時に直角となる円弧は存在しない。多分。何しろ、円弧を描くには両直線が乗っている平面が必要なのだが、これが描けないのだ。そこで、2個の円弧で繋げることにする。

1. まず、両直線を繋げる。

f:id:donadonasan:20180819142436p:plain

2. 一方の直線と、今作った直線を使って直角三角形を作る。これが1つ目の円弧が乗る仮の平面となる。

f:id:donadonasan:20180819142406p:plain

直角三角形の直角な直線同士に接するように円弧を描く。

f:id:donadonasan:20180819142647p:plain

あとで回転しやすくするため、円弧及び一部平面以外を消す。このとき、円弧につながる直角三角形の辺の一部を残したほうが、後の作業がやりやすくなる。

f:id:donadonasan:20180819143741p:plain

試しに先ほど残した辺の一部を延長すると、直線端部と交わっていることがわかる(そこに線を伸ばしたんだから当たり前であるが)。

f:id:donadonasan:20180819144022p:plain

ここまでくれば、「2本の交わる直線を滑らかに繋げる」と同じ手法が使える。ただし、このままでは半径0の円弧でつなぐことになるので、先程作った円弧を好みに応じて角度を変える。円弧を作ったときの直線を中心に回転させれば、円弧と直線の滑らかな接続を維持できる。

f:id:donadonasan:20180819144337p:plain

下記は結果の一例。

f:id:donadonasan:20180819144746p:plain

f:id:donadonasan:20180819145143p:plain

 

コントロールカー完成

$
0
0

コントロールカー、完成。特徴が無い。

f:id:donadonasan:20180820233745p:plain

L4カー コントロールカー

あえて特徴を挙げるなら、中央にプレスされた「全車踏付禁止」の文字くらいか?

f:id:donadonasan:20180820234135p:plain

全車踏付禁止。天板は薄いのである。

全長3950mm, メタローチ(非接触近接センサ)を2組と、制御ドライバが入っている制御箱、マイコン?が入っている論理部から成る。メタローチの背面モデリングは未完成。写真がなかった。

モータカー仮完成

$
0
0

f:id:donadonasan:20180821215211p:plain

L4カー モータカー

L4カーのモータカー、仮完成。こいつはリニアモータと給電部を持っているんだけど、給電部を写真に取りそこねてしまい形状が分からないので、まだ仮。
昔とった写真に写っていたら更新する。

L4カー ディスタンスカー(作りかけ)

$
0
0

f:id:donadonasan:20180822224356p:plain

L4カー ディスタンスカー 作りかけ

ディスタンスカー、目立った役割が貨車の検知ぐらいしかないのに、妙に複雑な構造が多い。特に、上記画像手前のケーブルホルダーとか。なんでもっと素直な実装にできないのか、小一時間問い詰めたい。今日はここまで。

L4カー ディスタンスカー 完成(仮)

$
0
0

f:id:donadonasan:20180823213309p:plain

L4カー ディスタンスカー(仮)

ディスタンスカー、仮完成。特徴は末端にあるスカート及びメタローチと、中央にある回転灯?ぐらいか。ケーブルの本数が左右非対称なんだけど、状態がよくわからないのでとりあえず1本ずつ書いて仮完成。



L4カーの導入先

$
0
0

忘れないうちにメモ。

L4カー、少なくとも塩浜操車場(日立評論1975年6月号)と新南陽ヤード(日立製作所水戸工場展示)にて稼働していたことがわかっていたけど、東海大学鉄道研究会の写真から北上操車場でも可動していたことがわかった。レール構造やプッシャカーの構造からすると塩浜操作場の同型。

tokaitetsuken.web.fc2.com

L4カー全体像(仮)

$
0
0

f:id:donadonasan:20180824222257j:plain

L4カー 全体(仮)

L4カーの全体像。長すぎてよくわからん・・・。ところどころに寸法の矛盾があるように見えるので、ちょっと手直し必要だなあ。

Visual Studio2017でWindowsXp用プログラムをビルドする

$
0
0

事情によりWindowsXp用プログラムをビルドすることになったんだけど、WINVER等の定数をいじっても、出来上がったソフトが動かなかった。確か、有効な実行ファイルではありませんとか言われる。なんでかなーと思いながらオプションながめてたら、こんなの発見。Visual Studio 2017ではプラットフォームツールセットをXp用に変えないとだめみたい。

f:id:donadonasan:20180825232446p:plain

Visual Studio2017でXp用ソフトをビルドするときのオプション。VS2017のXp用ツールセットもありますがここには未表示



モータカー集電部

$
0
0

モータカーの集電部を作ってるんだけど、部品点数が多い上にバネまでいて苦戦中。日付変わる前に終わらなかった・・f:id:donadonasan:20180826235528p:plain

モータカー 集電部 完成

$
0
0

結局モータカーの集電部完成させてしまった。電線むき出しだし、本体に絶縁無しで直接つないでいるように見えるから、正しくはアースなんだろうけど。

これ、バネで集電部を押し付ける構造なんだが、なんでこんなに部品多いんだろう・・・。もしかして、モータカーを設置する際には3連ナットの左右2個および集電部を外して、レールと干渉しないようにするためなのか?

f:id:donadonasan:20180827003552p:plain

モータカー 集電部

f:id:donadonasan:20180827004042p:plain

モータカー 集電部 別角度








L4カー モータカーをちまちま更新

$
0
0

モータカーを引き続き更新。

謎の箱更新

写真照合したら寸法狂っていたので修正。また、箱と本体の接続方法を修正。ついでに、ケーブルが出てくるところを正確な形状にした。

f:id:donadonasan:20180828002429p:plain

摺電部

f:id:donadonasan:20180828003811p:plain

L4カー 摺電部

L4カーの摺電部の構造はこうなってるっぽい。すなわち、摺電部はスプリングによりレールに押し付けられていて、接触角の変化は回転軸が吸収する。やってることはシンプルなんだけど、部品点数が多い。これは多分、本体をレール上に置くときのことを考えてのこと。スプリングで摺電部を押し付けるという構造なので、レールが無いときは摺電部がレール位置よりも内側に来る。これでは、車体をレール上に置けない。そこで、おそらく下図のようにパーツを外してから本体を置けるようにしていると思われる。・・・それでも、なぜアームの支点がこんな構造なのかは謎なんだけど。

f:id:donadonasan:20180828004659p:plain

ダイアログのコントロール上でも右クリックでメニューを出したい

$
0
0

ダイアログ上で右クリックした際にメニューを表示するには、OnRButtonUpあたりをオーバーライドしてやればいい。しかし、OnRButtonUpはダイアログ上のプログレスバー等の上で右クリックした場合には呼び出されない。これは、ボタンの上で左クリックした場合等を考えると当然の挙動である。

これを解決する方法は2つある。

  1. 各コントロールのクラス(CButton等)を継承したクラスを自作しOnRButtonUpを実装する
  2. 各コントロールのOnRButtonUpを呼び出す処理に割り込む

今回のように、どのコントロールの上で右クリックしてもメニューを出す場合は2.が圧倒的に楽である。では、OnRButtonUpを呼び出す処理に割り込むにはどうすればいいか?MFCではWindowProc()をオーバーライドすればよい。Spy++でメッセージの流れを見たところ、WM_SETCURSORをトリガーに各コントロールのOnRButtonUpを呼び出しているようなので、これに割り込むことにする。

f:id:donadonasan:20180829195728p:plain

以下、サンプルコード。

gist4ebf951cb429e8a6fc482f2dc5f980ea


CProgressCtrlのSetStateが反映されない

$
0
0

CProgressCtrlの色を変えようとしたがハマったのでメモ。

CProgressCtrlは、WindowsThemeが有効だとプログレスバーの色を変えるSetBarColorが無視される。そこで、SetStateでPBST_NORMAL, PBST_PAUSED, PBST_ERRORのいずれかを指定することでテーマに沿った色に変えることにした。しかし、なぜか変わらない!

ブレークポイントを設定したら変わることに気づいたので、ためしにバーの値更新周期を50msから500msにしてみたら、動いた。こんなの気づかないよ・・・。どこにもドキュメントされてないし。

以下、更新部分のソースコード

 

Updating CProgressCtrl State

追記:どうやら、プログレスバーの長さが変わっている最中にSetStateしても無視されるようだ。Vista以降では、SetPosで長さを変えると、その長さに向かってプログレスバーが伸びるアニメーションをする。このアニメーションをキャンセルすることで、瞬時にSetStateが有効になる。

 以下、サンプルコード。

gist.github.com

タブコントロール内のダイアログがESCキーで閉じてしまうのを防ぐ

$
0
0

タブコントロールを実装するには、各タブに相当する枠なしダイアログを用意するのだが、困ったことにESCキーを押すとこのタブ内のダイアログが閉じてしまい、真っ白になってしまう。これを回避するには、タブ内の各ダイアログのOnCancel()をオーバーライドして何もしないようにすればよい。

 

gist551c663846c21afcddbd3044974fc758

ProgressCtrlの上に文字を表示

$
0
0

プログレスバーの上に文字を表示する必要が生じたのだが、標準のCProgressCtrlは文字表示機能が無い。どうも、Windowsのデザインガイドではテキストを表示するな!となっているようだ(1次情報未確認)。そこで、他の方が作ったものがないかなーと調べてみるも、バー部分も独自実装とするものしかなかった。そこはWindowsのものを使いたかったんだけどなあ。仕方ないので、reidphoaさんのCInfoProgressBarをベースに、バー表示をWindowsが担当するように改造した。SetWinowTextで表示する文字を設定可能。

Add text on progress control

ブログをやっていてよかったこと

$
0
0

最近、ブログをやっていて良かったなーと思うのは、過去に調べたことが記録されていること。ブログの定義から、当たり前なんだけど。今作っているプログラムにしても、過去のブログ記事が非常に役立っている。Unicode<->マルチバイトの変換とか。

CInfoProgressCtrlの更新(プログレスバー伸長速度を切替可能に)

$
0
0

CInfoProgressCtrlはCProgressCtrlを継承することでプログレスバーの上に文字を表示できるようにしているのだが、このプログレスバーの欠点の一つに、バーを伸ばす速度が制限されている、というのがある。バーが縮む方向ならば瞬時に縮むので、これを利用して

SetPos(a+1);

SetPos(a);

というコードで回避するのが一般的である。ただし、これではaがRangeの上限に等しかった場合に対応できない。a+1まで伸ばせないからだ。これに対処するには、

SetRange(0,a+1);

SetPos(a+1);

SetPos(a);

SetRange(0, max);

というようなコードを書けば良い。しかし、毎回これを書くのは面倒なのでCInfoProgressCtrlを書き換え、自動でこれをできるようにした。

今回、Publicな関数としてbool SetSmoothMove(bool smooth)を追加した。これの引数smoothにfalseを設定すると、上記処理を自動でするようになる。なお、初期値はtrueなので既存のコードへの影響はないはず。

gist3a185c716e3bff2da938623bf844cdd9

Viewing all 552 articles
Browse latest View live