moooonageさん、私のアイディアも役だったようで良かったです。
このスクリプト、私にも使わせてくださいね!
余計なことを言うと、今後スクリプトを作り溜めていくとすると、
Procedure名を動作内容を想像しやすいものにした方が、便利かと思います。
今回の場合は、StampDateBeforePrint とか。
与太郎さんありがとうございます!
ご指摘の問題に対処するため、
削除→書き直し→サイズ設定→フォント設定
を毎回する仕様に書き換えてみました。
スクリプトは様々な状況を考慮しながら書かなければ
いけないですね。奥が深いです。
以下書き換え後のスクリプトです。
Procedure AssignVals2;
CONST
TextName = 'moooonage-DATE';
VAR
Datetime,FName,Result:STRING;
p1X, p1Y, p2X, p2Y, xmove, ymove, currentscale:REAL;
TextH:handle;
BEGIN
Datetime:=date(2,1);
Fname:=GetFName;
Result:=Concat('[',FName,'] ',Datetime);
TextH:=GetObject(TextName);
DelObject(TextH);
NameObject(TextName);
GetDrawingSizeRect(p1X, p1Y, p2X, p2Y);
currentscale := GetLScale(Actlayer);
xmove := p1x +5mm * currentscale;
ymove := p1y -2mm * currentscale;
TextOrigin(xmove, ymove);
BeginText;
Result
EndText;
TextH:=GetObject(TextName);
SetTextSize(TextH,0,100,8);
SetTextfont(TextH,0,100,16879);
DoMenuTextByName('Print', 0);
END;
Run(AssignVals2);
SetTextで文字を書き替えるように改造した本人が言うのは気が引けるのですが、
印刷時にスタンプがあるレイヤが非表示になっていると、
スタンプは更新されても印刷されないという問題に気付きました。
やっぱり印刷の度に削除して描き直したほうが良かったかも知れません。
与太郎さん、旧石器時代人さんアドバイスありがとうございます!
おかげさまで目的のスクリプトを作る事ができました。
与太郎さんの名前関係のような基礎的なアドバイスは自己流の者としては
とても参考になります。
また、書き換えて頂いたスクリプトはスクリプトが良くなっただけでなく、
とても勉強になりました。ありがとうございます。
旧石器時代さんに書いて頂いたスクリプトを組み込む事で
スクリプトを完成させる事ができました。
また、今回はそれ以前のスタンスからご指導頂きありがとうございます。
まだまだ、つっこみ所などあるとは思いますが、一応完成したスクリプトです。
Procedure AssignVals2;
CONST
TextName = 'moooonage-DATE';
VAR
Datetime,FName,Result:STRING;
p1X, p1Y, p2X, p2Y, xmove, ymove, currentscale:REAL;
TextH:handle;
BEGIN
Datetime:=date(2,1);
Fname:=GetFName;
Result:=Concat('[',FName,'] ',Datetime);
TextH:=GetObject(TextName);
IF TextH = NIL THEN BEGIN
NameObject(TextName);
GetDrawingSizeRect(p1X, p1Y, p2X, p2Y);
currentscale := GetLScale(Actlayer);
xmove := p1x +5mm * currentscale;
ymove := p1y -2mm * currentscale;
TextOrigin(xmove, ymove);
TextSize(8);
BeginText;
Result
EndText;
END
ELSE BEGIN
SetText(TextH, Result);
END;
DoMenuTextByName('Print', 0);
END;
Run(AssignVals2);
moooonageさん、私の書き込みの趣旨をご理解くださり、ありがとうございました。
> 用紙サイズに合わせて、スタンプが角にくるように移動出来れば
私もScript初心者なので、垢抜けないかもしれませんが、下記のような方法を使ってみています。
用紙サイズと縮尺を取得、角からの離れを指定して、テキスト開始位置を設定する方法です。
もっとダイレクトにできる関数があるかもしれないけれど、「動きゃそれでよし主義」なので...。
※下記の変数を使う
p1X, p1Y, p2X, p2Y, xmove, ymove, currentscale:REAL;
※用紙サイズと縮尺を取得して、文字書き込みの位置を決める。
GetDrawingSizeRect(p1X, p1Y, p2X, p2Y);
{p1x,p1yが左上、p2x,p2yが右下}
currentscale := GetLScale(Actlayer);
xmove := p1x +7mm * currentscale;
ymove := p1y -7mm * currentscale;
{これは、p1x,p1yを使っているので、左上角からの離れを指定した状態}
{7 mmが実寸での離れ。位置を変えたいときは、この値を変更する。}
TextOrigin(xmove, ymove);
moooonageさんのスクリプトですが、
文字図形に名前を付けて、描き直す前に削除アイデアはお見事でした。
ただ、このままではどんなフォントやサイズで描き直されるか分かりません。
元の文字のフォントやサイズを調べてもいいのですが、
文字図形の内容を書き換えたほうが簡単なので、そのように直してみました。
Procedure AssignVals2;
CONST
__TextName = 'moooonage-DATE';
VAR
__String1,String2,string3:STRING;
__C:handle;
BEGIN
__String1:=date(1,1);
__String2:=GetFName;
__String3:=Concat(' ファイル名:',string2,String1,'出図');
__C:=GetObject(TextName);
__IF C = NIL THEN BEGIN
____NameObject(TextName);
____TextOrigin(0,100);
____BeginText;
______String3
____EndText;
__END
__ELSE BEGIN
____SetText(C, String3);
__END;
__DoMenuTextByName('Print', 0);
END;
Run(AssignVals2);
いくつかアドバイスするとすれば、
1. 変数名は String1, String2 より DateTime, FNameのような意味がある名前が望ましい。
2. 文字に付ける名前は「DATE」のような一般的な単語は避けるべき。
3. スクリプトで使う名前や値は、できるだけ定数にしましょう。
くらいでしょうか。3つとも名前関係ですね。
名前で図形を特定する関係上、このスクリプトでは1つのファイルに1つのスタンプ
という制約がありますが、コマンドが1つで済むのは良いことです。
旧石器時代人さんありがとうございます。
全くご指摘の通りですね。
過去の書き込みでスクリプト例など書かれている方がいるのを見て、
安易にお願いしてしまいました。
ゼロから作成して頂くのは、ここの趣旨とも違いますね。
そこで、自分なりにスクリプトを書いて見ました。
スクリプトを書くのは初めてで、ヘルプを見ながら格闘したのですが、
なんとかコンパイル出来ました。
後は、用紙サイズに合わせて、スタンプが角にくるように移動出来れば
と思っています。
初心者のスクリプトですので、破綻などないか等含め、
アドバイスを頂ければ光栄です。
Procedure AssignVals2;
VAR String1,String2,string3,string4:STRING;
C:handle;
BEGIN
C:=GetObject('DATE');
DelObject(C);
String1:=date(1,1);
string3:=' ファイル名:';
string4:='出図';
String2:=GetFName;
String1:=Concat(String3,string2,String1,string4);
NameObject('DATE');
TextOrigin(0,100);
BeginText;
String1
EndText;
DoMenuTextByName('Print', 0);
END;
Run(AssignVals2);
下の書き込みが言葉足らずで、非難しているように読めますね。ゴメンナサイ。
誰でもいいからゼロから作ってちょうだい、というのではなくて、
まずは、ご自分で書いてみて、それをここに書き込んで、
アドバイスをもらいながら修正を繰り返すという進め方をとると
良いと思うと言いたかったのですが、そうは読めませんでした。失礼。
※ファイル名や日時を自動的にスタンプする機能を持っているCADもありますよね。
VectorWorksにも標準で搭載してもらえると嬉しいと、moooonageさんの書き込みを
読んで、つくづく思いました。
> もし、お時間がありましたらスクリプト例など作成していただけないでしょうか?
> お手数をお掛けしますがよろしくお願いいたします。
おそらく、このツールで、あなたの業務は改善されるのでしょう。
そうであれば、ボランティアさんに作成依頼するような類のものではなく、
対価を支払って開発してもらうべき筋合いのものだとは思いませんか?
旧石器時代人さん了解しました。
ありがとうございます!
返信が遅くなってしまい申し訳ありません。
与太郎さんありがとうございます!
どのようなスクリプトにすれば良いか概要がわかりました。
これなら意識せず使用出来ますね。
ただ私はスクリプトに対して知識が無く、
具体的にどう形にして良いのかわかりません。
日付スタンプツールを改造しようかとも思ったのですが、
スクリプトがロックされていて見ることが出来ませんでした。
もし、お時間がありましたらスクリプト例など作成していただけないでしょうか?
お手数をお掛けしますがよろしくお願いいたします。
>PDFソフトを使う方法は一度PDFに変換→PDFを印刷
>になるのでしょうか?
少なくともVectorWorksのPDF取り出しではできませんから、
いったんPDFにした後で、PDF編集ソフトでスタンプすることになるでしょう。
あるいは、VectorWorksから直截PDF取り出しを行うのではなく、
プリント時にPDFドライバを選んでプリントするという方法になるでしょう。
いずれにしても、VectorWorksから一発で、という訳にはいきませんね。
スクリプトで印刷時にスタンプを更新するのは、
スタンプを書き替えるスクリプトの最後で「プリント...」コマンドを呼び出せば可能です。
「プリント...」は、DoMenuTextByName('Print', 0);で呼び出します。
スクリプトを「スタンプ更新後プリント...」のようなプラグインメニューにして、
ショートカットキーを「Ctrl+P」や「Command+P」にすれば、
普通のプリントと同じように使えます。
スタンプ自体は、名前やレコードで特定出来るなら、
文字、グループ図形、レコード付きシンボル、プラグインオブジェクトのどれでも構いません。
旧石器時代人さんありがとうございます!
プリンタドライバでスタンプを押す方法も考えたのですが、
職場のプリンターは対応していないようです。
PDFソフトを使う方法は一度PDFに変換→PDFを印刷
になるのでしょうか?できれば通常のプリントと同じ操作で
出来ると良いのですが。
VectorWorksデータに日付の痕跡を残したい場合は、成り立たない方法ですが、
印刷時に自動的にスタンプすることを考えた方が楽なのではないでしょうか?
・プリンタドライバでスタンプを押せるものがあります(メーカーによる)。
・PDF作成・編集ソフトにスタンプを押せるものがあります。
その他、とってもアナログな方法もあるけど、冗談だと思われるかもしれないので、
書くのやめときます。
はじめまして。
家具の設計にVWを使っています。
scriptに関してはまったく知識が無いのですが、
現在の日付、時刻を表示するオブジェクトを作るプラグインを探していて辿り着きました。
試作図面など頻繁に更新される図面に印刷時の出力日時、ファイル名などを自動的に入力したいと思っています。
VWに付いている「日付スタンプツール」が自動更新されるようなイメージです。
ツールの心当たり、作成方法など教えていただければ幸いです。
よろしくお願いいたします。
スクリプトありがとうございます。
しかしやはり、これはちょっと厳しいです。
複製系スクリプトは重宝してます。ありがとうございます^^
最新ヴァージョンはホイール対応とのことで、安心しました。
さまざまなCADソフトがありますが、私はVWを建築設計プラットフォームのメーンCADとして使っていこうと思います。
使ってるヴァージョンが古いので、スピード・効率重視の図面はJwwにするなど、使い分けていく必要があるかもしれないですね。
>最近のヴァージョンではこれに対応しているのでしょうか?
VW12から、ホイールでズーム出来るようになりました。(VW11ではCtrlキーと併用で可)
>もしくは、そのような機能をScriptでつくったりできるでしょうか?^^;
VectorScriptではホイールからのイベントが受け取れないので、無理です。
図形や選択ハンドルが多くなると、速度的にも厳しいと思います。
procedure ZoomTest;
const
__MaxZoom = 1000;{%}
__kZoom = 1.10;
var
__zm, defZm__:real;
begin
__defZm:= GetZoom;
__zm:= defZm;
__while zm < MaxZoom do begin
____SetZoom(zm);
____ReDrawAll;
____zm:= zm * kZoom;
__end;
__while defZm < zm do begin
____SetZoom(zm);
____ReDrawAll;
____zm:= zm / kZoom;
__end;
__SetZoom(defZm);
end;
Run(ZoomTest);
もうひとつ、以前からVector Worksに欲しい機能にJw-CADのようなマウスホイールクリック・スクロールによる画面拡大・縮小があります。これがあるとかなり効率的だと思うのですが…。
最近のヴァージョンではこれに対応しているのでしょうか?
もしくは、そのような機能をScriptでつくったりできるでしょうか?^^;
私のヴァージョンは9.01ですが、^^;
連続オフセットScriptもコンパイルできました!
これで、連続数値入力系統の作業は、かなり効率的になりそうです。
ありがとうございます^^
Vector Script Reference
まだまだわからないことが多いので、読んで理解を深めたいと思います。
HDuplicateはVer.10からの機能なので、それより古いバージョンではエラーになります。
最後のelseブロックを、
____else begin
______SetDSelect(h);
______ReDraw;
______dX:= ofst * Cos(Deg2Rad(ang));
______dY:= ofst * Sin(Deg2Rad(ang));
______h:= HDuplicate(h, dX, dY);
______SetSelect(h);
______ReDraw;
____end;
から、
____else begin
______dX:= ofst * Cos(Deg2Rad(ang));
______dY:= ofst * Sin(Deg2Rad(ang));
______Duplicate(dX, dY);
______ReDraw;
____end;
に変更すれば、Ver.9.5以前のVWでも動くと思います。
参考ながら、私はスクリプトエディタの「関数/手続き...」ではなくて、
もっぱらVWフォルダの中にある「VectorScript Reference」を使っています。
うろ覚えの関数名で検索するには、そちらの方が便利です。
ありがとうございます!
イメージしていた基準線Scriptを作ることができました!
たしかにこの機能はオフセットそのものですね・・・^^;;
しかし、数値を入力するたびにいちいちコマンドを実行していた私にとっては、便利なScriptで、使えそうだと思ってます。
オフセットScriptの方なんですが、
h:= HDuplicate(h, dX, dY);
のラインがどうしてもエラーになってしまいます。
この問題は、スクリプトエディタの関数/手続きを参照してみたところ、
Duplicate(offcetDX,offcetDY:REAL);
や、
HRotate(h,HANDLE,centerX,centerY,rotationAngle:REAL);
などは見つかるんですが、
HDuplicate〜
という関数/手続きが見当たらないのに関連しているのでしょうか?
>最初のマウスクリック以降は、「入力された線=基準」となって連続数値入力していけるスクリプト
とは紛れもないオフセットツールであるという驚愕の事実に気付いてしまいました。
というわけで、以下はオフセットツールのスクリプトです。
procedure Offset_Line;
{ 直線を数値指定で連続オフセットする。 }
const
__LineObj = 2;
__Default = 0;
var
__h, hLoc__:handle;
__x, y, x1, y1, dX, dY__:real;
__ang, ang0, ofst, def__:real;
__cnt__:integer;
__cancel__:boolean;
begin
__h:= nil;
__cnt:= 0;
__while (h = nil) | (GetType(h) <> LineObj) do begin
____if cnt <> 0 then
______SysBeep;
____cnt:= cnt + 1;
____Message('オフセットする線をクリックしてください。');
____GetPt(x, y);
____h:= PickObject(x, y);
__end;{while}
__ClrMessage;
__DSelectAll;
__SetSelect(h);
__ReDrawAll;
__ang0:= HAngle(h);
__GetSegPt1(h, x1, y1);
__
__cnt:= 0;
__ang:= ang0;
__while ang = ang0 do begin
____if cnt <> 0 then
______SysBeep;
____cnt:= cnt + 1;
____Message('オフセットする側をクリックしてください。');
____GetPt(x, y);
____ClrMessage;
____Locus(x, y);
____hLoc:= LNewObj;
____HRotate(hLoc, x1, y1, -ang);
____GetLocPt(hLoc, x, y);
____if y1 < y then
______ang:= ang0 + 90
____else if y < y1 then
______ang:= ang0 - 90;
____DelObject(hLoc);
__end;{while}
__ClrMessage;
__
__def:= Default;
__cancel:= false;
__while not cancel do begin
____ofst:= RealDialog('オフセット距離 = ', Concat(ofst));
____if DidCancel then begin
______cancel:= true;
____end
____else begin
______SetDSelect(h);
______ReDraw;
______dX:= ofst * Cos(Deg2Rad(ang));
______dY:= ofst * Sin(Deg2Rad(ang));
______h:= HDuplicate(h, dX, dY);
______SetSelect(h);
______ReDraw;
____end;
__end;{while}
end;
Run(Offset_Line);
ご希望のスクリプトは下のようになります。
procedure BaseLine_Y;
{ 相対距離入力で水平な基準線を描く }
const
__BaseLineClass = 'my基準線';
var
__dY, x0, y0, x1, y1, x2, y2, lastY__:real;
__cancel__:boolean;
__cnt__:integer;
begin
__PushAttrs;
__Message('基準点をクリックしてください。');
__GetPt(x0, y0);
__ClrMessage;
__GetDrawingSizeRect(x1, y1, x2, y2);
__lastY:= y0;
__dY:= 0;
__cnt:= 0;
__cancel:= false;
__while not cancel do begin
____cnt:= cnt + 1;
____if cnt = 1 then
______dY:= RealDialog('基準点からのオフセット(dY) = ', Concat(dY))
____else
______dY:= RealDialog('最後の線からのオフセット(dY) = ', Concat(dY));
____if DidCancel then begin
______cancel:= true;
____end
____else begin
______NameClass(BaseLineClass);
______LSByClass;
______LWByClass;
______MarkerByClass;
______PenColorByClass;
______lastY:= lastY + dY;
______MoveTo(x1, lastY);
______LineTo(x2, lastY);
______ReDraw;
____end;
__end;{while}
__PopAttrs;
end;
Run(BaseLine_Y);
与太郎さま、いつもご親切にありがとうございます。
前回の書き込みがあいまいで申し訳ありませんでした。
現在のスクリプトでは、最初の基準点をマウスクリックで行い、そこを基準に、その後に入力する全ての線も打ち込まれていきます。
これでも、十分、複製コマンドよりも私にとっては便利なものですが、
以前の書き込みの意味では、最初の基準点を用紙内に自由にマウスクリックで決め、1本目の線を入力する。2本目は、1本目が基準となって入力される。3本目は2本目が…
というように、最初のマウスクリック以降は、「入力された線=基準」となって連続数値入力していけるスクリプトにしたいと思っているのです。
わかりづらいかもしれませんが…^^;
現時点で、
GetPt(x0,y0);
が組み込まれ、マウスクリック座標を指示できるようになり、
MoveTo(x1,y+y0);
LineTo(x2,y+y0);
として、+y0でクリック座標を基準に置き、数値入力yを足して
線を引くというScriptを提示して頂いたと解釈しています。
これに、2本目以降は'入力された線=現在選択されている図形'に
MoveToし、そこが基準になる、というScriptを足せば、可能な気がするのですが…。
お時間ありましたら、またアドバイスお願いします。
>GetPtを書き込んだりしているのですが、ただ単純にマウスクリックしたポイントに線を引くだけになってしまう…^^;
変数の使い方か「GetPt();」を書く場所が間違ってるような気がします。
あと、
>マウスクリックしたポイントを基準にして線をひきたい
と、
>その都度、引いた線を基準にして、連続数値入力で引いていけるような
が矛盾していますが、前の方が正しいものとして前回のスクリプトを修正してみました。
procedure BaseLine_Y;
const
__BaseLineClass = 'my基準線';
var
__y, x0, y0, x1, y1, x2, y2, lastY__:real;
__cancel__:boolean;
begin
__PushAttrs;
__Message('基準点をクリックしてください。');
__GetPt(x0, y0);
__ClrMessage;
__GetDrawingSizeRect(x1, y1, x2, y2);
__lastY:= 0;
__cancel:= false;
__while not cancel do begin
____y:= RealDialog('基準線(Y) = ', Concat(lastY));
____if DidCancel then begin
______cancel:= true;
____end
____else begin
______NameClass(BaseLineClass);
______LSByClass;
______LWByClass;
______MarkerByClass;
______PenColorByClass;
______MoveTo(x1, y + y0);
______LineTo(x2, y + y0);
______ReDraw;
______lastY:= y;
____end;
__end;{while}
__PopAttrs;
end;
Run(BaseLine_Y);
ありがとうございます。
座標原点を基準にした連続数値入力をX,Y軸それぞれできるようになりました!
さらに、マウスクリックしたポイントを基準にして線をひきたいと思い、GetPtを書き込んだりしているのですが、ただ単純にマウスクリックしたポイントに線を引くだけになってしまう…^^;
できれば、マウスクリックしたポイントから、その都度、引いた線を基準にして、連続数値入力で引いていけるような基準線Scriptが作りたいので、アドバイスよろしくお願いします。
下のようにすれば、キャンセルボタンを押すまで終了しません。
procedure BaseLine_Y;
const
__BaseLineClass = 'my基準線';
var
__y, x1, y1, x2, y2__:real;
__cancel__:boolean;
begin
__PushAttrs;
__GetDrawingSizeRect(x1, y1, x2, y2);
__cancel:= false;
__while not cancel do begin
____y:= RealDialog('基準線(Y) = ', '0.0');
____if DidCancel then begin
______cancel:= true;
____end
____else begin
______NameClass(BaseLineClass);
______LSByClass;
______LWByClass;
______MarkerByClass;
______PenColorByClass;
______MoveTo(x1, y);
______LineTo(x2, y);
______ReDraw;
____end;
__end;{while}
__PopAttrs;
end;
Run(BaseLine_Y);
与太郎さん、ご指導ありがとうございました。
とりあえず、Y軸ラインとX軸ラインをScriptにできました^^;
これをX、Yの数値をそれぞれ連続で打ちこめて、一発で配列できたらもっと便利なんですが…。そういうScriptは可能でしょうか?
今日はじめてScriptに取り組んだんですが、バックナンバーで参考になりそうなものをいろいろ拝見させて頂きました。ありがとうございました。^^
とりあえず、範囲は用紙内だけ、属性はクラス設定を使用ということで...
procedure BaseLine_Y;
const
__BaseLineClass = 'my基準線';
var
__y, x1, y1, x2, y2__:real;
begin
__PushAttrs;
__y:= RealDialog('基準線(Y) = ', '0.0');
__if not DidCancel then
__begin
____GetDrawingSizeRect(x1, y1, x2, y2);
____NameClass(BaseLineClass);
____LSByClass;
____LWByClass;
____MarkerByClass;
____PenColorByClass;
____MoveTo(x1, y);
____LineTo(x2, y);
__end;
__PopAttrs;
end;
Run(BaseLine_Y);
与太郎さん、ありがとうございます^^。
できれば RealDialog()で線を描くScriptを教えて頂ければうれしいです。
PROCEDURE prog15;
VAR
x,y: INTEGER;
scale: REAL;
BEGIN
scale := 10;
FOR x := 0 TO 10 DO
BEGIN
MoveTo(x*scale,0);
LineTo(x*scale,10*scale);
END;
FOR y:=0 TO 10 DO
BEGIN
MoveTo(0,y*scale);
LineTo(10*scale,y*scale);
END;
END;
RUN (prog15);
これによると
線の長さは、Line To()で指定するようです。
このScriptで、等間隔のグラフは描けるので、このようなものをベースにしてRealDialog()と組み合わせることで、基準線数値入力Scriptがつくれないか…と思っているんですがどうでしょうか?
与太郎さま
ご回答ありごとうございます。
作者に聞いてみます。
RealDialog()かDistDialog()で座標値を入力して、垂直や水平に直線を描くことは出来ます。
ただし、VWには長さが無限の直線はないので、線を何処から何処まで引くかという問題があります。
一旦ロックしたScriptは(ロックした本人でも)解除出来ないので、
改造は(ソースを持っているはずの)作者と相談の上、ということになります。
初めましてこんにちは。
私は最近、設計作業のスピードアップ、効率化を図りたいと思い、Vector Scriptに注目して勉強し始めています。
今のところ使えそうなScriptをコピペしてコマンドを増やしたいと思っています。
まずはVectorには、基準線をX軸・Y軸で数値入力する機能がないので、Scriptで作れればと思っているのですが、ご存知の方がいらっしゃったらアドバイスお願い致します。
はじめまして。
他の人からいただいたScriptを編集したいのですが
ロックがかかっていて編集できません
ロックを解除する方法はあるのでしょうか?
宜しくお願いします
>回転ができ全体が伸びたり縮んだりできるような
端部を気にしないのなら3Dパス図形で作るのが一番簡単です。
Scriptを書く場合は、最初は回転しない状態で作って、後から回転させることになります。
そのようなScriptを書きたいということですか?
おしえて下さい。
3Dでマジックハンドのように伸縮する構造体で支点部分が回転のみ可能な拘束を掛けたいのですが、方法はありますか?全体の長さが伸びたり縮んだりできるように。
おしえて下さい。
3Dでマジックハンドのような構造で、支点が拘束され、回転ができ全体が伸びたり縮んだりできるような支点拘束の方法はあるのでしょうか?
書き込むべき談話室を間違えています。
過去の書き込みを見れば、どこに書き込むべきか分かるでしょうから、
正しい談話室に書き込んでください。
みなさん
こんばんわ。
新しく購入した、ノートPCにベクターワークス10をインスト
したのですが、ランタイムエラーとなります。
4年前に購入したデスクトップPCのXPには、普通にインストして
普通に起動して使えるのですが、今年購入したXP・ホームエディション
には、インストはできないのでしょうか?
教えてください。
よろしく、お願いいたします。
お騒がせいたしました。32KBの制限は勘違いでした・・・
もうしわけありません。
分担開発している、膨大なソースになっており、
個々のソースは問題ありませんでしたが、
ひとつのソースとしてあわせた際にバグが発生していただけ
のことのようです・・・
ファイル容量が偶然にも32KBだったので、早とちりでした。
バグを取り除いたところ、32KB超えでもまったく問題
ありませんでした。
大変お恥ずかしい・・・^^;失礼いたしました。
補足いたします。
32KBの制限があると思える事象ですが、
ある行数を越えると、コンパイルで意味不明のエラーがでるようになります。
部分部分ごとに、ソースを抜き出してコンパイルすると、
エラーはなくなります。
Plug-Insフォルダの 「.vsm」ファイルをみてみると、ちょうど32KBとなっていますが、
外部エディタで保存した、同じソースのテキストファイルは、40KBとなっています。
これらのことから、32KBの制限があるのかと思っております。
http://www.aanda.co.jp/VIPRoom/vstechnote/
こちらに、リソースブラウザより開くScriptエディタは、32KB制限があるが、
プラグインメニューより開くエディタは、制限がないということが書いてあります。
しかし、私の環境では、32KBの制限が、プラグインの方にもあるような挙動です。
しかも、32KBは、インクルードするファイルまで含めて、32KBのようです・・・
外部ファイルにしても解決せず、こまっております。
32KB制限について、解決策はありますでしょうか?
環境;
Windows2000
QuickTime7.1
VectorWorks11.5
残念ですが、スクリプトでワークシートに書き込むしかないと思います。
はじめまして。GUNといいます。
現在、VectorWorks12.0を使っているのですが、3D空間上に3D多角形で任意にひかれた、角度、長さともに不明な線分の両端のベクトルを抽出したいと思っています。
スクリプト関数を用いれば抽出可能です。しかし、これをワークシートを用いて行いたいのですが、何か方法をご存知の方いらっしゃいませんか?(x座標とy座標の関数は確認済です)簡単に言うとz座標をワークシートを使って返す方法です。
もしくは、スクリプト関数をワークシートに適用は可能でしょうか?
与太郎さん 名回答をいただきながら
15時過ぎに もやもやとしたままで下記の様なものを送ってしまいました。
もやもの中に射した一点の光の様に スッキリしました。
幾何の時の補助線的なものの考え方かなと 勉強になります。
又ヒントをいただくかもしれません.宜しくお願い致します。
有り難うございました。
報告して早々ですが
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図形のハンドルを取得しようとしてみたりしたのですが
これも上手くいきません。
選択した図形群をグループ化し、
そのグループ内の図形のハンドルは どの様にして取得していけば良いのでしょうか
お教えください。
選択した図形群をグループ化していく と云うところから考え直さないといけないのでしょうか
宜しくお願い致します。
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);
グループに入って最初に基準点を描くと、この基準点は一番上(前面)になります。
変換された図形は基準点の上に生成されるので、ハンドルが基準点と一致した時点で
ループを終了すれば、変換した図形はループ処理の対象にはなりません。
選択図形をグループ化すると他のレイヤの図形もアクティブレイヤに移動するので、
(スクリプトを書くのも使うのも)その辺を理解しておく必要があります。
与太郎さんよりヒントをいただき 今日一日色々やっていく中で
(今回の場合)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);
与太郎さん 詳しい説明有り難うございます。
お話に在る様に <適所にReDrawAll;を入れると......>でデバック中の状況を見ながら
どのように変換されるのかなど勉強したいと思います。
有り難うございました。
ヒントです。
DoMenuTextByName('Convert to Polygons',0); を実行した時点でhdが指していた図形
(柱状体)は消えてしまいます。
参照先のないハンドルのNextObjは、本来ならどんな結果が返っても不思議ないのですが、
VWの中の人は親切にもNilを返してくれることに決めたようです。
出来ればもう少しがんばって警告エラーを出してほしいところですが。
DoMenuTextByName('Convert to Polygons',0); で変換された図形は一番前面に生成さ
れるので、これらもループの対象になります。
今回のケースでは悪影響はありませんが、このスクリプトを流用して別の処理を行なった
場合は無限ループになる可能性があります。
適所にReDrawAll;を入れると、デバッグ中の実行状況(図形の選択等)を確認できます。
柱状体が重なるようにして実行すれば、変換された図形が前面になるのを観察できます。
繰り返し文と<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);
>これってこういう仕様なんでしょうか・・?
>バグでは?と思ってしまいますが^^;
Mac版では起きないのでWin版VW11.5のバグです。
Winの他のバージョンでどうなのか気になりますね。
>そちらにも、この情報を投稿させていただいて
>よろしいでしょうか?
どうぞどうぞ。
与太郎さま
わざわざ調べてくださってありがとうございます。
> 100ptで文字を描いて、そのサイズをGetTextSizeで
> 調べればプリント倍率は判ります。
なるほど、その手がありますね!
利用させていただきます^^
これってこういう仕様なんでしょうか・・?
バグでは?と思ってしまいますが^^;
実は、私、mixiのVectorScriptのコミュの
管理人をさせていただいています。
そちらにも、この情報を投稿させていただいて
よろしいでしょうか?
ぜひ与太郎さまのアイデアを投稿したいと
思うのですが・・・
不都合ありましたら、ご指摘ください。
その現象は初めて知りました。なんともおせっかいな仕様ですね。
VW11.5/Winで調べたところ、
TextSize ・・・・・・・・・・プリント倍率は無視、
GetDefaultTextSize ・・・・・プリント倍率は無視、
SetTextSize ・・・・・・・・ プリント倍率は無視、
GetTextSize ・・・・・・・・ プリント倍率により変わる、
みたいなので、
100ptで文字を描いて、そのサイズをGetTextSizeで調べればプリント倍率は判ります。
GetTextSizeで返った値をプリント倍率で割れば本来の文字サイズが得られます。
はじめまして。よろしくお願いいたします。
VectorWorks11.5を、Windows2000で使用しております。
「GetTextSize」でフォントサイズを取得する時の返値についてです。
通常は、文字サイズをptの単位で取得できますが、
用紙設定で「VectorWorks」という項目の「倍率」を設定していると、
その倍率をかけたサイズで、返値がもどるようです。
この倍率に関係なく、データパレットで表示されるのと同じフォントサイズを
取得する方法はございますでしょうか?
VectorScriptでのDXF設定値の参照・変更は、GetPref???, SetPref???で行ないます。
「VectorScript Function Reference」の「Additional Resources 付録」−「VectorScript Appendix」−
「Appendix F - Preference Selectors」−「DXF」に設定セレクタの番号があります。
それから、去年のバックナンバーにAppleScriptについての書き込みがあります。
アドバイスありがとうございます。
少し、補足です。
dwgデータをepsデータにするのが最終目標です。
(レイヤーを別々に〜)は考えておりません。
vectorscriptメッセージに表示させたかった理由は正しく値を返されているか
確認したかったからです。(リファレンスか何かでこのようなmessageの使い方をみたような気がします。)
>取り出し系メニューコマンドをDoMenuTextByNameで実行しても、VectorScriptではダイア
ログでのファイル名入力や「保存」ボタンなどを押すことが出来ません。
確かに、どうしてよいかわかりませんでした。出来ないんですね…。
とりあえす、strdialog(レイヤー名)で表示→コピー→eps取り出し→ファイル名入力時にペースト
としました。(自動にはほど遠いですが、少しマシになりました。)
もう1つ、レイヤー名にこだわったのは、dwgデータを取り込み時に”レイヤーをクラスに変換”にチェックを
入れると、デフォルトのレイヤー1のほかにファイル名のレイヤーが作られているのがわかったためです。
また取り込みを使用するとファイル名が”名称未設定”となったいたためこれではNGなためです。
つまり、dwgのファイル名でeps保存したかったのです。(あとだしのようになってしまってスミマセン。)
>Macの場合、AppleScriptでメニューコマンドの実行やダイアログのキー入力等が可能ですが、
これは、取り込み、取り出し時のチェック(縮尺、レイヤーをクラスに変換等の指定)がapplescriptで
出来るということですか?
xcodeも今勉強中です。もしそうなら、希望がもてそうです。
>(今回のレイヤー名で保存)
やってみればすぐ判りますが、
取り出し系メニューコマンドをDoMenuTextByNameで実行しても、VectorScriptではダイア
ログでのファイル名入力や「保存」ボタンなどを押すことが出来ません。
ですから、「ファイルの全てのレイヤを別々にEPSに書き出す」ような作業はVectorScript
では無理だと思います。
Macの場合、AppleScriptでメニューコマンドの実行やダイアログのキー入力等が可能ですが、
レイヤ名をAppleScriptに渡すのがちょっと面倒です。
与太郎様
ありがとうございました。
試したところうまく行きました。
Message(GetLName(レイヤハンドル));のような使い方ができるとは
考えてもいなかったです。もう少しマニュアル等と格闘してみます…。
間にいろいろあるのですが、最終的には”domenu〜”を使用してeps保存(今回のレイヤー名で保存)
するscriptにしたいと思っております。
また、詰まってしまった時、知恵をお貸しください。
ありがとうございました。
ハンドル型変数にはオブジェクトデータの場所(多分メモリアドレス)が入っています。
ですからMessage(レイヤハンドル);では数字が表示されます。
レイヤ名を表示するときはMessage(GetLName(レイヤハンドル));としてください。
はじめまして。
最近、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);を使用してみましたが、この時は、空欄でした。
ご指導宜しくお願いします。
解りました.有り難うございました。
ネット上で見つけた皆さんが作られたものなどを手本に
Scriptを並べる事で 何となく機能しているようで
なぜ動くのかの部分を理解していない事に気付きました。
もう一度マニュアルを読み返そうと思います。
有り難うございました。
いえ、もちろん同じファイルならWSサイズが変わるはずはありません。
たぶん御友人のVWは環境設定でScriptエラーを出さないようにしているのでしょう。
そうすると、文字列の範囲外へのアクセス・エラーなども出なくなります。
しかし、エラーが出なくてもスクリプトにバグがあるのは明らかです。
スクリプト作成中はScriptエラーが出るように設定しておいたほうが良いでしょう。
いつもいつも早速の回答有り難うございます。
これから色々トライしてみます。
一つお教え戴きたいのですが
>WSの行列の大きさが違っているからでは?
と 言われておりますが
iBookからiMacにデータを持ってきてみただけでも
<行列の大きさ>は変わってしまうのですか?
解ってないもので愚問かもしれませんが
宜しくお願い致します。
WSの範囲外のセルにアクセスしたという警告ですから、まあそういうことでしょう。
片方でしかエラーが出ないのは、WSの行列の大きさが違っているからでは?
与太郎さん、石男さん 有り難うございます。
新たな問題。
いつもはiMac-OS10.4VW12.5を使っています。
図形の面積を拾い出し、WorkSheetに書出すと云うScriptを作っていたのですが
途中から友人のiBook-OS10.3.9を使う事となり そこで完成しました。
ですが
持ち帰りiMacで動かすと
<Attempt to access a cell outside the worksheet bounds.>
と云うエラーが出ます。でも 計算もちゃんと出ます。
どうしてなのか解りません。
お教えください.宜しくお願いします。
><VectorScript Reference>の個々の使い方を...
結局のところ、トライ&エラーで試してみる以外はないです。英語が分かれば、ご本家の
メーリングリストが一番間違いなく答えをいただけます。
新しいことは、ここでしか分からないかもしれません、自分の経験上では。
がんばってみてください。
またまた 色々と勉強材料を戴き有り難うございます。
英語が苦手なのですが、時間が掛かってもトライしたいと思います。
ところで<VectorScript Reference>の個々の使い方を どのように勉強なさっているのですか?
以前は本も出ていたとか、古本をあたっても入手できません。
なんとかMiniCAD7の ミニパスカルマニュアルを手に入れたのですが
これに無いものの使い方の例を 知りたいことの方が多いのです。
マニュアルの内容を詳しく知りたい事が多く
やはりScript相談室等のネットで勉強するとか
試行錯誤で使い方を見つけだす
という方法なのでしょうか
「特定イベント」については私もあまり経験ありませんので、
「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」、
を御覧下さい。
多くのご提案有り難うございます。
プラグインオブジェクトをレンダリングした状態で 色を見つつ変更していきたいと考えていましたので
<4>の方法が一番近いのかと思っておりますが
<3>までの方法は出来たのですが、この<「特定イベント」でモダンダイアログを開き>とは
どのように行うのか、図々しいのですがお教えください。
宜しくお願い致します。
プラグインオブジェクト内の特定の図形の色を変えたいなら、
1. 整数型パラメータで色番号(カラーインデックス番号)を指定する、
2. ポップアップ型パラメータで色の名前を指定する(名前→色の変換は自己責任)、
3. ポップアップ型パラメータで図形のクラスを指定して、色はクラス属性で変更する、
4. 「特定イベント」でモダンダイアログを開き、カラーパレットで色番号を指定する、
など色々なやりかたがあります。
有り難うございます。
質問が不明瞭な点が在ったようで済みません。
勉強中でしたので単体のオブジェクトでしたが
いくつかのオブジェクトで構成されたオブジェクトの一部のものだけの色を
変更するのに、データパレットから数値入力に依り操作できるのではと思ったのです。
マニュアルを読んでみます。
又質問させていただくかもしれません.有り難うございました。
プラグインツールとプラグインオブジェクトは全く別のものです。
プラグインツールのスクリプトがグループ図形を描くようになっていれば、当然グループ図形が生成されます。
プラグインオブジェクトを描くには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の値を決定できます。
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);
与太郎さん 早々の返答有り難うございました。
友人の中には Ver.11だったりのものもいますので勉強てみます。
3Dオブジェクトをパラメーターで色コントロールできればと
考えてのトライでした。
有り難うございました。
VectorScriptコマンドは、3種類のVectorScriptプラグイン(Menu, Tool, Object)の内、
Menuプラウインに当たります。
Menuプラグインは、基本的にはファイル全体や選択図形を対象としてスクリプトを実行します。
Toolプラグインのスクリプトは、マウスクリック/ドラッグで操作対象や座標を指定します。
最初に描画領域内をクリックかドラッグすると、それがトリガーとなってスクリプトが実行されます。
ですからスクリプトの最初のほうでGetPt,かGetPtLによる座標取得が必要です。
「スクリプトの中でカラーパレットを使う」ですが、
VW12以降ではモダンダイアログでカラーパレットが使えるみたいです。
モダンダイアログは面倒ですが、文字属性などもポップアップで設定出来るなど、ヴァージョンアップ
の度に機能が追加されていて、開発元も力を入れているようです。
初めてお便りします。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);
nudgeさま:
ありがとうございます。これで他のレイヤを編集状態にしていようが、選択したい文字列がある範囲を
セレクションポインタで大雑把に選択してから安心して作業できます。
これを参考に、他のオブジェクトや画面に表示された範囲などの条件をトライしてみます。
(図面が適判にまわってから…)
私の頭はcore Soloで回路はシングルタスクですので同時に2件の申請作業など絶対に不可能ですが、
これが仕事なんだと思って頑張ります。ありがとうございました。
選択しているものに限るは
DSelectObj(((T<>Text) & (SEL=TRUE)));
で良いと思います。選択しているオブジェクトから
文字列以外を選択解除するという手順です。
見えているものというのは、画面に表示された範囲と
いうことでしょうか。そうであると私の手には負えません。
他の方のレスを待ってください。
お急ぎのようですので、取り敢えず解るところから。
私も明日2件の申請があります・・・・汗。
お互いがんばりましょう。
はじめまして。
文字列の選択スクリプトを
DSelectAll; SelectObj((T=Text) & (V));
として使い続けて来たものですが、これだと全ての文字列が選択されてしまいます。
「いま見えているものに限る」または「選択しているものに限る」という意味を付け加えるには、
どのようなスクリプトが必要でしょうか。マニュアルをみて試して見ているのですが、
どうもうまくいきません。バージョンは12.5です。
非常に基礎的なことだとは思いますが、どうぞよろしくお願いします。
上記のスクリプトを焦っているときに使って、条文をあげて根拠を必死に説明している文字列を全て
消してしまい、気付くまでの数秒の間に自動上書き保存されてしまったので、本日の業務は終了です(大泣)
ありがとうございます!v12を入手して、ヘルプを見てみようと思います。今後ともよろしくお願いします!
nomuさん、はじめまして。
オフセットツールのパラメータは、スクリプトでは設定出来ないみたいです。
MacでOSXな環境ならAppleScriptで「i」、「100」などのキー入力をすることは可能ですが、
いまいち使いにくそうです。
直線や円弧が対象なら、専用のスクリプトコマンドを書くのは比較的簡単です。
VWヘルプのVectorScript Gudeは御覧になりましたか?
VW12では日本語に訳されているので、デモ版を入手してでも一読されることをお勧めします。
VectorScriptでどんな事が可能かイメージがつかめると思います。
製品版でしたら、VectorWorksフォルダの中にもサンプルなどがあります。
関連サイトについてはMiniPascal、VectorScript等で検索してください。
ここの掲示板のバックナンバーも参考になるでしょう。
いつもお世話になります。オフセットを100や200など、そのたびに数値入力をする手間を省くようなスクリプトをご存知の方いらっしゃいませんか?コマンドパレットのなかに「オフセット100」「オフセット200」など設定しておければなぁと思っているのですが…。よろしくお願いします。また、初心者向けのスクリプト参考本(サイトなど)もあわせて教えていただければ幸いです。
お世話になりました。
来年もよろしくお願いいたします。
今年の書き込みは、バックナンバーに移動しました。
書き込むべき談話室を間違えています。
過去の書き込みを見れば、どこに書き込むべきか分かるでしょうから、
正しい談話室に書き込んでください。
みなさん
こんばんわ。
新しく購入した、ノートPCにベクターワークス10をインスト
したのですが、ランタイムエラーとなります。
4年前に購入したデスクトップPCのXPには、普通にインストして
普通に起動して使えるのですが、今年購入したXP・ホームエディション
には、インストはできないのでしょうか?
教えてください。
よろしく、お願いいたします。
お騒がせいたしました。32KBの制限は勘違いでした・・・
もうしわけありません。
分担開発している、膨大なソースになっており、
個々のソースは問題ありませんでしたが、
ひとつのソースとしてあわせた際にバグが発生していただけ
のことのようです・・・
ファイル容量が偶然にも32KBだったので、早とちりでした。
バグを取り除いたところ、32KB超えでもまったく問題
ありませんでした。
大変お恥ずかしい・・・^^;失礼いたしました。
補足いたします。
32KBの制限があると思える事象ですが、
ある行数を越えると、コンパイルで意味不明のエラーがでるようになります。
部分部分ごとに、ソースを抜き出してコンパイルすると、
エラーはなくなります。
Plug-Insフォルダの 「.vsm」ファイルをみてみると、ちょうど32KBとなっていますが、
外部エディタで保存した、同じソースのテキストファイルは、40KBとなっています。
これらのことから、32KBの制限があるのかと思っております。
http://www.aanda.co.jp/VIPRoom/vstechnote/
こちらに、リソースブラウザより開くScriptエディタは、32KB制限があるが、
プラグインメニューより開くエディタは、制限がないということが書いてあります。
しかし、私の環境では、32KBの制限が、プラグインの方にもあるような挙動です。
しかも、32KBは、インクルードするファイルまで含めて、32KBのようです・・・
外部ファイルにしても解決せず、こまっております。
32KB制限について、解決策はありますでしょうか?
環境;
Windows2000
QuickTime7.1
VectorWorks11.5
残念ですが、スクリプトでワークシートに書き込むしかないと思います。
はじめまして。GUNといいます。
現在、VectorWorks12.0を使っているのですが、3D空間上に3D多角形で任意にひかれた、角度、長さともに不明な線分の両端のベクトルを抽出したいと思っています。
スクリプト関数を用いれば抽出可能です。しかし、これをワークシートを用いて行いたいのですが、何か方法をご存知の方いらっしゃいませんか?(x座標とy座標の関数は確認済です)簡単に言うとz座標をワークシートを使って返す方法です。
もしくは、スクリプト関数をワークシートに適用は可能でしょうか?
与太郎さん 名回答をいただきながら
15時過ぎに もやもやとしたままで下記の様なものを送ってしまいました。
もやもの中に射した一点の光の様に スッキリしました。
幾何の時の補助線的なものの考え方かなと 勉強になります。
又ヒントをいただくかもしれません.宜しくお願い致します。
有り難うございました。
報告して早々ですが
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図形のハンドルを取得しようとしてみたりしたのですが
これも上手くいきません。
選択した図形群をグループ化し、
そのグループ内の図形のハンドルは どの様にして取得していけば良いのでしょうか
お教えください。
選択した図形群をグループ化していく と云うところから考え直さないといけないのでしょうか
宜しくお願い致します。
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);
グループに入って最初に基準点を描くと、この基準点は一番上(前面)になります。
変換された図形は基準点の上に生成されるので、ハンドルが基準点と一致した時点で
ループを終了すれば、変換した図形はループ処理の対象にはなりません。
選択図形をグループ化すると他のレイヤの図形もアクティブレイヤに移動するので、
(スクリプトを書くのも使うのも)その辺を理解しておく必要があります。
与太郎さんよりヒントをいただき 今日一日色々やっていく中で
(今回の場合)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);
与太郎さん 詳しい説明有り難うございます。
お話に在る様に <適所にReDrawAll;を入れると......>でデバック中の状況を見ながら
どのように変換されるのかなど勉強したいと思います。
有り難うございました。
ヒントです。
DoMenuTextByName('Convert to Polygons',0); を実行した時点でhdが指していた図形
(柱状体)は消えてしまいます。
参照先のないハンドルのNextObjは、本来ならどんな結果が返っても不思議ないのですが、
VWの中の人は親切にもNilを返してくれることに決めたようです。
出来ればもう少しがんばって警告エラーを出してほしいところですが。
DoMenuTextByName('Convert to Polygons',0); で変換された図形は一番前面に生成さ
れるので、これらもループの対象になります。
今回のケースでは悪影響はありませんが、このスクリプトを流用して別の処理を行なった
場合は無限ループになる可能性があります。
適所にReDrawAll;を入れると、デバッグ中の実行状況(図形の選択等)を確認できます。
柱状体が重なるようにして実行すれば、変換された図形が前面になるのを観察できます。
繰り返し文と<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);
>これってこういう仕様なんでしょうか・・?
>バグでは?と思ってしまいますが^^;
Mac版では起きないのでWin版VW11.5のバグです。
Winの他のバージョンでどうなのか気になりますね。
>そちらにも、この情報を投稿させていただいて
>よろしいでしょうか?
どうぞどうぞ。
与太郎さま
わざわざ調べてくださってありがとうございます。
> 100ptで文字を描いて、そのサイズをGetTextSizeで
> 調べればプリント倍率は判ります。
なるほど、その手がありますね!
利用させていただきます^^
これってこういう仕様なんでしょうか・・?
バグでは?と思ってしまいますが^^;
実は、私、mixiのVectorScriptのコミュの
管理人をさせていただいています。
そちらにも、この情報を投稿させていただいて
よろしいでしょうか?
ぜひ与太郎さまのアイデアを投稿したいと
思うのですが・・・
不都合ありましたら、ご指摘ください。
その現象は初めて知りました。なんともおせっかいな仕様ですね。
VW11.5/Winで調べたところ、
TextSize ・・・・・・・・・・プリント倍率は無視、
GetDefaultTextSize ・・・・・プリント倍率は無視、
SetTextSize ・・・・・・・・ プリント倍率は無視、
GetTextSize ・・・・・・・・ プリント倍率により変わる、
みたいなので、
100ptで文字を描いて、そのサイズをGetTextSizeで調べればプリント倍率は判ります。
GetTextSizeで返った値をプリント倍率で割れば本来の文字サイズが得られます。
はじめまして。よろしくお願いいたします。
VectorWorks11.5を、Windows2000で使用しております。
「GetTextSize」でフォントサイズを取得する時の返値についてです。
通常は、文字サイズをptの単位で取得できますが、
用紙設定で「VectorWorks」という項目の「倍率」を設定していると、
その倍率をかけたサイズで、返値がもどるようです。
この倍率に関係なく、データパレットで表示されるのと同じフォントサイズを
取得する方法はございますでしょうか?
VectorScriptでのDXF設定値の参照・変更は、GetPref???, SetPref???で行ないます。
「VectorScript Function Reference」の「Additional Resources 付録」−「VectorScript Appendix」−
「Appendix F - Preference Selectors」−「DXF」に設定セレクタの番号があります。
それから、去年のバックナンバーにAppleScriptについての書き込みがあります。
アドバイスありがとうございます。
少し、補足です。
dwgデータをepsデータにするのが最終目標です。
(レイヤーを別々に〜)は考えておりません。
vectorscriptメッセージに表示させたかった理由は正しく値を返されているか
確認したかったからです。(リファレンスか何かでこのようなmessageの使い方をみたような気がします。)
>取り出し系メニューコマンドをDoMenuTextByNameで実行しても、VectorScriptではダイア
ログでのファイル名入力や「保存」ボタンなどを押すことが出来ません。
確かに、どうしてよいかわかりませんでした。出来ないんですね…。
とりあえす、strdialog(レイヤー名)で表示→コピー→eps取り出し→ファイル名入力時にペースト
としました。(自動にはほど遠いですが、少しマシになりました。)
もう1つ、レイヤー名にこだわったのは、dwgデータを取り込み時に”レイヤーをクラスに変換”にチェックを
入れると、デフォルトのレイヤー1のほかにファイル名のレイヤーが作られているのがわかったためです。
また取り込みを使用するとファイル名が”名称未設定”となったいたためこれではNGなためです。
つまり、dwgのファイル名でeps保存したかったのです。(あとだしのようになってしまってスミマセン。)
>Macの場合、AppleScriptでメニューコマンドの実行やダイアログのキー入力等が可能ですが、
これは、取り込み、取り出し時のチェック(縮尺、レイヤーをクラスに変換等の指定)がapplescriptで
出来るということですか?
xcodeも今勉強中です。もしそうなら、希望がもてそうです。
>(今回のレイヤー名で保存)
やってみればすぐ判りますが、
取り出し系メニューコマンドをDoMenuTextByNameで実行しても、VectorScriptではダイア
ログでのファイル名入力や「保存」ボタンなどを押すことが出来ません。
ですから、「ファイルの全てのレイヤを別々にEPSに書き出す」ような作業はVectorScript
では無理だと思います。
Macの場合、AppleScriptでメニューコマンドの実行やダイアログのキー入力等が可能ですが、
レイヤ名をAppleScriptに渡すのがちょっと面倒です。
与太郎様
ありがとうございました。
試したところうまく行きました。
Message(GetLName(レイヤハンドル));のような使い方ができるとは
考えてもいなかったです。もう少しマニュアル等と格闘してみます…。
間にいろいろあるのですが、最終的には”domenu〜”を使用してeps保存(今回のレイヤー名で保存)
するscriptにしたいと思っております。
また、詰まってしまった時、知恵をお貸しください。
ありがとうございました。
ハンドル型変数にはオブジェクトデータの場所(多分メモリアドレス)が入っています。
ですからMessage(レイヤハンドル);では数字が表示されます。
レイヤ名を表示するときはMessage(GetLName(レイヤハンドル));としてください。
はじめまして。
最近、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);を使用してみましたが、この時は、空欄でした。
ご指導宜しくお願いします。
解りました.有り難うございました。
ネット上で見つけた皆さんが作られたものなどを手本に
Scriptを並べる事で 何となく機能しているようで
なぜ動くのかの部分を理解していない事に気付きました。
もう一度マニュアルを読み返そうと思います。
有り難うございました。
いえ、もちろん同じファイルならWSサイズが変わるはずはありません。
たぶん御友人のVWは環境設定でScriptエラーを出さないようにしているのでしょう。
そうすると、文字列の範囲外へのアクセス・エラーなども出なくなります。
しかし、エラーが出なくてもスクリプトにバグがあるのは明らかです。
スクリプト作成中はScriptエラーが出るように設定しておいたほうが良いでしょう。
いつもいつも早速の回答有り難うございます。
これから色々トライしてみます。
一つお教え戴きたいのですが
>WSの行列の大きさが違っているからでは?
と 言われておりますが
iBookからiMacにデータを持ってきてみただけでも
<行列の大きさ>は変わってしまうのですか?
解ってないもので愚問かもしれませんが
宜しくお願い致します。
WSの範囲外のセルにアクセスしたという警告ですから、まあそういうことでしょう。
片方でしかエラーが出ないのは、WSの行列の大きさが違っているからでは?
与太郎さん、石男さん 有り難うございます。
新たな問題。
いつもはiMac-OS10.4VW12.5を使っています。
図形の面積を拾い出し、WorkSheetに書出すと云うScriptを作っていたのですが
途中から友人のiBook-OS10.3.9を使う事となり そこで完成しました。
ですが
持ち帰りiMacで動かすと
<Attempt to access a cell outside the worksheet bounds.>
と云うエラーが出ます。でも 計算もちゃんと出ます。
どうしてなのか解りません。
お教えください.宜しくお願いします。
><VectorScript Reference>の個々の使い方を...
結局のところ、トライ&エラーで試してみる以外はないです。英語が分かれば、ご本家の
メーリングリストが一番間違いなく答えをいただけます。
新しいことは、ここでしか分からないかもしれません、自分の経験上では。
がんばってみてください。
またまた 色々と勉強材料を戴き有り難うございます。
英語が苦手なのですが、時間が掛かってもトライしたいと思います。
ところで<VectorScript Reference>の個々の使い方を どのように勉強なさっているのですか?
以前は本も出ていたとか、古本をあたっても入手できません。
なんとかMiniCAD7の ミニパスカルマニュアルを手に入れたのですが
これに無いものの使い方の例を 知りたいことの方が多いのです。
マニュアルの内容を詳しく知りたい事が多く
やはりScript相談室等のネットで勉強するとか
試行錯誤で使い方を見つけだす
という方法なのでしょうか
「特定イベント」については私もあまり経験ありませんので、
「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」、
を御覧下さい。
多くのご提案有り難うございます。
プラグインオブジェクトをレンダリングした状態で 色を見つつ変更していきたいと考えていましたので
<4>の方法が一番近いのかと思っておりますが
<3>までの方法は出来たのですが、この<「特定イベント」でモダンダイアログを開き>とは
どのように行うのか、図々しいのですがお教えください。
宜しくお願い致します。
プラグインオブジェクト内の特定の図形の色を変えたいなら、
1. 整数型パラメータで色番号(カラーインデックス番号)を指定する、
2. ポップアップ型パラメータで色の名前を指定する(名前→色の変換は自己責任)、
3. ポップアップ型パラメータで図形のクラスを指定して、色はクラス属性で変更する、
4. 「特定イベント」でモダンダイアログを開き、カラーパレットで色番号を指定する、
など色々なやりかたがあります。
有り難うございます。
質問が不明瞭な点が在ったようで済みません。
勉強中でしたので単体のオブジェクトでしたが
いくつかのオブジェクトで構成されたオブジェクトの一部のものだけの色を
変更するのに、データパレットから数値入力に依り操作できるのではと思ったのです。
マニュアルを読んでみます。
又質問させていただくかもしれません.有り難うございました。
プラグインツールとプラグインオブジェクトは全く別のものです。
プラグインツールのスクリプトがグループ図形を描くようになっていれば、当然グループ図形が生成されます。
プラグインオブジェクトを描くには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の値を決定できます。
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);
与太郎さん 早々の返答有り難うございました。
友人の中には Ver.11だったりのものもいますので勉強てみます。
3Dオブジェクトをパラメーターで色コントロールできればと
考えてのトライでした。
有り難うございました。
VectorScriptコマンドは、3種類のVectorScriptプラグイン(Menu, Tool, Object)の内、
Menuプラウインに当たります。
Menuプラグインは、基本的にはファイル全体や選択図形を対象としてスクリプトを実行します。
Toolプラグインのスクリプトは、マウスクリック/ドラッグで操作対象や座標を指定します。
最初に描画領域内をクリックかドラッグすると、それがトリガーとなってスクリプトが実行されます。
ですからスクリプトの最初のほうでGetPt,かGetPtLによる座標取得が必要です。
「スクリプトの中でカラーパレットを使う」ですが、
VW12以降ではモダンダイアログでカラーパレットが使えるみたいです。
モダンダイアログは面倒ですが、文字属性などもポップアップで設定出来るなど、ヴァージョンアップ
の度に機能が追加されていて、開発元も力を入れているようです。
初めてお便りします。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);
nudgeさま:
ありがとうございます。これで他のレイヤを編集状態にしていようが、選択したい文字列がある範囲を
セレクションポインタで大雑把に選択してから安心して作業できます。
これを参考に、他のオブジェクトや画面に表示された範囲などの条件をトライしてみます。
(図面が適判にまわってから…)
私の頭はcore Soloで回路はシングルタスクですので同時に2件の申請作業など絶対に不可能ですが、
これが仕事なんだと思って頑張ります。ありがとうございました。
選択しているものに限るは
DSelectObj(((T<>Text) & (SEL=TRUE)));
で良いと思います。選択しているオブジェクトから
文字列以外を選択解除するという手順です。
見えているものというのは、画面に表示された範囲と
いうことでしょうか。そうであると私の手には負えません。
他の方のレスを待ってください。
お急ぎのようですので、取り敢えず解るところから。
私も明日2件の申請があります・・・・汗。
お互いがんばりましょう。
はじめまして。
文字列の選択スクリプトを
DSelectAll; SelectObj((T=Text) & (V));
として使い続けて来たものですが、これだと全ての文字列が選択されてしまいます。
「いま見えているものに限る」または「選択しているものに限る」という意味を付け加えるには、
どのようなスクリプトが必要でしょうか。マニュアルをみて試して見ているのですが、
どうもうまくいきません。バージョンは12.5です。
非常に基礎的なことだとは思いますが、どうぞよろしくお願いします。
上記のスクリプトを焦っているときに使って、条文をあげて根拠を必死に説明している文字列を全て
消してしまい、気付くまでの数秒の間に自動上書き保存されてしまったので、本日の業務は終了です(大泣)
ありがとうございます!v12を入手して、ヘルプを見てみようと思います。今後ともよろしくお願いします!
nomuさん、はじめまして。
オフセットツールのパラメータは、スクリプトでは設定出来ないみたいです。
MacでOSXな環境ならAppleScriptで「i」、「100」などのキー入力をすることは可能ですが、
いまいち使いにくそうです。
直線や円弧が対象なら、専用のスクリプトコマンドを書くのは比較的簡単です。
VWヘルプのVectorScript Gudeは御覧になりましたか?
VW12では日本語に訳されているので、デモ版を入手してでも一読されることをお勧めします。
VectorScriptでどんな事が可能かイメージがつかめると思います。
製品版でしたら、VectorWorksフォルダの中にもサンプルなどがあります。
関連サイトについてはMiniPascal、VectorScript等で検索してください。
ここの掲示板のバックナンバーも参考になるでしょう。
いつもお世話になります。オフセットを100や200など、そのたびに数値入力をする手間を省くようなスクリプトをご存知の方いらっしゃいませんか?コマンドパレットのなかに「オフセット100」「オフセット200」など設定しておければなぁと思っているのですが…。よろしくお願いします。また、初心者向けのスクリプト参考本(サイトなど)もあわせて教えていただければ幸いです。
お世話になりました。
来年もよろしくお願いいたします。
今年の書き込みは、バックナンバーに移動しました。