找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4948|回复: 33

[已解决] 求剖切线与等高线的交点写高程

[复制链接]
发表于 2013-7-6 10:32:26 | 显示全部楼层 |阅读模式
悬赏100D豆已解决
本帖最后由 newer 于 2021-2-4 05:28 编辑

各位高手,我请求帮我写一个代码,就是一条曲线A为剖切线,再B图层中的所有线均有高程线(线群为C),我要求剖切线A与C群中每一条等高线E的交点D,并在D点插入一个TEXT,这个单行文字的内容为E的Z值,TEXT的Z值与E的Z值相等。
剖切线及等高线均应为普通任意线型,直线 、多义线样条曲线等。剖切线可不为三维多义线 ,等高线可为三维多义线。
我要求得到源码,方便作灵活改造。
拜求各位帮忙
管理员别生气,我前面将这个帖子发到提问里面了,后面想提问里面没有悬赏,恐大家没有积极性,所以又发到这里。前面那个帖子我不知道如何能转到这里,所以重发。

我来回答


切地形线.png

切地形线.rar

60.22 KB, 下载次数: 20, 下载积分: D豆 -1 , 活跃度 1

最佳答案

查看完整内容

纯lisp 在没有函数库的情况下写真麻烦 试试行不行 **** 本内容被作者隐藏 ****
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

发表于 2013-7-6 10:32:27 | 显示全部楼层
纯lisp
在没有函数库的情况下写真麻烦
试试行不行
游客,本帖隐藏的内容需要积分高于 35 才可浏览,您当前积分为 0

点评

