<入門者歓迎です。ベテランのあなた、VectorScriptの普及にお力添えを!>

ハンドル名:
   題名

  本文:1行ごとに改行して下さい。


ソースの32KB制限について・・解決ですm--m   skyblue
Mon May 12 19:06:53 2008

お騒がせいたしました。32KBの制限は勘違いでした・・・
もうしわけありません。

分担開発している、膨大なソースになっており、
個々のソースは問題ありませんでしたが、
ひとつのソースとしてあわせた際にバグが発生していただけ
のことのようです・・・
ファイル容量が偶然にも32KBだったので、早とちりでした。
バグを取り除いたところ、32KB超えでもまったく問題
ありませんでした。


大変お恥ずかしい・・・^^;失礼いたしました。


ソースの32KB制限について・・・補足情報です   skyblue
Mon May 12 17:25:33 2008

補足いたします。

32KBの制限があると思える事象ですが、
ある行数を越えると、コンパイルで意味不明のエラーがでるようになります。

部分部分ごとに、ソースを抜き出してコンパイルすると、
エラーはなくなります。

Plug-Insフォルダの 「.vsm」ファイルをみてみると、ちょうど32KBとなっていますが、
外部エディタで保存した、同じソースのテキストファイルは、40KBとなっています。

これらのことから、32KBの制限があるのかと思っております。


ソースの32KB制限について   skyblue
Mon May 12 17:20:16 2008

http://www.aanda.co.jp/VIPRoom/vstechnote/
こちらに、リソースブラウザより開くScriptエディタは、32KB制限があるが、
プラグインメニューより開くエディタは、制限がないということが書いてあります。

しかし、私の環境では、32KBの制限が、プラグインの方にもあるような挙動です。
しかも、32KBは、インクルードするファイルまで含めて、32KBのようです・・・
外部ファイルにしても解決せず、こまっております。
32KB制限について、解決策はありますでしょうか?

環境;
Windows2000
QuickTime7.1
VectorWorks11.5


Re:ワークシート関数    与太郎
Wed Apr 30 8:26:59 2008

残念ですが、スクリプトでワークシートに書き込むしかないと思います。


ワークシート関数   GUN
Sat Apr 26 12:09:28 2008

はじめまして。GUNといいます。
現在、VectorWorks12.0を使っているのですが、3D空間上に3D多角形で任意にひかれた、角度、長さともに不明な線分の両端のベクトルを抽出したいと思っています。

スクリプト関数を用いれば抽出可能です。しかし、これをワークシートを用いて行いたいのですが、何か方法をご存知の方いらっしゃいませんか?(x座標とy座標の関数は確認済です)簡単に言うとz座標をワークシートを使って返す方法です。

もしくは、スクリプト関数をワークシートに適用は可能でしょうか?


Re5:ループ文とハンドル接続   HiroMi
Thu Apr 17 16:28:59 2008

与太郎さん 名回答をいただきながら
15時過ぎに もやもやとしたままで下記の様なものを送ってしまいました。
もやもの中に射した一点の光の様に スッキリしました。

幾何の時の補助線的なものの考え方かなと 勉強になります。
又ヒントをいただくかもしれません.宜しくお願い致します。
有り難うございました。


ループ文とハンドル接続 報告 その後   HiroMi
Thu Apr 17 15:04:51 2008

報告して早々ですが
SelectObj((T=XTRD) or (T=SWEEP) or (T=MXTRD));
hd:=FSActLayer;
として 次の3D図形のハンドルを取得していけば良いと思っていました。
でも最初の段階で 複数ある3D図形の内の幾つかしか多角形化をしない様にした時に
この報告にした形では全ての3D図形を多角形にしてしまう事が 動かして解りました。

SelectObj((T=XTRD) or (T=SWEEP) or (T=MXTRD));
hd:=FSActLayer;

の部分を

hd:=NextObj(FIn3D(hd)); にしたりしたのですが
次の3D図形のハンドルを取得出来ません。

始めにグループ化した際 LNewObjでグループのハンドルを取得し、
FinGroupで次の3D図形のハンドルを取得しようとしてみたりしたのですが
これも上手くいきません。

選択した図形群をグループ化し、
そのグループ内の図形のハンドルは どの様にして取得していけば良いのでしょうか
お教えください。
選択した図形群をグループ化していく と云うところから考え直さないといけないのでしょうか
宜しくお願い致します。


Re4:ループ文とハンドル接続    与太郎
Thu Apr 17 12:49:05 2008

HiroMiさん、

本当はDoMenuTextByName('Convert to Polygons',0); 1行で十分なのはおいといて、

SelectObj((T=XTRD) or (T=SWEEP) or (T=MXTRD)); を実行すると、最初に選択してな
かった3D図形も選択されてしまいます。

