明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1082|回复: 17

[测绘] 隧道超欠挖标注

[复制链接]
发表于 2024-6-17 17:36:49 | 显示全部楼层 |阅读模式
隧道超欠挖标注,效果不好希望大神帮忙优化

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-6-20 08:45:59 | 显示全部楼层
修改了make-dimension子函数的参数如下:
;;说明:绘制超欠挖标注参数说明
;;参数:p14:实测开挖线上的实测点
;;参数:p13:设计线上的对应的垂直点
;;参数:p11:标注文字放置的点
;;参数:dimsty:前缀符号超挖为"+<>";欠挖为"-<>"
;;参数:ys:箭头及线颜色
;;示例make-dimension pt@curve pt p11 "-<>" 1);箭头及线颜色1 红色
(defun make-dimension (p14 p13 p11 dimsty ys)
  (entmake (list '(0 . "DIMENSION")
                 '(100 . "AcDbEntity")
                 '(100 . "AcDbDimension")                 
                  (cons 10 p14)
                  (cons 11 p11)
                 '(70 . 33)
                  (cons 1 dimsty);前缀符号
                  (cons 3 "超欠挖")
                 '(100 . "AcDbAlignedDimension")
                 (cons 13 p13)
                 (cons 14 p14)
                 (cons 62 ys) ;箭头及线颜色
                 )
           );endmake  
  );end defun
回复 支持 1 反对 0

使用道具 举报

发表于 2024-6-20 08:29:05 | 显示全部楼层
试一试看看是不是你要的效果
;文件名:PB.lsp
;;功能说明:标注实际开挖线各点与设计开挖线之间的距离
;;;修改时间:2015-01-07  ss en v-en pc ss1 en1 po-li n p11 pt pt@curve osm