不行,问题很多。 1、多运行几次,插件就无效果。 2、如果直线一端Z=0,一端Z=100,则Z值为0,不是中 间数,也就是说,它有三维空间的线没有交点  发表于 2013-10-16 07:08
高!高度一次消0,再UNDO!版主总是能带来惊喜,原来可以这样!  详情 回复 发表于 2013-10-16 06:20
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-7-6 11:14:28 | 显示全部楼层
传上一个图片说明 和 DWG测试文件吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-7-7 19:56:08 | 显示全部楼层
我自己编好了,当然代码也是又是写又是抄的
CJ001027在剖切线与等高线群的外观交点上写内容为高程的TEXT.LSP
  1. (DEFUN C:UU ()
  2.   (vl-load-com)
  3.   (setq m_ent1 (car (entsel "\n请选择剖切线: ")))
  4.   (setq m_ent2 (car (entsel "\n请选择一条等高线: ")))
  5.   (setq data (entget m_ent2))
  6.   (setq layer (assoc 8 data))
  7.   (setq (CDR layer))
  8.   (SETQ SS (SSGET "X" (list (cons 8) (cons 0 "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE"))))
  9.   (SSSETFIRST SS)
  10.   (setq ii 0)
  11.   (repeat (sslength ss)                       ; 循环选择集长度
  12.     (setq (ssname ss ii))
  13.     (setq ZL-GETINTERS (m_IntersectWith m_ent1))
  14.     (setq (CADDR (vlax-curve-getStartPoint)) ;      ps2(vlax-curve-getEndPoint m_ent2)
  15.     )
  16.     (foreach n ZL-GETINTERS               ;     (print n)
  17.       (setq xzb (car n))
  18.       (setq yzb (cadr n))
  19.       (entmake (list (cons 0 "TEXT") (cons 1 (vl-princ-to-string)) (cons 10 (list XZB YZB)) (cons 40 2.5) (cons 8 "0000用于图元属性快速输出利用(简称“属性”图层)")))
  20.     )
  21.     (setq ii (1+ ii))
  22.   )                                       ;  (sssetfirst nil ss)
  23. )



  24. (defun m_IntersectWith (m_ent1 / m_obj1 m_obj2 m_objcopy1 m_objcopy2 m_jdtab m_jdtab1 i) ; 来源:3楼
  25.                                        ; [求助]任意两条线的交点坐标-AutoLISP/Visual LISP 编程技术-CAD论坛-明经CAD社区 -
  26.                                        ; Powered by Discuz!
  27.                                        ; http://bbs.mjtd.com/forum.php?mod=viewthread&tid=79868
  28.                                        ; 适用对象: Line、Polyline、LWPolyline、Circle、Arc、Ellipse、3dPolyline、Spline
  29.                                        ; 支持求空间虚交点,但Z坐标始终为0.0,要求Z坐标,请用(vlax-curve-getClosestPointTo
  30.                                        ; Projection)函数
  31.   (setq m_obj1 (vlax-ename->vla-object m_ent1))
  32.   (setq m_obj2 (vlax-ename->vla-object))
  33.   (setq m_objcopy1 (vla-copy m_obj1))  ; 复制第一条曲线实体
  34.   (setq m_objcopy2 (vla-copy m_obj2))  ; 复制第二条曲线实体
  35.   (setq m_objcopy1 (m_ShadowToXY m_objcopy1)) ; 得到投影实体
  36.   (setq m_objcopy2 (m_ShadowToXY m_objcopy2)) ; 得到投影实体
  37.   (setq m_jdtab1 (vla-intersectwith m_objcopy1 m_objcopy2 acExtendnone)) ; 得到交点集
  38.   (if (> (vlax-safearray-get-u-bound (vlax-variant-value m_jdtab1) 1) 1) ; 判断有无交点
  39.     (progn
  40.       (setq m_jdtab1 (vlax-safearray->list (vlax-variant-value m_jdtab1))) ; safearray数组转换为list表
  41.       (setq i 0)
  42.       (repeat (/ (length m_jdtab1) 3)
  43.         (setq m_jd (list (nth i m_jdtab1) (nth (+ 1 i) m_jdtab1) (nth (+ 2 i) m_jdtab1))) ; 取得一个交点
  44.         (setq m_jdtab (cons m_jd m_jdtab)) ; 构造交点表((第一个交点) (第二个交点)。。。)
  45.         (setq i (+ 3 i))
  46.       )
  47.     )
  48.     (princ "\n两曲线无交点!")
  49.   )
  50.   (vla-delete m_objcopy1)               ; 删除复制的第一条曲线实体
  51.   (vla-delete m_objcopy2)               ; 删除复制的第二条曲线实体
  52.   (setq m_jdtab m_jdtab)               ; 返回交点表,无交点返回nil
  53. )
  54. (defun m_ShadowToXY (m_obj / m_objname m_pts m_pts1 i) ; 对曲线实体m_obj创建一个投影至xy平面的曲线实体,即对曲线实体上每?
  55.                                        ; 隹刂频愕膠坐标值置为0.0
  56.                                        ; 输入曲线实体(vla对象)
  57.                                        ; 返回投影实体(vla对象)
  58.   (setq m_objname (vla-get-objectname m_obj)) ; 取得实体的类型名称
  59.                                        ;  (m_princ "\nObjectName:" m_objname)
  60.   (cond
  61.     ((= "AcDbSpline" m_objname)               ; 样条曲线(Spline)
  62.       (setq i 0)
  63.       (setq m_pts (vlax-variant-value (vla-get-fitpoints m_obj))) ; 取得样条曲线的拟合点
  64.       (setq m_pts1 (vlax-variant-value (vla-get-controlpoints m_obj))) ; 取得样条曲线的控制点
  65.       (repeat (vla-get-numberoffitpoints m_obj)        ; 循环
  66.         (vlax-safearray-put-element m_pts (+ i 2) 0.0) ; 改变每个拟合点的z值为0.0
  67.         (setq i (+ i 3))
  68.       )
  69.       (vla-put-fitpoints m_obj m_pts)  ; 更改曲线拟合点属性
  70.       (setq i 0)
  71.       (repeat (vla-get-numberofcontrolpoints m_obj) ; 循环
  72.         (vlax-safearray-put-element m_pts1 (+ i 2) 0.0)        ; 改变每个控制点的z值为0.0
  73.         (setq i (+ i 3))
  74.       )
  75.       (vla-put-controlpoints m_obj m_pts1) ; 更改曲线控制点属性
  76.     )
  77.     ((= "AcDb3dPolyline" m_objname)    ; 三维多段线(3dpolyline)
  78.       (setq i 0)
  79.       (setq m_pts (vlax-variant-value (vla-get-coordinates m_obj))) ; 取得3维多段线的控制点
  80.       (repeat (/ (length (vlax-safearray->list m_pts)) 3)
  81.         (vlax-safearray-put-element m_pts (+ i 2) 0.0)
  82.         (setq i (+ i 3))
  83.       )
  84.       (vla-put-coordinates m_obj m_pts)
  85.     )
  86.     ((= "AcDbLine" m_objname)               ; 直线(line)
  87.       (setq i 0)
  88.       (setq m_pts (vlax-variant-value (vla-get-startpoint m_obj))) ; 取得直线的起点座标
  89.       (setq m_pts1 (vlax-variant-value (vla-get-endpoint m_obj))) ; 取得直线的端点座标
  90.       (vlax-safearray-put-element m_pts 2 0.0) ; 改变起点座标z值为0.0
  91.       (vlax-safearray-put-element m_pts1 2 0.0)
  92.       (vla-put-startpoint m_obj m_pts)
  93.       (vla-put-endpoint m_obj m_pts1)
  94.     )
  95.     ((or
  96.        (= "AcDbCircle" m_objname)      ; 园(circle)
  97.        (= "AcDbArc" m_objname)               ; 圆弧(arc)
  98.        (= "AcDbEllipse" m_objname)     ; 椭圆及椭圆弧(ellipse)
  99.      )
  100.       (setq m_pts (vlax-variant-value (vla-get-center m_obj))) ; 取得中心点座标
  101.       (vlax-safearray-put-element m_pts 2 0.0) ; 改变中心点座标z值为0.0
  102.       (vla-put-center m_obj m_pts)
  103.     )
  104.     ((or
  105.        (= "AcDbPolyline" m_objname)    ; 多段线(polyline、lwpolyline)
  106.        (= "AcDb2dPolyline" m_objname)  ; 拟合的2维多段线(polyline、lwpolyline)
  107.      )
  108.       (vla-put-elevation m_obj 0.0)    ; 改变标高值为0.0
  109.     )
  110.   )
  111.   (setq m_obj m_obj)
  112. )



