AutoCADマクロ屋本舗 掲示板


ファイル名

1:FUKUDA :

2017/05/17 (Wed) 11:51:12

$(substr,$(getvar,"dwgname"),1,5)
上記を使ってフィールドのDIESEL式でファイル名を取り込んでいるのですが
1文字目から5文字目となっているのを,例えば_(アンダーバー)や-(ハイフン)の前文字まで取得する事はできるのでしょうか
よろしくお願いします
2:chibi-tom :

2017/05/17 (Wed) 17:19:08

FUKUDA様

_(アンダーバー)や-(ハイフン)の前文字までとありますが
文字を判断するのは難しいと思います。
もし_(アンダーバー)や-(ハイフン)より後の文字数が決まっていれば
下記マクロで取得できると思いますが

^C^Csetenv;nastr;$M=$(-,$(strlen,"$(getvar,dwgname)"),<_(アンダーバー)や-(ハイフン)以降の文字数>);setenv;nasub;$M="$(substr,$(getvar,dwgname),1,$(getenv,nastr))";^Z

<_(アンダーバー)や-(ハイフン)以降の文字数>の部分を
任意の半角数字に変えてください
3:FUKUDA :

2017/05/17 (Wed) 19:41:07

chibi-tomさん
ありがとう御座います

フィールドのDIESEL式では出来ないのですね.
ご足労かけました.
^C^Csetenv;nastr;$M=$(-,$(strlen,"$(getvar,dwgname)"),3);setenv;nasub;$M="$(substr,$(getvar,dwgname),1,$(getenv,nastr))";^Z
上記の式では動きませんでした.式が間違ってますでしょうか
LT2014
4:zukki- :

2017/05/17 (Wed) 19:41:23

たぶん、下のマクロで出来ると思いますが、ファイル名にスペースなど特別な文字が入っているとまずいです。
また、フィールドでは繰り返しマクロが使えないのでやりたことには適さないかも。
やりたいことを書けば誰かが別な方法を考えてくれるかも知れません。

*^C^C$M=setenv;to;0;$(if,$(=,$(getenv,to),0),;sstr;検索文字列を入力:^X\;cnt;1;;to;1)$(if,$(=,$(getenv,to),1),$(if,$(eq,$(substr,$(getvar,dwgname),$(getenv,cnt),$(strlen,$(getenv,sstr))),$(getenv,sstr)),;to;2,;cnt;$(+,$(getenv,cnt),1);;to;1))$(if,$(=,$(getenv,to),2),$(substr,$(getvar,dwgname),1,$(-,$(getenv,cnt),1))\)^M
5:FUKUDA :

2017/05/17 (Wed) 20:03:00

言葉足らずでした.
ファイル名を図番として使用しています
A-01.dwgを図面上ではA-01としています.連番になっているのですが,追加があったりするとA-01A.dwgとなります
$(substr,$(getvar,"dwgname"),1,4)をブロックの属性定義文字の属性編集でフィールドを挿入でファイル名を呼んできています
ファイル名が5文字や6文字になった場合は5や6と編集をしています.その手間が省けたらと考えたんです.
6:zukki- :

2017/05/17 (Wed) 20:12:12

拡張子を除きたいのなら
$(substr,$(getvar,dwgname),1,$(-,$(strlen,$(getvar,dwgname)),4))
でいけると思います。
7:FUKUDA :

2017/05/18 (Thu) 07:55:50

zukki-さんありがとう御座います
A-04_ABC-01.dwgとかの長いファイル名があったりします.その場合のアンダーバーの前文字までを図番として呼んできたいんですよね.
資料だと文字数でしか指定が出来ないようですね.
通常のファイル名の場合は,この式を利用させてもらいます,ありがとう御座います.
8:chibi-tom :

2017/05/18 (Thu) 17:02:29

FUKUDA様

フィールドのDIESEL式ちょっとやってみました。
自分がやろうとしたことはzukki-様の
$(substr,$(getvar,dwgname),1,$(-,$(strlen,$(getvar,dwgname)),4))でした。

一応報告まで
9:FUKUDA :

2017/05/18 (Thu) 18:26:46

chibi-tom
ありがとう御座います.使わせていただきます
10:zukki- :

2017/05/18 (Thu) 21:17:10

フィールドのほうに
$(substr,$(getvar,dwgname),1,$(getenv,hoge))
と設定して

