乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 99|回复: 12

[编程交流] 使用Lisp搜索并插入mu

[复制链接]

4

主题

24

帖子

20

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 09:45:45 | 显示全部楼层 |阅读模式
早上好。
 
I'v编写了一个很短的例程,用于插入服务器上的地图块,用户只需键入所需的网格引用。所有瓷砖均以其参考号命名(即SJ4522或NZ0572)
 
  1. (defun c:mmbmap ( / GRDREF MAPPATH)
  2. (setvar "cmdecho" 1)
  3. (setq GRDREF (getstring "Enter Grid Ref [sO4522]: "))
  4. (setq MAPPATH (strcat "N:/CAD/2D/MappingTiles/" GRDREF ".dwg"))
  5. (command "_.insert" MAPPATH "0,0,0" "1" "" "")
  6. (command "zoom" "o" "l" "")
  7. (princ))

 
这很简单,但是(总是有一个BUT),大约10%的图块文件大小很大,它们被分成4个图块(即,不是SE5076,而是SE5076NE、SE5076NW、SE5076SE、SE5076SW)。
 
所以我要问的是,我的例程是否可以修改为只搜索文件名的前6个字符,如果它找到多个具有该名称的文件来插入所有文件?
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 09:55:13 | 显示全部楼层
我建议使用dos\u find函数。它是DosLib的一部分,可以在以下站点免费下载:http://www.mcneel.com
 
您可以对文件进行通配符搜索,它将返回文件名列表。然后知道列表中的项目数,在例程的插入部分重复一次。此外,DosLib还提供了许多其他有用的功能。
 
祝您愉快!
 
Hippe013
回复

使用道具 举报

4

主题

24

帖子

20

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 09:59:23 | 显示全部楼层
谢谢你的回复。
 
这可能会起到作用。。。
 
我假设DosLib必须安装在需要调用该函数的每台计算机上,这对吗?
 
或者可以将所需的函数放在服务器上并从那里调用它吗?
 
我更喜欢后一种选择,因为这是一种企业定制,可在多个有大量机器的地点使用。
 
干杯
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 10:03:36 | 显示全部楼层
实际上,如果您将图形如下图所示放在Autocad reference文件夹中,则可以使用函数查找任何一个
你想要多少。
 
将绘图添加到此文件夹中,让例程为您找到它们。。。。
希望这个程序能帮你。
  1. (defun c:Test ( / Nme FName) (vl-load-com)
  2. (if (and (setq Nme (getstring T "\n Enter name of Drawing :" ))
  3.      (setq FName (findfile (strcat Nme ".dwg")))
  4.           )
  5. (vl-cmdf "_.-insert" FName pause "" "" "")
  6.    (alert "File not found ")
  7.    )
  8. (princ)
  9. )
Tharwat
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 10:09:06 | 显示全部楼层
 
DosLib是一个arx文件,只需添加到appload中的每台计算机的启动套件中即可。实际的arx文件将驻留在服务器上的某个位置。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 10:14:48 | 显示全部楼层
这是我一年前做的一个快速引入GIS DWG的例子。它只是在0,0,0处插入一组选定的DWG/DXF。
 
  1. (defun c:GISIn (/ lst)
  2. ;; Alan J. Thompson
  3. (if (setq lst (dos_getfilem
  4.                  "Select drawing files to insert at 0,0,0"
  5.                  (getvar "dwgprefix")
  6.                  "*.dwg;*.dxf|*.DXF;*.DWG"
  7.                )
  8.      )
  9.    (foreach x (cdr lst) (vl-cmdf "_.-insert" (strcat (car lst) x) "0,0,0" "" "" ""))
  10. )
  11. (princ)
  12. )

 
 
 
你所要做的就是把arx文件放在服务器上,然后从你公司的acaddoc文件中加载它。
 