ループの終了判定は色々な方法がありますが、「番兵」を使うと下のようになります。

procedure Convert2Poly;
var
__hd :Handle;
__hdL :Handle; { 番兵 }
{$DEBUG}
BEGIN
__hd:=FSActLayer;
__Group;
__DoMenuTextByName('Group Navigation Chunk',1);
____Locus(0, 0); { 基準点を描く }
____hdL:= LNewObj; { 番兵に基準点のハンドルをセットする }
____while hd<>hdL do { ハンドルと番兵が一致したら終了 }
____begin
______DSelectAll;
______SetSelect(hd);
______hd:=NextObj(hd); { 変換前に次のハンドルを取得 }
______DoMenuTextByName('Convert to Polygons',0);
____end;
____DelObject(hdL); { 基準点を削除 }
__DoMenuTextByName('Group Navigation Chunk',2);
__UnGroup;
end;
Run(Convert2Poly);

グループに入って最初に基準点を描くと、この基準点は一番上(前面)になります。
変換された図形は基準点の上に生成されるので、ハンドルが基準点と一致した時点で
ループを終了すれば、変換した図形はループ処理の対象にはなりません。

選択図形をグループ化すると他のレイヤの図形もアクティブレイヤに移動するので、
(スクリプトを書くのも使うのも)その辺を理解しておく必要があります。


Re:Re:ループ文とハンドル接続 報告   HiroMi
Tue Apr 15 18:44:17 2008

与太郎さんよりヒントをいただき 今日一日色々やっていく中で
(今回の場合)3D図形を選ぶと云う事に気付き
下記のような形で なんとか今回の練習をクリア出来た様に思っています。
有り難うございました。報告です。

PROCEDURE Convert2Poly;
Var
hd ,Ghd :Handle;
{=$DEBUG}
BEGIN
hd:=FSActLayer;
While hd<>Nil Do
Begin
Group;
DoMenuTextByName('Group Navigation Chunk',1);
DSelectAll;
SetSelect(hd);
DoMenuTextByName('Convert to Polygons',0);
ReDrawAll;
DoMenuTextByName('Group Navigation Chunk',2);
UnGroup;
DSelectAll;
SelectObj((T=XTRD) or (T=SWEEP) or (T=MXTRD));
hd:=FSActLayer;
End;
END;
RUN(Convert2Poly);


Re:Re:ループ文とハンドル接続   HiroMi
Tue Apr 15 9:12:11 2008

与太郎さん 詳しい説明有り難うございます。

お話に在る様に <適所にReDrawAll;を入れると......>でデバック中の状況を見ながら
どのように変換されるのかなど勉強したいと思います。

有り難うございました。


Re:ループ文とハンドル接続    与太郎
Mon Apr 14 21:43:29 2008

ヒントです。

DoMenuTextByName('Convert to Polygons',0); を実行した時点でhdが指していた図形
(柱状体)は消えてしまいます。
参照先のないハンドルのNextObjは、本来ならどんな結果が返っても不思議ないのですが、
VWの中の人は親切にもNilを返してくれることに決めたようです。
出来ればもう少しがんばって警告エラーを出してほしいところですが。

DoMenuTextByName('Convert to Polygons',0); で変換された図形は一番前面に生成さ
れるので、これらもループの対象になります。
今回のケースでは悪影響はありませんが、このスクリプトを流用して別の処理を行なった
場合は無限ループになる可能性があります。

適所にReDrawAll;を入れると、デバッグ中の実行状況(図形の選択等)を確認できます。
柱状体が重なるようにして実行すれば、変換された図形が前面になるのを観察できます。


ループ文とハンドル接続   HiroMi
Mon Apr 14 15:39:52 2008

繰り返し文と<DoMenuTextByName>を使い練習してみようと
いくつか選んだ柱状体を多角形化していくものを考えてみました.
Debugしながら動きを見ると
一番始めに作図した柱状体を多角形化し、Whileに戻るのですが
次にEndに移り、終了してしまいます。
hd:=NextObj(hd);がおかしいのではと 色々換えてみても同じ結果です。
どのように考えたら良いのかお教えください.宜しくお願い致します。

PROCEDURE Convert2Poly;
Var
hd:Handle;
{=$DEBUG}

BEGIN
hd:=FSActLayer;
Group;
DoMenuTextByName('Group Navigation Chunk',1);
DSelectAll;
While hd<>Nil Do
Begin
SetSelect(hd);
DoMenuTextByName('Convert to Polygons',0);
hd:=NextObj(hd);
End;
DoMenuTextByName('Group Navigation Chunk',2);
UnGroup;
END;
RUN(Convert2Poly);


