-
Notifications
You must be signed in to change notification settings - Fork 0
/
create-callout-with-leader.ts
137 lines (122 loc) · 5.97 KB
/
create-callout-with-leader.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import { mainLog } from './utils/logger.js';
import { ApiClient } from './utils/apiclient.js';
import { BasicNode, Edge, GetDrawingJsonExportResponse, GetViewJsonGeometryResponse, View2, SnapPointType, DrawingObjectType, ModifyStatusResponseOutput, SingleRequestResultStatus } from './utils/onshapetypes.js';
import { usage, waitForModifyToFinish, DrawingScriptArgs, parseDrawingScriptArgs, validateBaseURLs, convertPointViewToPaper } from './utils/drawingutils.js';
import { getDrawingJsonExport, getRandomViewOnActiveSheetFromExportData } from './utils/drawingutils.js';
const LOG = mainLog();
let drawingScriptArgs: DrawingScriptArgs = null;
let validArgs: boolean = true;
let apiClient: ApiClient = null;
try {
drawingScriptArgs = parseDrawingScriptArgs();
apiClient = await ApiClient.createApiClient(drawingScriptArgs.stackToUse);
validateBaseURLs(apiClient.getBaseURL(), drawingScriptArgs.baseURL);
} catch (error) {
validArgs = false;
usage('create-callout-with-leader');
}
if (validArgs) {
try {
LOG.info(`documentId=${drawingScriptArgs.documentId}, workspaceId=${drawingScriptArgs.workspaceId}, elementId=${drawingScriptArgs.elementId}`);
const textHeight = 0.12;
const annotationText = 'Callout';
let viewToUse: View2 = null;
let retrieveViewJsonGeometryResponse: GetViewJsonGeometryResponse = null;
var leaderLocation: number[] = null;
var leaderSnapPointType: SnapPointType = null;
var leaderEdgeId: string = null;
var leaderViewId: string = null;
var calloutLocation: number[] = null;
/**
* Retrieve a drawing view and some of its edges to get enough information to create the callout with leader
*/
let drawingJsonExport: GetDrawingJsonExportResponse = await getDrawingJsonExport(apiClient, drawingScriptArgs.documentId, 'w', drawingScriptArgs.workspaceId, drawingScriptArgs.elementId) as GetDrawingJsonExportResponse;
viewToUse = getRandomViewOnActiveSheetFromExportData(drawingJsonExport);
if (viewToUse !== null) {
LOG.info('Initiated retrieval of view json geometry');
retrieveViewJsonGeometryResponse = await apiClient.get(`api/appelements/d/${drawingScriptArgs.documentId}/w/${drawingScriptArgs.workspaceId}/e/${drawingScriptArgs.elementId}/views/${viewToUse.viewId}/jsongeometry`) as GetViewJsonGeometryResponse;
for (let indexEdge = 0; indexEdge < retrieveViewJsonGeometryResponse.bodyData.length; indexEdge++) {
let edge: Edge = retrieveViewJsonGeometryResponse.bodyData[indexEdge];
if (edge.type === 'line') {
// Locate leader at midpoint of edge
leaderLocation = [
(edge.data.start[0] + edge.data.end[0]) / 2.0,
(edge.data.start[1] + edge.data.end[1]) / 2.0,
(edge.data.start[2] + edge.data.end[2]) / 2.0
];
leaderSnapPointType = SnapPointType.ModeMid;
var calloutLocationInViewSpace = leaderLocation;
calloutLocation = convertPointViewToPaper(calloutLocationInViewSpace, viewToUse.viewToPaperMatrix.items);
// Separate callout from leader slightly
calloutLocation[0] -= 2.0;
calloutLocation[1] -= 2.0;
leaderEdgeId = edge.uniqueId;
leaderViewId = viewToUse.viewId;
break;
}
}
}
if (viewToUse != null && leaderLocation !== null && leaderEdgeId !== null && leaderViewId !== null) {
const requestBody = {
description: 'Add callout',
jsonRequests: [
{
messageName: 'onshapeCreateAnnotations',
formatVersion: '2021-01-01',
annotations: [
{
type: DrawingObjectType.CALLOUT,
callout: {
borderShape: 'Circle',
borderSize: 0,
contents: annotationText,
contentsBottom: 'bottom',
contentsLeft: 'left',
contentsRight: 'right',
contentsTop: 'top',
leaderPosition: {
type: 'Onshape::Reference::Point',
coordinate: leaderLocation,
uniqueId: leaderEdgeId,
viewId: leaderViewId,
snapPointType: leaderSnapPointType
},
position: {
type: 'Onshape::Reference::Point',
coordinate: calloutLocation
},
textHeight: textHeight
}
}
]
}
]
};
/**
* Modify the drawing to create a callout with leader
*/
const modifyRequest = await apiClient.post(`api/v6/drawings/d/${drawingScriptArgs.documentId}/w/${drawingScriptArgs.workspaceId}/e/${drawingScriptArgs.elementId}/modify`, requestBody) as BasicNode;
const responseOutput: ModifyStatusResponseOutput = await waitForModifyToFinish(apiClient, modifyRequest.id);
if (responseOutput) {
// Only 1 request was made - verify it succeeded
if (responseOutput.results.length == 1 &&
responseOutput.results[0].status === SingleRequestResultStatus.RequestSuccess) {
// Success - logicalId of new callout is available
const newLogicalId = responseOutput.results[0].logicalId;
console.log(`Create callout with leader succeeded and has a logicalId: ${newLogicalId}`);
} else {
console.log(`Create callout with leader failed. Response status code: ${responseOutput.statusCode}.`)
}
} else {
console.log('Create callout with leader failed waiting for modify to finish.');
LOG.info('Create callout with leader failed waiting for modify to finish.');
}
} else {
console.log('Insufficient view and edge information to create the callout with leader.');
LOG.error('Create callout with leader failed due to insufficient view and edge information.');
}
} catch (error) {
console.error(error);
LOG.error('Create callout with leader failed.', error);
}
}