/// <summary> /// Загрузить параметр из Xml узла /// </summary> /// <param name="Node">Xml узел в котором сохранен параметр</param> public override void Load(XmlNode Node) { base.Load(Node); if (slim.TryEnterWriteLock(500)) { try { if (Node != null && Node.HasChildNodes) { if (Node.Name == RootName) { foreach (XmlNode Child in Node.ChildNodes) { switch (Child.Name) { case TModeProcessName: try { mode_proccess = (TModeProcess)Enum.Parse(typeof(TModeProcess), Child.InnerText); } catch { } break; case WeightStatusName: try { weight_status = (WeightStatus)Enum.Parse(typeof(WeightStatus), Child.InnerText); } catch { } break; case last_talblockName: try { last_talblock = float.Parse(Child.InnerText); } catch { } break; default: break; } } } } } finally { slim.ExitWriteLock(); } } }
protected float last_talblock; // начение тальблока в предыдущий цикл расчётов при состоянии процесса "над забоем" /// <summary> /// Инициализирует новый экземпляр класса /// </summary> /// <param name="p_identifier">Идентификатор параметра</param> public P0202(Guid p_identifier) : base(p_identifier, "P0202", "Длина инструмента") { simple = false; _value = 0; last_talblock = 0; mode_proccess = TModeProcess.mpBase; weight_status = WeightStatus.wsClear; }
/// <summary> /// Инициализирует новый экземпляр класса /// </summary> /// <param name="p_identifier">Идентификатор параметра</param> public P0202(Guid p_identifier) : base(p_identifier, "P0202", "Длина инструмента") { simple = false; _value = 0; last_talblock = 0; mode_proccess = TModeProcess.mpBase; weight_status = WeightStatus.wsClear; }
// -------------- вспомогательные функции -------------- /// <summary> /// Вычисляет текущее значение параметра Длина инструмента /// </summary> /// <param name="v1">Положение тальблока в текущий момент</param> /// <param name="клинья">Положение клиньев в текущий момент</param> /// <param name="вес_колонны">Вес на крюке в текущий момент</param> /// <param name="locking_weight_hook">Блокировочное значение веса на крюке.</param> /// <param name="r_weight">Метод расчета веса на крюке</param> /// <returns>Вычисленное значение параметра</returns> private float current_length_instrument(P0005 v1, P0012 v2, P0102 v3, float locking_weight_hook, TechnologicalRegimeWeightHook r_weight) { if (float.IsNaN(v1.Value)) { return(_value); } else { switch (weight_status) { case WeightStatus.wsClear: if (WeightHookForWeightOrWedges(v3, v2, locking_weight_hook, r_weight) == TProcResult.True) { _value = _value + v1.Value - last_talblock; last_talblock = v1.Value; weight_status = WeightStatus.wsWeight; } return(_value); case WeightStatus.wsWeight: if (WeightHookForWeightOrWedges(v3, v2, locking_weight_hook, r_weight) == TProcResult.True) { last_talblock = v1.Value; } else { weight_status = WeightStatus.wsClear; } return(_value); case WeightStatus.Default: weight_status = WeightStatus.wsClear; break; default: break; } return(_value); } }
private static void BuildWeightedVertexChunk(List <VertexChunk> vertexList, List <Vertex> vertices, Dictionary <Vertex, int> weightedVertexIdLookup, ref int nextWeightedVertexId, int targetNodeIndex, ref Matrix4x4 targetNodeInvWorldTransform, WeightStatus weightStatus) { Debug.Assert(!sDisableWeights); var nnfVertices = new VertexNNF[vertices.Count]; for (int i = 0; i < vertices.Count; i++) { var vertex = vertices[i]; if (!vertex.Weights.Any(x => x.NodeIndex == targetNodeIndex)) { // TODO: this vertex was part of the same triangle another weighted vertex was in // to make this work properly I have to know the id of this vertex beforehand //nnfVertices[i].Position = Vector3.Transform( vertex.Position, targetNodeInvWorldTransform ); //nnfVertices[i].Normal = Vector3.TransformNormal( vertex.Normal, targetNodeInvWorldTransform ); //var weightByte = 255; //nnfVertices[i].NinjaFlags = ( uint )( weightByte << 16 | nextWeightedVertexId++ & 0xFFFF ); //Console.WriteLine( $"{nextWeightedVertexId}" ); //if ( !weightedVertexIdLookup.TryGetValue( vertex, out var vertexId ) ) //{ // weightedVertexIdLookup[vertex] = nextWeightedVertexId--; // vertexId = nextWeightedVertexId--; //} if (!weightedVertexIdLookup.TryGetValue(vertex, out var vertexId)) { vertexId = nextWeightedVertexId--; weightedVertexIdLookup[vertex] = vertexId; } nnfVertices[i].Position = Vector3.Transform(vertex.Position, targetNodeInvWorldTransform); nnfVertices[i].Normal = Vector3.TransformNormal(vertex.Normal, targetNodeInvWorldTransform); // Pack 'er up nnfVertices[i].NinjaFlags = ( uint )(0 << 16 | vertexId & 0xFFFF); } else { if (!weightedVertexIdLookup.TryGetValue(vertex, out var vertexId)) { vertexId = nextWeightedVertexId--; weightedVertexIdLookup[vertex] = vertexId; } nnfVertices[i].Position = Vector3.Transform(vertex.Position, targetNodeInvWorldTransform); nnfVertices[i].Normal = Vector3.TransformNormal(vertex.Normal, targetNodeInvWorldTransform); // Pack 'er up var targetNodeWeight = vertex.Weights.First(x => x.NodeIndex == targetNodeIndex); var weightByte = ( byte )(targetNodeWeight.Weight * 255f); nnfVertices[i].NinjaFlags = ( uint )(weightByte << 16 | vertexId & 0xFFFF); } } vertexList.Add(new VertexNNFChunk(nnfVertices) { WeightStatus = weightStatus }); }
/// <summary> /// Вычисляет текущее значение параметра Длина инструмента /// </summary> /// <param name="v1">Положение тальблока в текущий момент</param> /// <param name="v2">Вес на крюке в текущий момент</param> /// <param name="v3">Положение клиньев в текущий момент</param> /// <param name="v4">Положение инструмента (долота) в текущий момент</param> /// <param name="v5">Глубина забоя в текущий момент</param> /// <param name="v6">Количество опущенных свеч</param> /// <param name="currentTime">Текущее технологическое время</param> /// <param name="locking_weight_hook">Блокировочное значение веса на крюке</param> /// <param name="size_layout_bottom_column">Размер компоновки низа колонны</param> /// <param name="r_weight">Метод расчета веса на крюке</param> public void Calculate(P0005 v1, P0102 v2, P0012 v3, P0204 v4, P0205 v5, P0203 v6, DateTime currentTime, float locking_weight_hook, float size_layout_bottom_column, float size_layout_top_column, TechnologicalRegimeWeightHook r_weight) { if (slim.TryEnterWriteLock(300)) { try { switch (mode_proccess) { case TModeProcess.mpBase: _value = current_length_instrument(v1, v3, v2, locking_weight_hook, r_weight); break; case TModeProcess.mpSetUser: mode_proccess = TModeProcess.mpBase; if (WeightHookForWeightOrWedges(v2, v3, locking_weight_hook, r_weight) != TProcResult.True || float.IsNaN(v1.Value)) { v4.Calculate(_value); } if (_value <= (size_layout_bottom_column + size_layout_top_column)) { v6.CorrectLenghtInstrument(0.0f); v6.Calculate(0.0f); } else { float _tmp = _value - (size_layout_bottom_column + size_layout_top_column); v6.CorrectLenghtInstrument(_tmp); } break; case TModeProcess.mpCMDzaboi: mode_proccess = TModeProcess.mpBase; if (WeightHookForWeightOrWedges(v2, v3, locking_weight_hook, r_weight) != TProcResult.True || float.IsNaN(v1.Value)) { _value = current_length_instrument(v1, v3, v2, locking_weight_hook, r_weight); } else { last_talblock = v1.Value; weight_status = WeightStatus.wsWeight; _value = v5.Value + v1.Value; if (_value <= (size_layout_bottom_column + size_layout_top_column)) { v6.CorrectLenghtInstrument(0.0f); v6.Calculate(0.0f); } else { float _tmp = _value - (size_layout_bottom_column + size_layout_top_column); v6.CorrectLenghtInstrument(_tmp); } } break; case TModeProcess.mpCMDmodifyDepth: if (WeightHookForWeightOrWedges(v2, v3, locking_weight_hook, r_weight) != TProcResult.True || float.IsNaN(v1.Value)) { weight_status = WeightStatus.wsClear; if (v5.Value < _value) { _value = v5.Value; if (_value <= (size_layout_bottom_column + size_layout_top_column)) { v6.CorrectLenghtInstrument(0.0f); v6.Calculate(0.0f); } else { float _tmp = _value - (size_layout_bottom_column + size_layout_top_column); v6.CorrectLenghtInstrument(_tmp); } } v4.Calculate(_value); } else { last_talblock = v1.Value; weight_status = WeightStatus.wsWeight; if (v5.Value < (_value - v1.Value)) { _value = v5.Value + v1.Value; if (_value <= (size_layout_bottom_column + size_layout_top_column)) { v6.CorrectLenghtInstrument(0.0f); v6.Calculate(0.0f); } else { float _tmp = _value - (size_layout_bottom_column + size_layout_top_column); v6.CorrectLenghtInstrument(_tmp); } } } mode_proccess = TModeProcess.mpBase; break; default: break; } } finally { slim.ExitWriteLock(); } } }
public ExerciseParams(MuscleT1 m1, WeightStatus w) { WeightStat = w; PrimaryMuscle = m1; }
// -------------- вспомогательные функции -------------- /// <summary> /// Вычисляет текущее значение параметра Длина инструмента /// </summary> /// <param name="v1">Положение тальблока в текущий момент</param> /// <param name="клинья">Положение клиньев в текущий момент</param> /// <param name="вес_колонны">Вес на крюке в текущий момент</param> /// <param name="locking_weight_hook">Блокировочное значение веса на крюке.</param> /// <param name="r_weight">Метод расчета веса на крюке</param> /// <returns>Вычисленное значение параметра</returns> private float current_length_instrument(P0005 v1, P0012 v2, P0102 v3, float locking_weight_hook, TechnologicalRegimeWeightHook r_weight) { if (float.IsNaN(v1.Value)) { return _value; } else { switch (weight_status) { case WeightStatus.wsClear: if (WeightHookForWeightOrWedges(v3, v2, locking_weight_hook, r_weight) == TProcResult.True) { _value = _value + v1.Value - last_talblock; last_talblock = v1.Value; weight_status = WeightStatus.wsWeight; } return _value; case WeightStatus.wsWeight: if (WeightHookForWeightOrWedges(v3, v2, locking_weight_hook, r_weight) == TProcResult.True) { last_talblock = v1.Value; } else { weight_status = WeightStatus.wsClear; } return _value; case WeightStatus.Default: weight_status = WeightStatus.wsClear; break; default: break; } return _value; } }
/// <summary> /// Загрузить параметр из Xml узла /// </summary> /// <param name="Node">Xml узел в котором сохранен параметр</param> public override void Load(XmlNode Node) { base.Load(Node); if (slim.TryEnterWriteLock(500)) { try { if (Node != null && Node.HasChildNodes) { if (Node.Name == RootName) { foreach (XmlNode Child in Node.ChildNodes) { switch (Child.Name) { case TModeProcessName: try { mode_proccess = (TModeProcess)Enum.Parse(typeof(TModeProcess), Child.InnerText); } catch { } break; case WeightStatusName: try { weight_status = (WeightStatus)Enum.Parse(typeof(WeightStatus), Child.InnerText); } catch { } break; case last_talblockName: try { last_talblock = float.Parse(Child.InnerText); } catch { } break; default: break; } } } } } finally { slim.ExitWriteLock(); } } }
/// <summary> /// Вычисляет текущее значение параметра Длина инструмента /// </summary> /// <param name="v1">Положение тальблока в текущий момент</param> /// <param name="v2">Вес на крюке в текущий момент</param> /// <param name="v3">Положение клиньев в текущий момент</param> /// <param name="v4">Положение инструмента (долота) в текущий момент</param> /// <param name="v5">Глубина забоя в текущий момент</param> /// <param name="v6">Количество опущенных свеч</param> /// <param name="currentTime">Текущее технологическое время</param> /// <param name="locking_weight_hook">Блокировочное значение веса на крюке</param> /// <param name="size_layout_bottom_column">Размер компоновки низа колонны</param> /// <param name="r_weight">Метод расчета веса на крюке</param> public void Calculate(P0005 v1, P0102 v2, P0012 v3, P0204 v4, P0205 v5, P0203 v6, DateTime currentTime, float locking_weight_hook, float size_layout_bottom_column, float size_layout_top_column, TechnologicalRegimeWeightHook r_weight) { if (slim.TryEnterWriteLock(300)) { try { switch (mode_proccess) { case TModeProcess.mpBase: _value = current_length_instrument(v1, v3, v2, locking_weight_hook, r_weight); break; case TModeProcess.mpSetUser: mode_proccess = TModeProcess.mpBase; if (WeightHookForWeightOrWedges(v2, v3, locking_weight_hook, r_weight) != TProcResult.True || float.IsNaN(v1.Value)) { v4.Calculate(_value); } if (_value <= (size_layout_bottom_column + size_layout_top_column)) { v6.CorrectLenghtInstrument(0.0f); v6.Calculate(0.0f); } else { float _tmp = _value - (size_layout_bottom_column + size_layout_top_column); v6.CorrectLenghtInstrument(_tmp); } break; case TModeProcess.mpCMDzaboi: mode_proccess = TModeProcess.mpBase; if (WeightHookForWeightOrWedges(v2, v3, locking_weight_hook, r_weight) != TProcResult.True || float.IsNaN(v1.Value)) { _value = current_length_instrument(v1, v3, v2, locking_weight_hook, r_weight); } else { last_talblock = v1.Value; weight_status = WeightStatus.wsWeight; _value = v5.Value + v1.Value; if (_value <= (size_layout_bottom_column + size_layout_top_column)) { v6.CorrectLenghtInstrument(0.0f); v6.Calculate(0.0f); } else { float _tmp = _value - (size_layout_bottom_column + size_layout_top_column); v6.CorrectLenghtInstrument(_tmp); } } break; case TModeProcess.mpCMDmodifyDepth: if (WeightHookForWeightOrWedges(v2, v3, locking_weight_hook, r_weight) != TProcResult.True || float.IsNaN(v1.Value)) { weight_status = WeightStatus.wsClear; if (v5.Value < _value) { _value = v5.Value; if (_value <= (size_layout_bottom_column + size_layout_top_column)) { v6.CorrectLenghtInstrument(0.0f); v6.Calculate(0.0f); } else { float _tmp = _value - (size_layout_bottom_column + size_layout_top_column); v6.CorrectLenghtInstrument(_tmp); } } v4.Calculate(_value); } else { last_talblock = v1.Value; weight_status = WeightStatus.wsWeight; if (v5.Value < (_value - v1.Value)) { _value = v5.Value + v1.Value; if (_value <= (size_layout_bottom_column + size_layout_top_column)) { v6.CorrectLenghtInstrument(0.0f); v6.Calculate(0.0f); } else { float _tmp = _value - (size_layout_bottom_column + size_layout_top_column); v6.CorrectLenghtInstrument(_tmp); } } } mode_proccess = TModeProcess.mpBase; break; default: break; } } finally { slim.ExitWriteLock(); } } }