JWB2000〜2002のシンボルオブジェクトモデルの概要
2001.09.05.現在

  1. ・JWB2000〜2002のCAD機能は完全に階層化された柔軟なシンボルオブジェクトを扱う。
  2. ・シンボルオブジェクトとは、1つの部品であり、複数の小さい部品が集まり、大きな部品を形成する事になる。・汎用的な部品(図形)は、いつでも使えるように、シンボルオブジェクト単位で、インポート・エクスポートが可能。
  3. ・シンボルオブジェクトは、COMテクノロジーを使った、オートメーションオブジェクトとして、プロパティ・メソッドを持つ。
  4. ・スクリプトオブジェクトは、VBScript言語を使用し、オートメーションオブジェクトモデルといて動作し、プロパティ・メソッド・イベントを扱う。

  現在 JWB2000〜2002は、JWB Fun Club 及び JWBパティオを拠点とし開発を進めているが、JWB2000〜2002のCAD機能で、皆さんは何に興味を示すだろうか?作図メニューとしてのドラッグメニュー(仮)に興味を抱く方もおりましょうが、ここでは、JWB2000〜2002のスクリプト機能について説明する事にいたします。

★★JW_CADの外部変形に+αを?
 JW_CADをメインに使っている方なら、一度は外部変形を使ったことが有るでしょう。しかし、外部変形に慣れてくると、こう言う作図方法で、一連の作業を自動化したいとか、基本数値を入力するだけで、特定の図形を決まった位置に配置したいとか....色々欲が出てくるものです。しかし、線・円・文字・点など1つ1つの要素を吐き出して外部で処理しようとしても非常に手間だったり、します。なぜなら、目で見る限りは特定の図形でも、内部では単なる線の集まりに過ぎないからです。

★皆さんは Excel の VBA(Visual Basic for Application)を使ったことがありますか?
 ExcelのVBAは、一度足を踏み込んでしまうと、もう止められませんね!(VBAに付いては関連書籍をご覧ください) JWB2000〜2002のスクリプト機能は、Excel ←→ VBA の関係に非常に似ています。また、COMテクノロジーのオートメーション機能に対応し、プロパティ・メソッド以外に、イベントが扱えると言う点でも似ています。


★JWB2000〜2002で使用する VBScriptエンジンについて...

 JWB2000〜2002は、VBScript言語を内部で使用する都合上、VBScriptエンジンが必要です。VBScriptエンジンはWin98/Me/2000には標準でインストールされています。また、Win95/NT4.0の方は、Microsoft Internet Explorer 4.0以降、または Windows Scripting Host(いずれも無償で、Microsoftサイトからダウンロードできます)をインストールされることにより、VBScriptエンジンがインストールされます。

★シンボルオブジェクト(オートメーションオブジェクト)等のプロパティやメソッドやイベントについて...
 JWB2000〜2002は、まだ開発中であり、プロパティやメソッドなど、まだ完成の域には達していませんが、下表のようなプロパティやメソッドを持っています。

ンボルオブジェクトモデル

