天命を知る日にMLCadのTipsを語ろうと思うだなんて、たぶんそういうことなんだな。

**※この記事は、[ETロボコン Unofficial Advent Calendar 2021](https://qiita.com/advent-calendar/2021/etrobo) 5日目に向けて書かれたものです。**

## ユースケース記述

**ユースケース名：**MLCadのTipsを語る
**目的：**LEGO® SPIKE™ Primeなど、レゴ社製のパーツ（特にTECHNIC系）を組み合わせて作ったモデルをMLCadで起こす際に知っておくと便利な知識を読者に伝える~~フリをしてEpsilonSpiker Conceptの構造をさりげなくリークする~~
**事前条件：**読者はLDraw系各種ツールに関する知識を持ち、MLCadの基本的な使い方を知っている
**基本系列：**

- レゴ社製のパーツに関する情報を整理し伝える
- LEGO® SPIKE™ Primeに含まれるパーツのIDを調べ、直接IDを指定してのパーツ配置方法を伝える
- 水色(Medium Azure)などLEGO® SPIKE™ Primeで特徴的な色の指定方法を伝える
- 53.13°など、パーツを適切に回転させ斜めに組み合わせていく方法を伝える

**事後条件：**読者はLEGO® SPIKE™ Primeを用いたイプシロン走行体のような斜めに組み合わせられたモデルをMLCadで適切に描くことができる

## レゴ社製パーツの種類と色について
　レゴ社製のパーツは、長い間色と形が図示されるだけで、パーツの種類や色などの正式名称がエンドユーザーの目に触れることはありませんでした。もちろん知育玩具としてはそれで充分だったわけなんですけど、コンピュータとインターネットの伸展によりBrickLink™のようなパーツの中古販売サイトやLDrawの様なサードパーティ製CADソフト群が出現しました。この時、公式な正式名称が公開されていなかったという歴史的な背景により、各サイトやシステムが別々の名称やコードを割り振らざるをえなかったためカオスです。
　例えばPeeronなど積極的なメンテナンスが行われていないものを除くと（個人的にはもともとPeeron派だったんで残念なんですけど…）、現在でも信頼できる主要なレゴ社製パーツデータベースには以下のようなものがあります。

### The LEGO Group本家　[US版Customer Service](https://www.lego.com/en-us/service/replacementparts/sale/location)
　本家の公式なのでこれ以上なく正式なデータです。おおむね1996年以降に発売のキットに関して全パーツデータが検索可能です。従って、1995年以前のキットに関してはサードパーティに頼るしかなさそうですが、25年以上前のものですので、実質的な実害はなさそうです。もっとも、後述の「Brickset」もこのデータベースをAPI的に利用しているようで、Bricksetの方が見やすくてお勧めです。
　また、レゴ社公式CADツールとして「LEGO® Digital Designer（LDD）」もあったのですが、使えるパーツが網羅的ではなく滅茶苦茶使い辛かったので早々にディスコンになってしまいました。

### LEGO BrickLink, Inc.　[BrickLink™](https://www.bricklink.com/) / [BrickLink™ Studio](https://www.bricklink.com/v3/studio/download.page)
　日本でも「ブリリン」として超有名な、中古のレゴ社製パーツ販売仲介サイトです。2000年にサードパーティとして設立以来全世界で絶大な支持を得るも管理人が2010年に不慮の事故で死亡…それを乗り越え、現在ではコミュニティベースでの活動でありながらThe LEGO Groupの一員としてサービスを展開しています。このように、現在では公式と言っても過言ではないんですけれど、歴史的な背景からパーツや色の名称やコードは本家のものとは異なっています。
　また、CADツールとして「BrickLink™ Studio（BLS）」もリリースしており、まぁ実質的にはLDDの後継と言えるでしょうか。もっとも、こちらもパーツデータは本家のCADデータをベースにしたものではなく、LDrawベースとなっています。

### [Brickset](https://brickset.com/)
　1997年からキットのデータベースを運営している老舗です。近年は前述の本家データベースからパーツデータを取得するようになり、サードパーティながらもデータは公式のものかつ一覧性が良く非常に使いやすいサイトです。棚橋はデータの検索にここを使っています。

### [LDraw.org](https://www.ldraw.org/)
　もともとは1995年にJames Jessimanによって開発されたDOSアプリケーション「LDraw」にて採用されたテキストベースのファイルフォーマットでした。しかし、Jamesは1997年に26歳の若さで他界。以降もコミュニティによって継続的にメンテナンスされているオープンなCADデータおよびツール群です。実質的なデファクトスタンダードで、コミュニティ管理とはいえ新パーツの登録はものすごく早いです。
　パーツは原則として本家のデザインNo.をベースにしていますが、色コードは一部独自のものも含まれており、本家色コードとの変換は、[Colour Definition Reference](https://www.ldraw.org/article/547.html)のページを使うのが良いです。例えば良くある薄い灰色のパーツは、本家では「Medium Stone Grey(194)」ですが、LDraw系ツールでは「Light Bluish Grey(71)」を使うことになります。

## MLCadのTips
　LDraw系ツールにはいくつかのCADツールが含まれており、MLCadはその中でもインターフェイス的には古めな部類に入るかなと思います。ただ、数値入力でビタっとパーツを配置することができ、特にテクニック系パーツを複雑に組み合わせていくときには重宝するので、棚橋としても色々浮気はするのですが結局MLCadに戻ってきてしまいます。とはいえ、使いこなすには色々細かいテクニックを使いこなす必要もあるので、ここでいくつか紹介したいと思います。

### パーツの配置
#### 1. 使用するキットのBricksetページを開く
　例えばLEGO® SPIKE™ Primeの場合、セット番号は#45678なのでめっちゃ覚えやすいですよね。これを入力して検索すると出てくるので、この青い「45678-1」の部分をクリックするとパーツ一覧を閲覧できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/355998d1-10f8-a404-50e5-a6bc4ec27be9.png)
　ここから配置したいパーツを選びます。例えば、「ボールキャスター受け」にしましょうか。これをMLCadで配置する場合、まぁTechincだろうと言うのは判っても、パーツ一覧から探すのは大変ですよね。なので、まずはBricksetで調べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/684d3870-43d5-8cb2-0975-3b14abf8ffee.png)
　この例のモーターみたいに本家で画像がない（なんでやねん）ものもありますが、LDrawにはあるので大丈夫です。
　さて、ボールキャスター受けの本家正式名称は「Beam 3x5 W/Dia.19 Wheel」であることが判ります。ちなみに「W/」はwithの略、「Dia.」はDiameter（直径）の略です。
　その下に青い囲みが4つ並んでいますがそれぞれ：

- 6261590 … **エレメント**
    - 「エレメント」は原則としてレゴ社内の全パーツでユニークに割り当てられているIDです。パーツ形状と色の組であったり、シールやパッケージの様な物にも割り振られています。セットに同梱の組立図などで提示されている番号もこれです。
- 39370 … **デザインNo.**
    - パーツにも刻印されている、パーツ形状を表す番号です。CADでパーツを配置する時にはこの番号を指定することになります。
- 2020 … **初登場年**
- MEDIUM AZUR … **本家色名称**

　なので、「Medium Azurの39370を配置する」、とまずは意識します。

#### 2. LDraw系の色コードを検索する
　サクッと前掲の[Colour Definition Reference](https://www.ldraw.org/article/547.html)で検索しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/b437b167-6955-d212-24c1-f82b116cafff.png)
　Medium AzurはLDrawでは「Medium Azure」で、色コードは本家と同じ322であることが判ります。なので、心の中で「39370の322、39370の322…」と繰り返しながら操作します。

#### 3. MLCad上で適当なパーツを配置する
　マジなんでもいいです。ここではその辺に適当に表示されている「Brick 1x1」を配置しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/a182b16f-4743-592e-5425-f03bc7a62863.png)
　心の中ではまだ「39370の322、39370の322…」と繰り返しています。

#### 4. 配置したいパーツに選びなおす
　配置済みパーツリスト上の対象となる手順のパーツ（ここでは「Brick 1 x 1」）が書かれている行をダブルクリックすると、「Select Part」のダイアログが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/f09bd23e-59e4-2347-9af3-d360d8abb5fa.png)
　ここでおもむろに「39370」と入力します。数字だけでリターンキーは叩きません。どこにも表示されませんがそれでOKです。逆に、どこかに入力しようとは思わないでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/e4550eb5-1b42-3bc9-e173-2f17c37c17c9.png)
　「39370.dat Technic Beam 5 x 3 H-shaped with Ball Socket」が選択できます。このように、本家とLDrawでは名称が全く異なります。
　よくよく見ると、その下に「39370c01.dat」もあります。デザインNo.の後ろに「c」が付いているものはComplete、一般的に複数のパーツを組み合わせて使うものがセットになっているデータであることを指しています。39370の場合はキャスターボールが組み合わさった画像でおあつらえ向きです。「39370c01.dat」の方を選択して「OK」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/9c6b20e4-9661-585b-b178-079c53235a92.png)
　「～with White 19mm B(all)」が配置できました。ただまだ黒いままです。

