乐筑天下

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

[编程交流] 修改ATTOUT Lisp以分配S

[复制链接]

33

主题

165

帖子

148

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
149
发表于 2022-7-5 15:03:39 | 显示全部楼层 |阅读模式
大家好。所以我一直在疯狂地尝试找到一个Lisp例程,它将完全实现我想要做的,我一直在碰壁。我在Excel中开发了一个BOM表生成器。人们可以超快速地分类所有内容,并在短时间内建立完整的BOM表。我需要将数据从Excel传输到AutoCAD。我知道可以使用ATTOUT/ATTIN,但这个过程需要太多步骤。如果我能够只将块句柄导入Excel,我可能会离我想去的地方更近一点。因此,首先,如果有人能解决这整个困境,请提供答案。。。不胜感激。我的下一个思路是使用附加的ATTOUT Lisp并对其进行修改,使其具有指定的路径,并且每次都转到同一个Excel工作表,但只在“句柄”和“块名”上传输。有人知道怎么做吗?谢谢
阿托特。LSP
回复

使用道具 举报

15

主题

315

帖子

361

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 15:52:38 | 显示全部楼层
脚本将文件名放入(setq fname…)
 
除了fname还被用作保存文件指针的变量,这很奇怪。
而不是这样做:
 
(setq fname(打开fname“W”))
 
