スクリプトを組込んだライトのチップを作成します。
スイッチの紐を引く度に、ライトが点灯・消灯します。
-
[環境の設定]ダイアログを開く。
-
[インタフェース]タブを開き[エキスパートモード]、[スクリプトをデバッグモードで実行する]にチェックを入れる。
-
[チップテーブル]の上でマウスを右クリックし[チップテーブルの編集]コマンドを実行する。
-
[チップテーブルの編集]ダイアログで[追加]ボタンをクリック。
-
[Chip Editor]が起動する。[環境の設定]ダイアログで[エキスパートモード]にチェックを入れる。
-
ランプのイメージを作成する。
-
[A]円弧部品 [B]多角線部品 [C]円弧部品 [D]多角線部品
-
[A]円弧部品の[プロパティ]ダイアログを表示して[ディクショナリー]ページを開く。[数値型ディクショナリー]の[ID]に0、[Value]に0を入力し[設定]ボタンをクリックする。
-
各部品の[数値型ディクショナリー]に以下の値を設定する。
これらの値は、スクリプトの中でチップのメンバー部品を識別するために使われる。
部品 [ID] [Value] [A] 0 0 [B] 0 1 [C] 0 2 [D] 0 3 -
[複合部品チップモード]を選択し、チップを登録して終了する。
-
作成したチップをキャンバスに配置する。
-
配置したチップの[プロパティ]ダイアログを表示し、[スクリプト]タブを開く。[選択する]ボタンをクリック。
-
[スクリプトテーブルの編集]ダイアログが開く。[追加]ボタンをクリック。
-
[スクリプト作成/変更]ダイアログが開く。[スクリプト名]に「ライト」と入力する。
-
[スクリプトテーブルの編集]ダイアログで[スクリプト一覧]の「ライト」が選択されていることを確認。
-
[プロパティ]ダイアログの[スクリプト]タブで「ライト」が設定されていることを確認。
-
メニュー[表示]>[スクリプトデバッガーを表示]をクリック。
-
[Script Debugger]が表示される。
-
メニュー[Edit]>[Edit Script]をクリック。
-
スクリプトの編集が可能になる。
-
以下のコードを入力する。
[ResetHandles]は、編集ツールによる選択など、ハンドルを作成するタイミングで実行されるLuaの関数。ResetHandles = function(session, tool, objId) local chip = Doc():ObjectIdToObject(objId); local membIdArray = chip:GetMemberIdArray(); for i,memberId in ipairs(membIdArray) do local membObj = Doc():ObjectIdToObject(memberId); local dictValue = membObj:GetDoubleDictionary(0); session:DuplicateAndKeepObject(dictValue, memberId); -- [*1] end local pullSwPoint = session:GetKeepedObject(0):GetCenter(); tool:AddHandle(0, false, pullSwPoint); -- [*2] end
ここでは、チップ部品の各メンバーの部品を複製し[*1]、円弧部品[A]の中心座標をハンドルとして登録している[*2]。
詳しくはLuaのリファレンスマニュアル等、 ユーザーズガイド:スクリプト、 API Reference for Luaを参照。 -
スクリプトを保存する。
-
チップをダブルクリックして編集ツールをアクティブにする。円弧部品[A]の位置にハンドルが表示される。
-
ハンドルはドラッグして好きな位置に移動させることができる。
編集ツールから選択ツールに変更する。
-
[Script Debugger]でコードに[*1]、[*2]、[*3]を追加し、保存する。
[OnStartHandleMoving]は、ハンドルの移動を開始したときに実行されるLuaの関数。ResetHandles = function(session, tool, objId) local chip = Doc():ObjectIdToObject(objId); local membIdArray = chip:GetMemberIdArray(); for i,memberId in ipairs(membIdArray) do local membObj = Doc():ObjectIdToObject(memberId); local dictValue = membObj:GetDoubleDictionary(0); session:DuplicateAndKeepObject(dictValue, memberId); end local pullSwPoint = session:GetKeepedObject(0):GetCenter(); tool:AddHandle(0, false, pullSwPoint); tool:AddPolylineHandleRestriction(0, {pullSwPoint,{x=pullSwPoint.x, y=pullSwPoint.y + 10}}); -- [*1] end -- [*2] OnStartHandleMoving = function(session, tool, handleId, objId) tool:HookObject(0, session:GetKeepedObject(0)); end -- [*3] OnHandleMoving = function(session, tool, handleId, objId) if handleId == 0 then local point = tool:GetHandlePoint(handleId); session:GetKeepedObject(0):SetCenter(point); end end
[OnHandleMoving]は、ハンドルを移動している間、連続して実行されるLuaの関数。
[*1]のコードは、ハンドルの移動を線分上に制限する。
[*2]のコードは、円弧部品[A]の複製を描画対象に追加する。
[*3]のコードは、円弧部品[A]の複製を移動させ描画する。
-
ハンドルは、円弧部品[A]から垂直方向の10mm下方までの範囲のみ移動できる。また、円弧部品[A]も追従して移動する。
-
[Script Debugger]でコードに[*1]、[*2]を追加し、保存する。
[*1]のコードは、多角線部品[B]の複製を描画対象に追加する。ResetHandles = function(session, tool, objId) local chip = Doc():ObjectIdToObject(objId); local membIdArray = chip:GetMemberIdArray(); for i,memberId in ipairs(membIdArray) do local membObj = Doc():ObjectIdToObject(memberId); local dictValue = membObj:GetDoubleDictionary(0); session:DuplicateAndKeepObject(dictValue, memberId); end local pullSwPoint = session:GetKeepedObject(0):GetCenter(); tool:AddHandle(0, false, pullSwPoint); tool:AddPolylineHandleRestriction(0, {pullSwPoint,{x=pullSwPoint.x, y=pullSwPoint.y + 10}}); end OnStartHandleMoving = function(session, tool, handleId, objId) tool:HookObject(0, session:GetKeepedObject(0)); tool:HookObject(1, session:GetKeepedObject(1)); -- [*1] end OnHandleMoving = function(session, tool, handleId, objId) if handleId == 0 then local point = tool:GetHandlePoint(handleId); session:GetKeepedObject(0):SetCenter(point); -- [*2] local jointArray = session:GetKeepedObject(1):AsObjPoly():GetJointArray(); jointArray[2].center.y = point.y; session:GetKeepedObject(1):AsObjPoly():SetJointArray(jointArray); end end
[*2]のコードは、多角線部品[B]の複製の終点を移動させ描画する。
-
ハンドルの移動に、円弧部品[A]に加えて多角線部品[B]が追従する。
-
[Script Debugger]でコードに[*1]を追加し、保存する。
[OnStopHandleMoving]は、ハンドルの移動を終了したときに実行されるLuaの関数。ResetHandles = function(session, tool, objId) local chip = Doc():ObjectIdToObject(objId); local membIdArray = chip:GetMemberIdArray(); for i,memberId in ipairs(membIdArray) do local membObj = Doc():ObjectIdToObject(memberId); local dictValue = membObj:GetDoubleDictionary(0); session:DuplicateAndKeepObject(dictValue, memberId); end local pullSwPoint = session:GetKeepedObject(0):GetCenter(); tool:AddHandle(0, false, pullSwPoint); tool:AddPolylineHandleRestriction(0, {pullSwPoint,{x=pullSwPoint.x, y=pullSwPoint.y + 10}}); end OnStartHandleMoving = function(session, tool, handleId, objId) tool:HookObject(0, session:GetKeepedObject(0)); tool:HookObject(1, session:GetKeepedObject(1)); end OnHandleMoving = function(session, tool, handleId, objId) if handleId == 0 then local point = tool:GetHandlePoint(handleId); session:GetKeepedObject(0):SetCenter(point); local jointArray = session:GetKeepedObject(1):AsObjPoly():GetJointArray(); jointArray[2].center.y = point.y; session:GetKeepedObject(1):AsObjPoly():SetJointArray(jointArray); end end -- [*1] OnStopHandleMoving = function(session, tool, handleId, objId, molipRec, molipHitType) local brushType, regBrushId, backSColorId, foreSColorId, patternId = session:GetKeepedObject(2):AsObjFigure():GetBrush(); if backSColorId == SColor.WHITE then local yellow = Env():GetNearestSColor(0xffffff00); session:GetKeepedObject(2):AsObjFigure():SetBrush(BrushType.SOLID, 0, yellow, 0, 0); else session:GetKeepedObject(2):AsObjFigure():SetBrush(BrushType.SOLID, 0, SColor.WHITE, 0, 0); end session:StartTransaction(); session:ApplyKeepedObject(2); session:CommitTransaction(); end
[*1]のコードは、円弧部品[C]のブラシ色を取得し、白の場合は黄色、黄色の場合は白色をブラシに設定する。
-
ハンドルを下に引き下げる度に、円弧部品[C]の色が変化する。
-
[Chip Editor]を起動し、メニュー[ファイル]>[チップのプロパティ]をクリックする。
-
[チップのプロパティ]ダイアログの[スクリプト]タブを開き、作成したスクリプト「ライト」を設定する。
[Chip Editor]を終了し、ドキュメントを保存する。