明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
123
返回列表 发新帖
楼主: liuhe

[经验] ET工具 超级修剪 extrim 汉化注解

[复制链接]
发表于 2023-11-4 10:42:57 | 显示全部楼层
感谢楼主的分享
发表于 2024-9-26 01:13:09 | 显示全部楼层
很感谢,一直需要
发表于 2025-9-5 09:02:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2025-9-5 10:18:31 | 显示全部楼层

谢谢帖主分享经验!
回复 支持 反对

使用道具 举报

发表于 昨天 17:43 | 显示全部楼层
  1. ;;
  2. ;;;
  3. ;;;    EXTRIM.LSP
  4. ;;;    版权 ?1999 年 Autodesk, Inc.
  5. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  6. ;扩展修剪 - cookie-cutter 脚本
  7. ;
  8. ;选择多段线、直线、圆或弧和要修剪的一侧
  9. ;


  10. (VL-LOAD-COM)
  11. (DEFUN C:etrim() (C:extrim))
  12. (DEFUN C:tt() (C:extrim))
  13. (DEFUN C:qq() (C:extrim))
  14. (DEFUN C:qqq() (C:extrim))
  15. ;(PROMPT "QQQ\n")

  16. (PROMPT "\n超级修剪 extrim 或 etrim 、TT \n" )

  17. (defun c:extrim ( / na e1 p1 redraw_it lst n )

  18. (acet-error-init (list
  19.                    (list   "cmdecho" 0
  20.                          "highlight" 0
  21.                          "regenmode" 1;;;控制图形自动形成
  22.                             "osmode" 0;;;控制捕捉
  23.                            "ucsicon" 0;;;关于控制用户坐标系图标的显示
  24.                         "offsetdist" 0;;;设置默认的偏移距离。
  25.                             "attreq" 0;;;在插入块过程中控制 INSERT 是否使用默认属性设置。
  26.                           "plinewid" 0;;;存储默认的多段线宽度。
  27.                          "plinetype" 1;;;指定是否使用优化的二维多段线。
  28.                           "gridmode" 0;;;指定栅格处于打开状态还是关闭状态。
  29.                            "celtype" "CONTINUOUS";;;;设置新对象的线型。
  30.                          "ucsfollow" 0;;;;从一个 UCS 转换为另一个 UCS 时生成平面视图。
  31.                           "limcheck" 0;;;;控制是否可以在栅格界限外创建对象。
  32.                    )
  33.                    T     ;flag. True means use undo for error clean up.
  34.                    '(if redraw_it (redraw na 4))
  35.                   );list
  36. );acet-error-init
  37. ;;; acet-error-init 函数属于 ET 工具箱自定义函数,在此是为了对各种环境变量赋值,赋值能够让程序更加稳定的运行

  38. (princ "\n请选择 POLYLINE, LINE, CIRCLE, ARC, ELLIPSE, IMAGE 或 TEXT 作为切割边界...")
  39.   ;;;;提示选择边界
  40. (setq na (acet-ui-single-select '((-4 . "<OR")
  41.                            (0 . "CIRCLE")
  42.                            (0 . "ARC")
  43.                            (0 . "LINE")
  44.                            (0 . "ELLIPSE")
  45.                            (0 . "ATTDEF")
  46.                            (0 . "TEXT")
  47.                            (0 . "MTEXT")
  48.                            (0 . "IMAGE")
  49.                            (0 . "SPLINE")
  50.                            (0 . "INSERT")
  51.                            (0 . "SOLID")
  52.                            (0 . "3DFACE")
  53.                            (0 . "TRACE")
  54.                            (0 . "LWPOLYLINE")
  55.                            (-4 . "<AND")
  56.                             (0 . "POLYLINE")
  57.                             (-4 . "<NOT")
  58.                               (-4 . "&")
  59.                               (70 . 112)
  60.                             (-4 . "NOT>")
  61.                            (-4 . "AND>")
  62.                           (-4 . "OR>")
  63.                          )
  64.                          T
  65.          );acet-ui-single-select
  66. );setq
  67.   ;;;;acet-ui-single-select 函数属于 ET 工具箱函数,是 entsel 和 ssget 的类似结合体,在选择的时候,能够进行对选择的图形过滤。entsel 本身不带过滤,ssget 可以带过滤,所以为了结合两者有了 acet-ui-single-select 函数
  68.   ;;;;可以用 while 和 entsel 函数进行改造,选择实体要具有某种封闭的特征
  69.   ;;;;acet-ui-single-select 的返回值是一个图元名称,和 entsel 函数一样
  70. (if na
  71.     (progn
  72.      (setq e1 (entget na));;setq NA 是图元,E1 是图元 dxf 列表,此处跟我习惯很不大一样,
  73.      (if (or (equal "TEXT"   (cdr (assoc 0 e1)))
  74.              (equal "MTEXT"  (cdr (assoc 0 e1)))
  75.              (equal "ATTDEF" (cdr (assoc 0 e1)))
  76.              (equal "IMAGE"  (cdr (assoc 0 e1)))
  77.              (equal "INSERT" (cdr (assoc 0 e1)))
  78.              (equal "SOLID"  (cdr (assoc 0 e1)))
  79.              (equal "3DFACE" (cdr (assoc 0 e1)))
  80.              (equal "TRACE"  (cdr (assoc 0 e1)))
  81.          );or 对图元类型进行性判断,上述几种图元没有明显的界限,所以需要生成自己生成一个封闭的多线段作为裁剪的边界
  82.          (progn
  83.           (setq lst (acet-geom-object-point-list na nil))
  84.     ;;;;;acet-geom-object-point-list 是自定义函数,获取上述图元的包围盒,这个包围盒经过测试对于文字可以是最小包围盒,对于其他实体只是简单包围盒
  85.     ;;;;;类似于 vla-GetBoundingBox 函数
  86.     ;;;;;该函数返回了坐标点列表
  87.           (setq n 0)
  88.           (command "_.pline");;;;开始对上述图元画一个包围盒封闭曲线
  89.           (repeat (length lst)
  90.           (command (nth n lst))
  91.           (setq n (+ n 1));setq
  92.           );repeat
  93.           (if (not (equal (car lst) (last lst) 0.0000001))
  94.               (command "_cl")
  95.               (command "")
  96.           );if;;;;判断坐标 lst 收尾坐标是否同一个,如果不同,就生成封闭的曲线
  97.           (setq na (entlast)
  98.                 e1 na
  99.           );setq 读取新生成的图元,并且赋值给 E1,E1 此时成了图元而不是列表
  100.          );progn then draw a temp pline to be the cutting edge.
  101.          (setq e1 nil);;;;不是上述图元属性,就默认自带封闭包围和,E1 抛弃掉,后续只需要 NA 变量
  102.      );if
  103.      (redraw na 3);;;;亮显这个封闭曲线,亮显的目的是为了选择下面的点的方便
  104.      (setq redraw_it T)
  105.      ;;;;redraw_it 用来记录亮显的布尔值
  106.      (setq p1 (getpoint "\n请选择裁剪点的方向"));setq 可以是封闭曲线内外
  107.      (redraw na 4);;;;不亮显这个封闭曲线
  108.      (setq redraw_it nil)
  109.      (if p1 (etrim na p1));if 制订了了点,就开始进行裁剪
  110.      (if e1;;;;此时的 E1 是程序自己生成的包围盒,不是图元自带的,自带的 E1 已经为 nil
  111.        ;;;此处其实是利用包围盒,但又不是图元自带的,现需要把这个删掉,删掉之前,需要对图元图层解锁,否则有可能删不掉
  112.          (progn
  113.           (if (setq p1 (acet-layer-locked (getvar "clayer")))
  114.               (command "_.layer" "_un" (getvar "clayer") "");;;解锁图层
  115.           );if
  116.           (entdel e1)
  117.           (if p1
  118.               (command "_.layer" "_lock" (getvar "clayer") "")
  119.           );if
  120.          );progn then
  121.      );if
  122.     );progn
  123. );if

  124. (acet-error-restore)
  125.   ;;;;;恢复原来环境变量赋值,跟 acet-error-init 作为程序的初始化和结尾
  126. (princ)
  127. );defun c:extrim

  128. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  129. ;实体修剪功能
  130. ;takes: na - entity name
  131. ;  a - a point, the side to trim on
  132. ;注意:此功能不允许可能错过
  133. ;;;;      非连续线型。
  134. ;;;;实体修剪功能
  135. ;;;;takes:na-实体名称
  136. ;;;;a-a点,要修剪的一侧,上述的 P1
  137. ;;;;注意:此功能不允许可能错过
  138. ;;;;非连续线型。
  139. ;;;;
  140. (defun etrim ( na a / la b d e1 lst lst2 n j k m ss na2 na3 na4
  141.                       x y z flag flag2 flag3 zlst vpna vplocked
  142.              )
  143. (setq e1 (entget na));setq 获取 dxf 表
  144.   (SETQ A P1)
  145. (if (or (setq flag (equal (acet-dxf 0 e1) "POLYLINE"))
  146.         (setq flag (equal (acet-dxf 0 e1) "LWPOLYLINE"))
  147.         (equal (acet-dxf 0 e1) "LINE")
  148.         (equal (acet-dxf 0 e1) "CIRCLE")
  149.         (equal (acet-dxf 0 e1) "ARC")
  150.         (equal (acet-dxf 0 e1) "ELLIPSE")
  151.         (equal (acet-dxf 0 e1) "TEXT")
  152.         (equal (acet-dxf 0 e1) "ATTDEF")
  153.         (equal (acet-dxf 0 e1) "MTEXT")
  154.         (equal (acet-dxf 0 e1) "SPLINE")
  155.     );or 判断 图元的类型
  156.     (progn
  157.      (if (and flag ;;;;对于"POLYLINE" "LWPOLYLINE" 需要对 70 的 dxf 及封闭性进行判断,如果是 3d 多线段,flag 就是 nil
  158.               (equal 8 (logand 8 (acet-dxf 70 e1)))
  159.          );and
  160.          (setq flag nil)
  161.      );if
  162.      (setq     a (trans a 1 0);;;;;传递进来的 P1 有可能用户坐标系下,这里转换成世界坐标系坐标
  163.             vpna (acet-currentviewport-ename);;;获取是否是在视图中
  164.      );setq
  165.      (acet-ucs-cmd (list "_View"));;;;获取当前视图环境变量表 acet-error-init
  166.      ;;;;以下代码是获取这个图元的包围盒,并且根据这个包围盒获取左下角和右下角的坐标,
  167.      ;;;;由于这个 acet-geom-object-point-list 返回包围盒有可能是最小包围盒,所以需要对坐标点进行处理,完全可以用 vla-GetBoundingBox 获取
  168.      ;;;;获取两个点后,利用 zoom_2_object 进行进一步处理,这个处理视为防止是在布局中进行操作,返回 两的点用于视图处理更加准确
  169.      ;;;;视图缩放的目的是为了裁剪做准备,如果图元过小,是没办法裁剪的,猜测裁剪是和屏幕像素相关
  170.      (setq   lst (acet-geom-object-point-list na nil)  ;;;find extents of selected cutting edge object
  171.              lst (acet-geom-list-extents lst);;;;包围盒左下角  右上角
  172.                x (- (car (cadr lst)) (car (car lst)))
  173.                y (- (cadr (cadr lst)) (cadr (car lst)))
  174.                x (* 0.075 x)
  175.                y (* 0.075 y)
  176.                z (list x y)
  177.                x (list (+ (car (cadr lst)) (car z))
  178.                        (+ (cadr (cadr lst)) (cadr z))
  179.                  );list
  180.                y (list (- (car (car lst)) (car z))
  181.                        (- (cadr (car lst)) (cadr z))
  182.                 );list
  183.             zlst (zoom_2_object (list x y))
  184.      );setq
  185.      (if vpna
  186.          (setq vplocked (acet-viewport-lock-set vpna nil)) ;unlock cur viewport if needed.
  187.      );if 如果当前有很多视图,那就对当前视图进行解锁
  188.      (command "_.zoom" "_w" (car zlst) (cadr zlst))
  189.      ;;;;;对视图进行缩放
  190.      (entupd na)                  ;;;update the ent. so it's curves display smoothly
  191. ;;;;更新对象(图元)的屏幕显示
  192.      (setq lst (acet-geom-object-point-list na
  193.                        (/ (acet-geom-pixel-unit) 2.0)
  194.                )
  195.      );setq lst 是轮廓线
  196.      (if (or (not flag)
  197.              (not (acet-geom-self-intersect lst nil));;;检查自交
  198.          );or
  199.          (progn             ;then the object is valid and not a self intersecting polyline.;则该对象是有效的并且不是自相交折线。
  200.           (if (and flag
  201.                    (equal (car lst) (last lst) 0.0001)
  202.               );and
  203.               (setq flag3 T);then the polyline could potentialy need a second offset;则折线可能需要第二个偏移
  204.           );if
  205.           (if (setq la (acet-layer-locked (getvar "clayer")))
  206.               (command "_.layer" "_unl" (getvar "clayer") "")
  207.           );if 解锁图层
  208.           ;;;;重新生成一个轮廓线
  209.           (command-s "_.pline")
  210.           (setq b nil)
  211.           (setq n 0);setq
  212.           (repeat (length lst)
  213.            (setq d (nth n lst))
  214.            (if (not (equal d b 0.0001))
  215.               (progn
  216.                (command d)
  217.                (setq lst2 (append lst2 (list d)));setq
  218.                (setq b d);setq
  219.               );progn
  220.            );if
  221.            (setq n (+ n 1))
  222.           );repeat
  223.           (command-s "")
  224.           (setq  na2 (entlast)
  225.                   ss (ssadd)
  226.                   ss (ssadd na2 ss)
  227.                  lst nil
  228.           );setq
  229.           (acet-ss-visible ss 1);;;;把重新生成的轮廓线进行隐藏
  230.           (setq lst2 (get_fence_points na2 a lst2 flag3 flag));setq 获取选取图元的包围盒
  231.          
  232.           (if la
  233.               (command "_.layer" "_lock" (getvar "clayer") "")
  234.           );if
  235.           (acet-ucs-cmd (list "_p"))
  236.           ;Move the ents to force a display update of the ents to avoid viewres problems.
  237.           (setvar "highlight" 0)
  238.           (if (setq ss (ssget "_f" (last lst2)))
  239.               (command "_.move" ss "" "0,0,0" "0,0,0")
  240.           );if  把所有的图元全部移动
  241.           (if flag
  242.               (progn
  243.                (if (setq la (acet-layer-locked (acet-dxf 8 e1)))
  244.                    (command "_.layer" "_unl" (acet-dxf 8 e1) "")
  245.                );if
  246.                (acet-ucs-set-z (acet-dxf 210 e1));;;;Z轴归零
  247.                (command "_.copy" na "" "0,0,0" "0,0,0")
  248.                ;(entdel na)
  249.                (acet-ss-visible (ssadd na (ssadd)) 1);make it invisible for a while.
  250.                ;;;; 隐藏图元                                    ;rk 12:01 PM 3/10/98
  251.                (setq na3 na
  252.                       na (entlast)
  253.                );setq
  254.                (command "_.pedit" na "_w" "0.0" "_x");;;;对图形进行合并,猜测是直线组成的合成 pl 线
  255.                (acet-ucs-cmd (list "_p"))
  256.                (if la (command "_.layer" "_lock" (acet-dxf 8 e1) ""));if
  257.               );progn
  258.           );if
  259.           (command "_.trim" na "");;;;利用裁剪命令进行裁剪
  260.     ;;;根据 lst2 点表,分批次进行裁剪
  261.           (setq m (- (length lst2) 1));setq
  262.           (setq k 0)
  263.           (repeat (length lst2)
  264.            (setq lst (nth k lst2))
  265.            (setq a (trans (car lst) 0 1))
  266.            (setq n 1)
  267.            (repeat (- (length lst) 1) ;repeat each fence list
  268.             (setq b (trans (nth n lst) 0 1))
  269.             (if (equal a b 0.0001)
  270.                 (setq flag2 T)
  271.                 (setq flag2 nil)
  272.             );if
  273.             (setq na4 nil);setq
  274.             (setq j 0);setq
  275.             (while (not flag2)       ;repeat each segment of the fence until no new ents are created.
  276.              (setq na4 (entlast));setq
  277.              (command "_F" a b "")
  278.              (if (and (equal na4 (entlast))
  279.                       (or (not (equal k m))
  280.                           (> j 0)
  281.                       );or
  282.                  );and
  283.                  (setq flag2 T)
  284.              );if
  285.              (setq j (+ j 1));setq
  286.             );while
  287.             (setq a b);setq
  288.             (setq n (+ n 1));setq
  289.            );repeat

  290.            (setq k (+ k 1))
  291.           );repeat
  292.           (command "")
  293.           ;;;;裁剪完毕
  294.     ;;;;以下用于恢复图层锁定,环境变量,视口状态
  295.           (if flag
  296.               (progn
  297.                (if (setq la (acet-layer-locked (acet-dxf 8 e1)))
  298.                    (command "_.layer" "_unl" (acet-dxf 8 e1) "")
  299.                );if
  300.                (entdel na) ;get rid of the copy

  301.                ;(entdel na3);bring back the original
  302.                (acet-ss-visible (ssadd na3 (ssadd)) 0) ;bring back the original
  303.                                                       ;rk 12:01 PM 3/10/98
  304.                (if la (command "_.layer" "_lock" (acet-dxf 8 e1) ""));if
  305.               );progn
  306.           );if
  307.          );progn
  308.          (progn
  309.           (acet-ucs-cmd (list "_p"))
  310.           (princ "\n自相交的边缘是不可接受的。")
  311.          );progn else invalid self intersecting polyline
  312.      );if
  313.      (command "_.zoom" "_p")
  314.      (if vplocked
  315.          (acet-viewport-lock-set vpna T) ;then re-lock the viewport
  316.      );if
  317.     );progn then it's a most likely a valid entity.
  318. );if
  319. );defun etrim

  320. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  321. ;;;;主要是为了偏移一条新的轮廓,获取内外裁剪的点表
  322. (defun another_offset ( pl1 pl2 a1 a2 b na2 lst2 a lst3 lst4 / na ss lst da1 da2)

  323. (setq da1 (abs (- a2 a1)));setq
  324. (setq da2 (- (* b (max pl2 pl1))
  325.              (/ (* b (abs (- pl2 pl1)))
  326.                  2.0
  327.              )
  328.           )
  329. );setq
  330. (if (> (abs (- da2 da1))
  331.        (* 0.01 (max a1 a2))
  332.     )
  333.     (progn

  334.      (acet-pline-make (list lst2))
  335.      (setq  na (entlast)
  336.            na2 (entlast)
  337.             ss (ssadd)
  338.             ss (ssadd na ss)
  339.      );setq
  340.      (acet-ss-visible ss 1)
  341.      (command "_.offset" b na2 a "")
  342.      (if (and (not (equal na (entlast)))
  343.               (setq lst3 (acet-geom-vertex-list (entlast)))
  344.               (setq lst3 (intersect_check lst2 lst3 lst4))
  345.          );and
  346.          (progn
  347.           (acet-ss-visible (ssadd (entlast) (ssadd)) 1)
  348.           (command "_.area" "_ob" (entlast))
  349.           (setq pl2 (getvar "perimeter")
  350.                  a2 (getvar "area")
  351.           );setq
  352.           (setq lst (list (acet-geom-vertex-list (list (entlast) 0))));setq
  353.           (entdel (entlast));then offset was a success so delete the ent after getting it's info
  354.          );progn then
  355.          (if (not (equal na (entlast))) (entdel (entlast)));if else
  356.      );if
  357.      (entdel na2)
  358.     );progn then let's do that second offset
  359. );if

  360. lst
  361. );defun another_offset

  362. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  363. ;;;;
  364. (defun get_fence_points ( na2 a lst2 flag plflag / a1 a2 pl1 pl2 b c d n
  365.                                                    lst lst2 lst3 lst4 na
  366.                         )

  367. (if flag
  368.     (progn
  369.      (setq lst2 (cdr lst2));setq
  370.      (repeat (fix (/ (length lst2) 2))
  371.       (setq lst2 (append (cdr lst2) (list (car lst2)));append
  372.       );setq
  373.      );repeat
  374.      (setq lst2 (append lst2 (list (car lst2))));setq
  375.      (command "_.area" "_ob" na2)
  376.      (setq pl1 (getvar "perimeter")
  377.             a1 (getvar "area")
  378.      );setq
  379.     );progn
  380. );if

  381. (setq    a (trans a 0 1)
  382.          b (* (getvar "viewsize") 0.05);初始偏移距离
  383.          n 3.0                         ;偏移次数
  384.          d (/ b (- n 1))               ;偏移增量
  385.          c (acet-geom-pixel-unit)
  386.       lst4 (acet-geom-view-points)
  387. );setq

  388. (while (> b c)
  389. (setq na (entlast))
  390. (command "_.offset" b na2 a "")
  391. (if (and (not (equal na (entlast)))
  392.          (setq lst3 (acet-geom-vertex-list (entlast)))
  393.          (or (not plflag)
  394.              (setq lst3 (intersect_check lst2 lst3 lst4))
  395.          );or
  396.     );and
  397.     (progn
  398.      (setq lst3 (acet-geom-m-trans lst3 1 0))
  399.      (acet-ss-visible (ssadd (entlast) (ssadd)) 1)
  400.      (if flag
  401.          (progn
  402.           (command "_.area" "_ob" (entlast))
  403.           (setq pl2 (getvar "perimeter")
  404.                  a2 (getvar "area")
  405.           );setq
  406.          );progn
  407.      );if
  408.      (setq lst (append lst (list lst3)));setq
  409.      (entdel (entlast))  ;删除实体后获取顶点信息
  410.      (if flag
  411.          (setq lst (append lst
  412.                            (another_offset pl1 pl2 a1 a2 b na2 lst2 a lst3 lst4)
  413.                    );append
  414.          );setq
  415.      );if
  416.     );progn 则偏移成功
  417.     (if (not (equal na (entlast))) (entdel (entlast)));if else
  418. );if
  419. (setq b (- b d));setq
  420. );while
  421. (setq na (entlast))
  422. (command "_.offset" c na2 a "")
  423. (if (and (not (equal na (entlast)))
  424.          (setq lst3 (acet-geom-vertex-list (entlast)))
  425.          (or (not plflag)
  426.              (setq lst3 (intersect_check lst2 lst3 lst4))
  427.          );or
  428.     );and
  429.     (progn
  430.      (setq lst3 (acet-geom-m-trans lst3 1 0))
  431.      (acet-ss-visible (ssadd (entlast) (ssadd)) 1)
  432.      (if flag
  433.          (progn
  434.           (command "_.area" "_ob" (entlast))
  435.           (setq pl2 (getvar "perimeter")
  436.                  a2 (getvar "area")
  437.           );setq
  438.          );progn
  439.      );if
  440.      (setq lst (append lst (list lst3)));setq
  441.      (entdel (entlast));则偏移成功所以删除实体后获取其信息
  442.      (if flag
  443.          (setq lst (append lst
  444.                            (another_offset pl1 pl2 a1 a2 c na2 lst2 a lst3 lst4)
  445.                    );append
  446.          );setq
  447.      );if
  448.     );progn 则
  449.     (if (not (equal na (entlast))) (entdel (entlast)));if else
  450. );if
  451. (entdel na2)

  452. lst
  453. );defun get_fence_points

  454. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  455. ;如果第一个列表和第二个列表不包含相交的线段,则返回屏幕上的一组点。
  456. ;检查轮廓线自交
  457. (defun intersect_check ( lst lst2 lst3 / x x2 y y2 lst4 flag len len2
  458.                                          a aa b bb c d n j)

  459. (setq  len (length lst)
  460.       len2 (length lst2)
  461.          x (car (car lst3))
  462.         x2 (car (cadr lst3))
  463.          y (cadr (car lst3))
  464.         y2 (cadr (cadr lst3))
  465. );setq

  466. (setq n 0);setq
  467. (while (and (not flag)
  468.             (< (+ n 1) len2)
  469.        );and
  470. (setq   aa (nth n lst2)
  471.         bb (nth (+ n 1) lst2)
  472.          a (bns_truncate_2_view aa bb x y x2 y2)
  473.          b (bns_truncate_2_view bb aa x y x2 y2)
  474.       lst4 (append lst4 (list a))
  475. );setq
  476. (if (or (not (equal a aa))
  477.         (not (equal b bb))
  478.     );or
  479.     (setq lst4 (append lst4 (list b)))
  480. );if
  481. (setq j 0);setq
  482. (while (and (not flag)
  483.              (< (+ j 1) len)
  484.         );and
  485. (setq    c (nth j lst)
  486.           d (nth (+ j 1) lst)
  487.        flag (inters a b c d)
  488. );setq

  489. (setq j (+ j 1));setq
  490. );while

  491. (setq n (+ n 1));setq
  492. );while
  493. (if (not (equal b (last lst4)))
  494.     (setq lst4 (append lst4 (list b)));setq
  495. );if
  496. (if (not flag)
  497.     (setq flag lst4)
  498.     (setq flag nil)
  499. );if
  500. flag
  501. );defun intersect_check

  502. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  503. ;;;;获取视口的放大的两点,这两点的矩形要把裁剪的所有图元包括在内
  504. ;;;该函数考虑了布局被的情况
  505. (defun zoom_2_object ( lst / p1 p2 p3 p4 p5 p6 mp dx dy dx2 dy2
  506.                              r1 r2 na e1 x w h dv1 dv2 x
  507.                      )

  508. (setq  lst (acet-geom-m-trans lst 1 2)
  509.          p1 (acet-geom-m-trans (acet-geom-view-points) 1 2)    ;p1 和 p2 是视图点
  510.          p2 (cadr p1)
  511.          p1 (car p1)
  512.          p1 (list (car p1) (cadr p1))
  513.          p2 (list (car p2) (cadr p2))
  514. );setq
  515. (if lst
  516.      (progn
  517.       (setq   p5 (acet-geom-list-extents lst)              ;p5 和 p6 是几何点
  518.               p6 (cadr p5)
  519.               p5 (car p5)
  520.               p5 (list (car p5) (cadr p5))
  521.               p6 (list (car p6) (cadr p6))
  522.               mp (acet-geom-midpoint p5 p6)           ;准备调整几何矩形大小
  523.               dx (- (car p2) (car p1))    ;使其具有与 p1 p2 相同的 dy/dx 比例
  524.               dy (- (cadr p2) (cadr p1))
  525.              dx2 (- (car p6) (car p5))
  526.              dy2 (- (cadr p6) (cadr p5))
  527.       );setq
  528.       (if (equal dx 0.0)  (setq dx 0.000001))  ;以防除以零
  529.       (if (equal dx2 0.0) (setq dx2 0.000001))
  530.       (setq   r1 (/ dy dx)
  531.               r2 (/ dy2 dx2)
  532.       );setq
  533.       (if (< r2 r1)
  534.           (setq dy2 (* r1 dx2));则放大 dy2
  535.           (progn
  536.            (if (equal r1 0.0)  (setq r1 0.000001))  ;以防除以零
  537.            (setq dx2 (* dy2 (/ 1.0 r1)));否则放大 dx2
  538.           );progn
  539.       );if
  540.       (setq p5 (list (- (car mp) (/ dx2 1.98))   ;1.98 用于代替 2.0 以略微扩大
  541.                      (- (cadr mp) (/ dy2 1.98))  ;矩形
  542.                );list
  543.             p6 (list (+ (car mp) (/ dx2 1.98))
  544.                      (+ (cadr mp) (/ dy2 1.98))
  545.                );list
  546.       );setq
  547.      );progn 则 lst
  548. );if
  549. (if (and lst
  550.           (equal 0 (getvar "tilemode"))
  551.           (not (equal 1 (getvar "cvport")))
  552.           (setq na (acet-currentviewport-ename))
  553.      );and
  554.      (progn
  555.       (setq  e1 (entget na)
  556.               x (cdr (assoc 10 e1))
  557.               w (cdr (assoc 40 e1))
  558.               h (cdr (assoc 41 e1))
  559.              p3 (list (- (car x) (/ w 2.0))
  560.                       (- (cadr x) (/ h 2.0))
  561.                 );list
  562.              p4 (list (+ (car x) (/ w 2.0))
  563.                       (+ (cadr x) (/ h 2.0))
  564.                 );list
  565.              p3 (trans p3 3 2)      ;p3 和 p4 是视口点
  566.              p4 (trans p4 3 2)
  567.             dv1 (acet-geom-delta-vector p1 p3)
  568.             dv2 (acet-geom-delta-vector p2 p4)
  569.               x (distance p1 p2)
  570.       );setq
  571.       (if (equal 0 x) (setq x 0.000001));以防
  572.       (setq   x (/ (distance p5 p6)
  573.                    x
  574.                 )
  575.             dv1 (acet-geom-vector-scale dv1 x)
  576.             dv2 (acet-geom-vector-scale dv2 x)
  577.              p5 (acet-geom-vector-add p5 dv1)
  578.              p6 (acet-geom-vector-add p6 dv2)
  579.        );setq
  580.      );progn 则
  581. );if
  582. (setq p1 (list (car p1) (cadr p1) 0.0)
  583.        p2 (list (car p2) (cadr p2) 0.0)
  584.        p5 (list (car p5) (cadr p5) 0.0)
  585.        p6 (list (car p6) (cadr p6) 0.0)
  586. );setq
  587. (if lst
  588.      (setq lst (list (trans p5 2 1)
  589.                      (trans p6 2 1)
  590.                );list
  591.      );setq
  592.      (setq lst nil)
  593. );if

  594. lst
  595. );defun zoom_2_object


  596. (princ)
  597. ;;;
  598. ;;;






回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-8 21:26 , Processed in 0.159103 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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