とりあえず日記

VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ(いまここ🍄)

MAYA2019のC++プラグインからOpenCVを利用する方法🔰🔰

はじめに

MAYAプラグイン(C++) でOpenCVを使おうとしてはまったのでメモ🔰🔰

注意

MAYAで映像を作成しているアーティストさんに自作プラグインを評価してもらうのが主目的なので、プログラマ視点では間違った対応方法の箇所があります。

ご注意ください。

CMakeLists.txtの書き方

cmake_minimum_required(VERSION 2.8)

# include the project setting file
include($ENV{DEVKIT_LOCATION}/cmake/pluginEntry.cmake)

# specify project name
set(PROJECT_NAME helloCmd)

 

# set SOURCE_FILES
set(SOURCE_FILES
  helloCmd.cpp

)

# set linking libraries
set(LIBRARIES
  OpenMaya
  Foundation

)

 

# Build plugin
build_plugin()

 

###############################

# OpenCVの設定は最後に追加する

###############################

find_package( OpenCV REQUIRED )

if(OpenCV_FOUND)
    target_include_directories(${PROJECT_NAME} PUBLIC ${OpenCV_INCLUDE_DIRS})
    target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

 

   #DLLの遅延読み込みを有効化する

   #DLL名の取得方法がわからないためハ-ドコーディングしたよ😅😅

    set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE /DELAYLOAD:"opencv_world410.dll")
    set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_DEBUG /DELAYLOAD:"opencv_world410d.dll")
endif()

 

自作プラグインから opencv_world410.dllを読み込む方法

やり方は二通りあります。

  1. C:\Windows\System32にコピーする
  2. 自作プラグインと同じディレクトリに置く
(1)について

自分の環境でテストする分には良いですが、ほかの方に配布するときにプラグインが動かないとトラブルの元になります。

(2)について

dllをコピーしただけでは認識しないので、以下2点の対応を行います。

  • DLLを遅延読み込みする(CMakeLists.txt中でリンカーオプションを設定する)
  • DLLの検索パスを自作プラグインのパスにする

 

DLL検索パスはプラグイン冒頭で以下のようにしました。

#include<windows.h>
#include<tchar.h>

 

MStatus MyPlugin::doIt(const MArgList &arg_list) {
    //
    //DLL検索パスを自作プラグインのパスに変更する
    //

    {
        TCHAR name[MAX_PATH + 8] = { 0, };
        TCHAR* lastdelim = 0;
        if (GetModuleFileName(MhInstPlugin, name, _countof(name)) == 0) {
            return MStatus::kFailure;
        }
        lastdelim = _tcsrchr(name, '\\');
        *lastdelim = '\0';
        if (SetDllDirectory(name) == 0) {
            return MStatus::kFailure;
        }
    }

    MStatus result;
    try {
        //プラグインのメイン処理
        result = Main(arg_list);
        }catch (...){

            //自作プラグイン中のC++例外はすべて無視してMAYAがクラッシュしないようにする。

           //ハードウェア例外は普通に処理されるのでMAYAはいつも通りクラッシュするよ😙

           //まぁ、MAYAは何もしなくてもクラッシュするけどね😨ははは・・・

            result = MS::kFailure;
    }

    //
    //DLL検索パスを元に戻す
    //
    SetDllDirectory("");

    return result;
}

 

何かもっといい方法ないですかねぇ😢

 

 環境

 

最後に

とりあえず、CMakeLists.txtを編集して自作MAYAプラグインからOpenCV(DLL版)を利用できるようになりました。

ただし、DLL読み込みパスの問題が残ったままなので、次のステップとしてOpenCVの静的リンクを試してみます。

 

後日談

ohtorii.hatenadiary.jp

MAYA2019のプラグインをビルドしたので覚え書き🔰

MAYA2019プラグインのビルド覚え書き

 久しぶりにMAYAプラグインをビルドしたのでその覚え書きです🔰🔰

最近のMAYAはCMakeでビルドするんですね

 

プラグインの開発環境

  • Windows10 64bit
  • Visual Studio 2015 Update3が必要(Visual Studio 2017のみインストールした環境ではCMakeでビルドエラーになりました。)
  • cmake version 3.14.5

