清风明月名字 发表于 2014-4-21 21:25:45

求用一条多段线打断与它投影到平面上相交的一组等高线

本帖最后由 清风明月名字 于 2014-4-21 22:21 编辑

我想用一条多段线打断与它投影到平面上相交的等高线,哪位高手能帮我写一个吗?这些等高线Z值可以为0或其它高程值。我的设想时,计算到了它们两个的空间虚拟交点,得到XY坐标,再让打断命令去捕捉这个点来打断。注意结果中,等高线的Z值不能归零。

byghbcx 发表于 2014-4-21 21:25:46

(command "break" 单个图元(listXZB YZB 高程) "@")看看

清风明月名字 发表于 2014-4-22 11:45:37

下面写法怎么打断命令运行错误啊,其它都是正确的。
(DEFUN C:TT()
(vl-load-com)
(setq m_ent1 (car (entsel "\n请选择剖切线: ")))
(setq m_ent2 (car (entsel "\n请选择一条等高线: ")))
(setq data(entget    m_ent2 ))
(setq layer(assoc 8 data))
(setq 层名(CDR layer))

(SETQ SS (SSGET "X" ( list (cons 8层名)(cons 0"LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE"))))
(SSSETFIRST SS)
(setq ii 0)
(repeat (sslength ss);循环选择集长度
   (setq 单个图元   (ssname ss ii))
(setq ZL-GETINTERS(m_IntersectWith m_ent1 单个图元))
(setq 高程 (CADDR (vlax-curve-getStartPoint 单个图元))
;;;      ps2(vlax-curve-getEndPoint m_ent2)
      )
   (foreach n ZL-GETINTERS
;;;   (print n)
(setq xzb (car n))
(setq yzb (cadr n))

(entmake (list (cons 0"TEXT") (cons 1 (vl-princ-to-string 高程)) (cons 10 (listXZB YZB 高程))
             (cons 40 2.5)
             (cons 8 "0000用于图元属性快速输出利用(简称“属性”图层)")
             ))
                   ; 在下面画圆,这样就可以直接用“”读出里程及偏移,而孔号就是该点高程
                   (entmake (list '(0 . "CIRCLE") (cons 10 (listXZB YZB 高程)) (cons 40 1.25)(cons 8 "0000用于图元属性快速输出利用(简称“属性”图层)")))
                  (command "break" 单个图元 "f" (listXZB YZB 高程) (listXZB YZB 高程))
                  ; (command "LINE"(LIST XZB YZB) '(0 0))

                  

    )

   
(setq ii (1+ ii))
)



;;;(sssetfirst nil ss)
)


(defun m_IntersectWith(m_ent1 单个图元 / m_obj1 m_obj2 m_objcopy1 m_objcopy2 m_jdtab m_jdtab1 i)
; 来源:3楼 [求助]任意两条线的交点坐标-AutoLISP/Visual LISP 编程技术-CAD论坛-明经CAD社区 - Powered by Discuz!
; http://bbs.mjtd.com/forum.php?mod=viewthread&tid=79868
;;适用对象: Line、Polyline、LWPolyline、Circle、Arc、Ellipse、3dPolyline、Spline
;;支持求空间虚交点,但Z坐标始终为0.0,要求Z坐标,请用(vlax-curve-getClosestPointToProjection)函数
(setq m_obj1 (vlax-ename->vla-object m_ent1))
(setq m_obj2 (vlax-ename->vla-object 单个图元))

(setq m_objcopy1 (vla-copy m_obj1));;复制第一条曲线实体
(setq m_objcopy2 (vla-copy m_obj2));;复制第二条曲线实体

(setq m_objcopy1 (m_ShadowToXY m_objcopy1));;得到投影实体
(setq m_objcopy2 (m_ShadowToXY m_objcopy2));;得到投影实体

(setq m_jdtab1 (vla-intersectwith m_objcopy1 m_objcopy2 acExtendnone));;得到交点集

(if (> (vlax-safearray-get-u-bound (vlax-variant-value m_jdtab1) 1) 1);;判断有无交点
      (progn
(setq m_jdtab1 (vlax-safearray->list (vlax-variant-value m_jdtab1)));;safearray数组转换为list表
(setq i 0)
(repeat (/ (length m_jdtab1) 3)
   (setq m_jd (list (nth i m_jdtab1) (nth (+ 1 i) m_jdtab1) (nth (+ 2 i) m_jdtab1)));;取得一个交点
   (setq m_jdtab (cons m_jd m_jdtab));;构造交点表((第一个交点) (第二个交点)。。。)
   (setq i (+ 3 i))
)
      )
      (princ"\n两曲线无交点!")
)

(vla-delete m_objcopy1);;删除复制的第一条曲线实体
(vla-delete m_objcopy2);;删除复制的第二条曲线实体

(setq m_jdtab m_jdtab);;返回交点表,无交点返回nil
)
(defun m_ShadowToXY(m_obj / m_objname m_pts m_pts1 i)
;;对曲线实体m_obj创建一个投影至xy平面的曲线实体,即对曲线实体上每个控制点的z坐标值置为0.0
;;输入曲线实体(vla对象)
;;返回投影实体(vla对象)
(setq m_objname (vla-get-objectname m_obj));;取得实体的类型名称
;;;(m_princ "\nObjectName:" m_objname)
(cond
    ((= "AcDbSpline" m_objname);;样条曲线(Spline)
   (setq i 0)
   (setq m_pts (vlax-variant-value (vla-get-fitpoints m_obj)));;取得样条曲线的拟合点
   (setq m_pts1 (vlax-variant-value (vla-get-controlpoints m_obj)));;取得样条曲线的控制点
   (repeat (vla-get-numberoffitpoints m_obj);;循环
       (vlax-safearray-put-element m_pts (+ i 2) 0.0);;改变每个拟合点的z值为0.0
       (setq i (+ i 3))
   )
   (vla-put-fitpoints m_obj m_pts);;更改曲线拟合点属性
   (setq i 0)
   
   (repeat (vla-get-numberofcontrolpoints m_obj);;循环
       (vlax-safearray-put-element m_pts1 (+ i 2) 0.0);;改变每个控制点的z值为0.0
       (setq i (+ i 3))
   )
   (vla-put-controlpoints m_obj m_pts1);;更改曲线控制点属性
    )
   
    ((= "AcDb3dPolyline" m_objname);;三维多段线(3dpolyline)
   (setq i 0)
   (setq m_pts (vlax-variant-value (vla-get-coordinates m_obj)));;取得3维多段线的控制点
   (repeat (/ (length (vlax-safearray->list m_pts)) 3)
       (vlax-safearray-put-element m_pts (+ i 2) 0.0)
       (setq i (+ i 3))
   )
   (vla-put-coordinates m_obj m_pts)
    )
   
    ((= "AcDbLine" m_objname);;直线(line)
   (setq i 0)
   (setq m_pts (vlax-variant-value (vla-get-startpoint m_obj)));;取得直线的起点座标
   (setq m_pts1 (vlax-variant-value (vla-get-endpoint m_obj)));;取得直线的端点座标
   (vlax-safearray-put-element m_pts 2 0.0);;改变起点座标z值为0.0
   (vlax-safearray-put-element m_pts1 2 0.0)
   (vla-put-startpoint m_obj m_pts)
   (vla-put-endpoint m_obj m_pts1)
    )
    ((or (= "AcDbCircle" m_objname);;园(circle)
(= "AcDbArc" m_objname);;圆弧(arc)
(= "AcDbEllipse" m_objname);;椭圆及椭圆弧(ellipse)
   )
   (setq m_pts (vlax-variant-value (vla-get-center m_obj)));;取得中心点座标
   (vlax-safearray-put-element m_pts 2 0.0);;改变中心点座标z值为0.0
   (vla-put-center m_obj m_pts)
    )
   
    ((or (= "AcDbPolyline" m_objname);;多段线(polyline、lwpolyline)
(= "AcDb2dPolyline" m_objname);;拟合的2维多段线(polyline、lwpolyline)
   )
   (vla-put-elevation m_obj 0.0);;改变标高值为0.0
    )
)
(setq m_obj m_obj)
)

清风明月名字 发表于 2014-5-7 14:36:08

byghbcx 发表于 2014-5-7 09:21 static/image/common/back.gif
(command "break" 单个图元(listXZB YZB 高程) "@")看看

你是高手,你一句话就解决了我的问题。谢谢!

yxh1202 发表于 2015-7-15 23:14:23

楼上的高人们,最终的版本能发布下吗
页: [1]
查看完整版本: 求用一条多段线打断与它投影到平面上相交的一组等高线