VectorWorksClub北海道
喫茶室
Club北海道
<入門者歓迎です。ベテランのあなた、VectorScriptの普及にお力添えを!>
ご利用規程] [記事を検索過去記事]  バックナンバー] 

ハンドル名
Eメール: 入力不要!:公開されます。
タイトル: 各記事の[返信]で自動入力されます。
メッセージ:改行しながら入力して下さい。*半角カタカナは使用厳禁です!

紹介URL: 1カ所だけご紹介頂けます。
削除キー: 英数字で8文字以内:ご投稿を削除できます。  クッキー保存:次回の入力を省けます。
認証キー: 右の数字を入力して下さい 認証数字 リロードすると数字が変わります。
Page: | 1 | 2 | 3 | 4 |

64  forward    msg     2015/11/27(Fri) 21:39返信

突然の質問ですみません
forward(選択されている図形の前後関係を、ひとつ前に移動する)スクリプトが正常に働きません
バージョンによるのでしょうか?

http://developer.vectorworks.net/index.php/VS:Forward


63  Re:[62] プラグインオブジェクトのハンドル    タニ     2015/11/18(Wed) 17:19返信

与太郎 様

ご返答ありがとうございます。

思い描いていた方法だと難しそうですね。
他の方法を検討してみます。

今後もよろしくお願いいたします。


62  Re:[61] プラグインオブジェクトのハンドル    与太郎     2015/11/15(Sun) 10:31返信

ハンドルの実体はメモリ・アドレス、つまり32bit整数です。(64bit化でどうなるのか?)
そしてConcat(ハンドル)で文字列化できます。もちろん整数化も可能です。
でも、VectorScriptはPascal準拠なだけに変数の型違いに厳しいので、
ハンドル型変数に文字や整数を代入することは出来ません。
またファイルに保存して開いたときに同じアドレスになる保証はありません。
図形にユニークな名前を付けてGetObject(名前)で参照するのが現実的かと思います。


61  プラグインオブジェクトのハンドル    タニ     2015/11/13(Fri) 16:06返信

お世話になります。
VS初心者です。

プラグインオブジェクト(PIO)のハンドルを文字列に変換することは可能でしょうか。

やりたいことのイメージは下記の通りです。

図面上に2種類(「A」と「B」)のPIOがそれぞれ複数あったとします。

任意「A'」のハンドルをデータパレットに表示させ、
任意「B'」のデータパレットに「A'」のハンドルを文字列で入力することにより、
「A'」のパラメータが変更されると「B'」のパラメータも連動して変更されるようにしたい。

仕組み的に無理があるでしょうか。
よろしくお願いいたします。


60  Re:[59] 1点型オブジェクトでのSelectObj    A級初心者     2015/10/16(Fri) 18:36返信

> 以前どこかで「VectorScriptはPascal言語を元に・・・」といった内容を呼んだ記憶があり、

VectorScriptはPascalベースであると、エーアンドエーのHPに明記されていますよ。


59  Re:[58] 1点型オブジェクトでのSelectObj    タニ     2015/10/13(Tue) 22:15返信

与太郎 様

返信ありがとうございます。

非常に分かりやすく、教えて頂いたとおりに修正して
イメージしていた機能を実行することができました。


話しは変わりますが、私はVectorScript初心者のため、
付属していた「VectorScript Reference」やWEBで検索して知識を得ているのですが、
何か参考書籍的なものはありますでしょうか。

以前どこかで「VectorScriptはPascal言語を元に・・・」といった内容を呼んだ記憶があり、
Pascal言語をまず勉強したほうが良いでしょうか?

「やりたいことをVectorScriptで実行するにはどうしたらよいか?」の繰り返しで覚えてしまっているので、
ちゃんと勉強したほうが良いかなと思っています。

以上、よろしくお願いいたします。


58  Re:[57] 1点型オブジェクトでのSelectObj    与太郎     2015/10/09(Fri) 17:34返信

タニさん、下のような感じになると思います。