代码运行演示即在交点上写高程

代码运行演示即在交点上写高程

点评

等日期到了,悬赏的豆,斑竹可以分配的时候,看看能不能分配到你本人身上。 可以把你程序运行做个动画贴到这个帖子吗,也算是有始有终。  详情 回复 发表于 2013-7-7 20:47

评分

参与人数 1威望 +2 D豆 +10 贡献 +3 收起 理由
XDSoft + 2 + 10 + 3 有始有终奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-7-7 20:47:36 | 显示全部楼层
清风明月10 发表于 2013-7-7 19:56
我自己编好了,当然代码也是又是写又是抄的
CJ001027在剖切线与等高线群的外观交点上写内容为高程的TEXT.L ...

等日期到了,悬赏的豆,斑竹可以分配的时候,看看能不能分配到你本人身上。

可以把你程序运行做个动画贴到这个帖子吗,也算是有始有终。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-7-7 21:00:24 | 显示全部楼层
好不容易 学会了录GIF,这是第一次录了发表

点评

凭印象用 XDAPI 写了个,没有测试,主要用了 Getstretchpoint ,MoveStretchPoint,思路是先把等高线的拉伸点到 0 (应该是搞到和剖切线一个标高),然后求得交点后,再次将等高线拉伸会原处  详情 回复 发表于 2013-7-7 23:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-7-7 23:47:04 | 显示全部楼层
清风明月10 发表于 2013-7-7 21:00
好不容易 学会了录GIF,这是第一次录了发表

