2017年11月12日

スクリプトを使って作業を効率化!



「 スクリプト(マクロ)を使って作業を効率化 !」
ネットでよく見かける文言ですが、実際、実務に取り入れている人はどれほどいるのでしょうか?


最近、新人教育的なことをやっているのですが、「日頃の作業で困っていることない?」って訊いても、何も返ってこない...。
何か作業していて、面倒だなぁとか、もっと簡単な方法ないかなぁ?とか思わないのだろうかと。


そんなに漫然と仕事しているのかとも思ってしまいますが、どうも、そういうことではないらしいです。
彼らは彼らなりに一生懸命仕事しているのです。
ただ、そんなことが出来るって、"知らない"だけらしいのです。


知らなければ、そんなもんだと思って作業するだけですよね。
スクリプトに限ったことではなく、日頃使っているソフトでも、知らない機能って使わないものです。


「こんなツールがあるよ」って、教えるより先に、基本的なカスタマイズの知識を教えたほうがよいかもと思い始めています。
多少でも知識があれば、出来るか出来ないかくらいには、気付けるようになるかもしれません。


気づけば、質問してくれるようになるかもしれませんよね。

2017年10月17日

formZ8.6 WIP

やっぱりv9は今年中には出ないですね...。
今頃8.6出るようじゃ。

2017年10月16日

Revit Macro : Purge ImportInstances

やっと出来ました。
分かってしまえば簡単なんですが、そこまでが大変。

ファミリをモデリングする時に取り込んだCADを一括削除するマクロです。






2017年10月2日

Revit Macro : マクロで最初に生成したオブジェクトを消すと、次からエラー

ヘルプのサンプルコードをコピペして柱状体を作ってみました。

最初は成功します。
ただし、一番最初に作ったオブジェクトを削除してしまうと、次からエラーになります。
2番目、3番目に作ったオブジェクトは削除しても大丈夫ですが、最初に作ったものはデリートしたらダメです。
なぜそうなるのか不明なんですが、どなたかわかる方いませんか?...。


2017年8月10日

Rhinocerosでバッチ処理

複数のファイルを一括処理

先日、そういう案件があって、AutoCADのScriptと一緒だと思って、
やってみたら少しハマったのでメモ的に残しておきます。

RhinocerosではMacroと呼びます。
書き方自体はAutoCADと一緒です。
ダイアログが出ないようにハイフン付きのコマンドを使います。
http://docs.mcneel.com/rhino/5/help/ja-jp/information/rhino_scripting.htm

ファイルのパスは_SetWorkingDirectoryコマンドで作業フォルダを指定します。
あるいはフルパスで指定したほうがよいです。
実行はマクロエディタからが簡単です。

下のマクロは
テンプレートを開いてpdfをインポート、25%にスケールして、全体を起こして、dwgとして保存して、全体ズーム、3dm保存。スクリーンキャプチャを撮る(ログとして)













2017年7月30日

Maya2014 : Linear Workflow with MentalRay

自分はモデラーなので、正直、レンダリング関連のことには疎いです。
でも先日、レンダリングの担当者が居なかったので仕方なくMaya2014でマテリアルのアサインをやりました。
普段も"仮の"マテリアルアサインくらいはやるのですが、きちんとレンダリングするためには結構煩雑で難しい設定が必要です。
改めていろいろ勉強し直さなければなりませんでした。


一番わかりにくいのは、"正しい色"をどのように出すかということです。


Mayaに初めて触る人は、まあ、まともな出力を得ることは出来ません。
ポチッとレンダーボタンを押したらMentalRayでキレいな絵が出てくるということはないので...。


リニアワークフロー

そもそもウチのプロダクションはリニアワークフローを導入しているので更に煩雑です。
ビューポート上でも、まともな色を表示しないので大変わかりにくいです。


スタッフ全員がリニアワークフローをちゃんと理解していないのもほんとはちょっと問題ですね...。
大手プロダクションのように自動でそういうややこしいことをやってくれるスクリプトも無いし、後工程の人は色々チェックしないといけないことが多いはずです。
頭が下がります...。