Re^3:Windows版VW11.5で用紙設定の倍率を設定したときの、GetTextSizeの返値    与太郎
Thu Apr 10 18:19:34 2008

>これってこういう仕様なんでしょうか・・?
>バグでは?と思ってしまいますが^^;
Mac版では起きないのでWin版VW11.5のバグです。
Winの他のバージョンでどうなのか気になりますね。

>そちらにも、この情報を投稿させていただいて
>よろしいでしょうか?
どうぞどうぞ。


Re^2:Windows版VW11.5で用紙設定の倍率を設定したときの、GetTextSizeの返値   skyblue
Thu Apr 10 12:01:04 2008

与太郎さま

わざわざ調べてくださってありがとうございます。

> 100ptで文字を描いて、そのサイズをGetTextSizeで
> 調べればプリント倍率は判ります。

なるほど、その手がありますね!
利用させていただきます^^

これってこういう仕様なんでしょうか・・?
バグでは?と思ってしまいますが^^;

実は、私、mixiのVectorScriptのコミュの
管理人をさせていただいています。
そちらにも、この情報を投稿させていただいて
よろしいでしょうか?
ぜひ与太郎さまのアイデアを投稿したいと
思うのですが・・・

不都合ありましたら、ご指摘ください。


Re:Windows版VW11.5で用紙設定の倍率を設定したときの、GetTextSizeの返値    与太郎
Thu Apr 10 9:10:53 2008

その現象は初めて知りました。なんともおせっかいな仕様ですね。
VW11.5/Winで調べたところ、
TextSize ・・・・・・・・・・プリント倍率は無視、
GetDefaultTextSize ・・・・・プリント倍率は無視、
SetTextSize ・・・・・・・・ プリント倍率は無視、
GetTextSize ・・・・・・・・ プリント倍率により変わる、
みたいなので、
100ptで文字を描いて、そのサイズをGetTextSizeで調べればプリント倍率は判ります。
GetTextSizeで返った値をプリント倍率で割れば本来の文字サイズが得られます。


Windows版VW11.5で用紙設定no倍率を設定したときの、GetTextSize の返値   skyblue
Wed Apr 9 23:32:51 2008

はじめまして。よろしくお願いいたします。

VectorWorks11.5を、Windows2000で使用しております。
「GetTextSize」でフォントサイズを取得する時の返値についてです。
通常は、文字サイズをptの単位で取得できますが、
用紙設定で「VectorWorks」という項目の「倍率」を設定していると、
その倍率をかけたサイズで、返値がもどるようです。
この倍率に関係なく、データパレットで表示されるのと同じフォントサイズを
取得する方法はございますでしょうか?


Re5:vectorscriptメッセージにレイヤー名を表示    与太郎
Sat Mar 22 12:43:37 2008

VectorScriptでのDXF設定値の参照・変更は、GetPref???, SetPref???で行ないます。
「VectorScript Function Reference」の「Additional Resources 付録」−「VectorScript Appendix」−
「Appendix F - Preference Selectors」−「DXF」に設定セレクタの番号があります。

それから、去年のバックナンバーにAppleScriptについての書き込みがあります。


Re4:vectorscriptメッセージにレイヤー名を表示    五月雨
Thu Mar 20 14:52:51 2008

アドバイスありがとうございます。
少し、補足です。
dwgデータをepsデータにするのが最終目標です。
(レイヤーを別々に〜)は考えておりません。
vectorscriptメッセージに表示させたかった理由は正しく値を返されているか
確認したかったからです。(リファレンスか何かでこのようなmessageの使い方をみたような気がします。)

>取り出し系メニューコマンドをDoMenuTextByNameで実行しても、VectorScriptではダイア
ログでのファイル名入力や「保存」ボタンなどを押すことが出来ません。

確かに、どうしてよいかわかりませんでした。出来ないんですね…。
とりあえす、strdialog(レイヤー名)で表示→コピー→eps取り出し→ファイル名入力時にペースト
としました。(自動にはほど遠いですが、少しマシになりました。)
もう1つ、レイヤー名にこだわったのは、dwgデータを取り込み時に”レイヤーをクラスに変換”にチェックを
入れると、デフォルトのレイヤー1のほかにファイル名のレイヤーが作られているのがわかったためです。
また取り込みを使用するとファイル名が”名称未設定”となったいたためこれではNGなためです。
つまり、dwgのファイル名でeps保存したかったのです。(あとだしのようになってしまってスミマセン。)

>Macの場合、AppleScriptでメニューコマンドの実行やダイアログのキー入力等が可能ですが、

これは、取り込み、取り出し時のチェック(縮尺、レイヤーをクラスに変換等の指定)がapplescriptで
出来るということですか?
xcodeも今勉強中です。もしそうなら、希望がもてそうです。












