diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.prettierignore b/.prettierignore old mode 100644 new mode 100755 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md old mode 100644 new mode 100755 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/PRIVACY.md b/PRIVACY.md old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/SECURITY.md b/SECURITY.md old mode 100644 new mode 100755 diff --git a/assets/editor-demo1.gif b/assets/editor-demo1.gif old mode 100644 new mode 100755 diff --git a/assets/editor-demo2.gif b/assets/editor-demo2.gif old mode 100644 new mode 100755 diff --git a/assets/editor-demo3.gif b/assets/editor-demo3.gif old mode 100644 new mode 100755 diff --git a/assets/readme-banner.png b/assets/readme-banner.png old mode 100644 new mode 100755 diff --git a/craco-copy-webpack-plugin.js b/craco-copy-webpack-plugin.js old mode 100644 new mode 100755 diff --git a/craco-fallback-util-plugin.js b/craco-fallback-util-plugin.js old mode 100644 new mode 100755 diff --git a/craco-service-worker-dev-plugin.js b/craco-service-worker-dev-plugin.js old mode 100644 new mode 100755 diff --git a/craco.config.js b/craco.config.js old mode 100644 new mode 100755 diff --git a/package-lock.json b/package-lock.json old mode 100644 new mode 100755 diff --git a/package.json b/package.json old mode 100644 new mode 100755 diff --git a/prettier.config.js b/prettier.config.js old mode 100644 new mode 100755 diff --git a/public/api/version b/public/api/version old mode 100644 new mode 100755 diff --git a/public/index.html b/public/index.html old mode 100644 new mode 100755 diff --git a/public/manifest.json b/public/manifest.json old mode 100644 new mode 100755 diff --git a/public/precache/V5RC-FieldPerimeter-Plain-TileColor66_71-2000x2000.png b/public/precache/V5RC-FieldPerimeter-Plain-TileColor66_71-2000x2000.png old mode 100644 new mode 100755 diff --git a/public/precache/V5RC-HighStakes-H2H-TileColor66_71-2000x2000.png b/public/precache/V5RC-HighStakes-H2H-TileColor66_71-2000x2000.png old mode 100644 new mode 100755 diff --git a/public/precache/favicon.ico b/public/precache/favicon.ico old mode 100644 new mode 100755 diff --git a/public/robots.txt b/public/robots.txt old mode 100644 new mode 100755 diff --git a/public/static/V5RC-HighStakes-Skills-TileColor66_71-2000x2000.png b/public/static/V5RC-HighStakes-Skills-TileColor66_71-2000x2000.png old mode 100644 new mode 100755 diff --git a/public/static/V5RC-OverUnder-H2H-TileColor66_71-2000x2000.png b/public/static/V5RC-OverUnder-H2H-TileColor66_71-2000x2000.png old mode 100644 new mode 100755 diff --git a/public/static/V5RC-OverUnder-Skills-TileColor66_71-2000x2000.png b/public/static/V5RC-OverUnder-Skills-TileColor66_71-2000x2000.png old mode 100644 new mode 100755 diff --git a/public/static/VIQC-FieldPerimeter-8ft6ft-2000x1517.png b/public/static/VIQC-FieldPerimeter-8ft6ft-2000x1517.png old mode 100644 new mode 100755 diff --git a/public/static/VIQC-FullVolume-8ft6ft-2000x1517.png b/public/static/VIQC-FullVolume-8ft6ft-2000x1517.png old mode 100644 new mode 100755 diff --git a/public/static/VIQC-RapidRelay-8ft6ft-2000x1517.png b/public/static/VIQC-RapidRelay-8ft6ft-2000x1517.png old mode 100644 new mode 100755 diff --git a/public/static/VURC-HighStakes-H2H-TileColor66_71-2000x2000.png b/public/static/VURC-HighStakes-H2H-TileColor66_71-2000x2000.png old mode 100644 new mode 100755 diff --git a/public/static/VURC-HighStakes-Skills-TileColor66_71-2000x2000.png b/public/static/VURC-HighStakes-Skills-TileColor66_71-2000x2000.png old mode 100644 new mode 100755 diff --git a/public/static/VURC-OverUnder-H2H-TileColor66_71-2000x2000.png b/public/static/VURC-OverUnder-H2H-TileColor66_71-2000x2000.png old mode 100644 new mode 100755 diff --git a/public/static/instruction-to-brave-browser-1.png b/public/static/instruction-to-brave-browser-1.png old mode 100644 new mode 100755 diff --git a/public/static/instruction-to-brave-browser-2.png b/public/static/instruction-to-brave-browser-2.png old mode 100644 new mode 100755 diff --git a/public/static/logo192.png b/public/static/logo192.png old mode 100644 new mode 100755 diff --git a/public/static/logo464.svg b/public/static/logo464.svg old mode 100644 new mode 100755 diff --git a/public/static/logo512-apple.png b/public/static/logo512-apple.png old mode 100644 new mode 100755 diff --git a/public/static/logo512-safe.png b/public/static/logo512-safe.png old mode 100644 new mode 100755 diff --git a/public/static/logo512.png b/public/static/logo512.png old mode 100644 new mode 100755 diff --git a/public/static/readme-banner-0.5x.png b/public/static/readme-banner-0.5x.png old mode 100644 new mode 100755 diff --git a/src/App.test.tsx b/src/App.test.tsx old mode 100644 new mode 100755 diff --git a/src/Root.scss b/src/Root.scss old mode 100644 new mode 100755 diff --git a/src/Root.tsx b/src/Root.tsx old mode 100644 new mode 100755 diff --git a/src/app/Layouts.tsx b/src/app/Layouts.tsx old mode 100644 new mode 100755 diff --git a/src/app/MarkdownSupport.tsx b/src/app/MarkdownSupport.tsx old mode 100644 new mode 100755 diff --git a/src/app/MarkdownTest.mdx b/src/app/MarkdownTest.mdx old mode 100644 new mode 100755 diff --git a/src/app/Notice.tsx b/src/app/Notice.tsx old mode 100644 new mode 100755 diff --git a/src/app/Theme.tsx b/src/app/Theme.tsx old mode 100644 new mode 100755 diff --git a/src/app/classic.blocks/MousePositionPresentation.scss b/src/app/classic.blocks/MousePositionPresentation.scss old mode 100644 new mode 100755 diff --git a/src/app/classic.blocks/_index.scss b/src/app/classic.blocks/_index.scss old mode 100644 new mode 100755 diff --git a/src/app/classic.blocks/_index.tsx b/src/app/classic.blocks/_index.tsx old mode 100644 new mode 100755 diff --git a/src/app/classic.blocks/panel/ControlConfigPanel.scss b/src/app/classic.blocks/panel/ControlConfigPanel.scss old mode 100644 new mode 100755 diff --git a/src/app/classic.blocks/panel/MenuPanel.scss b/src/app/classic.blocks/panel/MenuPanel.scss old mode 100644 new mode 100755 diff --git a/src/app/classic.blocks/panel/PathTreePanel.scss b/src/app/classic.blocks/panel/PathTreePanel.scss old mode 100644 new mode 100755 diff --git a/src/app/classic.blocks/speed-canvas/SpeedCanvasElement.scss b/src/app/classic.blocks/speed-canvas/SpeedCanvasElement.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/DragDropBackdrop.tsx b/src/app/common.blocks/DragDropBackdrop.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/MousePositionPresentation.tsx b/src/app/common.blocks/MousePositionPresentation.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/_index.scss b/src/app/common.blocks/_index.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/_index.tsx b/src/app/common.blocks/_index.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/field-canvas/AreaSelectionElement.tsx b/src/app/common.blocks/field-canvas/AreaSelectionElement.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/field-canvas/ControlElement.tsx b/src/app/common.blocks/field-canvas/ControlElement.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/field-canvas/FieldCanvasElement.tsx b/src/app/common.blocks/field-canvas/FieldCanvasElement.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/field-canvas/RobotElement.tsx b/src/app/common.blocks/field-canvas/RobotElement.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/field-canvas/SegmentControlVisualLineElement.tsx b/src/app/common.blocks/field-canvas/SegmentControlVisualLineElement.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/field-canvas/SegmentElement.tsx b/src/app/common.blocks/field-canvas/SegmentElement.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/field-canvas/SegmentPointsHitBoxElement.tsx b/src/app/common.blocks/field-canvas/SegmentPointsHitBoxElement.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/AboutModal.scss b/src/app/common.blocks/modal/AboutModal.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/AboutModal.tsx b/src/app/common.blocks/modal/AboutModal.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/AssetManagerModal.scss b/src/app/common.blocks/modal/AssetManagerModal.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/AssetManagerModal.tsx b/src/app/common.blocks/modal/AssetManagerModal.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/ConfirmationModal.scss b/src/app/common.blocks/modal/ConfirmationModal.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/ConfirmationModal.tsx b/src/app/common.blocks/modal/ConfirmationModal.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/CoordinateSystemModal.scss b/src/app/common.blocks/modal/CoordinateSystemModal.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/CoordinateSystemModal.tsx b/src/app/common.blocks/modal/CoordinateSystemModal.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/Modal.scss b/src/app/common.blocks/modal/Modal.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/Modal.tsx b/src/app/common.blocks/modal/Modal.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/PreferencesModal.scss b/src/app/common.blocks/modal/PreferencesModal.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/PreferencesModal.tsx b/src/app/common.blocks/modal/PreferencesModal.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/RequireLocalFieldImageModal.scss b/src/app/common.blocks/modal/RequireLocalFieldImageModal.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/RequireLocalFieldImageModal.tsx b/src/app/common.blocks/modal/RequireLocalFieldImageModal.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/WelcomeForBrave.mdx b/src/app/common.blocks/modal/WelcomeForBrave.mdx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/WelcomeForOthers.mdx b/src/app/common.blocks/modal/WelcomeForOthers.mdx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/WelcomeModal.scss b/src/app/common.blocks/modal/WelcomeModal.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/modal/WelcomeModal.tsx b/src/app/common.blocks/modal/WelcomeModal.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/panel/ControlConfigPanel.scss b/src/app/common.blocks/panel/ControlConfigPanel.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/panel/ControlConfigPanel.tsx b/src/app/common.blocks/panel/ControlConfigPanel.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/panel/GeneralConfigPanel.tsx b/src/app/common.blocks/panel/GeneralConfigPanel.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/panel/MenuPanel.scss b/src/app/common.blocks/panel/MenuPanel.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/panel/MenuPanel.tsx b/src/app/common.blocks/panel/MenuPanel.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/panel/Panel.scss b/src/app/common.blocks/panel/Panel.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/panel/Panel.tsx b/src/app/common.blocks/panel/Panel.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/panel/PathTreePanel.scss b/src/app/common.blocks/panel/PathTreePanel.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/panel/PathTreePanel.tsx b/src/app/common.blocks/panel/PathTreePanel.tsx old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/speed-canvas/SpeedCanvasElement.scss b/src/app/common.blocks/speed-canvas/SpeedCanvasElement.scss old mode 100644 new mode 100755 diff --git a/src/app/common.blocks/speed-canvas/SpeedCanvasElement.tsx b/src/app/common.blocks/speed-canvas/SpeedCanvasElement.tsx old mode 100644 new mode 100755 diff --git a/src/app/component.blocks/CanvasTooltip.scss b/src/app/component.blocks/CanvasTooltip.scss old mode 100644 new mode 100755 diff --git a/src/app/component.blocks/CanvasTooltip.tsx b/src/app/component.blocks/CanvasTooltip.tsx old mode 100644 new mode 100755 diff --git a/src/app/component.blocks/FormButton.scss b/src/app/component.blocks/FormButton.scss old mode 100644 new mode 100755 diff --git a/src/app/component.blocks/FormButton.tsx b/src/app/component.blocks/FormButton.tsx old mode 100644 new mode 100755 diff --git a/src/app/component.blocks/FormCheckbox.tsx b/src/app/component.blocks/FormCheckbox.tsx old mode 100644 new mode 100755 diff --git a/src/app/component.blocks/FormEnumSelect.tsx b/src/app/component.blocks/FormEnumSelect.tsx old mode 100644 new mode 100755 diff --git a/src/app/component.blocks/FormInputField.tsx b/src/app/component.blocks/FormInputField.tsx old mode 100644 new mode 100755 diff --git a/src/app/component.blocks/FormItemSelect.tsx b/src/app/component.blocks/FormItemSelect.tsx old mode 100644 new mode 100755 diff --git a/src/app/component.blocks/OpenModalButton.tsx b/src/app/component.blocks/OpenModalButton.tsx old mode 100644 new mode 100755 diff --git a/src/app/component.blocks/PanelBox.tsx b/src/app/component.blocks/PanelBox.tsx old mode 100644 new mode 100755 diff --git a/src/app/component.blocks/RangeSlider.tsx b/src/app/component.blocks/RangeSlider.tsx old mode 100644 new mode 100755 diff --git a/src/app/exclusive.blocks/_index.scss b/src/app/exclusive.blocks/_index.scss old mode 100644 new mode 100755 diff --git a/src/app/exclusive.blocks/_index.tsx b/src/app/exclusive.blocks/_index.tsx old mode 100644 new mode 100755 diff --git a/src/app/exclusive.blocks/panel/PathTreePanel.scss b/src/app/exclusive.blocks/panel/PathTreePanel.scss old mode 100644 new mode 100755 diff --git a/src/app/exclusive.blocks/speed-canvas/SpeedCanvasElement.scss b/src/app/exclusive.blocks/speed-canvas/SpeedCanvasElement.scss old mode 100644 new mode 100755 diff --git a/src/app/mobile.blocks/_index.scss b/src/app/mobile.blocks/_index.scss old mode 100644 new mode 100755 diff --git a/src/app/mobile.blocks/_index.tsx b/src/app/mobile.blocks/_index.tsx old mode 100644 new mode 100755 diff --git a/src/app/mobile.blocks/modal/AssetManagerModal.scss b/src/app/mobile.blocks/modal/AssetManagerModal.scss old mode 100644 new mode 100755 diff --git a/src/app/mobile.blocks/modal/CoordinateSystemModal.scss b/src/app/mobile.blocks/modal/CoordinateSystemModal.scss old mode 100644 new mode 100755 diff --git a/src/app/mobile.blocks/modal/WelcomeModal.scss b/src/app/mobile.blocks/modal/WelcomeModal.scss old mode 100644 new mode 100755 diff --git a/src/app/mobile.blocks/panel/PathTreePanel.scss b/src/app/mobile.blocks/panel/PathTreePanel.scss old mode 100644 new mode 100755 diff --git a/src/core/Asset.test.ts b/src/core/Asset.test.ts old mode 100644 new mode 100755 diff --git a/src/core/Asset.ts b/src/core/Asset.ts old mode 100644 new mode 100755 diff --git a/src/core/Calculation.test.ts b/src/core/Calculation.test.ts old mode 100644 new mode 100755 diff --git a/src/core/Calculation.ts b/src/core/Calculation.ts old mode 100644 new mode 100755 diff --git a/src/core/Canvas.ts b/src/core/Canvas.ts old mode 100644 new mode 100755 diff --git a/src/core/Clipboard.ts b/src/core/Clipboard.ts old mode 100644 new mode 100755 diff --git a/src/core/Command.test.ts b/src/core/Command.test.ts old mode 100644 new mode 100755 diff --git a/src/core/Command.ts b/src/core/Command.ts old mode 100644 new mode 100755 diff --git a/src/core/Coordinate.test.ts b/src/core/Coordinate.test.ts old mode 100644 new mode 100755 diff --git a/src/core/Coordinate.ts b/src/core/Coordinate.ts old mode 100644 new mode 100755 diff --git a/src/core/CoordinateSystem.test.ts b/src/core/CoordinateSystem.test.ts old mode 100644 new mode 100755 diff --git a/src/core/CoordinateSystem.ts b/src/core/CoordinateSystem.ts old mode 100644 new mode 100755 diff --git a/src/core/FieldEditor.ts b/src/core/FieldEditor.ts old mode 100644 new mode 100755 diff --git a/src/core/FieldImagePrompt.tsx b/src/core/FieldImagePrompt.tsx old mode 100644 new mode 100755 diff --git a/src/core/GoogleAnalytics.ts b/src/core/GoogleAnalytics.ts old mode 100644 new mode 100755 diff --git a/src/core/Hook.ts b/src/core/Hook.ts old mode 100644 new mode 100755 diff --git a/src/core/InputOutput.ts b/src/core/InputOutput.ts old mode 100644 new mode 100755 diff --git a/src/core/Layout.ts b/src/core/Layout.ts old mode 100644 new mode 100755 diff --git a/src/core/Logger.ts b/src/core/Logger.ts old mode 100644 new mode 100755 diff --git a/src/core/LoggerImpl.ts b/src/core/LoggerImpl.ts old mode 100644 new mode 100755 diff --git a/src/core/Magnet.ts b/src/core/Magnet.ts old mode 100644 new mode 100755 diff --git a/src/core/MainApp.ts b/src/core/MainApp.ts old mode 100644 new mode 100755 diff --git a/src/core/Path.test.ts b/src/core/Path.test.ts old mode 100644 new mode 100755 diff --git a/src/core/Path.ts b/src/core/Path.ts old mode 100644 new mode 100755 diff --git a/src/core/Preferences.ts b/src/core/Preferences.ts old mode 100644 new mode 100755 diff --git a/src/core/ServiceWorkerMessages.ts b/src/core/ServiceWorkerMessages.ts old mode 100644 new mode 100755 diff --git a/src/core/ServiceWorkerRegistration.ts b/src/core/ServiceWorkerRegistration.ts old mode 100644 new mode 100755 diff --git a/src/core/SpeedEditor.ts b/src/core/SpeedEditor.ts old mode 100644 new mode 100755 diff --git a/src/core/TouchEventListener.ts b/src/core/TouchEventListener.ts old mode 100644 new mode 100755 diff --git a/src/core/Unit.ts b/src/core/Unit.ts old mode 100644 new mode 100755 diff --git a/src/core/Util.test.ts b/src/core/Util.test.ts old mode 100644 new mode 100755 diff --git a/src/core/Util.ts b/src/core/Util.ts old mode 100644 new mode 100755 diff --git a/src/core/Versioning.tsx b/src/core/Versioning.tsx old mode 100644 new mode 100755 diff --git a/src/format/Config.test.ts b/src/format/Config.test.ts old mode 100644 new mode 100755 diff --git a/src/format/Config.tsx b/src/format/Config.tsx old mode 100644 new mode 100755 diff --git a/src/format/Format.test.ts b/src/format/Format.test.ts old mode 100644 new mode 100755 diff --git a/src/format/Format.tsx b/src/format/Format.tsx old mode 100644 new mode 100755 index 1f8237d3..67570f5f --- a/src/format/Format.tsx +++ b/src/format/Format.tsx @@ -12,7 +12,7 @@ import { LemLibFormatV1_0 } from "./LemLibFormatV1_0"; import { isExperimentalFeaturesEnabled } from "@core/Preferences"; import { RigidCodeGenFormatV0_1 } from "./RigidCodeGenFormatV0_1"; import { MoveToPointCodeGenFormatV0_1 } from "./MoveToPointCodeGenFormatV0_1"; - +import { xVecLibBoomerangFormatV0_1 } from "./xVecLibBoomerangFormatV0_1"; export interface Format { isInit: boolean; uid: string; @@ -121,7 +121,12 @@ export function getAllDeprecatedFormats(): Format[] { export function getAllExperimentalFormats(): Format[] { if (!isExperimentalFeaturesEnabled()) return []; - return [new LemLibFormatV1_0(), new RigidCodeGenFormatV0_1(), new MoveToPointCodeGenFormatV0_1()]; + return [ + new LemLibFormatV1_0(), + new RigidCodeGenFormatV0_1(), + new MoveToPointCodeGenFormatV0_1(), + new xVecLibBoomerangFormatV0_1() + ]; } export function getAllFormats(): Format[] { diff --git a/src/format/LemLibFormatV0_4/GeneralConfig.tsx b/src/format/LemLibFormatV0_4/GeneralConfig.tsx old mode 100644 new mode 100755 diff --git a/src/format/LemLibFormatV0_4/index.tsx b/src/format/LemLibFormatV0_4/index.tsx old mode 100644 new mode 100755 diff --git a/src/format/LemLibFormatV1_0/GeneralConfig.tsx b/src/format/LemLibFormatV1_0/GeneralConfig.tsx old mode 100644 new mode 100755 diff --git a/src/format/LemLibFormatV1_0/Serialization.ts b/src/format/LemLibFormatV1_0/Serialization.ts old mode 100644 new mode 100755 diff --git a/src/format/LemLibFormatV1_0/index.test.tsx b/src/format/LemLibFormatV1_0/index.test.tsx old mode 100644 new mode 100755 diff --git a/src/format/LemLibFormatV1_0/index.tsx b/src/format/LemLibFormatV1_0/index.tsx old mode 100644 new mode 100755 diff --git a/src/format/LemLibOdomGeneratorFormatV0_4/GeneralConfig.tsx b/src/format/LemLibOdomGeneratorFormatV0_4/GeneralConfig.tsx old mode 100644 new mode 100755 diff --git a/src/format/LemLibOdomGeneratorFormatV0_4/PathConfig.tsx b/src/format/LemLibOdomGeneratorFormatV0_4/PathConfig.tsx old mode 100644 new mode 100755 diff --git a/src/format/LemLibOdomGeneratorFormatV0_4/index.tsx b/src/format/LemLibOdomGeneratorFormatV0_4/index.tsx old mode 100644 new mode 100755 diff --git a/src/format/MoveToPointCodeGenFormatV0_1/GeneralConfig.tsx b/src/format/MoveToPointCodeGenFormatV0_1/GeneralConfig.tsx old mode 100644 new mode 100755 diff --git a/src/format/MoveToPointCodeGenFormatV0_1/PathConfig.tsx b/src/format/MoveToPointCodeGenFormatV0_1/PathConfig.tsx old mode 100644 new mode 100755 diff --git a/src/format/MoveToPointCodeGenFormatV0_1/index.tsx b/src/format/MoveToPointCodeGenFormatV0_1/index.tsx old mode 100644 new mode 100755 diff --git a/src/format/PathDotJerryioFormatV0_1/GeneralConfig.tsx b/src/format/PathDotJerryioFormatV0_1/GeneralConfig.tsx old mode 100644 new mode 100755 diff --git a/src/format/PathDotJerryioFormatV0_1/PathConfig.tsx b/src/format/PathDotJerryioFormatV0_1/PathConfig.tsx old mode 100644 new mode 100755 diff --git a/src/format/PathDotJerryioFormatV0_1/index.tsx b/src/format/PathDotJerryioFormatV0_1/index.tsx old mode 100644 new mode 100755 diff --git a/src/format/RigidCodeGenFormatV0_1/GeneralConfig.tsx b/src/format/RigidCodeGenFormatV0_1/GeneralConfig.tsx old mode 100644 new mode 100755 diff --git a/src/format/RigidCodeGenFormatV0_1/PathConfig.tsx b/src/format/RigidCodeGenFormatV0_1/PathConfig.tsx old mode 100644 new mode 100755 diff --git a/src/format/RigidCodeGenFormatV0_1/index.tsx b/src/format/RigidCodeGenFormatV0_1/index.tsx old mode 100644 new mode 100755 diff --git a/src/format/xVecLibBoomerangFormatV0_1/GeneralConfig.tsx b/src/format/xVecLibBoomerangFormatV0_1/GeneralConfig.tsx new file mode 100755 index 00000000..0d511ec0 --- /dev/null +++ b/src/format/xVecLibBoomerangFormatV0_1/GeneralConfig.tsx @@ -0,0 +1,179 @@ +import { makeAutoObservable, action } from "mobx"; +import { Typography, Button } from "@mui/material"; +import { enqueueSuccessSnackbar, enqueueErrorSnackbar } from "@src/app/Notice"; +import { FieldImageSignatureAndOrigin, FieldImageOriginType, getDefaultBuiltInFieldImage } from "@core/Asset"; +import { UpdateProperties } from "@core/Command"; +import { useCustomHotkeys, getEnableOnNonTextInputFieldsHotkeysOptions } from "@core/Hook"; +import { getAppStores } from "@core/MainApp"; +import { Logger } from "@core/Logger"; +import { UnitOfLength } from "@core/Unit"; +import { IS_MAC_OS, getMacHotKeyString, ValidateNumber } from "@core/Util"; +import { Int, CodePointBuffer } from "@src/token/Tokens"; +import { Expose, Type, Exclude } from "class-transformer"; +import { IsPositive, IsBoolean, ValidateNested, IsObject, IsString, MinLength, IsIn } from "class-validator"; +import { observer } from "mobx-react-lite"; +import { GeneralConfig, initGeneralConfig } from "../Config"; +import { Format } from "../Format"; +import { PanelBox } from "@src/app/component.blocks/PanelBox"; +import { FormInputField } from "@src/app/component.blocks/FormInputField"; +import { getNamedCoordinateSystems } from "@src/core/CoordinateSystem"; +import { FormCheckbox } from "@src/app/component.blocks/FormCheckbox"; +interface FormatWithExportCode extends Format { + exportCode(): string; +} + +const logger = Logger("xVecLib Boomerang v1.0.0 (inch)"); + +const GeneralConfigPanel = observer((props: { config: GeneralConfigImpl }) => { + const { config } = props; + + const { app, confirmation, ui } = getAppStores(); + + const isUsingEditor = !confirmation.isOpen && !ui.isOpeningModal; + + const onCopyCode = action(() => { + try { + const code = config.format.exportCode(); + + navigator.clipboard.writeText(code); + + enqueueSuccessSnackbar(logger, "Copied"); + } catch (e) { + enqueueErrorSnackbar(logger, e); + } + }); + + useCustomHotkeys("Shift+Mod+C", onCopyCode, getEnableOnNonTextInputFieldsHotkeysOptions(isUsingEditor)); + + const hotkey = IS_MAC_OS ? getMacHotKeyString("Shift+Mod+C") : "Shift+Ctrl+C"; + + return ( + <> + Export Settings + + config.chassisName} + setValue={(value: string) => { + app.history.execute(`Change chassis variable name`, new UpdateProperties(config, { chassisName: value })); + }} + isValidIntermediate={() => true} + isValidValue={(candidate: string) => candidate !== ""} + sx={{ marginTop: "16px" }} + /> + config.movementTimeout.toString()} + setValue={(value: string) => { + const parsedValue = parseInt(Int.parse(new CodePointBuffer(value))!.value); + app.history.execute( + `Change default movement timeout to ${parsedValue}`, + new UpdateProperties(config, { movementTimeout: parsedValue }) + ); + }} + isValidIntermediate={() => true} + isValidValue={(candidate: string) => Int.parse(new CodePointBuffer(candidate)) !== null} + sx={{ marginTop: "16px" }} + numeric + /> + + + + +

Documentation

+ +
+ Lead Settings + + config.maxIterations.toString()} + setValue={(value: string) => { + const parsedValue = parseInt(Int.parse(new CodePointBuffer(value))!.value); + app.history.execute( + `Change max iterations for lead to ${parsedValue}`, + new UpdateProperties(config, { maxIterations: parsedValue }) + ); + }} + isValidIntermediate={() => true} + isValidValue={(candidate: string) => Int.parse(new CodePointBuffer(candidate)) !== null} + sx={{ marginTop: "16px" }} + numeric + /> + { + app.history.execute(`Using real(bad) lead's is ${value}`, new UpdateProperties(config, { badLead: value })); + }} + /> + + + ); +}); +export class GeneralConfigImpl implements GeneralConfig { + @IsPositive() + @Expose() + robotWidth: number = 12; + @IsPositive() + @Expose() + robotHeight: number = 12; + @IsBoolean() + @Expose() + robotIsHolonomic: boolean = false; + @IsBoolean() + @Expose() + showRobot: boolean = false; + @ValidateNumber(num => num > 0 && num <= 1000) // Don't use IsEnum + @Expose() + uol: UnitOfLength = UnitOfLength.Inch; + @IsPositive() + @Expose() + pointDensity: number = 2; // inches + @IsPositive() + @Expose() + controlMagnetDistance: number = 5 / 2.54; + @Type(() => FieldImageSignatureAndOrigin) + @ValidateNested() + @IsObject() + @Expose() + fieldImage: FieldImageSignatureAndOrigin = + getDefaultBuiltInFieldImage().getSignatureAndOrigin(); + @IsString() + @MinLength(1) + @Expose() + chassisName: string = "chassis"; + @ValidateNumber(num => num >= 0) + @Expose() + movementTimeout: number = 5000; + @Expose() + maxIterations: number = 200; + @IsBoolean() + @Expose() + badLead: boolean = false; + @IsBoolean() + @Expose() + relativeCoords: boolean = true; + @IsIn(getNamedCoordinateSystems().map(s => s.name)) + @Expose() + coordinateSystem: string = "VEX Gaming Positioning System"; + @Exclude() + private format_: FormatWithExportCode; + + constructor(format: FormatWithExportCode) { + this.format_ = format; + makeAutoObservable(this); + + initGeneralConfig(this); + } + + get format() { + return this.format_; + } + + getAdditionalConfigUI() { + return ; + } +} diff --git a/src/format/xVecLibBoomerangFormatV0_1/PathConfig.tsx b/src/format/xVecLibBoomerangFormatV0_1/PathConfig.tsx new file mode 100755 index 00000000..49a2f2fa --- /dev/null +++ b/src/format/xVecLibBoomerangFormatV0_1/PathConfig.tsx @@ -0,0 +1,71 @@ +import { makeAutoObservable } from "mobx"; +import { Typography } from "@mui/material"; +import { BentRateApplicationDirection, Path } from "@core/Path"; +import { EditableNumberRange } from "@core/Util"; +import { Exclude, Expose } from "class-transformer"; +import { IsNumber } from "class-validator"; +import { PathConfig } from "../Config"; +import { Format } from "../Format"; +import { LayoutContext, LayoutType, PanelBuilderProps, PanelInstanceProps } from "@core/Layout"; +import { getAppStores } from "@core/MainApp"; +import { observer } from "mobx-react-lite"; +import React from "react"; +import LinearScaleIcon from "@mui/icons-material/LinearScale"; + +// observable class +export class PathConfigImpl implements PathConfig { + @Exclude() + speedLimit: EditableNumberRange = { + minLimit: { value: 0, label: "0" }, + maxLimit: { value: 127, label: "127" }, + step: 1, + from: 0, + to: 1 + }; + @Exclude() + bentRateApplicableRange: EditableNumberRange = { + minLimit: { value: 0, label: "0" }, + maxLimit: { value: 1, label: "1" }, + step: 0.01, + from: 0, + to: 1 + }; + @Exclude() + bentRateApplicationDirection = BentRateApplicationDirection.LowToHigh; + @IsNumber() + @Expose() + speed: number = 30; + @Exclude() + readonly format: Format; + + @Exclude() + public path!: Path; + + constructor(format: Format) { + this.format = format; + makeAutoObservable(this); + } +} + +const PathConfigPanelBody = observer((props: {}) => { + const { app } = getAppStores(); + + const pc = app.selectedPath?.pc as PathConfigImpl | undefined; + + const isClassic = React.useContext(LayoutContext) === LayoutType.Classic; + + if (pc === undefined) { + return isClassic ? undefined : (No selected path); + } + + return; +}); + +export const PathConfigPanel = (props: PanelBuilderProps): PanelInstanceProps => { + return { + id: "PathConfigAccordion", + header: "Path", + children: , + icon: + }; +}; diff --git a/src/format/xVecLibBoomerangFormatV0_1/index.test.tsx b/src/format/xVecLibBoomerangFormatV0_1/index.test.tsx new file mode 100755 index 00000000..a05bba77 --- /dev/null +++ b/src/format/xVecLibBoomerangFormatV0_1/index.test.tsx @@ -0,0 +1,40 @@ +import { xVecLibBoomerangFormatV0_1 } from "."; +import { MainApp, getAppStores } from "@core/MainApp"; +import { Control, EndControl, Segment } from "@core/Path"; +import { GeneralConfigImpl } from "./GeneralConfig"; +import { SmartBuffer } from "smart-buffer"; +import { LemLibV1_0 } from "../LemLibFormatV1_0/Serialization"; +test("dummy", () => { + const { app } = getAppStores(); // suppress constructor error +}); +test("read write path file", () => { + const format = new xVecLibBoomerangFormatV0_1(); + const path = format.createPath(); + + const buffer1 = SmartBuffer.fromSize(1024); // auto resize + path.segments.push(new Segment(new EndControl(1, 1, 0), new EndControl(60, 60, 90))); + path.segments.push(new Segment(path.segments[path.segments.length - 1].last, new EndControl(63, 60, 180))); + path.segments.push(new Segment(path.segments[path.segments.length - 1].last, new EndControl(64, 60, 270))); + + LemLibV1_0.writePath(buffer1, path); + + const result = LemLibV1_0.readPath(buffer1); + + expect(result.name).toBe(path.name); + + const points = path.cachedResult.points; + + expect(result.waypoints.length).toBe(points.length); + + for (let i = 0; i < points.length; i++) { + const point1 = points[i]; + const point2 = result.waypoints[i]; + + expect(point2.x).toBeCloseTo(point1.x, 0.1); + expect(point2.y).toBeCloseTo(point1.y, 0.1); + expect(point2.heading ?? 0).toBeCloseTo(point1.heading ?? 0); + } + + // let code = format.exportCode(); + // console.log(code); +}); diff --git a/src/format/xVecLibBoomerangFormatV0_1/index.tsx b/src/format/xVecLibBoomerangFormatV0_1/index.tsx new file mode 100755 index 00000000..b9dcd2ed --- /dev/null +++ b/src/format/xVecLibBoomerangFormatV0_1/index.tsx @@ -0,0 +1,190 @@ +import { makeAutoObservable } from "mobx"; +import { MainApp, getAppStores } from "@core/MainApp"; +import { makeId } from "@core/Util"; +import { Path, Segment } from "@core/Path"; +import { UnitOfLength, UnitConverter, Quantity } from "@core/Unit"; +import { GeneralConfig, convertFormat } from "../Config"; +import { Format, importPDJDataFromTextFile } from "../Format"; +import { PointCalculationResult, getPathPoints } from "@core/Calculation"; +import { GeneralConfigImpl } from "./GeneralConfig"; +import { PathConfigImpl } from "./PathConfig"; +// observable class +export class xVecLibBoomerangFormatV0_1 implements Format { + isInit: boolean = false; + uid: string; + + private gc = new GeneralConfigImpl(this); + + private readonly disposers: (() => void)[] = []; + + constructor() { + this.uid = makeId(10); + makeAutoObservable(this); + } + + createNewInstance(): Format { + return new xVecLibBoomerangFormatV0_1(); + } + + getName(): string { + return "xVecLib Boomerang v1.0.0 (inch)"; + } + + getDescription(): string { + return "Generates a sequence of xVecLib .moveToBoom function calls."; + } + + register(app: MainApp): void { + if (this.isInit) return; + this.isInit = true; + this.disposers.push(); + } + + unregister(): void { + this.disposers.forEach(disposer => disposer()); + } + + getGeneralConfig(): GeneralConfig { + return this.gc; + } + + createPath(...segments: Segment[]): Path { + return new Path(new PathConfigImpl(this), ...segments); + } + + getPathPoints(path: Path): PointCalculationResult { + const result = getPathPoints(path, new Quantity(this.gc.pointDensity, this.gc.uol)); + return result; + } + + convertFromFormat(oldFormat: Format, oldPaths: Path[]): Path[] { + return convertFormat(this, oldFormat, oldPaths); + } + + importPathsFromFile(buffer: ArrayBuffer): Path[] { + throw new Error("Unable to import paths from this format, try other formats?"); + } + + exportCode(): string { + const { app } = getAppStores(); + let rtn = ""; + let arr = []; + + const gc = app.gc as GeneralConfigImpl; + + const path = app.interestedPath(); + if (path === undefined) throw new Error("No path to export"); + if (path.segments.length === 0) throw new Error("No segment to export"); + + const uc = new UnitConverter(this.gc.uol, UnitOfLength.Inch); + const segments = path.segments; + if (segments.length > 0) { + let tmpp = segments[0].first.heading > 180 ? segments[0].first.heading - 360 : segments[0].first.heading; + + rtn += `${gc.chassisName}.setPos(${Math.round(segments[0].first.x)}, ${Math.round( + segments[0].first.y + )},${tmpp});\n`; + rtn += `${gc.chassisName}.printCoords();\n`; + + for (const seg of segments) { + let lead = 0; + let last = path.controls.at(path.controls.length - 1); + let first = path.controls.at(0); + let dis; + if (last != null && first != null) { + dis = path.controls.at(0)?.distance(last); + if (seg.isCubic() && dis != null) { + let closestContol = + seg.controls[1].distance(seg.first) > seg.controls[2].distance(seg.last) + ? seg.controls[1] + : seg.controls[2]; + if (seg.first === path.controls.at(0)) { + seg.first.heading = + 180 + Math.atan2(seg.first.x - closestContol.x, seg.first.y - closestContol.y) * (180 / Math.PI); + } + if ( + seg.controls[1] === closestContol && + (seg.first.heading === 0 || seg.first.heading === 180 || seg.last.heading === 0 || seg.last.heading === 0) + ) { + seg.controls[2].setXY(seg.last.x, seg.last.y); + } else if ( + seg.first.heading === 0 || + seg.first.heading === 180 || + seg.last.heading === 0 || + seg.last.heading === 0 + ) { + seg.controls[1].setXY(seg.first.x, seg.first.y); + } + if (seg.first.heading === 0 || seg.first.heading === 180) { + seg.first.heading = + Math.atan2(seg.first.x - closestContol.x, seg.first.y - closestContol.y) * (180 / Math.PI); + } + if (seg.last.heading === 0 || seg.last.heading === 180) { + seg.last.heading = + Math.atan2(seg.last.x - closestContol.x, seg.last.y - closestContol.y) * (180 / Math.PI); + } + let numIterations = 0; + if (path.segments.indexOf(seg) === path.segments.length - 1) { + lead = (seg.first.x - closestContol.x) / (dis * Math.sin(seg.first.heading)); + + while (Math.abs(lead) > 1) { + numIterations++; + if (lead > 3) { + seg.first.heading += 0.5; + } else { + seg.first.heading -= 0.5; + } + lead = (seg.first.x - closestContol.x) / (dis * Math.sin(seg.first.heading)); + if (numIterations > gc.maxIterations) { + break; + } + } + } else { + lead = (seg.last.x - closestContol.x) / (dis * Math.sin(seg.last.heading)); + while (Math.abs(lead) > 1) { + numIterations++; + if (lead > 1) { + seg.last.heading += 0.5; + } else { + seg.last.heading -= 0.5; + } + lead = (seg.last.x - closestContol.x) / (dis * Math.sin(seg.last.heading)); + if (numIterations > gc.maxIterations) { + break; + } + } + } + if (lead > 1 && !gc.badLead) { + lead = 1; + } else if (lead < -1 && !gc.badLead) { + lead = -1; + } + } + } + let tmpp = seg.last.heading > 180 ? seg.last.heading - 360 : seg.last.heading; + + arr.push([gc.chassisName, uc.fromAtoB(seg.last.x).toUser(), uc.fromAtoB(seg.last.y).toUser(), tmpp, lead]); + } + } + for (const s of arr) { + rtn += `${s[0]}.moveToBoom( ${s[1]}, ${s[2]}, ${s[3]}, ${s[4]},${gc.movementTimeout});\n`; + } + return rtn; + } + + importPDJDataFromFile(buffer: ArrayBuffer): Record | undefined { + return importPDJDataFromTextFile(buffer); + } + + exportFile(): ArrayBuffer { + const { app } = getAppStores(); + + let fileContent = this.exportCode(); + + fileContent += "\n"; + + fileContent += "#PATH.JERRYIO-DATA " + JSON.stringify(app.exportPDJData()); + + return new TextEncoder().encode(fileContent); + } +} diff --git a/src/index.tsx b/src/index.tsx old mode 100644 new mode 100755 diff --git a/src/react-app-env.d.ts b/src/react-app-env.d.ts old mode 100644 new mode 100755 diff --git a/src/service-worker.ts b/src/service-worker.ts old mode 100644 new mode 100755 diff --git a/src/setupTests.ts b/src/setupTests.ts old mode 100644 new mode 100755 diff --git a/src/token/Tokens.test.ts b/src/token/Tokens.test.ts old mode 100644 new mode 100755 diff --git a/src/token/Tokens.ts b/src/token/Tokens.ts old mode 100644 new mode 100755 diff --git a/tsconfig.json b/tsconfig.json old mode 100644 new mode 100755 diff --git a/tsconfig.paths.json b/tsconfig.paths.json old mode 100644 new mode 100755