这是我保存在阿卡多克里面的东西。LSP:
 
  1. (vl-some
  2. (function (lambda (dos)
  3.              (or (vl-position dos (arx))
  4.                  (not (vl-catch-all-error-p (vl-catch-all-apply (function arxload) (list dos))))
  5.              )
  6.            )
  7. )
  8. '("doslib17.arx" "doslib18.arx")
  9. )

 
可以缩短,但我需要它在2009年和2011年加载。
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 10:17:37 | 显示全部楼层
来自我的acad。lsp:
  1. (defun load_exp (/ v p a av)
  2. (setq v (ver)
  3.        p (getvar "PLATFORM")
  4.        a (getvar "ACADVER"))
  5. (setq av (cond ((and (wcmatch a "*12*")
  6.                       (wcmatch p "*DOS*"))
  7.                   "12DOS")
  8.                 ((and (wcmatch a "*12*")
  9.                       (wcmatch p "*Win*"))
  10.                   "12WIN")
  11.                 ((and (wcmatch a "*13*")
  12.                       (wcmatch p "*DOS*"))
  13.                   "13DOS")
  14.                 ((and (wcmatch a "*13*")
  15.                       (wcmatch p "*Win*"))
  16.                   "13WIN")
  17.                 ((wcmatch a "*14*")
  18.                   "14")
  19.                 ((wcmatch a "*15*")
  20.                   "15")
  21.                 (T "UnKnown")))
  22. (cond ((= av "12DOS")
  23.         (and (not (member "C:/ACAD/12/ACADAPP.EXP" (ads)))
  24.              (xload "c:/acad/12/acadapp.exp"))
  25.         (and (not (member "C:/ACAD/12/HPMPLOT.EXP" (ads)))
  26.              (xload "c:/acad/12/hpmplot.exp"))
  27.         (and (not (member "C:\\ACAD\\UT\\DOSLIB12.EXP" (ads)))
  28.              (xload "doslib12.exp")))
  29.        ((= av "12WIN")
  30.         (and (/= (type dos_dir) 'EXSUBR)
  31.              (xload "doslib12.exe")))
  32.        ((= av "13DOS")
  33.         (xload "c:/acad/13/acadapp.exp")
  34.         (xload "c:/acad/13/hpmplot.exp")
  35.         (and (/= (type dos_dir) 'EXSUBR)
  36.              (xload "doslib13.exp")))
  37.        ((= av "13WIN")
  38.         (load "c:/acad/common/ai_utils.lsp")
  39.         (load "c:/acad/common/appload.lsp")
  40.         (and (/= (type dos_dir) 'EXSUBR)
  41.              (xload "doslib13.exe"))
  42.         (and (not (member "c:\\accuren2\\accurend.arx" (arx)))
  43.              (arxload "c:/accuren2/accurend.arx")))
  44.        ((= av "14")
  45.         (and (not (member "doslib14.arx" (arx)))
  46.              (arxload "doslib14.arx")))
  47.        ((= av "15")
  48.         (and (not (member "doslib2k.arx" (arx)))
  49.              (arxload "doslib2k.arx")))))

 
保持多个版本的运行非常有趣-大卫
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 10:25:16 | 显示全部楼层
伙计,我对两个很恼火。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 10:25:56 | 显示全部楼层
这里有一种根本不需要使用DosLib的方法:
然后你应该把你的函数改成这样:
顺便说一句,matchfiles适用于多个匹配。因此,您实际上可以使用类似“C:\\Temp\\*.DWG,N:\\CAD\\2D\\MappingTiles\\*.DWG”的内容来搜索这两个文件夹。
回复

使用道具 举报

4

主题

24

帖子

20

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 10:32:46 | 显示全部楼层
谢谢你的回复。
 
我决定走非DosLib路线,只是为了保持服务器上的一切整洁(尽管我可能会后悔)。
 
我使用了irneb的代码来插入所需的映射,效果相当好。
 
然而,基于irneb的评论,我不得不问,块插入方法并不完全可靠,为什么会这样?始终接受建议
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-6 14:41 , Processed in 0.501829 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表