anupmadhu 发表于 2022-7-5 20:04:56

选择并移动多行文字(&T)

我在附图中有很多植物的名字。我所需要的是根据文本字符串来选择那些,例如:如果键入IXO,则应选择所有包含IXO的文本。
 
由于空间限制,随附图纸的PDF。
 
 
我使用tharwat的下面提到的代码来查找总数,但结果是在记事本中可以有人将其更改为excel。
 
(defun c:ctxt (/ s i e f o x y l lst)
;; Tharwat 18. mar. 2014 ;;
(princ "\n Select texts to export to txt file :")
(if (setq s (ssget '((0 . "TEXT") (1 . "#*"))))
(progn (setq o (open (setq f (strcat (getvar 'DWGPREFIX) (vl-filename-base (getvar 'DWGNAME)) ".txt")) "w"))
(write-line (strcat "DESCRIPTION" "\t" "QTY") o)
(repeat (setq i (sslength s))
(setq e (entget (ssname s (setq i (1- i))))
x (cdr (assoc 1 e))
b ""
)
(while (wcmatch (setq a (substr x 1 1)) "1,2,3,4,5,6,7,8,9,0")
(setq b (strcat b a)
x (substr x 2)
)
)
(if (setq y (assoc (setq x (substr x 2)) l))
(setq l (subst (cons x (+ (atof b) (cdr y))) y l))
(setq l (cons (cons x (atof b)) l))
)
)
(foreach x l (write-line (strcat (car x) "\t" (rtos (cdr x) 2 1)) o))
(close o)
(startapp "notepad.exe" f)
)
)
(princ)
)

Tharwat 发表于 2022-7-5 20:20:46

你好
 
玩一玩,让我知道。
 

(defun c:ccsv (/ s i e f o x y l lst)
;; Tharwat 18. Mar. 2015 ;;
(princ "\n Select Single line texts to export to Excel file :")
(if (setq s (ssget '((0 . "TEXT") (1 . "#*"))))
   (progn
   (setq o (open (setq f (strcat (getvar 'DWGPREFIX)
                                 (vl-filename-base (getvar 'DWGNAME))
                                 ".csv"
                           )
                   )
                   "w"
             )
   )
   (write-line (strcat "DESCRIPTION" ";" "QTY") o)
   (repeat (setq i (sslength s))
       (setq e (entget (ssname s (setq i (1- i))))
             x (cdr (assoc 1 e))
             b ""
       )
       (while (wcmatch (setq a (substr x 1 1)) "")
         (setq b (strcat b a)
               x (substr x 2)
         )
       )
       (if (setq y (assoc (setq x (substr x 2)) l))
         (setq l (subst (cons x (+ (atof b) (cdr y))) y l))
         (setq l (cons (cons x (atof b)) l))
       )
   )
   (foreach x l
       (write-line (strcat (car x) ";" (rtos (cdr x) 2 1)) o)
   )
   (close o)
   )
)
(princ)
)

anupmadhu 发表于 2022-7-5 20:46:34

先生
 
这很好,但结果是在一列中同时包含plant name和QT,如果可能,可以在不同的列中进行。
这是我用于将图层名称和长度导出到excel的代码,结果是否与MLEN输出匹配
(defun c:mlen (/ m ss clist temp xls sort combine mlen4_1)
(defun sort (lst predicate)
   (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst predicate))
)
(defun combine (inlist is-greater is-equal / sorted current result)
   (setq sorted (sort inlist is-greater))
   (setq current (list (car sorted)))
   (foreach item (cdr sorted)
   (if (apply is-equal (list item (car current)))
(setq current (cons item current))
(progn
   (setq result (cons current result))
   (setq current (list item))
)
   )
   )
   (cons current result)
)
(defun xls ( Data-list header Colhide Name_list / *aplexcel* *books-colection* Currsep
*excell-cells* *new-book* *sheet#1* *sheet-collection* col iz_listo row cell cols)
(defun Letter (N / Res TMP)(setq Res "")(while (> N 0)(setq TMP (rem N 26)
TMP (if (zerop TMP)(setq N (1- N) TMP 26) TMP)
Res (strcat (chr (+ 64 TMP)) Res)N   (/ N 26))) Res)
(if (null Name_list)(setq Name_list ""))
(setq*AplExcel*   (vlax-get-or-create-object "Excel.Application"))
(if (setq *New-Book*(vlax-get-property *AplExcel* "ActiveWorkbook"))
   (setq *Books-Colection*(vlax-get-property *AplExcel* "Workbooks")
         *Sheet-Collection* (vlax-get-property *New-Book* "Sheets")
            *Sheet#1*   (vlax-invoke-method *Sheet-Collection* "Add"))
(setq *Books-Colection*(vlax-get-property *AplExcel* "Workbooks")
             *New-Book*   (vlax-invoke-method *Books-Colection* "Add")
         *Sheet-Collection* (vlax-get-property *New-Book* "Sheets")
            *Sheet#1*   (vlax-get-property *Sheet-Collection* "Item" 1)))
(setq *excell-cells*   (vlax-get-property *Sheet#1* "Cells"))
(setq Name_list (if (= Name_list "")
               (vl-filename-base(getvar "DWGNAME"))
               (strcat (vl-filename-base(getvar "DWGNAME")) "&" Name_list))
col 0 cols nil)
(if (> (strlen Name_list) 26)
(setq Name_list (strcat (substr Name_list 1 10) "..." (substr Name_list (- (strlen Name_list) 13) 14))))
(vlax-for sh *Sheet-Collection* (setq cols (cons (strcase(vlax-get-property sh 'Name)) cols)))
(setq row Name_list)
(while (member (strcase row) cols)(setq row (strcat Name_list " (" (itoa(setq col (1+ col)))")")))
(setq Name_list row)
(vlax-put-property *Sheet#1* 'Name Name_list)
(setq Currsep (vlax-get-property *AplExcel* "UseSystemSeparators"))
(vlax-put-property *AplExcel* "UseSystemSeparators" :vlax-false) ;_?? ???????????? ????????? ?????????
(vlax-put-property *AplExcel* "DecimalSeparator" ".")            ;_??????????? ??????? ? ????? ?????
(vlax-put-property *AplExcel* "ThousandsSeparator" " ")          ;_??????????? ???????
(vla-put-visible *AplExcel* :vlax-true)(setq row 1 col 1)
(if (null header)(setq header '("X" "Y" "Z")))
(repeat (length header)(vlax-put-property *excell-cells* "Item" row col
(vl-princ-to-string (nth (1- col) header)))(setq col (1+ col)))(setqrow 2 col 1)
(repeat (length Data-list)(setq iz_listo (car Data-list))(repeat (length iz_listo)
(vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (car iz_listo)))
(setq iz_listo (cdr iz_listo) col (1+ col)))(setq Data-list (cdr Data-list))(setq col 1 row (1+ row)))
(setq col (1+(length header)) row (1+ row))
(setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate"
   (strcat "A1:" (letter col)(itoa row))))) ;_ end of setq
(setq cols (vlax-get-property cell'Columns))
(vlax-invoke-method cols 'Autofit)
(vlax-release-object cols)(vlax-release-object cell)
(foreach item ColHide (if (numberp item)(setq item (letter item)))
(setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate"
   (strcat item "1:" item "1"))))
(setq cols (vlax-get-property cell'Columns))
(vlax-put-property cols 'hidden 1)
(vlax-release-object cols)(vlax-release-object cell))
(vlax-put-property *AplExcel* "UseSystemSeparators" Currsep)
(mapcar 'vlax-release-object (list *excell-cells* *Sheet#1* *Sheet-Collection* *New-Book* *Books-Colection*
*AplExcel*))(setq *AplExcel* nil)(gc)(gc)(princ))
(defun mlen4_1 (lst / sum_len)
   (setq sum_len 0)
   (foreach item (mapcar 'car lst)
   (setq
sum_len(+ sum_len
      (if (vlax-property-available-p item 'length)
      (vla-get-length item)
      (cond
          ((=
       (strcase (vla-get-objectname item) t)
       "acdbarc"
   ) ;_=
   (vla-get-arclength item)
          )
          ((=
       (strcase (vla-get-objectname item) t)
       "acbcircle"
   ) ;_=
   (* pi 2.0 (vla-get-radius item))
          )
          (t 0.0)
      ) ;_cond
      ) ;_if
   ) ;_+
   )
   )
   (if(not (zerop sum_len))
   (princ
(strcat "\n\t" (cdar lst) " = " (rtos (* sum_len m) 2 4))
   )
   )
   (list (cdar lst)(rtos (* sum_len m) 2 4))
)
(vl-load-com)
(if (null *M*)(setq *M* 1))
(initget 6)
(and
   (princ "\nEnter scale factor <")
   (princ *M*)(princ ">: ")
   (or (setq m (getreal))
(setq m *M*)
)
   (setq *M* m)
   (setq ss (ssget "_:L"))
   (setq ss (mapcar
      (function vlax-ename->vla-object)
      (vl-remove-if
    (function listp)
    (mapcar
      (function cadr)
      (ssnamex ss)
    ) ;_mapcar
      ) ;_ vl-remove-if
      )
   )
   (mapcar '(lambda (x)
      (setq temp (cons (cons x (vla-get-Layer x)) temp))
      )
   ss
   )
   (setq clist(combine temp
      '(lambda (a b)
         (> (cdr a) (cdr b))
       )
      '(lambda (a b)
         (eq (cdr a) (cdr b))
       )
   )
   )
   (princ
   "\n\nThe total length of all line primitives by layers:"
   )
   (setq temp (mapcar 'mlen4_1 clist))
   (xls temp '("Layer" "Length") nil "mlen41")
)
(princ)
) ;_defun

Tharwat 发表于 2022-7-5 21:04:52

 
不,我的代码将数据导出到两列中。

suriwaits 发表于 2022-7-5 21:11:59

 
您只需在由代码创建的excel文件中选择A列,转到“数据”选项卡,将文本转换为列,选择“分隔符”,单击“下一步”,选中分号。它将在单独的列中拆分数量和工厂名称。
 
或者,您可以使用Tharwat的旧代码,从记事本中复制结果并将其粘贴到excel上。我每次都使用它,代码节省了我很多时间。
 
谢谢Tharwat。。
页: [1]
查看完整版本: 选择并移动多行文字(&T)