if (!GetAntennaPlace( ...
Créé le : 13 avril 2025
Créé le : 13 avril 2025
textif (!GetAntennaPlace( data.NodeId, data.DirectionNodeId, data.OffsetDirectionNodeId, data.Offset.HasValue ? data.Offset.Value : 0, deviceModel, out var antennaPlace, out var antennaDirectionPlace )) { _logger.WriteLine($"{nameof(AddAntenna)}: Не удалось вычислить положение антенны", LogMessageType.Error); return false; } if (!_mineManager.NodeManager.TryGetNodeModelById( data.NodeId, out var nodeModel) ) { _logger.WriteLine($"{nameof(AddAntenna)}: Не удалось найти узел установки с Id '{data.NodeId}' антенны", LogMessageType.Error); return false; } if (!_mineManager.NodeManager.TryGetNodeModelById( data.DirectionNodeId, out var nodeDirectionModel) ) { _logger.WriteLine($"{nameof(AddAntenna)}: Не удалось найти узел направления с Id '{data.DirectionNodeId}' антенны", LogMessageType.Error); return false; } var antennaModel = new AntennaModel(nodeModel, data.GuidAntenna, deviceModel) { Number = data.Number, Position = antennaPlace, DirectionNode = nodeDirectionModel, }; if (data.Offset > 0) antennaModel.Offset = data.Offset.Value; if (data.OffsetDirectionNodeId.HasValue) { if (!_mineManager.NodeManager.TryGetNodeModelById( data.OffsetDirectionNodeId.Value, out var nodeOffsetDirectionModel) ) { _logger.WriteLine($"{nameof(AddAntenna)}: Не удалось найти узел направления смещения с Id '{data.OffsetDirectionNodeId.Value}' антенны", LogMessageType.Error); return false; } antennaModel.OffsetDirectionNode = nodeOffsetDirectionModel; }
Перепиши с C# на javascript
Ниже приведён пример того, как можно переписать исходный C#-код на JavaScript, сохранив ту же логику. В примере предполагается, что у вас есть функции/объекты, аналогичные C#-методам (GetAntennaPlace
, mineManager.NodeManager.TryGetNodeModelById
и т.д.). Вместо out
в C# для передачи значений можно возвращать объект с нужными полями:
jsfunction addAntenna(data, deviceModel, mineManager, logger) { // Предположим, что GetAntennaPlace возвращает объект, где: // success: boolean — удалось или нет // antennaPlace: вычисленное значение // antennaDirectionPlace: вычисленное значение const getAntennaResult = GetAntennaPlace( data.NodeId, data.DirectionNodeId, data.OffsetDirectionNodeId, data.Offset != null ? data.Offset : 0, deviceModel ); if (!getAntennaResult.success) { logger.error("AddAntenna: Не удалось вычислить положение антенны"); return false; } const antennaPlace = getAntennaResult.antennaPlace; const antennaDirectionPlace = getAntennaResult.antennaDirectionPlace; // Предположим, что TryGetNodeModelById возвращает объект вида: // { success: boolean, nodeModel: <модель узла> } let nodeModelResult = mineManager.NodeManager.TryGetNodeModelById(data.NodeId); if (!nodeModelResult.success) { logger.error(`AddAntenna: Не удалось найти узел установки с Id '${data.NodeId}' антенны`); return false; } const nodeModel = nodeModelResult.nodeModel; let directionNodeResult = mineManager.NodeManager.TryGetNodeModelById(data.DirectionNodeId); if (!directionNodeResult.success) { logger.error(`AddAntenna: Не удалось найти узел направления с Id '${data.DirectionNodeId}' антенны`); return false; } const nodeDirectionModel = directionNodeResult.nodeModel; // Допустим, что AntennaModel — это "класс" (или функция-конструктор) в JavaScript const antennaModel = new AntennaModel(nodeModel, data.GuidAntenna, deviceModel); antennaModel.Number = data.Number; antennaModel.Position = antennaPlace; antennaModel.DirectionNode = nodeDirectionModel; if (data.Offset != null && data.Offset > 0) { antennaModel.Offset = data.Offset; } if (data.OffsetDirectionNodeId != null) { let offsetNodeResult = mineManager.NodeManager.TryGetNodeModelById(data.OffsetDirectionNodeId); if (!offsetNodeResult.success) { logger.error( `AddAntenna: Не удалось найти узел направления смещения с Id '${data.OffsetDirectionNodeId}' антенны` ); return false; } antennaModel.OffsetDirectionNode = offsetNodeResult.nodeModel; } // Если нужно что-то вернуть return true; }
Основные изменения по сравнению с C#:
out var
, поэтому обычно возвращают объект, содержащий все необходимые данные (например, { success, antennaPlace, antennaDirectionPlace }
).null
. В C# есть data.Offset.HasValue ? data.Offset.Value : 0
; в JavaScript часто используют data.Offset != null ? data.Offset : 0
или оператор ??
._logger.WriteLine(...)
можно использовать logger.error(...)
или console.error(...)
.const
/let
вместо C#-переменных.Остальное — это просто эквивалентная реализация тех же проверок и логики, что и в оригинальном C#-коде.
textprivate bool GetAntennaPlace( long nodeId, long directionNodeId, long? offsetDirectionNodeId, int offset, ObjectBaseModel deviceModel, out Vector3 antennaPlace, out Vector3 antennaDirectionPlace ) { antennaPlace = default; antennaDirectionPlace = default; if (!_mineManager.NodeManager.TryGetNodeModelById( directionNodeId, out var directionNode) ) { _logger.WriteLine($"{nameof(GetAntennaPlace)}: Не удалось найти узел направления антенны с Id '{directionNodeId}'", LogMessageType.Error); return false; } if (!_mineManager.NodeManager.TryGetNodeModelById( nodeId, out var node) ) { _logger.WriteLine($"{nameof(GetAntennaPlace)}: Не удалось найти узел установки антенны с Id '{nodeId}'", LogMessageType.Error); return false; } if (!offsetDirectionNodeId.HasValue || offset <= 0) { antennaPlace = node.Position.ToVector3(); antennaDirectionPlace = directionNode.Position.ToVector3(); return true; } else { if (!_mineManager.NodeDirectionManager.TryGetNodeDirectionModel( nodeId, offsetDirectionNodeId.Value, out var nodeDirectionModel) ) { _logger.WriteLine($"{nameof(GetAntennaPlace)}: Не удалось найти узел смещения с Id '{nodeId},{offsetDirectionNodeId.Value}'", LogMessageType.Error); antennaPlace = default; antennaDirectionPlace = default; return false; } if (!_mineManager.GetPositionWithOffset( offset, nodeDirectionModel, out var antennaPosition) ) { _logger.WriteLine($"{nameof(GetAntennaPlace)}: Не удалось вычислить смещение для антенны", LogMessageType.Error); antennaPlace = default; antennaDirectionPlace = default; return false; } antennaPlace = antennaPosition; var directionPositionFind = _mineManager.GetNodeDirectionAfterPointInDirection( antennaPlace, nodeId, directionNodeId, out var endNodeId, out var startNodeId); if (directionPositionFind && _mineManager.NodeManager.TryGetNodeModelById(endNodeId, out var endNodeModel) && _mineManager.NodeManager.TryGetNodeModelById(startNodeId, out var startNodeModel) ) { antennaDirectionPlace = Trigon.OffsetPointOnEndLine( startNodeModel.Position.ToVector3(), endNodeModel.Position.ToVector3(), 10f); } else { antennaDirectionPlace = directionNode.Position.ToVector3(); } } return true; }
Переведи с C# на javascript
Ниже приведена «прямая» версия метода GetAntennaPlace на JavaScript.
Я придерживался тех же проверок и сообщений об ошибках, но вместо out‑параметров
функция просто возвращает объект‑результат.
js/** * Рассчитать положение антенны и точку, куда она «смотрит». * * @param {number} nodeId – ID узла установки антенны * @param {number} directionNodeId – ID узла‑ориентира (куда смотрит антенна без смещения) * @param {?number} offsetDirectionNodeId – ID узла‑ориентира для смещения (null / undefined, если нет) * @param {number} offset – величина смещения (метры) * @param {Object} deviceModel – модель устройства (не используется, но оставлена для совместимости) * @param {Object} mineManager – «шахта» со всеми менеджерами * @param {Object} logger – объект логирования (logger.error / logger.info) * * @returns {{ * success: boolean, * antennaPlace: Vector3|null, * antennaDirectionPlace: Vector3|null * }} */ function getAntennaPlace( nodeId, directionNodeId, offsetDirectionNodeId, offset, deviceModel, mineManager, logger ) { let antennaPlace = null; let antennaDirectionPlace = null; /* --- 1. Узел‑ориентир --- */ const dirNodeRes = mineManager.NodeManager.TryGetNodeModelById(directionNodeId); if (!dirNodeRes.success) { logger.error( `GetAntennaPlace: Не удалось найти узел направления антенны с Id '${directionNodeId}'` ); return { success: false, antennaPlace, antennaDirectionPlace }; } const directionNode = dirNodeRes.nodeModel; /* --- 2. Узел установки --- */ const nodeRes = mineManager.NodeManager.TryGetNodeModelById(nodeId); if (!nodeRes.success) { logger.error( `GetAntennaPlace: Не удалось найти узел установки антенны с Id '${nodeId}'` ); return { success: false, antennaPlace, antennaDirectionPlace }; } const node = nodeRes.nodeModel; /* --- 3. Без смещения --- */ if (offsetDirectionNodeId == null || offset <= 0) { antennaPlace = node.Position.toVector3(); antennaDirectionPlace = directionNode.Position.toVector3(); return { success: true, antennaPlace, antennaDirectionPlace }; } /* --- 4. Смещение: ищем направление смещения --- */ const nodeDirRes = mineManager.NodeDirectionManager.TryGetNodeDirectionModel( nodeId, offsetDirectionNodeId ); if (!nodeDirRes.success) { logger.error( `GetAntennaPlace: Не удалось найти узел смещения с Id '${nodeId},${offsetDirectionNodeId}'` ); return { success: false, antennaPlace, antennaDirectionPlace }; } const nodeDirectionModel = nodeDirRes.nodeModel; /* --- 5. Координата с учётом смещения --- */ const posRes = mineManager.GetPositionWithOffset(offset, nodeDirectionModel); if (!posRes.success) { logger.error("GetAntennaPlace: Не удалось вычислить смещение для антенны"); return { success: false, antennaPlace, antennaDirectionPlace }; } antennaPlace = posRes.position; // Vector3 /* --- 6. Куда «смотрит» антенна после смещения --- */ const dirAfterRes = mineManager.GetNodeDirectionAfterPointInDirection( antennaPlace, nodeId, directionNodeId ); if ( dirAfterRes.success && mineManager.NodeManager.TryGetNodeModelById(dirAfterRes.endNodeId).success && mineManager.NodeManager.TryGetNodeModelById(dirAfterRes.startNodeId).success ) { const endNode = mineManager.NodeManager.TryGetNodeModelById( dirAfterRes.endNodeId ).nodeModel; const startNode = mineManager.NodeManager.TryGetNodeModelById( dirAfterRes.startNodeId ).nodeModel; antennaDirectionPlace = Trigon.OffsetPointOnEndLine( startNode.Position.toVector3(), endNode.Position.toVector3(), 10.0 /* расстояние в метрах до точки на линии */ ); } else { // fallback: берём исходный directionNode antennaDirectionPlace = directionNode.Position.toVector3(); } return { success: true, antennaPlace, antennaDirectionPlace }; }
C# | JavaScript |
---|---|
out ‑параметры | Возврат объекта { success, antennaPlace, antennaDirectionPlace } |
TryGet…(…, out var model) | Возврат { success, nodeModel } или { success: false } |
default для Vector3 | null (или { x:0, y:0, z:0 } , если у вас есть класс‑обёртка) |
HasValue / Value | offsetDirectionNodeId == null ? … : … |
Логирование через _logger.WriteLine | logger.error(...) или console.error(...) |
При желании вы можете адаптировать имена функций/классов под ваши реальные реализации — логика сохранится.
text/// <summary> /// Получить позицию в направлении секции после указанной точки /// </summary> public bool GetNodeDirectionAfterPointInDirection( Vector3 point, long startNodeDirectionId, long endNodeDirectionId, out long endNodeId, out long startNodeId ) { endNodeId = MIMConstants.UnknownId; startNodeId = MIMConstants.UnknownId; if (!NodeDirectionManager.TryGetNodeDirectionModel(startNodeDirectionId, endNodeDirectionId, out var directionModel)) { return false; } using (SectionManager.GetSectionsUnderReadLock(out var sections)) { var nodeStart = directionModel.StartNode; var first = true; foreach (var sectionId in directionModel.SectionToFirstCrossroadOrDeadEnd) { if (!sections.TryGetValue(sectionId, out var section)) { endNodeId = MIMConstants.UnknownId; return false; } if (first) { if (!section.OriginSection.OnNode(nodeStart)) { endNodeId = MIMConstants.UnknownId; return false; } first = false; } if (!NodeManager.TryGetNodeModelById(nodeStart, out var startNode)) { endNodeId = MIMConstants.UnknownId; return false; } var nodeEnd = section.OriginSection.GetOpposite(nodeStart).Id; if (!NodeManager.TryGetNodeModelById(nodeEnd, out var endNode)) { endNodeId = MIMConstants.UnknownId; return false; } if (OnVector(startNode.Position.ToVector3(), endNode.Position.ToVector3(), ref point)) { endNodeId = nodeEnd; startNodeId = startNode.Id; break; } nodeStart = nodeEnd; bool OnVector(Vector3 v1, Vector3 v2, ref Vector3 nPoint) { if (Vector3.DistanceSquared(v1, nPoint) < 1 || Vector3.DistanceSquared(v2, nPoint) < 1) { return true; } var v1nPoint = v1 - nPoint; var v2nPoint = v2 - nPoint; var angle2 = v1nPoint.AngleBetween(v2nPoint); var degree2 = Trigon.RadianToDegree(angle2); if (Math.Abs(Math.Round(degree2, 0) - 180) > 0) { return false; } return true; } } return endNodeId != MIMConstants.UnknownId; } }
Перепиши с C# на javaScript
Ниже показан эквивалент метода GetNodeDirectionAfterPointInDirection на JavaScript.
Чтобы компенсировать отсутствие out
‑параметров, функция возвращает объект‑результат.
js/** * Найти пару узлов (startNodeId → endNodeId) такой секции, которая * расположена «после» заданной точки point вдоль направления * startNodeDirectionId → endNodeDirectionId. * * @param {Vector3} point – точка, от которой ищем «следующую» секцию * @param {number} startNodeDirectionId – ID стартового узла направления * @param {number} endNodeDirectionId – ID конечного узла направления * @param {Object} mineManager – объект, содержащий NodeManager, SectionManager и NodeDirectionManager * @param {Object} logger – логгер (logger.error / logger.info) * * @returns {{ * success: boolean, * endNodeId: number, * startNodeId: number * }} */ function getNodeDirectionAfterPointInDirection( point, startNodeDirectionId, endNodeDirectionId, mineManager, logger ) { const UNKNOWN_ID = MIMConstants.UnknownId; // -1 или другое «неизвестное» значение let endNodeId = UNKNOWN_ID; let startNodeId = UNKNOWN_ID; /* --- 1. Получаем модель направления --- */ const dirRes = mineManager.NodeDirectionManager.TryGetNodeDirectionModel( startNodeDirectionId, endNodeDirectionId ); if (!dirRes.success) { return { success: false, endNodeId, startNodeId }; } const directionModel = dirRes.directionModel; /* --- 2. Читаем секции под «локом» (JS‑эквивалент блокировки) --- */ const sections = mineManager.SectionManager.getSections(); // Map<sectionId, SectionModel> let nodeStart = directionModel.StartNode; // текущий «левый» узел let first = true; for (const sectionId of directionModel.SectionToFirstCrossroadOrDeadEnd) { const section = sections.get(sectionId); if (!section) { return { success: false, endNodeId: UNKNOWN_ID, startNodeId: UNKNOWN_ID }; } /* --- 2.1 Проверка первой секции --- */ if (first) { if (!section.OriginSection.onNode(nodeStart)) { return { success: false, endNodeId: UNKNOWN_ID, startNodeId: UNKNOWN_ID }; } first = false; } /* --- 2.2 Узлы секции --- */ const startNodeRes = mineManager.NodeManager.TryGetNodeModelById(nodeStart); if (!startNodeRes.success) { return { success: false, endNodeId: UNKNOWN_ID, startNodeId: UNKNOWN_ID }; } const startNode = startNodeRes.nodeModel; const nodeEnd = section.OriginSection.getOpposite(nodeStart).Id; const endNodeRes = mineManager.NodeManager.TryGetNodeModelById(nodeEnd); if (!endNodeRes.success) { return { success: false, endNodeId: UNKNOWN_ID, startNodeId: UNKNOWN_ID }; } const endNode = endNodeRes.nodeModel; /* --- 2.3 Лежит ли point на векторе start → end? --- */ if (onVector(startNode.Position.toVector3(), endNode.Position.toVector3(), point)) { endNodeId = nodeEnd; startNodeId = startNode.Id; break; } /* --- 2.4 Переходим к следующей секции --- */ nodeStart = nodeEnd; } return { success: endNodeId !== UNKNOWN_ID, endNodeId, startNodeId }; /* ---------------------------------------------------------------- */ /** Проверка: принадлежит ли точка отрезку v1‑v2 (с погрешностью ~1 м). */ function onVector(v1, v2, nPoint) { if ( Vector3.distanceSquared(v1, nPoint) < 1 || Vector3.distanceSquared(v2, nPoint) < 1 ) { return true; } const v1n = v1.subtract(nPoint); const v2n = v2.subtract(nPoint); const angleRad = v1n.angleBetween(v2n); // угол в радианах const deg = Trigon.radianToDegree(angleRad); // → градусы // Если угол ≈ 180°, точка лежит на прямой (коллинеарна) return Math.abs(Math.round(deg) - 180) <= 0; } }
C# | JavaScript‑эквивалент |
---|---|
out long endNodeId / startNodeId | Возврат в объекте { success, endNodeId, startNodeId } |
using (…) { … } блок с блокировкой | Просто получаем коллекцию (getSections() ) |
foreach (var sectionId in …) | for (const sectionId of …) |
Локальный метод OnVector | Вложенная функция onVector |
Vector3.DistanceSquared , AngleBetween | Предполагаем аналоги в вашем векторном классе |
При необходимости адаптируйте имена методов (getSections
, TryGetNodeModelById
, angleBetween
, т.д.) к реальному коду вашего проекта — логика останется прежней.