Java Drawing DrawTop

Language

JP  US  UK

 

コネクター

 H. Jyounishi, Tokyo Japan
 

Frame (Index), No frame                 version:0.3(latest)  

要旨:DrawProtoでは直線と折れ線は2つの図形をつなぐコネクターとしても使える。 直線、折れ線の端点を動かして他の図形に近づけたとき、一定以下の距離になるとその図形に接続する。

このページで説明するクラス: Connection, ConnectionUtil, TargetContainer, ConnectionContainer

1. 概要
直線、閉じていないPolyline(折れ線)はコネクターの役割を果たす。 図1.1の矢印付き直線とPolylineは全てコネクターである。
接続点はConnectionオブジェクトで表す。 Connectionオブジェクトは、ターゲットとコネクター図形のフィールド、 接続点の位置を表すコネクターの曲線パラメータ、ターゲット図形境界の曲線パラメータのフィールドを持つ。
コネクターが接続しているターゲット図形が移動∙ リサイズされたり、 変形された場合、コネクターマネージャ (ConnectionUtil) がコネクターの端点を動かし、 ターゲット図形との接続を保持する処理を行う。

1.1 コネクターを図形境界に接続
コネクターの端点をマウスドラッグで動かし、他の図形の境界に近づけると、接続候補点として赤/青のマークが表示される。このマークが表示されている間にマウスボタンを離すと、コネクターはターゲット図形境界に正確に接続する(下図)。

=> コネクターを接続(MoveResizeShapeLS), ConnectionLS 概要,  操作説明書  コネクター


図1.1 サンプル図形


1.2 接続関係の保持
コネクターの接続している図形を移動, リサイズすると、コネクターの端点が移動し接続を保持する。


図1.2 移動∙リサイズに対するコネクター接続の保持
図1.1の楕円を左に移動。コネクターの接続(赤いマーク)は保持される



図(a)

図(b)

図(c)

図(d)

図1.3 移動∙リサイズに対するコネクター接続の保持

"keyboard"ボックスを下へ動かすと、矢印のコネクター2本が追随して動くと同時に、 コネクターに接続する点線の矢印の端点も動いて接続を保持する(図(a)、(b))。すなわち、ターゲット図形を動かすと、 それに接続するコネクターが動き、さらにそのコネクターに接続するコネクターも動く。 図(c)、(d)は極端な例で、上の2つのボックスを接続するコネクターにさらにコネクターが接続し、 さらにそれにコネクターが接続するような構造である。ターゲット図形を動かすと、 順次コネクターの端点を動かし接続を保持する(図(d))。

カラーマークは接続点で、ターゲット図形からの距離(グラフとして)でデバッグのため色を変えている。


ステップ 説明
ステップ1 コネクターの検出 ターゲット図形を移動/リサイズする前に MoveResizeShapeLSstartメソッドで、 ConnectionUtilsetTargetsメソッドを呼んで、 ターゲット図形と、それに接続するコネクターのリストを作成する。
setTargetsメソッドはターゲット図形のリストを作成し、 ターゲット図形に接続するコネクターを見つけるためにsetConnectorsメソッドを呼ぶ。 さらにsetConnectorsメソッドで見つかったコネクターをターゲット図形として、 再度setConnectorsメソッドを呼んで すでに検出済のコネクターに接続するコネクターを見つける。 この処理を何度か繰り返し、ターゲット図形を移動/リサイズすると影響を受けるコネクターを全てリストアップする。
ステップ2 接続関係の保持 ターゲット図形がMoveResizeShapeLSmouseDraggedで移動/リサイズされている間、 ConnectionUtilresizeConnectorsメソッドを呼び、 コネクターの端点を動かして接続を保持する処理を行う。
ステップ3 後処理 MoveResizeShapeLSendメソッドから ConnectionUtilの後処理メソッドを呼ぶ。

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を返す。
See=> 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 - MoveRsizeShapeLSModifyShapeLSなどで移動∙ リサイス∙ 変形対象となるターゲット図形の配列。
処理:
Move, resizeの対象となるターゲット図形およびその図形に接続するコネクターを登録する。
∙ ターゲット図形がグループの場合、その子要素も含めて全てリストアップし、TargetListに登録する。
∙ つぎのsetConnectorsメソッドで、ターゲット図形に接続するコネクターとの接続情報を ConnectionListに登録する。
See=> 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側の端点に接続するコネクターとは接続関係を切る。
See=> 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)。 ガイドライン検出はCurve2DUtilgetShortestLineメソッドを使う。 もしガイドラインが見つかれば、ターゲットとガイドラインの接続点を表す 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
Curve
Parameter

public void resizeConnectorByCurveParameter()
ターゲット図形を移動∙ リサイズする場合に、コネクターの端点をターゲット図形に追随させるために使う。 ターゲット図形の曲線パラメータから位置を計算し、その位置に一致するようにコネクターの端点を動かす。 これはターゲット図形を移動∙ リサイズする際に接続点のターゲット曲線パラメータ値は変化しない性質を利用しており、 処理は単純化できる。
resizeConnectorTo
Nearest
PT
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オブジェクトで、コネクターの端点をコネクター方向に射影したターゲット図形上の点 (コネクターの延長線とターゲット図形との交点)。射影点はターゲット図形境界線上の点として表す。
処理:
Curve2DUtilgetProjectionLinesメソッドで 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をつけて格納する。
<Field Description
depth int depth
移動、リサイズ、変更される図形からのツリー構造での距離。
container ShapeContainer container
ShapeContainerオブジェクト。

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()
このオブジェクトを表す文字列を返す。


Copyright (c) 2009-2013
All other trademarks are property of their respective owners.