#### 5. 正しい色に直す
　色コードが322だったことを思い出し、「Colorbar」右端の「More」と書かれた「Part Color...」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/cc8b2d2a-a7e3-18c3-08e3-ddfdaa50fe75.png)
 「Color number」にフォーカスがあるので、そのままおもむろに「322」と入力しOKを押します。色見本から選択することはかなり慣れないと難しいかなぁって思います…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/097803a1-c57e-cfd9-2606-0437b9251062.png)
　無事、Medium Azureのボールキャスターを配置できました。なんかこんな感じです。

### 53.13度系のパーツを配置する
　なんでBent系ビームって53.13°とか中途半端な角度なんだ!!!!と日頃お怒りの方はこちらをどうぞ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/b444b5eb-eaf7-a25f-ef3b-7eb9c29c87ff.png" width="444">
これを知っているとBent系ビームを切らしても53.13°が作れますよ。なんだかよく判らなくても、とりあえずここでは、なんとなく0.6と0.8って数字を覚えておいてください。

　さて、下のように配置してから、右上、Bentの先にパーツをくっつけていきたいとき、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/7affc330-9813-8e9c-bf1c-add2669a4a23.png" width="550">
いちいちパーツを回転させてくっつけるのは大変です。そこで、まずはBentビームの曲がり角を中心に回転させてしまい、パーツを配置し終わってから再び元に戻すと楽です。
　ただ、普通に回転させようとすると、各パーツの原点（Parts Origin）を中心に回転するため、ビーム下側のアクスルペグを中心に回ってしまいます。これを変更するには、`Settings`メニューから`Rotation Point...`を選択し、`Define Rotation Point`ダイアログを開きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/3861fc53-282b-33d8-0c0d-ea3bb06536ef.png" width="172">　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/a30d413a-345e-65a2-61cd-6309977003bf.png" width="400">