Re3:vectorscriptメッセージにレイヤー名を表示    与太郎
Mon Mar 17 21:31:05 2008

>(今回のレイヤー名で保存)
やってみればすぐ判りますが、
取り出し系メニューコマンドをDoMenuTextByNameで実行しても、VectorScriptではダイア
ログでのファイル名入力や「保存」ボタンなどを押すことが出来ません。
ですから、「ファイルの全てのレイヤを別々にEPSに書き出す」ような作業はVectorScript
では無理だと思います。

Macの場合、AppleScriptでメニューコマンドの実行やダイアログのキー入力等が可能ですが、
レイヤ名をAppleScriptに渡すのがちょっと面倒です。


Re2:vectorscriptメッセージにレイヤー名を表示    五月雨
Sun Mar 16 0:07:02 2008

与太郎様
ありがとうございました。
試したところうまく行きました。
Message(GetLName(レイヤハンドル));のような使い方ができるとは
考えてもいなかったです。もう少しマニュアル等と格闘してみます…。

間にいろいろあるのですが、最終的には”domenu〜”を使用してeps保存(今回のレイヤー名で保存)
するscriptにしたいと思っております。
また、詰まってしまった時、知恵をお貸しください。
ありがとうございました。




Re:vectorscriptメッセージにレイヤー名を表示    与太郎
Sat Mar 15 23:41:04 2008

ハンドル型変数にはオブジェクトデータの場所(多分メモリアドレス)が入っています。
ですからMessage(レイヤハンドル);では数字が表示されます。
レイヤ名を表示するときはMessage(GetLName(レイヤハンドル));としてください。



vectorscriptメッセージにレイヤー名を表示    五月雨
Sat Mar 15 18:13:01 2008

はじめまして。
最近、scriptの勉強をはじめたものです。
マニュアル等参考にしておりますが、うまくいきません。
行いたい事は、図面データ(dwg)を開き、その図面中のレイヤー名(アクティブレイヤー)
の名前をvectorscriptメッセージに表示させたいのです。
私は、下記のように書きましたが、うまく表示されませんでした。

procedure try;
var
layerh:handle;
name:string;
begin
domenutextbyname('import dxf/dwg',0);
layerh:=actlayer;
{name:=gettext(layerh);}
message(layerh);
end;
run(try);

現状、message(layerh);では数字が返されてきます。(ちなみにレイヤー名はlayerAです。)
そこで、message(name);を使用してみましたが、この時は、空欄でした。
ご指導宜しくお願いします。




Re4:トライ&エラー.....新たな問題   HiroMi
Mon Mar 10 8:58:09 2008

解りました.有り難うございました。

ネット上で見つけた皆さんが作られたものなどを手本に
Scriptを並べる事で 何となく機能しているようで
なぜ動くのかの部分を理解していない事に気付きました。
もう一度マニュアルを読み返そうと思います。

有り難うございました。


Re3:トライ&エラー.....新たな問題    与太郎
Mon Mar 10 0:48:41 2008

いえ、もちろん同じファイルならWSサイズが変わるはずはありません。
たぶん御友人のVWは環境設定でScriptエラーを出さないようにしているのでしょう。
そうすると、文字列の範囲外へのアクセス・エラーなども出なくなります。
しかし、エラーが出なくてもスクリプトにバグがあるのは明らかです。
スクリプト作成中はScriptエラーが出るように設定しておいたほうが良いでしょう。



Re:トライ&エラー.....新たな問題   HiroMi
Sun Mar 9 11:29:48 2008

いつもいつも早速の回答有り難うございます。
これから色々トライしてみます。

一つお教え戴きたいのですが
>WSの行列の大きさが違っているからでは?
と 言われておりますが
iBookからiMacにデータを持ってきてみただけでも
<行列の大きさ>は変わってしまうのですか?
解ってないもので愚問かもしれませんが
宜しくお願い致します。


Re:トライ&エラー.....新たな問題    与太郎
Sun Mar 9 0:59:09 2008

WSの範囲外のセルにアクセスしたという警告ですから、まあそういうことでしょう。
片方でしかエラーが出ないのは、WSの行列の大きさが違っているからでは?


トライ&エラー.....新たな問題   HiroMi
Sat Mar 8 9:37:06 2008

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

新たな問題。
いつもはiMac-OS10.4VW12.5を使っています。
図形の面積を拾い出し、WorkSheetに書出すと云うScriptを作っていたのですが
途中から友人のiBook-OS10.3.9を使う事となり そこで完成しました。
ですが
持ち帰りiMacで動かすと
<Attempt to access a cell outside the worksheet bounds.>
と云うエラーが出ます。でも 計算もちゃんと出ます。
どうしてなのか解りません。
お教えください.宜しくお願いします。


