ynhh 发表于 2025-9-6 20:54:55

如何选择圆后自动删除与圆相交的水平线

如何选择圆后,自动删除与圆相交的水平线
相交的非水平线和不相交的线均不删除
谢谢





czb203 发表于 2025-9-7 09:28:25

(defun c:delhoriz (/ ent cir obj circle-data line-obj line-data pt1 pt2
                        min-x max-x min-y max-y line-y
                        circle-center circle-radius dist)
; 设置系统变量
(setvar "osmode" 0)
(setvar "cmdecho" 0)

; 提示用户选择一个圆
(princ "\n请选择一个圆: ")
(setq ent (entsel)
      cir (car ent)
      obj (vlax-ename->vla-object cir))

; 检查选择的是否为圆
(if (/= (vla-get-objectname obj) "AcDbCircle")
      (progn
      (princ "\n选择的不是圆!")
      (exit)
      )
)

; 获取圆的参数
(setq circle-center (vla-get-center obj)
      circle-radius (vla-get-radius obj))

; 提示操作信息
(princ "\n正在处理与圆相交的水平线...")

; 遍历所有直线
(setq line-obj (vla-get-activedocument (vlax-get-acad-object))
      line-obj (vla-get-modelspace line-obj)
      line-obj (vla-item line-obj 0))

(vlax-for line-obj (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
    ; 检查是否为直线
    (if (= (vla-get-objectname line-obj) "AcDbLine")
      (progn
          ; 获取直线的两个端点
          (setq pt1 (vla-get-startpoint line-obj)
                pt2 (vla-get-endpoint line-obj))
         
          ; 检查是否为水平线 (Y坐标相等)
          (if (< (abs (- (vla-get-y pt1) (vla-get-y pt2))) 1e-6)
            (progn
                ; 水平线的Y坐标
                (setq line-y (vla-get-y pt1))
               
                ; 计算直线的X范围
                (setq min-x (min (vla-get-x pt1) (vla-get-x pt2))
                      max-x (max (vla-get-x pt1) (vla-get-x pt2)))
               
                ; 计算圆心到水平线的垂直距离
                (setq dist (abs (- line-y (vla-get-y circle-center))))
               
                ; 检查距离是否小于等于圆半径 (可能相交)
                (if (<= dist circle-radius)
                  (progn
                      ; 计算圆与水平线交点的X坐标
                      (setq x-intercept (sqrt (- (* circle-radius circle-radius) (* dist dist))))
                     
                      ; 检查交点是否在直线段上
                      (if (or (and (>= (+ (vla-get-x circle-center) x-intercept) min-x)
                                 (<= (+ (vla-get-x circle-center) x-intercept) max-x))
                              (and (>= (- (vla-get-x circle-center) x-intercept) min-x)
                                 (<= (- (vla-get-x circle-center) x-intercept) max-x)))
                        (progn
                            ; 删除相交的水平线
                            (vla-delete line-obj)
                            (princ "\n已删除一条相交的水平线")
                        )
                      )
                  )
            )
          )
      )
    )
)

; 恢复系统变量
(setvar "cmdecho" 1)
(princ "\n操作完成!")
(princ)
)

ynhh 发表于 2025-9-7 10:57:48

czb203 发表于 2025-9-7 09:28


谢谢您的指导
下载来试说是程序有问题
我试着加了一个括号 )
但测试时提示
正在处理与圆相交的水平线...
Error: no function definition: VLA-GET-Y
好象是差函数
请您再看看
谢谢

llsheng_73 发表于 2025-9-7 15:00:29

本帖最后由 llsheng_73 于 2025-9-7 15:05 编辑

(vl-load-com)
(defun tt(p0 r p1 p2 / a b c d)
(setq a(*(distance p1 p2)(distance p1 p2))
        b(*(apply'+(mapcar '*(mapcar'- p2 p1)(mapcar'- p1 p0)))2)
        c(-(*(distance p1 p0)(distance p1 p0))(* r r)))
(or(MINUSP(setq d(-(* b b)(* 4 a c))))
   (vl-every(function(lambda(x)(or(MINUSP x)(< 1 x))))
              (list(/(-(sqrt d) b)a 2)(/(+(sqrt d) b)a -2)))))
(defun c:tt(/ s obj p0 r a b)
(if(or(PROMPT"\n\r请选择一个圆: ")
        (setq s(ssget":E:S"'((0 . "circle")))))
    (progn
      (vlax-invoke-method(vlax-ename->vla-object(setq obj(ssname s 0)))'GetBoundingBox 'a 'b)
      (setq obj(entget obj)
          p0(cdr(assoc 10 obj))
          r(cdr(assoc 40 obj))
          s(ssget"C"(vlax-safearray->list a)(vlax-safearray->list b)'((0 . "line"))))
      (vl-every(function(lambda(x / a b)
                          (if(=(type(setq x(cadr x)))'ename)
                          (progn(setq a(mapcar'+(vlax-curve-getstartpoint x)'(0 0))
                                        b(vlax-curve-getendpoint x))
                              (if(equal(cadr a)(cadr b)1e-8)
                                (or(tt p0 r a b)(entdel x)))))
                          t))
             (ssnamex s))
      )
    )
)

ynhh 发表于 2025-9-7 17:20:32

llsheng_73 发表于 2025-9-7 15:00


谢谢 73 大师的热心指导
程序很好,瞬间完成任务
大师高风亮节,技术顶尖
衷心感谢

pxt2001 发表于 2025-9-8 19:13:19

ynhh 发表于 2025-9-7 17:20
谢谢 73 大师的热心指导
程序很好,瞬间完成任务
大师高风亮节,技术顶尖


感谢不能光口头上,要给明经币
页: [1]
查看完整版本: 如何选择圆后自动删除与圆相交的水平线