Feature("Brush relations").tag("@regress"); const IMAGE = "https://data.heartex.net/open-images/train_0/mini/0030019819f25b28.jpg"; const config = ` `; function getPointAtSpiral(t, v, w) { return { x: v * t * Math.cos(w * t), y: v * t * Math.sin(w * t) }; } function generateSpiralPoints(x0, y0, R, v, w) { let t = 1; let x; let y; const points = []; do { ({ x, y } = getPointAtSpiral(t++, v, w)); points.push([x + x0, y + y0]); } while (x ** 2 + y ** 2 < R ** 2); return points; } Scenario( "Brush relations shouldn't crash everything", async ({ I, LabelStudio, AtImageView, AtOutliner, AtDetails }) => { const params = { config, data: { image: IMAGE }, }; I.amOnPage("/"); LabelStudio.init(params); LabelStudio.waitForObjectsReady(); AtOutliner.seeRegions(0); await AtImageView.lookForStage(); const canvasSize = await AtImageView.getCanvasSize(); const regionsCentralPoints = []; // create 4 brush regions for (let i = 0; i < 4; i++) { // find start position const x = (canvasSize.width / 4) * ((i % 2) * 2 + 1); const y = (canvasSize.height / 4) * ((Math.floor(i / 2) % 2) * 2 + 1); // generate points in a spiral const points = generateSpiralPoints( x, y, Math.min(canvasSize.width / 6, canvasSize.height / 6), 0.4, Math.PI / 18, ); // select the brush label I.pressKey("1"); // draw a brush region AtImageView.drawThroughPoints(points); AtOutliner.seeRegions(i + 1); // unselect the region I.pressKey("u"); // save the central point regionsCentralPoints.push({ x, y }); } // switch to the move tool for easy region selecting I.pressKey("v"); // select the first region AtImageView.clickAt(regionsCentralPoints[0].x, regionsCentralPoints[0].y); // create relation to the second region I.pressKey(["alt", "r"]); AtImageView.clickAt(regionsCentralPoints[1].x, regionsCentralPoints[1].y); // check that the relation has been created AtDetails.seeRelations(1); // Check that relations work fine on a brush restoration (from rle) { // export annotation const annotation = await LabelStudio.serialize(); // reload LS with that datalabel studio logo LabelStudio.init({ ...params, annotations: [{ id: "imported", result: annotation }], }); LabelStudio.waitForObjectsReady(); // Check that relation still exist AtDetails.seeRelations(1); // move tool is already selected and stored so we don't need to select it again // I.pressKey("v"); // select the third region AtImageView.clickAt(regionsCentralPoints[2].x, regionsCentralPoints[2].y); // create relation to the fourth region I.pressKey(["alt", "r"]); AtImageView.clickAt(regionsCentralPoints[3].x, regionsCentralPoints[3].y); // check that the relation has been created AtDetails.seeRelations(2); /// The potential errors should be caught by `errorsCollector` plugin } }, );