Re:スクリプトの中でカラーパレットを使う    石男
Thu Mar 6 16:50:42 2008

><VectorScript Reference>の個々の使い方を...
結局のところ、トライ&エラーで試してみる以外はないです。英語が分かれば、ご本家の
メーリングリストが一番間違いなく答えをいただけます。
新しいことは、ここでしか分からないかもしれません、自分の経験上では。
がんばってみてください。


Re:スクリプトの中でカラーパレットを使う   HiroMi
Thu Feb 14 8:55:58 2008

またまた 色々と勉強材料を戴き有り難うございます。
英語が苦手なのですが、時間が掛かってもトライしたいと思います。
ところで<VectorScript Reference>の個々の使い方を どのように勉強なさっているのですか?
以前は本も出ていたとか、古本をあたっても入手できません。
なんとかMiniCAD7の ミニパスカルマニュアルを手に入れたのですが
これに無いものの使い方の例を 知りたいことの方が多いのです。
マニュアルの内容を詳しく知りたい事が多く
やはりScript相談室等のネットで勉強するとか
試行錯誤で使い方を見つけだす
という方法なのでしょうか



Re:スクリプトの中でカラーパレットを使う    与太郎
Wed Feb 13 20:30:09 2008

「特定イベント」については私もあまり経験ありませんので、
「VWHelp」―「VectorScript Guide」―「VectorScriptオブジェクト」―「オブジェクトのオプション
を設定する」―「スクリプトの実行オプションを設定する」、
「Script談話室2004」の Fri Sep 17 14:51:24 2004 〜 Tue Oct 5 18:12:27 2004、
http://www.nemetschek.net/ の「Support」―「Tech Forum」―「VectorWorks VectorScript」、
http://www.vectorlab.info/ の「VectorScript」―「Events」、
を御覧下さい。


Re:スクリプトの中でカラーパレットを使う   HiroMi
Wed Feb 13 18:59:34 2008

多くのご提案有り難うございます。
プラグインオブジェクトをレンダリングした状態で 色を見つつ変更していきたいと考えていましたので
<4>の方法が一番近いのかと思っておりますが
<3>までの方法は出来たのですが、この<「特定イベント」でモダンダイアログを開き>とは
どのように行うのか、図々しいのですがお教えください。
宜しくお願い致します。


Re:スクリプトの中でカラーパレットを使う    与太郎
Tue Feb 12 12:59:34 2008

プラグインオブジェクト内の特定の図形の色を変えたいなら、
1. 整数型パラメータで色番号(カラーインデックス番号)を指定する、
2. ポップアップ型パラメータで色の名前を指定する(名前→色の変換は自己責任)、
3. ポップアップ型パラメータで図形のクラスを指定して、色はクラス属性で変更する、
4. 「特定イベント」でモダンダイアログを開き、カラーパレットで色番号を指定する、
など色々なやりかたがあります。


Re:スクリプトの中でカラーパレットを使う   HiroMi
Tue Feb 12 9:09:09 2008

有り難うございます。
質問が不明瞭な点が在ったようで済みません。
勉強中でしたので単体のオブジェクトでしたが
いくつかのオブジェクトで構成されたオブジェクトの一部のものだけの色を
変更するのに、データパレットから数値入力に依り操作できるのではと思ったのです。
マニュアルを読んでみます。
又質問させていただくかもしれません.有り難うございました。


Re:スクリプトの中でカラーパレットを使う    与太郎
Tue Feb 12 0:30:50 2008

プラグインツールとプラグインオブジェクトは全く別のものです。

プラグインツールのスクリプトがグループ図形を描くようになっていれば、当然グループ図形が生成されます。
プラグインオブジェクトを描くにはCreateCustomObjectを使います。

プラグインオブジェクトは別に作る必要があります。
寸法やカラーインデックスなどのパラメータはこちらに入れます。
メインルーチンのBeginGroupからEndGroupまでを抜き出してオブジェクト用のスクリプトとして流用して下さい。
ただ、プラグインオブジェクトのスクリプトには決まり事があるので、一度マニュアルを読んだほうがいいでしょう。

それから、FillBackなど色を設定するProcedureは、引数をR,G,Bに分けずにインデックス番号のままでも構いません。

「スクリプトの中でカラーパレットを使う」のようなスクリプトは、プラグインオブジェクトの中では使えません。
と言うのも、プラグインオブジェクトのスクリプトはオブジェクト内にしか描画できないからです。
そして、GetPtやGetPtLも使えないはずです。

