在相交处插入块
我想使用lisp在选定圆和多段线的交点上插入一个块。 简单的答案是Vla intersectwith,搜索或查找帮助这是一个非常容易使用的命令。有几个问题是圆是否两次穿过普林线。类似于这个例子(setvar "osmode" 512); nearest make sure on line
(setq pickobj (entsel "\nPick arc :"))
(setq obj1 (vlax-ename->vla-object (car pickobj)))
(setq pickobj1 (entsel "\nPick 1st line :"))
(setq obj2 (vlax-ename->vla-object (car pickobj1)))
(setq intpt1 (vlax-invoke obj2 'intersectWith obj1 acExtendThisEntity))
你能上传一个绘图样本吗? (定义C:INTLINES(/SS1 PT ptl oldos)
(提示“\n运行以演示GET\u ALL\u INTERS\u IN\u SS函数。”)
(setq SS1(ssget);(ssget“_X”);(get\u all\u lines\u as\u SS)
PTS(get\u all\u inters\u in\u ss SS1)
)
(setq ptl(长度PTS)PTS(deldup PTS));重复-不应该有
(如果(>ptl(长度PTS))(princ(strcat“\n”(itoa(-length PTS)ptl))“删除重复项”))
(vla startundomark(vla get activedocument(vlax get acad object)))
(setvar“CMDECHO”0)
(setq oldos(getvar“OSMODE”)(setvar“OSMODE”0)
(foreach PT PTS;;循环通过点列表
(命令“_POINT”PT));;创建点对象(也可以在此处使用插入、圆等)
(setvar“PDMODE”34);;显示点以便查看
(命令“_REGEN”)
(setvar“OSMODE”oldos)
(vla endundomark(vla get activedocument(vlax get acad object)))
(princ(strcat(itoa(长度PTS))“找到交点”)
(普林斯)
) 用这个
(vl load com)
;;-----------------------------------------------
;; CDNC5-02。LSP
;; 比尔·克莱默
;; (CAD Studio的修改和增强,http://www.cadstudio.cz , 2010-2014)
;;
;; ILSIMPLEMODE=T仅适用于单交叉点(大坐标问题)
;;
;; 在中查找对象之间的所有交点
;; 选择集SS。
;;
;; ---------------------------------------------- 开始清单1
;;
(defun get\u all\u inters\u in\u SS(SS/
SSL;不锈钢长度
PTS;返回列表
aObj1;对象1
aObj2;对象2
N1;回路计数器
N2;回路计数器
IPT;相交
C1 C2 C3
)
(定义iL->L(IPT/Pts);转换坐标列表->点列表
(while(>(长度iPts)0)
(setq Pts(cons)(列表(车载IPT))
(cadr IPT)
(caddr IPT)
Pts)
IPT(cdddr IPT)))
Pts
)
(默认iL2->L(IPT/Pts);转换坐标列表->点列表2D
(while(>(长度iPts)0)
(setq Pts(cons)(列表(车载IPT))
(cadr IPT)
'0.0)
Pts)
IPT(cddr IPT)))
Pts
)
(defun DelDup(长x宽);删除重复项
(当l
(setq x(汽车l)
l(vl删除x(cdr l))
r(cons x r)
)
)
(倒车档r)
)
(setq N1 0;外环索引
SSL(sslength SS))
; 外环,从第一个到第二个到最后一个
(虽然(
; 获取对象1,转换为VLA对象类型
(setq aObj1(ssname SS N1)
aObj1(vlax ename->vla对象aObj1)
N2(1+N1));内环索引
; 自相交:
(if(vlax-property-available-p aObj1’坐标)(progn;它是曲线吗?LWPOLY
(setq C1(iL2->L(vlax get aObj1’坐标)))
(setq C2(iL->L(vlax调用aObj1’与aObj1 0相交))
(setq C3(vl remove if’(λ(x)(成员x C1))C2))
;(打印C1)(打印C2)(打印C3)
(如果C3(foreach x C3(setq Pts(cons x Pts)));添加self
))
(if(=(vlax get aObj1’ObjectName)“AcDbSpline”)(progn;SPLINE
(setq C1(iL->L(vlax调用aObj1’与aObj1 0相交))
;(打印C1)
(如果C1(foreach x C1(setq Pts(cons x Pts)));添加self
))
; 内部循环,遍历其余对象
(虽然(
; 获取对象2,转换为VLA对象
(setq aObj2(ssname SS N2)
aObj2(vlax ename->vla对象aObj2)
; 查找对象的交点
IPT(vla与aObj1相交
aObj2 0)
; 变量结果
IPT(vlax变量值IPT))
; 变量数组有值?
(if(>(vlax-safearray-get-u-bound iPts 1)
0)
(progn;数组保存值,将其转换为
(setq IPT;到列表。
(vlax safearray->列出IPT)
;循环列表构造点
;(setq Pts(iL->L IPT));必须是全局的
;(if(>(length iPts)3)(PRINT iPts))---列出重复的交点-红色/绿色案例给出两个交点!
(while(>(长度iPts)0)
(setq Pts(cons)(列表(车载IPT))
(cadr IPT)
(caddr IPT)
Pts)
IPT(cdddr IPT))
(如果ILSIMPLEMODE(setq iPts nil));ILSIMPLEMODE-仅取第一个十字路口
)
))
(setq N2(1+N2));内环端
(setq N1(1+N1));外环端
Pts);返回找到的点列表
;;----------------------------------------------- 结束清单1
;;
;; 下载版本的剩余代码行,用于演示和测试清单1中的实用程序。
;;
;; 过程-创建具有相交线和多段线的图形。
;; 加载功能集
;; 运行命令函数INTLINES
;; 交点用当前图层上的点对象标记
;;
(定义C:INTLINES(/SS1 PT ptl oldos)
(提示“\n运行以演示GET\u ALL\u INTERS\u IN\u SS函数。”)
(setq SS1(ssget);(ssget“_X”);(get\u all\u lines\u as\u SS)
PTS(get\u all\u inters\u in\u ss SS1)
)
(setq ptl(长度PTS)PTS(deldup PTS));重复-不应该有
(如果(>ptl(长度PTS))(princ(strcat“\n”(itoa(-length PTS)ptl))“删除重复项”))
(vla startundomark(vla get activedocument(vlax get acad object)))
(setvar“CMDECHO”0)
(setq oldos(getvar“OSMODE”)(setvar“OSMODE”0)
(foreach PT PTS;;循环通过点列表
(命令“_POINT”PT));;创建点对象(也可以在此处使用插入、圆等)
(setvar“PDMODE”34);;显示点以便您可以看到它们
(命令“_REGEN”)
(setvar“OSMODE”oldos)
(vla endundomark(vla get activedocument(vlax get acad object)))
(princ(strcat(itoa(长度PTS))“找到交点”)
(普林斯)
)
;;
;;-----------------------------------------------
;;获取
;;绘制并作为选择集返回。
;;
(defun get\u all\u line\u as\u SS()
(ssget“_X”'((0。“直线,LWPOLYLINE”)))
;;
(princ“\n(get\u all\u inters\u in\u SS)函数和intline命令已加载。”)
(prin1) 请阅读代码发布指南,并编辑代码以包含在代码标签中。
Your Code Here=
Your Code Here ##########
页:
[1]