(P)or(M) 外部名  設定値/取得値  (★印は メゾットやプロパティーの新規追加名です。
プロパティ x 原点のX座標
(例1)-----------------------------------
Dim mvx, mvy, angle, zoom    '宣言した変数はグローバル変数である。
mvx = 10
mvy = 10
angle = Rnd(1)
zoom = -0.02
sym.x = sym.x + mvx   'この sym オブジェクトは、はじめから使える。
sym.y = sym.y + mvy
   '現図面内のy座標値にmvyプラス。  
プロパティ y 原点のY座標  '(例は原点のX座標参照)
プロパティ Angle 角度
(例1)-----------------------------------
angle = Rnd(1) * 0.3   '0〜0.3までの乱数を発生
sym.Angle = sym.Angle+ angle  '図面内の現角度に乱数発生角度をプラス。
プロパティ Scale スケール(X軸スケール,Y軸スケールとも同じ値を書き込む)
(例1)-----------------------------------
sym.Scale = 1    'スケールを、1 に設定。
プロパティ Horizontal X軸スケール
(例1)-----------------------------------
sym.Horizontal = 1    'X軸スケールを、1 に設定する。
sym.Vertical = 0.5     'Y軸スケールを、0.5 に設定する。
プロパティ Vertical Y軸スケール  '(例はX軸スケール参照)
プロパティ Name オブジェクト名
プロパティ Lock オブジェクトの保護
メソッド Macro


\
+回転させる
 +100回
 +400回
オブジェクトで使用できるマクロの登録
(例1)-----------------------------------
sym.Macro "TryRollingAttack (5)" , "コマ送り(5回) '1つのクラスモジュールで登録マクロ数は20個。
sym.Macro "TryRollingAttack (100)", "回転させる\100回" '”(プロシージャ名)¥(マクロ名)”
sym.Macro "TryRollingAttack (400)", "回転させる\400回"
(例2)-----------------------------------
sym.Macro "Main", "Mainを実行"  'マクロ名を '\' で区切ることで、マクロリストを階層化できるので、
                         ' たくさんのマクロを操作する場合は大変有効である。
                         ' ※1つのクラスモジュールで一度に登録できるマクロ数は20個ま
で。
メソッド GetObject()

     認識
+自分(A) ↓
 +子(B) ○
 +子(C) ○
  +孫(D)○
自分の子オブジェクトを取得(子のシンボルオブジェクト、線・円・点・文字オブジェクトを取得)
(例1)-----------------------------------
Dim item
Set item = sym.GetObject("平面図")   'これで、平面図と言う部品名をゲットします。
(例2)-----------------------------------
Dim Item1, Item2
Set Item1 = sym.GetObject ("回転1")   '自分の子オブジェクト( 回転1 と 回転2 )を取得
Set Item2 = sym.GetObject ("回転2")   
※孫のオブジェクトの取得は「X」です。
例3)-----------------------------------
sym.GetObject ("回転0\回転2").Script.kaiten3(count)   'sym.GetObject () の仕様変更。
                      'オブジェクト名を '\' で区切って階層化オブジェクトにアクセス可
メソッド Script 自分に唯一のスクリプトオブジェクトを取得
(例1)-----------------------------------
Dim Item1, Item2
Set Item1 = sym.GetObject ("回転1")   '自分の子オブジェクト( 回転1 と 回転2 )を取得
Set Item2 = sym.GetObject ("回転2") 
Item1.Script.Moving   '←"回転1"オブジェクトのスクリプトのMoving関数を実行
Item2.Script.Moving   '←"回転2"オブジェクトのスクリプトのMoving関数を実行
プロパティ Visible  部品の表示状態の設定。 ( 0=非表示, 1=グレー, 2=表示 )
(例1)-----------------------------------
Dim item
Set item = sym.GetObject("平面図")
item.Visible = 2   'これで、平面図と言う部品が表示状態に切り替わります。
               'ただし、平面図の親部品が非表示なら、表示されません。
   
メソッド Delete 自分を削除する。
(例1)-----------------------------------
sym.Delete   '自分のスクリプトで自分を削除する。
(例2)-----------------------------------
Dim Item1
Set Item1 = sym.GetObject ("回転1")
Item1.Delete               '回転1 と言う部品を削除する
(例3)-----------------------------------
sym.GetObject ("回転2").Delete   '回転2 と言う部品を削除する
'↑この様に1行で書くことも出来る。
プロパティ Count ★ 直接の子のオブジェクト数を返す。(取得のみ) ※孫オブジェクトなどはカウントされない。
(例1)-----------------------------------
For Each 〜 In sym
    〜
Next     ' を実行した時の繰り返し回数と一致します。
sym.Count


キュメントオブジェクト

(P)or(M) 外部名  設定値/取得値
プロパティ PaperRect.Left 基準用紙の左端 X座標 (mm)
(例1)-----------------------------------
Dim Pleft, Pright, Ptop, Pbottom
Pleft = doc.PaperRect.Left       'このdoc オブジェクトは、はじめからつかえる。
Pright = doc.PaperRect.Right
Pbottom = doc.PaperRect.Bottom
Ptop = doc.PaperRect.Top
プロパティ PaperRect.Right 基準用紙の右側 X座標 (mm)  '(例は基準用紙の左端 X座標 (mm)参照)
プロパティ PaperRect.Top 基準用紙の上端 Y座標 (mm)  '(例は基準用紙の左端 X座標 (mm)参照)
プロパティ PaperRect.Bottom 基準用紙の下端 Y座標 (mm)  '(例は基準用紙の左端 X座標 (mm)参照)
プロパティ BackGroundColor 図面の背景色
(例1)-----------------------------------
doc.BackGroundColor = RGB (255,255,0)   '背景色を黄色に設定。
doc.BackGroundColor = RGB (255,0,0)     '背景色を赤色に設定。
doc.BackGroundColor = RGB (0,0,0)      '背景色を黒色に設定。
doc.BackGroundColor = RGB (255,255,255)  '背景色を白色に設定。
メソッド ReDraw ★

