Script談話室バックナンバー2012

プラグインエディタ内の<ストリングの使い方   HiroMi
Sat Oct 6 8:29:12 2012

石男さん 有り難うございました。
PlugIn
本体に格納されているなどという事もあるんですね
次々と知らない事が出てくる感じです。
色々やってみます
疑問点が出てきたら聞くかもしれません
その時は 宜しくお願い致します。有り難うございました。


Re9:プラグインエディタ内の<ストリング...>の使い方    石男
Fri Oct 5 18:46:25 2012

PlugInを作る時にのみ出るメニュのようなので、おそらくPlugIn本体に格納されていると
思われます。どこにあるのかは分かりません。

話がもとに戻りますが、これを使ってStringを設定するより、
>予め テキストファイルとして準備すればよいかと思ったからです。
その通りだと思います。ヘルプ文用に用意されたものかもしれませんけど...


Re8:プラグインエディタ内の<ストリング...>の使い方   HiroMI
Fri Oct 5 13:46:01 2012

仕事に終われ、余裕もなく 失礼致しました。
Re7:
>でのscript Mac/VW12.5IDを設定の後 問題なく動きました。
ここで 次の疑問が起きました。
ここで設定したID3000~3004textはどこに格納されるのかという事です。
それを知ることができれば
予め テキストファイルとして準備すればよいかと思ったからです。
ライブラリ/Application Support/VectorWorks/12/Plug-ins/Common/Data/Notesにも
ないのでお教え戴けたらと思います。宜しくお願い致します。


Re7:プラグインエディタ内の<ストリング...>の使い方    石男
Mon Oct 1 17:10:26 2012

<ストリング...>でID3000~3004を設定してから試してください。
GetPluginString」はVer.12.5以前からあるようなので...

PROCEDURE DlogTest;
CONST
kAtPlugStr = 3000;
VAR
choiceStr : STRING;

FUNCTION RunEditDialog: BOOLEAN;
VAR
dialog : INTEGER;
cnt, index : INTEGER;
PROCEDURE dialog_Handler( VAR item : LONGINT; data : LONGINT );
BEGIN
CASE item OF
SetupDialogC: BEGIN
FOR cnt := 0 TO 4 DO BEGIN
InsertChoice( 5, cnt, GetPluginString( kAtPlugStr+cnt ) );
END;
END;
{OK}
1: BEGIN
GetSelChoice( 5, 0, index, choiceStr);
END;

END;{Case}
END;

BEGIN
RunEditDialog := FALSE;
dialog := CreateLayout( 'TestGetPlunginString', TRUE, 'OK', 'Cancel' );

{create controls}
CreateStaticText( dialog, 4, 'PlunginString :', 20 );
CreatePullDownMenu( dialog, 5, 24 );

SetFirstLayoutItem( dialog, 4 ) ;
SetRightItem( dialog, 4, 5, 0, 0 );

{run test dialog}
IF RunLayoutDialog( dialog, dialog_Handler ) = 1 Then BEGIN
RunEditDialog := TRUE;
END;
END;
{////////////////////////////// Main ////////////////////////////}
BEGIN
IF RunEditDialog THEN AlrtDialog( Concat( 'PlunginString =', choiceStr ) );
END;
RUN( DlogTest );

2009
 Macで試しましたので、win用に書き直してみてください。


Re6:プラグインエディタ内の<ストリング...>の使い方    与太郎
Sat Sep 29 2:35:07 2012

>石男さん
GetPluginString
でしたか!
Reference Manual
Pluginで検索したつもりですが気付きませんでした。


Re5:プラグインエディタ内の<ストリング...>の使い方    石男
Thu Sep 27 20:13:56 2012

HiroMiさん

やはり、気になり、もう一度調べ直しました。
FUNCTION GetPluginString(stringIndex :INTEGER) : STRING;
ご指摘のように、stringIndex=3000+Indexのようです。
それでは...


Re3:Re:プラグインエディタ内の<ストリング...>の使い方   HiroMi
Thu Sep 27 10:17:47 2012

石男さん、与太郎さん 有り難うございます。

そもそもの始まりは、私の廻りで<引出し線ツール>を使い、仕様を書込んだ際
プリントする時 文字の反転や文字化けが起こるので 
以前のツール<順引出し線ツール+文字>という形で入力を と指示され、
今迄のデータベースを使って 入力作業の省力化が出来ないか
と思ったのが始まりです。
色々探っていたところ この<ストリング>というコマンドに目が止まり
使った事もなく、ガイドにもなく 知りたくなりお聞きしました。

仕様を書込む際、<引出し線ツール>で仕様を選択して表記するように
データベースから選択した文字を文字列として図面上に表記できる様なscript
考えようと思っています。
進めていく中 又相談させて頂く事も在ろうかと思います。
その時は宜しくお願い致します。


Re3:プラグインエディタ内の<ストリング...>の使い方    石男
Wed Sep 26 20:33:08 2012

エディタ内の<ストリング...>で設定したSTRINGは普通の使い方では出来なかったような
気がします。記憶が不確かなのでアシカラズ。
GetResourceStringSetVSResourceFile
ですが、昔のMacの遺産を使う場合に使用します。ResourceFileというWindowsで使うリソー
スファイルとは別のものを作り、その中で設定してあるSTRINGPICTリソース、PINGといっ
たデータを使う時のものです。

HiroMi
さんが考えているものとは違うかもしれません、それよりもSTRINGを返すサブルー
チンを作った方が良いかも知れません。


Re:Re:プラグインエディタ内の<ストリング...>の使い方   HiroMi
Tue Sep 25 17:50:46 2012

早々の返答有り難うございます。
私も Nemetschekでしょうか VectorScript CommunityBoardの中に
GetResourceString
SetVSResourceFileを見つけたのですが
英文ですので いまいち理解できず。メールした次第です。
有り難うございました。
ちょっと長くなりますが 掲載されていたモノを載せます。

Procedure LocalTest;
const
kMyDialogStrings= 11000;{ res id of 'STR#' resource with dialog strings }
kOKItem= 1;{ string index = item number of dialog control }
kCancelItem= 2;
kListBrowserItem= 4;
kTitleIndex= 5;

kMyMiscStrings= 11001;{ res id of 'STR#' resource with misc strings }
kHelloString= 1;{ string index }
kTestString= 2;

var
resFileOpen : BOOLEAN;
promptString : STRING;

{----------------------------------------}
function OpenMyResourceFile :BOOLEAN;
const
kMyResourceFilename = 'MyTestResources';
BEGIN
IF SetVSResourceFile(kMyResourceFilename) THEN
OpenMyResourceFile := TRUE
ELSE
Begin
Message('The resource file ', kMyResourceFilename, ' was not found.');
OpenMyResourceFile := FALSE;
End;
END;

{----------------------------------------}
FUNCTION GetLocalDialogString(strIndex :INTEGER) :STRING;
VAR
theString : STRING;

BEGIN
{ Attempt to get strings from the resource file. }
{ Localizing distributors can translate strings within the resource file. }
if (resFileOpen = true) then
GetResourceString(theString, kMyDialogStrings, strIndex);

{ If localized string not found, use english. }
if (theString = '') then
CASE strIndex OF
kOKItem: theString := 'OK';
kCancelItem: theString := 'Cancel';
kListBrowserItem: theString := 'Description';
kTitleIndex: theString := 'LB Test';
END;

GetLocalDialogString := theString;
END;

{----------------------------------------}
FUNCTION GetLocalMiscString(strIndex :INTEGER) :STRING;
VAR
theString : STRING;

BEGIN
{ Attempt to get strings from the resource file. }
{ Localizing distributors can translate strings within the resource file. }
if (resFileOpen = true) then
GetResourceString(theString, kMyMiscStrings, strIndex);

{ If localized string not found, use english. }
if (theString = '') then
CASE strIndex OF
kHelloString: theString := 'Hello World!';
kTestString: theString := 'This string is hardcoded in the script.';
END;

GetLocalMiscString := theString;
END;

BEGIN
resFileOpen := OpenMyResourceFile;
promptString := GetLocalMiscString(kTestString);
AlrtDialog(promptString);
END;
Run(LocalTest);


Re:プラグインエディタ内の<ストリング...>の使い方    与太郎
Tue Sep 25 17:03:36 2012

簡単に試せないので確認してませんが、
GetResourceString
で文字列を取得するのではないでしょうか。


プラグインエディタ内の<ストリング...>の使い方   HiroMi
Tue Sep 25 11:03:27 2012

以前ヒントを戴き、何とかscriptも動いてくれています。有り難うございました。
iMaOX5.8
で VectorWorks12.5、を使っています。
今回メールしましたのは、文字列をコントロールするscriptを考えていた際
プラグインエディタに<コマンド編集><プロパティ><パラメータ...
<ストリング....>とコマンドがあるのですが
この<ストリング....>というコマンドの使い方を 
教えていただきたいと思ったからです。

このコマンドを追加で開くと <ID3000、カテゴリ>
その中に入ると<ID3000、ストリング>とあり
前者は1000番づつ、後者は1番づつ増える様で、
データベースのようであるという感じです。
ガイドにも説明がないので 宜しくお願い致します。


Re:Re:bottomRangeSubrow  manabu
Sun Aug 5 21:15:14 2012

さっそくの回答ありがとうございます。
データベース行のもあるワークシートで確認してみましたところ、だいたいわかりました。
データベース行がない場合は無視した方が良さそうです。

ワークシートのデータベース機能で取れない値でも、スクリプトでは取れたりするので上手く使えると便利ですね。


Re.:bottomRangeSubrow   与太郎
Sun Aug 5 17:09:09 2012

役に立つかどうか判りませんが...

Warning: XXX XXX - Attempt to access a cell outside the worksheet bounds.」は以前私も遭遇しました。
※2004年のScript談話室バックナンバーを「GetWSSelection」で検索)
xxxRangeSubrow
というパラメータはワークシートのDB機能と関係あるはずですが、深く追求しませんでした。
DB
機能で図形を抽出したワークシートなら違う結果になるのかも知れません。


bottomRangeSubrow  manabu
Sun Aug 5 11:40:55 2012

お世話になります。

GetWSSelection
でセルの範囲を取得したいのですが、「Warning: GET2DSIZE BOTTOMRANGESUBROW - Attempt to access a cell outside the worksheet bounds.」という警告が出ます。
スクリプト自体は上手くいっているのですが、topRangeSubrowbottomRangeSubrowが具体的に何の値を取ってくるのかよくわかりません。
数値自体は0で返ってきています。

詳しい方いらっしゃたら、よろしくお願いします。


グループのクラス(2)の訂正    与太郎
Fri Jun 1 10:58:34 2012

