首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

Visio 動態仿真實作:拓撲分析驅動的線路動畫與活塞運動模擬

     編輯:關於C#

從靜態拓撲分析進化到動態仿真,Visio 可透過 Application.DoEvents() + Thread.Sleep() 實現幀級動畫。本文展示液壓傳動系統仿真:線路依拓撲順序逐段變色、活塞以獨立執行緒循環往覆運動,完整呈現流體動力過程。

核心動畫原理


System.Windows.Forms.Application.DoEvents(); // 強制處理 UI 訊息,立即重繪
Thread.Sleep(50);                             // 控制幀率約 20 FPS

DoEvents 讓訊息迴圈處理 Paint 事件,配合 Thread.Sleep 形成動畫時間軸。

三階段仿真流程

  1. 拓撲分析:將圖形連接關係存入資料庫,建立設備關聯圖。
  2. 層次排序:從電源/油箱起點 DFS,產出有序設備 ID 清單 AnalyzeShapeIdList。
  3. 動畫播放:依序遍歷清單,設定顏色/文字/控制點位置,穿插 DoEvents/Sleep。

主播放迴圈


private void RunColorChanging(Application visApp) {
    // 切換動畫狀態標記 (儲存在 PageSheet.Scratch.A1)
    Cell scratch = visApp.ActiveDocument.Pages[1].PageSheet.Cells["Scratch.A1"];
    int state = int.Parse(FormulaStringToString(scratch.Formula));
    scratch.Formula = (state == 0) ? "1" : "0";
    isMovie = (state == 0);

    int seq = 1;
    foreach (int shapeId in AnalyzeShapeIdList) {
        Shape shape = visDoc.Pages[1].Shapes.ItemFromID[shapeId];
        if (shape == null) continue;

        if (state == 0) { // 通電/通油 動畫
            shape.Text = seq++.ToString("D2");
            SetShapeLineColor(shape, VisDefaultColors.visDarkGreen); // 綠
            DoEventsSleep(500);
        } else { // 斷電/斷油 復原
            shape.Text = "";
            SetShapeLineColor(shape, VisDefaultColors.visBlack);
            DoEventsSleep(0);
        }

        // 活塞/閥門特殊動畫
        string equipType = GetShapeCellValue(shape, "設備類型");
        if (equipType == "單作用" || equipType == "雙作用") {
            AnimatePiston(shape, scratch);
        } else if (equipType == "4/2閥") {
            AnimateDirectionalValve(shape);
        }
    }
}

private void DoEventsSleep(int ms) {
    Application.DoEvents();
    if (ms > 0) Thread.Sleep(ms);
}

活塞運動:獨立執行緒循環


private void AnimatePiston(Shape shape, Cell scratchCell) {
    // 找出控制點 Cell: Controls.Row_1.X
    string cellName = "Controls.Row_1.X";
    if (shape.CellExistsU[cellName] == 0) return;
    short row = shape.CellsRowIndex[cellName];
    Cell ctrlCell = shape.CellsSRC[(short)VisSectionIndices.visSectionControls, row, (short)VisCellIndices.visCtlX];

    Thread thread = new Thread(o => {
        var param = (ThreadParam)o;
        Cell pistonCell = param.Cell;
        Cell flagCell = param.ScratchCell;
        int flag = int.Parse(FormulaStringToString(flagCell.Formula));
        
        while (flag == 1 && isMovie) {
            // 前進:Width*0.25 → Width*0.75 (10 幀)
            for (int k = 1; k <= 10; k++) {
                pistonCell.Formula = StringToFormulaForString($"Width*0.25 + Width*{0.05*k}");
                DoEventsSleep(50);
            }
            // 後退:Width*0.75 → Width*0.25 (10 幀)
            for (int k = 1; k <= 10; k++) {
                pistonCell.Formula = StringToFormulaForString($"Width*0.75 - Width*{0.05*k}");
                DoEventsSleep(50);
            }
            flag = int.Parse(FormulaStringToString(flagCell.Formula));
        }
    });
    thread.Start(new ThreadParam { Cell = ctrlCell, ScratchCell = scratchCell });
}

換向閥 (4/2閥) 組合圖形切換

見「組合形狀操作」一文:透過 GroupSelectMode = 2 選取子形狀,Selection.Move 位移實現左右切換,動畫完成後還原 GroupSelectMode = 0。

關鍵技術總結

  • 拓撲排序 保證動畫符合物理流向邏輯。
  • Scratch 儲存格 作為跨執行緒狀態旗標(播放/停止)。
  • 獨立執行緒 處理循環動畫(活塞),避免阻塞主播放流程。
  • 控制點公式動畫 比移動整個 Shape 更平滑、不影響連接關係。

此技術已應用於液壓訓練模擬系統,支援百元件級即時仿真,展現 Visio 超越靜態繪圖的動態視覺化潛力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved