public static MachineViewModels.ViewModels.Links.ILinkViewModel Convert(this ILink link, MachineElementViewModel mevm, Transform3DGroup transformGroup, Point3D rotationCenter) { if (link == null) { return(null); } if (link is LinearPosition linPos) { var vm = new LinearPositionViewModel(); var action = GetLinearPositionLinkAction(transformGroup, linPos.Direction, linPos.Pos); MachineViewModels.Extensions.LinkExtensions.UpdateViewModel(vm, linPos); vm.Description = mevm.Name; if (action != null) { vm.ValueChanged += (s, e) => action(e); } return(vm); } else if (link is LinearPneumatic pnmPos) { var vm = new LinearPneumaticViewModel(); MachineViewModels.Extensions.LinkExtensions.UpdateViewModel(vm, pnmPos); vm.Description = mevm.Name; ApplyLinearPneumaticLinkAction(transformGroup, vm, mevm); return(vm); } else if (link is RotaryPneumatic pnmRot) { var vm = new RotaryPneumaticViewModel(); MachineViewModels.Extensions.LinkExtensions.UpdateViewModel(vm, pnmRot); vm.Description = mevm.Name; ApplyRotaryPneumaticLinkAction(transformGroup, rotationCenter, vm); return(vm); } else { throw new NotImplementedException(); } }
private static Action <double> GetSetTraslationAction(LinearPneumaticViewModel vm, TranslateTransform3D tt) { Action <double> action = null; switch (vm.Direction) { case LinkDirection.X: action = (d) => tt.OffsetX = d; break; case LinkDirection.Y: action = (d) => tt.OffsetY = d; break; case LinkDirection.Z: action = (d) => tt.OffsetZ = d; break; default: throw new ArgumentException("Invalid traslation direction!"); } return(action); }
private static Func <double> GetGetTraslationFuncion(LinearPneumaticViewModel vm, TranslateTransform3D tt) { Func <double> function = null; switch (vm.Direction) { case LinkDirection.X: function = () => tt.OffsetX; break; case LinkDirection.Y: function = () => tt.OffsetY; break; case LinkDirection.Z: function = () => tt.OffsetZ; break; default: throw new ArgumentException("Invalid traslation direction!"); } return(function); }
private static void ApplyLinearPneumaticLinkAction(Transform3DGroup transformGroup, LinearPneumaticViewModel vm, MachineElementViewModel mevm) { if (transformGroup != null) { var tt = new TranslateTransform3D(); transformGroup.Children.Add(tt); var setAction = GetSetTraslationAction(vm, tt); vm.SetPosition = setAction; vm.GetPosition = GetGetTraslationFuncion(vm, tt); vm.ValueChanged += (s, e) => { var onPos = vm.OnPos; var offPos = vm.OffPos; var tOn = vm.TOn; var tOff = vm.TOff; var toolActivator = vm.ToolActivator; var lmevm = mevm; var inserterId = vm.InserterId; EvaluateLinkDataByCollision(vm, e, ref onPos, offPos, ref tOn, ref tOff); if (vm.IsGradualTransactionEnabled) { var to = e ? onPos : offPos; var t = e ? tOn : tOff; vm.OnMovementStarting?.Invoke(vm); vm.SetPosition = (d) => { setAction(d); if (d == to) { vm.OnMovementCompleted?.Invoke(vm); if (toolActivator) { lmevm.ManageToolActivation(e); } if (inserterId > 0) { vm.ManageInserter(e); } } }; LinearLinkMovementManager.Add(vm.Id, vm.Pos, to, t); } else { var v = e ? onPos : offPos; vm.OnMovementStarting?.Invoke(vm); setAction(v); vm.OnMovementCompleted?.Invoke(vm); if (toolActivator) { lmevm.ManageToolActivation(e); } if (inserterId > 0) { vm.ManageInserter(e); } } }; } }