管理人さん、削除依頼の件ありがとうございました m(_ _)m 。

>クラスを削除している場合は「ClassNum=クラスの数」かどうかは定かではありません。
と書きましたが、私の勘違いでした。
ClassNum
はクラスの数で間違いありません。
下のスクリプトでクラス名のリストを書き出せます。
出力先は、Ver.11.5以前ならアプリケーションフォルダ内のVectorWorksフォルダの中、
Ver.12
以降ならユーザーフォルダの奥にあるVectorWorksフォルダの中のVersion別フォルダの中です。

procedure test;
{
クラス名を書き出す。 }
var
__i, n:integer;
begin
__n:= ClassNum;
__for i:= 1 to n do begin
____Write(i); Tab(1); WriteLn(ClassList(i));
__end;
__Message('クラス名を書き出しました!');
end;
Run(test);

クラスを削除しても空き番号が生じないからと言っても、
その度に図形のクラスIDを書き替えるようなことをするとは思えないので、
結局のところ、ClassList(番号) の「番号」はクラスIDそのものではないのでしょう。


グループのクラス(2)    与太郎
Mon May 28 22:54:21 2012

「一般」クラスの名前を変更している場合たとえば「無し」に変えていたり、
英語版で「一般」が「None」になっていたりするときは、
前回のスクリプトではグループのクラスは「無し」や「None」にはなりません。
新しく「一般」クラスが作られて、グループはその「一般」クラスになってしまいます。
「一般」クラスを作らずに、「無し」や「None」などのクラスでグループ化する方法はあるでしょうか?

新しく作った「一般」クラスと元々の「一般」クラスの違いは、削除が可能か否かです。
元々の「一般」クラスは削除出来ません。別の名前に変えても削除出来ません。
しかし、この仕様をスクリプトで応用するのは難しいです。
もうひとつの方法は、クラスIDを使うことです。
クラス関係の標準サブルーチンではパラメータにクラス名を使いますが、
VW
の内部ではクラスは名前でなく番号で管理されているはずです。
クラス名はユーザーの目に触れるレベルでしか使われていないでしょう。
そうでなければクラス名を変えるたびに大量のクラス名の書き替えが必要になります。
実際は大量のデータがあってもクラス名の変更は一瞬で終わるので、
番号クラス名のテーブルを書き替えているだけだと推測できます。
その番号をここではクラスIDトぶことにします。
クラスIDの1は「一般」、2が「寸法」に決まっていて、3以降がユーザーが作ったクラスです。
「寸法」クラスも名前の変更は可能ですが、削除は出来ません。
名前を変えてもクラスIDは変わらないので、元々の「一般」クラスを特定出来ます。

procedure test;
{
一般クラス(ClassList(1))でグループ化する。 }
var
__actCls :string;
begin
__actCls:= activeClass;
__NameClass(ClassList(1));
__DoMenuTextByName('Group Chunk', 1);
__NameClass(actCls);
end;
Run(test);

クラスIDに関係する標準サブルーチンは、クラス名を返すClassListと、
クラスIDの上限を返すClassNumだけです。
クラスを削除している場合は「ClassNum=クラスの数」かどうかは定かではありません。


グループのクラス(1)    与太郎
Tue May 8 16:08:40 2012

確かVW10くらいまでは、グループは「一般」クラスで作成されました。
それがVW11からは、グループ化したときのアクティブクラスに変更されました。
このせいで、クラスで図形表示を制御している場合にグループ内の図形が表示されないことがあります。
「一般」クラスを非表示にすることはほとんど無いのですが、
「補助線」のようなクラスは作図中は表示しても最終的には非表示になります。
そのようなクラスがアクティブな状態でうっかりグループ化してしまうと、
そのクラスが非表示になった瞬間にグループ内の図形も表示されなくなります。
原因(グループ化)と結果(不可視化)のタイムラグのせいですぐには気付かなかったり、
最後まで気付かなかったりするので厄介です。
これは、グループに表示属性が適用されるからいけないという考え方もありますが、
ユーザーにどうこう出来ることではありません。
しかし、スクリプトで旧バージョンのようにグループを常に「一般」クラスにすることは出来ます。
最も簡単なのは、下の2行スクリプトです。