リニアワークフローについてはちょっと検索すればたくさん情報が出てきます。
今回はMaya2014の話しで、新しいMayaではちょっと違うので、
考慮しないといけないポイントだけ挙げてみます。


  • レンダリング設定
    • Color Managementを使う
    • 出力はOpenEXR(ポスプロでGamma補正する)
    • QualityタブのFrame bufferのDataTypeをRGBA(Float)4x32 Bit
  • カメラのレンズシェーダーのガンマ設定
    • Color Managementを使うなら1.0
  • マテリアルのガンマ補正
    • 色だけのシェーダーにはGammaCorrectノードで0.4545(=1÷2.2)
    • 色味だけのスペキュラはガンマ補正
  • テクスチャのファイルノードのカラープロファイル設定
    • DiffuseのテクスチャはUse Default Input Profile
    • Bumpのようなら大きさを表す画像は入力をsRGBに
    • HDRは元からリニア
  • ViewPort2.0のガンマ設定
    • マテリアルをリニアにしているなら、2.2に補正すると正しい色になる
    • テクスチャはGammaCorrectを挟まないと補正できない
  • レンダービューの表示設定
    • 表示用はsRGB








2017年7月3日

MayaでShapeファイルを読み込む

Shapeファイル(ESRI Shapefile)を直接mayaに読み込めれば、
DEMから作ったメッシュの位置合わせが簡単になるかもと思ったので、PyMelでやってみました。

調べてみるとpyshpというモジュールが公開されていて、非常に簡単にShapeファイルをパースできます。
https://pypi.python.org/pypi/pyshp
compatible with Python 2.4-3.x.と書いてありますがmayapy(2.7.x)でも動きました。

Map3DやCivil3Dが無くてもとりあえずなんとかなりそうですね。



2017年6月23日

Weed Polylines (Simplify Polylines)



頂点が非常に多いポリラインをなんとか軽く出来ないか?
"無駄な頂点を削除しつつ、形状特徴を残す"

きれいな等高線が欲しい時にこういう機能が使いたいわけですが、簡単そうでなかなか難しいです。
なのでちょっと調べてみました。


AutoCAD

検索してみると標準のAutoCADにはこの作業に使えるコマンドが無く、
Map3DやCivil3Dに"Weed Polylines"(ポリラインを間引き)というコマンドがあります。
標準のAutoCADでやるにはAutolispなどでスクリプトを書くしか無いわけですが、書いている人いました。
https://superuser.com/questions/263669/how-to-simplify-a-polyline-in-autocad



formZ

formZv6.xのReduceMeshコマンドを使うと簡単に頂点を間引きできます。
ただし指定できるパラメーターは "角度" のみです。

formZv8.5ではPolgonizeコマンドで頂点の間引きができます。
指定できるパラメーターは "頂点数" といくつかのチェック項目のみです。
これだとベクトルライン(ポリライン)の元々の頂点数を考慮しないと適切な処理が出来ないので一括処理は難しいです...。

formZ場合、コマンドがあるだけマシなのですが、問題はデータが重いと非常に時間がかかるということです。
何十MBもあるCADデータだったりするとほとんどフリーズしてしまいます。




Rhinoceros

Rebuild Curveコマンドで行けるのですが、これも個々のCurveの頂点数を考慮しなければいけません。
一括処理するためにはスクリプトを書く必要があります。
検索してみると、forumに同じことを質問しているスレがあり、ユーザーがスクリプトをアップしていました。
https://discourse.mcneel.com/t/simplify-polyline/38560/14

こちらのスクリプトの場合3次のカーブになってしまいますが、それで良い場合は問題ないと思います。

RhinoScript.orgにもスクリプトありました。
http://www.rhinoscript.org/scripts/114
でも一括処理が出来ないようで...残念。



RhinoPython

自分もPythonで書いてみたのですが理想的な間引きをするのがなかなか難しくてまだ改良が必要です。

参考にしているのはAutoCADのWeed Polylinesコマンドです。
https://knowledge.autodesk.com/support/autocad-map-3d/learn-explore/caas/CloudHelp/cloudhelp/2016/ENU/MAP3D-Use/files/GUID-E04B543E-29E7-4545-A4FA-DDDF861E4960-htm.html
大変シンプルなアイデアなのですが、これだけでは自分の思ってる感じにならないようで...。今後の課題です。


