明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 877|回复: 3

记录学习成果 : 指定图层批量偏移到当前图层

[复制链接]
发表于 2024-2-7 11:26:36 | 显示全部楼层 |阅读模式
  1. (vl-load-com)
  2. (defun c:oo (/ oo_ss ss_length temp_i ss_i_ename ename_list p1 p3 p3_nth ss_i_object oo_py_fs_str oo_py_dict_d ename_type)
  3.   (setvar "cmdecho" 0)
  4.   (command "._undo" "_begin")
  5.   

  6.   (and (not oo_py_fs_str_s) (setq oo_py_fs_str_s "n"))
  7.   (setq oo_py_fs_str (getstring (strcat "\nn/w:<" oo_py_fs_str_s ">\n")))
  8.   
  9.   (if (= oo_py_fs_str "")
  10.     (setq oo_py_fs_str oo_py_fs_str_s)
  11.     (setq oo_py_fs_str_s oo_py_fs_str)
  12.   )
  13.   
  14.   (if (not oo_py_dict)
  15.     (setq oo_py_dict 0))
  16.   
  17.   (setq oo_py_dict_s (rtos oo_py_dict 2 4))
  18.   
  19.   (setq oo_py_dict_d (getreal (strcat "\n偏移距离:<" oo_py_dict_s ">\n")))
  20.   (setq oo_ss_layer_str (cdr (assoc 8 (entget (car (entsel "\n获取图型所在图层:\n"))))))
  21.   
  22.   ;创建选择集oo_ss,设置图层过滤器()
  23.   (setq oo_ss (ssget (list (cons 8 oo_ss_layer_str))))

  24.   ;or 判断是否需要输入偏移距离,输入则切换,无输入则保持
  25.   ; (or
  26.   ;   (oo_py_dict)
  27.   ;   (setq oo_py_dict(getreal ))
  28.   ; )

  29.   
  30.   (if (and (/= oo_py_dict_d "") (/= oo_py_dict_d "0") (/= oo_py_dict_d 0) (/= oo_py_dict_d nil))
  31.     (setq oo_py_dict oo_py_dict_d)
  32.   )
  33.   
  34.   (setq ss_length (sslength oo_ss))
  35.   (setq temp_i 0)
  36.   
  37.   ;偏移后置为当前图层
  38.   (command "offset" "l" "c" "" "")


  39.   ;将选择集遍历赋值给ss_i_ename (ename) 取出单个图元
  40.   (repeat ss_length
  41.     (setq ss_i_ename (ssname oo_ss temp_i))

  42.     ;对每个ename需要操作的内容,取出list,用于提取数据
  43.     (setq ename_list (entget ss_i_ename))
  44.     (setq ename_type (assoc 0 ename_list))

  45.    

  46.     ;如果是圆形(圆心y+半径)
  47.     (if (equal ename_type (cons 0 "CIRCLE"))
  48.       (progn
  49.         (if (or (= oo_py_fs_str "n") (= oo_py_fs_str "N"))
  50.           (setq oo_py_fs_center_point (cdr (assoc 10 ename_list))))
  51.          
  52.         (if (or (= oo_py_fs_str "w") (= oo_py_fs_str "W"))
  53.           (setq oo_py_fs_center_point (list (car (cdr (assoc 10 ename_list))) (+ (* 2 (cdr (assoc 40 ename_list))) (cadr (cdr (assoc 10 ename_list)))))))

  54.         (command "offset" oo_py_dict ss_i_ename "_non" oo_py_fs_center_point "")
  55.       )
  56.     )

  57.    

  58.     ;如果是矩形(矩形中心点,y轴半高)
  59.     (if (equal ename_type (cons 0 "LWPOLYLINE"))
  60.       (progn
  61.    
  62.         ;p1&p3赋值
  63.         ;object转换
  64.         (setq ss_i_object (vlax-ename->vla-object ss_i_ename))
  65.         (setq pl_point_i 0);;计数器赋初值
  66.         
  67.         ;p1/p3初始化
  68.         (setq pl_i_point (vlax-curve-getpointatparam ss_i_object 0))
  69.         (setq p1 pl_i_point)
  70.         (setq p3 pl_i_point)

  71.         
  72.         (while
  73.           (setq pl_i_point (vlax-curve-getpointatparam ss_i_object (setq pl_point_i (1+ pl_point_i))));;沿曲线返回指定参数值处的点 。
  74.          

  75.          
  76.           ;最小xy的点=p1
  77.           (and         
  78.             (<= (car pl_i_point) (car p1))
  79.             (<= (cadr pl_i_point) (cadr p1))
  80.             (setq p1 (list (setq p1x (car pl_i_point)) (setq p1y (cadr pl_i_point))))
  81.           )
  82.             ;最大xy的点=p3
  83.           (and         
  84.             (>= (car pl_i_point) (car p3))
  85.             (>= (cadr pl_i_point) (cadr p3))
  86.             (setq p3 (list (setq p3x (car pl_i_point)) (setq p3y (cadr pl_i_point))))
  87.           )         
  88.         )
  89.                

  90.         ;矩形中心点
  91.         ;矩形半高 (/ (- p1y p3y) 2)

  92.         
  93.             (if (or (= oo_py_fs_str "n") (= oo_py_fs_str "N"))
  94.               (setq oo_py_fs_center_point
  95.                      (list
  96.                        (+ p3x (* -1 (/ (- p3x p1x) 2)))
  97.                        (+ p3y (* -1 (/ (- p3y p1y) 2)))))
  98.             )
  99.             
  100.             (if (or (= oo_py_fs_str "w") (= oo_py_fs_str "W"))
  101.                 (setq oo_py_fs_center_point (list (+ p3x (* (- p3x p1x) 2)) (+ p3y (* (- p3y p1y) 2))))
  102.                 ;(PRINC (list "\NW里面的偏移点:" oo_py_fs_center_point "\N点表:" (CONS (+ p3x (* (- p3x p1x) 2)) (+ p3y (* (- p3y p1y) 2))) "\n点表里面的参数:" (+ p3x (* (- p3x p1x) 2)) (+ p3y (* (- p3y p1y) 2))))     
  103.             )
  104.             
  105.        ; (PRINC (LIST "\np1:" p1 "\np2:" p3 "\n偏移方式:" oo_py_fs_str "\n目标点:" oo_py_fs_center_point))
  106.             (command-s "offset" oo_py_dict ss_i_ename "_non" oo_py_fs_center_point "")
  107.             
  108.          
  109.          
  110.       )
  111. (princ)      
  112.     )
  113.     ;矩形判断-结束

  114.     ;(subst (cons 8 (getvar "clayer")) (assoc 8 (entget (entlast))) (entget (entlast)))
  115.     (setq temp_i (+ 1 temp_i))
  116.   )
  117.   
  118.   ;清除选择集
  119.   (setq oo_ss nil)
  120.   (command "._undo" "_end")
  121.   (setvar "cmdecho" 1)
  122.   (princ)
  123. )


发表于 2024-2-7 11:58:14 | 显示全部楼层
这命名方式,不像是手打的
 楼主| 发表于 2024-2-7 12:41:21 来自手机 | 显示全部楼层
liuhe 发表于 2024-2-7 11:58
这命名方式,不像是手打的

写长点自己认得,太简化了自己记不清他是干嘛用的
发表于 2024-2-16 20:39:33 | 显示全部楼层
学习了,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 05:32 , Processed in 0.153680 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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