如果是一般的 range value 選取, 還可以用 scrollbar 之類的東西蒙混過去。但二維值就不行了,maxscript 的 default ui controllers 沒這樣的東西, 而 .net default windows form controllers 也沒這樣的東西, 所以只好自己動手做...
首先是做一個 .net UserControl。底圖的十字部分用 jpeg 圖檔解決,dragging circle 用 label 解決。
重點在 public event EventHandler Map2DValueChanged;
要建立這個 event ,這樣才能在 maxscript 裡頭偵測到事件觸發。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsControlLibrary1 { public partial class Map2D : UserControl { public Map2D() { InitializeComponent(); } private bool bLeftDown = false; private void label1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { bLeftDown = true; } } private void label1_MouseUp(object sender, MouseEventArgs e) { bLeftDown = false; } private const int offset_x = 16; private const int offset_y = 13; private void label1_MouseMove(object sender, MouseEventArgs e) { Label l = (Label)sender; Point _point = this.PointToClient(Cursor.Position); if (_point.X < 0) _point.X = 0; if (_point.Y < 0) _point.Y = 0; if (_point.X > 100) _point.X = 100; if (_point.Y > 100) _point.Y = 100; if (bLeftDown == true) { l.Left = _point.X - offset_x; l.Top = _point.Y - offset_y; if (this.Map2DValueChanged != null) this.Map2DValueChanged(this, e); } } public float _X { get { float x = ((float)(label1.Left + offset_x - 50)) / ((float)5.0); return x; } } public float _Y { get { float y = ((float)(50 - label1.Top - offset_y)) / ((float)5.0); return y; } } public event EventHandler Map2DValueChanged; } }
Build project 後就可以拿到 UserControl 的 dll,然後交給 maxscript 去使用。
Assembly = dotNetClass "System.Reflection.Assembly" Assembly.loadfrom ("C:/WindowsFormsControlLibrary1.dll") rollout allControls "Facial Controller" ( dotNetControl jawMap2d "WindowsFormsControlLibrary1.Map2D" on jawMap2d Map2DValueChanged do ( in coordsys parent $cir_JawMove.position = [jawMap2d._X,0,jawMap2d._Y] ) ) createDialog allControls 120 120