あまりに苦しいので、ライブラリ的なものを作りました。
PowerMillのマクロは、マクロの実行ファイル(.mac)以外に拡張子「.inc」に
することでライブラリとして使用できるんです。(エライ!)
//pmill macro Kantoku_PowerMill_Library ver0.0.2
//kpl.inc
//r2017で開発
// **** フォルダ ****
//指定した組み込みフォルダからエンティティの存在するフォルダネームリスト取得
//param : DirName (string)
//param : Name (string)
//param : OptIsNew(bool) - 指定の名前のフォルダが既存にあった場合新作するか? 0_新作しない 1_新作
//param : OptIsAct(bool) - 実行後フォルダをアクティブにするか? 0_非アクティブ1_アクティブ
//return : Outstr(string) - 新たに出来たフォルダ名
function Create_Folder(string DirName , string Name , bool OptIsNew , bool OptIsAct , output string Outstr) {
string fullname = $DirName +
string list Before = get_folders($DirName)
if member($Before, $fullname) {
if not OptIsNew {
if OptIsAct {
ACTIVATE FOLDER $fullname
}
return
} else {
call Get_UnOverlap_Name($fullname , $Before, $fullname)
}
}
CREATE FOLDER $DirName ;
string list After = get_folders($DirName)
string list lst= subtract($After, $Before)
string autoname = $lst[0]
$Outstr = basename($fullname)
RENAME FOLDER $autoname $Outstr
if OptIsAct {
ACTIVATE FOLDER $fullname
}
}
//重複しない名前を取得
//param : Name(string) - 候補名
//param : Lst(string list) - 比較リスト
//return : Outstr(string) - 重複の無い名前
function Get_UnOverlap_Name(string Name , string list Lst , output string Outstr) {
string tmpname = $Name
int cnt = 0
bool fg = 0
do {
$fg = member($Lst, $tmpname)
if not $fg {
break
}
$cnt = $cnt + 1
$tmpname = $Name +
} white 1
$Outstr = $tmpname
}
// **** エンティティ ****
//指定した組み込みフォルダからエンティティの存在するフォルダネームリスト取得
//param : DirName (string)
//param : Calculate(int) - 計算FG -1以下_全て 0_未計算のみ 1以上_計算済のみ
//param : Leval (int) - フォルダの階層 組み込みフォルダは1 指定無しは0以下
//param : RemoveLst(string list) - 除外するフォルダ名リスト
//return : Outlst(string list)
function Get_Entitys_Dir(string Dirname , int Calculate , int Level , string list RemoveLst , output string list Outlst) {
string list paths = {}
call Get_Entitys_Path($Dirname , $Calculate , $Level , $paths )
string list lst = {}
string dirtxt =
foreach itm in $paths {
$dirtxt = basename(dirname($itm ) )
if not member($RemoveLst , $dirtxt) {
int dmy = add_last($lst, $dirtxt)
}
}
int dmy = remove_duplicates($lst)
$Outlst = $lst
}
//指定した組み込みフォルダからベースネームリスト取得
//param : DirName (string)
//param : Calculate(int) - 計算FG -1以下_全て 0_未計算のみ 1以上_計算済のみ
//param : Leval (int) - フォルダの階層 組み込みフォルダは1 指定無しは0以下
//return : Outlst(string list)
function Get_Entitys_Base(string Dirname , int Calculate , int Level , output string list Outlst) {
string list paths = {}
call Get_Entitys_Path($Dirname , $Calculate , $Level , $paths )
string list lst = {}
string txt =
foreach itm in $paths {
$txt = string(basename($itm))
int dmy = add_last($lst, $txt )
}
$Outlst = $lst
}
//指定した組み込みフォルダからパスリスト取得
//param : DirName (string)
//param : Calculate(int) - 計算FG -1以下_全て 0_未計算のみ 1以上_計算済のみ
//param : Leval (int) - フォルダの階層 組み込みフォルダは1 指定無しは0以下
//return : Outlst(string list)
function Get_Entitys_Path(string Dirname , int Calculate , int Level , output string list Outlst) {
string list ents = {}
string ent =
int cal = -1
foreach itm in folder($Dirname) {
$ent = pathname($itm)
if $Level > 0 {
if size(tokens($ent, "\")) != $Level + 1 {
continue
}
}
if $Calculate > -1 {
switch $itm.computed {
case 0
if Calculate > 0 {
continue
}
break
case 1
if Calculate == 0 {
continue
}
break
}
}
int dmy = add_last($ents, $ent)
}
$Outlst = $ents
}
// **** その他 ****
//リストから文字列
//param : Lst (string list)
//param : Delimiter (string)
//return : Outtxt(string)
function Lst_ToString(string list Lst , string Delimiter , output string Outtxt) {
string txt =
foreach itm in $Lst {
$txt = $txt + $itm + $Delimiter
}
int lng = length($txt) - length($Delimiter)
$Outtxt = substring($txt , 0 , $lng)
return
}
//ダンプ
function Dump(string list Lst) {
string txt =
call Lst_ToString($Lst , crlf , $txt )
print = $txt
}
//ダイアログ類オン
function DialogOn() {
DIALOGS MESSAGE ON
DIALOGS ERROR ON
ECHO ON DCPDEBUG TRACE COMMAND ACCEPT
}
//ダイアログ類オフ
function DialogOff() {
DIALOGS MESSAGE OFF
DIALOGS ERROR OFF
ECHO OFF DCPDEBUG UNTRACE COMMAND ACCEPT
}
ver0.0.1 - 完成
ver0.0.2 - Get_Entitys_Dir関数に除外リスト追加
エンティティの名前の重複が許されない為、先日のマクロも何度も何度もリストを
取得しなくてはならない為、その辺中心に作っています。
これを利用するテストマクロがこちら。
//pmill macro クズユニットテスト
function Main() {
call DialogOff()
// **** エンティティ ****
string list lst = {}
print = "**path**"
call Get_Entitys_Path('Toolpath' , 1, 0, $lst )
call Dump($Lst )
call Get_Entitys_Path('Boundary' , 1 , 0 , $lst )
call Dump($Lst )
print = "**base**"
call Get_Entitys_Path('Toolpath' , 1,0 , $lst )
call Dump($Lst )
call Get_Entitys_Base('Boundary' , 1 , 0 , $lst )
call Dump($Lst )
print = "**dir**"
call Get_Entitys_Dir('Toolpath' , 1 , 0 , $lst )
call Dump($Lst )
call Get_Entitys_Dir('Boundary' , 1 , 2 , $lst )
call Dump($Lst )
//**** フォルダ ****
string Dirname =
call Create_Folder('Toolpath' ,
print = $Dirname
call Create_Folder('Toolpath' ,
print = $Dirname
call Create_Folder('Boundary' ,
print = $Dirname
call Create_Folder('Boundary' ,
print = $Dirname
call Create_Folder('Tool' ,
print = $Dirname
call Create_Folder('Tool' ,
print = $Dirname
call DialogOn()
}
include kpl.inc
最後に記載した
・・・
include kpl.inc
で読み込んでます。最初じゃなくても大丈夫なんです。(エライ)
(最初だとエラーメッセージに表示された行がずれちゃうんです)
国内だとPowerMillユーザー少なそうだから、使う人いないだろうなぁ
(日本語のフォーラム作って欲しい・・・)