procedure test; { プラグインオブジェクトの中から特定のレコードを持つ図形にアクセスする }
{$ DEBUG}
const
SQ = '''';
RecName = '';
FldName1 = '';{ 検索フィールド }
FldName2 = '';{ 読み書きフィールド }
FldData1 = '';{ 検索値 }
var
criteria :string;
hObj :handle;{ PIO自身のハンドル }
n :integer;
fldData2 :string;

procedure DoObject(h:handle); { 最初の図形のレコードを参照する例 }
var
s :string;
begin
s:= GetRField(h, RecName, FldName1);
if (s = FldData1) & (n = 0) then begin
n:= n + 1;
fldData2:= GetRField(h, RecName, FldName2);
end;
end;{DoObject}

begin{main}
{ ここでプラグイン情報の取得 }
Rect(-10, 10, 10, -10);
begin { このブロックは最初の一回だけ実行 }
n:= 0;
criteria:= Concatp('R IN[', SQ, RecName, SQ, ']');
ForEachObject(DoObject, criteria);
{ ここでレコードを作成 }
SetRField(hObj, RecName, FldName2, fldData2);
end;
end;
Run(test);

レコードの付加や読み書きはPIO生成時にしか実行させたくないので、
スクリプトがそのPIOに対して最初の実行か二回目以降の実行かを判断する必要があると思います。
スクリプトはPIOのパラメーターを変えたり、(オプションで)移動や回転をする度に実行されます。
res.53でPIO描画ツールを別に作ると書いたのは、そうすればPIOに余計な機能を持たさずに済むからです。


57  Re:[56] 1点型オブジェクトでのSelectObj    タニ     2015/10/08(Thu) 21:34返信

与太郎 様

お世話になります。
早速のご返答ありがとうございます。

ご返答いただいた内容が非常に分かりやすく、
やりたいことが概ねできました。

1点だけ教えてください。

検索条件がレコード名のみとなっていますが、
レコードフィールド値も検索条件に含めれないでしょうか。

図面上に複数の図形が存在し、同じレコード名のレコードが連結されています。
同じレコード名に含まれるレコードフィールド値を検索条件にしたいと思っています。

教えて頂いた方法でやってみると、レコード名のみが検索条件となってしまい、
得られる図形のハンドルは常に同じものになってしまいました。

以上、お手数をお掛けいたしますが、
よろしくお願いいたします。


56  Re:[55] 1点型オブジェクトでのSelectObj    与太郎     2015/10/08(Thu) 11:55返信

毎度ありぃ です。

1.
ForEachObjectでは検索条件に一致した図形は全て処理しなくてはいけません。途中で中止出来ないのです。
具体的にはForEachObjectで指定したprocedureを検索条件に一致した全ての図形で実行します。
だから最初の図形だけ処理したい場合はprocedureの入り口で最初の図形かどうかを判断して、
そうでなければ何もしないでprocedureから抜けるようにします。
例ではn=0の場合が最初の図形です。

2.
ForEachObjectで実行されるprocedure(例ではDoObject)に渡されるのが検索条件に一致した図形のハンドルなので、
s:= GetRField(h, RecName, FldName);
のようにします。
レコードフィールドの値は文字列で返ってくるので後で数値や論理値に変換する必要があるかも知れませんが、
他のレコードに書き込むだけならそのままでOK。

3.
レコード名での検索は図形にレコードが付加されているかどうかで検索するので、必要なのはレコード名のみです。


55  Re:[53] 1点型オブジェクトでのSelectObj    タニ     2015/10/08(Thu) 10:36返信

与太郎 様

ご返答ありがとうございます。
ご返答いただいた内容に私の知識不足で理解できない箇所がいくつかあります。


1.下記内容はどのような目的で明記されているのか教えてください。

   if n = 0 then begin
   n:= n + 1;


2.{ ここでレコードを読む }の箇所には具体的にどのように明記すればよいでしょうか。
  私のイメージでは、すでに図面上にあるオブジェクトから検索条件に合致するレコードフィールド値を持つものにハンドル接続し、
  そのオブジェクトの他のレコードフィールド値を取得したいと思っています。

  「GetRField」を利用するとの認識でよろしいでしょうか。
  その際に接続するハンドルは??  すみません。私の知識では理解できていません。


3.'@レコード名'の箇所は「'レコード名'.'レコードフィールド値名'='検索したい値'」を明記すればよいのでしょうか。


以上、お手数をお掛けいたしますが、
よろしくお願いいたします。


54  Re:[48] 書き出したVectorScript    タニ     2015/10/08(Thu) 09:37返信

A級初心者 様

お世話になっております。

教えて頂いた方法をWINDOWSのメモ帳を利用してやってみました。

作業的には、

1.VectoeWorksであらかじめ作成した図形をVectorScriptで書き出す。
2.書き出したデータをメモ帳で開き、{Object Creation Code}部分に明記されている内容をコピーし、メモ帳の別ファイルに貼り付ける。
3.教えて頂いた方法で不要な内容を削除し、コピーする。
4.VectorWorksで作成中のPIOのコマンドに貼り付ける。

以上で不要な内容を手作業で削除するよりかなり効率化されました。

個人的には、書き出したVectorScriptで明記されていた下記が何を意味しているのかを
後日時間があるときに調べてみようと思っています。

objectHandle := LNewObj;
SetObjectVariableBoolean(objectHandle, 1160, FALSE);

今後もよろしくお願いいたします。



> タニさん、ご希望の結果を得られましたか?
>
> こういう場合、あくまでもVectorScriptでやりくりするのと、
> 私が書いたようにVectorWorksの外で何とかするのと、
> どちらが効率的であるかを知りたいので、ぜひ結果を教えてください。


53  Re:1点型オブジェクトでのSelectObj    管理人代筆ー与太郎さん     2015/10/07(Wed) 17:59返信

PIO(プラグインオブジェクト)の中でDSelectAllを実行した場合、その対象は生成中のPIOの中に限られます。
つまりPIO内の、DSelectAllを実行する直前までに作成した図形が選択解除されます。
しかし、可能だとしてもPIOの中から外部の図形の選択状態を変えるのはお勧め出来ません。
PIO生成スクリプトが実行されるのはPIOを描くときだけとは限りませんので。
ですから他の方法で図形のハンドルを取得しましょう。

ForEachObjectを使えば検索条件に合った(PIOの外側の)図形を全て処理出来るので、
最初か最後の図形のレコードを参照すれば良いでしょう。
「最初か最後」と書いたのは、タニさんの指す「最上位」が一番上か最初(First)かが判らないからです。
マニュアルにある「最上位」はFirstの意味で、最上位の図形は最初に描かれた図形なので一番下(最背面)にあります。
以下は指定したレコードを持つ最初(一番下、最背面)の図形のレコードを読む例です。

procedure test; { プラグインオブジェクトの中から特定のレコードを持つ図形にアクセスする }
{$ DEBUG}
const
__SQ = '''';
var
__criteria__:string;
__h__:handle;
__n__:integer;

__procedure DoObject(h:handle); { 最初の図形のみ処理する例 }
__begin
____if n = 0 then begin
______n:= n + 1;
______{ ここでレコードを読む }
____end;
__end;{DoObject}

