明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1848|回复: 2

贴一个求交点的代码?希望高手指正!

[复制链接]
发表于 2004-8-11 11:56:00 | 显示全部楼层 |阅读模式
以前用inters函数求交点,但遇到多义线包括圆弧段时不准确,最近看了一下帖子,采用trim命令求交点,可以求虚交点,比较准确,但时速度上比较慢!大家探讨探讨吧! (defun test2 (/ m_pqx m_ent m_enttmp m_vlaobj m_vlaobj1 m_entlen
m_startpt m_endpt m_wlbpt m_wrupt m_ss m_ss1
i n m_endpt1 m_jdtab m_flag m_kz
)
(setq m_pqx (car (entsel "\n请选择一条剖切线:")))
(setq m_vlaobj (vlax-ename->vla-object m_pqx))
(vla-getboundingbox m_vlaobj 'm_wlbpt 'm_wrupt)
(setq m_wlbpt (vlax-safearray->list m_wlbpt))
(setq m_wrupt (vlax-safearray->list m_wrupt))
(print m_wlbpt)(print m_wrupt)
(command "zoom" "w" m_wlbpt m_wrupt);;缩放以使剖切线充满屏幕
;;窗口右下角点
(setq m_ss (ssget "c" m_wlbpt m_wrupt '((-4 . "<or") (0 . "line") (0 . "polyline") (0 . "lwpolyline")
(0 . "arc") (0 . "circle") (0 . "spline") (0 . "ellipse")(0 . "3dpoly")
(-4 . "or>")
)
)
) ;;窗口交选

(setq m_ss (ssdel m_pqx m_ss));;删除剖切线本身 (command "copy" m_pqx "" (setq i 0)
(repeat (sslength m_ss)
(setq m_ent (ssname m_ss i));;取出选择集中的一个实体作为修剪边界线
(setq m_endpt (vlax-curve-getendpoint m_vlaobj));;取得被修剪线的最后一个点坐标
(setq m_entlen (vlax-curve-getdistatpoint m_vlaobj m_endpt));;被修剪线长度
(setq m_endpt1 (vlax-curve-getpointatdist m_vlaobj (- m_entlen m_kz)));;取得被修剪线上距最后一点m_kz长度的点,m_kz可调 (setq m_flag t n 0)
(while m_flag
(command "trim" m_ent "" (list m_enttmp m_endpt1) "");;修剪复制线
(command "select" m_startpt "");;单选目标
(setq m_ss1 (ssget "p"));;选取被修剪线修建后的实体,虽是两线重合,但select命令只选择最近操作过的实体
(setq n (+ 2 n));;存储被修剪了多少次+'select的次数,供后面恢复用
(setq m_enttmp (ssname m_ss1 0));;被选择的实体名
(setq m_vlaobj1 (vlax-ename->vla-object m_enttmp))
(setq m_ss1 nil);;清除选择集
(setq m_endpt1 (vlax-curve-getendpoint m_vlaobj1));;被修剪线修剪后的最后一个点坐标
(if (> (distance m_endpt m_endpt1) 0.000000001);;如果两点重合,则认为已无交点
(progn
(setq m_entlen (vlax-curve-getdistatpoint m_vlaobj m_endpt1));;被修剪线修剪后的长度
(setq m_jdtab (cons (list m_entlen (list m_ent m_endpt1)) m_jdtab));;储存交点标数据(距起点距离(修剪边界实体名 交点坐标))
(setq m_endpt m_endpt1);;
(setq m_endpt1 (vlax-curve-getpointatdist m_vlaobj (- m_entlen m_kz)))
)
(setq m_flag nil)
)
)
(command "undo" n);;放弃修剪,恢复被修剪线m_enttmp实体
(setq n 0)
(setq i (1+ i))
)
(command "undo" 1)
(setq m_jdtab (vl-sort m_jdtab '(lambda (a b) (< (car a)(car b)))));;按距离由小到大排序
(print m_jdtab);;打印
(princ)
) 这是本人在编绘制地形剖面线程序中的一段代码,也是核心部分!需要注意的是剖切线不能是3维多段线,即剖切线各节点高程应该相同才行!
 楼主| 发表于 2004-8-11 13:17:00 | 显示全部楼层
采用intersectwith函数求交点倒是比较方便,但只适用于相交两线共面的情况,谁知道在Vlisp程序中怎样使两线共面?
发表于 2013-4-6 10:35:53 | 显示全部楼层
只有将两个图元复制后设置为Z=0,求交点,再删除
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-31 01:27 , Processed in 0.255155 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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