2017年6月5日

Grasshopper : Ladybug Tools



てんとう虫、ミツバチ、蝶...いったいなんのこっちゃ?って感じですが、
これを使うとRhinoceros+Grasshopper上で様々な環境シミュレーションができます。
Ladybug Tools

ちょっとだけ試してみました。
ソーラーパネルに見立てた傾斜のあるBrep面にどのように太陽光が反射するかを見てみました。

時刻や何月というのをスライダーで変えられるのですが、重い!
ソーラーパネルのBrepの数が多いとほとんどフリーズしたようになってしまいます。
メガソーラーとかだと簡単にシミュレーションするのは難しいかもしれませんね。

2017年5月21日

TIN to OBJ


LANDXMLをOBJに変換する方法

航空レーザー測量の会社から来たファイルなのですが、.XMLとか.RNDというメッシュデータのはずなのに見慣れない形式でした。
TINだと言われたのですが普段使っているformZやMayaでは開けそうもない...。
調べてみると3ds maxで開けそうです。

でも実際やってみると開かない...。
たぶんファイルサイズが大きすぎるせいでしょう。(300MB以上ある)


簡単な方法

XMLの中身をよく見てみるとデータ構造がOBJと一緒なことに気づきました。
点の座標データと点のインデックスによる面の定義です。


そこでEmEditor上でOBJのフォーマットになるように整形してみたところ、Mayaで開くことができました。(Mayaだと1秒で開きました。)
OBJなので他のCGソフトでも開くはずです。

ポイント

  • 測量データなのでXとYを入れ替える
  • Yアップ系のアプリに持っていくなら、YとZも入れ替えて符号を反転する
  • 法線の向きが反転するようなら、面のインデックス番号の並び順を入れ替える
  • グループ名を先頭につける。名前の先頭は数字以外のアルファベットにする
  • ファイル名を.objにする


CG系のアプリで開くならこの方法が一番早そうですね。







2017年5月19日

Grasshopper : テキストファイルの読み込み


勉強を進めようという前にごく基本的なデータの取り込みで少しハマりました...。
単純な座標データの取り込みなんですが、やってみるとなかなか思い通りにいかないもんです。
Grasshopper 0.9.0076

Read File Component

読み込むだけなら Read File で簡単にできるのですが、そのあとの整形・変換が注意ポイントです。

Split Text Component

Read File で取り込むと1行ずつの文字列のリストになります。
座標データなので各カラムを分割して数値に直す必要があります。
文字列の分割には Split Text を使いますが、"セパレータ文字"を指定するところで注意です。
※1列目はインデックス番号


使いやすいようにとセパレーター(区切り文字:Delimiter)を Value List にしてみたのですが、これが問題で書き方によって認識したりしなかったりします...。



カンマとスペースはダブルクォーテーションで囲む。
タブは通常プログラムコードではエスケープして ¥t と書くのですが使えないようです。
{tab} というGrasshopper上の特殊文字の指定も認識しません。
結局、Panelでタブ(エスケープしないで)を接続したら機能しました。

区切り文字にタブは向かないということなのでしょう...。




GhPython Component

取り込みと整形・リスト化にPythonを使う方法も試しました。

こちらも区切り文字(Delimiter)を指定できるようにしたのですが、
ここでは Value List でシングルクォーテーションで囲った¥t が使えます。
{tab}も使えます。
逆にダブルクォーテーションで囲った¥t はダメでした。



IronPython.Runtime.List

Pythonを使う時、ちょっとわかりづらいのがPythonのリストを直接出力できないということです。
そのまま出力しようとするとIronPython.Runtime.List というリストになって、データとして認識しません。
forumの過去スレを調べて解決しましたが、初心者にはわかりづらいポイントですね。

DataTreeで出す方法







点として出す方法


















2017年5月12日

Revit API : 独習


Revitでもマクロが書けるようになりたいなぁと前から思っていたのですがようやく一歩踏み出せました。

未知の世界

なんせ全く知らない世界なので取っ掛かりがわからなかったのです。
とりあえず、マクロIDEを起動してサンプルをコピペしてみてもエラーで動かない...。?
うーむ、わからない。
動かない...。