begin{main}
__Rect(-10, 10, 10, -10);
__n:= 0;
__criteria:= Concatp('R IN[', SQ, '@レコード名', SQ, ']'); {この行の@は削除して下さい。}
__ForEachObject(DoObject, criteria);
__{ ここでレコードを作成 }
end;
Run(test);

この他に、PIO内で処理せずにPIOを描くプラグインツールを別に作って、そこでレコードの読み書きをする方法もあります。

最上位と最下位はA&Aの訳が悪いのが混乱の元なのですが、
メニューとツールとオブジェクトの区別など、ユーザー側でも用語は明確にするように気を付けて混乱を避けましょう。


49  書き込みテストです    管理人     2015/10/07(Wed) 06:53返信

大丈夫?
大丈夫!


48  Re:[46] 書き出したVectorScript    A級初心者     2015/10/05(Mon) 19:54返信

タニさん、ご希望の結果を得られましたか?

こういう場合、あくまでもVectorScriptでやりくりするのと、
私が書いたようにVectorWorksの外で何とかするのと、
どちらが効率的であるかを知りたいので、ぜひ結果を教えてください。


47  1点型オブジェクトでのSelectObj    タニ     2015/10/02(Fri) 17:14返信

お世話になります。
VS初心者です。

プラグインコマンドで1点型オブジェクトを作ろうとしています。

コマンド内で「SelectObj(c : CRITERIA);」を使用し検索条件の
レコード値に合致する図面上のオブジェクトを選択し、そのオブジェクトが複数ある場合は
最上位のオブジェクトにハンドル接続して他のレコード値を取り込もうと思っています。

その際に、「SelectObj(c : CRITERIA);」で選択したオブジェクトを「DSelectAll;」
で選択解除しようとしても解除されません。

いろいろ試してみたのですが、プラグインコマンドを「メニュー」で作成した場合は
「SelectObj(c : CRITERIA);」で選択したオブジェクトを「DSelectAll;」で選択解除できました。

1点型オブジェクトで「SelectObj(c : CRITERIA);」を使用するべきではないのでしょうか。
何か他の対応方法はありますでしょうか。

尚、使用しているソフトはWINOWSの「VectorWorks 2012 Fundamentals」です。


分かりにくい説明で申し訳ございませんが、
ご教示をお願いいたします。


46  Re:[44] 書き出したVectorScript    タニ     2015/09/25(Fri) 10:58返信

A級初心者 様

ご返答ありがとうございます。

テキストエディタにそのような機能があることを知りませんでした。
勉強になります。

今後もよろしくお願いいたします。

> 定型処理ではなさそうですから、余計なことをやりたくない私なら、
> VectorWorksの外で処理することを考えます。
>
> 質問文からは単なるテキスト処理ができれば済むようですから、
> テキストエディタでVectorScriptファイルを開いて、当該部分を
> 一括削除するだけで済みますね。意外と知らない人が多いのですが、
> Wordでもできます。検索文字列に下記を入れ、置換文字列を空欄にして
> 置換すれば、ほぼ瞬時に、あるいは数秒内に処理が終わるでしょう。
>
> objectHandle := LNewObj;^lSetObjectVariableBoolean(objectHandle, 1160, FALSE);
>
> 「 ^l 」は強制改行を示します。
>
> 「1160」という数値が何だか分かりませんが、あちこちで異なる数値になっているなら、
> 検索文字列にワイルドカードを使えばよいでしょう。
>
> DOS時代の知識をお持ちであれば、sed を使えば、半・定型処理化できそうです。


45  Re:[44] 書き出したVectorScript    A級初心者     2015/09/08(Tue) 21:02返信

自己レスですみませんが、最後の一文にミス発見。

> DOS時代の知識をお持ちであれば、sed を使えば、半・定型処理化できそうです。

「DOS時代の知識」→「Unixの知識」
「半・定型処理化」→「半・自動化」

現在のMac OSはUnixベースになっているので、たぶん標準でsedが付いているでしょう。
Windowsでは、sedはDOSの標準コマンドではないので、別途入手する必要があるはずです。


44  Re:[43] 書き出したVectorScript    A級初心者     2015/09/04(Fri) 15:30返信

定型処理ではなさそうですから、余計なことをやりたくない私なら、
VectorWorksの外で処理することを考えます。

質問文からは単なるテキスト処理ができれば済むようですから、
テキストエディタでVectorScriptファイルを開いて、当該部分を
一括削除するだけで済みますね。意外と知らない人が多いのですが、
Wordでもできます。検索文字列に下記を入れ、置換文字列を空欄にして
置換すれば、ほぼ瞬時に、あるいは数秒内に処理が終わるでしょう。

objectHandle := LNewObj;^lSetObjectVariableBoolean(objectHandle, 1160, FALSE);

「 ^l 」は強制改行を示します。

「1160」という数値が何だか分かりませんが、あちこちで異なる数値になっているなら、
検索文字列にワイルドカードを使えばよいでしょう。

DOS時代の知識をお持ちであれば、sed を使えば、半・定型処理化できそうです。


43  書き出したVectorScript    タニ     2015/09/04(Fri) 14:01返信

お世話になります。
VS初心者です。

VectorWorksで作成済みの図形をVSで書き出して、
別のプラグインオブジェクトに使おうと思っています。

書き出した際、各図形のあとに下記が明記されていました。

objectHandle := LNewObj;
SetObjectVariableBoolean(objectHandle, 1160, FALSE);

