cad已知一条直的多段线(或者直线),如何用编程的办法获取这条多段线(或者直线)与其他线条的交点坐标 255
cad已知一条直的多段线(或者直线),如何用编程的办法获取这条多段线(或者直线)与其他线条的交点坐标我想做一个类似与cass剖横断面的功能,lisp或者vba都行,主要我...
cad已知一条直的多段线(或者直线),如何用编程的办法获取这条多段线(或者直线)与其他线条的交点坐标
我想做一个类似与cass剖横断面的功能,lisp或者vba都行,主要我不知道如何获取这个线与线的交点坐标(xyz)。
线与线的交点指的是平面的交点(对象捕捉里面的外观交点),z值不一样时,切换视角实际上是没有交点的,只是投影上面有交点。 展开
我想做一个类似与cass剖横断面的功能,lisp或者vba都行,主要我不知道如何获取这个线与线的交点坐标(xyz)。
线与线的交点指的是平面的交点(对象捕捉里面的外观交点),z值不一样时,切换视角实际上是没有交点的,只是投影上面有交点。 展开
3个回答
展开全部
(defun C:JDHQ()
(setvar "cmdecho" 0)
(princ "\n选择要切割的直线:")
(setq lll(entsel));选择直线
;;;
;取得直线起点零高程坐标列表
(setq lllxyz1(cdr (assoc 10 (entget (car lll)))))
(setq lllx1(nth 1 lllxyz1))
(setq llly1(nth 0 lllxyz1))
(setq lllxyz10 (list llly1 lllx1 0.0))
;;;
;取得直线终点零高程坐标列表
(setq lllxyz2(cdr(assoc 11 (entget (car lll)))))
(setq lllx2(nth 1 lllxyz2))
(setq llly2(nth 0 lllxyz2))
(setq lllxyz20 (list llly2 lllx2 0.0))
;;;
(princ "\n选择被相交的直线图元集:")
(setq ss(ssget));被交线图元集
(setq n(sslength ss));计算图元集图元个数
(setq ff(open(getfiled "交点保存为" "" "txt" 1)"w"))
;;;;;
(setq i 0)
(repeat n
(setq spt (ssname ss i))
(setq ept (entget spt))
(if (=(cdr(assoc 0 ept)) "LINE")
(progn
(setq lxyz1(cdr (assoc 10 ept)))
(setq sx1(nth 1 lxyz1))
(setq sy1(nth 0 lxyz1))
(setq sz1(nth 2 lxyz1))
(setq lxyz10 (list sy1 sx1 0.0))
;;;
(setq lxyz2(cdr (assoc 11 ept)))
(setq sx2(nth 1 lxyz2))
(setq sy2(nth 0 lxyz2))
(setq sz2(nth 2 lxyz2))
(setq lxyz20 (list sy2 sx2 0.0))
;;;
;计算交点坐标
(setq jdxy0(inters lllxyz10 lllxyz20 lxyz10 lxyz20))
(if (/= jdxy0 nil)
(progn
(setq jdx(nth 1 jdxy0))
(setq jdy(nth 0 jdxy0))
;
;求交点高程z
(setq l1(sqrt(+(* (- sx2 sx1) (- sx2 sx1)) (* (- sy2 sy1) (- sy2 sy1)))))
(setq l2(sqrt(+(* (- jdx sx1) (- jdx sx1)) (* (- jdy sy1) (- jdy sy1)))))
(setq jdz(+ sz1 (* (- sz2 sz1) (/ l2 l1))))
(setq jdz1(rtos jdz 2 3))
(setq jdx1(rtos jdx 2 3))
(setq jdy1(rtos jdy 2 3))
;
;
(setq jdxyz(strcat jdy1"," jdx1 ","jdz1))
(write-line jdxyz ff)
)
)
)
)
(setq i (+ i 1))
)
(close ff)
(prin1)
)
(prompt "********<<C:JDHQ>>********")
(prin1)
(setvar "cmdecho" 0)
(princ "\n选择要切割的直线:")
(setq lll(entsel));选择直线
;;;
;取得直线起点零高程坐标列表
(setq lllxyz1(cdr (assoc 10 (entget (car lll)))))
(setq lllx1(nth 1 lllxyz1))
(setq llly1(nth 0 lllxyz1))
(setq lllxyz10 (list llly1 lllx1 0.0))
;;;
;取得直线终点零高程坐标列表
(setq lllxyz2(cdr(assoc 11 (entget (car lll)))))
(setq lllx2(nth 1 lllxyz2))
(setq llly2(nth 0 lllxyz2))
(setq lllxyz20 (list llly2 lllx2 0.0))
;;;
(princ "\n选择被相交的直线图元集:")
(setq ss(ssget));被交线图元集
(setq n(sslength ss));计算图元集图元个数
(setq ff(open(getfiled "交点保存为" "" "txt" 1)"w"))
;;;;;
(setq i 0)
(repeat n
(setq spt (ssname ss i))
(setq ept (entget spt))
(if (=(cdr(assoc 0 ept)) "LINE")
(progn
(setq lxyz1(cdr (assoc 10 ept)))
(setq sx1(nth 1 lxyz1))
(setq sy1(nth 0 lxyz1))
(setq sz1(nth 2 lxyz1))
(setq lxyz10 (list sy1 sx1 0.0))
;;;
(setq lxyz2(cdr (assoc 11 ept)))
(setq sx2(nth 1 lxyz2))
(setq sy2(nth 0 lxyz2))
(setq sz2(nth 2 lxyz2))
(setq lxyz20 (list sy2 sx2 0.0))
;;;
;计算交点坐标
(setq jdxy0(inters lllxyz10 lllxyz20 lxyz10 lxyz20))
(if (/= jdxy0 nil)
(progn
(setq jdx(nth 1 jdxy0))
(setq jdy(nth 0 jdxy0))
;
;求交点高程z
(setq l1(sqrt(+(* (- sx2 sx1) (- sx2 sx1)) (* (- sy2 sy1) (- sy2 sy1)))))
(setq l2(sqrt(+(* (- jdx sx1) (- jdx sx1)) (* (- jdy sy1) (- jdy sy1)))))
(setq jdz(+ sz1 (* (- sz2 sz1) (/ l2 l1))))
(setq jdz1(rtos jdz 2 3))
(setq jdx1(rtos jdx 2 3))
(setq jdy1(rtos jdy 2 3))
;
;
(setq jdxyz(strcat jdy1"," jdx1 ","jdz1))
(write-line jdxyz ff)
)
)
)
)
(setq i (+ i 1))
)
(close ff)
(prin1)
)
(prompt "********<<C:JDHQ>>********")
(prin1)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
求两条异面空间直线相交的交点,是很啰唆的事情,要用到空间解析几何学知识。一般是用投影几何作图法求得近似值。
追问
应该不会那么复杂吧,否则上亿的线条先读取,再用数学的方法处理交点,处理起来机器都会崩溃了。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以编写LSP程序实现的,我会编写LSP程序,很好使用的
追问
我知道,主要说一说思路!吧!关键函数的引用
追答
你私信或评论我
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询