といったことを繰り返していたのですが、どうもRevitではコードの実行スタイルによって若干作法が異なるということがわかりました。
さらにRevitの進化と共にAPIも更新されてきているので、参照したコードが"すでに古い"なんてこともあります。
だから単純にコピペしても動かない場合が多いのです。
まあ、APIドキュメントをちゃんと読めばわかることなのですが、はじめからそんなもの読むなんて面倒ですからね...。


開発言語

RevitではC#、VB.NET、Ruby、Pythonといった言語が使えますが、
今のところ、C#以外はサンプルがほとんど無いので非常に勉強しにくいです。
自分のように独習するなら始めはC#から入ったほうが良さそうです。


C#

C#は初めてなのですが、基本的な書式はC言語風で自分には馴染みのあるものです。
またVBに似た関数もたくさんあり、ExecelVBAなどを書いたことがある人にも親しみやすいと思います。
C#もまた進化を繰り返してきた言語で色々高度なことができる代わりに、自分のような"非職業プログラマー"には結構難しく感じます。
もっとも、わからない機能は使わないのであんまり関係ないですが...。


初めてのマクロ

やはり勉強は実用的なものを題材にしたほうが捗ります。
今回は、ファミリを作る時に、一括で平面図・正面図・側面図のCADを取り込んで適切なビューに配置するマクロを作りました。
社内の命名規則に沿ったファイル名さえついていれば、ワンクリックでCAD図配置完了です。






2017年4月30日

Grasshopper : Elk

Elkを試してみました。
ElkはGrasshopper用のアドインで、OpenStreetMapから書き出した地図ファイル(.osm)を読み込んでRhino上に地図モデルを作ることができます。
Rhino以外全部無料なのはよいのですが、最も重要な地図データがショボい。特に日本のデータは...。
オープンソースなので仕方ないですけどね。

個々の建物データにheight情報があれば高さのある3Dの建物モデルを作ることができます。
地図好きな方はご近所の情報を追加してください。
アカウントを作ってログインすると誰でも自由に地図を編集できます。


ElkはFood4Rhinoから。


2017年4月15日

無料で地形メッシュを取得!2

実は国土地理院のページで直接3Dデータのダウンロードができます。
地理院地図3D
恐らく元データは数値地図なのでしょうから、かなり高精度なのだろうと思います。


もともと触れる3D地図が作れる!(3Dプリンタで)とかいうコンセプトのものですが、簡単に地形メッシュを取得できるのでCG屋にとっても便利かもしれません。
ただし、アップにするとギザギザ...。触地図向けだからかな?それともデジタルすかし的な?

少し引くときれいなメッシュが取得できます。


2017年4月9日

国土地理院の基盤地図情報から地形メッシュを作る

地形メッシュを無料で作る!


[必要なもの]

  - 数値標高モデル
  - 基盤情報のダウンロードに必要な登録
  - 基盤情報ビューワー
  - 平面直角座標系
  - テキストエディタ
  - MeshLab
  - MeshMixer




[数値標高モデル]

  いわゆるDEMといわれるものを入手する必要があります。
  これは国土地理院のページからダウンロードできます。
  https://fgd.gsi.go.jp/download/menu.php

  数値標高モデルのボタンを選択すると、
  エリアを選択するための画面になります。
  ダウンロードしたいエリアを選択して、
  ほしい情報にチェックを入れてダウンロードします。
  今回は5mメッシュだけいいですね。
  ※ダウンロード時にログインとパスワード認証が必要です。

  ちなみに緯度・経度がわかっていると検索しやすいです。

  ビューワーのダウンロード

 [読み込み]
  ビューワーをインストール・起動したら、
  ダウンロードしたファイルをドラッグ&ドロップでデータを読み込めます。
  ※ZIPファイルを解凍する必要はありません。

 [書き出し]
   書き出したいエリアをズームして、ビューワーの画面いっぱいにしてエクスポートします。

  "エクスポートー標高メッシュをシェープファイルへ出力" を選びます。
  ブラウズボタンからテキスト形式.IDXYZ(*.xyz)を選んで保存します。


  この時大事なのが "直角座標系に変換して出力" をチェックすることです。
  書き出しエリアが何番系なのか調べて置きましょう。

  [地図データ]
    後で航空写真をテクスチャとして貼るなら、
    地図データも出してあげると位置合わせがしやすいと思います。
    .SFCで書き出せば、JWWなどでDXF変換できます。



  書き出されたデータの中身はこんなフォーマットになっています。


  IDとX、Y、Zの座標値の4つのコラムで構成されています。