これがどのような働きをしているのか調べてみてもイマイチよく分かりません。
このまま貼り付けても描画されず、削除すると描画されました。

複雑な図形を書き出した場合、これが各図形のあとに大量に明記されているため、
すべてを削除するには相当な手間がかかります。

削除せずに描画する方法はありますでしょうか。

よろしくお願いいたします。


42  Re:プラグインオブジェクトへのレコード連結    masafumi     2015/09/02(Wed) 18:51返信

与太郎さんお久しぶりです。そして、フォローありがとうございます。m(_ _)m
とてもわかりやすい解説で感心しております。
メーリングリストで教えていただいた時は理解しているつもりでしたが、
今となっては???の連続で、情けないかぎりです。

タニさん、上手くいってよかったですね。こちらこそよろしくお願いします。


41  Re:プラグインオブジェクトへのレコード連結    タニ     2015/09/02(Wed) 18:00返信

masafumi様・与太郎様

ご返答ありがとうございます。

教えて頂いたGetCustomObjectInfo(objectName, objectHand, recordHand, wallHand)で上手くいきました。

VectorScriptエディタの左上にある「手続き/関数」や「VectorScript Reference」で
目的のものを探していたのですが、
なかなか見つけられなかったので助かりました。

今後もよろしくお願いいたします。


40  Re:[37] ワークシートの複製    タニ     2015/09/02(Wed) 17:51返信

A級初心者 様

ご返答ありがとうございます。

教えて頂いた検索方法も取り入れて、
VSの知識向上に励みたいと思います。

今後もよろしくお願いいたします。


> 「VectorScript duplicate worksheet」でGoogleで検索したら、
> トップに出てきましたよ。下にURLを書きます。
>
> レファレンスで使われている英単語をキーワードとして検索すれば、
> わりと簡単に見つかることが多いから、タニさんもそうなさるとよいでしょう。


39  Re:[38] プラグインオブジェクトへのレコード連結    与太郎     2015/09/02(Wed) 14:20返信

こんにちわ。

GetCustomObjectProfileGroupはパス型PIO(プラグインオブジェクト)に使う関数なので今回は関係無いです。

GetCustomObjectInfo(objectName, objectHand, recordHand, wallHand)の内、objectHandがPIO自身のハンドルです。
SetRecord(objectHand, recordName); で生成中のPIOにレコードを連結出来ます。
objectNameは生成中のPIOの名前です。
recordHandはPIOのデフォルトパラメータの役目をする、PIOと同名のレコードのハンドルです。
wallHandはPIOが挿入された壁のハンドルです。


38  Re:[36]プラグインオブジェクトへのレコード連結    masafumi     2015/09/01(Tue) 19:42返信

こんばんはいつも先走って、勘違いをします。
いつもトンチンカンな解答で申し訳ありません。m(_ _)m
トンチンカンついでに

>作成途中のプラグインオブジェクトのハンドルは取得できるのでしょうか。

------------------------------------------------------------------------------------------------
FUNCTION GetCustomObjectInfo (VAR objectName :STRING;
VAR objectHand :HANDLE;
VAR recordHand :HANDLE;
VAR wallHand :HANDLE ) :BOOLEAN ;

プラグインオブジェクトのソースコード内で利用され、そのプラグインオブジェクトの情報を返します。
オブジェクトが壊れている場合にのみ、FALSEを返します
------------------------------------------------------------------------------------------------

FUNCTION GetCustomObjectProfileGroup (objectHand:HANDLE ) :HANDLE ;

ハンドルで指定したプラグインオブジェクトの輪郭図形のハンドルを返します。
------------------------------------------------------------------------------------------------

以前、VSメーリングリストで教えて頂いたのですが、これは使えないでしょうか?・・・
使い方は・・・よくわかりません。m(_ _)m


37  Re:[35] ワークシートの複製    A級初心者     2015/09/01(Tue) 16:56返信

「VectorScript duplicate worksheet」でGoogleで検索したら、
トップに出てきましたよ。下にURLを書きます。

レファレンスで使われている英単語をキーワードとして検索すれば、
わりと簡単に見つかることが多いから、タニさんもそうなさるとよいでしょう。

https://techboard.vectorworks.net/ubbthreads.php?ubb=showflat&Number=181048


36  プラグインオブジェクトへのレコード連結    タニ     2015/09/01(Tue) 11:06返信

お世話になります。
VS初心者です。

VSでプラグインオブジェクト(1点型オブジェクト)を作成し、既存のレコードをVSで連結したいと思っています。

レコードの連結は「PROCEDURE SetRecord(h :HANDLE; record :STRING); 」でよいと思うのですが、
プラグインオブジェクトを作成するコマンド内でプラグインオブジェクトのハンドルを取得する方法が分かりません。

構成する図形であればハンドルを取得できますが、
作成途中のプラグインオブジェクトのハンドルは取得できるのでしょうか。

以上、よろしくお願いいたします。


35  Re:[34] ワークシートの複製    タニ     2015/09/01(Tue) 10:51返信

masafumi様

ご回答ありがとうございます。

私の説明が不十分でした。

レイヤ上に配置されている既存のワークシートを複製ではなく、
リソースブラウザ上の既存ワークシートをリソースブラウザ上へ複製したいと思っています。

解決方法がございましたら、ご教示をお願いいたします。


34  Re:[33]ワークシートの複製    masafumi     2015/08/29(Sat) 21:45返信

こんばんは、タニさん。
試していませんがこれで出来ませんか?

-----------------------------------------------------------------------------------------
PROCEDURE Duplicate ( offsetDX :REAL; offsetDY :REAL ) ;