- Part origin ... 各パーツに設定されている**原点**で回転させます
- Part center ... パーツの**中心**で回転させます
- Part rotation point ... 各パーツに設定されている**回転点**で回転させます
- World origin [0/0/0] ... **ワールド座標系の原点(0,0,0)**で回転させます
- Custom point ... 下のX/Y/Zボックスで指定した**ワールド座標系上任意の点**で回転させます
- Show rotation point ... 上記で設定した回転の中心を画面上でも表示します
- Allow on-screen change ... `Custom point`モードの場合、画面上に表示されている回転の中心をドラッグして移動させることができるようになります。

　ここでは、パーツ系モードがいずれもハズレですので、`Custom point`モードを使います。Bentビームの配置位置は(80,-30,80)とPosition欄にありますので、ここから3M＝60ユニット上が曲がり角ですから、(80,-90,80)を指定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/4cc7c37a-ed55-773d-b20e-5ac461a95476.png" width="400">
　回転ポイントが曲がり角の真ん中についていることを確認したら、このパーツだけ回すのもそれはそれで面倒（後述）なので、一番先頭の配置パーツをクリック、次に一番最後の配置パーツをSHIFT+クリックし、すべてのパーツを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/81e422d7-2d6c-26d4-5144-f813b82dd9c5.png)
　そんな訳でX軸反時計回り53.13°の[回転行列](https://ja.wikipedia.org/wiki/%E5%9B%9E%E8%BB%A2%E8%A1%8C%E5%88%97)は、前述の数値を当てはめると
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/6b08bb5e-d565-3939-3345-29ffed742219.png">
なので、これを横に並べて`1 0 0 0 0.6 -0.8 0 0.8 0.6`が`Rotation matrix`に指定すべき値という事になりますので、`Enter Position Rotation...`ボタンでダイアログを出して、値を設定するとスパッと回転します。もちろん、回り方がおかしいと思ったら即Ctrl+Zしてくださいね。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/03c81b55-dc00-7973-cd1f-746407e554e3.png" width="400">
　きっちり回ってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/d81639f7-a771-760d-15ae-74aa88ce76b9.png)
　この状態でパーツを配置していきます。Bentビームの手前までですね、これは後で戻してからコピペするので。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/9f497bd7-8cff-e80d-691b-814757e9f47d.png)
　元の角度に戻すときは、先ほどと同様に全ての配置パーツを選択し、`Rotation matrix`にさっきのsinΘと-sinΘを逆にした`1 0 0 0 0.6 0.8 0 -0.8 0.6`を指定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/de4cd347-f14e-8346-95af-89f9b62ae2ab.png" width="400">
　元の角度に戻りましたので、反対側はコピペして仕上げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/fce84177-427a-2f42-3c7f-823da6ab9bfb.png)