DoMenuTextByName('Group Chunk', 1);
SetClass(FSActLayer, '
一般');

グループ化の直後はそのグループ図形しか選択されてないので、
FSActLayer
で得られたハンドルはグループ図形のハンドルのはずです。
ただし、FSActLayerではグループ内やシンボル内のような深い階層の図形ハンドルは得られません。
どんな階層でも新しいグループのハンドルを得る方法は、いくつかあります。
(1)
アクティブクラスを「一般」に変更してからグループ化。
(2) ForEachObjectInLayer
を使う。
(3)
現在の階層にある図形のハンドルを辿ってグループのハンドルを探す。
以上の三つの内、一番簡単なのは(1)です。
アクティブクラスを一旦「一般」にしてからグループ化して、
そのあとでアクティブクラスを元に戻します。
元のアクティブクラスを変数に記憶する必要があるので、
コマンドの羅列ではなくprocedureにしないといけません。

procedure test;
{
「一般」クラスでグループ化する。 }
var
__actCls :string;
begin
__actCls:= activeClass;
__NameClass('一般');
__DoMenuTextByName('Group Chunk', 1);
__NameClass(actCls);
end;
Run(test);


Re^2:ツールのモードを選択    ゴンスケ
Sun May 6 14:57:14 2012

FREEHANDさん、「単純なことをさらに簡単に済ませるための単純なスクリプト」の
事例はたしかに少ないですね。少しでも横着したい主義の私も同感です。
しかし、私の下記のコメントに対していただいたコメントについては
他の方の誤解を招くかも知れないので、少し補足をさせてください。

>
たしかに定型操作なので、スクリプト化はすごく正当な考え方だと思うのですが、
>
用紙全体を見る保存閉じるは、左手だけを使ったキーボードショートカットで
>
実現できるので、考えたこともありませんでした。

一般論として、キーボードショートカットのメリットは、操作を無意識化でき、
思考を途切れさせずに済む点にあると思います。一方で、マウスクリックが
必要な操作は、画面のある部分を見ること、つまり意識を向けることが必要で、
どうしても思考が途切れてしまいます。そして、私はこの点を重視するので、
キーボードショートカットだけで実現できることのスクリプト化を考えたことが
なかったのでした。

もっとも今回の話は、終了直前の操作なので、思考が途切れてもかまいませんね。


Re:ツールのモードを選択   FREEHAND
Fri Apr 27 23:00:39 2012

与太郎さん、レスありがとうございます。

A&A
サポートにも問い合わせてみましたが、ツールのモードをVectorScriptで指定することはできないという回答でした。
VectorScript
に組み込んで欲しいと、A&Aに要望を出しておきました。

これができるようになれば、VectorScriptの幅がもっと広がると思います。
先 に挙げた例で言えば、半径が100015002000・・・と決められたフィレットをいくつも作成したかったので、半径だけが異なる複数のスクリプト を作っておけば、数値をその都度入力することに比べるとヒューマンエラーがからむ余地が減り、随分楽になると思ったのですが。
与太郎さんも指摘されているように、私はAutoCADではこの種のマクロはたくさん作ってます。
例えば「構築線を水平に作成」するマクロで、「^C^C_XLINE;H;」というものがあります。
これは「XLINE(構築線)」というコマンドと「H(水平)」というオプションのたった二つの要素の組み合わせなので、わざわざマクロにするほどでもないかもしれません。
マクロを使わなくても、左手のキーボードで「X → スペースバー → H → スペースバー」と入力すれば済むのですが、マクロにすれば一度のクリックで済むので、実際にはとても重宝しています。
言わば、単純なことをさらに簡単に済ませるための単純なマクロです。
VectorScript
でも同種のものを作りたかったのですが、残念です。

ついでに余談です。
話 しはさかのぼって、「用紙全体を見る保存閉じる」スクリプトを作ろうとして、ネット上でVectorScriptの事例を探した時、あくまで私の印象 ですが、「複雑なことを簡単に済ませるための複雑なスクリプト」の事例はよく見かけましたが、「単純なことをさらに簡単に済ませるための単純なスクリプ ト」の事例はあまり見かけませんでした。
で、ゴンスケさんから以前、
>
たしかに定型操作なので、スクリプト化はすごく正当な考え方だと思うのですが、
>
用紙全体を見る保存閉じるは、左手だけを使ったキーボードショートカットで
>
実現できるので、考えたこともありませんでした。
というコメントをいただいた時、私の期待と現実とのギャップが、ここにも表れていると感じていたのです。


Re:ツールのモードを選択    与太郎
Thu Apr 26 15:01:03 2012

VWでは無理みたいです。
AutoCAD
みたいにコマンド入力があれば、ツールマクロみたいなのは簡単に出来そうですね。


ツールのモードを選択   FREEHAND
Wed Apr 18 20:39:26 2012

質問させてください。
VectorScript
で任意のツールを選択することができますが、選択したツールのモードを指定することはできないのでしょうか。
例えば、フィレットツールで、トリミングモードにして、尚かつ、フィレット半径を1000にすることができないかということです。
よろしくお願いします。


Re.xx:用紙全体を見る」してから「保存」    ゴンスケ
Mon Apr 16 9:04:06 2012

FREEHANDさん、しっかりときっちりと書いてくださるので、とても参考になります。
またのご登場を楽しみにしています。
石男さん、与太郎さん、いつもありがとうございます。
Thanks!!


Re.:用紙全体を見る」してから「保存」    与太郎
Mon Apr 16 7:55:24 2012

「スクリプトエディタ」は、いつの間にか名前が「AppleScriptエディタ」に変わってますよ。


Re.:用紙全体を見る」してから「保存」    石男
Sun Apr 15 21:52:50 2012

何か蛇足ですが、miVSモードのVS実行のメニュはAppleScriptで行っています。
ですので、直接AppleScriptVectorScriptを実行させても一緒です。
こんな感じです...
on run
tell application "Vectorworks 2011"
activate
try
DoScript "
PROCEDURE FitToWindow_SAVE_Close;
VAR
subMenu:STRING;
index:INTEGER;
BEGIN
DoMenuTextByName('Fit To Window',0);
DoMenuTextByName('Save',0);
DoMenuTextByName('Close',0);
END;
RUN(FitToWindow_SAVE_Close);
"
on error number 1
end try
beep
end tell
end run

これをスクリプトエディタでアプリケーションとして保存しておけば、同じ結果がえられ
ます。


re:用紙全体を見る」してから「保存」   FREEHAND
Sun Apr 15 17:00:34 2012

件のVectorScriptですが、懸案だった素早く実行することが解決しました。
VectorScript
をプラグインコマンドにして、それをメニューに登録したのです。
プラグインコマンドにしておけば、保存先が図面ファイルではなく、システム(VectorWorks)になりますので、「閉じる」も実行できます。
また、図面ファイルごとにVectorScriptを取り込んでおかなくても済むという利点があります。

その手順を大まかに書いておきます。

1.
 あらかじめテキストエディタなどを使ってVectorScriptを作成しておく。
2.
 VectorWorksのメニューで、[ツール][スクリプト][プラグインコマンド...
3.
 新規作成ダイアログボックスで、プラグインコマンドの名称を入力。(半角の場合は27文字以内)
4.
 プラグインコマンドの新規作成ダイアログボックスの 一覧から「メニュー」を選択するとプラグインコマンドが作成される。
5.
 作成されたプラグインコマンドを選択して[コマンド編集]→VectorScriptをコピペ。
6.
 念のためコンパイル。成功したら[OK
7.
 [カテゴリ]をクリックすると、次の「作業画面の設計」のときに分類されるカテゴリが表示される。デフォルトでは「その他」になっている。
8.
 作業画面の設計の「メニュー」で、左側の一覧の中の「その他」の中に、先ほど作成したプラグインコマンドがあるので、それを任意の場所に登録する。

【その他メモ】
・上記4のとき、「メニュー」ではなく「ツール」を選択することもできる。
この場合、作成したプラグインコマンドは、作業画面の設計で「メニュー」ではなく「ツール」に表示され、ツールとして登録できる。

・作成されたプラグインコマンドは、HD/ユーザ/ホーム/ライブラリ/Application Support/VectorWorks/2011.noindex/Plug-ins内に保存される。
拡張子はメニューの場合vsn。ツールの場合vst

vsnファイルをmiで編集すると、VectorWorksから実行できなくなったり、実行しようとするとVectorWorksがクラッシュしたりする。
プラグインコマンドを編集するには、[ツール][スクリプト][プラグインコマンド...[コマンド編集...]とした方がよい。

・プラグインコマンドの編集で,[名称変更]をすると、作業画面の設計で再度プラグインコマンドを登録し直さなければならない。

・「メニュー」に登録して問題なく動作したスクリプトを「ツール」に登録すると、うまく動作しない場合がある。


というわけで、とりあえず、当初の目的は達成できました。
みなさん、ありがとうございました。


re:用紙全体を見る」してから「保存」   FREEHAND
Fri Apr 13 23:48:56 2012

少し進展がありましたのでお知らせします。
件のVectorScriptを実行することができました。

私はVectorScriptをテキストエディタのmiで書いて、vss形式で保存しています。
mi
で書いたテキストを、VectorWorksのリソースブラウザから新規作成した
VectorScript
にコピペして作ります。
それをコマンドパレットから実行していました。

ところで、VectorWorksのメニューで「ツール」「スクリプト」「コマンドを実行」
というのものがあります。
そこから、vssを選択したところ、スクリプトを実行することができました。
図面ファイル外のスクリプトの実行ですから、「閉じる」も動作しました。
「保存しますか?」ダイアログも出ませんでした。
もちろん、保存されてました。
スクリプトの内容は下記を参照してください。

さらに、ところで、miは、メニューで「ドキュメント」「モード」VectorScript
にしています。
mi
のウインドウの上部のツールバーにはいくつかボタンがありますが、
このモードでは、その中に「2011で実行」ボタンがあります。
それで、VectorWorksで図面ファイルを開いた状態で、
かつ、mivssを開いた状態で「2011で実行」ボタンをクリックすると、
スクリプトが動作しました。
VectorWorks
で複数の図面ファイルを開いていた場合は、
最前面(アクティブ)のものに対して動作しました。

というわけで、VectorScriptを図面外部から実行する方法が二つ見つかりました。
ただし、コマンドパレットから実行することと比べると、素早さの点で劣りますが。


**************************

{
用紙全体を見る_保存_閉じる}
PROCEDURE FitToWindow_SAVE_Close;
VAR
subMenu:STRING;
index:INTEGER;
BEGIN
DoMenuTextByName('Fit To Window',0);
DoMenuTextByName('Save',0);
DoMenuTextByName('Close',0);
END;
RUN(FitToWindow_SAVE_Close);


re:用紙全体を見る」してから「保存」   FREEHAND
Thu Apr 12 23:55:56 2012

与太郎さん、コメントありがとうございます。

実は、始めの書き込みをする前に、「閉じる」スクリプトも試しに作って、
うまく動作しなかったのです。
その時、もしかしたら、
スクリプトの保存先が図面ファイルであるために実行できないのかもしれない、
と思ったのですが、先ずは「保存」からと思って、始めの書き込みをしたのです。

ゴンスケさんのレスをいただいてから、
AppleScript」という言葉が頭をよぎっていましたが...

与太郎さんにご紹介いただいたAppleScriptですが、これは私にとっては始めてです。
ですから、ちょっと、どうするか...

AutoCAD
のマクロの場合は、マクロの保存先が図面ファイルではなく、
システム(AutoCAD)なので、「閉じる」マクロでも問題がないのだろう、
という理解をしました。
それで、現在の図面ファイルにVectorScriptがあることが障害となっているのであれば、
リソースブラウザから、他の図面ファイルに保存されたVectorScriptを実行すればいいかもしれない、
と考えてやってみましたが、そもそも実行できませんでした。
これは失敗でした。

しかし、皆さんのレスによって、VectorScript初心者の私が作ったスクリプトが、
意図した動作をするか否かは別にして、内容に根本的な間違いがあったわけではなさそうだということはわかりました。
この点については大きな収穫でした。


re^2:用紙全体を見る」してから「保存」    ゴンスケ(管理人ミスで再掲)
Wed Apr 11 15:08:18 2012

FREEHANDさん、詳細にありがとうございます。
終了時の画面状態を、次に開いた時に復元してくれる点は、作業の継続にとって
ありがたい仕様ですね。私も、作業継続が楽なように、必要な画面状態を作ってから、
保存閉じるをやっていますが、その全体を自動化できたら、たしかに楽チンです。
で、FREEHANDさんのスクリプトを試してみました。(VAR設定は不要?)
たしかに素直に閉じてくれません。また、DoMenuTextByNameの「閉じる」をスクリプトに
加えてみたら、エラーが出ました。VectorScriptを単一ファイル内に置けることを
考えると、VectorScriptが終了する前に閉じることができないのは仕様のように思えます。
VectorWorks
を外から動かす手もあると思いますが、詳しい方のお出ましを待ちましょう。


re^3:用紙全体を見る」してから「保存」    与太郎
Wed Apr 11 15:02:46 2012

あれれ、ゴンスケさんのレスが消えてる。

VectorScript
で「開く...」、「閉じる」、「終了」などは出来ませんが、
AppleScript
Command+oCommand+wCommand+qなどのキー入力を送って
VW
に実行させることは出来ます。
キーボード・ショートカットを受け取るのは最前面のアプリなので、
最初にVWを最前面に持って来て、「System Event」からキー入力のイベントを送ります。

(* VW
のウィンドウを全て保存して終了する *)
(* VW
を前面に出す *)
tell application "VectorWorks"
activate
end tell
(* System Events
経由でVWにイベントを送る *)
tell application "System Events"
tell process "VectorWorks"
repeat 8 times
keystroke "s" using {command down}
keystroke "w" using {command down}
end repeat
keystroke "q" using {command down}
end tell
end tell

ループ内の最初に「keystroke "4" using {command down}」を追加すれば、
用紙全体を表示した状態で保存出来ます。
保存せずに終了する場合は下のようになります。

(* VW
のウィンドウを全て保存せずに終了する *)
(* VW
を前面に出す *)
tell application "VectorWorks"
activate
end tell
(* System Events
経由でVWにイベントを送る *)
tell application "System Events"
tell process "VectorWorks"
repeat 8 times
keystroke "w" using {command down}
delay 1
keystroke "xx"
keystroke "d" using {command down}
end repeat
keystroke "q" using {command down}
end tell
end tell

まちがって図形の複製をしないように、"x"の連続押しで図形を選択解除しています。
また、終了時の保存確認ダイアログが出る前にcommand+dを送ってしまわないように、
delay 1
で1秒待たせています。
上のAppleScriptではVWの状態に関係なく決まった順にキー入力を送っていますが、
サードパーティー製ツールでVWで使われているUI部品を調べれば、
ダイアログが出てるかどうか判断してキー入力を送ることも出来るみたいです。


こちらが新規談話室です。    管理人
Wed Apr 11 0:23:18 2012

こちらが新規談話室です。
お手数をおかけしました。
不具合がありましたらお知らせ下さい。


テストです    管理人
Wed Apr 11 0:09:10 2012

書き込みテストです。


業務連絡    管理人
Tue Apr 10 21:59:29 2012

FREEHANDさん、御心配なく。
そのためにいる管理人です。
会員登録のアップを確認されてから質問されたのですね。
お待たせして、すみませんでした。


re:用紙全体を見る」してから「保存」   FREEHAND
Tue Apr 10 21:55:53 2012

ごめんなさい。同じものを二度書き込んでしまいました。
送信ボタンを押した後、リロードしても画面に反映されていなかったもので・・・
キャッシュを空にしたら、見えました。


re:用紙全体を見る」してから「保存」   FREEHAND
Tue Apr 10 21:45:11 2012

ゴンスケさん、コメントありがとうございます。

私はVectorWorksの他に、AutoCADも使っています。
AutoCAD
には、VectorScriptに相当するものとして、マクロがあります。
私は、AutoCADを使いながら、何か思いつくたびにマクロを自作しています。
日常的といってもいいでしょう。
ただし、関数については、私には使い方が理解できません。
そのため、どうしてもコマンドを連続して動作させる、というマクロになってしまいます。
そうして作ったマクロのうちの一つに、図面全体ズーム保存閉じる、というマクロがあります。
普段使っていて、効果があると実感しています。

私はVectorWorksで、開いている図面ファイルを閉じるとき、
自分がいつも同じ操作を繰り返していることに気付きましたので、
それをVectorScriptにできないかと思ったのです。
今回私が作りたいスクリプトは、ご指摘のようにキーボードショートカットでできますのが、
三つの操作をいつも繰り返す場合と、スクリプトによる一つの操作で終える場合とでは、
何度も繰り返せば繰り返すほど、その差が広がっていきます。

それから、「用紙全体を見る」をスクリプトに含むことについてですが、
これをやっておくと、次に図面ファイルを開いたときに、常に同じズーム状態で開くことができます。
もし、図面の一部を拡大したままだったり、小さく縮小された状態だったり、
といった様々な状態で開くと、まず、
「はて、自分は図面のどこを見ているのだろう」
というプロセスを経なければなりません。
しかし、常に「用紙全体を見る」で終えておけば、そのプロセスを省くことができます。

今回例に挙げたスクリプトは、「用紙全体を見る」「保存」ですが、本当はこの後に「閉じる」を追加したいのです。
が、「用紙全体を見る」「保存」の段階でつまづいてしまいました・・・
このスクリプトがうまくできれば、今後、任意の画面登録を呼び出してから保存するようにしたり、
属性パレットの状態を「全ての属性をクラススタイル」にしてから保存するようにしたりと、
発展させていけるのではないかと考えています。
これらの動作は、いずれも、次に図面ファイルを開いた時の状態をなるべく一定に保つことで、
意図しない間違いを防ごうという主旨です。

昔々の話しですが、私は一度MiniCADプログラミング入門でVectorScriptを勉強しました。
その時は、さっぱり理解できず、挫折してしまいました。
しかし今は、AutoCADのマクロが自分なりにできるようになったこともあるし、
せっかくのVectorScriptなので、もう一度チャレンジしているというわけです。


re:用紙全体を見る」してから「保存」    ゴンスケ
Mon Apr 9 21:54:32 2012

アドバイスではありません。質問させてください。

たしかに定型操作なので、スクリプト化はすごく正当な考え方だと思うのですが、
用紙全体を見る保存閉じるは、左手だけを使ったキーボードショートカットで
実現できるので、考えたこともありませんでした。

そこで、このスクリプトの利用シーンを教えてもらえたら、スクリプト学習中の
私にとって、とても参考になります。よろしくお願いします。


用紙全体を見る」してから「保存」   FREEHAND
Sun Apr 8 23:00:45 2012

みなさん、初めまして。
アドバイスお願いします。
環境は、MacOS X 10.7.3  v2011です。

開いている図面ファイルを、「用紙全体を見る」してから「保存」するスクリプトを作りたいのです。
そこで、下記のスクリプトを作りました。
コンパイルは成功し、実行してもエラーは出ませんでした。
実行した時の動作を観察すると、「用紙全体を見る」は動作しました。
そして「保存」も、ファインダで図面ファイルのタイムスタンプ(変更日)を見ると、
スクリプトを実行した時刻になってます。
しかし、図面ファイルのウインドウの左上の赤い丸の中央に黒い点が現れたままなのです。
つまり、このまま図面ファイルを閉じると「保存しますか?」ダイアログボックスが出る状態なわけです。
そのダイアログボックスで「保存しない」を選択しても、一度保存はできてるので、
内容が失われることはないのですが、やはり黒い点が消えた状態=そのまま閉じてもダイアログボックスが出ない状態にしたいのです。

下記のBEGINENDの間にDoMenuTextByNameが二行ありますが、
Save
の方の一行だけのスクリプトを作って実行させると、黒い点が消えた状態にすることはできたのですが、
DoMenuTextByName
を二つ続けて実行させると、黒い点が出た状態になってしまうのです。

よろしくお願いします。

**************************

PROCEDURE FitToWindow_SAVE;
VAR
subMenu:STRING;
index:INTEGER;
BEGIN
DoMenuTextByName('Fit To Window',0);
DoMenuTextByName('Save',0);
END;
RUN(FitToWindow_SAVE);

**************************


談話室復活!    管理人
Tue Mar 6 16:53:46 2012

ご迷惑をおかけしました。談話室復活です!


re.8:論理型について(VW談話室より)    管理人
Tue Jan 31 14:45:32 2012

はてさて、薔薇の騎士ロードス殿?
管理人は直接存じ上げませんが、ひょっとしてワラワ姫のお知り合いでいらっしゃる?
さすれば、お説はごもっとも、探求の道はまさにサーガのごとしでござる。あれ?ござる?
はっ!ここはScript談話室。
ハシゴしたあげく、迷い込んでしまったようです。
ここは与太郎さんにお返しして、iMacSagaの他の一行が乱入する前に、ええと、喫茶室へでも。


re.7:論理型について(VW談話室より)    薔薇の騎士ロードス
Tue Jan 31 12:10:14 2012

管理人殿、たいへんご無沙汰しております。
ゴンスケ殿のマシンはFM-7であったと記憶しております。

それにしても論理型というものは、
同じ結果を導くものに対して、複数の記述法が可能である点、
真偽かは背後に潜んでいて、人はそれを読み取りながら使うという点で、
建築と似ています。魅力的です。


re.6:論理型について(VW談話室より)    管理人
Mon Jan 30 14:14:09 2012

ゴンスケ殿の32KBというサイズから、管理人はPC8001では?と推測しました。
管理人も使ったマシンですが、購入したのは電子学科の先生のアドバイスでSHARPMZ-80B
当時は理解不足でしたが、OSを変更出来るクリーンなコンピュータだからとのお勧め。

メモリーは贅沢にも64KB!先日消えたハドソンのHu-BASICを入れました。
残り20kbに自作の成績処理のプログラム。あらあ、データがほとんど入らない!
0
点から100点をアスキーコードに置き換えて、20020科目を処理しました。
変数名も一文字、コメントなんて贅沢品は書く余裕なし。

カセットテープが保存メディアだから、シーケンシャルなのですが、
SHARP
のマシンは電磁制御と銘打った、プログラムで擬似的にランダムアクセス可能!
いえ、単に早送りできたり、テープの長さを計測出来るだけなのですが、でも、ランダム!

漢字ROMも出る前なので、フォントもデザインしました。勝手に番号付けて。
結局、データベース、表計算、ワープロ、お絵描き、そしてCAD
ただ、ラインは引けても、塗りつぶしの範囲を決めるアルゴリズムに悪戦苦闘。
ですからね。面を扱えることは、管理人にとって、トテツモナイ偉業に思えたのです。

そういう次第で、Macintoshに大ショック。ネットワークの概念も衝撃でした。
個人がプログラムする時代は終わった、と思いましたが、管理人はアマノジャク。
誰も作らないプログラム、商売にはならないプログラムこそ、個人がコンピュータを持つ意義!

だから、あの会社は好きではないし、ここに集う人達は尊敬しますし、
無いものは作ろう、と言われると、バンジャーイ!となっちゃいます。
何の話でしたっけ?


re.5:論理型について(VW談話室より)    ゴンスケ
Mon Jan 30 12:10:16 2012

当時をご存じない方に、、、、「1=1」は、「TRUE」の代用なんです。
4バイトの「TRUE」より、1バイトも小さい3バイトの「1=1」 は、
32KB
という制約の中でソースを小さくするための裏技的記述だったのです。

数式に見えるので、IFが条件式の結果の論理値を扱うことを知らなければ、
全く持って不可解な一文になるわけで、要するに、管理人さんごめんなさい、
油断していました。「一言」じゃ足りませんでしたね、「一文」お願いします。


re.4:論理型について(VW談話室より)    管理人
Mon Jan 30 11:42:26 2012

与太郎さん>私もその頃に与太郎さんの説明を聞きたかったです...
これって、X=X1 みたいで好みです。いつか使ってみたいです。
この代入式に管理人は抵抗ありませんでした。そもそも計算に弱いので不思議とも思わず
管理人は、必要と思う所だけという、拾い読み式の勉強法なので、知識も穴だらけ。
たとえば、XOR は必要なかった(と思っただけ?)ので、意味がわかりません。
どんな時に使うのでしょう?
ちなみに管理人はいつまでたっても初心者で、いまだにVectorScriptのハンドルがワカラン!
ゴンスケ殿、管理人に一言だけって無理。油断すると無限ループ。


re.3:論理型について(VW談話室より)      ゴンスケ
Mon Jan 30 10:25:07 2012

達人にも初心者時代があったんですね! (^^;)v

管理人さんも一言いかが?


re.2:論理型について(VW談話室より)    与太郎
Sun Jan 29 21:15:43 2012

BASICを学び始めた頃、IF 1=1 THEN .... という記述を見て、
>????となりましたが、

私もその頃に与太郎さんの説明を聞きたかったです...


re:論理型について(VW談話室より)    ゴンスケ
Fri Jan 27 11:42:38 2012

> if文では条件式というより条件式の計算結果でもある論理値によって分岐処理を行ないます

すごく分かりやすいです。
BASIC
を学び始めた頃、IF 1=1 THEN .... という記述を見て、
????となりましたが、そのとき、上記の与太郎さんの説明が
聞けていたら!


論理型について(VW談話室より)    与太郎
Wed Jan 11 16:24:41 2012

今年もよろしくお願いします。
途中で止まってるお題をなんとかしようと思うのですが、
年明け最初の書き込みは、いきなりVS談話室の話題への補足です。

たとえば書類の表示モードを切り替える場合、
元の設定値をGetPrefで調べてSetPrefで逆の値を設定するので、
if GetPref(10) = true then
__SetPref(10, false)
else
__SetPref(10, true);
と書くことができます。
このif文の書き方は冗長なのですが、初心者にはありがちです。
if
文の文法は if 条件式 then 処理1 else 処理2; であり、
条件式の結果が真(true)のときに処理1を、偽(false)のときに処理2を実行するのですが、
条件式の部分は必ずしも「式」である必要はありません。
if
文では条件式というより条件式の計算結果でもある論理値によって分岐処理を行ないます。
論理値を返す式とは論理式のことですが、
これには単独の論理型定数、論理型変数、論理型関数も含まれます。
上のif文のGetPref(10)を戻り値であるtruefalseに置き換えれば、
条件式の計算結果は true = true なら truefalse = true なら false となります。
これはGetPref(10)の値そのままです。
GetPref
は論理型の関数なので、単体で条件式として使えます。
ですから上のif文の「= true」は必要なく、スクリプトは
if GetPref(10) then
__SetPref(10, false)
else
__SetPref(10, true);
で良いことになります。
しかし実はif文を使うまでもなく、GetPref(10)の値を逆にするのはnot演算で可能です。
not」演算子は、算術演算の「-」演算子に相当するもので、論理値を反転します。
この場合はSetPrefの第2パラメータにnot GetPref(10)を入れれば済みます。
つまり、
SetPref(10, not GetPref(10));
が一番短いスクリプトになります。

この例に限らず、論理型を上手く使えばスクリプトを簡潔に書けることがあります。


本年もよろしくお願いいたします。    管理人
Sun Jan 1 0:00:13 2012

昨年の書き込みはバックナンバーに移動しました。
Script
満載の充実した資産ですので、ご活用頂けると幸いです。
回答者の皆さんに感謝!
本年もよろしくお願いいたします。