選択されている図形を複製し、指定した位置に移動させます。
他のレイヤが「表示+スナップ+編集」の場合、他のレイヤ上の選択されている図形も複製される。

-----------------------------------------------------------------------------------------
FUNCTION HDuplicate ( objectHandle :HANDLE; x :REAL; y :REAL ) :HANDLE ;

ハンドルで指定した図形を複製し、指定した距離で動かします。
-----------------------------------------------------------------------------------------


33  ワークシートの複製    タニ     2015/08/28(Fri) 12:20返信

お世話になります。
VS初心者です。

VSをつかって既存のワークシートを複製したいのですが、
複製方法を教えてください。

以上、よろしくお願いいたします。


32  Re:[30] RE:[28-2] 図面上のシンボルを選択するスクリプト    タニ     2015/08/24(Mon) 14:01返信

masafumi 様

ご返答ありがとうございます。

私の質問が説明不足で申し訳ございません。

図面上に配置された複数種類のシンボルのうち、
同一シンボルが同じ位置で重なってしまっている場合に
重なっている最上位のシンボルを選択できないかと考えています。

重なっているシンボル名は都度違ってくるため、
ワークシートを利用したVSで検討してみようと思っています。

「FUNCTION PickObject ( pX :REAL; pY :REAL ) :HANDLE ;」は使えそうです。
アドバイスありがとうございます。

今後もよろしくお願いいたします。


31  Re:[29] 図面上のシンボルを選択するスクリプト    タニ     2015/08/24(Mon) 13:47返信

>A級初心者 様

ご返答ありがとうございます。

ワークシートを利用する方法も合わせて検討してみます。
貴重なご意見ありがとうございます。

今後もよろしくお願いいたします。


30  RE:[28-2] 図面上のシンボルを選択するスクリプト    masafumi     2015/08/23(Sun) 00:55返信

こんばんは、タニさん。
シンボルに関してはやったことが無いのですが、少しテストをして見ました。
シンボル名が 'シンボル-1' の場合に以下のようなスクリプトで上手くいきました。

ご質問のような

PROCEDURE SelectObj( c:CRITERIA ) ;

では上手くいきませんでした。シンボルを全て選択するようです。


{************* シンボル名を指定して選択する **********}
PROCEDURE Example;
VAR
criteria :STRING;
hHandle :Handle;
BEGIN
criteria:='シンボル-1';
DSelectAll;
hHandle:=FObject;
WHILE hHandle <> NIL DO BEGIN
if GetSymName(hHandle)=criteria then SetSelect(hHandle);
hHandle:=NextObj(hHandle);
END;
END;
RUN(Example);
{**************** ここまで **************************}

>また、同一シンボルが同じ場所に重なっている場合、
>最上位のシンボルを選択する方法も教えて頂けないでしょうか。

上記でシンボルを探したときハンドルを変数に保存しておいて

PROCEDURE HCenter ( h :HANDLE; VAR pX :REAL; VAR pY :REAL) ;
PROCEDURE Get3DCntr( h :HANDLE; VAR pX :REAL; VAR pY :REAL; VAR zValue :REAL ) ;
PROCEDURE GetSymLoc ( symHd :HANDLE; VAR pX :REAL; VAR pY :REAL ) ;

等で座標を調べて、同一かを比べ一緒の時はどちらかを削除するとか、または

FUNCTION PickObject ( pX :REAL; pY :REAL ) :HANDLE ;

で同一座標である図形が同一シンボル名かを調べるってな感じですかねぇ。


29  Re:[28] 図面上のシンボルを選択するスクリプト    A級初心者     2015/08/21(Fri) 10:33返信

以下、目的や使用法をお書きになっていないので、私の誤解かもしれませんが、
特定の条件にあったシンボルの選択を、私はワークシートでやっています。

ワークシートでデータベースを使えば、シンボル名や座標を表示できるし、
必要なシンボルを選択することができます。
ひとつのシンボル名だけを検索条件にすることも可能です。

ワークシートで前後関係が表示できるかどうかは知りません。


28  図面上のシンボルを選択するスクリプト    タニ     2015/08/20(Thu) 16:33返信

お世話になります。
VS初心者です。

VSで図面上に複数あるシンボルから条件に合ったシンボルを
選択できるようにしたいと考えています。

「VectorScript Reference」を読むと下記を利用して対応が可能かと思いますが、
イマイチよく分かりません。

PROCEDURE SelectObj( c:CRITERIA ) ;

私のイメージではシンボル名と座標で選択できないかと考えています。
( c:CRITERIA )はどのように明記すればよろしいでしょうか。

また、同一シンボルが同じ場所に重なっている場合、
最上位のシンボルを選択する方法も教えて頂けないでしょうか。

以上、よろしくお願いいたします。


27  win で動くが mac で動作しない場合の原因2    hyodo     2015/06/10(Wed) 11:42返信

先ほどの投稿に補足させていただきます。

レイヤ名を格納する配列は、40までにしてありますが、報告者の図面データのレイヤ数は、17でしたので、配列のオーバーフローではないようです。

また、SetHelpString 関数は非推奨関数ですが、2015より廃止された関数です。

その他の原因が思いつきません。
お分かりの方がいらっしゃいましたらどうぞよろしくお願いします。

http://www.hyodo-arch.com/vectorworks/index.html


26  win で動くが mac で動作しない場合の原因    hyodo     2015/06/10(Wed) 11:29返信

こんにちは、いつも勉強させていただいています。

環境は、win7+2011 と win8.1+12.5 です。

私は下記のスクリプトを使って、連続印刷をしています。
スクリプトを実行すると、自動的にレイヤリストを表示したダイアログが開きます。印刷したいレイヤや登録画面を選択し、部数を入力して連続印刷を行います。(複数のレイヤを選択するときは、Ctrl キーや Shift キーを押しながら選択)

このスクリプトは、ホームページで公開しているのですが、mac+2012 の環境で全く動作しない(エラーも出ず、VWが強制終了する)との報告を受けました。

コンパイルファイルではなく、ソースをコピペしてスクリプトを新規に登録しているとのことです。プロパティやパラメータの設定も特にありません。

原因の分かる方、または mac+2012 でお試し頂ける方がいらっしゃいましたらお願いいたします。


----------------------------- ここから ----------------------------------
PROCEDURE ContinuousPrint;

CONST
dialogTitle ='連続プリント'; {ダイアログタイトル}
compLayerID = 5901; {リストブラウザ(レイヤ)番号}
compViewID = 5902; {リストブラウザ(登録画面)番号}
kOkButton = 1; {OK ボタン}
kCancelButton = 2; {CANCEL ボタン}
kStaticText1 = 8; {編集できないフィールド番号}
kIntField1 = 6; {整数型編集フィールド番号}

VAR
dialogID,result,objNum :LONGINT; {ダイアログ・リストブラウザ番号,最後に押されたボタンの種類(OK=1,Cancel=2)}
staticTextStr1 :STRING; {編集できないフィールドへの文字}
NameOfLayer :ARRAY[0..40] OF STRING; {レイヤ名を格納}
NameOfAuxClass :ARRAY[1..3] OF STRING; {非表示するクラス名を格納}
ii, nn, printNum,
PrintReturnValue :INTEGER; {カウンタ、印刷部数、プリントの返値}
SettingLogAuxClass :ARRAY[1..2] OF INTEGER; {プリント前のセッティングログ格納用}
SettingLog :ARRAY[1..2] OF BOOLEAN; {プリント前のセッティングログ格納用}

{*******************************************************************************
mDaialogCallback モダンダイアログの内部機能を設定
*******************************************************************************}
Procedure mDaialogCallback (VAR key:LONGINT; Value:LONGINT);
VAR
layerH :HANDLE;
theInt :INTEGER;
theBool :BOOLEAN;

BEGIN
CASE key OF
{ダイアログ初期化(ダイアログが開くとき)}
SetupDialogC:
BEGIN
{レイヤ リストアップ}
theInt := InsertLBColumn ( dialogID, compLayerID, 1, 'レイヤ名', 200 );
objNum := 0;
layerH := LLayer;
WHILE layerH <> NIL DO BEGIN
NameOfLayer[objNum]:=GetLName(layerH);
theInt := InsertLBItem ( dialogID, compLayerID, objNum, '' );
theBool := SetLBItemInfo ( dialogID, compLayerID, objNum, 0, NameOfLayer[objNum], 0 );
objNum := objNum +1;
layerH := PrevLayer ( layerH );
END;
theBool:=DeleteLBItem(dialogID, compLayerID, objNum); {図枠レイヤをアイテムから削除}
{登録画面 リストアップ}
theInt := InsertLBColumn ( dialogID, compViewID, 2, '登録画面', 200 );
For ii:=1 To SheetNum Do Begin
theInt := InsertLBItem ( dialogID, compViewID, ii-1, '' ); {リストブラウザのインデックスは0からスタート}
theBool := SetLBItemInfo ( dialogID, compViewID, ii-1, 0, SheetList(ii), 0 );
End;
END;{SetupDialogC END}


{Ok ボタンが押された}
kOkButton:
BEGIN
{白黒表示にする}
IF SettingLog[1]=false THEN SetPref(10,true);
{カラーレイヤを Off にする}
IF SettingLog[2]=true THEN SetPref(11,false);
{レイヤ毎プリント}
For nn:=1 To printNum Do Begin
For ii:=objNum-1 DownTo 0 Do Begin
IF IsLBItemSelected(dialogID, compLayerID, ii) THEN BEGIN
Layer(NameOfLayer[ii]); {レイヤを移動}
PrintReturnValue := PrintWithoutUsingPrintDialog; {ダイアログ無しで印刷}
END;
End;
End;
{登録画面毎プリント}
For nn:=1 To printNum Do Begin
For ii:=SheetNum DownTo 1 Do Begin
IF IsLBItemSelected(dialogID, compViewID, ii-1) THEN BEGIN {リストブラウザのインデックスは0からスタート}
VRestore(SheetList(ii)); {画面登録を移動}
PrintReturnValue := PrintWithoutUsingPrintDialog; {ダイアログ無しで印刷}
END;
End;
End;
{設定を元に戻す}
For ii:=1 To 2 Do Begin
IF SettingLogAuxClass[ii]=0 THEN ShowClass(NameOfAuxClass[ii]);
End;
IF SettingLog[1]=false THEN SetPref(10,false);
IF SettingLog[2]=true THEN SetPref(11,true);
END;{OK ボタン END}


{CANCEL ボタンが押された}
kCancelButton:
BEGIN
{処理内容}
END;


{印刷枚数が入力された}
kIntField1:
BEGIN
IF GetEditInteger(dialogID, kIntField1, printNum) THEN
Begin
If printNum < 1 Then SetEditInteger(dialogID, kIntField1, 1 );
If printNum > 10 Then SetEditInteger(dialogID, kIntField1, 10 );
End;
END;


END;{end CASE}
END;{end callback}

