明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3484|回复: 15

[源码] 相对块复制选择集,增加随目标块旋转镜像的功能【20210704更新】

[复制链接]
发表于 2018-2-2 20:35 | 显示全部楼层 |阅读模式
本帖最后由 masterlong 于 2021-7-4 17:16 编辑

很早以前放出的程序
相对块复制选择集

后来加入了副本随目标块旋转、镜像的功能
但一直没有时间针对210组码为(0 0 -1)的情况进行处理
今天有点空
把程序完善了一下
直接放上lsp和dcl文件供下载
————好像还不能直接上传附件

两个命令
AS      为指定图块组,添加关联选择集
ASR    AS扩展,副本随目标图块旋转、镜像

文件需放到CAD支持目录下
或者自己手动修改程序路径
差什么函数说一下



;;;另存为【~~~adds```为指定的图块添加关联选择集.lsp】
  1. ;;选择一个参照块和一个要关联复制的选择集。指定目标块组后,逐一按相对位置进行复制
  2. (defun c:as()  (load "~~~adds```为指定图块组添加关联选择集.lsp") (setq rofollowblk "0") (c:adds))
  3. (defun c:asR() (load "~~~adds```为指定图块组添加关联选择集.lsp") (setq rofollowblk "1") (c:adds))

  4. (defun c:adds()
  5.   (adds_load)
  6.   (adds_err)
  7.   (princ "\n为指定图块组,添加关联选择集【对话框启动...】")(princ)
  8.   (setvar "cmdecho" 0)
  9.   (setq blk NIL  blkss NIL  addss NIL)
  10.   (setq adds_dcl (load_dialog "~~~adds.dcl"))
  11.   (adds_startdcl)
  12.   (adds_no_err)
  13. (princ)
  14. )

  15. (defun adds_startdcl()
  16.   (new_dialog "adds" adds_dcl "")
  17.   (addsmode)
  18.   (action_tile "rofollowblk" "(setq rofollowblk $value)(addsmode)")
  19.   (action_tile "blksscosame" "(setq blksscosame $value)")
  20.   (action_tile "sel_addss" "(done_dialog 2)")
  21.   (action_tile "sel_blk"   "(done_dialog 3)")
  22.   
  23.   (setq oke (start_dialog))
  24.   (cond
  25.     ((= oke 0)(adds_clear))
  26.    
  27.     ((= oke 2)(adds_sel_addss))
  28.     ((= oke 3)(adds_sel_blk))
  29.    
  30.     ((= oke 8)(adds_dont_ro))
  31.     ((= oke 9)(adds_do_ro))
  32.   )
  33. )

  34. (defun addsmode()
  35.   (if (= "0" rofollowblk)
  36.     (progn
  37.       (set_tile "rofollowblk" "0")
  38.       (action_tile "sel_blkss" "(done_dialog 8)")
  39.     )
  40.     (progn
  41.       (set_tile "rofollowblk" "1")
  42.       (action_tile "sel_blkss" "(done_dialog 9)")
  43.     )
  44.   )
  45.   (if (/= "1" blksscosame) (setq blksscosame "0"))
  46.   (set_tile "blksscosame" blksscosame)
  47.   (addsettite)
  48. )
  49. (defun addsettite()
  50.   (if addss
  51.     (if blk
  52.       (progn
  53.         (mode_tile "sel_addss" 1)
  54.         (mode_tile "sel_blk"   1)
  55.         (mode_tile "sel_blkss" 0)
  56.         (mode_tile "sel_blkss" 2)
  57.         (mode_tile "sel_blkss" 3)
  58.       )
  59.       (progn
  60.         (mode_tile "sel_blkss" 1)
  61.         (mode_tile "sel_addss" 1)
  62.         (mode_tile "sel_blk"   0)
  63.         (mode_tile "sel_blk"   2)
  64.         (mode_tile "sel_blk"   3)
  65.       )
  66.     )
  67.     (progn
  68.       (mode_tile "sel_blk"   1)
  69.       (mode_tile "sel_blkss" 1)
  70.       (mode_tile "sel_addss" 0)
  71.       (mode_tile "sel_addss" 2)
  72.       (mode_tile "sel_addss" 3)
  73.     )
  74.   )
  75. )

  76. (defun adds_clear()
  77.   (if blk (redraw blk 4))
  78.   (if addss (ssdraw addss 4))
  79.   (setq blk NIL  blkss NIL  addss NIL)
  80. )

  81. (defun adds_sel_addss()
  82.   (princ "\n选择要关联添加的选择集...")
  83.   (setq addss (ssget))
  84.   (ssdraw addss 3)
  85.   (adds_startdcl)
  86. )

  87. (defun adds_sel_blk()
  88.   (princ "\n指定参照图块...")
  89.   (if (setq blk (ssget ":e:s" '((0 . "insert"))))
  90.     (progn
  91.       (setq blk (ssname blk 0))
  92.       (setq blkinspo (trueINSPO blk))
  93.       (setq blkco (dxf blk 62))
  94.       
  95.       (setq the_blk50 (dxf 50 blk))
  96.       (if (= -1 (last (dxf 210 blk)))    (setq the_blk50 (- PI the_blk50)))      ;;获取图块的修正角度
  97.               
  98.       (setq blkname   (dxf  2 blk))
  99.       (redraw blk 3)
  100.     )
  101.   )
  102.   (adds_startdcl)
  103. )

  104. (defun adds_dont_ro()
  105.   (princ "\n指定目标图块组...")
  106.   (if (= blksscosame "1")
  107.     (setq blkss (ssget (list '(0 . "insert") (cons 2 blkname)(cons 62 blkco))))
  108.     (setq blkss (ssget (list '(0 . "insert") (cons 2 blkname))))
  109.   )
  110.   (if (and blkss addss)
  111.     (progn
  112.       (setq blkss (ssdel blk (ssadd blk blkss)))
  113.       (foreach x (ss2list blkss)
  114.         (setq xinspo (trueINSPO x))
  115.         (command "copy" addss "" "non" blkinspo "non" xinspo)
  116.       )
  117.     )
  118.     (adds_startdcl)
  119.   )
  120. )


  121. (defun adds_do_ro()
  122.   (setq blkname (dxf 2 blk))
  123.   (redraw blk 3)
  124.   
  125.   (princ "\n指定目标图块组...")
  126.   (if (= blksscosame "1")
  127.     (setq blkss (ssget (list '(0 . "insert") (cons 2 blkname)(cons 62 blkco))))
  128.     (setq blkss (ssget (list '(0 . "insert") (cons 2 blkname))))
  129.   )
  130.   
  131.   ;;重写代码【代码貌似ok】
  132.   (if blkss
  133.     (progn
  134.       (setq blkss (ssdel blk (ssadd blk blkss)))            ;;滤除参照块
  135.       (if (= -1 (last (dxf 210 blk))) (blk-1to1 blk))          ;;如果参照块本身210是00-1,改为001
  136.       (setq addssmidpo (getmidpo (ssbox addss)))            ;;目标选择集的中心点
  137.       (setq nipt (MAT:TransNested addssmidpo (list blk) 0 2))    ;;该中心点对应于参照块定义的坐标【nipt】

  138.       (foreach x (ss2list blkss)
  139.         (setq mirr_x_yn NIL   mirr_y_yn NIL)              ;;设定允许翻转初始值
  140.         (setq nopt (btrans nipt x))                    ;;获取nipt对应x的实际坐标

  141.         ;;如果x本身210是00-1,改为001。同时设定副本需两次镜像
  142.         (if (= -1 (last (dxf 210 x)))
  143.           (progn (blk-1to1 x) (setq mirr_x_yn T   mirr_y_yn T))
  144.         )         
  145.         ;;计算副本的旋转角
  146.         (setq curr_blk50 (dxf 50 x))
  147.         (setq cha50 (- curr_blk50 the_blk50))
  148.         (setq ro50 (* (/ cha50 PI) 180.0))

  149.         ;;;根据当前块的xy,再进行单次mirr的设定
  150.         (if (> 0 (dxf 41 x))
  151.           (setq mirr_x_yn (null mirr_x_yn))
  152.         )
  153.         (if (> 0 (dxf 42 x))
  154.           (setq mirr_y_yn (null mirr_y_yn))
  155.         )
  156.         
  157.         ;;复制副本并进行最终的旋转镜像处理
  158.         (setq thelast (entlast))
  159.         (command "copy" addss "" "non" addssmidpo "non" nopt)
  160.         (setq newss (entbackss thelast))
  161.         (command "rotate" newss "" "non" nopt ro50)
  162.         (if mirr_x_yn
  163.           (command "mirror" newss "" "non" nopt "non" (polar nopt (+ curr_blk50 d_090) 1000) "y")
  164.         )
  165.         (if mirr_y_yn
  166.           (command "mirror" newss "" "non" nopt "non" (polar nopt curr_blk50 1000) "y")
  167.         )
  168.       )
  169.       (adds_clear)
  170.     )
  171.     (adds_startdcl)
  172.   )
  173. )


  174. (defun adds_err()
  175.     (setvar "cmdecho" 0)
  176.     (command "undo" "g")
  177.     (setq adds_olderr *error* )
  178.   
  179.      (defun *error*(msg)
  180.        (redraw)
  181.       (setvar "cmdecho" 0)
  182.        (command "undo" "e")
  183.       (setq *error* adds_olderr)
  184.      (princ)
  185.      )
  186.   
  187.      (defun adds_no_err()
  188.        (redraw)
  189.        (setvar "cmdecho" 0)
  190.        (command "undo" "e")
  191.        (setq *error* adds_olderr)
  192.     (princ)
  193.      )
  194.   
  195. (princ)
  196. )
  197. (defun adds_load()
  198.   (load "~~~adds```为指定图块组添加关联选择集.lsp")
  199.   (setq thetiplist '(  "AS     为指定图块组,添加关联选择集"
  200.                 "ASR    AS扩展,选择集副本随目标图块旋转、镜像"
  201.               )
  202.   )
  203.   (setq *ent2obj* vlax-Ename->Vla-Object
  204.       d_090   (* PI 0.5)
  205.       d_180   PI
  206.       d_360   (* PI 2)
  207.   )
  208. (princ)
  209. )







  210. ;999`````````````````````````````````````````````````````````````````````````````公共函数




  211. ;999公共函数
  212. ;;blk-1to1  将已确定210为00-1的图块更改为001
  213. (defun blk-1to1( b / pooo )
  214.   (if (= -1 (caddr (dxf 210 b)))
  215.     (progn
  216.       (setq pooo (trueinspo b))
  217.       (entmodsome b  (list
  218.                     (cons 210 '(0 0 1))
  219.                     (cons 50 (- d_360 (dxf b 50)))
  220.                     (cons 41 (- (dxf b 41)))
  221.                     (cons 10 pooo)
  222.                 )
  223.       )
  224.     )
  225.   )
  226. )

  227. ;999公共函数
  228. ;;按指定的模式重画一个选择集的全部物体<改模式时,需要先反绘。1-2 3-4.(1->4=1->2->4)>    【支持模型多视口,支持布局中视口】
  229. ;;  1:显示  2:消隐  3:高亮  4:低亮
  230. (defun ssredraw( ss mode )
  231.   (ssdraw ss mode)
  232. )
  233. (defun ssdraw( ss mode / i ent vp )
  234.   (if (= (strcase (getvar "ctab")) "MODEL")
  235.     (if (member mode '(1 2 3 4))
  236.       (foreach vp (reverse (vports))
  237.         (setvar "cvport" (car vp))
  238.         (cond
  239.           ((= (type ss) 'PICKSET)
  240.             (foreach ent (ss2list ss)
  241.               (redraw ent mode)
  242.             )
  243.           )
  244.           ((= (type ss) 'list)
  245.             (foreach ent ss
  246.               (redraw ent mode)
  247.             )
  248.           )
  249.           ((= (type ss) 'ename)
  250.             (redraw ss mode)
  251.           )
  252.         )
  253.       )
  254.     )
  255.     (cond
  256.       ((= (type ss) 'PICKSET)
  257.         (foreach ent (ss2list ss)
  258.           (redraw ent mode)
  259.         )
  260.       )
  261.       ((= (type ss) 'list)
  262.         (foreach ent ss
  263.           (redraw ent mode)
  264.         )
  265.       )
  266.       ((= (type ss) 'ename)
  267.         (redraw ss mode)
  268.       )
  269.     )
  270.   )
  271. (princ)
  272. )

  273. ;999公共函数
  274. ;;y:gettrueINSPO  获取一个块的实际块心   (trans blk'dxf10 blk 1)
  275. ;;举例
  276. ;;(trueINSPO blockent)
  277. (defun trueINSPO( blkent / pt po )
  278.   (setq pt (dxf 10 blkent))
  279.   (if (setq po (trans pt blkent 1))
  280.     po
  281.     pt
  282.   )
  283. )

  284. ;999公共函数
  285. ;;dxf  获取图元某个dxf组码(内参不限种类顺序::: n ent [entget ent] )
  286. (defun dxf( n ent / temp tmp )
  287.   (if (/= (type n) 'int)
  288.     (setq temp   ent
  289.         ent  n   
  290.         n    temp
  291.     )
  292.   )
  293.   (if (= (type ent) 'ENAME)
  294.     (setq temp (entget ent))
  295.     (setq temp ent)
  296.   )
  297.   (if (= n 62)
  298.     (if (setq tmp (assoc n temp))  (cdr tmp)  256)
  299.     (cdr (assoc n temp))
  300.   )
  301. )

  302. ;999公共函数
  303. ;;求点对中点
  304. (defun getmidpo( pts / P1 P2 X Y )
  305.   (setq p1 (car pts) p2 (cadr pts))
  306.   (if (= (length p1) (length p2))
  307.     nil
  308.     (setq p1 (list (car p1) (cadr p1))
  309.         p2 (list (car p2) (cadr p2))
  310.     )
  311.   )
  312.   (mapcar '(lambda (X Y) (/ (+ X Y) 2.0)) P1 P2)
  313. )

  314. ;999公共函数
  315. ;;选择集的最小(正交)包围框                    ————选择集包含二次样条曲线时,包围框可能不准,暂时没解决的办法
  316. (defun ssbox( ss / ll ur aa bb )
  317.   (if (= (type ss) 'PICKSET)
  318.     (setq ss (ss2list ss))
  319.   )
  320.   (foreach x ss
  321.     (vla-getboundingbox (*ent2obj* x) 'll 'ur)
  322.     (setq aa (cons (vlax-safearray->list ll) aa)
  323.         bb (cons (vlax-safearray->list ur) bb)
  324.     )
  325.   )
  326.   (mapcar '(lambda(a b) (apply 'mapcar (cons a b)))
  327.     '(min max)
  328.     (list aa bb)
  329.   )
  330. )

  331. ;999公共函数
  332. ;;选择集转为图元列表
  333. (defun ss2list ( ss / n i elist )
  334.   (cond
  335.     ((null ss) NIL)
  336.     ((and (= (type ss) 'Pickset) (null (sslength ss)))
  337.         NIL
  338.     )
  339.     ((= (type ss) 'Pickset)
  340.       (setq n  (sslength ss)
  341.           i n
  342.           elist '()
  343.       )
  344.       (repeat n
  345.         (setq i (1- i))
  346.         ;;如果没有这个if,那么选择集中被删除的图元,也会被加入到列表之中————但是极其偶尔也有可能,图元不存在但是能entget(遇到过一次,原因不明,或许是CAD的BUG)
  347.         (if (entget (ssname ss i))
  348.           (setq elist (cons (ssname ss i) elist))
  349.         )
  350.       )
  351.       elist
  352.     )
  353.     ((= (type ss) 'ename)
  354.       (list ss)
  355.     )
  356.     ((= (type ss) 'list)
  357.       (vl-remove-if-not ''((x) (and (= (type x) 'ename) (entget x))) ss)
  358.     )
  359.     ( T NIL )
  360.   )
  361. )

  362. ;999公共函数
  363. (defun entbackss ( ent / backss)
  364.   (if (and ent (*ent2obj* ent))
  365.     (progn
  366.       (setq backss (ssadd))
  367.       (while (setq ent (entnext ent))
  368.         (if (not (member (cdr (assoc 0 (entget ent))) '("ATTRIB" "VERTEX" "SEQEND")))
  369.           (setq backss (ssadd ent backss))
  370.         )
  371.       )
  372.       (if (zerop (sslength backss))
  373.         (setq backss NIL)
  374.       )
  375.       backss
  376.     )
  377.   )
  378. )

  379. ;999公共函数
  380. ;;修改一个图元的多个数据      ——————不是所有的图元都适用此方式    ——————此函数尚未考虑组码不存在时的情况:比如62
  381. (defun entmodsome( ent dxfdatalist )
  382.   (entmod (append (list (cons -1 ent)) dxfdatalist))
  383. )





  384. ;999999999999999999999999999999999````````````````````````````以下是高飞鸟大侠的矩阵变换函数``````````很牛B的函数,但我感觉有BUG,求出的点Z坐标实际应该为0,但计算结果不为0。
  385. ;                                                        ————这或许也不是BUG,而是二进制计算导致的误差
  386. ;                                                        ————图块z坐标原来为0的好办,直接设为0即可消除误差。但是原来就不为0时,这个误差就不好处理了

  387. ;;;-----------------------------------------------------------;;
  388. ;;; 块参照的变换矩阵和逆矩阵                               ;;
  389. ;;;-----------------------------------------------------------;;


  390. ;;;-----------------------------------------------------------;;
  391. ;;; 功能: 某点在块内坐标系统和世界或者用户坐标系统的转换     ;;
  392. ;;; 参数: pt 要变换的点。                                    ;;
  393. ;;;        rlst 用 nentselp或者nentsel得到的表的最后一项      ;;    就是图块主图元为元素的单表 (last (nentsel)) = (list (car (entsel))) = (<图元名: 75873f48>)
  394. ;;;        from  坐标系:0,WCS; 1,当前UCS; 2,块参照坐标系RCS  ;;
  395. ;;;        to    坐标系:0,WCS; 1,当前UCS; 2,块参照坐标系RCS  ;;
  396. ;;;-----------------------------------------------------------;;
  397. ;;; MAT:TransNested (gile)                                    ;;
  398. ;;; Translates a point coordinates from WCS or UCS to RCS     ;;
  399. ;;; -coordinates system of a                               ;;
  400. ;;; reference (xref or block) whatever its nested level-      ;;
  401. ;;;                                               ;;
  402. ;;; Arguments                                         ;;
  403. ;;; pt : the point to translate                            ;;
  404. ;;; rlst : the parents entities list from the deepest nested  ;;
  405. ;;;        to the one inserted in current space -same as      ;;
  406. ;;;        (last (nentsel)) or (last (nentselp))             ;;
  407. ;;; from to : as with trans function: 0.WCS, 1.UCS, 2.RCS     ;;
  408. ;;;-----------------------------------------------------------;;

  409. ;999应用范例
  410. ;999::::已知图框块定义中,图签右上角点坐标,求该点位在世界坐标系中的坐标
  411. ;|
  412. (setq po (MAT:TransNested '(-180 49) (list (car (entsel))) 2 0))
  413. |;
  414. ;;相对块定义的一点坐标,对应WCS中的坐标
  415. (defun btrans( pt blk )
  416.   (MAT:TransNested pt (list blk) 2 0)
  417. )
  418. (defun MAT:TransNested (pt rlst from to / GEOM)
  419.   (and (= 1 from) (setq pt (trans pt 1 0)))
  420.   (and (= 2 to) (setq rlst (reverse rlst)))
  421.   (and  (or (= 2 from) (= 2 to))
  422.       (while rlst
  423.         (setq geom (if  (= 2 to)
  424.                   (MAT:RevRefGeom (car rlst))
  425.                   (MAT:RefGeom (car rlst))
  426.                 )
  427.             rlst (cdr rlst)
  428.             pt   (mapcar '+ (MAT:mxv (car geom) pt) (cadr geom))
  429.         )
  430.       )
  431.   )
  432.   (if (= 1 to)
  433.     (trans pt 0 1)
  434.     pt
  435.   )
  436. )
  437. ;;已知WCS中的坐标,求相对于块定义中的点坐标
  438. (defun transb( pt blk )
  439.   (MAT:TransNested pt (list blk) 0 2)
  440. )



  441. ;;;-----------------------------------------------------------;;
  442. ;;; 功能:图块的变换矩阵                                      ;;
  443. ;;; 输入:块参照的图元名                                      ;;
  444. ;;; 输出:块参照的变换矩阵                                    ;;
  445. ;;;-----------------------------------------------------------;;
  446. ;;; MAT:RefGeom (gile)                                 ;;
  447. ;;; Returns a list which first item is a 3x3 transformation   ;;
  448. ;;; matrix(rotation,scales normal) and second item the object ;;
  449. ;;; insertion point in its parent(xref, bloc or space)       ;;
  450. ;;;                                                    ;;
  451. ;;; Argument : an ename                                    ;;
  452. ;;;-----------------------------------------------------------;;

  453. (defun MAT:RefGeom ( ename / elst ang norm mat )
  454.   (setq  elst (entget ename)
  455.       ang  (cdr (assoc 50 elst))
  456.       norm (cdr (assoc 210 elst))
  457.   )
  458.   (list
  459.     (setq mat (MAT:mxm
  460.               (mapcar ''((v) (trans v 0 norm T))
  461.                     '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  462.               )
  463.               (MAT:mxm
  464.                 (list (list (cos ang) (- (sin ang)) 0.0)
  465.                     (list (sin ang) (cos ang) 0.0)
  466.                     '(0.0 0.0 1.0)
  467.                 )
  468.                 (list (list (cdr (assoc 41 elst)) 0.0 0.0)
  469.                     (list 0.0 (cdr (assoc 42 elst)) 0.0)
  470.                     (list 0.0 0.0 (cdr (assoc 43 elst)))
  471.                 )
  472.               )
  473.           )
  474.     )
  475.     (mapcar '-
  476.           (trans (cdr (assoc 10 elst)) norm 0)
  477.           (MAT:mxv mat (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 elst))))))
  478.     )
  479.   )
  480. )



  481. ;;;-----------------------------------------------------------;;
  482. ;;; 功能:图块的变换矩阵的逆矩阵                              ;;
  483. ;;;-----------------------------------------------------------;;
  484. ;;; MAT:RevRefGeom (gile)                                   ;;
  485. ;;; MAT:RefGeom inverse function                             ;;
  486. ;;; 输入:块参照的图元名                                      ;;
  487. ;;; 输出:块参照的变换矩阵的逆矩阵                            ;;
  488. ;;;-----------------------------------------------------------;;
  489. (defun MAT:RevRefGeom ( ename / entData ang norm mat )
  490.   (setq  entData (entget ename)
  491.       ang    (- (cdr (assoc 50 entData)))
  492.       norm    (cdr (assoc 210 entData))
  493.   )
  494.   (list
  495.     (setq mat (MAT:mxm
  496.               (list (list (/ 1 (cdr (assoc 41 entData))) 0.0 0.0)
  497.                   (list 0.0 (/ 1 (cdr (assoc 42 entData))) 0.0)
  498.                   (list 0.0 0.0 (/ 1 (cdr (assoc 43 entData))))
  499.               )
  500.               (MAT:mxm
  501.                 (list (list (cos ang) (- (sin ang)) 0.0)
  502.                     (list (sin ang) (cos ang) 0.0)
  503.                     '(0.0 0.0 1.0)
  504.                 )
  505.                 (mapcar ''((v) (trans v norm 0 T))
  506.                       '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  507.                 )
  508.               )
  509.           )
  510.     )
  511.     (mapcar '-
  512.           (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 entData)))))
  513.           (MAT:mxv mat (trans (cdr (assoc 10 entData)) norm 0))
  514.     )
  515.   )
  516. )


  517. ;;;-----------------------------------------------------------;;
  518. ;;; 矩阵相乘                                                  ;;
  519. ;;; MAT:mxm Multiply two matrices -Vladimir Nesterovsky-      ;;
  520. ;;;-----------------------------------------------------------;;
  521. (defun MAT:mxm( m q )
  522.   (mapcar ''((r) (MAT:mxv (MAT:trp q) r)) m)
  523. )


  524. ;;;-----------------------------------------------------------;;
  525. ;;; 向量或点的矩阵变换(向量乘矩阵)                            ;;
  526. ;;; Matrix x Vector - Vladimir Nesterovsky                    ;;
  527. ;;; Args: m - nxn matrix, v - vector in R^n                   ;;
  528. ;;;-----------------------------------------------------------;;
  529. (defun MAT:mxv( m v )
  530.   (mapcar ''((r) (apply '+ (mapcar '* r v))) m)
  531. )


  532. ;;;-----------------------------------------------------------;;
  533. ;;; 矩阵转置                                                  ;;
  534. ;;; MAT:trp Transpose a matrix -Doug Wilson-                  ;;
  535. ;;; 输入:矩阵                                                ;;
  536. ;;; 输出:转置后的矩阵                                        ;;
  537. ;;;-----------------------------------------------------------;;
  538. (defun MAT:trp( m )
  539.   (apply 'mapcar (cons 'list m))
  540. )


  541. ;;;-----------------------------------------------------------;;
  542. ;;; 平齐实体的变换矩阵  -by highflybird                    ;;
  543. ;;; 输入:Ent - 实体名                                        ;;
  544. ;;; 输出:平齐这个实体的变换矩阵和它的逆矩阵                  ;;
  545. ;;;-----------------------------------------------------------;;
  546. (defun Mat:EntityMatrix (Ent / z dxf Cen obj an m1 mat Inv org)
  547.   (setq dxf (entget ent))
  548.   (if (setq Cen (cdr (assoc 10 dxf)))        ;Insertpoint,center or startpoint,etc.
  549.     (if (null (caddr Cen))
  550.       (setq Cen (append Cen '(0.0)))
  551.     )
  552.     (setq Cen '(0 0 0))
  553.   )
  554.   (setq obj (vlax-ename->vla-object Ent))      
  555.   (if (and (vlax-property-available-p obj 'elevation)    ;If it has elevation value.
  556.         (wcmatch (vla-get-objectname obj) "*Polyline")  ;It's a "AcDb2dPolyline" or "AcDbPolyline" object
  557.      )
  558.     (setq z   (vla-get-elevation obj)
  559.         Cen (list (car Cen) (cadr Cen) (+ (caddr Cen) z))  ;add elevation value
  560.     )
  561.   )
  562.   (if (vlax-property-available-p obj 'rotation)                 ;if it has a rotaion angle
  563.     (setq an (vla-get-rotation obj))
  564.     (setq an 0)
  565.   )
  566.   (MAT:Trans1 0 Ent Cen an)           ;return two matrices, the first is WCS->OCS,the second is OCS->WCS
  567. )


  568. ;;;-----------------------------------------------------------;;
  569. ;;; 通用变换矩阵 by highflybird                         ;;
  570. ;;; 输入:from - 原坐标系,                                   ;;
  571. ;;;       to   - 目的坐标系,                                 ;;
  572. ;;;       Org  - 目的坐标系的原点相对原坐标系的位置           ;;
  573. ;;;       Ang  - 相对于原坐标系的旋转角度                     ;;
  574. ;;; 输出:两个矩阵,一个是从原坐标系变换到目的坐标系的变换矩阵;;
  575. ;;;       一个是从目的坐标系变换到原坐标系的变换矩阵          ;;
  576. ;;;-----------------------------------------------------------;;
  577. (defun MAT:Trans1 (from to Org Ang / Mat Rot Inv Cen)
  578.   (setq Mat (mapcar  ''((v) (trans v from to T))
  579.                 '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.))
  580.          )
  581.   )
  582.   (if (not (equal ang 0 1e-14))
  583.     (setq Rot (list   (list (cos ang) (- (sin ang)) 0.)
  584.                 (list (sin ang) (cos ang) 0.)
  585.                 (list 0. 0. 1.)
  586.           )
  587.         mat (MAT:mxm mat Rot)
  588.     )
  589.   )
  590.   (setq Cen (trans Org to from))
  591.   (setq Inv (mat:trp mat))
  592.   (list
  593.     (Mat:DispToMatrix Inv (mat:mxv Inv (mapcar '- Cen)))  ;from->to (trans pt from to)
  594.     (Mat:DispToMatrix mat Cen)           ;to->from (trans pt to from)
  595.   )
  596. )


  597. ;;;-----------------------------------------------------------;;
  598. ;;; Append displacement vector to a matrix   -Highflybird-    ;;
  599. ;;; 把位移矢量添加到矩阵中                                    ;;
  600. ;;; 输入:mat -- 矩阵(3x3),disp -- 位移矢量                  ;;
  601. ;;; 输出:一个4X4的变换CAD的标准变换矩阵                      ;;
  602. ;;;-----------------------------------------------------------;;
  603. (defun Mat:DispToMatrix  (mat disp)
  604.   (append
  605.     (mapcar 'append mat (mapcar 'list disp))
  606.     '((0. 0. 0. 1.))
  607.   )
  608. )













  609. (princ)


;;;另存为【~~~adds.dcl】
  1. spacer_x : spacer {
  2.     height = 0.4;
  3.     width = 0.4;
  4.     horizontal_margin = none;
  5.     vertical_margin = none;
  6. }



  7. adds : dialog {
  8.   label = "为指定图块组复制关联选择集";
  9.   : boxed_column {
  10.     children_alignment = centered; width= 36; fixed_width = true;
  11.     //spacer_1;
  12.     : button {label= "指定关联选择集"; key= "sel_addss";  width= 24; fixed_width = true; height = 2.5;}
  13.     spacer_1;
  14.     //: row {
  15.       : button {label= "指定参照图块";   key= "sel_blk";    width= 24; fixed_width = true; height = 2.5;}
  16.     //  : toggle {key = "sameco";label = "指定颜色";}
  17.     //}
  18.     spacer_1;
  19.     : button {label= "指定目标图块组";   key= "sel_blkss";    width= 24; fixed_width = true; height = 2.5;}
  20.     spacer_1;
  21.   }
  22.   : boxed_column {
  23.     spacer_x;
  24.     : row {
  25.       spacer_1;spacer_1;spacer_1;
  26.       : toggle {key = "rofollowblk";  label = "随目标图块旋转、镜像";}
  27.       spacer_1;
  28.     }
  29.     spacer_x;
  30.     : row {
  31.       spacer_1;spacer_1;spacer_1;
  32.       : toggle {key = "blksscosame";  label = "目标组与参照图块同色";}
  33.       spacer_1;
  34.     }
  35.     spacer_x;
  36.   }
  37.   spacer_1;
  38.   : row {
  39.     spacer_0;
  40.     : button {label = "取消"; key = "cancel"; is_cancel = true; width = 6; fixed_width=true; height = 1; }
  41.     spacer_0;
  42.   }
  43.   spacer_1;
  44. }




"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-7-9 11:12 | 显示全部楼层
命令: Abbs
未知命令“ABBS”。按 F1 查看帮助。

命令: ASR
DEFUN 语法错误: (MAT<IMG SRC= "static/image/smiley/default/biggrin.gif" SMILIEID= "3" BORDER= "0" ALT= "" />ISPTOMATRIX (MAT DISP) (APPEND (MAPCAR (QUOTE APPEND) MAT (MAPCAR (QUOTE LIST) DISP)) (QUOTE ((0.0 0.0 0.0 1.0)))))
命令:
命令: AS
DEFUN 语法错误: (MAT<IMG SRC= "static/image/smiley/default/biggrin.gif" SMILIEID= "3" BORDER= "0" ALT= "" />ISPTOMATRIX (MAT DISP) (APPEND (MAPCAR (QUOTE APPEND) MAT (MAPCAR (QUOTE LIST) DISP)) (QUOTE ((0.0 0.0 0.0 1.0)))))
命令:
 楼主| 发表于 2018-2-2 20:49 | 显示全部楼层
本帖最后由 masterlong 于 2021-7-4 17:12 编辑

经常用的一个小程序
未加入出错处理————————————————————已添加
扩展空间很大
比如根据图块的xyz比例复制时自动缩放、镜像
或者根据块的角度自动旋转———————————————旋转、镜像已添加,缩放感觉意义不大,未予支持
也可以加入图块的指定属性为复制条件等等

使用小技巧
对话框出现时直接按空格
相当于选中下一步操作的按钮

本来可以不用对话框
但是前两个操作(单选和多选)容易搞混
加个对话框对使用者来说比较清晰
而且对话框也便于今后扩展功能

差什么函数说一下

发表于 2018-2-5 11:45 | 显示全部楼层
本帖最后由 panliang9 于 2018-2-5 12:12 编辑

@masterlong
楼主,这个工作的意思应该是选中一个参照块,然后再选一个块,就会根据前一个块的信息对后一个块做出旋转,缩放等动作是吧,但是我加载后输入
AS,还有ADDS命令,都没有任何反应!
我把前面DCL部分用文本另存为dcl文件,设置了支持文件搜索路径,也没有反应或者提示缺函数等等,是哪里没有做对呢!
请楼主再指点一下!
发表于 2018-2-3 19:55 | 显示全部楼层
我早就有这种了,很实用。建议不要用对话框,对话框没效率。
发表于 2018-2-5 12:14 | 显示全部楼层
ruirui999 发表于 2018-2-3 19:55
我早就有这种了,很实用。建议不要用对话框,对话框没效率。

这样的好东西,能不能分享一下!
 楼主| 发表于 2018-2-5 13:42 | 显示全部楼层
先选择一组要复制的图元
再选择一个参照块
最后选择一组与参照同名的块
第1组图元以块心为基点进行复制

这是这个程序的功能
缩放镜像什么的
是可以扩展出来的功能

为什么设对话框已经说过了

对话框的名称 = ~~~adds.dcl
发表于 2018-2-5 14:10 | 显示全部楼层
masterlong 发表于 2018-2-5 13:42
先选择一组要复制的图元
再选择一个参照块
最后选择一组与参照同名的块

成了,就是DCL文件命名的问题!谢谢楼主,后面看什么样的高频场景可以看这个功能用进去,甚至扩展!
 楼主| 发表于 2018-2-5 14:30 | 显示全部楼层
作为电气专业
这样的场景是相当多的
水、暖提资的消火栓、泵、风机啥的
我都习惯进行替换

当然不替换也不是不可以
但是不利于后面绘图过程中的图层控制
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 05:05 , Processed in 0.272586 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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