f4800 发表于 2022-3-14 14:50:04

把一定范围内的高程点移动到道路中线和横断面线交点

现场测量高程的时候,高程点一般不会正好在道路中线豫横断面线的交点处。这样计算时候,有的会无发查找到这个高程点
横断面线位于dmx图层的直线或者PL线


如何实现:
1、选择道路中线和横断面线,设定一个距离范围,比如0.2,然后在交点0.2m范围内的高程点自动移动到交点上。


多谢




mj0000 发表于 2022-3-14 15:55:07

刚好前段时间写了个,自己改改吧
;;; 从一点返回选择框(指定选择的长宽)
(defun Get-UCS_Rec2Pt (PT0 DLL HLL /B_L H_L PT1 PT2 PT3 PT4 VP_ANG PTs PT4s pt)
(setq B_L (* DLL 0.5)) ;边长*0.5
(setq H_L (* HLL 0.5)) ;高度*0.5
(setq PT1 (polar PT0 pi B_L)) ;左侧边的中点
(setq PT1 (polar PT1 *270_DuHu* H_L)) ;左下角
(setq PT2 (polar PT1 0 DLL)) ;右下角
(setq PT3 (polar PT2 *90_DuHu* HLL)) ;右上角
(setq PTs (list PT1 PT3))
(setq PT4s (mapcar '(lambda (pt) (trans pt 1 0)) PTs)) ;返回坐标值为世界坐标系
PT4s
)

(defun C:TT (/ BBX EN PT0 PT1 SEL)
(setq Pt0 (getpoint "\n指定交点:")) ;曲线交点自己计算
(setq bbx (Get-UCS_Rec2Pt (trans Pt0 0 1) 0.2 0.2)) ;选择框范围
(if (setq sel (ssget "_C"
                     (trans (car bbx) 0 1)
                     (trans (cadr bbx) 0 1)
                     (list (cons 0 "INSERT")) ;过滤条件 -- 自己写
                )
      ) ;选择包围框内的图元
    (progn
      (princ sel)
      (setq en (ssname sel (1- (sslength sel)))) ;获得选集中第一个图元名
      (setq pt1 (cdr (assoc 10 (entget en))))
      (vl-cmdf "_MOVE" en "" pt1 Pt0)
    )
)
)

mj0000 发表于 2022-3-15 09:16:02

(setq *45_DuHu*      (* 0.25 pi) ;_ 45度(弧度)
      *90_DuHu*      (* 0.5 pi) ;_ 90度(弧度)
      *270_DuHu*   (* 1.5 pi) ;_ 270度(弧度)
      *360_DuHu*   (* 2.0 pi) ;_ 360度(弧度)
)
函数Get-UCS_Rec2Pt取的是方形选择区,ssget "_C"也只能选择方形选择区,圆形选择区算起来就复杂了,没有直接的函数进行圆形选择区的计算,建议用近似距离的方形选择代替就行

mj0000 发表于 2022-3-15 11:45:20

圈选可以用这个
;;; Cen - 插入点
;;; Rad - 圆的半径
;;; N --- 圆的等分数量
(defun Get_CirclePtS (Cen Rad N / angdiv ANG ENLST)
(setq angdiv (/ (* 2 pi) N))
(setq ang 0)
(setq enlst (list (polar cen ang Rad)))
(repeat (1- N)
    (setq enlst (cons (polar cen (setq ang (+ ang angdiv)) Rad) enlst)) ;画红色圆弧,100等分,模拟圆弧
)
enlst
)
(ssget "CP" (Get_CirclePtS (getpoint "\n指定点:") 0.2 36)) ;圈交--圆36等分

f4800 发表于 2022-3-14 16:10:14

本帖最后由 f4800 于 2022-3-15 00:34 编辑

mj0000 发表于 2022-3-14 15:55
刚好前段时间写了个,自己改改吧
;;; 从一点返回选择框(指定选择的长宽)
(defun Get-UCS_Rec2Pt (PT0 D ...
多谢大师trans 涉及到坐标系变换   能否去掉这个功能?
默认就是CAD的模型空间坐标。

因为用了 trans 函数, 图形必须用 UCSW 操作以后才能运行 。否则会报错

mj0000 发表于 2022-3-15 08:41:15

删除红色部分就行。其余类似(trans (car bbx) 0 1)

f4800 发表于 2022-3-15 08:51:51

mj0000 发表于 2022-3-15 08:41
删除红色部分就行。其余类似(trans (car bbx) 0 1)

再次感谢   大师

f4800 发表于 2022-3-15 08:54:48

本帖最后由 f4800 于 2022-3-15 09:03 编辑

mj0000 发表于 2022-3-15 08:41
删除红色部分就行。其余类似(trans (car bbx) 0 1)
      (setq aaa (/ PI 180))      
      (setq *270_DuHu* (* 270 aaa ) )
      (setq *90_DuHu*(* 90 aaa ) )      

这个变量不知道对不对。另外, 距离 0.2 好像不是交点为0.2的圆的范围


f4800 发表于 2022-3-15 10:05:54

mj0000 发表于 2022-3-15 09:16
(setq *45_DuHu*      (* 0.25 pi) ;_ 45度(弧度)
      *90_DuHu*      (* 0.5 pi) ;_ 90度(弧度)
      ...

已修改在空间留言了。。请核查 :handshake

mj0000 发表于 2022-3-15 10:12:42

应该没问题了,画一个点pt,以点为中心,画个0.2*0.2的方框,放一个图块A到这个方框内,运行程序,选择中心点pt,图块A的插入点会自动移动到中心点上

mj0000 发表于 2022-3-15 10:37:49

mj0000 发表于 2022-3-15 09:16
(setq *45_DuHu*      (* 0.25 pi) ;_ 45度(弧度)
      *90_DuHu*      (* 0.5 pi) ;_ 90度(弧度)
      ...

圈交(ssget “CP” ptlst)可以选择近似的圆形区域,ptlst需要用单独的函数计算出来
页: [1] 2 3
查看完整版本: 把一定范围内的高程点移动到道路中线和横断面线交点