### 斜めに接合するアッセンブリーを組み合わせる際の工夫

　リア部分は地面に対して水平に組み上げていったので、フロント部分と接合する部分は53.13°傾いています。このままくっつけるのは至難の業ですので、接合部の中心を軸に回転させたいのですが、組み上げる過程でここの座標は(0,15.971,152.037)になっていて回すのが大変です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/ccaf9d1e-2031-9071-fe43-edd7527a4619.png)
　そこで、この回転の中心をアッセンブリーでのワールド座標原点(0,0,0)に調整しておくと、ここがParts Originとして回転させることが出来て便利です。全部を選択してから目的の座標が原点になるように移動させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/f7e4cb13-21ff-6187-0295-5c136f9b1577.png)
　接合する時は、先ほどと同じくX軸反時計回りですので、`1 0 0 0 0.6 -0.8 0 0.8 0.6`を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/abb59ff7-6817-6ab4-27a2-31a37af88782.png)
　適当に回転してから座標を合わせ（1の位をゼロにするだけでも随分合わせるのが楽になります）、くっつけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/f1e99cfe-fb8d-0fa7-e542-0a562030c422.png)
　残りのAピラー基準で取り付けるアッセンブリーを組み上げてから、また先ほどと同じ回転行列を使って引き起こします。この時、左右前輪車軸の中心がワールド座標原点になっていると後々便利なので、フロント部分のアッセンブリーの原点がそこになるよう調整して`1 0 0 0 0.6 -0.8 0 0.8 0.6`で回します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/8fa89b6a-4e4e-d1f8-7ac4-4638b5005141.png)
　リア周りに移ってCピラーを立てますが、リア部分は(0,15.971,152.037)を原点にするようずらしてあります。この一の位以下の部分、(0,5.971,2.037)をオフセットさせて位置を調整するとはめやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/1a5d785f-f3a5-4ba0-9672-9c71cd918512.png)
　上で設定したオフセットは次以降のパーツ配置でも有効ですので、あとは、Cピラー基準のアッセンブリーを組み合わせていって完成です（まぁ、実際にはそこまで単純でもないんですけど、もしも機会があれば続きはいつか）。

### 53.13°回転行列まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151581/8ec7cf4d-3ff4-9099-11ca-39903b2f7ff5.png)

　…そんな訳で、この全く以って誰得な投稿の執筆が40代最後の仕事となりました。僕がETロボコンやLEGO®の世界にやって来たのは30代の終わりだったのですが（それまでは全然LEGO®遊びとかもあまりやってなかったんですよ）、この世界と巡り会えたおかげで楽しい40代を過ごすことが出来ました。再来年度向けにもまた新走行体の企画を行いますけれど、この辺りの職人が増えると幅が広がると思うんですよね。
　ETロボコンの走行体を作ってみたい方、いませんか？　ぜひご一緒したいです！

## "[Fair Play](https://www.lego.com/en-us/legal/notices-and-policies/fair-play/)" notation
LEGO®,SPIKE™ and BrickLink™ is a trademark of the LEGO Group of companies which does not sponsor, authorize or endorse this article.