ちなみに、cmakeはChocolateyでインストールしました。 

 

事前設定

readme.mdに書いてあります。

devkitBase\MayaDevkit\README.md

SDKへのパスを環境変数で設定します。

DEVKIT_LOCATION=D:\Users\hoge\Documents\devkitBase

あなたの環境に合わせて読み替えてください。

 

ビルド手順 

手始めに単純なhelloWorldCmdをビルドしてみます。

cd D:\Users\hoge\Documents\MayaDevkitBase\devkit\plug-ins\helloWorldCmd

cmake -H. -Bbuild -G "Visual Studio 14 2015 Win64"

cmake --build build --config Release

補足

Debugモードでビルドするには--config Releaseを削除してください。 

 

ビルド成功時のログ

> cmake -H. -Bbuild -G "Visual Studio 14 2015 Win64"


-- Selecting Windows SDK version to target Windows 10.0.17763.
-- The C compiler identification is MSVC 19.0.24215.1
-- The CXX compiler identification is MSVC 19.0.24215.1
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: D:/Users/hoge/Documents/MayaDevkitBase/devkit/plug-ins/helloWorldCmd/build

 

> cmake --build build --config Release

 

Microsoft (R) Build Engine バージョン 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

Checking Build System
CMake does not need to re-run because D:/Users/hoge/Documents/MayaD

 

evkitBase/devkit/plug-ins/helloWorldCmd

/build/CMakeFiles/generate.stamp is up-to-date.
Building Custom Rule D:/Users/hoge/Documents/MayaDevkitBase/devkit/plug-ins/helloWorldCmd/CMakeLists.txt
CMake does not need to re-run because D:/Users/hoge/Documents/MayaDevkitBase/devkit/plug-ins/helloWorldCmd
/build/CMakeFiles/generate.stamp is up-to-date.
helloWorldCmd.cpp
ライブラリ D:/Users/hoge/Documents/MayaDevkitBase/devkit/plug-ins/helloWorldCmd/build/Release/helloWorld
Cmd.
lib とオブジェクト D:/Users/hoge/Documents/MayaDevkitBase/devkit/plug-ins/helloWorldCmd/build/Release/hello
WorldC
md.exp を作成中
helloWorldCmd.vcxproj -> D:\Users\hoge\Documents\MayaDevkitBase\devkit\plug-ins\helloWorldCmd\build\Releas
e\helloWorldCmd.mll
Building Custom Rule D:/Users/hoge/Documents/MayaDevkitBase/devkit/plug-ins/helloWorldCmd/CMakeLists.txt
CMake does not need to re-run because D:/Users/hoge/Documents/MayaDevkitBase/devkit/plug-ins/helloWorldCmd
/build/CMakeFiles/generate.stamp is up-to-date.

 

 

 

秀丸エディタの動的スニペット (Yet Another Hidemaru Snippet)を更新したよ v2.2.0

Markdownスニペット強化と変更を行いました。

機能強化したスニペット😘

