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

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

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

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


25  Re:[24] RE:DoMenuTextByNameのJoin Chunk について    ゴンスケ     2015/03/02(Mon) 11:22返信

masanemuさん、

> お二人のお話を受けて私なりに推測すると、
>結合(R)、結合(T)の場合を2,3にしようという想定があったものの未実装...
> とかそういった感じなのかなぁと思いました。

なるほど!
私は、chunkというもの自体もよく分かっていない初心者ですが、
今回のことで、少し分かった気がします。両masaさんに感謝!

それから、masafumiさん、遠い将来ご隠居なされたとしても、変わらぬご指導を!


24  Re:[21] RE:DoMenuTextByNameのJoin Chunk について    masanemu     2015/03/02(Mon) 09:11返信

masafumi様 ゴンスケ様

ありがとうございます!

> DoMenuTextByName('Join Chunk',1);

> DoMenuTextByName('Join',0);

で無事うまく作動しました。
助かりました。

お二人のお話を受けて私なりに推測すると、
結合(R)、結合(T)の場合を2,3にしようという想定があったものの未実装...
とかそういった感じなのかなぁと思いました。

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


23  Re:[3] RE:DoMenuTextByNameのJoin Chunk について    masafumi     2015/02/28(Sat) 11:26返信

こんにちは、ゴンスケさん。本当にお久しぶりです。
もう、そろそろ隠居しても良い歳になりましたが、なかなか休ませてもらえません。(^_^;)

>ということは、エラーメッセージの内容からしても、
>レファレンスの"Join Chunk"が"Join"の誤記である、ということなのでは?

想像しますと、何世代か前のバージョンではチャンクメニューは無かったのでは無いかと思います。
いつのバージョンか、からチャンクメニューが出来て、VectorScript Appendixも修正したものの
なぜか、VecterScript本体は修正し忘れたのでは無いでしょうか?
そう考えると何となくつじつまが合ってきますね。


22  Re:[21] RE:DoMenuTextByNameのJoin Chunk について    ゴンスケ     2015/02/28(Sat) 10:46返信

masafumiさん、さすがですね! (ご無沙汰してます。お元気ですか?)

masanemuさん、私も学習がてら試してみたところ、masafumiさんの方法で
うまくいきました。ということは、エラーメッセージの内容からしても、
レファレンスの"Join Chunk"が"Join"の誤記である、ということなのでは?


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


18  Re:[17] 複数の図形を一括変形するには (ダンプさんのVectorWorks談話室での質問より)    ゴンスケ     2014/11/13(Thu) 19:51返信

自己レスですみません。
変数を使わないなら、1行でいけるのでしたね。(^_^;)

Scale(0.75,0.75);

前に書き込んだようなスクリプトを作った後で、
ここで与太郎さんに教わったような記憶が、、、。


17  複数の図形を一括変形するには (ダンプさんのVectorWorks談話室での質問より)    ゴンスケ     2014/11/13(Thu) 10:51返信

数年前に、こんなのを作って使っていたことをすっかり忘れてました。
選択した図形を一定の割合で伸縮するVectorScriptです。
下の「75」は「75%」の意味で、これを入れ替えれば好みの割合にできます。
その都度ダイヤログで伸縮率を入力するようにもできるはずですが、
いちいち入力するのが面倒くさいので、私は50%用、25%用など複数作っていました。


Procedure ScaleTo75percent;
VAR x_scalefactor, y_scalefactor:REAL;

BEGIN

x_scalefactor:=0.75;
y_scalefactor:=0.75;

Scale(x_scalefactor,y_scalefactor);


END;
Run(ScaleTo75percent);


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返信

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


5  文字列の置換    mova     2013/10/25(Fri) 19:59返信

皆様、お初にお目にかかります。movaといいます。よろしくお願いいたします。
図からキー文字列を探して置換する事を考えています。
例:キー文字列が 2011 -> 2013 として、
'Vectorworks2011' という文字列を入力したとき'Vectorworks2013'
に変更したいのです。
よろしくお願いいたします。


4  re:才数計算    manabu     2013/08/27(Tue) 20:25返信

石男さん、レコードの利用はやっています。
ケースバイケースですね。

規格ものなどはレコードを利用すればいいと思います。
一点ものなどは、モデリング後に数値をかき集めています。


3  才数計算    石男     2013/08/27(Tue) 19:22返信

manabuさんへ
昔々、わたしも才数計算書を作製したくて色々とやりました...。
それで行き着いた所が、3D図形に定型のレコードを付けるというやり方です。
こうしておけば、レコード付きの図形のハンドルとそのレコードの情報をとる形になるので
多分便利です。単純な3D図形ならGet3DInfoの値も有効だとは思うのですが、そうでない場合
は...、なのでこの方法が良いのではないかと。


2  新装開店・Script談話室    管理人     2013/08/21(Wed) 10:26返信

Script談話室を新しくしました。
これまでの投稿はバックナンバーに追加してあります。

認証キーの数字入力が増えましたので、ちょっとお手数をおかけします。
談話室の荒らし対策なのですが、うまくいって欲しいです。

必須の入力項目は太字、詳しくは「ご利用規程」をご覧下さい。
無謀にも管理人が設置したCGIですので、不都合を発見されましたら、ご一報下さい。
よろしくお願いいたします。


1  スクリプトの公開    manabu(管理人代筆)     2013/08/21(Wed) 10:05返信

スクリプトの書き直しが終了し、公開しました。
参考にどうぞ。

http://qoo.blog.eonet.jp/popc/vw_tool.html


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

- LightBoard -