(vl-load-com)
(defun c:PB(/ )  
  (setq osm (getvar "osmode"))  
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)  

  (while
    (progn
      (prompt "\n请选择设计开挖线:")
      (not(setq ss(ssget ":s" '((0 . "CIRCLE,*POLYLINE")))))
        );end progn
    (prompt "\n<<<<未选择到正确的对象,请重新选择!>>>>")
  );end while

  (setq en(ssname ss 0)
        v-en(vlax-ename->vla-object en)
    )  
  (setq pc(find-centerpoint en));找设计开挖线的型心

  (while(progn(prompt "\n请选择实际开挖线:")
                (not(setq ss1(ssget ":s" '((0 . "*POLYLINE")))))
        );end progn
    (prompt "\n<<<<未选择到正确的对象,请重新选择!>>>>")
  );end while

  (setq en1(ssname ss1 0))
  (setq po-li (vl-remove-if 'not (mapcar '(lambda (x) (if (= (car x) 10) (cdr x))) (entget en1))));取多段线顶点表

  (initget 6)
  (setq n (getint "\n 请输入实际开挖线上标注间隔数(默认为0):"))
  (if(null n)(setq n 0))

  (if(/= n 0)(setq po-li(get-new-point-list po-li n)));end if

  (foreach pt po-li   
    (setq pt@curve(vlax-curve-getClosestPointTo v-en pt))

    (if(> (distance pt pc) (distance pt@curve pc));如果超挖
      (progn
      (setq p11 (polar pt@curve (angle pt@curve pt) (* 2 (distance pt pt@curve))))
      ;(make-dimension pt pt@curve p11 "隧道超挖+")
      (make-dimension pt pt@curve p11 "+<>" 3);箭头及线颜色3 绿色
    ;   (command "_.pline" P11 pc "")
      );end progn
      );end if

    (if(< (distance pt pc) (distance pt@curve pc));如果欠挖
      (progn
      (setq p11(polar pt(angle pt pt@curve ) (* 3 (distance pt pt@curve))))
      ;(make-dimension pt@curve pt p11 "隧道欠挖-")
      (make-dimension pt@curve pt p11 "-<>" 1);箭头及线颜色1 红色
     ;  (command "_.pline" Pt p11 "")
      );end progn
      );end if

    );end foreach

  (setvar "osmode" osm)
  (princ)  
  );end defun

;;;sub-routine1
(defun find-centerpoint(en / po-li n y pc)
  (setq entda(entget en)
        ename(cdr(assoc 0 entda)))
  (if(= ename "CIRCLE")
    (setq pc(cdr(assoc 10 entda)))
    (progn
      (setq po-li (vl-remove-if 'not (mapcar '(lambda (x) (if (= (car x) 10) (cdr x))) entda)))
      (setq n(length po-li))  
      (setq y(apply 'mapcar (cons '+ po-li)))
      (setq pc(mapcar '/ y (list n n n)))
      );progn
    );end if
  );end defun

;;;sub-routine2
(defun make-dimension (p14 p13 p11 dimsty ys)
  (entmake (list '(0 . "DIMENSION")
                 '(100 . "AcDbEntity")
                 '(100 . "AcDbDimension")                 
                  (cons 10 p14)
                  (cons 11 p11)
                 '(70 . 33)
                  (cons 1 dimsty);前缀符号
                  (cons 3 "超欠挖")
                 '(100 . "AcDbAlignedDimension")
                 (cons 13 p13)
                 (cons 14 p14)
                 (cons 62 ys) ;箭头及线颜色
                 )
           );endmake  
  );end defun

;;;sub-routine3
;;;间隔N个数取点表
(defun get-new-point-list(li n / s-li i k)
  (setq s-li nil i 0 k (1+ n))

  (while(nth i li)
    (setq s-li(cons (nth i li) s-li))
    (setq i(+ i k))
    );end while

  (reverse s-li)
  );end defun
 楼主| 发表于 2024-6-19 19:06:45 | 显示全部楼层

;文件名:PB.lsp
;;功能说明:标注实际开挖线各点与设计开挖线之间的距离
;;;修改时间:2015-01-07  ss en v-en pc ss1 en1 po-li n p11 pt pt@curve osm

(vl-load-com)
(defun c:PB(/ )  
  (setq osm (getvar "osmode"))  
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)  

  (while
    (progn
      (prompt "\n请选择设计开挖线:")
      (not(setq ss(ssget ":s" '((0 . "CIRCLE,*POLYLINE")))))
        );end progn
    (prompt "\n<<<<未选择到正确的对象,请重新选择!>>>>")
  );end while

  (setq en(ssname ss 0)
        v-en(vlax-ename->vla-object en)
    )  
  (setq pc(find-centerpoint en));找设计开挖线的型心

  (while(progn(prompt "\n请选择实际开挖线:")
                (not(setq ss1(ssget ":s" '((0 . "*POLYLINE")))))
        );end progn
    (prompt "\n<<<<未选择到正确的对象,请重新选择!>>>>")
  );end while

  (setq en1(ssname ss1 0))
  (setq po-li (vl-remove-if 'not (mapcar '(lambda (x) (if (= (car x) 10) (cdr x))) (entget en1))));取多段线顶点表

  (initget 6)
  (setq n (getint "\n 请输入实际开挖线上标注间隔数(默认为0):"))
  (if(null n)(setq n 0))

  (if(/= n 0)(setq po-li(get-new-point-list po-li n)));end if

  (foreach pt po-li   
    (setq pt@curve(vlax-curve-getClosestPointTo v-en pt))

    (if(> (distance pt pc) (distance pt@curve pc));如果超挖
      (progn
      (setq p11 (polar pt@curve (angle pt@curve pt) (* 2 (distance pt pt@curve))))
      ;(make-dimension pt pt@curve p11 "隧道超挖+")
      (make-dimension pt pt@curve p11)
    ;   (command "_.pline" P11 pc "")
      );end progn
      );end if

    (if(< (distance pt pc) (distance pt@curve pc));如果欠挖
      (progn
      (setq p11(polar pt(angle pt pt@curve ) (* 3 (distance pt pt@curve))))
;(make-dimension pt@curve pt p11 "隧道欠挖-")
(make-dimension pt@curve pt p11)
     ;  (command "_.pline" Pt p11 "")
      );end progn
      );end if

    );end foreach

  (setvar "osmode" osm)
  (princ)  
  );end defun

;;;sub-routine1
(defun find-centerpoint(en / po-li n y pc)
  (setq entda(entget en)
        ename(cdr(assoc 0 entda)))
  (if(= ename "CIRCLE")
    (setq pc(cdr(assoc 10 entda)))
    (progn
      (setq po-li (vl-remove-if 'not (mapcar '(lambda (x) (if (= (car x) 10) (cdr x))) entda)))
      (setq n(length po-li))  
      (setq y(apply 'mapcar (cons '+ po-li)))
      (setq pc(mapcar '/ y (list n n n)))
      );progn
    );end if
  );end defun

;;;sub-routine2
(defun make-dimension (p13 p14 p11 dimsty)
  (entmake (list '(0 . "DIMENSION")
                 '(100 . "AcDbEntity")
                 '(100 . "AcDbDimension")                 
                  (cons 10 p14)
                  (cons 11 p11)
                 '(70 . 33)
                 '(1 . "")
                  (cons 3 dimsty)
                 '(100 . "AcDbAlignedDimension")
                 (cons 13 p13)
                 (cons 14 p14)
                 )
           );endmake  
  );end defun

;;;sub-routine3
;;;间隔N个数取点表
(defun get-new-point-list(li n / s-li i k)
  (setq s-li nil i 0 k (1+ n))

  (while(nth i li)
    (setq s-li(cons (nth i li) s-li))
    (setq i(+ i k))
    );end while

  (reverse s-li)
  );end defun
发表于 2024-6-19 11:30:13 | 显示全部楼层
优化啥东西,得说清楚用文字或者图的形式
发表于 2024-6-19 14:54:55 | 显示全部楼层
没图。哎。可惜
 楼主| 发表于 2024-6-19 18:49:55 | 显示全部楼层
想要这种效果,欠挖未负。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2024-6-19 19:07:53 | 显示全部楼层
这是网上找的不知道哪里有问题
 楼主| 发表于 2024-6-19 19:09:32 | 显示全部楼层
错误应该是在make-dimension这个子程序中(或者说子函数),说有四个参数,主程序中只给了三个参量
发表于 2024-6-20 08:38:21 | 显示全部楼层
修改后的效果如下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

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

GMT+8, 2024-11-25 15:59 , Processed in 0.190921 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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