1. 概要
直線、閉じていないPolyline(折れ線)はコネクターの役割を果たす。
図1.1の矢印付き直線とPolylineは全てコネクターである。
接続点はConnectionオブジェクトで表す。
Connectionオブジェクトは、ターゲットとコネクター図形のフィールド、
接続点の位置を表すコネクターの曲線パラメータ、ターゲット図形境界の曲線パラメータのフィールドを持つ。
コネクターが接続しているターゲット図形が移動∙ リサイズされたり、
変形された場合、コネクターマネージャ
(ConnectionUtil) がコネクターの端点を動かし、
ターゲット図形との接続を保持する処理を行う。
1.1 コネクターを図形境界に接続
コネクターの端点をマウスドラッグで動かし、他の図形の境界に近づけると、接続候補点として赤/青のマークが表示される。このマークが表示されている間にマウスボタンを離すと、コネクターはターゲット図形境界に正確に接続する(下図)。
=> コネクターを接続(MoveResizeShapeLS), ConnectionLS 概要, 操作説明書
コネクター
図1.1 サンプル図形
1.2 接続関係の保持
コネクターの接続している図形を移動, リサイズすると、コネクターの端点が移動し接続を保持する。
図1.2 移動∙リサイズに対するコネクター接続の保持
図1.1の楕円を左に移動。コネクターの接続(赤いマーク)は保持される
図1.3 移動∙リサイズに対するコネクター接続の保持
"keyboard"ボックスを下へ動かすと、矢印のコネクター2本が追随して動くと同時に、
コネクターに接続する点線の矢印の端点も動いて接続を保持する(図(a)、(b))。すなわち、ターゲット図形を動かすと、
それに接続するコネクターが動き、さらにそのコネクターに接続するコネクターも動く。
図(c)、(d)は極端な例で、上の2つのボックスを接続するコネクターにさらにコネクターが接続し、
さらにそれにコネクターが接続するような構造である。ターゲット図形を動かすと、
順次コネクターの端点を動かし接続を保持する(図(d))。
カラーマークは接続点で、ターゲット図形からの距離(グラフとして)でデバッグのため色を変えている。
1.3 Auto tracking option of connectors
戻る=>page top
コネクターマナージャ(ConnectionUtilオブジェクト)が
コネクターの端点を動かすとき、コネクターの方向に条件をつけることができる(auto tracking オプション)。
∙ free direction and free position: コネクターーの方向を自由に変更できる。
∙ keep x/y direction and position: x方向コネクターとy方向コネクターの方向は変えない。
図1.4 は矩形が下へ動かされたとき、
コネクターの端点と方向がどのように変更されるかを示す例である。
図1.5 、図1.6はブロックダイアグラム、
フローチャートなどの典型的例である。水平、垂直コネクターはその方向を変えない、
などのオプションが使えるので、作業が非常に楽になる。
元の図形 矩形を下へ動かす |
(a)オプション: free direction and free position コネクターの方向は自由に変わる
|
(b) オプション: keep x/y direction and position x,y方向コネクターは方向を変えない
|
(b) オプション: keep x/y direction and position
さらに大きく動かすと、x方向直線では接続できなくなるので折れ線に変わる。
|
図1.4 コネクターの"auto tracking"オプション
元の図形
|
最上段の矩形を上に動かすとコネクターは方向を変える。
(a)オプション: free direction and free position
|
|
最上段の矩形を上に動かしてもコネクターは方向を変えない。直線で結べない場合は、折れ線で結ぶ。
(b) オプション: keep x/y direction and position
|
コネクターを動かすと、それに接続するコネクターが全て方向を変える。
(a)オプション: free direction and free position
|
|
コネクターを動かしても、それに接続するコネクターの方向は変わらない。
(b) オプション: keep x/y direction and position
|
図1.5 "auto tracking"オプション使用法の典型的例
元の図形
|
右端の矩形を下に動かすとコネクターは方向を変える。
(a)オプション: free direction and free position
|
|
右端の矩形を下に動かしてもコネクターは方向を変えない。大きく動かすと、折れ線に変わる。
(b) オプション: keep x/y direction and position
|
図1.6 "auto tracking"オプション使用法の典型的例
2. Connectionクラス
戻る=>page top
接続関係のデータを保持するクラス。
接続点の位置を(x,y)で表す代わりに、パラメトリック曲線の曲線パラメータtで表す。
図形を相似的に変形(移動、リサイズ)しても接続点の曲線パラメータ値は変化しないので処理が簡単になる。
フィールド
|
説明
|
target
|
public ShapeContainer target=null
ターゲット図形
|
connector
|
public ShapeContainer connector=null
コネクター図形
|
targetParameter
|
public double targetParameter
接続点のターゲット図形上での曲線パラメータ値
|
connectorParameter
|
public double connectorParameter
接続点のコネクター図形上での曲線パラメータ値
|
メソッド
|
説明
|
コンストラクタ
|
public Connection(ShapeContainer connector, ShapeContainer target,
double connectorParameter, double targetParameter)
引数を対応するフィールドに設定する。
|
getTarget
|
public ShapeContainer getTarget()
フィールド変数targetを返す。
|
getConnector
|
public ShapeContainer getConnector()
フィールド変数connectorを返す。
|
getTargetParameter
|
public double getTargetParameter()
フィールド変数targetParameterを返す。
|
getConnectorParameter
|
public double getConnectorParameter()
フィールド変数connectorParameterを返す。
|
getTargetPT
|
public Point2D getTargetPT()
接続点のターゲット図形上の位置を返す。
|
getConnectorPT
|
public Point2D getConnectorPT()
接続点のコネクター位置を返す。
|
getTargetTangent
|
public Vector2D getTargetTangent()
接続点のターゲット図形上の接ベクトルを返す。
|
getConnectorTangent
|
public Vector2D getConnectorTangent()
接続点のコネクター図形上の接ベクトルを返す。
|
equalsInNormalData |
public boolean equalsInNormalData(Connection connection)
引数:
connection - 比較されるConnectionオブジェクト。.
処理:
このオブジェクトと引数connectionのフィールド変数を比較し一致すればtrueを返す。 |
equalsInReversedData |
public boolean equalsInReversedData(Connection connection)
引数:
connection - The Connection object to be compared.
処理:
このオブジェクトと引数connectionのフィールド変数を比較し一致すればtrueを返す。
比較はこのオブジェクトのconnector, connectorParameterフィールドとconnectionオブジェクトのtarget, targetParameterフィールドを比較。またはこのオブジェクトのtarget, targetParameterフィールドをconnectionオブジェクトのconnector, connectorparameterフィールドを比較する。 |
getErrorDistance |
public double getErrorDistance()
ターゲット図形上の点とコネクター端点の距離を返す。コネクターの接続が確定した後の誤差はほぼゼロ(計算機丸め誤差)。 |
closeToMouseHitShape |
private boolean closeToMouseHitShape(MouseHitShape mouseHitShape)
引数:
mouseHitShape - MouseHitShapeオブジェクト。
マウス位置情報と、ヒットした図形(ShapeContainerオブジェクト)を保持している。
戻り値:
もしこのオブジェクトのターゲット(target)がヒットした図形と同じで、
ヒット位置(マウス位置)がコネクターconnectorの端点に近ければtrueを返す。
=>
The problem of connector
引数connectionオブジェクトに保持されているターゲット図形が、フィールド変数
mouseHitShapeに一致するときが問題。
この場合ターゲット図形の端点にコネクターが接続しているときtrueを戻り値で返す。
なおendPTindexが0の時はmouseHitShapeの始点、1の時は終点にマウスが位置していることを示す。
処理は簡単で次のように行う
∙ 引数connectionオブジェクトからターゲット図形を取り出し、mouseHitShapeと比較。一致すると次のステップを実行する。
∙ mouseHitShapeのendPTindexが示す端点と、connectionオブジェクトのターゲット図形と
その曲線パラメータからターゲット図形のコネクター接続点との距離を計算。
この距離が一定以下(現在4ピクセル)ならば、コネクターはターゲット図形の端点に接続していると判定し、
戻り値でtrueを返す。
|
resizeConnector
|
private void resizeConnector(Point2D oldPoint, Point2D newPoint)
引数:
oldPoint - コネクター端点の現在点。
newPoint - コネクター端点の変更点。
処理:
コネクターの端点を動かして完全にターゲット図形上に乗るようにする。
このため図形要素のShapeElement.moveEndpointメソッドを呼ぶ。
|
resizeTarget |
private void resizeTarget(Point2D oldPoint, Point2D newPoint)
引数:
oldPoint - ターゲット図形端点の現在点。
newPoint - ターゲット図形端点の変更点。
処理:
ターゲット図形の端点を動かして、ガイドラインに乗るようにする。
このため図形要素のShapeElement.moveEndpointメソッドを呼ぶ。
|
toString
|
public String toString()
Connectionの文字列表現を作成する。
|
isConnectorType
(static)
|
private static boolean isConnectorType(ShapeContainer connector)
コネクターで指示されるShapeContainerがコネクターの資格を有するかをチェック。
|
isTargetType
(static)
|
private static boolean isTargetType(ShapeContainer target)
targetで指示されるShapeContainerがtargetの資格を有するかをチェック。
|
3. ConnectionUtilクラス
戻る=>page top
ターゲット図形をこのオブジェクトに登録すると、それに接続するコネクターを全てリストアップしてこのオブジェクトに登録する。
ターゲット図形を移動∙リサイズしたとき、それに接続するコネクターの端点を移動して接続を保持する処理はこのクラスの
resizeConnectorsメソッドを呼ぶだけで実行できる。
現在のところ、図形の移動/リサイズを行うクラスMoveResizeLSと、
図形の変更を行うクラスModifyShapeLSで使われる。
フィールド
|
説明
|
mousePositionInfo
|
MousePositionInfo mousePositionInfo
MoveResizeShapeLSから渡されたMousePositionInfoを設定する。
|
selectedContainers
|
ShapeContainer[] selectedContainers
MoveResizeShapeLSのフィールド変数selectedContainersが設定される。
selectedContainersはmove, resize, move_endPTの対象となる図形である。
|
auto_tracking_option |
int auto_tracking_option
DrawParameters.CONNECTOR_AUTO_TRACKING_OPTION をこのフィールドに設定 |
connected |
public boolean connected
コネクターの端点を動かし図形境界に接続したときにtrueになる
(図形の移動/リサイズ 図2.1, 2.2)。
|
guided |
public boolean guided
コネクターの端点がガイドラインに乗っているときtrueになる
(図形の移動/リサイズ 図1.6)。
|
targets |
ShapeContainer[] targets
移動、リサイズ対象の図形を格納した配列。setTargetsメソッドの引数で指定される。
|
TargetList
|
Vector TargetList
ターゲット図形をTargetContainerオブジェクトに設定して登録する。
|
ConnectionList
|
Vector ConnectionList
ターゲット図形と接続するコネクターとの接続点情報(Connectionオブジェクト
をConnectionContainer オブジェクトに設定して登録する。
Connectionオブジェクトには、ターゲット図形とコネクター図形、および接続点の曲線パラメータ値を格納している。
これらのデータを使い、ターゲット図形からコネクターを検出できる。またターゲット図形が変形(相似変換)されたときに、
接続点の座標を曲線パラメータ値を使って計算し、コネクターをリサイズする。
|
mouseHitShape |
ShapeContainer mouseHitShape
図形の移動リサイズをするときにマウスボタンを押した図形。 |
vector
|
Vector vector:作業用
|
<メソッド
|
説明
|
start |
public void start(int mode, MousePositionInfo mousePositionInfo, ShapeContainer[]
selectedContainers)
• 引数を対応するフィールド変数にセット。
• このクラスの setTargets メソッドを呼ぶ。
:
このメソッドはMoveResizeShapeLS.initメソッドが
複雑になるのを避けるために用意した。
このメソッドは MoveResizeShapeLS.initメソッドから呼ばれる。
|
end |
public void end()
|
mouseDragged |
public void mouseDragged(MouseEvent e)
• コネクター(直線、折れ線)の端点を動かす。
コネクターの端点が図形境界に接続できるかどうかをチェックする。
接続できたらconnectedフィールド変数をtrueにする
(図形の移動/リサイズ 図2.1, 2.2)。
• 図形を動かしたとき、それに接続するコネクターを変形して接続を保持する。
このクラスのresizeConnectorsメソッドを呼ぶ。
:
このメソッドはMoveResizeShapeLS.mouseDraggedメソッドが
複雑になるのを避けるために用意した。
このメソッドはMoveResizeShapeLS.mouseDraggedメソッドから呼ばれる。
|
mouseReleased |
public void mouseReleased(MouseEvent e)
• mode=Command.MOVING_ENDPT_MODEの場合
connectedフィールドをチェック。
trueでなければこのクラスのresizeConnectorsメソッドを呼ぶ。
trueの場合、端点を動かしているコネクターは他の図形に接続している。したがって
• mode=Command.MOVE__MODE/RESIZE__MODEの場合
無条件にresizeConnectorsメソッドを呼ぶ。
:
このメソッドはMoveResizeShapeLS.mouseReleasedメソッドが
複雑になるのを避けるために用意した。
このメソッドは MoveResizeShapeLS.mouseReleasedメソッドから呼ばれる。
|
setTargets
|
public void setTargets(ShapeContainer[] targets)
引数:
targets - MoveRsizeShapeLSやModifyShapeLSなどで移動∙ リサイス∙ 変形対象となるターゲット図形の配列。
処理:
Move, resizeの対象となるターゲット図形およびその図形に接続するコネクターを登録する。
∙ ターゲット図形がグループの場合、その子要素も含めて全てリストアップし、TargetListに登録する。
∙ つぎのsetConnectorsメソッドで、ターゲット図形に接続するコネクターとの接続情報を
ConnectionListに登録する。
=>
Depth, TargetList, ConnectionList
|
setConnectors
|
private ShapeContainer[] setConnectors(int depth, ShapeContainer[]
targetElements)
引数:
depth - 引数 targetElementsのdepth(図3.1)。
targetElements - この図形に接続するコネクターを探索する。
戻り値:
targetElementsに接続するコネクターを返す。
処理:
setTargetsから呼ばれる。findConnectorsを
使ってターゲット図形に接続するコネクターを検出する。
findConnectorでなコネクターの資格のある全ての図形(直線、折れ線)の端点と、
ターゲット図形の最短点計算を行い、近ければコネクターと見なして接続情報
(Connectionオブジェクト)を
ConnectionContainerオブジェクトに設定して
ConnectionListに登録する。
フィールド変数mouseHitShapeがnullでないときは、次の処理を行う。
∙ mousePTでmouseHitShapeの動かされる端点が始点か終点なのかを決定。
∙ findConnectorsメソッドで検出したコネクターに対して次の処理
コネクターの接続点がmousePT側の端点の場合、コネクターとの接続オブジェクトConnectionを
ConnectionListへの登録を行わない。
つまりmouseHitShapeのmousePT側の端点に接続するコネクターとは接続関係を切る。
=>
Depth, TargetList, ConnectionList
|
findConnectors
(static)
|
public static Connection[] findConnectors(ShapeContainer target)
引数:
target - ターゲット図形
戻り値:
targetに接続するコネクターとのConnectionオブジェクト
処理:
このメソッドはsetConnectorsメソッドから呼ばれる。
このメソッドは存在するコネクターの全てについて、その端点が
ターーゲット図形の境界に乗っているかどうかをテストする(誤差1/100ピクセル)。
このテストを実行するため高精度最短点計算メソッド
Curve2DUtil.getShortestLineを使う。
|
setGuideLines |
private void setGuideLines()
このメソッドは setTragets から呼ばれる。
このメソッドは、TargetListのdepth-0のターゲットに対し、
そのガイドラインを検出する(図1.6)。
ガイドライン検出はCurve2DUtilの
getShortestLineメソッドを使う。
もしガイドラインが見つかれば、ターゲットとガイドラインの接続点を表す
Connectionを作成し、"guide_line"のidも持つ
ConnectionContainerに設定して
ConnectionListに登録する。
|
printTargerList |
private void printTargerList(String message)
TargetListをプリントする。 |
printConnectionList |
private void printConnectionList(String message)
ConnectionListをプリントする。 |
getTargets
|
private ShapeContainer[] getTargets(int depth)
引数:
depth - TargetListから
取り出すターゲットのdepth(図1.3)。
戻り値:
TargetListに属する
ShapeContainerオブジェクトでそのdepthが引数のdepthに一致するものを返す。
|
getTargetIndex |
private int getTargetIndex(ShapeContainer target, int depth)
引数:
target - 移動/リサイズされる図形 (ShapeContainer オブジェクト)。
depth - targetのdepth(図1.3)。
戻り値:
戻り値 the index of the target of the depth in the TargetList.
|
getConnection
Containers |
private ConnectionContainer[] getConnectionContainers(String id, int depth,
ShapeContainer target, ShapeContainer connector)
引数target, connectorをフィールド変数とするConnectionオブジェクトを持つConnectionContainerオブジェクトをConnectionListから検索して返す。
引数:
id - ConnectionContainerにつける文字列のid。現在のところ"connector"か "guide_line" を設定する。
depth - 検索対象depth(図1.3)。depth<0ならば全てのdepthのConnectionContainerオブジェクトが対象。
target - Connectionオブジェクトのtargetと比較する ShapeContainerオブジェクト。
connector - Connectionオブジェクトのconnectorと比較する ShapeContainerオブジェクト。
(注) 引数target, connectorのどちらか一方はnullであっても良い。
戻り値:
ConnectionContainerオブジェクト。
|
getConnection
Containers |
private ConnectionContainer[] getConnectionContainers(String id, ShapeContainer
target, ShapeContainer connector)
処理:
上のメソッドを次のように呼ぶ。
return getConnectionContainers(id, -1, target, connector);
|
getSameConnection
Container |
private int getSameConnectionContainer(ConnectionContainer connectionContainer)
引数:
connectionContainer - ConnectionContainerオブジェクト。
戻り値:
ConnectionListのインデックスを返す。
該当するオブジェクトがなければ-1を返す。
処理:
引数のオブジェクトに含まれるConnectionオブジェクト(connection)とConnectionList内のオブジェクトに含まれるConnectionオブジェクト(testConnection)を次のように比較する。
if(connection.equalsInNormalData(testConnection)||
connection.equalsInReversedData(testConnection))
|
getConnectors |
private ShapeContainer[] getConnectors(String id)
ConnectionListからidに一致する
ConnectionContainerを取り出し、そのコネクターを配列で返す。
|
getTargetsAnd
Connectors |
public ShapeContainer[] getTargetsAndConnectors()
コネクターとターゲット図形を配列で返す。
|
resizeConnectors
|
public void resizeConnectors(int option)
引数:
option - Command.FREE_DIRECTION,
KEEP_XY_DIRECTION,
KEEP_DIRECTION or
TO_NEAREST_PT
処理:
ターゲット図形が変形されたときに、コネクターの端点を動かしてターゲット図形との接続を保持する。
引数optionに応じてConnectionクラスの
resizeConnectorByCurveParameter,
resizeConnectorKeepingDirection,
resizeConnectorToNearestPTのどれかのメソッドを呼ぶ。
|
resizeConnectors
|
private void resizeConnectors(int option, int depth, ShapeContainer[]
connectors)
引数:
option - Command.FREE_DIRECTION, KEEP_XY_DIRECTION, KEEP_DIRECTION or TO_NEAREST_PT
depth - リサイズされるコネクターのdepth.
connectors - リサイズされるコネクター (ShapeContainerオブジェクト).
処理:
このメソッドはoptionに従い、Connectionオブジェクトの
resizeConnectorByCurveParameter,
resizeConnectorKeepingDirection または
resizeConnectorToNearestPTメソッドを呼ぶ。
|
resizeConnectorBy
CurveParameter
|
public void resizeConnectorByCurveParameter()
ターゲット図形を移動∙ リサイズする場合に、コネクターの端点をターゲット図形に追随させるために使う。
ターゲット図形の曲線パラメータから位置を計算し、その位置に一致するようにコネクターの端点を動かす。
これはターゲット図形を移動∙ リサイズする際に接続点のターゲット曲線パラメータ値は変化しない性質を利用しており、
処理は単純化できる。
|
resizeConnectorTo
NearestPT
|
public void resizeConnectorToNearestPT()
このメソッドはConnectionUtilクラスの
resizeConnectorsメソッドから呼ばれる。
ターゲット図形が折れ線で、折れ線(Polyline)の節点を削除する場合、
ターゲット曲線パラメータ値は変わってしまうため、resizeConnectorByCurveParameter メソッドは使えない。
このメソッドではターゲット図形上の接続候補点をShapeElement.getSamplingCurvePTsで取得し、
接続候補点の中から最も近い点を選び、コネクター端点を動かす。
(注)接続点位置自体が変わるのだから、
Connection情報のターゲット曲線パラメータ値を更新する必要がある。
|
resizeConnector
KeepingDirection |
public void resizeConnectorKeepingDirection (ConnectionContainer connectionContainer)
引数:
connectionContainer - ConnectionContainerオブジェクト。
処理:
このメソッドはConnectionUtilクラスの
resizeConnectorsメソッドから呼ばれる。
このメソッドはコネクター線分の端点を、その線分の延長線上に動かす。
このため線分の延長線とターゲット図形境界との交点をprojectionPTメソッドで求める。
交点がなければ直線コネクターを折れ線コネクターに変える。
コネクターのリサイズはこのクラスのresizeConnectorメソッドで行う。
|
projectionPT |
private CurvePT[] projectionPT(Point2D p, Vector2D vec, Curve2D targetCurve)
引数:
p - 作成する線分の通過点
vec - 作成する線分の方向ベクトル
targetCurve - ターゲット図形の境界線
戻り値:
CurvePTオブジェクトで、コネクターの端点をコネクター方向に射影したターゲット図形上の点
(コネクターの延長線とターゲット図形との交点)。射影点はターゲット図形境界線上の点として表す。
処理:
Curve2DUtilの
getProjectionLinesメソッドで
pをtargetCurveに射影した点を計算する。
|
selectCurvePT |
private CurvePT selectCurvePT(ConnectionContainer connectionContainer,
CurvePT[] curvePTs)
引数:
connectionContainer - ConnectionContainerオブジェクト
curvePTs - projectionPTの戻り値(射影点)。
戻り値:
選択された射影点。
処理:
上の図で、vec方向の距離を計算し、pに最も近い射影点を返す。
|
isChangable |
private boolean isChangable(ShapeContainer connector)
引数:
connector - コネクター
戻り値:
直線コネクターを折れ線コネクターに変形できるときtrue、
また折れ線コネクターを直線コネクターに変形できるときtrueを返す。
処理:
次のルールで判定する。
∙ 元々折れ線だったコネクターを直線コネクターに変形することは無い。
∙ x/y方向直線コネクターは折れ線コネクターに変形できる。
∙ x/y方向直線コネクターを変形した折れ線コネクターは、直線コネクターに変形できる。
(a)元の図形
楕円を上下に動かす |
(b)直線コネクターが折れ線コネクターに変形 |
(c)楕円を上に動かすと折れ線コネクターが直線コネクターに戻る |
(c)楕円をさらに上に動かすと、再度直線コネクターが折れ線コネクターに変形する |
|
changeToPolyline
Connector |
private void changeToPolylineConnector(ConnectionContainer connectionContainer)
引数:
connectionContainer - ConnectionContainerオブジェクト
処理:
直線コネクターを折れ線コネクターに変換する。
|
changeTo
LineConnector |
private void changeToLineConnector(ConnectionContainer connectionContainer,
CurvePT curvePT)
引数:
connectionContainer - ConnectionContainerオブジェクト
curvePT - 直線コネクターに変更したときのターゲット図形の接続点。
処理:
折れ線コネクターを直線コネクターに変換する。
折れ線コネクターから上図のように延長線(点線)を引きprojectionPTメソッドで交点(射影点、curvePT)を求める。 |
折れ線コネクターを直線コネクターに変換 |
|
resizeTargetsBy
GuideLines |
public boolean resizeTargetsByGuideLines()
TargetList 内のdepth-0のターゲットを、
ガイドラインに沿って移動、リサイズする。
移動、リサイズはresizeTargetKeepingDirection メソッドで行う。
ガイドラインに沿って移動、リサイズしたときtrueを返す。
|
resizeConnector
KeepingDirection |
public boolean resizeTargetKeepingDirection(ConnectionContainer connectionContainer)
引数:
dirVec - コネクターの延長方向を指示するベクトル。
戻り値:
ターゲット図形のリサイズが成功した場合trueを返す。もしターゲット図形端点をdirVec方向に投影した点が、
コネクター線上になければfalseを返す。当栄転があるときはtrueを返す、
処理:
resizeConnectorKeepingDirectionと同様の処理を行う。 |
selectCurvePT |
private CurvePT selectCurvePT(Point2D p, Vector2D unitDir, CurvePT[] curvePTs)
引数:
p - 作成する線分の通過点
vec - 作成する線分の方向ベクトル
targetCurve - ターゲット図形の境界線
戻り値:
選択された射影点。
処理:
projectionPTメソッド の図で、vec方向の距離を計算し、
pに最も近い射影点を返す。前述のselectCurvePTとは計算方法が少し異なる。
|
end
|
public void end()
コネクターのリサイズ処理終了を宣言する。clearMarkメソッドで接続点(赤マーク)の画面への表示を停止する。
|
isXOrYvector |
private int isXOrYvector(Vector2D vec)
戻り値
vecが水平方向ベクトルならば1、垂直方向ベクトルならば2を、それ以外は0を返す。
|
drawMark |
private void drawMark(String id, String message, Connection connection)
引数で指定されるConnectionオブジェクトの位置に赤マークを表示する。
D表示はDrawShapeUtilの
drawTempShapeメソッドで行う。
|
drawMarks
|
private void drawMarks(String id, String message)
ConnectionList
に格納されているコネクターとターゲット図形の接続点を赤マークで表示する。
DrawShapeUtil.drawTempShapeメソッドを使う。
表示するマークはTempShapeオブジェクトを作成する時に指定する。
|
clearMark
|
private void clearMark()
DrawPanelクラスのclearTempShapeを呼んで、TempShapeオブジェクトを格納しているリストをクリアする。
|
moveResize
(static)
|
public void resizeContainer(ShapeContainer container, Rectangle2D oldBox,
Rectangle2D newBox, boolean keepConnection, boolean undoSetup)
引数:
container - リサイズされる図形コンテナ (ShapeContainer)。
oldBox - リサイズ前の矩形。
newBox - リサイズ後の矩形。
keepConnection - trueならば、リサイズするcontainerに接続するコネクターもリサイズして接続を保持する。
falseならばcontainerだけリサイズする。
undoSetup - trueならばundoの設定を行う。falseならばしない。
処理:
oldBox、newBoxを指定することにより図形のリサイズを行う。
このメソッドは ShapeElement.moveResize メソッドを呼んで処理する。
oldBoxとnewBoxの幅、高さが等しい場合は、図形の移動になる。
oldBoxとnewBoxは必ずしも図形を囲むBoundingBoxでなくとも良い。
例えばnewBoxの幅がoldBoxの2倍ならば、図形は横方向に2倍に拡大される。keepConnection=trueを指定すれば、
接続するコネクターのリサイズも行う。
:
このメソッドはマウスドラッグによらず、直接、図形を移動/リサイズする場合に使う。
|
moveEndPoint
(static)
|
public static void moveEndPoint(ShapeContainer container, int movePtIndex,
Point2D oldPoint, Point2D newPoint, boolean keepConnection, boolean undoSetting)
Parameters:
container - 端点を移動される直線、折れ線要素を格納する図形コンテナ。
movingPtIndex -movingPtIndexが0ならば始点を、0でなければ終点を動かす。
oldPoint - 動かす点の現在点。
newPoint - 移動先の点。
keepConnection - trueならば、リサイズするcontainerに接続するコネクターもリサイズして接続を保持する falseならばcontainerだけリサイズする。
undoSetup - trueならばundoの設定を行う。falseならばしない。
Processing:
直線、折れ線の端点を動かす。このメソッドは
ShapeElement.moveEndPointを呼んで処理する。
:
このメソッドはマウスドラッグによらず、直接、端点を移動する場合に使う。
|
:
Depth, TargetList, ConnectionList
下図は外側のRound rectangle-1のNW(North West)を右上に動かしリサイズするときの様子を示す。
カラーマークは接続点(Connection)でカラーはdepthを示す。また接続点で結ばれている図形のdepthは下のリストを参照のこと。
Round Rectangle-1のリサイズ開始 |
NWリサイズマークを右上に移動 |
図3.1 epth, TargetList, ConnectionList |
TargetListとConnectionList
* TargetList
-- target=Round_Rectangle(No-1), depth=0
-- target=Line(No-2), depth=1
-- target=Line(No-3), depth=1
-- target=Line(No-4), depth=1
-- target=Line(No-5), depth=1
-- target=Line(No-6), depth=1
-- target=Line(No-5), depth=2
-- target=Line(No-6), depth=2
-- target=Line(No-7), depth=2
-- target=Line(No-8), depth=2
-- target=Line(No-9), depth=3
-- target=Line(No-10), depth=3
-- target=Line(No-11), depth=4
* ConnectiontList
-- connection[0]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-2),
targetP=0.069, connectorP=0.0
-- connection[1]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-2),
targetP=4.931, connectorP=1.0
-- connection[2]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-3),
targetP=0.265, connectorP=0.0
-- connection[3]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-3),
targetP=4.735, connectorP=1.0
-- connection[4]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-4),
targetP=0.998, connectorP=0.0
-- connection[5]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-4),
targetP=4.002, connectorP=1.0
-- connection[6]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-5),
targetP=6.711, connectorP=0.0
-- connection[7]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-6),
targetP=6.262, connectorP=0.0
-- connection[8]: depth=1, target=Line(No-2), connector=Line(No-5), targetP=0.342,
connectorP=1.0
-- connection[9]: depth=1, target=Line(No-2), connector=Line(No-6), targetP=0.679,
connectorP=1.0
-- connection[10]: depth=1, target=Line(No-3), connector=Line(No-7), targetP=0.289,
connectorP=0.0
-- connection[11]: depth=1, target=Line(No-3), connector=Line(No-8), targetP=0.727,
connectorP=0.0
-- connection[12]: depth=2, target=Line(No-7), connector=Line(No-9), targetP=0.275,
connectorP=0.0
-- connection[13]: depth=2, target=Line(No-7), connector=Line(No-10), targetP=0.784,
connectorP=0.0
-- connection[14]: depth=2, target=Line(No-8), connector=Line(No-9), targetP=0.275,
connectorP=1.0
-- connection[15]: depth=2, target=Line(No-8), connector=Line(No-10), targetP=0.784,
connectorP=1.0
*) targetP と connectorP は接続点のtargetと connector上での直線/曲線パラメータを表す。 |
接続の問題点:
4本の直線を端点どうしで接続。端点を動かしても、接続している直線はコネクターとして振る舞い、
自動的に端点位置を変えて接続を切れない。4本の直線が折れ線のように振舞う(図(a),(b))。
一方、端点どうしが接続していなければ、コネクターの端点を動かせば簡単に接続を切ることができる(図(c),(d))。
またコネクターが閉図形に接続している場合には、図(c),(d)の場合と同様に接続を切ることができる。
操作上はコネクターの端点を動かせば接続を切れるほうが自然である。
したがって図(a),(b)のようにコネクターの端点同士が接続している場合に、
その端点を動かした場合にはコネクターの接続を切るようにする。
但し端点ではなく線上にマウスを置いてドラッグした場合は、直線の移動なのでコネクターの接続は切らない。
図(a)4本の直線を端点で接続
|
図(b)直線の端点を移動
下側の直線を選択し、左下の点をマウスドラッグで動かす。左側の直線はコネクターなので接続が切れない。
|
図(c)2本の直線の端点を他の直線に接続
|
図(d)直線の端点を移動
左側の直線を選択し、左上の点をマウスドラッグで動かすと、簡単に接続は切れる。
|
4. TargetContainerクラス
戻る=>page top
このオブジェクトは ShapeContainerオブジェクトにdepthをつけて格納する。
Method
|
Description
|
Constructor |
public TargetContainer(int depth)
引数をdepthに設定する。
|
getDepth
|
public int getDepth()
depthを返す。
|
getContainer
|
public ShapeContainer getContainer()
containerを返す。
|
5. ConnectionContainerクラス
戻る=>page top
このオブジェクトはConnectionと補助情報を設定する。
フィールド変数connectionは直線コネクターが折れ線コネクターに変化したり、逆に折れ線コネクターが直線コネクターに変化するので、コネクターのリサイズの過程で変化する
(=> changeToPolylineConnector,
changeToLineConnector メソッド)。
一方、フィールド変数initConnectionはコネクターの初期状態を記録しており変化しない。
フィールド
|
説明
|
id |
String id
文字型の識別子で、現在"connector"と"guide_line"が使われる。
|
depth
|
int depth
移動、リサイズ、変更される図形からのツリー構造での距離。
|
connection |
Connection connection
現在のConnectionオブジェクト。 |
initialConnection
|
Connection initialConnection
ターゲット図形を移動/リサイズを始める前のConnectionオブジェクト。
|
メソッド
|
説明
|
Constructor |
public ConnectionContainer(String id, int depth, Connection connection)
引数を対応するフィールドに設定する。initialConnectionに引数connectionのクローンを設定する。 |
getId |
public String getId()
idを返す。 |
getDepth |
public int getDepth()
depthを返す。 |
getConnection |
public Connection getConnection()
connectionを返す。 |
getInitConnection |
public Connection getInitConnection()
initialConnectionを返す。 |
toString |
public String toString()
このオブジェクトを表す文字列を返す。
|
|