(UpDateAllViewsの廃止)
強制 再描画指示
(例1)-----------------------------------
doc.ReDraw (True)   '全ての描画ウィンドウ更新する(再描画する)
                    'True = アニメーションに適した描画方法
                    'Fase = 一般的な描画方法   ※省略時は Flase とみなされる。

メソッド RootObject 最上位シンボルオブジェクトを取得する。

※実際には、上記以外にも多くのプロパティやメソッドや、 線オブジェクト、円オブジェクト、点オブジェクト、文字オブジェクトのプロパティやメソッドも等も扱うが、ここでは参考程度に見て欲しい。

 

加メソッド&プロパティ
Symbol Object、線Object、円Object、点Object、文字Object に共通のメソッド&プロパティ
M/P/I 外部名 設定 取得 操作 説明
プロパティ Name オブジェクトの名前
プロパティ ID オブジェクト種別のIDを取得
メソッド Delete オブジェクトを削除
メソッド GetParent 親オブジェクトを取得


オブジェクト種別 ID は、
定数名 オブジェクト種別
otLine 線オブジェクト
otCircle 円オブジェクト
otString 文字オブジェクト
otPoint 点オブジェクト
otMirror ミラーオブジェクト
otSymbol シンボルオブジェクト


オブジェクト固有のプロパティ&メソッド
M/P/I 外部名 設定 取得 操作 説明 単位 備考
プロパティ x1 始点(x1,y1)設定/取得。 単位: 相対座標 mm 相対座表
プロパティ y1 mm 相対座表
プロパティ x2 終点(x2,y2)設定/取得。       〃 mm 相対座表
プロパティ y2 mm 相対座表
プロパティ Length × 線の長さを取得。      〃 mm 相対座表
プロパティ Ax1 始点(x1,y1)設定/取得。 単位: 絶対座標 mm 絶体座表
プロパティ Ay1 mm 絶体座表
プロパティ Ax2 終点(x2,y2)設定/取得。      〃 mm 絶体座表
プロパティ Ay2 mm 絶体座表
プロパティ ALength × 線の長さを取得。      〃
プロパティ Coror 線色
プロパティ Style 線種の設定/取得。


(楕円・円弧・楕円弧を含む)オブジェクト固有のプロパティ&メソッド
M/P/I 外部名 設定 取得 操作 説明 単位 備考
プロパティ x 中心点 x座標 mm 相対座標
プロパティ y 中心点 y座標 mm 相対座標
プロパティ xr x軸半径 mm 相対座標
プロパティ yr y軸半径 mm 相対座標
プロパティ st 始点角 ラジアン 相対座標
プロパティ et 終点角 ラジアン 相対座標
プロパティ tt 軸角 ラジアン 相対座標
プロパティ ax 中心点 x座標 mm 絶対座標
プロパティ ay 中心点 y座標 mm 絶対座標
プロパティ axr x軸半径 mm 絶対座標
プロパティ ayr y軸半径 mm 絶対座標
プロパティ ast 始点角 ラジアン 絶対座標
プロパティ aet 終点角 ラジアン 絶対座標
プロパティ att 軸角 ラジアン 絶対座標
プロパティ Color 線色
プロパティ Style 線種


種の値は、
定数名 説明
psSolid 実線
psDot1 点線1
psDot2 点線2
psDot3 点線3
psDash1 1点鎖線
psDash1b 1点鎖線大
psDash2 2点鎖線
psDash2b 2点鎖線大
psSubLine 補助線
psRnd1 ランダム1
psRnd2 ランダム2
psRnd3 ランダム3
psRnd4 ランダム4
psRnd5 ランダム5
psLongDash1 ロング1点鎖線
psLongDash2 ロング2点鎖線
psLongDot ロング点線


色の定数
定数名 説明
vbCyan 水色(RGB(0, 255, 255)に同等)
vbWhite 白色(RGB(255, 255, 255)に同等)
vbGreen 緑色(RGB(0, 255, 0)に同等)
vbYellow 黄色(RGB(255, 255, 0)に同等)
vbMagenta 紫色(RGB(255, 0, 255)に同等)
vbBlue 青色(RGB(0, 0, 255)に同等)
vbRed 赤色(RGB(255, 0, 0)に同等)
vbBlack 黒色(RGB(0, 0, 0)に同等)
※↑以外に、RGB(n, n, n)を使用する事で中間色を指定できます。