[測量座標系の変換]

  基盤情報ビューワーから書き出された点群データは測量座標系になっているらしく、
  XとYが反転しています。
  そのまま変換してCGソフトに取り込むとひっくり返ったりしてややこしくなるので、
  CGソフトに持って行く前にテキストエディタで修正してしまうと楽です。

必要なのは以下の作業です。
  - IDの列を削除  ※座標系の変化とは関係ないですが1列目は不要なので削除!
  XとYを入れ替え
  Y-Upの座標系に変換  ※Maya等、Y-Up座標系のCGソフトに持っていく場合のみ
    
正規表現を使った置換をすることになりますが、点群データのサイズがデカすぎると
その辺のテキストエディタでは開くことさえ大変になるので、自分はEmEditorを使っています。

一列目削除
 
入れ替え

    Y-Upにするには測量系を直したあと、YとZを入れ替えます。
    この時、Yは符号を反転してからZと入れ替える必要があります。
    検索置換でやるなら、Y軸にマイナスを追加して、
    あとでマイナス二つになったところを削除します。



[点群をメッシュ化]

  MeshLabを使うと取得した点群ファイルをメッシュ化できます。
  MeshLabはOpen Sourceです。


[MeshLab]

   点群データの読み込み
   Import Mesh...


  [ズレている点群を削除]
    点群の端部がガクンと落ちていたりすることがあるので目視で確認して、おかしければ
    点を選択して削除します。
    点選択ツールで選んでからDelete。
    そのまま保存すると元の.xyzファイルが更新されます。
   

  [Compute normals for point sets]
    メッシュを張るまえに法線を計算します。

    地形の場合、たいていは上から見てNormalを計算するのがよいと思います。
    ※数字キーでビューを変えることができます。
 
    Show NormalをOnにするとNormal(法線)を表示できます。
    


  [Surface Reconstruction : Ball Pivoting]
    メッシュを生成します。
    パラメータの設定がなかなか難しいので何回かトライ&エラーが必要です。
  今回は5mメッシュを取得したので6くらいから始めてみます。
    
    Pivoting Ball radiusをあまり大きくすると不正なフェースがたくさんできるので、
    小さめがベターだと思います。
    ただし、あとで穴がたくさん出来るので、修正が大変になります。
    不正なフェースなど細かいことを気にしないような状況なら
    少し大きめにしてもいいと思います。

  [Cleaning and Repairing]
    どうしても一発で完璧なメッシュが出来ることはないので、
    いろいろな手法で修正が必要です。

  Select Self Intersected Faces


  Delete Selected Faces
    大変落ちやすいので保存しながら慎重に!
    こまめにexport as meshしてOBJなどに保存しながら作業します。

  Close Holes
    塞ぎたい穴の周囲の面を選択して実行するのがベターです。
  

  周囲のフェースを選択すると重なっている面がわかるので、
  その周囲まるごと削除してからClose holesをやり直すといいです。

  Close Holesした後に真っ黒になったら、それは単に裏返っただけです。

 

  [ダウンサンプリング]
    データが重すぎて扱えないほどになってしまうようなら、
    点群を読み込んだ後にClustered Vertex Subsamplingして点群の数を減らします。






[Meshmixer]


 MeshLabsで修正しきれなかった穴をどうしても修正したいなら、Meshmixerが便利です。
http://www.meshmixer.com/

  [Inspector]
    インスペクターを使うと問題点を洗い出してくれます。
    穴を塞ぐには、青いボールをクリックしてつぶしていきます。

  [Fill Hole]
    手動で穴を塞ぎたいなら、穴の周囲の面を選択してFキー。
    Wキーを押すとワイヤーフレームを表示します。

 
  この他にも便利な機能がたくさんあるのでいろいろいじってみると面白いですよ。