明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 472|回复: 2

[经验] ObjectDBX方法批量插入路径下dwg文件 插入点问题

[复制链接]
发表于 2024-8-29 13:29:20 | 显示全部楼层 |阅读模式
  1. ;;;ObjectDBX方法批量插入路径下dwg文件
  2. (defun c:bins () (c:BatchInsert))
  3. (princ "\nObjectDBX方法批量插入路径下dwg文件,By Gu_xl 命令: bins")
  4. (defun c:BatchInsert ()
  5.   (
  6.    (lambda
  7.      (path files / dbxdoc dbxModelSpace all t1)
  8.       (GXL-SYS-PROGRESS-INIT "" (length files))
  9.       (foreach dwg files
  10.         (GXL-SYS-PROGRESS (length files) -1)
  11.       ;(command "insert" (strcat "*" path "\" dwg) '(0 0 0) 1 0)
  12.         (setq dbxdoc (gxl-GetDocumentObject (strcat path "\" dwg)))
  13.         (setq dbxModelSpace (vla-get-ModelSpace dbxdoc))
  14.         (setq all (GXL-ITEMSALL dbxModelSpace))
  15.         (gxl-CopyObjects all dbxdoc nil)
  16.       )
  17.       (gxl-Sys-Progress-Done)
  18.    )
  19. (setq path (GXL-FILE-GETFOLDER "选取文件夹"))

  20.     (
  21.      (lambda (path)
  22.        (if path
  23.          (VL-DIRECTORY-FILES path "*.dwg" 1)
  24.        )
  25.      )
  26.      path
  27.     )
  28.   )
  29.   (princ)
  30. )
  31. ;;;(gxl-GetDocumentObject filename) 获取DWG文件的Document 对象
  32. (defun gxl-GetDocumentObject (filename / acdocs dbx acVer)

  33.   (vlax-map-collection
  34.     (vla-get-Documents (vlax-get-acad-object))
  35.     (function
  36.       (lambda (doc)
  37.         (setq acdocs
  38.                (cons
  39.                  (cons (strcase (vla-get-fullname doc)) doc)
  40.                  acdocs
  41.                )
  42.         )
  43.       )
  44.     )
  45.   )

  46.   (cond
  47.     ((not (setq filename (findfile filename))) nil)
  48.     ((cdr (assoc (strcase filename) acdocs)))
  49.     ((not
  50.        (vl-catch-all-error-p
  51.          (vl-catch-all-apply
  52.            'vla-open
  53.            (list (setq dbx
  54.                         (vla-GetInterfaceObject
  55.                           (vlax-get-acad-object)
  56.                           (if (< (setq acVer (atoi (getvar "ACADVER"))) 16)
  57.                             "ObjectDBX.AxDbDocument"
  58.                             (strcat "ObjectDBX.AxDbDocument." (itoa acVer))
  59.                           )
  60.                         )
  61.                  )
  62.                  filename
  63.            )
  64.          )
  65.        )
  66.      )
  67.      dbx
  68.     )
  69.   ) ;_ cond
  70. )
  71. ;;;gxl-ItemsAll collection )返回集合全部成员表
  72. (defun gxl-ItemsAll (collection / result)
  73.   (vl-catch-all-apply
  74.     (FUNCTION
  75.       (lambda ()
  76.         (vlax-for item collection (setq result (cons item result)))
  77.         (reverse result)
  78.       )
  79.     )
  80.   )
  81.   result
  82. )
  83. ;;;(gxl-CopyObjects 对象表/图元表/选择集/ENAME/Object 对象宿主 拷贝目标宿主(nil 默认当前空间))
  84. ;;;(gxl-CopyObjects (ssget) *ACDOCUMENT* (vla-Item (vla-get-Blocks *ACDOCUMENT*) (GXL-DXF (car (GXL-SEL-ENTSEL "选择图块:" '((0 . "insert")))) 2)))
  85. (defun gxl-CopyObjects ( lst owner dest )
  86.   (cond ((= 'List (type lst))
  87.          (setq lst (mapcar '(lambda (x) (if (= 'ename (type x)) (vlax-ename->vla-object x) x)) lst))
  88.          )
  89.         ( (= 'pickset (type lst)) (setq lst (GXL-SEL-SS->VLA lst)))
  90.         ( (= 'ename (type lst)) (setq lst (list (vlax-ename->vla-object lst))))
  91.         ( (= 'vla-object (type lst)) (setq lst (list lst)))
  92.         )
  93.   (if (null dest) (setq dest (vlax-get-property (vla-get-ActiveDocument (vlax-get-acad-object)) (if (= 1 (getvar 'CVPORT)) 'PaperSpace 'ModelSpace))))
  94.   (vla-CopyObjects owner (GXL-NUM-OBJECTVARIANT lst) dest)
  95. )
  96. ;;;(gxl-num-ObjectVariant vla对象表) 创建vla变体
  97. (defun gxl-num-ObjectVariant ( lst )
  98.   (vlax-make-variant
  99.     (vlax-safearray-fill
  100.       (vlax-make-safearray vlax-vbobject
  101.         (cons 0 (1- (length lst)))
  102.       )
  103.       lst
  104.     )   
  105.   )
  106. )

  107. ;;;;;;gxl-sel-ss->vla 选择集转为Vla列表
  108. (defun gxl-sel-ss->vla ( ss / i l )
  109.   (if ss
  110.     (repeat (setq i (sslength ss))
  111.       (setq l (cons (vlax-ename->vla-object (ssname ss (setq i (1- i)))) l))
  112.     )
  113.   )
  114. )
  115. ;;; 进程条初始化 (gxl-Sys-Progress-Init 提示 进程总数)
  116. ;;; 进程步进 (gxl-Sys-Progress 进程总数 -1)
  117. ;;; 进程结束 (gxl-Sys-Progress-Done)
  118. (setq *ProgressID* 0
  119.       *ProgressPrompt* ""
  120.       *ProgressBFB* "  0%")

  121. (defun gxl-Sys-Progress-Init (str to)
  122.     (if *FlagINIT* (alert "上一次进程条没有结束!"))
  123.     (setq *ProgressID* 0
  124.           *ProgressTo* to
  125.           *ProgressPrompt* str
  126.           *ProgressBFB* 2
  127.           *FlagINIT* T)
  128.     )
  129. (defun gxl-Sys-Progress-Done ()
  130.     (setq *ProgressID* 0
  131.           *ProgressTo* nil
  132.           *ProgressPrompt* ""
  133.           *ProgressBFB* 2
  134.           *FlagINIT* nil)
  135.     (setvar "modemacro" "")
  136.     )
  137. (defun gxl-Sys-Progress        (to i / CS_TEXT MYI bfb corstate LL)
  138.   (if (not *FlagINIT*)
  139.     (gxl-Sys-Progress-Init "" 100)
  140.   )
  141.   (if (and *FlagINIT* *ProgressTo*)
  142.     (setq to *ProgressTo*)
  143.   )
  144.   (setq        cs_text        "████████████████████"
  145.         LL        (strlen cs_text)
  146.   )
  147.   (if (<= i 0)
  148.     (setq i               (- *ProgressID* i)
  149.           *ProgressID* i
  150.     )
  151.     (setq *ProgressID* i)
  152.   )
  153.   (if (> i to)
  154.     (setq i to)
  155.   )
  156.   (setq        myi (fix (/ (* (strlen cs_text) i) to))
  157.         myi (* 2 (/ myi 2))
  158.   )
  159.   (if (= 0 myi)
  160.     (setq myi 2)
  161.   )

  162.   (setq bfb (fix (* 100 i (/ 1.0 to))))
  163.   (if (/= *ProgressBFB* bfb)
  164.     (progn
  165.       (setq *ProgressBFB* bfb)
  166.       (setq
  167.         cs_text        (substr cs_text 1 myi)
  168.         cs_text        (strcat cs_text (gxl-Str-Space (- LL myi)))
  169.       )


  170.       (setq bfb (itoa bfb))
  171.       (cond
  172.         ((= 1 (strlen bfb))
  173.          (setq bfb (strcat "  " bfb "% "))
  174.         )
  175.         ((= 2 (strlen bfb)) (setq bfb (strcat " " bfb "% ")))
  176.         ((= 3 (strlen bfb)) (setq bfb (strcat bfb "% ")))
  177.       )
  178.       (setvar "modemacro"
  179.               (strcat *ProgressPrompt*
  180.                       "已完成"
  181.                       cs_text
  182.                       bfb
  183.               )
  184.       )

  185.     )
  186.   )


  187. )
  188. ;;; gxl-Str-Space 制造空格字串
  189. (defun gxl-Str-Space (n / zf)
  190.   (if (< n 1)
  191.    (setq zf "")
  192.     (progn
  193.   (setq zf "")

  194.   (repeat n
  195.     (setq zf (strcat " " zf))
  196.     )
  197.   )
  198.     )
  199.   )
  200. ;; (gxl-file-GetFolder "选择文件夹:") 返回值:字符串,文件夹路径,如果点了cancel, 返回nil

  201. (defun gxl-file-GetFolder (msg / WinShell shFolder path catchit)
  202.   (setq winshell (vlax-create-object "Shell.Application"))
  203.   (setq shFolder (vlax-invoke-method WinShell 'BrowseForFolder 0 msg 1))
  204.   (setq
  205.     catchit (vl-catch-all-apply
  206.               '(lambda ()
  207.                  (setq shFolder (vlax-get-property shFolder 'self))
  208.                  (setq path (vlax-get-property shFolder 'path))
  209.                )
  210.             )
  211.   )
  212.   (if (vl-catch-all-error-p catchit)
  213.     nil
  214.     path
  215.   )
  216. )
以上为论坛 古佬的code,想问下怎么控制插入复制DWG的控制点呢?像insert 一样可以设置控制插入点呢?有大佬有研究吗?
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2024-8-29 14:08:10 | 显示全部楼层
已解决,先移动到0点 ,在移动到需要的点!!
发表于 2024-8-29 23:28:50 | 显示全部楼层
都有DWG列表了,直接遍历一一插入就是了,用DBX多此一举。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-22 02:19 , Processed in 0.213012 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表