ンジオブジェクト(コレクションに対応)のプロパティ&メソッド
M/P/I 外部名 設定 取得 操作 説明 単位 備考
プロパティ Count × 対象オブジェクト数
プロパティ Item() × 指定位置のオブジェクトを取得
メソッド SetReadPoint() 指定位置の接点座標のセット セット後、x,yで座標取得
プロパティ x x座標 抽出 相対座標
プロパティ y y座標 抽出 相対座標
メソッド Range sym.Range sym.Range[オブジェクト名],[対象オブジェクト種別]
※連続線化処理のレンジオブジェクトを返す。
これは、バラバラの線や円を連続線としてに
扱うことが出来るオブジェクトです。
※線・円・文字・点の各々オブジェクトに名前を付けられます。
要素の上で左ボタン・下ドラッグ・他方クリックで、プロパティメニューで
名前を作成できます
レンジオブジェクトの原理は下記の通りです。
 まず、どれか1つの線(円)を1本目の線として、
 1本目の線(円)の 始点・終点 のうち、いずれかの方を
 第1点、もう一方を 第2点とする。
 第2点 に一番近い点を持つ線を 2本目の線として、
 2本目の線の始点・終点のうち、 第2点 から遠い方の点を、
 第3点にする。
 このような方法を繰り返して、
 1)連続的に繋がるように、要素をソートします。
 2)xx(i),yy(i)で、i = 0〜Count(要素数)で、点を順番に取得できます。
 尚、1本目の線を指示するには、その線に名前を付けておきます。
 例えば、ある線に、"First" という名前を付けておき、

 sym.Range ("First")とやると、名前に"First"が付く線が、
 1本目の線として扱われます。
※線・円・文字・点の各々オブジェクトに名前を付けられます。
要素の上で左ボタン・下ドラッグ・他方クリックで、プロパティメニューで
名前を作成できます

線・円・文字・点に名前を付けるには、線等の上で、
 左ボタン+右下外ドラッグ+他方クリック。
 これで、プロパティのコマンドが選択できます。
尚、
 sym.Range
 と 名前を省略した場合、どれが1本目の線になるかは、不定です。
 また、sym.Range には、2番目の引数を指定できます。
       ↓"" とすると、1本目の線は不定。
 sym.Range ("" , otLine) または、
 sym.Range ("First", otLine) など、
↑ こうすると、連続線の対象となるのは、
             線のみになります。つまり、円・文字・点は、
             無視されます。
 2番目の引数を省略すると、線と円が 連続線として対象になります。

 あとは、
Count = range.Count
For i = 0 To Count
range.SetReadPoint (i)
xx(i) = range.x
yy(i) = range.y
Next

とすることで、xx(i),yy(i) i = 0〜Count という操作ができます。
^^^^^^^^
↑ここがポイント!!
 Countは、対象となる要素数を返します。
 例えば、四角形の場合、4本の線から構成されますので、
 Count = 4 になっています。

 つまり、0 〜 Count → 0 〜 4 という事で、0 1 2 3 4 と5回
 繰り返えされる事になります。

 四角形の場合、
 第1点 ... xx(0),yy(0)
 第2点 ... xx(1),yy(1)
 第3点 ... xx(2),yy(2)
 第4点 ... xx(3),yy(3)
 第5点 ... xx(4)=xx(0) , yy(4)=yy(0)
↑第1点 と 第5点 は同じ座標値になります。

 具体的には、
第1点 ... 1本目の線の始点。
 第2点 ... 1本目の線の終点。
 第3点 ... 2本目の線の終点。
 第4点 ... 3本目の線の終点。
 第5点 ... 4本目の線の終点。
             ↑データ上では、通常、
              (x1,y1)-(x2,y2) と記憶しているだけ
              だから、(x1,y1)が始点に成るとは限らない
              ので、どっちが始点になるか、予め計算
              しておき、上手く、連続線に成るように
              処理している。
 ....この方法が有効なのは、必ず、連続線の初めと終わりが、結ばれて
 いる事が条件になります。

 また、レンジオブジェクトは、コレクションに対応しています。
