如何选择圆后,自动删除与圆相交的水平线
相交的非水平线和不相交的线均不删除
谢谢
网友答:
网友答:
谢谢您的指导
下载来试说是程序有问题
我试着加了一个括号 )
但测试时提示
正在处理与圆相交的水平线...
Error: no function definition: VLA-GET-Y
好象是差函数
请您再看看
谢谢网友答: 本帖最后由 llsheng_73 于 2025-9-7 15:05 编辑
网友答:
谢谢 73 大师的热心指导
程序很好,瞬间完成任务
大师高风亮节,技术顶尖
衷心感谢
网友答:
感谢不能光口头上,要给明经币
相交的非水平线和不相交的线均不删除
谢谢
网友答:

- (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)
- )
网友答:
czb203 发表于 2025-9-7 09:28
谢谢您的指导
下载来试说是程序有问题
我试着加了一个括号 )
但测试时提示
正在处理与圆相交的水平线...
Error: no function definition: VLA-GET-Y
好象是差函数
请您再看看
谢谢网友答: 本帖最后由 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))
- )
- )
- )
llsheng_73 发表于 2025-9-7 15:00
谢谢 73 大师的热心指导
程序很好,瞬间完成任务
大师高风亮节,技术顶尖
衷心感谢
网友答:
ynhh 发表于 2025-9-7 17:20
谢谢 73 大师的热心指导
程序很好,瞬间完成任务
大师高风亮节,技术顶尖
感谢不能光口头上,要给明经币