imageとlinkは引数の並び順を覚えなくても使えるようにしました。(scrapboxの表記を参考にしました💖

image

f:id:ohtorii:20190628140234g:plain

link

f:id:ohtorii:20190628140112g:plain

 

 

動作変更したスニペット😅

table

 

f:id:ohtorii:20190628140544g:plain

テーブル生成後のカラム文字をa1~z9の文字列から空白文字へ変更しました。

a1~z9の文字を毎回削除していたので、それならと空白文字にしました。

 

ダウンロード

https://github.com/ohtorii/ya_hidemaru_snippet/releases/tag/v2.2.0

【秀丸エディタ】汎用キーバインディング変更ソフト「のどか」の設定をアップしたよ

 

はじめに

今更ですが・・・😑

汎用キーバインディング変更ソフト「のどか」の設定ファイルを10年以上放置していたので、以下の2つを整理して秀丸エディタのライブラリに公開しました。

強調表示について


強調表示を適用するとこんな感じの見た目になります。

f:id:ohtorii:20190609165033p:plain

solarized-lightは(https://github.com/Harurow/Hidemaru-Settings)を使わせて貰いました、作者に感謝😘😘😘

include/keymap/keymap2/windowの各命令は、設定ファイル全体の構造なのでアウトライン表示してみました。

 

ダウンロード

https://hide.maruo.co.jp/lib/hilight/nodoka_1_0.html

詳細

f:id:ohtorii:20190609164316p:plain

強調1~強調7まで利用しています。

 

強調は単語の重要度や利用頻度に応じてこのように割り当ててます。

強調1 重要度が高い、利用頻度が高い(真偽値など)

強調7 重要度が低い、利用頻度が低い(追加のオプションなど)

 

 

f:id:ohtorii:20190609164324p:plain

強調表示

 

f:id:ohtorii:20190609164324p:plain

 

辞書ファイルについて

真偽値、キー名、命令、オプションなどを含んだ辞書です。

 

辞書の内容(抜粋)

enable
disable

...
onLock0
Lock1
Lock2

...

window
keymap
keymap2

...

delay-of
sts4nodoka
cts4nodoka

if
else

endif
include

...
$WindowClassName
$WindowTitleName
$NodokaVal

 

ダウンロード

https://hide.maruo.co.jp/lib/compdic/nodoka_dic_1_0.html

設定方法

f:id:ohtorii:20190609170536p:plain

秀丸エディタの動的スニペット (Yet Another Hidemaru Snippet)を更新したよ v2.1.0

スニペットの一覧表示と引数入力を行うダイアログの改修を行いました。

  • ダイアログのタイトルにya_hidemaru_snippetのバージョン番号を表示するようにしました。
  • スニペット一覧ではファイル拡張子を表示しないようにしました。

New

f:id:ohtorii:20190527085331p:plain

Old

f:id:ohtorii:20190527085333p:plain

ダイアログに対する今後の予定

必要な機能や操作感は実装したつもりなので、今後はバグ修正のみを予定しています。

ダウンロード

Release 2019/05/26 ver2.1.0 · ohtorii/ya_hidemaru_snippet · GitHub

MEL Script(Autodesk MAYA 2019)の強調表示

秀丸エディタでMELを強調表示する設定をアップしました。

普段は低レイヤーに生息しているプログラマですが、

アーティスト向けにTA(テクニカルアーティスト)みたいなことをしているので、ここ10年くらいはMAYAのカスタマイズも請け負ってます。

 

秀丸エディタでMELを書いているTA(テクニカルアーティスト)さん向けに強調表示をGitHubにアップしたのでご利用下さい。

 

まあ、秀丸エディタでMELを書いているTAさんはいるのか??

という素朴な疑問は脇に置いといてと、、、

f:id:ohtorii:20190504201157p:plain

MAYA MEL

強調表示は以下方針で作成しました。

  • MAYA 2019のスクリプトエディタのカラー表示にできるだけ近づける。
  • proc定義はできるだけ正確に解析する

procについて 

procは以下の定義を解析できます。

 

一行の単純なproc

global proc selectCurrentExecuterControl() 

 

2行にわたるproc

global proc
doubleClickCmdQuickHelp()

 

2行&返値の型名ありproc

global proc string
commandHelpExists(string $cmd)

 

あとは、global「あり・なし」の全部で6通り解析できます。

 

強調表示について

強調表示は4つのグループに分けました。

  • コマンド
  • 型名
  • 制御文
  • 変数

f:id:ohtorii:20190504202258p:plain

秀丸エディタ設定

グループ毎に色を変えたいときは各自でカスタマイズをお願いします。

いやー正規表現にコメントを埋め込めるので便利ですね😘

正規表現は一歩間違えると呪文になるんだよね😭 

補足

  • 強調表示定義ファイルを読み込むときに「カラー」を選択すると、上のスクリーンショットと同じ配色になります。
  • 「ファイルメニュー→その他→ファイルタイプ別の設定→その他→単語補完→詳細(X)→強調表示の定義」の設定をONにすることでMELコマンド名の補完(約5000個)が効くようになります。

ダウンロード

https://github.com/ohtorii/highlight/tree/master/hilight

 

更に補足(MELコマンドの強調表示について) 

MELコマンド一覧は以下の一行スクリプトで得ています。(ヒストリに約5000個のコマンドが出力されます)

help -l "*";

 maya_mel.highlightはテキストファイルなので、秀丸エディタで開いてこんな感じで書いてます。

161,AverageVertex
161,AveragePolygonNormalsOptions

...省略...

161,xgmAddGuide
161,xformConstraint
161,xform

 

最後に

MAYAのスクリプトエディタの方がコマンド引数の説明がポップアップして便利だけど、秀丸エディタで良きMELライフを!!

秀丸エディタの動的スニペット (Yet Another Hidemaru Snippet)を更新したよ v2.0.0

秀丸エディタの動的スニペット (Yet Another Hidemaru Snippet)を更新しました。

 

ダウンロードはこちらから

https://github.com/ohtorii/ya_hidemaru_snippet/releases

新機能

スニペットの一覧表示と引数入力を行うダイアログを用意しました。(空行でスニペットマクロを実行するとダイアログが起動します)

どんなスニペットが利用できるのか分からない……という問題に対する解決策の1つです。
スニペット挿入GUI

スニペットファイル追加

  • golang(.go)
    • main.txt
  • 秀丸マクロ(.mac)
    • if#r.txt
    • if$r.txt
    • ifr.txt
    • ife.%.txt
    • ife.txt
    • ifee.%.txt
    • ifee.txt
  • バッチファイル(.BAT)
    • date.txt
    • e.txt
    • e0.txt
    • e1.txt
    • for.txt
    • ford.txt
    • fordr.txt
    • forf.txt
    • forfr.txt
    • if.txt
    • ife.txt
    • main.txt
    • sleep.%.mac
    • sleep.mac
    • time.txt
    • touch.%.txt
    • touch.txt

スニペットの詳細はそれぞれのファイル内容を確認して下さい😅

最近Go言語を使い始めたので今後スニペットを追加するかもしれません。

設定ファイル(config.ini)の内容変更

Pythonのバージョン(2 or 3)に依存しないように内部処理を見直しました。
それに伴い、config.iniファイルからPythonのバージョン情報に関する設定を削除しました。

非互換な更新(😱😱😱

ディレクトリの整理

ディレクトリが無駄に深かったので整理して浅くしました。

(旧)
hidemaru_macrodir
├─ya_hidemaru_snippet.mac
└─ya_hidemaru_snippet		  ← このディレクトリを削除しました。
    └─internal
        ├─config.ini
        └─snippets

(新)
hidemaru_macrodir
└─ya_hidemaru_snippet
    ├─ya_hidemaru_snippet.mac
    ├─config.ini
    └─snippets

上記図は重要なフォルダとファイルのみ表示しています。

旧バージョンからのバージョンアップ方法

あなたがこのマクロをどの様に使っているのかで2通りに分かれます。

独自のスニペットを追加している方
  • まず、あなたが作成したスニペットを別の場所へ保存して下さい。(デスクトップなど)
  • 旧バージョンのフォルダを削除してから新バージョンをインストールして下さい
  • あなたが独自に作成したスニペットファイルは対応するディレクトリ(snippets\functions\text-mode)に移動することで引き続き利用できます。
その他の方

旧バージョンのフォルダを削除してから新バージョンをインストールして下さい😙

スニペット仕様の変更(Pythonのみ)

詳細

(旧) argv[]はグローバル変数。
	argv[0]	コマンド名
	argv[1]	引数
		:
		:
	argN[N]	引数
	
(新) sys.argv[]はコマンドライン引数
	argv[0]	スニペットファイルへのパス   ← 新規追加の引数
	argv[1]	コマンド名
	argv[2]	引数
		:
		:
	argN[N]	引数

具体例

以下のソースコードを参考にして下さい。

snippets\functions\text-mode\c-mode\c++-mode\template._.py

スニペット(コマンド名の変更)

利用頻度が低いコマンド名を長くして分かりやすくしました。

最後に

互換性を失う変更はヒデマラーの皆さんにも私にもダメージ🤕があります。これが最後になるように努めます😘😘😘