^^^^^^^^^^^^^^^^^^
↑つまり、For Each 〜 In 〜 が使える。
つまり、
----------------------------------------------
Dim range, item
 Set range = sym.Range

For Each item In range
item.Color = vbGreen '←緑色に変える。
doc.ReDraw

MsgBox "次!"
Next
-----------------------------------------------
とやると、1番目の線、2番目の線、3番目の線....
と順番に、線色を 緑色に 変えてくれます。
 つまり、レンジオブジェクトが、どの順序で線を追っているかが判ります。
Symbol Object(コレクションに対応) のメソッド&プロパティ (2001.08.16現在)
M/P/I 外部名 設定 取得 操作 説明 単位 備考
プロパティ x x軸の原点 mm 実寸
プロパティ y y軸の原点 mm 実寸
プロパティ Angle 軸角 ラジアン
プロパティ Scale スケール x,y軸とも同じ値を書込
プロパティ Horizontal x軸のスケール
プロパティ Vertical y軸のスケール
プロパティ Count ぶら下がっているオブジェクト数
プロパティ Item (インデックス値:0〜) ぶら下がっているオブジェクトを順番に取得します
メソッド Macro "プロシージャ名" , "マクロ名" マクロを登録します。
メソッド Script スクリプトオブジェクトを取得します
プロパティ Visible 状態(1→非表示 2→グレー表示(読取専用) 3→通常表示)
メソッド Range [オブジェクト種別], [始点の要素名] 連続点の取得(連続線から)
メソッド AddFolder [オブジェクト名] , [状態] , [アクティブ化フラグ] 新しいシンボルオブジェクトを追加し、それを取得 [ ]付きは省略可。※1
↑オブジェクト名を省略すると、"新規オブジェクト" と設定されます
↑状態を省略すると 通常 となります。1→非表示 2→グレー表示(読取専用) 3→通常表示
↑アクティブ化フラグを省略すると False となります。
False→編集オブジェクトは変更しない。True→する。
メソッド AddLine [x1] , [y1] , [x2] , [y2] , [線色] , [線種] 新しい線オブジェクトを追加し、それを取得 [ ]付きは省略可。※1
↑始点(x1,y1) - 終点(x2,y2) 。省略すると 0 として処理します。単位は mm(実寸)。
↑線色を省略すると、現在設定中の色が使われます。
↑線種を省略すると、現在設定中の線種が使われます。
メソッド AddPoint [x座標] , [y座標] , [色] , [タイプ] 新しい点オブジェクトを追加し、それを取得 [ ]付きは省略可。※1
↑座標(x,y)。省略すると 0 として処理します。単位は mm(実寸)。
↑色を省略すると、現在設定中の色が使われます(ただし、タイプが1,2の場合は色は無視される)
↑タイプを省略すると 0 として処理されます。0→実点、1→仮実点 2→仮点
メソッド AddCircle [x座標] , [y座標] , [X軸半径] , [Y軸半径] , [線色] , [線種] , [始角] , [終角] , [軸角] 新しい円(円弧)オブジェクトを追加し、それを取得 [ ]付きは省略可。※1
↑座標(x,y)。省略すると 0 として処理します。単位は mm(実寸)。
x軸半径を省略すると 1.0mm(実寸)として処理されます。
y軸半径を省略すると x軸半径 と同じ値として処理されます。
↑線色を省略すると、現在設定中の色が使われます。
↑線種を省略すると、現在設定中の線種が使われます。
↑始角 を省略すると、 0.0(ラジアン)として処理されます。単位は ラジアン。左回りで+
↑終角を省略すると、2π(ラジアン)として処理されます。単位はラジアン。左回りで+
↑軸角を省略すると、0.0(ラジアン)として処理されます。単位はラジアン。左回りで+
メソッド AddString [x座標] , [y座標] , [軸角] , [基点] , [文字列] , [フォント名] , [色] , [文字高] , [文字幅] , [文字間隔] , [縦文字フラグ] , [補助文字フラグ] 新しい文字オブジェクトを追加し、それを取得 [ ]付きは省略可。※1
↑座標(x,y)。省略すると 0 として処理します。単位は mm(実寸)。
↑軸角を省略すると、0.0(ラジアン)として処理されます。単位はラジアン。左回りで+
↑基点を省略すると 0(左下) として処理します。詳細は文字列基点 定数表を参照。
↑文字列を省略すると "新規文字列" と設定されます。
↑フォント名を省略すると "MS ゴシック" として処理されます。
↑色を省略すると、現在設定中の色が使われます。
↑文字高、文字幅、文字間隔 を省略すると、現在設定中の文字情報が使われます。
↑縦文字フラグを省略すると、 False(横文字) として処理されます。True(縦文字)。
↑補助文字フラグを省略すると、False(通常文字)として処理されます。True(補助文字)。
※注意 ※1:AddFolder , AddLine , AddPoint , AddCircle , AddString メソッドは、作成したオブジェクトを取得する場合と、取得しない場合で定義方法が異なります。
例: Set item = sym.AddLine (0, 0, 100, 100) ←取得する場合は、 AddLine (〜) 等とカッコが必要です。
例: sym.AddLine 0, 0, 100, 100 ←取得しない場合は、AddLine 〜 等とカッコを付けては行けません。


点オブジェクト固有のプロパティ&メソッド
M/P/I 外部名 設定 取得 操作 説明 単位 備考
プロパティ x 中心点 x座標 mm 相対座標
プロパティ y 中心点 y座標 mm 相対座標
プロパティ ax 中心点 x座標 mm 絶対座標
プロパティ ay 中心点 y座標 mm 絶対座標
プロパティ Color 線色


文字オブジェクト固有のプロパティ&メソッド
M/P/I 外部名 設定 取得 操作 説明 単位 備考
プロパティ x 基点 x座標 mm 相対座標
プロパティ y 基点 y座標 mm 相対座標
プロパティ ax 基点 x座標 mm 絶対座標
プロパティ ay 基点 y座標 mm 絶対座標
プロパティ Angle 角度 ラジアン
プロパティ String 文字列
プロパティ Zero 文字列の基点
プロパティ FontName フォント名
プロパティ Height 文字高さ mm 絶対座標
プロパティ Width 文字幅 mm 絶対座標
プロパティ Space 文字間 mm 絶対座標
プロパティ Italic 斜体 True or False
プロパティ Bold 太字 True or False
プロパティ Color 文字色 RGB()値


※文字列基点の定数
定数名 説明
spLeftBottom 左下
spCenterBottom 中下
spRightBottom 右下
spLeftCenter 左中
spCenterCenter 中中
spRightCenter 右中
spLeftTop 左上
spCenterTop 中上
spRightTop 右上


スクリプトサンプル画面 クリプト サンプル例・説明。
JWB2000を利用して
作図するスプリクトを
紹介します。

図面中に追加出来る
ものは下記の5つです。

@線
  AddLine
A点
  AddPoint
B円
  AddCircle
C文字
  AddString
Dフォルダー(部品名) 
  AddFolder

の5つの作成が可能。


と自由にVBSでプログラムする事でデータを追加する事が出来ます。

参考データ(作図.bso)
      6Kb
'基準用紙範囲を取得する
Dim Pleft, Pright, Ptop, Pbottom
Pleft = doc.PaperRect.Left
Pright = doc.PaperRect.Right
Pbottom = doc.PaperRect.Bottom
Ptop = doc.PaperRect.Top

'ランダムで書込範囲内の X座標値を返す
Function rnx
rnx = (Rnd(1) - 0.5) * Pright
End Function


'ランダムで書込範囲内の Y座標値を返す
Function rny
rny = (Rnd(1) - 0.5) * Ptop
End Function


'ランダムで色値を返す
Function rnc
rnc = RGB(Rnd(1)*255, Rnd(1)*255, Rnd(1)*255)
End Function

'ランダムで線種を返す
Function rns
rns = Int(Rnd(1) * 17)
End Function

'ランダムで角度を返す
Function rna
rna = (Rnd(1) - 0.5) * 3.1415927
End Function

'指定のオブジェクト(RollObj)を指定の座標(xe,ye)まで、
指定回数(count)に分割し、
'また、指定のスケール(scale)に拡大/縮小し、回転・移動させる
Function RollObject (RollObj, xe, ye,scale, count)
Dim xm, ym, am, SrcAngle, sm
xm = (xe - RollObj.x) / count
ym = (ye - RollObj.y) / count
am = 2 * 3.1415926536 / count
SrcAngle = RollObj.Angle
sm = (scale - RollObj.Scale) / count

Dim i
For i = 1 to count
RollObj.x = RollObj.x + xm
RollObj.y = RollObj.y + ym
RollObj.Angle = RollObj.Angle + am
RollObj.Scale = RollObj.Scale + sm
doc.ReDraw
Next

'最後に誤差を修正
RollObj.x = xe
RollObj.y = ye
RollObj.Angle = SrcAngle
RollObj.Scale = scale
doc.ReDraw
End Function



'ランダムで線を書込
'WriteSym は、書込するオブジェクト
'count は、ランダム線を書込む本数
Sub Random_AddLine (WriteSym, count)
Dim i
For i = 1 to count
WriteSym.AddLine rnx(), rny(), rnx(), rny() ,rnc(), rns()

If (i mod 100) = 0 Then
doc.ReDraw
End If

Next
End Sub


'ランダムで円を書き込む
'WriteSym は、書込するオブジェクト
'count は、ランダム円を書込む本数
Sub Random_AddCircle (WriteSym, count)
Dim i
For i = 1 to count
WriteSym.AddCircle rnx(), rny(), rnx() * 0.1,
rny() * 0.1, rnc(), rns(), rna(), rna(), rna()

If (i mod 10) = 0 Then
doc.ReDraw
End If

Next
End Sub


'ランダムで点を書き込む
'WriteSym は、書込するオブジェクト
'count は、ランダム円を書込む本数
Sub Random_AddPoint (WriteSym, count)
Dim i
For i = 1 to count
WriteSym.AddPoint rnx(), rny(), rnc(), Int(Rnd(1)*3)

If (i mod 100) = 0 Then
doc.ReDraw
End If

Next
End Sub



'ランダムで文字を書込
'WriteSym は、書込するオブジェクト
'count は、ランダム文字を書込む本数
Sub Random_AddString (WriteSym, count)
Dim i
Dim str
str = "DEMO"

For i = 1 to count
If i = count Then
str = "デモ"
End if

'WriteSym.AddString rnx(), rny(), 0, 0, str , "MS 明朝",
 rnc(), 10 + Rnd(1) * 10, 10 + Rnd(1) * 10, Rnd(1) * 10
WriteSym.AddString rnx(), rny(), 0, 0

If (i mod 10) = 0 Then
doc.ReDraw
End If

Next
End Sub

Sub Main
'背景色を白にする
doc.BackGroundColor = RGB (255, 255, 255)
doc.ReDraw

'全ての子オブジェクトを削除する
Dim item
For Each item in sym
item.Delete
Next

'背景色を段々暗くする
Dim c
For c = 254 to 0 Step -1
doc.BackGroundColor = RGB (c, c, c)
doc.ReDraw
Next

'線書込み 500本
Dim Obj
Set Obj = sym.AddFolder ("Line")
Obj.x = Pright * (2 / 3)
Obj.y = Ptop * (2 / 3)
Obj.Scale = (2 / 3)
Random_AddLine Obj, 500
'例の如く回転...(^_^;
RollObject Obj, Pright * (1 / 6), Ptop * (5 / 6), (1 / 3), 20

'円書込み 300本
Set Obj = sym.AddFolder ("Circle")
Obj.x = Pright * (2 / 3)
Obj.y = Ptop * (2 / 3)
Obj.Scale = (2 / 3)
Random_AddCircle Obj, 300
'例の如く回転...(^_^;
RollObject Obj, Pright * (1 / 6), Ptop * (3 / 6), (1 / 3), 20

'点書込み 500本
Set Obj = sym.AddFolder ("Point")
Obj.x = Pright * (2 / 3)
Obj.y = Ptop * (2 / 3)
Obj.Scale = (2 / 3)
Random_AddPoint Obj, 500
'例の如く回転...(^_^;
RollObject Obj, Pright * (1 / 6), Ptop * (1 / 6), (1 / 3), 20

'文字書込み 100本
Set Obj = sym.AddFolder ("String")
Obj.x = Pright * (2 / 3)
Obj.y = Ptop * (2 / 3)
Obj.Scale = (2 / 3)
Random_AddString Obj, 100
'例の如く回転...(^_^;
RollObject Obj, Pright * (3 / 6), Ptop * (1 / 6), (1 / 3), 20

'線・円・点・文字、書込み
Set Obj = sym.AddFolder ("---")
Obj.x = Pright * (2 / 3)
Obj.y = Ptop * (2 / 3)
Obj.Scale = (2 / 3)
Random_AddLine Obj, 300
Random_AddCircle Obj, 100
Random_AddPoint Obj, 300
Random_AddString Obj, 100
'例の如く回転...(^_^;
RollObject Obj, Pright * (5 / 6), Ptop * (1 / 6), (1 / 3), 20

