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