と、ここまで書いて気付きましたが、
色や線の太さは属性パレットで変えたほうが簡単なんじゃないでしょうか?
そういうことでしたら、そもそもダイアログで属性を設定する必要もないので、
プラグインオブジェクトのスクリプトは下のようなものでも通用します。
(プラグインオブジェクトの流儀は無視しています)

PROCEDURE ColorRectangularSolid;
{Object's parameters
const
pWidth = 1.0;
pDepth = 1.0;
pHieght = 1.0;
}
BEGIN;
BeginXtrd(0, pHieght);
Rect(-pWidth/2, pDepth/2, pWidth/2, -pDepth/2);
EndXtrd;
Rect(pWidth/2, pDepth/2, pWidth/2, -pDepth/2);
END;
RUN(ColorRectangularSolid);

壁に挿入するためのプラグイン化だとしたら、
スクリプトの最初にGetCustomObjectInfoで壁のハンドルを取得して、
壁の厚みからpDepthの値を決定できます。



スクリプトの中でカラーパレットを使う   HiroMi
Mon Feb 11 21:35:59 2008

Re:ドキュメントスクリプトとVectorScriptツールの書き方の返答の中で
VW12以降ではモダンダイアログでカラーパレットが使えるみたいです。
と云う事ですので、早速トライしてみました。

下記の様になったのですが、
ここでお教え戴きたいのが <プラグインオブジェクト>にならないのはなぜか?
と云うところです。グループ図形となってしまうのです。
データパレットから数値入力で変形可能な形にしたいのです。
また
「スクリプトの中でカラーパレットを使う」Scriptをサブルーチンとして
使うとどのような形になるか 合わせてお教えください。
宜しくお願い致します。

PROCEDURE ColorRectangularSolid; {VectorWorksVer.12以上にて作動 080211}
CONST
kOkButton= 1;{------------OK ボタン}
kCancelButton= 2;{------------CANCEL ボタン}
kRealField= 3;{------------リアルフィールド番号}
kLineWeight= 4;
kStaticText1= 5;{------------編集できないフィールド番号}
kStaticText2= 6;
kStaticText3= 7;
kColrPopup= 10;{------------カラーポップアップ番号}
VAR
dialogID, result:LONGINT;{(OK=1,Cancel=2 )}
verify ,ret:BOOLEAN;
X1,Y1,X0,Y0, LineW1 : REAL;
colorPopupData : Integer;
red,green,blue:LONGINT;

{------------------- モダンダイアログの内部機能を設定 -------------------}
PROCEDURE MDlogCallback (VAR key:LONGINT; Value:LONGINT);
BEGIN
Case key of
SetupDialogC:
begin
SetLineWeightChoice(dialogID,kLineWeight,4);
end;
kOkButton:
Begin
GetLineWeightChoice(dialogID, kLineWeight,LineW1);
GetColorChoice(dialogID, kColrPopup,colorPopupData);
End;
kCancelButton:
Begin
End;
end;
END;{---------------------end callback}

{------------------- メインプログラム部 -------------------}
BEGIN
GetPt(X0,Y0);
dialogID:=CreateLayout('直方体の作図', TRUE, 'OK', 'キャンセル');
CreateStaticText(dialogID, kStaticText1, '線の太さは?',16);
SetFirstLayoutItem(dialogID, kStaticText1);
CreateLineWeightPopup(dialogID, kLineWeight);
SetRightItem(dialogID, kStaticText1,kLineWeight,6,0);
CreateStaticText(dialogID, kStaticText2, '面の色は?',16);
SetBelowItem(dialogID, kStaticText1,kStaticText2,0,0);
CreateColorPopup(dialogID, kColrPopup, 10);
SetBelowItem(dialogID, kLineWeight,kColrPopup,0,0);
SetBelowItem(dialogID, kStaticText2,kStaticText3,0,0);
SetHelpString(kLineWeight,'図形の線の太さを指定<mm>');
SetHelpString(kColrPopup,'彩色表現の時、その色を選択');
verify:=VerifyLayout(dialogID);
IF verify THEN
BEGIN
result:=RunLayoutDialog(dialogID, MDlogCallback);
If result=1 then
PushAttrs;
DSelectAll;

GetPt(X1,Y1);
ColorIndexToRGB(colorPopupData, red,green,blue);
BeginGroup;
PenSize(LineW1);
FillBack(red,green,blue);
BeginXtrd(0,pHieght);
Rect(X1-pWidth/2, Y1+pDepth/2, X1+pWidth/2, Y1-pDepth/2);
EndXtrd;
Rect(X1-pWidth/2, Y1+pDepth/2, X1+pWidth/2, Y1-pDepth/2);
EndGroup;
PopAttrs;
DSelectAll;
END;
END;
RUN(ColorRectangularSolid);



