aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/collections
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/collections')
-rw-r--r--src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx8
-rw-r--r--src/client/views/collections/collectionFreeForm/SmartDrawHandler.tsx51
2 files changed, 43 insertions, 16 deletions
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
index a27ac2a0c..93b63ac4c 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
@@ -1267,17 +1267,17 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
SmartDrawHandler.Instance.displaySmartDrawHandler(e.pageX, e.pageY, this.createInkStrokes);
};
- @action
+ @undoBatch
createInkStrokes = (strokeList: InkData[], alpha?: number) => {
console.log(strokeList.length);
strokeList.forEach(inkData => {
// const points: InkData = FitCurve(inkData, 20) as InkData;
- const allPts = GenerateControlPoints(inkData, alpha);
- const bounds = InkField.getBounds(allPts);
+ // const allPts = GenerateControlPoints(inkData, alpha);
+ const bounds = InkField.getBounds(inkData);
const B = this.screenToFreeformContentsXf.transformBounds(bounds.left, bounds.top, bounds.width, bounds.height);
const inkWidth = ActiveInkWidth() * this.ScreenToLocalBoxXf().Scale;
const inkDoc = Docs.Create.InkDocument(
- allPts,
+ inkData,
{ title: 'stroke',
x: B.x - inkWidth / 2,
y: B.y - inkWidth / 2,
diff --git a/src/client/views/collections/collectionFreeForm/SmartDrawHandler.tsx b/src/client/views/collections/collectionFreeForm/SmartDrawHandler.tsx
index 4c2e78e31..956a8d7e9 100644
--- a/src/client/views/collections/collectionFreeForm/SmartDrawHandler.tsx
+++ b/src/client/views/collections/collectionFreeForm/SmartDrawHandler.tsx
@@ -12,6 +12,8 @@ import './ImageLabelHandler.scss';
import { gptAPICall, GPTCallType } from '../../../apis/gpt/GPT';
import { InkData } from '../../../../fields/InkField';
import { ButtonType } from '../../nodes/FontIconBox/FontIconBox';
+import { SVGToBezier } from '../../../util/bezierFit';
+const { parse, stringify } = require('svgson');
@observer
export class SmartDrawHandler extends ObservableReactComponent<{}> {
@@ -69,19 +71,44 @@ export class SmartDrawHandler extends ObservableReactComponent<{}> {
return;
}
console.log('GPT response:', res);
- const simplifiedRes: string = res.replace(/[^\d\[\],]/g, '');
- try {
- const parsedPts = JSON.parse(simplifiedRes);
- if (parsedPts[0][0][0]) {
- const controlPts = (parsedPts as [number, number][][]).map((stroke: [number, number][]) => stroke.map(([X, Y]) => ({ X: X + startPoint.X - 100, Y: Y + startPoint.Y - 100 })));
- this._addToDocFunc(controlPts, this._alpha);
- } else {
- const controlPts = (parsedPts as [number, number][]).map(([X, Y]) => ({ X: X + startPoint.X - 100, Y: Y + startPoint.Y - 100 }));
- this._addToDocFunc([controlPts], this._alpha);
- }
- } catch (err) {
- console.error('Error likely from bad GPT output type');
+ const svg = res.match(/<svg[^>]*>([\s\S]*?)<\/svg>/g);
+ console.log('svg', svg);
+ if (svg) {
+ const svgObject = await parse(svg[0]);
+ console.log('svg object', svgObject);
+ const svgStrokes: any = svgObject.children;
+ const beziers: InkData[] = [];
+ svgStrokes.forEach((stroke: any) => {
+ const convertedBezier: InkData = SVGToBezier(stroke.name, stroke.attributes);
+ beziers.push(
+ convertedBezier.map(point => {
+ return { X: point.X + startPoint.X, Y: point.Y + startPoint.Y };
+ })
+ );
+ });
+ this._addToDocFunc(beziers);
}
+
+ // const strokes = res.trim().split(/\s*(?=\s*M)/); // prettier-ignore
+ // const parsedSegments: InkData[] = [];
+ // console.log('strokes', strokes);
+ // strokes.forEach(stroke => {
+ // stroke = stroke.replace(/C\s*\((\d+,\d+)\)\s*\((\d+,\d+)\)\s*\((\d+,\d+)\)/g, (c, p1, p2, p3) => {
+ // return `C (${p1}) (${p2}) (${p3}) (${p3})`;
+ // });
+ // const coordStrings = stroke.match(/(\d+,\d+)/g);
+ // const coords: InkData = [];
+ // if (coordStrings) {
+ // coordStrings.forEach(coord => {
+ // const xy = coord.split(',');
+ // coords.push({ X: parseInt(xy[0]), Y: parseInt(xy[1]) });
+ // });
+ // coords.pop();
+ // parsedSegments.push(coords);
+ // }
+ // console.log('coords', coords);
+ // });
+ // this._addToDocFunc(parsedSegments);
} catch (err) {
console.error('GPT call failed', err);
}