スクリプトでランプを作成

ドキュメントトップへ戻る
目次へ戻る

スクリプトを組込んだライトのチップを作成します。
スイッチの紐を引く度に、ライトが点灯・消灯します。

  1. [環境の設定]ダイアログを開く。
  2. [インタフェース]タブを開き[エキスパートモード]、[スクリプトをデバッグモードで実行する]にチェックを入れる。
  3. [チップテーブル]の上でマウスを右クリックし[チップテーブルの編集]コマンドを実行する。
  4. [チップテーブルの編集]ダイアログで[追加]ボタンをクリック。
  5. [Chip Editor]が起動する。[環境の設定]ダイアログで[エキスパートモード]にチェックを入れる。
  6. ランプのイメージを作成する。
  7. [A]円弧部品 [B]多角線部品 [C]円弧部品 [D]多角線部品
  8. [A]円弧部品の[プロパティ]ダイアログを表示して[ディクショナリー]ページを開く。[数値型ディクショナリー]の[ID]に0、[Value]に0を入力し[設定]ボタンをクリックする。
  9. 各部品の[数値型ディクショナリー]に以下の値を設定する。
    これらの値は、スクリプトの中でチップのメンバー部品を識別するために使われる。
    部品 [ID] [Value]
    [A] 0 0
    [B] 0 1
    [C] 0 2
    [D] 0 3
  10. [複合部品チップモード]を選択し、チップを登録して終了する。
  11. 作成したチップをキャンバスに配置する。
  12. 配置したチップの[プロパティ]ダイアログを表示し、[スクリプト]タブを開く。[選択する]ボタンをクリック。
  13. [スクリプトテーブルの編集]ダイアログが開く。[追加]ボタンをクリック。
  14. [スクリプト作成/変更]ダイアログが開く。[スクリプト名]に「ライト」と入力する。
  15. [スクリプトテーブルの編集]ダイアログで[スクリプト一覧]の「ライト」が選択されていることを確認。
  16. [プロパティ]ダイアログの[スクリプト]タブで「ライト」が設定されていることを確認。
  17. メニュー[表示]>[スクリプトデバッガーを表示]をクリック。
  18. [Script Debugger]が表示される。
  19. メニュー[Edit]>[Edit Script]をクリック。
  20. スクリプトの編集が可能になる。
  21. 以下のコードを入力する。
    
    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
    					
    [ResetHandles]は、編集ツールによる選択など、ハンドルを作成するタイミングで実行されるLuaの関数。
    ここでは、チップ部品の各メンバーの部品を複製し[*1]、円弧部品[A]の中心座標をハンドルとして登録している[*2]。
    詳しくはLuaのリファレンスマニュアル等、 ユーザーズガイド:スクリプトAPI Reference for Luaを参照。
  22. スクリプトを保存する。
  23. チップをダブルクリックして編集ツールをアクティブにする。円弧部品[A]の位置にハンドルが表示される。
  24. ハンドルはドラッグして好きな位置に移動させることができる。
    編集ツールから選択ツールに変更する。
  25. [Script Debugger]でコードに[*1]、[*2]、[*3]を追加し、保存する。
    
    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
    					
    [OnStartHandleMoving]は、ハンドルの移動を開始したときに実行されるLuaの関数。
    [OnHandleMoving]は、ハンドルを移動している間、連続して実行されるLuaの関数。
    [*1]のコードは、ハンドルの移動を線分上に制限する。
    [*2]のコードは、円弧部品[A]の複製を描画対象に追加する。
    [*3]のコードは、円弧部品[A]の複製を移動させ描画する。
  26. ハンドルは、円弧部品[A]から垂直方向の10mm下方までの範囲のみ移動できる。また、円弧部品[A]も追従して移動する。
  27. [Script Debugger]でコードに[*1]、[*2]を追加し、保存する。
    
    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
    					
    [*1]のコードは、多角線部品[B]の複製を描画対象に追加する。
    [*2]のコードは、多角線部品[B]の複製の終点を移動させ描画する。
  28. ハンドルの移動に、円弧部品[A]に加えて多角線部品[B]が追従する。
  29. [Script Debugger]でコードに[*1]を追加し、保存する。
    
    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
    					
    [OnStopHandleMoving]は、ハンドルの移動を終了したときに実行されるLuaの関数。
    [*1]のコードは、円弧部品[C]のブラシ色を取得し、白の場合は黄色、黄色の場合は白色をブラシに設定する。
  30. ハンドルを下に引き下げる度に、円弧部品[C]の色が変化する。
  31. [Chip Editor]を起動し、メニュー[ファイル]>[チップのプロパティ]をクリックする。
  32. [チップのプロパティ]ダイアログの[スクリプト]タブを開き、作成したスクリプト「ライト」を設定する。
    [Chip Editor]を終了し、ドキュメントを保存する。