End Sub



'マクロ登録
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■
sym.Macro "Main" , "要素書込DEMO"
' ↑プロシージャ名 ↑マクロ名
'このように、symオブジェクトの Macro メソッドを使うことで、
マクロとして登録することができる。
'プロジェクトツリーからこのオブジェクト(回転)を右クリックすると、
登録されたマクロがリスト
'され、設定しているプロシージャ等を呼び出すことができる。
'※但し、スクリプト実行中の場合のみ、マクロがリストされる。
' スクリプトが停止している場合は、リストされない。
'
' また、マクロ名を '\' で区切ることで、マクロリストを階層化できるので、
' たくさんのマクロを操作する場合は大変有効である。
' ※1つのクラスモジュールで一度に登録できるマクロ数は20個である。



●下記の様にエクセルが自動的に起動しセルの中に座標値データと線種・線色が
順次書き込まれていきます。



■■■サンプルデータのダウンロード(線出力1.bso 1KB)■■■
●例● 
Excelに全階層の線情報の出力するスクリプト例。
・スクリプトを書き込んである部品以外の部品の
線情報を出力する場合は、下記のようなサンプル
になります。
大きな違いは、下記では全階層を検索する様に
するため
doc.RootObject から繰り返しています。
 また、子オブジェクトがある場合は、その子もナメル様に、
 ExcelOut() を再帰呼出しています。
再帰呼出については、VBScriptに限った事ではなくて、プログラム上の基本テクニックとして、昔からある方法です。
 アルゴリズムの解説書やプログラムテクニックなど、多数の 関連書籍で紹介されていると思います。再帰呼出を使うことで、
 階層化構造を簡単に順次サーチできます。

Dim xl
Dim row

Sub Out
Set xl = CreateObject ("Excel.Application")
xl.Visible = True
xl.WorkBooks.Add

xl.Cells (1, 1).Value = "x1"
xl.Cells (1, 2).Value = "y1"
xl.Cells (1, 3).Value = "x2"
xl.Cells (1, 4).Value = "y2"
xl.Cells (1, 5).Value = "線種No"
xl.Cells (1, 6).Value = "線色"

row = 2
ExcelOut (
doc.RootObject)
       '^^^^^^^^^^^^^^
'これを sym に置き換えると、自分を含め、全ての子部品
' (子・孫等も含む)のみをナメル様にできます。
End Sub

Sub ExcelOut(obj)
Dim item
For Each item In obj
If item.ID = otSymbol Then

ExcelOut (item) '←子部品が見つかったので再帰呼出で、
' 処理させる。
ElseIf item.ID = otLine Then

xl.Cells (row, 1).Value = item.x1
xl.Cells (row, 2).Value = item.y1
xl.Cells (row, 3).Value = item.x2
xl.Cells (row, 4).Value = item.y2
xl.Cells (row, 5).Value = item.Style
xl.Cells (row, 6).Interior.Color = item.Color
row = row + 1

End If
Next
End Sub

sym.Macro "Out", "Excelに全階層の線情報の出力"


■■■サンプルデータの
ダウンロード(座標表示1.bso 1KB)■■■
例2● 
各点の座標値のデータ画面表示サンプル例。
※閉塞された線データを100点まで0点から座標値を順次表示し そのあと順番に各線データを緑色に表示する。

Sub SearchRange2
Dim item , range, i, count, x(100), y(100)
Set range = sym.Range ("First")
'sym.Range ("First")で、▲▲▲名前に"First"が付く線が、
'1本目の線として扱われます。
'※線・円・文字・点の各々オブジェクトに名前を付けられます。要素の上で左ボタン・下ドラッグ・他方クリックで、プロパティメニューで 名前を作成できます

count = range.Count

For i = 0 To count
range.SetReadPoint (i)
x(i) = range.x
y(i) = range.y
MsgBox "点No i =(" & i & ") x座標値=(" & x(i) & ") y座標値=(" & y(i) & ")"
Next

For Each item In range
If item.ID = otLine Then
item.Color = vbGreen '←緑色
End If

doc.ReDraw

MsgBox " next "
Next

End Sub

sym.Macro "SearchRange2", "各点座標値表示&連続化線確認"