diff --git a/index.html b/index.html
index 31de33d5..165feb76 100644
--- a/index.html
+++ b/index.html
@@ -194,7 +194,6 @@
});
draw.on('change:active', function (evt) {
- console.log('drawPoint', evt);
if (evt.target.active) {
cad.setProperties({
showSnapPoints: true,
@@ -208,7 +207,6 @@
});
drawLine.on('change:active', function (evt) {
- console.log('drawLine', evt);
if (evt.target.active) {
cad.setProperties({
showSnapPoints: false,
@@ -222,7 +220,6 @@
});
drawPoly.on('change:active', function (evt) {
- console.log('drawLine', evt);
if (evt.target.active) {
cad.setProperties({
showSnapPoints: false,
diff --git a/package.json b/package.json
index b477a166..14c43e83 100644
--- a/package.json
+++ b/package.json
@@ -13,13 +13,13 @@
"devDependencies": {
"@commitlint/cli": "19.5.0",
"@commitlint/config-conventional": "19.5.0",
- "cypress": "13.14.2",
+ "cypress": "13.15.0",
"esbuild": "0.24.0",
"eslint": "8",
"eslint-config-airbnb-base": "15.0.0",
"eslint-config-prettier": "9.1.0",
"eslint-plugin-cypress": "3.5.0",
- "eslint-plugin-import": "2.30.0",
+ "eslint-plugin-import": "2.31.0",
"eslint-plugin-prettier": "5.2.1",
"fixpack": "4.0.0",
"happy-dom": "^15.7.4",
@@ -30,7 +30,7 @@
"jsts": "2.11.3",
"lint-staged": "15.2.10",
"lodash.throttle": "4.1.1",
- "ol": "^10.2.0",
+ "ol": "^10.2.1",
"prettier": "3.3.3",
"shx": "0.3.4",
"standard-version": "9.5.0",
@@ -38,7 +38,7 @@
"stylelint": "16.9.0",
"stylelint-config-standard": "36.0.1",
"typescript": "5.6.2",
- "vitest": "^2.1.1"
+ "vitest": "^2.1.2"
},
"scripts": {
"build": "shx rm -rf build && tsc --project config/tsconfig-build.json && esbuild build/index.js --bundle --global-name=ole --loader:.svg=dataurl --minify --outfile=build/bundle.js",
diff --git a/src/control/cad.js b/src/control/cad.js
index ccc98a3a..e52999dc 100644
--- a/src/control/cad.js
+++ b/src/control/cad.js
@@ -315,14 +315,13 @@ class CadControl extends Control {
const geom = feature.getGeometry();
if (!(geom instanceof Circle) && !(geom instanceof Point)) {
- const snapGeom = getShiftedMultiPoint(geom, coordinate);
+ const snapGeom = getShiftedMultiPoint(geom);
const isPolygon = geom instanceof Polygon;
const snapFeature = feature.clone();
+ const coordinates = snapGeom.getCoordinates();
snapFeature
.getGeometry()
- .setCoordinates(
- isPolygon ? [snapGeom.getCoordinates()] : snapGeom.getCoordinates(),
- );
+ .setCoordinates(isPolygon ? [coordinates] : coordinates);
features = [snapFeature, ...features];
}
});
diff --git a/src/helper/getShiftedMultiPoint.js b/src/helper/getShiftedMultiPoint.js
index 4f8ba377..a777d31a 100644
--- a/src/helper/getShiftedMultiPoint.js
+++ b/src/helper/getShiftedMultiPoint.js
@@ -1,30 +1,25 @@
-import { MultiPoint } from 'ol/geom';
+import { MultiPoint, LineString } from 'ol/geom';
/**
- * Removes the closest node to a given coordinate from a given geometry.
+ * Removes the last coordinate of a given geometry (Line or Polygon).
+ * When we draw the last coordinate if tat mouse cursor.
* @private
* @param {ol.Geometry} geometry An openlayers geometry.
- * @param {ol.Coordinate} coordinate Coordinate.
* @returns {ol.Geometry.MultiPoint} An openlayers MultiPoint geometry.
*/
-const getShiftedMultipoint = (geometry, coordinate) => {
- // Include all but the closest vertex to the coordinate (e.g. at mouse position)
+const getShiftedMultipoint = (geometry) => {
+ // Include all but the last vertex to the coordinate (e.g. at mouse position)
// to prevent snapping on mouse cursor node
const isPolygon = geometry.getType() === 'Polygon';
- const shiftedMultipoint = new MultiPoint(
- isPolygon ? geometry.getCoordinates()[0] : geometry.getCoordinates(),
- );
+ const lineGeometry = isPolygon
+ ? new LineString(geometry.getCoordinates()[0])
+ : geometry;
- const drawNodeCoordinate = shiftedMultipoint.getClosestPoint(coordinate);
-
- // Exclude the node being modified
- shiftedMultipoint.setCoordinates(
- shiftedMultipoint
- .getCoordinates()
- .filter((coord) => coord.toString() !== drawNodeCoordinate.toString()),
- );
-
- return shiftedMultipoint;
+ const coordinates = [];
+ lineGeometry.forEachSegment((start) => {
+ coordinates.push(start);
+ });
+ return new MultiPoint(coordinates);
};
export default getShiftedMultipoint;
diff --git a/yarn.lock b/yarn.lock
index 1abb4c0e..d40cb957 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -226,7 +226,7 @@
resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz#7dfccb9df5499e627e7bfdbb4021a06813a45dba"
integrity sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==
-"@cypress/request@^3.0.1":
+"@cypress/request@^3.0.4":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.5.tgz#d893a6e68ce2636c085fcd8d7283c3186499ba63"
integrity sha512-v+XHd9XmWbufxF1/bTaVm2yhbxY+TB4YtWRqF2zaXBlDNMkls34KiATz0AVDLavL3iB6bQk9/7n3oY1EoLSWGA==
@@ -790,62 +790,69 @@
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
-"@vitest/expect@2.1.1":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.1.tgz#907137a86246c5328929d796d741c4e95d1ee19d"
- integrity sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==
+"@vitest/expect@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.2.tgz#e92fa284b8472548f72cacfe896020c64af6bf78"
+ integrity sha512-FEgtlN8mIUSEAAnlvn7mP8vzaWhEaAEvhSXCqrsijM7K6QqjB11qoRZYEd4AKSCDz8p0/+yH5LzhZ47qt+EyPg==
dependencies:
- "@vitest/spy" "2.1.1"
- "@vitest/utils" "2.1.1"
+ "@vitest/spy" "2.1.2"
+ "@vitest/utils" "2.1.2"
chai "^5.1.1"
tinyrainbow "^1.2.0"
-"@vitest/mocker@2.1.1":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.1.tgz#3e37c80ac267318d4aa03c5073a017d148dc8e67"
- integrity sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==
+"@vitest/mocker@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.2.tgz#08853a9d8d12afba284aebdf9b5ea26ddae5f20a"
+ integrity sha512-ExElkCGMS13JAJy+812fw1aCv2QO/LBK6CyO4WOPAzLTmve50gydOlWhgdBJPx2ztbADUq3JVI0C5U+bShaeEA==
dependencies:
"@vitest/spy" "^2.1.0-beta.1"
estree-walker "^3.0.3"
magic-string "^0.30.11"
-"@vitest/pretty-format@2.1.1", "@vitest/pretty-format@^2.1.1":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.1.tgz#fea25dd4e88c3c1329fbccd1d16b1d607eb40067"
- integrity sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==
+"@vitest/pretty-format@2.1.2", "@vitest/pretty-format@^2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.2.tgz#42882ea18c4cd40428e34f74bbac706a82465193"
+ integrity sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==
dependencies:
tinyrainbow "^1.2.0"
-"@vitest/runner@2.1.1":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.1.tgz#f3b1fbc3c109fc44e2cceecc881344453f275559"
- integrity sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==
+"@vitest/runner@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.2.tgz#14da1f5eac43fbd9a37d7cd72de102e8f785d727"
+ integrity sha512-UCsPtvluHO3u7jdoONGjOSil+uON5SSvU9buQh3lP7GgUXHp78guN1wRmZDX4wGK6J10f9NUtP6pO+SFquoMlw==
dependencies:
- "@vitest/utils" "2.1.1"
+ "@vitest/utils" "2.1.2"
pathe "^1.1.2"
-"@vitest/snapshot@2.1.1":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.1.tgz#38ef23104e90231fea5540754a19d8468afbba66"
- integrity sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==
+"@vitest/snapshot@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.2.tgz#e20bd794b33fdcd4bfe69138baac7bb890c4d51f"
+ integrity sha512-xtAeNsZ++aRIYIUsek7VHzry/9AcxeULlegBvsdLncLmNCR6tR8SRjn8BbDP4naxtccvzTqZ+L1ltZlRCfBZFA==
dependencies:
- "@vitest/pretty-format" "2.1.1"
+ "@vitest/pretty-format" "2.1.2"
magic-string "^0.30.11"
pathe "^1.1.2"
-"@vitest/spy@2.1.1", "@vitest/spy@^2.1.0-beta.1":
+"@vitest/spy@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.2.tgz#bccdeca597c8fc3777302889e8c98cec9264df44"
+ integrity sha512-GSUi5zoy+abNRJwmFhBDC0yRuVUn8WMlQscvnbbXdKLXX9dE59YbfwXxuJ/mth6eeqIzofU8BB5XDo/Ns/qK2A==
+ dependencies:
+ tinyspy "^3.0.0"
+
+"@vitest/spy@^2.1.0-beta.1":
version "2.1.1"
resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.1.tgz#20891f7421a994256ea0d739ed72f05532c78488"
integrity sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==
dependencies:
tinyspy "^3.0.0"
-"@vitest/utils@2.1.1":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.1.tgz#284d016449ecb4f8704d198d049fde8360cc136e"
- integrity sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==
+"@vitest/utils@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.2.tgz#222ac35ba02493173e40581256eb7a62520fcdba"
+ integrity sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==
dependencies:
- "@vitest/pretty-format" "2.1.1"
+ "@vitest/pretty-format" "2.1.2"
loupe "^3.1.1"
tinyrainbow "^1.2.0"
@@ -1700,12 +1707,12 @@ cssesc@^3.0.0:
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
-cypress@13.14.2:
- version "13.14.2"
- resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.14.2.tgz#4237eb7b26de2baeaa1f01e585f965d88fca7f39"
- integrity sha512-lsiQrN17vHMB2fnvxIrKLAjOr9bPwsNbPZNrWf99s4u+DVmCY6U+w7O3GGG9FvP4EUVYaDu+guWeNLiUzBrqvA==
+cypress@13.15.0:
+ version "13.15.0"
+ resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.15.0.tgz#5eca5387ef34b2e611cfa291967c69c2cd39381d"
+ integrity sha512-53aO7PwOfi604qzOkCSzNlWquCynLlKE/rmmpSPcziRH6LNfaDUAklQT6WJIsD8ywxlIy+uVZsnTMCCQVd2kTw==
dependencies:
- "@cypress/request" "^3.0.1"
+ "@cypress/request" "^3.0.4"
"@cypress/xvfb" "^1.2.4"
"@types/sinonjs__fake-timers" "8.1.1"
"@types/sizzle" "^2.3.2"
@@ -2177,10 +2184,10 @@ eslint-import-resolver-node@^0.3.9:
is-core-module "^2.13.0"
resolve "^1.22.4"
-eslint-module-utils@^2.9.0:
- version "2.11.0"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz#b99b211ca4318243f09661fae088f373ad5243c4"
- integrity sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==
+eslint-module-utils@^2.12.0:
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b"
+ integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==
dependencies:
debug "^3.2.7"
@@ -2191,10 +2198,10 @@ eslint-plugin-cypress@3.5.0:
dependencies:
globals "^13.20.0"
-eslint-plugin-import@2.30.0:
- version "2.30.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449"
- integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==
+eslint-plugin-import@2.31.0:
+ version "2.31.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7"
+ integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==
dependencies:
"@rtsao/scc" "^1.1.0"
array-includes "^3.1.8"
@@ -2204,7 +2211,7 @@ eslint-plugin-import@2.30.0:
debug "^3.2.7"
doctrine "^2.1.0"
eslint-import-resolver-node "^0.3.9"
- eslint-module-utils "^2.9.0"
+ eslint-module-utils "^2.12.0"
hasown "^2.0.2"
is-core-module "^2.15.1"
is-glob "^4.0.3"
@@ -2213,6 +2220,7 @@ eslint-plugin-import@2.30.0:
object.groupby "^1.0.3"
object.values "^1.2.0"
semver "^6.3.1"
+ string.prototype.trimend "^1.0.8"
tsconfig-paths "^3.15.0"
eslint-plugin-prettier@5.2.1:
@@ -4027,10 +4035,10 @@ object.values@^1.2.0:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
-ol@^10.2.0:
- version "10.2.0"
- resolved "https://registry.yarnpkg.com/ol/-/ol-10.2.0.tgz#e3a5afaeb67b29cce87d16898a8a907bca57699d"
- integrity sha512-yYFNV8LzN3uOP9qDecMdq07IKlD5P3KfbT+pfOje/XlsnMNLXOb3ZjCZN86wtbew8aq+RfdJ+XylVI8MZsp4Vw==
+ol@^10.2.1:
+ version "10.2.1"
+ resolved "https://registry.yarnpkg.com/ol/-/ol-10.2.1.tgz#05143d0bbc0d8761385e0acae4ec9074a570bf64"
+ integrity sha512-2bB/y2vEnmzjqynP0NA7Cp8k86No3Psn63Dueicep3E3i09axWRVIG5IS/bylEAGfWQx0QXD/uljkyFoY60Wig==
dependencies:
"@types/rbush" "3.0.3"
color-rgba "^3.0.0"
@@ -5509,10 +5517,10 @@ verror@1.10.0:
core-util-is "1.0.2"
extsprintf "^1.2.0"
-vite-node@2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.1.tgz#7d46f623c04dfed6df34e7127711508a3386fa1c"
- integrity sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==
+vite-node@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.2.tgz#f5491a2b399959c9e2f3c4b70cb0cbaecf9be6d2"
+ integrity sha512-HPcGNN5g/7I2OtPjLqgOtCRu/qhVvBxTUD3qzitmL0SrG1cWFzxzhMDWussxSbrRYWqnKf8P2jiNhPMSN+ymsQ==
dependencies:
cac "^6.7.14"
debug "^4.3.6"
@@ -5530,18 +5538,18 @@ vite@^5.0.0:
optionalDependencies:
fsevents "~2.3.3"
-vitest@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.1.tgz#24a6f6f5d894509f10685b82de008c507faacbb1"
- integrity sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==
- dependencies:
- "@vitest/expect" "2.1.1"
- "@vitest/mocker" "2.1.1"
- "@vitest/pretty-format" "^2.1.1"
- "@vitest/runner" "2.1.1"
- "@vitest/snapshot" "2.1.1"
- "@vitest/spy" "2.1.1"
- "@vitest/utils" "2.1.1"
+vitest@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.2.tgz#f285fdde876749fddc0cb4d9748ae224443c1694"
+ integrity sha512-veNjLizOMkRrJ6xxb+pvxN6/QAWg95mzcRjtmkepXdN87FNfxAss9RKe2far/G9cQpipfgP2taqg0KiWsquj8A==
+ dependencies:
+ "@vitest/expect" "2.1.2"
+ "@vitest/mocker" "2.1.2"
+ "@vitest/pretty-format" "^2.1.2"
+ "@vitest/runner" "2.1.2"
+ "@vitest/snapshot" "2.1.2"
+ "@vitest/spy" "2.1.2"
+ "@vitest/utils" "2.1.2"
chai "^5.1.1"
debug "^4.3.6"
magic-string "^0.30.11"
@@ -5552,7 +5560,7 @@ vitest@^2.1.1:
tinypool "^1.0.0"
tinyrainbow "^1.2.0"
vite "^5.0.0"
- vite-node "2.1.1"
+ vite-node "2.1.2"
why-is-node-running "^2.3.0"
wait-on@8.0.1: