乐筑天下

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

[编程交流] 多文本查找并替换为l

[复制链接]
Can

4

主题

17

帖子

13

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 15:42:32 | 显示全部楼层 |阅读模式
你好
 
 
我需要一个Lisp程序。该程序首先应在图形中找到EXCEL的A列中写入的文本,然后应将其替换为EXCEL的b列中写入的文本。
 
 
谢谢
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:50:18 | 显示全部楼层
不知道excel部分,但许多人认为这是最好的:http://www.lee-mac.com/bfind.html
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 15:51:15 | 显示全部楼层
我在谷歌上搜索了一下,第一个帖子提供了一个解决方案。您只需将这两列作为csv文件写入,然后使用简单的csv->列表,只需重复读取代码中的每一行和简单的defun。
 
看看这里的cadtutor
 
这个愚蠢的问题,你有没有试着找到,如果不是很多的文字相当快。
 
如果你有很多DWG,那么李的版本就是最好的选择。它可以考虑csv文件,比从excel中读取更简单。李,也许有一个额外的选择?
回复

使用道具 举报

Can

4

主题

17

帖子

13

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 15:59:11 | 显示全部楼层
谢谢你的建议。
 
 
我想知道是否有更实际的方法来实现这一点。随附文件可以使我的目标更加明确。请让我知道,如果你有其他想法后,检查这个屏幕截图。
 
 
提前感谢
164235cg35g59u79b9xcxs.jpg
测试1.dwg
Book1.xlsx
回复

使用道具 举报

Can

4

主题

17

帖子

13

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 15:59:53 | 显示全部楼层
以获得更好的分辨率。
164237rx8wox1lzw0bby5r.jpg
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 16:08:01 | 显示全部楼层
嗨,可以试试这个Lisp程序的句子:
 
  1. (defun c:multfindrepl-excel ( / excel fn excellst s )
  2. (defun excel ( ExcelFile$ / Cell->ColumnRow ColumnRow->Cell Alpha2Number Number2Alpha LM:listbox startcell endcell stc enc colrow *ExcelApp% Sheets@ SheetName$ CurRange c r Value Valuel Valuelst )
  3.    (vl-load-com)
  4.    ;-------------------------------------------------------------------------------
  5.    ; Cell->ColumnRow - Returns a list of the Column and Row number
  6.    ; Function By: Gilles Chanteau from Marseille, France
  7.    ; Arguments: 1
  8.    ;   Cell$ = Cell ID
  9.    ; Syntax example: (Cell->ColumnRow "ABC987") = '(731 987)
  10.    ;-------------------------------------------------------------------------------
  11.    (defun Cell->ColumnRow (Cell$ / Column$ Char$ Row#)
  12.      (setq Column$ "")
  13.      (while (< 64 (ascii (setq Char$ (strcase (substr Cell$ 1 1)))) 91)
  14.        (setq Column$ (strcat Column$ Char$)
  15.              Cell$ (substr Cell$ 2)
  16.        );setq
  17.      );while
  18.      (if (and (/= Column$ "") (numberp (setq Row# (read Cell$))))
  19.        (list (Alpha2Number Column$) Row#)
  20.        '(1 1);default to "A1" if there's a problem
  21.      );if
  22.    );defun Cell->ColumnRow
  23.    ;-------------------------------------------------------------------------------
  24.    ; ColumnRow->Cell - Returns Cell ID from list of the Column and Row number
  25.    ; Function By: Marko Ribar from Belgrade, Serbia
  26.    ; Arguments: 1
  27.    ;   ColumnRow$ = list
  28.    ; Syntax example: (ColumnRow->Cell '(731 987)) = "ABC987"
  29.    ;-------------------------------------------------------------------------------
  30.    (defun ColumnRow->Cell (Lst$ / Column$)
  31.      (setq Column$ (Number2Alpha (car Lst$)))
  32.      (strcat Column$ (itoa (cadr Lst$)))
  33.    );defun ColumnRow->Cell
  34.    ;-------------------------------------------------------------------------------
  35.    ; Alpha2Number - Converts Alpha string into Number
  36.    ; Function By: Gilles Chanteau from Marseille, France
  37.    ; Arguments: 1
  38.    ;   Str$ = String to convert
  39.    ; Syntax example: (Alpha2Number "ABC") = 731
  40.    ;-------------------------------------------------------------------------------
  41.    (defun Alpha2Number (Str$ / Num#)
  42.      (if (= 0 (setq Num# (strlen Str$)))
  43.        0
  44.        (+ (* (- (ascii (strcase (substr Str$ 1 1))) 64) (expt 26 (1- Num#)))
  45.           (Alpha2Number (substr Str$ 2))
  46.        );+
  47.      );if
  48.    );defun Alpha2Number
  49.    ;-------------------------------------------------------------------------------
  50.    ; Number2Alpha - Converts Number into Alpha string
  51.    ; Function By: Gilles Chanteau from Marseille, France
  52.    ; Arguments: 1
  53.    ;   Num# = Number to convert
  54.    ; Syntax example: (Number2Alpha 731) = "ABC"
  55.    ;-------------------------------------------------------------------------------
  56.    (defun Number2Alpha (Num# / Val#)
  57.      (if (< Num# 27)
  58.        (chr (+ 64 Num#))
  59.        (if (= 0 (setq Val# (rem Num# 26)))
  60.          (strcat (Number2Alpha (1- (/ Num# 26))) "Z")
  61.          (strcat (Number2Alpha (/ Num# 26)) (chr (+ 64 Val#)))
  62.        );if
  63.      );if
  64.    );defun Number2Alpha
  65.    ;; List Box  -  Lee Mac
  66.    ;; Displays a DCL list box allowing the user to make a selection from the supplied data.
  67.    ;; msg - [str] Dialog label
  68.    ;; lst - [lst] List of strings to display
  69.    ;; bit - [int] 1=allow multiple; 2=return indexes
  70.    ;; Returns: [lst] List of selected items/indexes, else nil
  71.    
  72.    (defun LM:listbox ( msg lst bit / dch des tmp rtn )
  73.        (cond
  74.            (   (not
  75.                    (and
  76.                        (setq tmp (vl-filename-mktemp nil nil ".dcl"))
  77.                        (setq des (open tmp "w"))
  78.                        (write-line
  79.                            (strcat "listbox:dialog{label="" msg "";spacer;:list_box{key="list";multiple_select="
  80.                                (if (= 1 (logand 1 bit)) "true" "false") ";width=50;height=15;}spacer;ok_cancel;}"
  81.                            )
  82.                            des
  83.                        )
  84.                        (not (close des))
  85.                        (< 0 (setq dch (load_dialog tmp)))
  86.                        (new_dialog "listbox" dch)
  87.                    )
  88.                )
  89.                (prompt "\nError Loading List Box Dialog.")
  90.            )
  91.            (   t     
  92.                (start_list "list")
  93.                (foreach itm lst (add_list itm))
  94.                (end_list)
  95.                (setq rtn (set_tile "list" "0"))
  96.                (action_tile "list" "(setq rtn $value)")
  97.                (setq rtn
  98.                    (if (= 1 (start_dialog))
  99.                        (if (= 2 (logand 2 bit))
  100.                            (read (strcat "(" rtn ")"))
  101.                            (mapcar '(lambda ( x ) (nth x lst)) (read (strcat "(" rtn ")")))
  102.                        )
  103.                    )
  104.                )
  105.            )
  106.        )
  107.        (if (< 0 dch)
  108.            (unload_dialog dch)
  109.        )
  110.        (if (and tmp (setq tmp (findfile tmp)))
  111.            (vl-file-delete tmp)
  112.        )
  113.        rtn
  114.    )
  115.    (setq ExcelFile$ (findfile ExcelFile$))
  116.    (setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
  117.    ;;;(vlax-put-property *ExcelApp% "Visible" :vlax-true)
  118.    (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
  119.    (vlax-for Sheet$ (vlax-get-property *ExcelApp% "Sheets")
  120.      (setq Sheets@ (append Sheets@ (list (vlax-get-property Sheet$ "Name"))))
  121.    )
  122.    (setq SheetName$ (car (LM:Listbox "Select Sheet to process..." Sheets@ 0)))
  123.    (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
  124.      (if (= (vlax-get-property Worksheet "Name") SheetName$)
  125.        (vlax-invoke-method Worksheet "Activate")
  126.      )
  127.    )
  128.    (setq startcell (strcase (getstring "\nSpecify start cell of excel table - upper left cell : ")))
  129.    (setq endcell (strcase (getstring "\nSpecify end cell of excel table - lower right cell : ")))
  130.    (setq stc (Cell->ColumnRow startcell))
  131.    (setq enc (Cell->ColumnRow endcell))
  132.    (setq colrow (mapcar '- enc stc))
  133.    (setq r (1- (cadr stc)))
  134.    (repeat (1+ (cadr colrow))
  135.      (setq c (1- (car stc)) r (1+ r))
  136.      (repeat (1+ (car colrow))
  137.        (setq CurRange (vlax-get-property (vlax-get-property *ExcelApp% "ActiveSheet") "Range" (ColumnRow->Cell (list (setq c (1+ c)) r))))
  138.        (setq Value (vlax-get CurRange 'Text))
  139.        (setq Valuel (cons Value Valuel))
  140.      )
  141.      (setq Valuel (reverse Valuel))
  142.      (setq Valuelst (cons Valuel Valuelst) Valuel nil)
  143.    )
  144.    (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
  145.    (vlax-invoke-method *ExcelApp% 'Quit)
  146.    (vlax-release-object *ExcelApp%)(gc)
  147.    (reverse Valuelst)
  148. )
  149. (setq fn (getfiled "Select Excel file to process..." "\" "xlsx;xls;csv;*" 16))
  150. (setq excellst (excel fn))
  151. (foreach r excellst
  152.    (setq s (ssget "_X" (list '(0 . "TEXT") (cons 1 (car r)))))
  153.    (if s
  154.      (foreach txt (vl-remove-if 'listp (mapcar 'cadr (ssnamex s)))
  155.        (entupd (cdr (assoc -1 (entmod (subst (cons 1 (cadr r)) (assoc 1 (entget txt)) (entget txt))))))
  156.      )
  157.    )
  158. )
  159. (princ)
  160. )
M.R。
回复

使用道具 举报

Can

4

主题

17

帖子

13

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 16:10:22 | 显示全部楼层
太棒了
 
 
它起到了很好的作用。
 
 
非常感谢您的努力和帮助。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 16:13:23 | 显示全部楼层
有了assoc列表,编写代码就容易多了,但可能不那么方便用户:
 
  1. (defun C:test ( / _mapss old new SS )
  2. (defun _mapss ( f s i / e ) (if (setq e (ssname s (setq i (1+ i)))) (cons (f e) (_mapss f s i))))
  3. (foreach x
  4.    '(
  5.      ("OldText1" "NewText1")
  6.      ("OldText2" "NewText2")
  7.      ("OldText3" "NewText3")
  8.      ; ...
  9.    )
  10.    (and
  11.      (vl-every 'set '(old new) x)
  12.      (setq SS (ssget "_X" (list '(0 . "TEXT") (setq old (cons 1 old)))))
  13.      (_mapss (lambda (e / enx) (setq enx (entget e)) (entmod (subst (cons 1 new) old enx))) SS -1)
  14.    ); and
  15. ); foreach
  16. (princ)
  17. ); defun
回复

使用道具 举报

Can

4

主题

17

帖子

13

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 16:19:37 | 显示全部楼层
实际上我有一个小问题。
 
 
我有一个列表,其中包括一些要跳过的数据,因为它们在图形中不存在。我猜您提供的代码在这种情况下不起作用。
 
 
有没有可能修改代码,使其能够找到并替换现有的代码?当然,由于这个原因,我认为它无法取代。
 
 
提前谢谢。
TESTBook1.xlsx
图纸2.dwg
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 16:24:21 | 显示全部楼层
对已发布代码的小更改。。。
添加了条件(如果s(foreach txt。。。
 
请立即尝试并通知我们。。。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-12 12:32 , Processed in 3.266331 second(s), 74 queries .

© 2020-2025 乐筑天下

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