下記マクロを実行
*^C^C$M=setenv;to;0;$(if,$(=,$(getenv,to),0),;sstr;検索文字列を入力<$(getenv,sstr)>:^X\;cnt;1;;to;1)$(if,$(=,$(getenv,to),1),$(if,$(or,$(eq,$(substr,$(getvar,dwgname),$(getenv,cnt),$(strlen,$(getenv,sstr))),$(getenv,sstr)),$(>=,$(getenv,cnt),$(strlen,$(getvar,dwgname)))),;to;2,;cnt;$(+,$(getenv,cnt),1);;to;1))$(if,$(=,$(getenv,to),2),;フィールドの変数名を入力:^X\$(-,$(getenv,cnt),1);updatefield;all;;re;^Cid;)^M
フィールとの変数名を入力でhogeと入力すれば任意の文字列の前のファイル名を取り出せます。
11:FUKUDA :

2017/05/19 (Fri) 09:40:12

zukki-さん
ありがとう御座います.おもっていた通りに動いてくれています.
検索文字_(アンダーバー),変数名hogeを入力してマクロに組み込んで動かす事はできないのでしょうか?
よろしくお願いします
12:zukki- :

2017/05/19 (Fri) 12:16:20

\をそれぞれ_;、hoge;に変えて

*^C^C$M=setenv;to;0;$(if,$(=,$(getenv,to),0),;sstr;検索文字列を入力<$(getenv,sstr)>:^X_;;cnt;1;;to;1)$(if,$(=,$(getenv,to),1),$(if,$(or,$(eq,$(substr,$(getvar,dwgname),$(getenv,cnt),$(strlen,$(getenv,sstr))),$(getenv,sstr)),$(>=,$(getenv,cnt),$(strlen,$(getvar,dwgname)))),;to;2,;cnt;$(+,$(getenv,cnt),1);;to;1))$(if,$(=,$(getenv,to),2),;フィールドの変数名を入力:^Xhoge;$(-,$(getenv,cnt),1);updatefield;all;;re;^Cid;)^M

で出来ますが、
環境変数hogeをほかの人が書き換えるとフィールドの値が変わってしまうので、hogeを誰も使わないような長めの変数名にすることをお勧めします。
例えば、_だったらfkd-under-barなど。
13:FUKUDA :

2017/05/19 (Fri) 13:54:38

zukki-さん ありがとう御座います
ファイル1:12345_S
ファイル2:A-12_S
このマクロだと_(アンダーバー)を超えて表示されてしまします
ファイル1で文字数を5字数まで取ると
ファイル2でも_(アンダーバー)を越えて5文数を表示してしまいます
14:zukki- :

2017/05/19 (Fri) 16:21:56

チャットのほうも見ました。
やっぱりコンピューターごとに保存される環境変数を使うのはまずいみたいです。
図面ごとに保存される変数を間借りすればいいかもしれませんが、それもまた問題を起こしそう。
やはり、数値を直接書きえるしかないのかな、マクロでフィールドを編集できればいいのだけどそれも無理だし。
ちょっと他の方法がないか考えてみます。
15:FUKUDA :

2017/05/19 (Fri) 16:39:16

zukki-さん ご足労かえかけます
$(substr,$(getvar,"dwgname"),1,4)の数字を変えるだけなので,その都度,修正したいと思います
16:chibi-tom :

2017/06/13 (Tue) 15:06:29

いまさらですが、思いついたのでメモです。

フィールドのほうに
$(substr,$(getvar,dwgname),1,$(getenv,filename-field))
と設定して

下記マクロを実行すればファイル名の最初のアンダーバー前までの文字が取得できます。
*^C^C$M=setenv;to;0;$(nth,$(getenv,to),setenv;str0;1;setenv;to;1,)$(nth,$(getenv,to),,$(if,$(eq,_,$(substr,$(getvar,dwgname),$(getenv,str0),1)),setenv;filename-field;$(-,$(getenv,str0),1);^Cregen;,setenv;str0;$(+,$(getenv,str0),1);setenv;to;1))^M

注意点はzukki-様も言っていますが、他で変数"filename-field"を変えるとフィールドの値が変わってしまうことです。
17:FUKUDA :

2017/06/15 (Thu) 11:28:17

chibi-tomさん
ありがとう御座います.

  • 名前: E-mail(省略可):
  • 画像:

Copyright © 1999- FC2, inc All Rights Reserved.