找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 136|回复: 0

获取在某个角度下或者UCS下的物体BOX

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-6-21 07:30:55 | 显示全部楼层 |阅读模式
  1. ;|*************************************************************;
  2. 软件作者: Highflybird                                          ;
  3. 软件用途: 获取在某个角度下或者UCS下的物体BOX           ;
  4. 日期地点: 2021.08.30 深圳                                      ;
  5. 修改日期: 2024.06.20 深圳                                      ;
  6. 程序语言: AutoLISP,Visual LISP                                 ;
  7. 版本号:   Ver. 1.0.24.0620                                     ;
  8. ===============================================================;
  9. ================================================================
  10. 本软件为开源软件: 以下是开源申明:                              
  11. ----------------------------------------------------------------
  12. 本页面的软件遵照 GPL协议开放源代码,您可以自由传播和修改,在遵照
  13. 下面的约束条件的前提下:                                         
  14.                                                                
  15. 一. 只要你在本开源软件的每一副本上明显和恰当地出版版权声明,保持
  16.     此许可证的声明和没有担保的声明完整无损,并和程序一起给每个其
  17.     他的程序接受者一份许可证的副本,你就可用任何媒体复制和发布你
  18.     收到的原始程序的源代码。你也可以为转让副本的实际行动收取一定
  19.     费用,但必须事先得到的同意。                                
  20. 二. 你可以修改本开源软件的一个或几个副本或程序的任何部分,以此形
  21.     成基于程序的作品。只要你同时满足下面的所有条件,你就可以按前
  22.     面第一款的要求复制和发布这一经过修改的程序或作品。         
  23.   1.你必须在修改的文件中附有明确说明:你修改了这一文件及具体的修
  24.     改日期。                                                   
  25.   2.你必须使你发布或出版的作品(它包含程序的全部或一部分,或包含
  26.     由程序的全部或部分衍生的作品)允许第三方作为整体按许可证条款
  27.     免费使用。                                                  
  28.   3.如果修改的程序在运行时以交互方式读取命令,你必须使它在开始进
  29.     入常规的交互使用方式时打印或显示声明: 包括适当的版权声明和没
  30.     有担保的声明(或者你提供担保的声明);用户可以按此许可证条款
  31.     重新发布程序的说明;并告诉用户如何看到这一许可证的副本。(例
  32.     外的情况: 如果原始程序以交互方式工作,它并不打印这样的声明,
  33.     你的基于程序的作品也就不用打印声明。                        
  34. 三. 只要你遵循一、二条款规定,您就可以自由使用并传播本源代码,但
  35.     必须原封不动地保留原作者信息。                              
  36. ================================================================
  37. **************************************************************|;
  38. (defun c:ttt(/ ent i sel pts ang box rec)
  39.   (setq ang (angle '(0 0 0) (getvar "ucsxdir")))                ;此处角度可以改为你自己需要的角度
  40.   (setq Pts nil)
  41.   (if (setq sel (ssget '((0 . "*LINE,ARC,ELLIPSE,CIRCLE,TEXT,POINT,ATTDEF,INSERT"))))
  42.     (progn
  43.       (vla-StartUndoMark (LM:acdoc))
  44.       (repeat (setq i (sslength sel))
  45.         (setq rec nil)
  46.         (setq ent (ssname sel (setq i (1- i))))
  47.         (setq rec (Ent:BoxByAngle ent ang 'pts))
  48.         (setq rec (GEO:GetBoxBySet rec ang))                        ;仅仅为测试用.
  49.         (Ent:Make采用LWPoly rec T)                                        ;仅仅为测试用.
  50.       )
  51.       (setq box (GEO:GetBoxBySet pts ang))
  52.       (Ent:Make采用LWPoly box T)
  53.       (vla-EndUndoMark (LM:acdoc))
  54.     )
  55.   )
  56.   (princ)
  57. )
  58. ;;;-------------------------------------------------------------
  59. ;;; 功能: 沿某一个方向的物体的包围盒点                          
  60. ;;; 输入: ent--实体图元名                                       
  61. ;;;       ang--方向与X轴夹角                                    
  62. ;;;       Points--可被修改参数                                 
  63. ;;; 输出: 包围盒点                                             
  64. ;;;-------------------------------------------------------------
  65. (defun Ent:BoxByAngle (ent ang Points / dxf name p1 p2 lst B M R REC Y Z)
  66.   (setq dxf (entget ent))
  67.   (setq name (cdr (assoc 0 dxf)))
  68.   (cond
  69.     ( (= name "LINE")
  70.       (setq p1 (vlax-curve-getstartpoint ent))
  71.       (setq p2 (vlax-curve-getendpoint ent))
  72.       (set Points (cons p1 (vl-symbol-value Points)))
  73.       (set Points (cons p2 (vl-symbol-value Points)))
  74.       (GEO:GetBoxBySet (list p1 p2) ang)
  75.     )
  76.     ( (or
  77.         (= name "LWPOLYLINE")
  78.         (= name "POLYLINE")
  79.         (= name "SPLINE")
  80.         (= name "ARC")
  81.         (= name "CIRCLE")
  82.         (= name "ELLIPSE")
  83.       )
  84.       (Ent:BoxOfCurve ent ang Points)
  85.     )
  86.     ( (or (= name "TEXT") (= name "ATTDEF"))
  87.       (setq lst (Ent:TextBox ent))
  88.       (foreach n lst
  89.         (set Points (cons n (vl-symbol-value Points)))
  90.       )
  91.       lst
  92.     )
  93.     ( (= name "INSERT")
  94.       (setq r (cdr (assoc 50 dxf)))
  95.       (setq m (MAT:RefGeom ent))
  96.       (setq b (tblobjname "BLOCK" (cdr (assoc 2 dxf))))
  97.       (setq y nil)
  98.       (setq z nil)
  99.       (while (setq b (entnext b))
  100.         (setq rec (Ent:BoxByAngle b (- ang r) 'z))
  101.         (if rec
  102.           (progn
  103.             (setq rec (GEO:GetBoxBySet rec (- ang r)))
  104.             ;(setq rec (GEO:RotatePoints rec r))
  105.             (setq rec (mat:transpoints rec m))
  106.             ;(Ent:Make采用LWPoly rec T)
  107.             (foreach n rec
  108.               (setq y (cons n y))
  109.             )
  110.           )
  111.         )
  112.       )
  113.       (foreach x y
  114.         (set points (cons x (vl-symbol-value points)))
  115.       )
  116.       y
  117.     )
  118.     ( (= name "POINT")
  119.       (setq p1 (cdr (assoc 10 dxf)))
  120.       (set Points (cons p1 (vl-symbol-value Points)))
  121.       (list p1)
  122.     )
  123.   )
  124. )
  125. ;;;-------------------------------------------------------------
  126. ;;; 功能: 沿某一个方向的曲线类物体的包围盒点                    
  127. ;;; 输入: ent--实体图元名                                       
  128. ;;;       ang--方向与X轴夹角                                    
  129. ;;; 输出: 包围盒点                                             
  130. ;;;-------------------------------------------------------------
  131. (defun Ent:BoxOfCurve (ent ang Points / ll ur R90 cen LEN P Vx Vy lst)
  132.   (vla-GetBoundingBox (vlax-ename->vla-object ent) 'll 'ur)
  133.   (setq ll  (vlax-safearray->list ll))
  134.   (setq ur  (vlax-safearray->list ur))
  135.   (setq R90 (* 0.5 pi))
  136.   (setq cen (GEO:Midpoint ll ur))
  137.   (setq len (distance ll ur))
  138.   (setq Vx  (list (cos ang) (sin ang) 0))
  139.   (setq Vy  (list (- (sin ang)) (cos ang) 0))
  140.   (foreach n (list 0 R90 PI (+ R90 pi))
  141.     (setq p (polar cen (+ ang n) len))
  142.     (if (zerop (rem n pi))
  143.       (setq p (vlax-curve-getClosestPointToProjection ent p Vy))
  144.       (setq p (vlax-curve-getClosestPointToProjection ent p Vx))
  145.     )
  146.     (set Points (cons p (VL-SYMBOL-VALUE Points)))
  147.     (setq lst (cons p lst))
  148.   )
  149. )
  150. ;;;-------------------------------------------------------------
  151. ;;; 不考虑倾角的text的四个角点                                 
  152. ;;;-------------------------------------------------------------
  153. (defun Ent:TextBox (ent / dxf rec ins rot pt1 pt2 pt3 pt4)
  154.   (setq dxf (entget ent))                                        ;;从选取的文本对象的获取一些属性
  155.   (setq rec (textbox dxf))                                        ;文本的包围矩形
  156.   (setq ins (cdr (assoc 10 dxf)))                               ;插入点
  157.   (setq rot (cdr (assoc 50 dxf)))                               ;旋转角
  158.   (setq pt1 (car rec))
  159.   (setq pt2 (cadr rec))
  160.   (setq pt3 (list (car pt2) (cadr pt1)))
  161.   (setq pt4 (list (car pt1) (cadr pt2)))
  162.   (if (not (equal rot 0 1e-6))                                  ;如果有旋转角
  163.     (setq pt1 (GEO:RotByAngle pt1 rot)
  164.           pt2 (GEO:RotByAngle pt2 rot)
  165.           pt3 (GEO:RotByAngle pt3 rot)
  166.           pt4 (GEO:RotByAngle pt4 rot)
  167.     )
  168.   )
  169.   (list
  170.     (mapcar '+ pt1 ins)
  171.     (mapcar '+ pt3 ins)
  172.     (mapcar '+ pt2 ins)
  173.     (mapcar '+ pt4 ins)
  174.   )
  175. )
  176. ;;;-------------------------------------------------------------
  177. ;;; 考虑倾角的text的四个角点                                    
  178. ;;;-------------------------------------------------------------
  179. (defun Ent:TextBox1 (ent / DXF INS ISX LEN OBL PT1 PT2 PT3 PT4 REC ROT)
  180.   (setq dxf (entget ent))                                        ;;从选取的文本对象的获取一些属性
  181.   (setq rec (textbox dxf))                                        ;文本的包围矩形
  182.   (setq ins (cdr (assoc 10 dxf)))                               ;插入点
  183.   (setq rot (cdr (assoc 50 dxf)))                               ;旋转角
  184.   (setq obl (cdr (assoc 51 dxf)))                               ;倾斜角
  185.   (setq isX (cdr (assoc 71 dxf)))
  186.   (setq pt1 (car rec))
  187.   (setq pt2 (cadr rec))
  188.   (if (or (= isX 2) (= isX 4))
  189.     (setq obl (+ (* pi 0.5) obl)
  190.           pt1 (list (car pt1) (cadr pt2) (caddr pt1))
  191.           pt2 (list (car pt2) (cadar rec) (caddr pt2))   
  192.     )
  193.     (setq obl (- (* pi 0.5) obl))
  194.   )  
  195.   (setq len (distance pt1 pt2))
  196.   (setq pt3 (inters Pt1 (polar pt1 0 len) pt2 (polar pt2 obl len) nil))
  197.   (setq pt4 (inters Pt1 (polar pt1 obl len) pt2 (polar pt2 0 len) nil))
  198.   (if (not (equal rot 0 1e-6))
  199.     (setq pt1 (GEO:RotByAngle pt1 rot)
  200.           pt2 (GEO:RotByAngle pt2 rot)
  201.           pt3 (GEO:RotByAngle pt3 rot)
  202.           pt4 (GEO:RotByAngle pt4 rot)
  203.     )
  204.   )
  205.   (list
  206.     (mapcar '+ pt1 ins)
  207.     (mapcar '+ pt2 ins)
  208.     (mapcar '+ pt3 ins)
  209.     (mapcar '+ pt4 ins)
  210.   )
  211.   ;(ent:make采用line pt1 pt2)
  212.   ;(Ent:Make采用LWPoly (list pt1 pt3 pt2 pt4) T)
  213. )
  214. ;;;-------------------------------------------------------------
  215. ;;; 测试单行文本程序                                            
  216. ;;;-------------------------------------------------------------
  217. (defun c:tt (/ ent)
  218.   (if (setq ent (car (entsel "\n请选取单行文本: ")))
  219.     (Ent:Make采用LWPoly (Ent:TextBox ent) T)
  220.   )
  221. )
  222. ;;;-------------------------------------------------------------
  223. ;;; 功能: 沿某一个方向的点集的包围盒                           
  224. ;;; 输入: pts--点集                                             
  225. ;;;       ang--方向与X轴夹角                                    
  226. ;;; 输出: 包围盒点(WCS)                                         
  227. ;;;-------------------------------------------------------------
  228. (defun GEO:GetBoxBySet (pts ang / pMin pMax)
  229.   (setq pts (mapcar (function (lambda (p) (GEO:RotByAngle p (- ang)))) pts))
  230.   (setq pMin (apply 'mapcar (cons 'min pts)))
  231.   (setq pMax (apply 'mapcar (cons 'max pts)))
  232.   (mapcar
  233.     (function (lambda (p) (GEO:RotByAngle p ang)))
  234.     (list
  235.       (list (car pMin) (cadr pMin))
  236.       (list (car pMax) (cadr pMin))
  237.       (list (car pMax) (cadr pMax))
  238.       (list (car pMin) (cadr pMax))
  239.     )
  240.   )
  241. )
  242. ;;;-------------------------------------------------------------
  243. ;;; 功能: 沿UCS方向的点集的包围盒                              
  244. ;;; 输入: pts--点集                                             
  245. ;;; 输出: 包围盒点(WCS)                                         
  246. ;;;-------------------------------------------------------------
  247. (defun GEO:GetBoxByUCS (pts / pMin pMax)
  248.   (setq pts (mapcar (function (lambda (p) (trans p 0 1))) pts))
  249.   (setq pMin (apply 'mapcar (cons 'min pts)))
  250.   (setq pMax (apply 'mapcar (cons 'max pts)))
  251.   (mapcar
  252.     (function (lambda (p) (trans p 1 0)))
  253.     (list
  254.       (list (car pMin) (cadr pMin))
  255.       (list (car pMax) (cadr pMin))
  256.       (list (car pMax) (cadr pMax))
  257.       (list (car pMin) (cadr pMax))
  258.     )
  259.   )
  260. )
  261. ;;;-------------------------------------------------------------
  262. ;;; 对一个点集施加矩阵变换                                      
  263. ;;;-------------------------------------------------------------
  264. (defun MAT:TransPoints (pts mat)
  265.   (mapcar
  266.     (function
  267.       (lambda (p)
  268.         (mapcar '+ (mat:mxv (car mat) p) (cadr mat))
  269.       )
  270.     )
  271.     pts
  272.   )
  273. )
  274. ;;;-------------------------------------------------------------
  275. ;;; 对一个点集施加旋转变换                                      
  276. ;;;-------------------------------------------------------------
  277. (defun GEO:RotatePoints (pts ang)
  278.   (mapcar (function (lambda (p) (GEO:RotByAngle p ang))) pts)
  279. )
  280. ;;;=============================================================
  281. ;;; 矩阵转置                                                   
  282. ;;; MAT:trp Transpose a matrix -Doug Wilson-                    
  283. ;;; 输入:矩阵                                                  
  284. ;;; 输出:转置后的矩阵                                          
  285. ;;;=============================================================
  286. (defun MAT:trp (m)
  287.   (apply 'mapcar (cons 'list m))
  288. )
  289. ;;;=============================================================
  290. ;;; 向量或点的矩阵变换(向量乘矩阵)                              
  291. ;;; Matrix x Vector - Vladimir Nesterovsky                     
  292. ;;; Args: m - nxn matrix, v - vector in R^n                     
  293. ;;;=============================================================
  294. (defun MAT:mxv (m v)
  295.   (mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m)
  296. )
  297. ;;;=============================================================
  298. ;;; 矩阵相乘                                                   
  299. ;;; MAT:mxm Multiply two matrices -Vladimir Nesterovsky-        
  300. ;;;=============================================================
  301. (defun MAT:mxm (m q)
  302.   (mapcar (function (lambda (r) (MAT:mxv (MAT:trp q) r))) m)
  303. )
  304. ;;;-------------------------------------------------------------
  305. ;;; 功能:图块的变换矩阵                                       
  306. ;;;-------------------------------------------------------------
  307. (defun MAT:RefGeom (ename / DXF ang nrm mat DISP sx sy sz sa ca)
  308.   (setq        DXF (entget ename)
  309.         ang (cdr (assoc 50 DXF))
  310.         nrm (cdr (assoc 210 DXF))
  311.         sx  (cdr (assoc 41 DXF))
  312.         sy  (cdr (assoc 42 DXF))
  313.         sz  (cdr (assoc 43 DXF))
  314.         sa  (sin ang)
  315.         ca  (cos ang)
  316.   )
  317.   (list
  318.     (setq mat (MAT:mxm
  319.                 (mapcar
  320.                   (function (lambda (v) (trans v 0 nrm T)))
  321.                   '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  322.                 )
  323.                 (list
  324.                   (list (* ca sx) (- (* sa sy)) 0.0)
  325.                   (list (* sa sx) (* ca sy) 0.0)
  326.                   (list 0 0 sz)
  327.                 )
  328.               )
  329.     )
  330.     (mapcar
  331.       '-
  332.       (trans (cdr (assoc 10 DXF)) nrm 0)
  333.       (MAT:mxv
  334.         mat
  335.         (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 DXF)))))
  336.       )
  337.     )
  338.   )
  339. )
  340. ;;;-------------------------------------------------------------
  341. ;;; 功能:图块的变换矩阵的逆矩阵,                              
  342. ;;; 输入:块参照的图元名,                                       
  343. ;;; 输出:块参照的变换矩阵的逆矩阵                              
  344. ;;;-------------------------------------------------------------
  345. (defun MAT:RevRefGeom (ename / dxf ang nrm mat disp)
  346.   (setq dxf (entget ename))
  347.   (setq ang (- (cdr (assoc 50 dxf))))
  348.   (setq nrm (cdr (assoc 210 dxf)))
  349.   (list
  350.     (setq mat (MAT:mxm
  351.                 (list (list (/ 1 (cdr (assoc 41 dxf))) 0.0 0.0)
  352.                       (list 0.0 (/ 1 (cdr (assoc 42 dxf))) 0.0)
  353.                       (list 0.0 0.0 (/ 1 (cdr (assoc 43 dxf))))
  354.                 )
  355.                 (MAT:mxm
  356.                   (list        (list (cos ang) (- (sin ang)) 0.0)
  357.                         (list (sin ang) (cos ang) 0.0)
  358.                         '(0.0 0.0 1.0)
  359.                   )
  360.                   (mapcar (function (lambda (v) (trans v nrm 0 T)))
  361.                           '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  362.                   )
  363.                 )
  364.               )
  365.     )
  366.     (mapcar
  367.       '-
  368.       (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 dxf)))))
  369.       (MAT:mxv mat (trans (cdr (assoc 10 dxf)) nrm 0))
  370.     )
  371.   )
  372. )
  373. ;;;-------------------------------------------------------------
  374. ;;; 功能: 两点之中点                                            
  375. ;;; 输入: 两点p1,P2                                             
  376. ;;; 输出: 中点位置                                             
  377. ;;;-------------------------------------------------------------
  378. (defun GEO:Midpoint (p1 p2)
  379.   (mapcar (function (lambda (e1 e2) (* (+ e1 e2) 0.5))) p1 p2)
  380. )
  381. ;;;-------------------------------------------------------------
  382. ;;; 功能: 位移点                                                
  383. ;;; 输入: 点P,位移量v                                          
  384. ;;; 输出: 位移后点位置                                          
  385. ;;;-------------------------------------------------------------
  386. (defun Geo:displacement (p v)
  387.   (mapcar '+ p v)
  388. )
  389. ;;;-------------------------------------------------------------
  390. ;;; 功能: 旋转点                                                
  391. ;;; 输入: 点P,角度ang                                          
  392. ;;; 输出: 中点位置                                             
  393. ;;;-------------------------------------------------------------
  394. (defun GEO:RotByAngle (p ang / C S)
  395.   (setq c (cos ang))
  396.   (setq s (sin ang))
  397.   (list
  398.     (- (* C (car p)) (* S (cadr p)))
  399.     (+ (* S (car p)) (* C (cadr p)))
  400.   )
  401. )
  402. ;;;-------------------------------------------------------------
  403. ;;;创建轻多段线                                                
  404. ;;;输入: 二维的点集                                            
  405. ;;;输出: 轻多段线实体名                                        
  406. ;;;-------------------------------------------------------------
  407. (defun Ent:Make采用LWPoly (pts closed /)
  408.   (entmakeX                                             
  409.     (VL-LIST*
  410.       '(0 . "LWPOLYLINE")
  411.       '(100 . "AcDbEntity")
  412.       '(100 . "AcDbPolyline")
  413.       (cons 90 (length pts))                                      ;顶点个数
  414.       (cons 70 (if closed 1 0))                                  ;闭合的
  415.       (mapcar (function (lambda (x) (cons 10 x))) pts)          ;多段线顶点
  416.     )
  417.   )
  418. )
  419. ;;;-------------------------------------------------------------
  420. ;;;创建一条直线段                                              
  421. ;;;输入: 两个三维或者二维的点                                  
  422. ;;;输出: 线段实体的图元名                                      
  423. ;;;-------------------------------------------------------------
  424. (defun Ent:Make采用Line (p q)
  425.   (entmakeX (list '(0 . "LINE") (cons 10 p) (cons 11 q)))
  426. )
  427. ;;;-------------------------------------------------------------
  428. ;;;创建矩形                                                         
  429. ;;;输入: 矩形的两个角点                                           
  430. ;;;输出: 矩形的实体名                                                  
  431. ;;;-------------------------------------------------------------
  432. (defun Ent:Make采用Rectangle (ll ur /)
  433.   (entmakeX
  434.     (list
  435.       '(0 . "LWPOLYLINE")
  436.       '(100 . "AcDbEntity")
  437.       '(100 . "AcDbPolyline")
  438.       '(90 . 4)
  439.       '(70 . 1)
  440.       (list 10 (car ll) (cadr ll))
  441.       (list 10 (car ur) (cadr ll))
  442.       (list 10 (car ur) (cadr ur))
  443.       (list 10 (car ll) (cadr ur))
  444.     )
  445.   )
  446. )
  447. ;;;-------------------------------------------------------------
  448. ;;; Active Document  -  Lee Mac                                 
  449. ;;; Returns the VLA Active Document Object                     
  450. ;;;-------------------------------------------------------------
  451. (defun LM:acdoc nil
  452.     (eval (list 'defun 'LM:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
  453.     (LM:acdoc)
  454. )
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 02:27 , Processed in 0.125470 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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