{*******************************************************************************
メインプログラム部
*******************************************************************************}
BEGIN
{印刷部数の初期化}
printNum:=1;

{非表示するクラス名を設定}
NameOfAuxClass[1]:='補助線';
NameOfAuxClass[2]:='補助グリッド';

{プリント前の設定を取る}
For ii:=1 To 2 Do Begin
SettingLogAuxClass[ii]:=GetCVis(NameOfAuxClass[ii]);
End;
SettingLog[1]:=GetPref(10); {Selector=10 -> 白黒表示}
SettingLog[2]:=GetPref(11); {Selector=11 -> カラーレイヤ}

{非表示クラスを印刷されないようにする > しかしなぜかHideClass は最後に実行される}
For ii:=1 To 2 Do Begin
IF NameOfAuxClass[ii]=ActiveClass THEN NameClass('一般');
IF SettingLogAuxClass[ii]=0 THEN HideClass(NameOfAuxClass[ii]);
End;

{モダンブラウザダイアログ}
dialogID := CreateLayout ( dialogTitle, TRUE, 'プリント', 'キャンセル' );
{レイヤ リストブラウザ}
CreateLB ( dialogID, compLayerID, 30, 30 );
SetFirstLayoutItem ( dialogID, compLayerID );
{登録画面 リストブラウザ}
CreateLB ( dialogID, compViewID, 30, 30 );
SetRightItem ( dialogID, compLayerID, compViewID, 2, 0);
{印刷部数テキスト}
staticTextStr1 := '印刷部数:';
CreateStaticText (dialogID, kStaticText1, staticTextStr1,12);
SetBelowItem (dialogID, compLayerID, kStaticText1, 0, 0);
{印刷部数入力フィールド}
CreateEditInteger (dialogID, kIntField1, 1, 16);
SetRightItem (dialogID, kStaticText1, kIntField1, 2, 0);
{マウスオーバーヘルプフィールド}
SetHelpString(compLayerID, '印刷するレイヤを選択してください');
SetHelpString(compViewID, '印刷する登録画面を選択してください');
SetHelpString(kIntField1, '最大部数は 10部まで');
IF VerifyLayout ( dialogID ) THEN
BEGIN
result := RunLayoutDialog ( dialogID, mDaialogCallback );
END;

END;
RUN ( ContinuousPrint );
----------------------------- ここまで ----------------------------------

http://www.hyodo-arch.com/vectorworks/index.html


21  RE:DoMenuTextByNameのJoin Chunk について    masafumi     2015/02/27(Fri) 23:49返信

こんばんは masafumi と言います。

エラー部分ですが、Scriptはメニューセレクタが違っていると言っているように理解しました。
''内は文字列ですから、手当たり次第、思いつくままに 'Join Chunk' の部分を変更して試してみました。
そしてパラメーターも適当に変更しながらやってみました。
どういう訳か解りませんが

DoMenuTextByName('Join Chunk',1);

の部分を

DoMenuTextByName('Join',0);

としたところ、ご希望の「線分を結合」→「結合(直)」の結果になります。
この結果を見ますと、チャンクの意味が解りませんね。


20  DoMenuTextByNameのJoin Chunk について    masanemu     2015/02/27(Fri) 19:19返信

失礼致します。
作成しようと思っているスクリプトの中で、
DoMenuTextByName の Join Chunk『線分の結合→結合(直)』
を使いたかったのですが、エラーが発生してしまい、
どこがおかしいのかわからず彷徨って参りました。

この部分だけ試してみたスクリプトが以下なのですが...

Procedure ClickDeJoin;
Var
_x1,y1,x2,y2:real;
_Line1,Line2:handle;
Begin
_GetPt(x1,y1);
_Line1:=PickObject(x1,y1);
_if GetType(Line1)<>2 then goto 9999;
_GetPt(x2,y2);
_Line2:=PickObject(x2,y2);
_if GetType(Line2)<>2 then goto 9999;
_DSelectAll;
_SetSelect(Line01);
_SetSelect(Line02);
_DoMenuTextByName('Join Chunk',1);
9999:
End;
Run(ClickDeJoin);


上のスクリプトは、コンパイルは成功するのですが、実行するとエラーとなり、
[Error on Line=17:CLICKDEJOIN DOMENUTEXTBYNAME - Menu cannon be found. Join Chunk]
とメッセージが出ます。

仮に'join chunk'の部分を'Group chunk'とすると
ちゃんとグループになるので、この部分が悪いのはわかるのですが、
どう直せばよいのかわかりません。

ご教授いただけないでしょうか。


19  Re:[18] 複数の図形を一括変形するには (ダンプさんのVectorWorks談話室での質問より)    与太郎     2014/11/14(Fri) 09:58返信

超遅レスですが、
GetBBoxで画像の大きさを調べて倍率を決めれば、元の画像サイズがバラバラでも同じサイズに調節出来ると思います。
縮尺や単位が違っても印刷したときに同じ大きさになるようにすることも可能です。


16  Re:[15] レイヤの複製    パキラ     2014/06/14(Sat) 19:50返信

いまお使いのスクリプトを書き込んだら、
添削してもらえるかもしれませんよ。
回答ではなくて申し訳ないですが。


15  レイヤの複製    おっく     2014/06/14(Sat) 08:13返信

こんにちは、初投稿になります。
色々調べたのですがわからなかったので教えて下さい。
表題の通り、vectorscript内で、既存のレイヤの複製をするにはどうすればよいでしょうか?

