明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 22466|回复: 37

[LISP]利用ObjectDbx技术在当前图形中插入其它未打开的图形中的图块

  [复制链接]
发表于 2003-7-25 09:58 | 显示全部楼层 |阅读模式
  1. ;;利用ObjectDbx技术在当前图形中插入其它未打开的图形中的图块
  2. ;;
  3. ;; INS_BLK.LSP
  4. ;;
  5. ;; 作者: 赖云龙(龙龙仔)
  6. ;;
  7. ;; E_MAIL: lai_wan_lung@pchome.com.tw
  8. ;;
  9. ;; 版权所有 (C) 2003
  10. ;;
  11. ;;   本软件免费可供进行任何用途需求的拷贝、修改及发行, 但请遵循下述原则:
  12. ;;
  13. ;;   1)  上列的版权通告必须出现在每一份拷贝里。
  14. ;;   2)  相关的说明文档也必须载有版权通告及本项许可通告。
  15. ;;
  16. ;;   本软件仅提供作为应用上的参考, 而未声明或隐含任何保证; 对于任何特殊
  17. ;;   用途之适应性, 以及商业销售所隐含作出的保证, 在此一概予以否认。
  18. (vl-load-com)
  19. (defun C:INS_BLK (/             DWGNAME        NAME1           APP
  20.                   DCL_FILE   DCL_NAME        DCL_FLAG   BLK_LIST
  21.                   OK_ID             DCL_TOG
  22.                  )

  23.   (defun REGISTEROBJECTDBX (/ DBXSERVER) ;by Tony Tanzillo
  24.     (cond
  25.       ((vl-registry-read
  26.          "HKEY_CLASSES_ROOT\\ObjectDBX.AxDbDocument\\CLSID"
  27.        )
  28.       )
  29.       ((not (setq DBXSERVER (findfile "AxDb15.dll")))
  30.        (alert "Error: Can't locate ObjectDBX Library (AxDb15.dll)")
  31.       )
  32.       (t
  33.        (startapp "regsvr32.exe" (strcat "/s "" DBXSERVER """))
  34.        (or
  35.          (vl-registry-read
  36.            "HKEY_CLASSES_ROOT\\ObjectDBX.AxDbDocument\\CLSID"
  37.          )
  38.          (alert
  39.            "Error: Failed to register ObjectDBX ActiveX services."
  40.          )
  41.        )
  42.       )
  43.     )
  44.   )

  45.   (defun INS (ENT / SB)
  46.     (if        (/= "" DWGNAME)
  47.       (progn
  48.         (prompt        (strcat        "\n从图档"
  49.                         DWGNAME
  50.                         "插入图块"
  51.                         (getvar "insname")
  52.                         "\n"
  53.                 )
  54.         )
  55.         (setq SB (vla-item DBXBLOCKS ENT))
  56.         (vla-copyobjects
  57.           DBXDOC
  58.           (vlax-safearray-fill
  59.             (vlax-make-safearray
  60.               vlax-vbobject
  61.               '(0 . 0)
  62.             )
  63.             (list SB)
  64.           )
  65.           (vla-get-modelspace DOC)
  66.         )
  67.         (vlax-release-object SB)
  68.       )
  69.       (prompt
  70.         (strcat "\n从图档" NAME1 "插入图块" (getvar "insname") "\n")
  71.       )
  72.     )
  73.     (command "_.INSERT" "")
  74.   )

  75.   (defun DWG_SEL (FLAG / STR1 STR2 BLK BLK_NO BLK_NO_TEXT)

  76.     (if        (= FLAG 1)
  77.       (setq DBXBLOCKS (vla-get-blocks DOC))
  78.       (progn
  79.         (setq
  80.           DWGNAME (getfiled "选取图档" (getvar "dwgprefix") "dwg" 8)
  81.         )
  82.         (if (equal (strcase NAME1) (strcase DWGNAME))
  83.           (setq        DBXBLOCKS (vla-get-blocks DOC)
  84.                 DWGNAME          ""
  85.           )
  86.           (progn
  87.             (vla-open DBXDOC DWGNAME)
  88.             (setq DBXBLOCKS (vla-get-blocks DBXDOC))
  89.           )
  90.         )
  91.       )
  92.     )
  93.     (setq BLK_LIST '())
  94.     (vlax-for BLK DBXBLOCKS
  95.       (if (and (not (wcmatch (substr (vla-get-name BLK) 1 1) "`*"))
  96.                (= (vla-get-isxref BLK) :vlax-false)
  97.           )
  98.         (setq BLK_LIST
  99.                (append BLK_LIST (list (vla-get-name BLK)))
  100.         )
  101.       )
  102.     )

  103.     (if        (/= BLK_LIST '())
  104.       (setq BLK_LIST (acad_strlsort BLK_LIST))
  105.     )
  106.     (start_list "dcl_blk_list")
  107.     (mapcar 'add_list BLK_LIST)
  108.     (end_list)

  109.     (setq BLK_NO (length BLK_LIST))
  110.     (setq BLK_NO_TEXT
  111.            (strcat "图档中的图块\n 共计  "
  112.                    (itoa BLK_NO)
  113.                    "  个"
  114.            )
  115.     )
  116.     (set_tile "dcl_blk_no" BLK_NO_TEXT)
  117.     (set_tile "dcl_blk_list" "0")
  118.     (FILL_BLK_NAME)

  119.     (if        (/= "" DWGNAME)
  120.       (set_tile        "txt_2"
  121.                 (if (< (strlen DWGNAME) 90)
  122.                   (progn
  123.                     (setq STR1 (substr DWGNAME 1 44)
  124.                           STR2 (substr DWGNAME 45)
  125.                     )
  126.                     (strcat STR1 "\n" STR2)
  127.                   )
  128.                   (progn
  129.                     (setq STR1 (substr DWGNAME 1 40)
  130.                           STR2 (vl-filename-base
  131.                                  (strcase (strcat DWGNAME
  132.                                                   (vl-filename-extension DWGNAME)
  133.                                           )
  134.                                  )
  135.                                )
  136.                     )
  137.                     (strcat STR1 "....\n...." STR2)
  138.                   )
  139.                 )
  140.       )
  141.       (set_tile        "txt_2"
  142.                 (if (< (strlen NAME1) 90)
  143.                   (progn
  144.                     (setq STR1 (substr NAME1 1 44)
  145.                           STR2 (substr NAME1 45)
  146.                     )
  147.                     (strcat STR1 "\n" STR2)
  148.                   )
  149.                   (progn
  150.                     (setq STR1 (substr NAME1 1 44)
  151.                           STR2 (vl-filename-base
  152.                                  (strcase (strcat NAME1
  153.                                                   (vl-filename-extension NAME1)
  154.                                           )
  155.                                  )
  156.                                )
  157.                     )
  158.                     (strcat STR1 "\n...." STR2)
  159.                   )
  160.                 )
  161.       )
  162.     )
  163.   )

  164.   (defun FILL_BLK_NAME (/ BLK_ID FILL_NAME)
  165.     (setq BLK_ID (get_tile "dcl_blk_list"))
  166.     (setq BLK_ID (atoi BLK_ID))
  167.     (if        (/= BLK_LIST '())
  168.       (progn
  169.         (setq FILL_NAME (nth BLK_ID BLK_LIST))
  170.         (setvar "insname" FILL_NAME)
  171.         (set_tile "dcl_blk_name" FILL_NAME)
  172.       )
  173.       (progn
  174.         (setvar "insname" "")
  175.         (set_tile "dcl_blk_name" "")
  176.       )
  177.     )
  178.   )

  179.   (setq NAME1 (strcat (getvar "dwgprefix") (getvar "dwgname")))
  180.   (setq DWGNAME "")
  181.   (setq APP (vlax-get-acad-object))
  182.   (setq DOC (vla-get-activedocument APP))
  183.   (if (= "15" (substr (getvar "acadver") 1 2))
  184.     (progn
  185.       (if (not (REGISTEROBJECTDBX))
  186.         (exit)
  187.       )
  188.       (setq
  189.         DBXDOC (vla-getinterfaceobject APP "ObjectDBX.AxDbDocument")
  190.       )
  191.     )
  192.     (setq
  193.       DBXDOC (vla-getinterfaceobject APP "ObjectDBX.AxDbDocument.16")
  194.     )
  195.   )

  196.   (setq        DCL_FILE "ins_blk"
  197.         DCL_NAME "blk_1"
  198.   )
  199.   (setq DCL_FLAG (load_dialog DCL_FILE))
  200.   (if (< DCL_FLAG 0)
  201.     (exit)
  202.   )
  203.   (if (not (new_dialog DCL_NAME DCL_FLAG))
  204.     (exit)
  205.   )

  206.   (DWG_SEL 1)
  207.   (set_tile "dcl_blk_list" "0")
  208.   (FILL_BLK_NAME)

  209.   (action_tile "key_insert" "(dwg_sel 0)")
  210.   (action_tile "cancel" "(done_dialog 0)")
  211.   (action_tile
  212.     "accept"
  213.     "(done_dialog 1)"
  214.   )
  215.   (setq OK_ID (start_dialog))
  216.   (unload_dialog DCL_FLAG)
  217.   (if (and (= 1 OK_ID) (/= "" (getvar "insname")))
  218.     (INS (getvar "insname"))
  219.   )
  220.   (vlax-release-object APP)
  221.   (vlax-release-object DOC)
  222.   (vlax-release-object DBXDOC)
  223.   (vlax-release-object DBXBLOCKS)
  224.   (setq        DBXDOC NIL
  225.         DBXBLOCKS NIL
  226.         DOC NIL
  227.   )
  228.   (princ)
  229. )
  230. (prompt "\nType INS_BLK")
  231. (princ)
  1. ;;
  2. ;;储存档名:INS_BLK.DCL
  3. ;;
  4. blk_1: dialog {                                               
  5.         label        = "插入图块";               
  6.         spacer;               
  7.         : row {               
  8.                                                      
  9.                 : list_box {                                               
  10.                         label        = "列示图块名称 : ";       
  11.                         key        = "dcl_blk_list";       
  12.                         fixed_width        = true;                               
  13.                         width        = 25;                                       
  14.                         height        = 8;                                       
  15.                         allow_accept        = true;                               
  16.                         action = "(fill_blk_name)";                       
  17.                         }                        

  18.                 : text_part {                                       
  19.                         label        = " ";                               
  20.                         key        = "dcl_blk_no";               
  21.                         fixed_width        = true;                       
  22.                         width        = 12;                               
  23.                         height        = 3;                               
  24.                         }                

  25.                 }
  26.         spacer;                                       
  27.         : text_part {                                       
  28.                 key        = "txt_2";       
  29.                height        = 2;                       
  30.                        }       
  31.         : button {                                       
  32.                 label        = "浏览";       
  33.                 key        = "key_insert";                       
  34.                 }                               
  35.         : boxed_column {                               
  36.                 : row{                                               
  37.                         : text_part {                                       
  38.                                 label        = "插入图块的名称: ";       
  39.                                 key        = "txt_1";                       
  40.                                 fixed_width        = true;                       
  41.                                 width        = 16;                               
  42.                                 }               
  43.                         : text_part {                                       
  44.                                 key        = "dcl_blk_name";               
  45.                                 fixed_width        = true;                       
  46.                                 width        = 20;                               
  47.                                 }                

  48.                         }                        
  49.                 spacer;                               
  50.                 }        
  51.         spacer;                               
  52.         ok_cancel;                       
  53.         }

评分

参与人数 1威望 +2 金钱 +20 贡献 +5 激情 +10 收起 理由
mccad + 2 + 20 + 5 + 10 【好评】好程序

查看全部评分

发表于 2003-7-25 12:07 | 显示全部楼层
好东西!
发表于 2003-7-25 12:35 | 显示全部楼层

為甚麼不能插入整個圖檔

 楼主| 发表于 2003-7-25 17:09 | 显示全部楼层
整个图檔不就等于INSERT了吗?
发表于 2003-7-30 21:16 | 显示全部楼层
和DSX的 DWGSCAN 程序有什么区别?
 楼主| 发表于 2003-7-31 08:10 | 显示全部楼层
;;;************************************************************************
;;; Filename: DBX-DwgScan.LSP
;;; Author:   David Stein
;;; Date:     April 2002
;;; Purpose:  ObjectDBX Drawing Scan Example for Visual LISP Developers Bible book
;;; Copyright (C)2002 David M. Stein, All Rights Reserved.
;;;************************************************************************
;;; Usage: (DWGSCAN tablename itemname drawings)
;;;
;;; Where:
;;;        tablename = string name of table (ex. Blocks, Ltypes, DimStyles, etc.)
;;;        itemname  = string name of item to search for
;;;        drawings  = list of drawing filenames (full paths included for each)
;;;
;;; Returns: A list of filenames that contain the itemname being searched for.
;;;************************************************************************
;;; For use with AutoCAD 2000, 2000i and 2002 or related vertical products
;;; only.  Will NOT work with R14, any LT or Inventor products.
;;; Must be compiled as a separate-namespace VLX application
;;;************************************************************************

dwgscan只是list table,但很多人不懂连续操作(图檔间的开闭及对象的读写)
发表于 2003-7-31 19:29 | 显示全部楼层
怎么用啊?
发表于 2003-9-29 10:21 | 显示全部楼层
该函数有何实际用途?
发表于 2003-10-4 22:48 | 显示全部楼层
最好给个插图啊````

小虾好理解啊`
发表于 2003-10-23 20:02 | 显示全部楼层
龙龙仔发表于2003-7-31 8:10:00;;;************************************************************************
;;; Filename: DBX-DwgScan.LSP
;;; Author:   David Stein
;;; Date:     April 2002
;;; Purpose:  




请问这个文件在哪里能找到啊?谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 20:32 , Processed in 0.923313 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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