@atlisp/mcp 1.8.16 → 1.8.18

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.
Files changed (34) hide show
  1. package/dist/atlisp-mcp.js +1 -10
  2. package/dist/handlers/3d-handlers.js +128 -0
  3. package/dist/handlers/batch-handlers.js +260 -0
  4. package/dist/handlers/block-handlers.js +214 -0
  5. package/dist/handlers/cad-handlers.js +180 -0
  6. package/dist/handlers/constraint-handlers.js +130 -0
  7. package/dist/handlers/dim-hatch-handlers.js +340 -0
  8. package/dist/handlers/draw-handlers.js +175 -0
  9. package/dist/handlers/edit-handlers.js +179 -0
  10. package/dist/handlers/entity-handlers.js +196 -0
  11. package/dist/handlers/external-handlers.js +218 -0
  12. package/dist/handlers/file-handlers.js +172 -0
  13. package/dist/handlers/function-handlers.js +158 -0
  14. package/dist/handlers/layer-handlers.js +181 -0
  15. package/dist/handlers/package-handlers.js +89 -0
  16. package/dist/handlers/parametric-handlers.js +272 -0
  17. package/dist/handlers/pdf-annotation-handlers.js +117 -0
  18. package/dist/handlers/prompt-handlers.js +9 -0
  19. package/dist/handlers/purge-handlers.js +137 -0
  20. package/dist/handlers/query-print-handlers.js +662 -0
  21. package/dist/handlers/resource-cache.js +63 -0
  22. package/dist/handlers/resource-defs.js +79 -0
  23. package/dist/handlers/resource-handlers.js +131 -0
  24. package/dist/handlers/resource-readers.js +1045 -0
  25. package/dist/handlers/sheetset-handlers.js +430 -0
  26. package/dist/handlers/spatial-handlers.js +174 -0
  27. package/dist/handlers/style-handlers.js +162 -0
  28. package/dist/handlers/text-handlers.js +198 -0
  29. package/dist/handlers/ucs-layout-handlers.js +271 -0
  30. package/dist/handlers/viewport-handlers.js +150 -0
  31. package/dist/handlers/xdata-handlers.js +148 -0
  32. package/dist/handlers/xref-handlers.js +334 -0
  33. package/dist/lisp-security.js +7 -2
  34. 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
+ }