Re:ドキュメントスクリプトとVectorScriptツールの書き方   HiroMi
Mon Feb 11 9:33:41 2008

与太郎さん 早々の返答有り難うございました。
友人の中には Ver.11だったりのものもいますので勉強てみます。
3Dオブジェクトをパラメーターで色コントロールできればと
考えてのトライでした。
有り難うございました。



Re:ドキュメントスクリプトとVectorScriptツールの書き方    与太郎
Sun Feb 10 9:00:48 2008

VectorScriptコマンドは、3種類のVectorScriptプラグイン(Menu, Tool, Object)の内、
Menuプラウインに当たります。

Menuプラグインは、基本的にはファイル全体や選択図形を対象としてスクリプトを実行します。

Toolプラグインのスクリプトは、マウスクリック/ドラッグで操作対象や座標を指定します。
最初に描画領域内をクリックかドラッグすると、それがトリガーとなってスクリプトが実行されます。
ですからスクリプトの最初のほうでGetPt,かGetPtLによる座標取得が必要です。

「スクリプトの中でカラーパレットを使う」ですが、
VW12以降ではモダンダイアログでカラーパレットが使えるみたいです。
モダンダイアログは面倒ですが、文字属性などもポップアップで設定出来るなど、ヴァージョンアップ
の度に機能が追加されていて、開発元も力を入れているようです。



ドキュメントスクリプトとVectorScriptツールの書き方   HiroMi
Sat Feb 9 13:47:54 2008

初めてお便りします。VectorScript勉強中です。
’04.Sep.バックナンバーの中で与太郎さん作の<スクリプトの中でカラーパレットを使う>Scriptが在りましたので、
サブルーチン化の勉強もふまえ Getした番号をObjectに割り当てようと下記のようなものをドキュメントスクリプトと
して作ってみました。作画出来たのですが これをこのままツール化すると機能しません。なぜなのか、
ドキュメントスクリプトとVectorScriptツールとのScriptの書き方の違いがあるのかよく解りません。
お教えください。宜しくお願い致します。

Procedure ColorCube;
Var
X,Y,X1,Y1,Ww,Dd, Wid, Dep, Hgth :Real;
ClrNumb:STRING;
ColorNumb, col : Integer;
R,G,B:LongInt;
Hd:Handle;

Procedure GetColIndex(var iCol:integer);
const
BlockSize = 24;
var
zoom, xc, yc :real;
k, kB, kS :real;
x, y, x0, y0 :real;
i, j :integer;
h :handle;
hB :array[0..15, 0..15] of handle;
r, g, b :real;

Function Set_k:real;{------------ 描画倍率を計算します。------------ }
var
sscale, upi :real;
fraction, display :longint;
format :integer;
name, squareName :string;
result :real;

begin
sscale:= GetLScale(ActLayer);
GetUnits(fraction, display, format, upi, name, squareName);
Set_k:= upi * sscale / 25.4 / 72 * 25.4;
end;{------------ Set_k ------------}

Function LocToColIndex(iX, iY:integer):integer;
var
result :integer;
i :integer;
begin
i:= 16 * iY + iX;
case i of
1: result:= 255;
17: result:= 254;
22: result:= 247;
23: result:= 252;
25: result:= 253;
29: result:= 249;
34: result:= 251;
37: result:= 246;
43: result:= 250;
45: result:= 245;
47: result:= 248;
245: result:= 45;
246: result:= 37;
247: result:= 22;
248: result:= 47;
249: result:= 29;
250: result:= 43;
251: result:= 34;
252: result:= 23;
253: result:= 25;
254: result:= 17;
255: result:= 1;
otherwise result:= i;
end;{------------ case ------------}
LocToColIndex:= result;
end;{------------ LocToColIndex ------------}
begin{GetColIndex}
k:= Set_k;
GetVCenter(xc, yc);
zoom:= GetZoom;
kB:= k * BlockSize * 100 / zoom;
kS:= kB / 10;
x0:= xc - 8 * kB;
y0:= yc + 8 * kB;
for j:= 0 to 15 do begin
for i:= 0 to 15 do begin
Rect(x0+i*kB+kS, y0-j*kB-kS, x0+(i+1)*kB-kS, y0-(j+1)*kB+kS);
hB[i, j]:= LNewObj;
SetDSelect(hB[i, j]);
SetFPat(hB[i, j], 2);
SetFillFore(hB[i, j], LocToColIndex(i, j));
end;{------------ for ------------}
end;{------------ for ------------}

ReDraw;
i:= -1; j:= -1;
GetPt(x, y);
h:=PickObject(x, y);
if h = nil then begin
iCol:= -1;
end{------------ if ------------}
else begin
GetFillFore(h, r, g, b);
RGBToColorIndex(r, g, b, iCol);
end;{else}