我会的
(setq fp(open fname“W”);;fp表示文件指针。
 
无论如何,我将fname设置为“c:\usertemp\Book1.xls”,并注释了fname要求用户选择文件的地方。
检查我的代码的第一行,设置任何适合你的值。
(
-留着吧。xls,而不是a。xlsx公司
-您有两次全部\类型。
)
 
 
  1. (setq my_filename "C:\\UserTemp\\Book1.xls")
  2. ;;  Groups elements in sublist by criteria
  3. (defun subtrack (test lst)
  4. (apply 'append (mapcar '(lambda (x)
  5. (if (eq (car x) test)(list x))) lst)))
  6. ;;  Counts equivalent subs in list
  7. (defun countsub    (lst sub)
  8. (cond    ((null lst) 0)
  9.    ((and (equal (caar lst) (car sub) 0.00001)
  10.          (equal (cadar lst) (cadr sub) 0.00001)
  11.     )
  12.     (1+ (countsub (cdr lst) sub))
  13.    )
  14.    (T (countsub (cdr lst) sub))
  15. )
  16. )
  17. ;;  Get info from block include from constant attributes in following form:
  18. ;; (("TAG1" . "VALUE1") ("TAG2" . "VALUE2") ...("*CONSTANT*: TAGN" . "VALUEN"))
  19. (defun get-all-atts (obj / atts att_list const_atts const_list ent)
  20.    (and
  21.     (if (and obj
  22.          (vlax-property-available-p obj 'Hasattributes)
  23.          (eq :vlax-true (vla-get-hasattributes obj))
  24.         )
  25.       (progn
  26.         (setq atts (vlax-invoke obj 'Getattributes))
  27.         (foreach att atts
  28.           (setq att_list
  29.              (cons (cons (vla-get-tagstring att)
  30.                  (vla-get-textstring att)
  31.                )
  32.                att_list
  33.              )
  34.           )
  35.         )
  36.       )
  37.     )
  38.    )
  39.    (cond ((vlax-method-applicable-p obj 'Getconstantattributes)
  40.       (setq const_atts (vlax-invoke obj 'Getconstantattributes))
  41.       (foreach att    const_atts
  42.         (setq const_list
  43.            (cons (cons    (vla-get-tagstring att)
  44.                (vla-get-textstring att)
  45.              )
  46.              const_list
  47.            )
  48.         )
  49.       )
  50.       (setq att_list (reverse (append const_list att_list)))
  51.      )
  52.      (T (reverse att_list))
  53.    )
  54. )
  55. ;;            Main part            ;;
  56. (defun C:ATOUT (/     acsp      adoc       aexc        awb         axss
  57.        bname     cll      colm       com_data csht     data
  58.        exc_data fname      header_list        info     nwb
  59.        osm     row      sht       ss        str1     str2
  60.        subtot     tmp_data tmp_get  tmp_snip tot
  61.           )
  62.    (vl-load-com)
  63.    (setq adoc (vla-get-activedocument
  64.         (vlax-get-acad-object)
  65.           )
  66.      acsp (vla-get-modelspace adoc)
  67.    )
  68.    (setq osm (getvar "osmode"))
  69.    (setvar "osmode" 0)
  70.    (setvar "cmdecho" 0)
  71.    (vla-endundomark adoc)
  72.    (vla-startundomark adoc)
  73.    (vl-cmdf "zoom" "a")
  74.    (vl-cmdf "zoom" ".85x")
  75.    ;;    variations of the selection
  76.    ;;  All blocks :
  77.        (setq ss (ssget "_X" (list (cons 0 "INSERT")(cons 66 1))))
  78.    ;;    Selected on screen:
  79. ;;;(setq ss (ssget '((0 . "INSERT"))))
  80.    ;; All blocks by name:
  81. ;;;    (setq bname (getstring "\n    ***    Block name:\n"))
  82. ;;;    (setq ss (ssget "_X" (list (cons 0 "INSERT")(cons 66 1) (cons 2 bname))))
  83.    (setq axss (vla-get-activeselectionset adoc))
  84.    (setq com_data nil)                  ;for debug only
  85.    (vlax-for a    axss
  86.      (setq tmp_get (get-all-atts a))
  87.      (setq tmp_data (append (list (vla-get-name a)(vla-get-handle a)) tmp_get))
  88.      (setq com_data (cons tmp_data com_data))
  89.      (setq tmp_data nil)
  90.    )                          ;ok
  91.    (setq tot (length com_data))
  92.    (setq exc_data nil)                  ;for debug only
  93.    (while com_data
  94.      (setq tmp_snip
  95.         (subtrack (caar com_data) com_data)
  96.      )
  97.      (setq str1 (strcat "Subtotal blocks "
  98.             """ (caar com_data) """
  99.                         ": "
  100.         )
  101.        str2
  102.         (itoa (length tmp_snip))
  103.      )
  104.      (setq exc_data (append exc_data
  105.                 (list (append tmp_snip (list (list str2 str1))))
  106.             )
  107.        com_data (vl-remove-if
  108.               (function not)
  109.               (mapcar (function (lambda (x)
  110.                       (if (not (member x tmp_snip))
  111.                         x
  112.                       )
  113.                     )
  114.                   )
  115.                   com_data
  116.               )
  117.             )
  118.        tmp_snip nil
  119.      )
  120.    )
  121.    (setq exc_data
  122.           (mapcar (function (lambda (x)
  123.               (mapcar (function (lambda (y)               
  124.                   (append (list (cadr y)(car y))(cddr y))))
  125.                       x
  126.                       )
  127.                               )
  128.                             )
  129.                   exc_data)
  130.                   )
  131.    ;;        Eof calc part        ;;
  132.    ;;    ***    Excel part    ***    ;;
  133.    ;;(setq fn (vl-filename-base (getvar "dwgname")))
  134.    ;;(setq fname (strcat (getvar "dwgprefix") fn ".xls"))
  135.    ;;(setq fname (open fname "W"))
  136.    ;;(close fname)
  137.    (setq fn (vl-filename-base (getvar "dwgname")))
  138.    (setq fname my_filename)    ;; open in read-write.  
  139.    ;;(setq fname (open fname "W"))
  140.    ;;(close fname)
  141.    (princ "*")
  142.    (princ fname)
  143.    (setq fname (findfile fname))
  144.    ;;; Excel part written by  ALEJANDRO LEGUIZAMON -  http://arquingen.tripod.com.co  
  145.    (princ "*")
  146.    (setq aexc (vlax-get-or-create-object "Excel.Application")
  147.      awb  (vlax-get-property aexc "Workbooks")
  148.      nwb  (vlax-invoke-method awb "Open" fname)
  149.      sht  (vlax-get-property nwb "Sheets")
  150.      csht (vlax-get-property sht "Item" 1)
  151.      cll  (vlax-get-property csht "Cells")
  152.    )
  153.    (vlax-put-property csht 'Name "AttOut-AttIn")
  154.    (vla-put-visible aexc :vlax-true)
  155.    (setq row 1
  156.      colm 1
  157.    )
  158.    (setq header_list
  159.           '("HANDLE"
  160.             "BLOCK NAME"
  161.             "TAG1"
  162.             "TAG2"
  163.             "TAG3"
  164.             "TAG4"
  165.             "TAG5"
  166.             "TAG6"
  167.             "TAG7"
  168.             "TAG8"
  169.             "TAG9"
  170.             "TAG10"
  171.            )
  172.    ) ;_ end of setq
  173.    (repeat (length header_list)
  174.      (vlax-put-property
  175.    cll
  176.    "Item"
  177.    row
  178.    colm
  179.    (vl-princ-to-string (car header_list))
  180.      )
  181.      (setq colm (1+ colm)
  182.        header_list
  183.         (cdr header_list)
  184.      )
  185.    )
  186.    (setq row 2
  187.      colm 1
  188.    )
  189.    (repeat (length exc_data)
  190.      (setq data   (reverse (cdr (reverse (car exc_data))))
  191.        subtot (last (car exc_data))
  192.      )
  193.      (repeat (length data)
  194.    (setq info (car data))
  195.    (repeat    (length info)
  196.      (vlax-put-property
  197.        cll
  198.        "Item"
  199.        row
  200.        colm
  201.            (if (< colm 3)
  202.        (vl-princ-to-string (car info))
  203.            (vl-princ-to-string (cdar info)))
  204.      )
  205.      (setq colm (1+ colm))
  206.      (setq info (cdr info))
  207.    )
  208.        (setq data (cdr data))
  209.    (setq row  (1+ row)
  210.          colm 1
  211.    )
  212.      )
  213.      (vlax-put-property
  214.    cll
  215.    "Item"
  216.    row
  217.    colm
  218.    (vl-princ-to-string (car subtot))
  219.      )
  220.      (setq colm (1+ colm))
  221.      (vlax-put-property
  222.    cll
  223.    "Item"
  224.    row
  225.    colm
  226.    (vl-princ-to-string (cadr subtot))
  227.      )
  228.      (setq exc_data (cdr exc_data))
  229.      (setq row     (1+ row)
  230.        colm 1
  231.      )
  232.    )
  233.    (setq row  (1+ row)
  234.      colm 1
  235.    )
  236.    (vlax-put-property
  237.      cll
  238.      "Item"
  239.      row
  240.      colm
  241.      (vl-princ-to-string "TOTAL BLOCKS:")
  242.    )
  243.    (setq colm (1+ colm))
  244.    (vlax-put-property
  245.      cll
  246.      "Item"
  247.      row
  248.      colm
  249.      (vl-princ-to-string tot)
  250.    )
  251.   (setq fcol (vlax-get-property csht "Range" "A:Z"))
  252.   (vlax-put-property fcol "NumberFormat" "@")
  253. ;;;        Columns("A:A").Select
  254. ;;;    Range("A394").Activate
  255. ;;;    Selection.NumberFormat = "@"
  256.    (vlax-invoke (vlax-get-property csht "Columns") "AutoFit")
  257.    (vlax-release-object cll)
  258.    (vlax-release-object fcol)
  259.    (vlax-release-object csht)
  260.    (vlax-release-object sht)
  261.    (vlax-release-object nwb)
  262.    (vlax-release-object awb)
  263.    (vlax-release-object aexc)
  264.    (setq aexc nil)
  265.    (setvar "osmode" osm)
  266.    (setvar "cmdecho" 1)
  267.    (vla-clear axss)
  268.    (vlax-release-object axss)
  269.    (vla-regen adoc acactiveviewport)
  270.    (vla-endundomark adoc)
  271.    (gc)
  272.    (gc)
  273.    ;; (alert "Save Excel manually")
  274.    (princ "\nSave Excel manually: \n")
  275.    (princ)
  276.    )
  277. (princ "\n\t\t***\tStart command with ATOUT...\t***")
  278. (princ)
回复

使用道具 举报

33

主题

165

帖子

148

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
149
发表于 2022-7-5 16:26:25 | 显示全部楼层
非常感谢您抽出时间来做这件事。我一直在到处寻找用Excel数据修改BOM属性的方法,但我一直没有找到答案。。。所以现在我在尝试另一种方法。这让我走得更远。再次感谢你的帮助。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-15 00:47 , Processed in 2.112119 second(s), 59 queries .

© 2020-2025 乐筑天下

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