・いくつかのフォーマットがレイヤ分けされている
・ワークシートの表を読み込み、対応するフォーマットを行の分だけ作成
という動きです。

現状は、フォーマット内の図形を全て選択、新しく作成したレイヤに貼り付け、という動作で何とか動いているのですが、スマートでないのか、動きが非常に重いのです。

もしくは、スクリプトの動作が重くならないコツなどありますか?

よろしくお願いいたします。


14  Re:ver2012でのダウングレード取り出し後に書類を閉じるまでの自動化    masafumi     2014/06/02(Mon) 23:27返信

こんばんは、masafumi と言います。
当方 Ver2011 ですから微妙に違うかもしれませんが。

>これをver2012用に入れてみたのですが使えず。。何をどう変えたら良いのかもわからず

使えずってところが良くわからないのですが・・・。
エラーがでるのか?、2009の取り出しダイアログがでるのか?、何も反応がないのか・・・です。

2009の取り出しダイアログが出てそれを VW12 用に変更したいのでしたら、

>DoMenuTextByName('Export Previous File Version',3);{VW12を取り出す}

この部分を

DoMenuTextByName('Export Previous File Version',1);

のように「3」を「1」に変更してみてください。たぶんこれで行けると思います。


13  ver2012でのダウングレード取り出し後に書類を閉じるまでの自動化    じょじょじょ     2014/06/02(Mon) 12:49返信

下記はver2008のときに設定していたはずのスクリプトです。

やりたいことは大量の図面データのバージョンダウン「取り出し」作業の軽減化です。
取り出し作業をした後に元データを閉じるところまでを自動化させたものです。

DoMenuTextByName('Export Previous File Version',3);{VW12を取り出す}
DoMenuTextByName ( 'Close', 0 );{閉じる}

これをver2012用に入れてみたのですが使えず。。何をどう変えたら良いのかもわからず
教えて頂けると助かります。
(当方はスクリプト設計は素人で以前教えて頂いたスクリプトを使い続けているものです。)

宜しくお願いいたします。


12  Re:[9] 白黒表示切り替え    ふっさ     2013/12/03(Tue) 13:00返信

皆様、色々書き込みありがとうございました。

再度、not、改行を確認しながらやってみます。

ありがとうございました。


11  Re:[9] 白黒表示切り替え    与太郎     2013/12/01(Sun) 07:40返信

何重カッコにしても問題ないと思います。
最後に改行してないからでは?


10  Re:[9] 白黒表示切り替え    A級初心者希望     2013/11/30(Sat) 09:41返信

> SetPref(10, not(GetPref(10)));

下記のURLでは↓↓こう↓↓なってます。

 SetPref(10, NOT GetPref(10));

not の後に 「 ( 」を入れるかどうかで挙動が異なるのでしょうか。

http://www.vectorlab.info/index.php?title=VW_Preferences_Script


9  白黒表示切り替え    ふっさ     2013/11/29(Fri) 15:20返信

お世話になります。
過去の談話室に書かれていた、白黒表示切り替えスクリプトの件で質問があります。

一行スクリプトで「SetPref(10, not(GetPref(10)));」をリソースブラウザで登録して
やってみましたが、エラーメッセージが出てしまいました。
私のやり方がまずいのだと思いますが、どのように設定すればよいのでしょうか。
スクリプト初心者ですが、勉強していきたいと思っております。

よろしくお願いします。


8  Re:[7] 整数型の落し穴    与太郎     2013/11/22(Fri) 16:58返信

> i:= -2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2; とすれば、
> ちゃんと-2147483647にります。

ちゃんと-2147483648にります。が正しいです。


7  整数型の落し穴    与太郎     2013/11/22(Fri) 16:54返信

ご無沙汰してますが、ちょっと気付いたので一筆。

integer型は符号付き16ビット整数で-32768(-2^15)〜+32767(2^15-1)、
longint型は符号付き32ビット整数で-2147483648(-2^31)〜+2147483647(2^31-1)の値を持ちます。
整数型での加減算ではオーバーフローは発生しません。最大値と最小値が隣り合った値になっています。
integer型の場合、32767+1 は32768ではなく-32768になります。
つまり、
for i:= 1 to 32768 do 〜 は無限ループになってしまうことになります。
実際にはループ判定の仕様により、
for i:= 1 to 32767 do 〜 も無限ループになります。
ですから、ループ・カウンタにはinteger型よりもlongint型を使ったほうが良いでしょう。
これはwhile文とrepeat〜until文で条件判定させる場合も同様です。


longint型の最小値は-2147483648ですが、憶えてないし間違えそうだから-2^31と書いたとします。
そしたらあら不思議!
i がlongint型の場合、i:= -2^31; と書くと、i に-2147483647が代入されてしまいます。
i:= -2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2; とすれば、
ちゃんと-2147483647にります。
-2^31の計算結果は実数型なので、問題は実数型からlongint型への自動変換にあるようです。
思った通り、i:= Round(-2^31); とすれば正しく-2147483648が代入されます。
この問題は、integer型でも同様で、i:= -2^15; が-32768ではなく-32767になってしまいます。
今まで配列を最大限とるときも array[-32768..32767]と書いていたので気付きませんでしたが、
今日ループの範囲にlongint型の最小値を設定しようとしたら、こういう症状を発見してしまいました。


6  Re:[5] 文字列の置換    ホーボル     2013/10/27(Sun) 11:40返信

質問文からは、文字メニューにある「文字検索/置換」でできそうだけど、
それとは違うものが必要なのかな?


Page: | 1 | 2 | 3 | 4 |
記事No 削除キー

- LightBoard -