@atlisp/mcp 1.8.15 → 1.8.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/handlers/3d-handlers.js +128 -0
- package/dist/handlers/batch-handlers.js +260 -0
- package/dist/handlers/block-handlers.js +214 -0
- package/dist/handlers/cad-handlers.js +180 -0
- package/dist/handlers/constraint-handlers.js +130 -0
- package/dist/handlers/dim-hatch-handlers.js +340 -0
- package/dist/handlers/draw-handlers.js +175 -0
- package/dist/handlers/edit-handlers.js +179 -0
- package/dist/handlers/entity-handlers.js +196 -0
- package/dist/handlers/external-handlers.js +218 -0
- package/dist/handlers/file-handlers.js +172 -0
- package/dist/handlers/function-handlers.js +158 -0
- package/dist/handlers/layer-handlers.js +181 -0
- package/dist/handlers/package-handlers.js +89 -0
- package/dist/handlers/parametric-handlers.js +272 -0
- package/dist/handlers/pdf-annotation-handlers.js +117 -0
- package/dist/handlers/prompt-handlers.js +9 -0
- package/dist/handlers/purge-handlers.js +137 -0
- package/dist/handlers/query-print-handlers.js +662 -0
- package/dist/handlers/resource-cache.js +63 -0
- package/dist/handlers/resource-defs.js +79 -0
- package/dist/handlers/resource-handlers.js +131 -0
- package/dist/handlers/resource-readers.js +1045 -0
- package/dist/handlers/sheetset-handlers.js +430 -0
- package/dist/handlers/spatial-handlers.js +174 -0
- package/dist/handlers/style-handlers.js +162 -0
- package/dist/handlers/text-handlers.js +198 -0
- package/dist/handlers/ucs-layout-handlers.js +271 -0
- package/dist/handlers/viewport-handlers.js +150 -0
- package/dist/handlers/xdata-handlers.js +148 -0
- package/dist/handlers/xref-handlers.js +334 -0
- package/dist/lisp-security.js +7 -2
- package/package.json +2 -2
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { cad } from '../cad.js';
|
|
2
|
+
import { log } from '../logger.js';
|
|
3
|
+
import { mcpSuccess, mcpError, ensureCadConnected, escapeLispString } from '../handler-utils.js';
|
|
4
|
+
|
|
5
|
+
export async function createSheetSet(name, description = '') {
|
|
6
|
+
try {
|
|
7
|
+
await ensureCadConnected();
|
|
8
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
9
|
+
(vl-load-com)
|
|
10
|
+
(setq ss (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
11
|
+
(setq newSheetSet (vla-add ss "${escapeLispString(name)}"))
|
|
12
|
+
(vla-put-description newSheetSet "${escapeLispString(description)}")
|
|
13
|
+
(princ (vla-get-name newSheetSet))
|
|
14
|
+
)`);
|
|
15
|
+
return mcpSuccess(JSON.stringify({ name, description, created: !!result }));
|
|
16
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function openSheetSet(filePath) {
|
|
20
|
+
try {
|
|
21
|
+
await ensureCadConnected();
|
|
22
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
23
|
+
(vl-load-com)
|
|
24
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
25
|
+
(setq sheetSet (vla-open ssMgr "${escapeLispString(filePath)}"))
|
|
26
|
+
(princ (vla-get-name sheetSet))
|
|
27
|
+
)`);
|
|
28
|
+
return mcpSuccess(JSON.stringify({ filePath, name: result, opened: !!result }));
|
|
29
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function listSheetSets() {
|
|
33
|
+
try {
|
|
34
|
+
await ensureCadConnected();
|
|
35
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
36
|
+
(vl-load-com)
|
|
37
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))) result nil)
|
|
38
|
+
(vlax-for ss ssMgr (setq result (cons (vla-get-name ss) result)))
|
|
39
|
+
(princ (vl-prin1-to-string (reverse result)))
|
|
40
|
+
)`);
|
|
41
|
+
let sets = [];
|
|
42
|
+
if (result && result !== 'nil') { try { sets = JSON.parse(result); } catch { sets = []; } }
|
|
43
|
+
return mcpSuccess(JSON.stringify({ sheetSets: sets }));
|
|
44
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function addSheet(sheetSetName, sheetName, layoutName = 'Model') {
|
|
48
|
+
try {
|
|
49
|
+
await ensureCadConnected();
|
|
50
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
51
|
+
(vl-load-com)
|
|
52
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
53
|
+
(vlax-for ss ssMgr
|
|
54
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}")
|
|
55
|
+
(progn (setq sheet (vla-add (vla-get-sheets ss) "${escapeLispString(sheetName)}" "${escapeLispString(layoutName)}")) (princ (vla-get-name sheet)))
|
|
56
|
+
)
|
|
57
|
+
)
|
|
58
|
+
)`);
|
|
59
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, sheetName, layoutName, added: !!result }));
|
|
60
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export async function listSheets(sheetSetName) {
|
|
64
|
+
try {
|
|
65
|
+
await ensureCadConnected();
|
|
66
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
67
|
+
(vl-load-com)
|
|
68
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
69
|
+
(vlax-for ss ssMgr
|
|
70
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}")
|
|
71
|
+
(progn
|
|
72
|
+
(setq sheets nil)
|
|
73
|
+
(vlax-for sheet (vla-get-sheets ss) (setq sheets (cons (list (vla-get-name sheet) (vla-get-layout sheet)) sheets)))
|
|
74
|
+
(princ (vl-prin1-to-string (reverse sheets)))
|
|
75
|
+
)
|
|
76
|
+
)
|
|
77
|
+
)
|
|
78
|
+
)`);
|
|
79
|
+
let sheets = [];
|
|
80
|
+
if (result && result !== 'nil') { try { sheets = JSON.parse(result); } catch { sheets = []; } }
|
|
81
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, sheets, count: sheets.length }));
|
|
82
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export async function deleteSheet(sheetSetName, sheetName) {
|
|
86
|
+
try {
|
|
87
|
+
await ensureCadConnected();
|
|
88
|
+
await cad.sendCommand(`(progn
|
|
89
|
+
(vl-load-com)
|
|
90
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
91
|
+
(vlax-for ss ssMgr
|
|
92
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}")
|
|
93
|
+
(vlax-for sheet (vla-get-sheets ss)
|
|
94
|
+
(if (= (vla-get-name sheet) "${escapeLispString(sheetName)}") (vla-delete sheet))
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
)
|
|
98
|
+
(princ "deleted")
|
|
99
|
+
)`);
|
|
100
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, sheetName, deleted: true }));
|
|
101
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export async function publishSheetSet(sheetSetName, outputDir, format = 'PDF') {
|
|
105
|
+
try {
|
|
106
|
+
await ensureCadConnected();
|
|
107
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
108
|
+
(vl-load-com)
|
|
109
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
110
|
+
(vlax-for ss ssMgr (if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}") (progn (vla-publish ss "${escapeLispString(outputDir)}") (princ "published"))))
|
|
111
|
+
)`);
|
|
112
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, outputDir, format, published: !!result }));
|
|
113
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export async function getSheetSetProperty(sheetSetName, propertyName) {
|
|
117
|
+
try {
|
|
118
|
+
await ensureCadConnected();
|
|
119
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
120
|
+
(vl-load-com)
|
|
121
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
122
|
+
(vlax-for ss ssMgr (if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}") (princ (vla-get-${escapeLispString(propertyName)} ss))))
|
|
123
|
+
)`);
|
|
124
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, propertyName, value: result }));
|
|
125
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export async function reorderSheet(sheetSetName, sheetName, newIndex) {
|
|
129
|
+
try {
|
|
130
|
+
await ensureCadConnected();
|
|
131
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
132
|
+
(vl-load-com)
|
|
133
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
134
|
+
(vlax-for ss ssMgr
|
|
135
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}")
|
|
136
|
+
(vlax-for sheet (vla-get-sheets ss)
|
|
137
|
+
(if (= (vla-get-name sheet) "${escapeLispString(sheetName)}")
|
|
138
|
+
(progn (vla-moveto sheet ${parseInt(newIndex, 10)}) (princ "ok"))
|
|
139
|
+
)
|
|
140
|
+
)
|
|
141
|
+
)
|
|
142
|
+
)
|
|
143
|
+
(princ "nf")
|
|
144
|
+
)`);
|
|
145
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, sheetName, newIndex, moved: result === 'ok' }));
|
|
146
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export async function createSubset(sheetSetName, subsetName) {
|
|
150
|
+
try {
|
|
151
|
+
await ensureCadConnected();
|
|
152
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
153
|
+
(vl-load-com)
|
|
154
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
155
|
+
(vlax-for ss ssMgr
|
|
156
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}")
|
|
157
|
+
(progn (setq subset (vla-addsubset (vla-get-sheets ss) "${escapeLispString(subsetName)}")) (princ (vla-get-name subset)))
|
|
158
|
+
)
|
|
159
|
+
)
|
|
160
|
+
(princ "nf")
|
|
161
|
+
)`);
|
|
162
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, subsetName, created: !!result && result !== 'nf' }));
|
|
163
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export async function listSubsets(sheetSetName) {
|
|
167
|
+
try {
|
|
168
|
+
await ensureCadConnected();
|
|
169
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
170
|
+
(vl-load-com)
|
|
171
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))) subsets nil)
|
|
172
|
+
(vlax-for ss ssMgr
|
|
173
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}")
|
|
174
|
+
(vlax-for subset (vla-get-subsets ss)
|
|
175
|
+
(setq subsets (cons (vla-get-name subset) subsets))
|
|
176
|
+
)
|
|
177
|
+
)
|
|
178
|
+
)
|
|
179
|
+
(princ (vl-prin1-to-string (reverse subsets)))
|
|
180
|
+
)`);
|
|
181
|
+
let subsets = [];
|
|
182
|
+
if (result && result !== 'nil') { try { subsets = JSON.parse(result); } catch { subsets = []; } }
|
|
183
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, subsets }));
|
|
184
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export async function setSheetProperty(sheetSetName, sheetName, propertyName, value) {
|
|
188
|
+
try {
|
|
189
|
+
await ensureCadConnected();
|
|
190
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
191
|
+
(vl-load-com)
|
|
192
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
193
|
+
(vlax-for ss ssMgr
|
|
194
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}")
|
|
195
|
+
(vlax-for sheet (vla-get-sheets ss)
|
|
196
|
+
(if (= (vla-get-name sheet) "${escapeLispString(sheetName)}")
|
|
197
|
+
(progn (vlax-put sheet "${escapeLispString(propertyName)}" "${escapeLispString(String(value))}") (princ "ok"))
|
|
198
|
+
)
|
|
199
|
+
)
|
|
200
|
+
)
|
|
201
|
+
)
|
|
202
|
+
(princ "nf")
|
|
203
|
+
)`);
|
|
204
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, sheetName, propertyName, value, set: result === 'ok' }));
|
|
205
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export async function createSheetSetArchive(sheetSetName, archivePath) {
|
|
209
|
+
try {
|
|
210
|
+
await ensureCadConnected();
|
|
211
|
+
await cad.sendCommand(`(progn
|
|
212
|
+
(vl-load-com)
|
|
213
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
214
|
+
(vlax-for ss ssMgr (if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}") (vla-archive ss "${escapeLispString(archivePath)}")))
|
|
215
|
+
(princ "archived")
|
|
216
|
+
)`);
|
|
217
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, archivePath, archived: true }));
|
|
218
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export async function sheetSetPublishOptions(args) {
|
|
222
|
+
const { sheetSetName, sheetName, format, pageSetup, plotStamp } = args;
|
|
223
|
+
try {
|
|
224
|
+
await ensureCadConnected();
|
|
225
|
+
const formatNum = format === 'PDF' ? 1 : 2;
|
|
226
|
+
const plotStampVal = plotStamp ? ':vlax-true' : ':vlax-false';
|
|
227
|
+
const lisp = `(progn
|
|
228
|
+
(vl-load-com)
|
|
229
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
230
|
+
(vlax-for ss ssMgr
|
|
231
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}")
|
|
232
|
+
(vlax-for sheet (vla-get-sheets ss)
|
|
233
|
+
(if (= (vla-get-name sheet) "${escapeLispString(sheetName)}")
|
|
234
|
+
(progn
|
|
235
|
+
${format ? `(vla-put-DocTypeOverride sheet ${formatNum})` : ';'}
|
|
236
|
+
${pageSetup ? `(vla-put-PageSetupOverrideName sheet "${escapeLispString(pageSetup)}")` : ';'}
|
|
237
|
+
${plotStamp !== undefined ? `(vla-put-PlotStampEnabled sheet ${plotStampVal})` : ';'}
|
|
238
|
+
(princ "ok")
|
|
239
|
+
)
|
|
240
|
+
)
|
|
241
|
+
)
|
|
242
|
+
)
|
|
243
|
+
)
|
|
244
|
+
(princ "nf")
|
|
245
|
+
)`;
|
|
246
|
+
const result = await cad.sendCommandWithResult(lisp);
|
|
247
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, sheetName, format, pageSetup, plotStamp, configured: result === 'ok' }));
|
|
248
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export async function sheetSetTransmit(args) {
|
|
252
|
+
const { sheetSetName, outputPath } = args;
|
|
253
|
+
try {
|
|
254
|
+
await ensureCadConnected();
|
|
255
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
256
|
+
(vl-load-com)
|
|
257
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
258
|
+
(vlax-for ss ssMgr
|
|
259
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}")
|
|
260
|
+
(progn
|
|
261
|
+
(setq files nil)
|
|
262
|
+
(vlax-for sheet (vla-get-sheets ss)
|
|
263
|
+
(setq dwgPath (vla-get-path sheet))
|
|
264
|
+
(if (and dwgPath (/= dwgPath ""))
|
|
265
|
+
(progn
|
|
266
|
+
(setq files (cons dwgPath files))
|
|
267
|
+
(vl-catch-all-apply
|
|
268
|
+
(function (lambda ()
|
|
269
|
+
(setq doc (vla-open (vla-get-documents (vlax-get-acad-object)) dwgPath))
|
|
270
|
+
(vlax-for blk (vla-get-blocks doc)
|
|
271
|
+
(if (= (vla-get-isxref blk) :vlax-true)
|
|
272
|
+
(setq files (cons (vla-get-path blk) files))
|
|
273
|
+
)
|
|
274
|
+
)
|
|
275
|
+
(vla-close doc :vlax-false)
|
|
276
|
+
))
|
|
277
|
+
)
|
|
278
|
+
)
|
|
279
|
+
)
|
|
280
|
+
)
|
|
281
|
+
${outputPath ? `(vl-catch-all-apply (function (lambda () (vla-archive ss "${escapeLispString(outputPath)}"))))` : ''}
|
|
282
|
+
(princ (vl-prin1-to-string (reverse files)))
|
|
283
|
+
)
|
|
284
|
+
)
|
|
285
|
+
)
|
|
286
|
+
(princ "nil")
|
|
287
|
+
)`);
|
|
288
|
+
let files = [];
|
|
289
|
+
if (result && result !== 'nil') {
|
|
290
|
+
try { files = [...new Set(JSON.parse(result))]; } catch { files = []; }
|
|
291
|
+
}
|
|
292
|
+
return mcpSuccess(JSON.stringify({
|
|
293
|
+
sheetSetName, outputPath: outputPath || null, files,
|
|
294
|
+
fileCount: files.length, transmitted: !!outputPath
|
|
295
|
+
}));
|
|
296
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export async function sheetSetCompare(args) {
|
|
300
|
+
const { sheetSetName1, sheetSetName2 } = args;
|
|
301
|
+
try {
|
|
302
|
+
await ensureCadConnected();
|
|
303
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
304
|
+
(vl-load-com)
|
|
305
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object)))
|
|
306
|
+
s1 nil s2 nil)
|
|
307
|
+
(vlax-for ss ssMgr
|
|
308
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName1)}")
|
|
309
|
+
(vlax-for sheet (vla-get-sheets ss)
|
|
310
|
+
(setq s1 (cons (list (vla-get-name sheet) (vla-get-path sheet) (vla-get-layout sheet)) s1))
|
|
311
|
+
)
|
|
312
|
+
)
|
|
313
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName2)}")
|
|
314
|
+
(vlax-for sheet (vla-get-sheets ss)
|
|
315
|
+
(setq s2 (cons (list (vla-get-name sheet) (vla-get-path sheet) (vla-get-layout sheet)) s2))
|
|
316
|
+
)
|
|
317
|
+
)
|
|
318
|
+
)
|
|
319
|
+
(setq s1 (reverse s1) s2 (reverse s2))
|
|
320
|
+
(setq names1 (mapcar 'car s1) names2 (mapcar 'car s2))
|
|
321
|
+
(setq only1 nil only2 nil)
|
|
322
|
+
(foreach sh s1 (if (not (member (car sh) names2)) (setq only1 (cons sh only1))))
|
|
323
|
+
(foreach sh s2 (if (not (member (car sh) names1)) (setq only2 (cons sh only2))))
|
|
324
|
+
(princ (vl-prin1-to-string (list (reverse only1) (reverse only2))))
|
|
325
|
+
)`);
|
|
326
|
+
let parsed = { onlyIn1: [], onlyIn2: [] };
|
|
327
|
+
if (result && result !== 'nil') {
|
|
328
|
+
try {
|
|
329
|
+
const arr = JSON.parse(result);
|
|
330
|
+
parsed = {
|
|
331
|
+
onlyIn1: (arr[0] || []).map(s => ({ name: String(s[0] || ''), path: String(s[1] || ''), layout: String(s[2] || '') })),
|
|
332
|
+
onlyIn2: (arr[1] || []).map(s => ({ name: String(s[0] || ''), path: String(s[1] || ''), layout: String(s[2] || '') }))
|
|
333
|
+
};
|
|
334
|
+
} catch {}
|
|
335
|
+
}
|
|
336
|
+
return mcpSuccess(JSON.stringify({
|
|
337
|
+
sheetSetName1, sheetSetName2,
|
|
338
|
+
onlyInSheetSet1: parsed.onlyIn1, onlyInSheetSet2: parsed.onlyIn2,
|
|
339
|
+
differenceCount: parsed.onlyIn1.length + parsed.onlyIn2.length
|
|
340
|
+
}));
|
|
341
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
export async function sheetListViews(args) {
|
|
345
|
+
const { sheetSetName, sheetName } = args;
|
|
346
|
+
try {
|
|
347
|
+
await ensureCadConnected();
|
|
348
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
349
|
+
(vl-load-com)
|
|
350
|
+
(setq ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object))))
|
|
351
|
+
(vlax-for ss ssMgr
|
|
352
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}")
|
|
353
|
+
(vlax-for sheet (vla-get-sheets ss)
|
|
354
|
+
(if (= (vla-get-name sheet) "${escapeLispString(sheetName)}")
|
|
355
|
+
(progn
|
|
356
|
+
(setq dwgPath (vla-get-path sheet) views nil)
|
|
357
|
+
(vl-catch-all-apply
|
|
358
|
+
(function (lambda ()
|
|
359
|
+
(setq doc (vla-open (vla-get-documents (vlax-get-acad-object)) dwgPath))
|
|
360
|
+
(vlax-for vw (vla-get-views doc)
|
|
361
|
+
(setq views (cons (list (vla-get-name vw) (vla-get-height vw) (vla-get-width vw)) views))
|
|
362
|
+
)
|
|
363
|
+
(vla-close doc :vlax-false)
|
|
364
|
+
))
|
|
365
|
+
)
|
|
366
|
+
(princ (vl-prin1-to-string (reverse views)))
|
|
367
|
+
)
|
|
368
|
+
)
|
|
369
|
+
)
|
|
370
|
+
)
|
|
371
|
+
)
|
|
372
|
+
(princ "nil")
|
|
373
|
+
)`);
|
|
374
|
+
let views = [];
|
|
375
|
+
if (result && result !== 'nil') {
|
|
376
|
+
try {
|
|
377
|
+
views = JSON.parse(result).map(v => ({ name: String(v[0] || ''), height: v[1], width: v[2] }));
|
|
378
|
+
} catch { views = []; }
|
|
379
|
+
}
|
|
380
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, sheetName, views, count: views.length }));
|
|
381
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
export async function sheetImportLayouts(args) {
|
|
385
|
+
const { sheetSetName, sourceDwg, layoutNames } = args;
|
|
386
|
+
try {
|
|
387
|
+
await ensureCadConnected();
|
|
388
|
+
const filterLayouts = Array.isArray(layoutNames) && layoutNames.length > 0;
|
|
389
|
+
const layoutList = filterLayouts ? layoutNames.map(n => `"${escapeLispString(n)}"`).join(' ') : '';
|
|
390
|
+
const result = await cad.sendCommandWithResult(`(progn
|
|
391
|
+
(vl-load-com)
|
|
392
|
+
(setq srcDoc (vl-catch-all-apply (function (lambda ()
|
|
393
|
+
(vla-open (vla-get-documents (vlax-get-acad-object)) "${escapeLispString(sourceDwg)}")))))
|
|
394
|
+
(if (vl-catch-all-error-p srcDoc)
|
|
395
|
+
(princ "nil")
|
|
396
|
+
(progn
|
|
397
|
+
(setq tgtDoc (vla-get-activedocument (vlax-get-acad-object))
|
|
398
|
+
ssMgr (vla-get-sheetsets (vla-get-activedocument (vlax-get-acad-object)))
|
|
399
|
+
imported nil)
|
|
400
|
+
(vlax-for lay (vla-get-layouts srcDoc)
|
|
401
|
+
(setq layName (vla-get-name lay))
|
|
402
|
+
(if (and (/= layName "Model") ${filterLayouts ? `(member layName '(${layoutList}))` : 't'})
|
|
403
|
+
(vl-catch-all-apply
|
|
404
|
+
(function (lambda ()
|
|
405
|
+
(vla-activate tgtDoc)
|
|
406
|
+
(command "_.LAYOUT" "_C" (strcat (vla-get-name srcDoc) "|" layName) layName)
|
|
407
|
+
(vlax-for ss ssMgr
|
|
408
|
+
(if (= (vla-get-name ss) "${escapeLispString(sheetSetName)}")
|
|
409
|
+
(setq sheet (vla-add (vla-get-sheets ss) layName layName)
|
|
410
|
+
imported (cons (list layName (vla-get-name sheet)) imported))
|
|
411
|
+
)
|
|
412
|
+
)
|
|
413
|
+
))
|
|
414
|
+
)
|
|
415
|
+
)
|
|
416
|
+
)
|
|
417
|
+
(vla-close srcDoc :vlax-false)
|
|
418
|
+
(princ (vl-prin1-to-string (reverse imported)))
|
|
419
|
+
)
|
|
420
|
+
)
|
|
421
|
+
)`);
|
|
422
|
+
let imported = [];
|
|
423
|
+
if (result && result !== 'nil') {
|
|
424
|
+
try {
|
|
425
|
+
imported = JSON.parse(result).map(s => ({ layout: String(s[0] || ''), sheet: String(s[1] || '') }));
|
|
426
|
+
} catch { imported = []; }
|
|
427
|
+
}
|
|
428
|
+
return mcpSuccess(JSON.stringify({ sheetSetName, sourceDwg, imported, count: imported.length }));
|
|
429
|
+
} catch (e) { return mcpError(`错误: ${e.message}`); }
|
|
430
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { cad } from '../cad.js';
|
|
2
|
+
import { escapeLispString } from '../handler-utils.js';
|
|
3
|
+
|
|
4
|
+
export async function findEntitiesNearPoint(params) {
|
|
5
|
+
if (!cad.connected) { await cad.connect(); }
|
|
6
|
+
if (!cad.connected) return { content: [{ type: 'text', text: '未连接 CAD' }], isError: true };
|
|
7
|
+
try {
|
|
8
|
+
const code = `(progn
|
|
9
|
+
(vl-load-com)
|
|
10
|
+
(if (setq ss (ssget "_CP"
|
|
11
|
+
(list
|
|
12
|
+
(polar (list ${params.point}) 0 ${params.radius})
|
|
13
|
+
(polar (list ${params.point}) (* pi 0.5) ${params.radius})
|
|
14
|
+
(polar (list ${params.point}) pi ${params.radius})
|
|
15
|
+
(polar (list ${params.point}) (* pi 1.5) ${params.radius})
|
|
16
|
+
)))
|
|
17
|
+
(progn
|
|
18
|
+
(setq cnt (sslength ss) handles nil i 0)
|
|
19
|
+
(while (< i cnt)
|
|
20
|
+
(setq handles (cons (cdr (assoc 5 (entget (ssname ss i)))) handles))
|
|
21
|
+
(setq i (1+ i)))
|
|
22
|
+
(reverse handles)
|
|
23
|
+
)
|
|
24
|
+
nil
|
|
25
|
+
)
|
|
26
|
+
)`;
|
|
27
|
+
const result = await cad.sendCommandWithResult(code);
|
|
28
|
+
if (!result || result === 'nil') {
|
|
29
|
+
return { content: [{ type: 'text', text: `在 ${params.point} 半径 ${params.radius} 范围内未找到实体` }] };
|
|
30
|
+
}
|
|
31
|
+
return { content: [{ type: 'text', text: result }] };
|
|
32
|
+
} catch (e) {
|
|
33
|
+
return { content: [{ type: 'text', text: `错误: ${e.message}` }], isError: true };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function findEntitiesInWindow(params) {
|
|
38
|
+
if (!cad.connected) { await cad.connect(); }
|
|
39
|
+
if (!cad.connected) return { content: [{ type: 'text', text: '未连接 CAD' }], isError: true };
|
|
40
|
+
try {
|
|
41
|
+
const code = `(progn
|
|
42
|
+
(vl-load-com)
|
|
43
|
+
(if (setq ss (ssget "_W" (list ${params.corner1}) (list ${params.corner2})))
|
|
44
|
+
(progn
|
|
45
|
+
(setq cnt (sslength ss) handles nil i 0)
|
|
46
|
+
(while (< i cnt)
|
|
47
|
+
(setq handles (cons (cdr (assoc 5 (entget (ssname ss i)))) handles))
|
|
48
|
+
(setq i (1+ i)))
|
|
49
|
+
(reverse handles)
|
|
50
|
+
)
|
|
51
|
+
nil
|
|
52
|
+
)
|
|
53
|
+
)`;
|
|
54
|
+
const result = await cad.sendCommandWithResult(code);
|
|
55
|
+
if (!result || result === 'nil') {
|
|
56
|
+
return { content: [{ type: 'text', text: '窗口内未找到实体' }] };
|
|
57
|
+
}
|
|
58
|
+
return { content: [{ type: 'text', text: result }] };
|
|
59
|
+
} catch (e) {
|
|
60
|
+
return { content: [{ type: 'text', text: `错误: ${e.message}` }], isError: true };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export async function findEntitiesCrossing(params) {
|
|
65
|
+
if (!cad.connected) { await cad.connect(); }
|
|
66
|
+
if (!cad.connected) return { content: [{ type: 'text', text: '未连接 CAD' }], isError: true };
|
|
67
|
+
try {
|
|
68
|
+
const code = `(progn
|
|
69
|
+
(vl-load-com)
|
|
70
|
+
(if (setq ss (ssget "_C" (list ${params.corner1}) (list ${params.corner2})))
|
|
71
|
+
(progn
|
|
72
|
+
(setq cnt (sslength ss) handles nil i 0)
|
|
73
|
+
(while (< i cnt)
|
|
74
|
+
(setq handles (cons (cdr (assoc 5 (entget (ssname ss i)))) handles))
|
|
75
|
+
(setq i (1+ i)))
|
|
76
|
+
(reverse handles)
|
|
77
|
+
)
|
|
78
|
+
nil
|
|
79
|
+
)
|
|
80
|
+
)`;
|
|
81
|
+
const result = await cad.sendCommandWithResult(code);
|
|
82
|
+
if (!result || result === 'nil') {
|
|
83
|
+
return { content: [{ type: 'text', text: '交叉窗口内未找到实体' }] };
|
|
84
|
+
}
|
|
85
|
+
return { content: [{ type: 'text', text: result }] };
|
|
86
|
+
} catch (e) {
|
|
87
|
+
return { content: [{ type: 'text', text: `错误: ${e.message}` }], isError: true };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export async function findEntitiesIntersecting(params) {
|
|
92
|
+
if (!cad.connected) { await cad.connect(); }
|
|
93
|
+
if (!cad.connected) return { content: [{ type: 'text', text: '未连接 CAD' }], isError: true };
|
|
94
|
+
try {
|
|
95
|
+
const pts = params.fencePoints.split(/\s+/).filter(Boolean);
|
|
96
|
+
const ptListCode = pts.map(p => `(list ${p})`).join(' ');
|
|
97
|
+
const code = `(progn
|
|
98
|
+
(vl-load-com)
|
|
99
|
+
(if (setq ss (ssget "_F" (list ${ptListCode})))
|
|
100
|
+
(progn
|
|
101
|
+
(setq cnt (sslength ss) handles nil i 0)
|
|
102
|
+
(while (< i cnt)
|
|
103
|
+
(setq handles (cons (cdr (assoc 5 (entget (ssname ss i)))) handles))
|
|
104
|
+
(setq i (1+ i)))
|
|
105
|
+
(reverse handles)
|
|
106
|
+
)
|
|
107
|
+
nil
|
|
108
|
+
)
|
|
109
|
+
)`;
|
|
110
|
+
const result = await cad.sendCommandWithResult(code);
|
|
111
|
+
if (!result || result === 'nil') {
|
|
112
|
+
return { content: [{ type: 'text', text: '栏选线未找到相交实体' }] };
|
|
113
|
+
}
|
|
114
|
+
return { content: [{ type: 'text', text: result }] };
|
|
115
|
+
} catch (e) {
|
|
116
|
+
return { content: [{ type: 'text', text: `错误: ${e.message}` }], isError: true };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export async function findEntitiesInPolygon(params) {
|
|
121
|
+
if (!cad.connected) { await cad.connect(); }
|
|
122
|
+
if (!cad.connected) return { content: [{ type: 'text', text: '未连接 CAD' }], isError: true };
|
|
123
|
+
try {
|
|
124
|
+
const pts = params.points.split(/\s+/).filter(Boolean);
|
|
125
|
+
const ptListCode = pts.map(p => `(list ${p})`).join(' ');
|
|
126
|
+
const code = `(progn
|
|
127
|
+
(vl-load-com)
|
|
128
|
+
(if (setq ss (ssget "_WP" (list ${ptListCode})))
|
|
129
|
+
(progn
|
|
130
|
+
(setq cnt (sslength ss) handles nil i 0)
|
|
131
|
+
(while (< i cnt)
|
|
132
|
+
(setq handles (cons (cdr (assoc 5 (entget (ssname ss i)))) handles))
|
|
133
|
+
(setq i (1+ i)))
|
|
134
|
+
(reverse handles)
|
|
135
|
+
)
|
|
136
|
+
nil
|
|
137
|
+
)
|
|
138
|
+
)`;
|
|
139
|
+
const result = await cad.sendCommandWithResult(code);
|
|
140
|
+
if (!result || result === 'nil') {
|
|
141
|
+
return { content: [{ type: 'text', text: '多边形内未找到实体' }] };
|
|
142
|
+
}
|
|
143
|
+
return { content: [{ type: 'text', text: result }] };
|
|
144
|
+
} catch (e) {
|
|
145
|
+
return { content: [{ type: 'text', text: `错误: ${e.message}` }], isError: true };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export async function getBoundingBox(params) {
|
|
150
|
+
if (!cad.connected) { await cad.connect(); }
|
|
151
|
+
if (!cad.connected) return { content: [{ type: 'text', text: '未连接 CAD' }], isError: true };
|
|
152
|
+
try {
|
|
153
|
+
const code = `(progn
|
|
154
|
+
(vl-load-com)
|
|
155
|
+
(if (setq ent (handent "${escapeLispString(params.handle)}"))
|
|
156
|
+
(progn
|
|
157
|
+
(vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
|
|
158
|
+
(list
|
|
159
|
+
(vlax-safearray->list ll)
|
|
160
|
+
(vlax-safearray->list ur)
|
|
161
|
+
)
|
|
162
|
+
)
|
|
163
|
+
"NOTFOUND"
|
|
164
|
+
)
|
|
165
|
+
)`;
|
|
166
|
+
const result = await cad.sendCommandWithResult(code);
|
|
167
|
+
if (!result || result === 'NOTFOUND' || result === '"NOTFOUND"') {
|
|
168
|
+
return { content: [{ type: 'text', text: `未找到实体: ${params.handle}` }], isError: true };
|
|
169
|
+
}
|
|
170
|
+
return { content: [{ type: 'text', text: `包围盒: ${result}` }] };
|
|
171
|
+
} catch (e) {
|
|
172
|
+
return { content: [{ type: 'text', text: `错误: ${e.message}` }], isError: true };
|
|
173
|
+
}
|
|
174
|
+
}
|