明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 13756|回复: 49

[源码] 飞扬工具集中的智能图框源代码

    [复制链接]
发表于 2013-5-12 08:18 | 显示全部楼层 |阅读模式
本帖最后由 豆角 于 2013-5-19 10:07 编辑

智能图框源代码实现以下功能:
       当修改完块参照的“比例”属性后,块参照的真实比例及标注比例、线型比例将跟随变化;
       当修改完块参照的真实比例后,块参照的“比例”属性及标注比例、线型比例将跟随变化。
我用vlisp写成的,代码如下:
  1. (vl-cmdf "_.undefine" ".insert");;只加载一次
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. (vl-load-com)
  4. (defun c:insert  (/)
  5.   (vlr-add cmd-reactorfeiy-frame)
  6.   (vla-SendCommand
  7.     (vla-get-ActiveDocument (vlax-get-acad-object))
  8.     "_.insert "
  9.   )
  10.   (princ)
  11. )
  12. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  13. ;;命令反应器
  14. (vl-load-com)
  15. (setq cmd-reactorfeiy-frame
  16.        (vlr-editor-reactor
  17.    nil
  18.    '((:vlr-commandEnded . cmdEndedfeiy-frame))
  19.        )
  20. )
  21. (vlr-remove cmd-reactorfeiy-frame)
  22. ;;;;;;;;;;;;;;;;;;;;
  23. ;;命令反应器回调函数
  24. (defun cmdEndedfeiy-frame (reactor     lst     /
  25.          feiyold_error     feiyatt-obj
  26.          feiybk-obj  scale     dz
  27.          scale-str   ratio
  28.         )
  29.   ;;错误处理函数
  30.   (setq feiyold_error *error*)
  31.   (defun *error* (msg)
  32.     (setq feiybk-scale-obj '())
  33.     (setq feiybk-scale-att '())
  34.     (setq *error* feiyold_error)
  35.     (vlr-remove cmd-reactorfeiy-frame)
  36.     (princ)
  37.   )
  38.   ;;
  39.   ;;为块添加反应器
  40.   (cond
  41.     ((equal '("DROPGEOM") lst)
  42.      (feiybk-add-reactor (entlast))
  43.     )

  44.     ((or (equal '("PASTECLIP") lst)
  45.    (and (equal '("COPY") lst) is-feiybk-copied)
  46.      )
  47.      (setq is-feiybk-copied nil)
  48.      (feiy-LAutoframe)
  49.     )

  50.     ((equal '("INSERT") lst)
  51.      (feiybk-add-reactor (entlast))
  52.      (vla-put-XEffectiveScaleFactor
  53.        (vlax-ename->vla-object (entlast))
  54.        (vla-get-XEffectiveScaleFactor
  55.    (vlax-ename->vla-object (entlast))
  56.        )
  57.      )
  58.     )

  59.     (t nil)
  60.   )
  61.   ;;块引发更新动作
  62.   (if (and feiybk-scale-obj
  63.      (not (equal '("ACDCATTEDIT") lst))
  64.      (not (equal '("EATTEDIT") lst))
  65.      (setq feiyatt-obj (car feiybk-scale-obj))
  66.      (setq feiybk-obj (cadr feiybk-scale-obj))
  67.      (setq scale (caddr feiybk-scale-obj))
  68.      (/= scale (atof (vla-get-TextString feiyatt-obj)))
  69.       )
  70.     (progn
  71.       (setq dz (getvar "dimzin"))
  72.       (setvar "dimzin" 8)
  73.       (setq scale-str (rtos scale 2 6))
  74.       (setvar "dimzin" dz)
  75.       (vla-put-TextString feiyatt-obj scale-str)
  76.       (feiyupdate-sacle scale)
  77.       (setq feiybk-scale-obj '())
  78.       (setq feiybk-scale-att '())
  79.     )
  80.   )
  81.   ;;属性引发更新动作
  82.   (if (and feiybk-scale-att
  83.      (setq feiyatt-obj (car feiybk-scale-att))
  84.      (setq feiybk-obj (cadr feiybk-scale-att))
  85.      (setq ratio (caddr feiybk-scale-att))
  86.      (or (/= ratio (vla-get-XEffectiveScaleFactor feiybk-obj))
  87.          (equal '("ACDCATTEDIT") lst)
  88.          (equal '("EATTEDIT") lst)
  89.      )
  90.       )
  91.     (progn
  92.       (if (/= ratio (vla-get-XEffectiveScaleFactor feiybk-obj))
  93.   (vla-put-XEffectiveScaleFactor feiybk-obj ratio)
  94.       )
  95.       (if (/= ratio (vla-get-YEffectiveScaleFactor feiybk-obj))
  96.   (vla-put-YEffectiveScaleFactor feiybk-obj ratio)
  97.       )
  98.       (if (/= ratio (vla-get-ZEffectiveScaleFactor feiybk-obj))
  99.   (vla-put-ZEffectiveScaleFactor feiybk-obj ratio)
  100.       )

  101.       (feiyupdate-sacle ratio)
  102.       (setq feiybk-scale-att '())
  103.       (setq feiybk-scale-obj '())
  104.     )
  105.   )
  106.   ;;反应器失效
  107.   (vlr-remove cmd-reactorfeiy-frame)
  108.   (setq *error* feiyold_error)
  109. )
  110. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  111. ;;块回调函数
  112. (defun feiybk-calling
  113.        (owner reactor lst / feiyold_error feiyatt-obj scale)

  114.   (setq feiyold_error *error*)
  115.   (defun *error* (msg)
  116.     (setq feiybk-scale-obj '())
  117.     (setq *error* feiyold_error)
  118.     (princ)
  119.   )

  120.   (setq feiyatt-obj (vlr-Data reactor))
  121.   (setq scale (vla-get-XEffectiveScaleFactor owner))
  122.   (setq feiybk-scale-obj (list feiyatt-obj owner scale))
  123.           ;反应器激活
  124.   (vlr-add cmd-reactorfeiy-frame)

  125.   (setq *error* feiyold_error)
  126. )
  127. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  128. ;;属性回调函数
  129. (defun feiyatt-calling
  130.        (owner reactor lst / feiyold_error feiybk-obj ratio)

  131.   (setq feiyold_error *error*)
  132.   (defun *error* (msg)
  133.     (setq feiybk-scale-att '())
  134.     (setq *error* feiyold_error)
  135.     (princ)
  136.   )

  137.   (setq feiybk-obj (vlr-Data reactor))
  138.   (setq ratio (atof (vla-get-TextString owner)))
  139.   (if (/= 0 ratio)
  140.     (progn
  141.       (setq feiybk-scale-att (list owner feiybk-obj ratio))
  142.       (vlr-add cmd-reactorfeiy-frame)  ;反应器激活
  143.     )
  144.     (setq feiybk-scale-att '())
  145.   )

  146.   (setq *error* feiyold_error)
  147. )
  148. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  149. ;;块复制回调函数
  150. (defun feiybk-copied (owner reactor lst /)  
  151.   (setq is-feiybk-copied t)
  152.   (vlr-add cmd-reactorfeiy-frame)  ;反应器激活  
  153. )
  154. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  155. ;;为块添加反应器函数,ent为任意图元
  156. (defun feiybk-add-reactor (ent        /
  157.          feiyold_error    obj
  158.          ObjectName      Name
  159.          atts        feiyatt-list
  160.          feiyatt-obj      feiyatt-obj-Reactor
  161.          feiybk-obj-Reactor
  162.          feiyatt-obj-xmmc feiyatt-obj-tzmc
  163.          str
  164.         )
  165.   (setq feiyold_error *error*)
  166.   (defun *error* (msg)
  167.     (setq *error* feiyold_error)
  168.     (vlr-remove cmd-reactorfeiy-frame)   
  169.     (princ)
  170.   )
  171.   (setq obj (vlax-ename->vla-object ent))
  172.   (setq ObjectName (vla-get-ObjectName obj))
  173.   (setq Name (vla-get-effectivename obj))
  174.   (if (and (= "AcDbBlockReference" ObjectName)
  175.      (or (= "A0" Name)
  176.          (= "A1" Name)
  177.          (= "A2" Name)
  178.          (= "A3" Name)
  179.          (= "A4" Name)
  180.      )
  181.      
  182.      (= :vlax-true (vla-get-HasAttributes obj))
  183.       )
  184.     (progn
  185.       (setq atts (vlax-invoke-method obj 'GetAttributes))      
  186.       (setq
  187.   feiyatt-list
  188.    (vlax-safearray->list (vlax-variant-value atts))
  189.       )
  190.       ;;
  191.       (setq
  192.   feiyatt-obj
  193.    (car (vl-member-if
  194.     '(lambda (x) (= "比例" (vla-get-TagString x)))
  195.     feiyatt-list
  196.         )
  197.    )
  198.       )
  199.           ;属性反应器
  200.       (setq feiyatt-obj-Reactor
  201.        (vlr-object-reactor
  202.          (list feiyatt-obj)
  203.          obj
  204.          '((:vlr-objectClosed . feiyatt-calling)
  205.     )

  206.        )
  207.       )
  208.           ;块反应器
  209.       (setq feiybk-obj-Reactor
  210.        (vlr-object-reactor
  211.          (list obj)
  212.          feiyatt-obj
  213.          '((:vlr-objectClosed . feiybk-calling)
  214.      (:vlr-copied . feiybk-copied)
  215.      (:vlr-erased . feiybk-erased)
  216.      (:vlr-unerased . feiybk-unerased)
  217.      (:vlr-modified . feiybk-modified)
  218.      (:vlr-subObjModified . feiybk-subObjModified)
  219.     )
  220.        )
  221.       )
  222.       ;;为图框中的多行文本添加段落标记
  223.       (foreach x feiyatt-list
  224.   (if (= :vlax-true (vla-get-mtextattribute x))
  225.     (progn
  226.       (setq str (vla-get-TextString x))
  227.       (if  (/= 0 (vl-string-search "\\p" str))
  228.         (progn
  229.     (setq str (strcat "\\pxsm1,qc;" str))
  230.     (vla-put-TextString x str)
  231.         )
  232.       )
  233.     )
  234.   )
  235.       )      
  236.     )
  237.   )
  238.   (setq *error* feiyold_error)
  239. )
  240. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  241. (defun feiybk-erased (owner reactor lst /)  
  242.   (princ)
  243. )
  244. (defun feiybk-unerased (owner reactor lst /)  
  245.   (princ)
  246. )
  247. (defun feiybk-modified (owner reactor lst /)  
  248.   (princ)
  249. )
  250. (defun feiybk-subObjModified (owner reactor lst /)  
  251.   (princ)
  252. )
  253. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  254. ;;更新标注比例、线型比例函数
  255. (defun feiyupdate-sacle  (sacle        /       feiyold_error
  256.        ss-setup     AcadObject   AcadDocument
  257.        mSpace        dimstyle     dimstyle-name
  258.        ss        n
  259.       )

  260.   (setq feiyold_error *error*)
  261.   (defun *error* (msg)
  262.     (setq *error* feiyold_error)
  263.     (princ)
  264.   )
  265.   ;;选择集:包括尺寸标注对象和非连续线型图层上的对象
  266.   (defun ss-setup (dimstyle-name / odoc ss-filter item layer-name ss)
  267.     (setq odoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  268.     (setq ss-filter '((-4 . "or>")))
  269.     (vlax-for item (vla-get-LineTypes odoc)
  270.       (if (and (/= "Continuous" (vla-get-name item))
  271.          (/= "ByLayer" (vla-get-name item))
  272.          (/= "ByBlock" (vla-get-name item))
  273.     )
  274.   (progn   
  275.     (setq ss-filter (cons (cons 6 (vla-get-name item)) ss-filter))   
  276.   )
  277.       )
  278.     )
  279.           ;
  280.     (vlax-for item (vla-get-layers odoc)
  281.       (if (/= "Continuous" (vla-get-LineType item))
  282.   (progn
  283.     (setq layer-name (vla-get-name item))   
  284.     (setq ss-filter (cons (cons 8 layer-name) ss-filter))   
  285.   )
  286.       )
  287.     )
  288.           ;
  289.     (setq ss-filter (append (list '(-4 . "<or")
  290.           ;
  291.           '(-4 . "<and")
  292.           '(0 . "DIMENSION")
  293.           (cons 3 dimstyle-name)
  294.           '(-4 . "and>")
  295.           ;
  296.           '(-4 . "<and")
  297.           '(0 . "LEADER")
  298.           (cons 3 dimstyle-name)
  299.           '(-4 . "and>")

  300.           )
  301.           ss-filter
  302.         )
  303.     )
  304.     (setq ss (ssget "X" ss-filter))
  305.     ss
  306.   )
  307.   
  308.   (setq  AcadObject   (vlax-get-acad-object)
  309.   AcadDocument (vla-get-ActiveDocument AcadObject)
  310.   mSpace       (vla-get-ModelSpace AcadDocument)
  311.   )
  312.   (setvar "ltscale" sacle)
  313.   (setvar "TEXTSIZE" (* 4.0 sacle))
  314.   (vla-setvariable AcadDocument "dimscale" sacle)
  315.   (setq dimstyle (vla-get-activedimstyle AcadDocument))
  316.   (setq dimstyle-name (vla-get-name dimstyle))
  317.   (vla-copyfrom dimstyle mSpace)
  318.   (setq ss (ss-setup dimstyle-name))
  319.   (if ss
  320.     (progn
  321.       (setq n 0)
  322.       (repeat (sslength ss)
  323.   (vla-update (vlax-ename->vla-object (ssname ss n)))
  324.   (setq n (1+ n))
  325.       )
  326.     )
  327.   )
  328.   (setq *error* feiyold_error)
  329. )
  330. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  331. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  332. ;;文档打开反应器
  333. (setq feiydwgFOpened-refr
  334.        (vlr-dwg-reactor
  335.    nil
  336.    '((:vlr-dwgFileOpened . dwgFOpenedfeiy-frame))
  337.        )
  338. )
  339. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  340. ;;文档打开反应器回调函数
  341. (defun dwgFOpenedfeiy-frame (reactor lst)
  342.           ;反应器激活
  343.   (vlr-add cmd-reactorfeiy-frame)  
  344. )
  345. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  346. ;;块插入反应器
  347. (vlr-insert-reactor
  348.   nil
  349.   '((:vlr-endInsert . endInsertfeiy-frame))
  350. )
  351. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  352. ;;块插入反应器回调函数
  353. (defun endInsertfeiy-frame (reactor lst)
  354.           ;反应器激活
  355.   (vlr-add cmd-reactorfeiy-frame)
  356. )
  357. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  358. ;;将打开图形中的已有图框附上对象反应器
  359. (defun feiy-LAutoframe (/ feiyold_error ent feiybk-ss feiyold_error n)
  360.   (setq feiyold_error *error*)
  361.   (defun *error* (msg)
  362.     (setq *error* feiyold_error)
  363.     (princ)
  364.   )  
  365.   (setq feiybk-ss (ssget "X" '((0 . "INSERT"))))
  366.   (setq n 0)
  367.   (if feiybk-ss
  368.     (repeat (sslength feiybk-ss)
  369.       (setq ent (ssname feiybk-ss n))
  370.       (feiybk-add-reactor ent)
  371.       (setq n (1+ n))
  372.     )
  373.   )
  374.   (setq *error* feiyold_error)
  375. )
  376. (feiy-LAutoframe)
  377. ;;end

评分

参与人数 2明经币 +4 金钱 +18 收起 理由
wayne_myles + 1 跟随G版,赞一个 呵呵
Gu_xl + 3 + 18 赞一个!

查看全部评分

发表于 2022-7-21 13:25 | 显示全部楼层
这个必须支持 很不错呀
发表于 2020-6-11 23:47 | 显示全部楼层
这个必须收下,感谢分享
发表于 2022-7-21 07:58 | 显示全部楼层
好東西,下載下來試試!
发表于 2013-5-12 09:02 | 显示全部楼层
谢谢分享,
发表于 2013-5-12 10:21 | 显示全部楼层
可以布局使用不?
 楼主| 发表于 2013-5-12 10:30 | 显示全部楼层
在模型和布局中都可以使用。
发表于 2013-5-12 10:53 | 显示全部楼层
嘿嘿~支持楼主留个脚印
发表于 2013-5-12 20:39 | 显示全部楼层
有效果图吗???
发表于 2013-5-12 22:50 | 显示全部楼层
这个要顶。
发表于 2013-5-12 23:21 | 显示全部楼层
顶下 谢谢楼主分享!!1
发表于 2013-5-13 10:59 | 显示全部楼层
能不能单独使用的啊。。。。。。。。。
 楼主| 发表于 2013-5-13 16:38 | 显示全部楼层
这已经是完整的源代码了!学vlisp的朋友不妨制作一个以A0、A1、A2、A3或A4为名称,且带“比例”属性的块试一试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-7 20:43 , Processed in 1.200791 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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