明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: 4041186888

[提问] 求多段线交点的思路

[复制链接]
发表于 2024-8-14 16:36:48 | 显示全部楼层
llsheng_73 发表于 2016-7-30 17:40
用ssget"F"以a的顶点表对等高线进行选择
通过ssnamex得到等高线与a的交点
函数名:tt

没看懂啊 大哥

我改了论坛求交点的程序,但是也还是有bug  会多或者漏点。
  1. (vl-load-com)
  2. (defun C:88 (/ m_entab m_vlaobj m_wlbpt m_wrupt  m_ss m_vlaobjcopy m_vlaobjcopy1
  3.         m_ent *m_jdtab m_jdtab1 m_len i j)
  4.   (command"ucs" "w")(command);;一定要在世界坐标系下
  5.   (princ"\n纵断面与等高线交点插入高程点!")
  6.   (setq m_entab (car (entsel "\n请选择一条线:")))
  7.   
  8.   (setq m_vlaobj (vlax-ename->vla-object m_entab))
  9.   (vla-getboundingbox m_vlaobj 'm_wlbpt 'm_wrupt)
  10.   (setq m_wlbpt (vlax-safearray->list m_wlbpt))  ;;窗口左下角点
  11.   (setq m_wrupt (vlax-safearray->list m_wrupt))  ;;窗口右上角点
  12.   (vla-zoomwindow (vlax-get-acad-object) (vlax-3d-point m_wlbpt)(vlax-3d-point m_wrupt));;缩放以使剖切线充满屏幕

  13.   (setq m_ss (ssget "c" m_wlbpt m_wrupt '((0 . "*POLYLINE")(8 . "DGX"))))
  14.   
  15. ;;;  (setq m_ss (ssdel m_entab m_ss))
  16.   (if m_ss
  17.     (progn
  18.       (setq m_vlaobjcopy (m_shadowtoxy (vla-copy m_vlaobj)));;复制剖切线实体并求投影至XY平面的实体
  19.       (setq m_jdtab '())
  20.       (setq i 0)
  21.       (repeat (sslength m_ss)
  22. (setq m_ent (ssname m_ss i));;取出选择集中的一个实体
  23. (setq m_vlaobjcopy1
  24.         (m_shadowtoxy
  25.    (vla-copy (vlax-ename->vla-object m_ent))
  26.         )
  27. );;复制并求投影实体

  28. (setq m_jdtab1 (vla-intersectwith
  29.     m_vlaobjcopy
  30.     m_vlaobjcopy1
  31.     acExtendnone
  32.   )
  33. );;求剖切线与曲线实体的交点表
  34. (if (> (vlax-safearray-get-u-bound (vlax-variant-value m_jdtab1) 1) 1) ;;判断有无交点
  35.    
  36.    (progn
  37.      (setq m_jdtab1 (vlax-safearray->list (vlax-variant-value m_jdtab1)));;safearray数组转换为list表
  38.      (setq j 0)
  39. ;;;     (princ m_jdtab1)
  40.      (repeat (/ (length m_jdtab1) 3)
  41.        (setq m_jd (list (nth j m_jdtab1)
  42.           (nth (+ 1 j) m_jdtab1)
  43.           (nth (+ 2 j) m_jdtab1)
  44.    )
  45.        );;取得交点在投影的剖切线上
  46.    
  47.        (setq m_len (distance m_jd (vlax-curve-getstartpoint m_vlaobjcopy)));;交点到线起点得长度
  48.       
  49.        (setq m_jd (vlax-curve-getClosestPointToProjection
  50.       (vlax-ename->vla-object m_ent)
  51.       (list (car m_jd) (cadr m_jd) 0.0)
  52.       '(0 0 1)
  53.     )
  54.        );;取得交点在实际的等高线上(主要是得到高程)

  55.        (setq m_jdtab (cons (list m_len m_jd) m_jdtab));;构造交点表
  56.        (setq j (+ 3 j))
  57.      )
  58.    )
  59. )
  60. (vla-delete m_vlaobjcopy1) ;;删除复制的曲线实体
  61. (setq i (1+ i))
  62.       )
  63.       
  64.       (vla-delete m_vlaobjcopy);;删除复制的线实体
  65.       
  66.       (setq m_jdtab (vl-sort m_jdtab '(lambda (a b) (< (car a) (car b))))) ;;对距离从小到大排序
  67.     )
  68.     (princ"\n没有选择到符合要求的线!")
  69.   )
  70. ;;;  m_jdtab  ;((0.872522 (3.45137e+07 3.49438e+06 999.0)) (0.87277 (3.45137e+07 3.49438e+06 999.0)))
  71.   (setq j -1)
  72. (while(setq a (car m_jdtab))
  73.   (if(>(abs(- j (car a)))0.1)
  74.     (entmake_gcd_yan (list(car(cadr a))(cadr(cadr a))) (last (cadr a)) 0.1 2))
  75.   (setq j (car a))
  76.   (setq m_jdtab(cdr m_jdtab))
  77.   )
  78.   (princ"\n纵断面与等高线交点插入高程点完成!")
  79.   (PRIN1)
  80. )

  81. (defun m_shadowtoxy (m_obj / m_obj1 m_objname m_pts m_pts1 i)
  82.   ;;对曲线实体m_obj创建一个投影至xy平面的曲线实体,即对曲线实体上每个控制点的z坐标置为0
  83.   ;;返回实体名m_obj1
  84.   (setq m_objname (vla-get-objectname m_obj))
  85.   ;;取得实体的类型名称
  86.   (cond
  87.     ((= "AcDbSpline" m_objname)
  88.      ;;样条曲线(Spline)
  89.      (setq i 0)
  90.      (setq m_pts (vlax-variant-value (vla-get-fitpoints m_obj)))
  91.      ;;取得样条曲线的拟合点
  92.      (setq m_pts1 (vlax-variant-value (vla-get-controlpoints m_obj)))
  93.      ;;取得样条曲线的控制点
  94.      (repeat (vla-get-numberoffitpoints m_obj)
  95.        (vlax-safearray-put-element m_pts (+ i 2) 0.0)
  96.        ;;改变每个拟合点的z值为0.0
  97.        (setq i (+ i 3))
  98.      )
  99.      (vla-put-fitpoints m_obj m_pts)
  100.      ;;更改曲线拟合点属性

  101.      (setq i 0)

  102.      (repeat (vla-get-numberofcontrolpoints m_obj)
  103.        ;;循环
  104.        (vlax-safearray-put-element m_pts1 (+ i 2) 0.0)
  105.        ;;改变每个控制点的z值为0.0
  106.        (setq i (+ i 3))
  107.      )
  108.      (vla-put-controlpoints m_obj m_pts1)
  109.      ;;更改曲线控制点属性
  110.     )

  111.     ((= "AcDb3dPolyline" m_objname)
  112.      ;;三维多段线(3dpolyline)
  113.      (setq i 0)
  114.      (setq m_pts (vlax-variant-value (vla-get-coordinates m_obj)))
  115.      ;;取得3维多段线的控制点
  116.      (repeat (/ (length (vlax-safearray->list m_pts)) 3)
  117.        (vlax-safearray-put-element m_pts (+ i 2) 0.0)
  118.        (setq i (+ i 3))
  119.      )
  120.      (vla-put-coordinates m_obj m_pts)
  121.     )

  122.     ((= "AcDbLine" m_objname)
  123.      ;;直线(line)
  124.      (setq i 0)
  125.      (setq m_pts (vlax-variant-value (vla-get-startpoint m_obj)))
  126.      ;;取得直线的起点座标
  127.      (setq m_pts1 (vlax-variant-value (vla-get-endpoint m_obj)))
  128.      ;;取得直线的终点座标
  129.      (vlax-safearray-put-element m_pts 2 0.0)
  130.      ;;改变起点座标z值为0.0
  131.      (vlax-safearray-put-element m_pts1 2 0.0)
  132.      ;;改变终点座标z值为0.0
  133.      (vla-put-startpoint m_obj m_pts)
  134.      (vla-put-endpoint m_obj m_pts1)
  135.     )

  136.     ((or (= "AcDbCircle" m_objname)
  137.   ;;园(circle)
  138.   (= "AcDbArc" m_objname)
  139.   ;;圆弧(arc)
  140.   (= "AcDbEllipse" m_objname)
  141.   ;;椭圆及椭圆弧(ellipse)
  142.      )
  143.      (setq m_pts (vlax-variant-value (vla-get-center m_obj)))
  144.      (vlax-safearray-put-element m_pts 2 0.0)
  145.      ;;改变中心点座标z值为0.0
  146.      (vla-put-center m_obj m_pts)
  147.     )

  148.     ((or (= "AcDbPolyline" m_objname)
  149.   ;;多段线(polyline、lwpolyline)
  150.   (= "AcDb2dPolyline" m_objname)
  151.   ;;拟合的2维多段线(polyline、lwpolyline)
  152.      )
  153.      (vla-put-elevation m_obj 0.0)
  154.      ;;改变标高值为0.0
  155.     )
  156.   )
  157.   (setq m_obj1 m_obj)
  158. )






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

本版积分规则

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

GMT+8, 2024-11-25 12:27 , Processed in 0.154343 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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