for j:= 0 to 15 do
for i:= 0 to 15 do
DelObject(hB[i, j]);
end;{------------ GetColIndex ------------}

Begin
PushAttrs;
DSelectAll;

Wid :=RealDialog('間口寸法は?','2000');
Dep :=RealDialog('奥行寸法は?','1500');
Hgth :=RealDialog('高さは?','1000');

GetColIndex(col);
ColorIndexToRGB(col,R,G,B);

Ww:=Wid/2;
Dd:=Dep/2;

FillBack(R,G,B);
GetPt(X,Y);

BeginGroup;
BeginXtrd(0,Hgth);
Rect(X-Ww,Y+Dd,X+Ww,Y-Dd);
EndXtrd;
Rect(X-Ww,Y+Dd,X+Ww,Y-Dd);
EndGroup;

DSelectAll;

PopAttrs;
End;
Run(ColorCube);


Re:オブジェクトの選択のときに    確認申請恐怖症
Fri Jan 25 19:25:15 2008

nudgeさま:

ありがとうございます。これで他のレイヤを編集状態にしていようが、選択したい文字列がある範囲を
セレクションポインタで大雑把に選択してから安心して作業できます。
これを参考に、他のオブジェクトや画面に表示された範囲などの条件をトライしてみます。
(図面が適判にまわってから…)

私の頭はcore Soloで回路はシングルタスクですので同時に2件の申請作業など絶対に不可能ですが、
これが仕事なんだと思って頑張ります。ありがとうございました。


Re:オブジェクトの選択のときに   nudge
Thu Jan 24 21:37:55 2008

選択しているものに限るは

DSelectObj(((T<>Text) & (SEL=TRUE)));

で良いと思います。選択しているオブジェクトから
文字列以外を選択解除するという手順です。

見えているものというのは、画面に表示された範囲と
いうことでしょうか。そうであると私の手には負えません。
他の方のレスを待ってください。

お急ぎのようですので、取り敢えず解るところから。

私も明日2件の申請があります・・・・汗。
お互いがんばりましょう。



オブジェクトの選択のときに    確認申請恐怖症
Thu Jan 24 20:13:33 2008

はじめまして。
文字列の選択スクリプトを

DSelectAll; SelectObj((T=Text) & (V));

として使い続けて来たものですが、これだと全ての文字列が選択されてしまいます。
「いま見えているものに限る」または「選択しているものに限る」という意味を付け加えるには、
どのようなスクリプトが必要でしょうか。マニュアルをみて試して見ているのですが、
どうもうまくいきません。バージョンは12.5です。
非常に基礎的なことだとは思いますが、どうぞよろしくお願いします。

上記のスクリプトを焦っているときに使って、条文をあげて根拠を必死に説明している文字列を全て
消してしまい、気付くまでの数秒の間に自動上書き保存されてしまったので、本日の業務は終了です(大泣)


スクリプト初心者ですが…   nomu
Tue Jan 15 13:18:42 2008

ありがとうございます!v12を入手して、ヘルプを見てみようと思います。今後ともよろしくお願いします!


スクリプト初心者ですが…    与太郎
Sat Jan 12 21:32:59 2008

nomuさん、はじめまして。

オフセットツールのパラメータは、スクリプトでは設定出来ないみたいです。
MacでOSXな環境ならAppleScriptで「i」、「100」などのキー入力をすることは可能ですが、
いまいち使いにくそうです。
直線や円弧が対象なら、専用のスクリプトコマンドを書くのは比較的簡単です。

VWヘルプのVectorScript Gudeは御覧になりましたか?
VW12では日本語に訳されているので、デモ版を入手してでも一読されることをお勧めします。
VectorScriptでどんな事が可能かイメージがつかめると思います。
製品版でしたら、VectorWorksフォルダの中にもサンプルなどがあります。

関連サイトについてはMiniPascal、VectorScript等で検索してください。
ここの掲示板のバックナンバーも参考になるでしょう。


スクリプト初心者ですが…   nomu
Tue Jan 8 11:54:17 2008

いつもお世話になります。オフセットを100や200など、そのたびに数値入力をする手間を省くようなスクリプトをご存知の方いらっしゃいませんか?コマンドパレットのなかに「オフセット100」「オフセット200」など設定しておければなぁと思っているのですが…。よろしくお願いします。また、初心者向けのスクリプト参考本(サイトなど)もあわせて教えていただければ幸いです。


今年は    管理人
Mon Dec 31 15:38:52 2007

お世話になりました。
来年もよろしくお願いいたします。


バックナンバーに移動    管理人
Mon Dec 31 15:38:13 2007

今年の書き込みは、バックナンバーに移動しました。