凭印象用 XDAPI 写了个,没有测试,主要用了 Getstretchpoint ,MoveStretchPoint,思路是先把等高线的拉伸点到 0 (应该是搞到和剖切线一个标高),求得交点后,再次将等高线拉伸回原处,用这个拉伸就不用考虑实体类型了
  1. (defun getinters (e ss / getz getindex el pl1 index v1 v2 ms)
  2.   (defun getz (p)
  3.     (list 0. 0. (caddr p))
  4.   )
  5.   (defun addz (p z)
  6.     (list (car p) (cadr p) (caddr z))
  7.   )
  8.   (defun getindex (pl / i)
  9.     (setq i -1)
  10.     (mapcar '(lambda (x)
  11.            (setq i (1+ i))
  12.          )
  13.         pl
  14.     )
  15.   )
  16.   (setq
  17.     ms      (vla-get-modelspace
  18.         (vla-get-activedocument (vlax-get-acad-object))
  19.       )
  20.     el      (xdrx_pickset->ents ss)
  21.     pl1      (mapcar '(lambda (x)
  22.              (xdrx_entity_getstretchpoint x)
  23.            )
  24.       )
  25.     index (mapcar '(lambda (x) (getindex x)) pl1)
  26.     v1      (mapcar '(lambda (x) (getz x)) (mapcar 'car pl1))
  27.     v2      (mapcar '(lambda (x) (mapcar '- x)) v1)
  28.   )
  29.   (mapcar '(lambda (x y)
  30.          (apply 'xdrx_entity_movestretchpoint
  31.             (append (list x) y z)
  32.          )
  33.        )
  34.       el
  35.       v2
  36.       index
  37.   )
  38.   (setq
  39.     pts    (mapcar    '(lambda (x y) (addz (xdrx_curve_intersect e x) y))
  40.         el
  41.         v1
  42.     )
  43.   )
  44.   (mapcar '(lambda (x y)
  45.          (apply 'xdrx_entity_movestretchpoint
  46.             (append (list x) y z)
  47.          )
  48.        )
  49.       el
  50.       v1
  51.       index
  52.   )
  53.   (mapcar '(lambda (x)
  54.          (vla-addtext ms (vlax-3d-point x) (rtos (caddr x) 2 3))
  55.        )
  56.       pts
  57.   )
  58. )
  59. (defun c:tt (/ e1 e2 pts ss)
  60.   (if (and (setq e1 (xdrx_entsel "\n拾取剖切线: "))
  61.        (setq e2 (car (entsel "\n拾取等高线: ")))
  62.        (setq pts (xdrx_entity_getstretchpoint (car e1)))
  63.        (setq ss (ssget "_F" pts (list (assoc 8 (entget (car e1))))))
  64.       )
  65.     (getinters (car e1) ss)
  66.   )
  67.   (princ)
  68. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-7-8 08:29:45 | 显示全部楼层
但好象是伪源码,需要外部另外的自定义函数支持“XDRX_ENTSEL”
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2013-7-8 08:59:35 来自手机 | 显示全部楼层
XDAPI也是伪源码?这让老大情何以堪!来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-7-8 09:06:29 | 显示全部楼层
我说过,我找不到源加载文件时,这套代码就是伪代码,因为对我这用户它实在无效
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-7-8 09:09:28 | 显示全部楼层
老大的自定义函数在哪里下载,能告诉我吗?要不要注册?使用说明在哪里?因为没有使用说明也用不了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2013-7-8 09:09:48 来自手机 | 显示全部楼层

源文件就是一个arx,xdrx.api来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-7-8 09:51:59 | 显示全部楼层
我电脑上没有“xdrx.api”,发给我,怎么样?或者给我网址,我去下载

点评

点论坛上面那个 红色 的 XDRX_API 广告图片就进去了。  详情 回复 发表于 2013-7-8 10:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-7-8 10:06:10 | 显示全部楼层
清风明月10 发表于 2013-7-8 09:51
我电脑上没有“xdrx.api”,发给我,怎么样?或者给我网址,我去下载

点论坛上面那个 红色 的 XDRX_API 广告图片就进去了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2013-7-8 10:09:09 来自手机 | 显示全部楼层
清风明月10 发表于 半小时前
老大的自定义函数在哪里下载,能告诉我吗?要不要注册?使用说明在哪里?因为没有使用说明也用不了

我没有新说明,猜着用,呵呵
不过上面程序用到的函数在旧手册中有来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-6-27 09:41 , Processed in 0.257890 second(s), 66 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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