明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

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

[测绘] 隧道超欠挖标注

[复制链接]
发表于 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 09:12:05 | 显示全部楼层
cjf160204 发表于 2024-6-19 18:49
想要这种效果,欠挖未负。

你用道路之星啊。他是免费的软件 可以自动绘制的
 楼主| 发表于 2024-6-21 14:16:24 | 显示全部楼层
技术工作室 发表于 2024-6-20 08:29
试一试看看是不是你要的效果
;文件名:PB.lsp
;;功能说明:标注实际开挖线各点与设计开挖线之间的距离

运行不了啊
 楼主| 发表于 2024-6-21 14:17:33 | 显示全部楼层

标注样式要怎么设置
 楼主| 发表于 2024-6-21 14:19:19 | 显示全部楼层

效果这样就行啊
 楼主| 发表于 2024-6-21 14:26:30 | 显示全部楼层

可以了谢谢
 楼主| 发表于 2024-6-21 14:45:48 | 显示全部楼层

大神能帮我看看以下代码,圆心,圆弧起点,弧长画圆狐,我需要画隧道圆弧一般是知道半径和角度(角度为度分秒形式)
(defun c:ale( / cen pt1 r lenth ang )
(setq cen (getpoint"\n请输入圆心"))
(setq pt1 (getpoint cen "\n请输入圆弧起点"))
(setq r (distance cen pt1))
(setq lenth(getreal "\n请输入弧长"))
(setq ang (* 180 (/ lenth r pi)))
(command "arc""c"cen pt1 "a" ang) )
 楼主| 发表于 2024-6-21 18:04:40 | 显示全部楼层
cjf160204 发表于 2024-6-21 14:45
大神能帮我看看以下代码,圆心,圆弧起点,弧长画圆狐,我需要画隧道圆弧一般是知道半径和角度(角度为度 ...

(defun c:ac ()
(entmake
        (list '(0 . "ARC")
                (cons 10 (setq cen (getpoint "\n指定圆心")))
                (cons 40 (getdist cen "\n指定半径"))
                (cons 50 (setq sang (angle cen (getpoint cen "\n指定起点"))))
                (cons 51 (+ sang (* pi (/ (getreal "\n指定角度(°)") 180.0))))
        )
)
)
 楼主| 发表于 2025-2-6 20:18:24 | 显示全部楼层
(vl-load-com)

(defun c:bz (/ osm ss ss1 en v-en pc en1 po-li n pt pt@curve p11 dims)
  (setq osm (getvar "osmode"))
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)

  ;; 选择设计开挖线
  (setq ss (ssget "_:S" '((0 . "CIRCLE,*POLYLINE"))))
  (if (not ss)
    (progn
      (prompt "\n<<<<未选择到正确的对象,请重新选择!>>>>")
      (exit)
    )
  )
  (setq en (ssname ss 0)
        v-en (vlax-ename->vla-object en)
        pc (find-centerpoint en)
  )

  ;; 选择实际开挖线
  (setq ss1 (ssget "_:S" '((0 . "*POLYLINE"))))
  (if (not ss1)
    (progn
      (prompt "\n<<<<未选择到正确的对象,请重新选择!>>>>")
      (exit)
    )
  )
  (setq en1 (ssname ss1 0)
        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)))

  ;; 收集标注数据
  (setq dims '())
  (foreach pt po-li
    (setq pt@curve (if (= (cdr (assoc 0 (entget en))) "CIRCLE")
                       (get-closest-point-to-circle pc (cdr (assoc 40 (entget en))) pt)
                       (vlax-curve-getClosestPointTo v-en pt)
                   )
    )
    (if (> (distance pt pc) (distance pt@curve pc))
      (setq dims (cons (list pt pt@curve (polar pt@curve (angle pt@curve pt) (* 2 (distance pt pt@curve))) "+<>" 3) dims))
    )
    (if (< (distance pt pc) (distance pt@curve pc))
      (setq dims (cons (list pt@curve pt (polar pt (angle pt pt@curve) (* 3 (distance pt pt@curve))) "-<>" 1) dims))
    )
  )

  ;; 创建标注
  (foreach dim dims
    (make-dimension (nth 0 dim) (nth 1 dim) (nth 2 dim) (nth 3 dim) (nth 4 dim))
  )

  ;; 恢复设置
  (setvar "osmode" osm)
  (princ)
)

;;; 子程序:计算型心
(defun find-centerpoint (en / pc)
  (setq entda (entget en))
  (setq 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)))
    )
  )
  pc
)

;;; 子程序:获取多段线顶点的间隔点
(defun get-new-point-list (li n / s-li i k)
  (setq s-li '() i 0 k (1+ n))
  (while (< i (length li))
    (setq s-li (cons (nth i li) s-li))
    (setq i (+ i k))
  )
  (reverse s-li)
)

;;; 子程序:创建标注
(defun make-dimension (p1 p2 p3 dimtext color)
  (entmake (list '(0 . "DIMENSION")
                 '(100 . "AcDbEntity")
                 '(100 . "AcDbDimension")
                 (cons 10 p1)
                 (cons 11 p3)
                 '(70 . 33)
                 (cons 1 dimtext)
                 (cons 3 "超欠挖")
                 '(100 . "AcDbAlignedDimension")
                 (cons 13 p2)
                 (cons 14 p1)
                 (cons 62 color)
                 )
           )
)

;;; 子程序:计算点到圆的最近点
(defun get-closest-point-to-circle (circle-pt radius pt)
  (let ((dx (- (car pt) (car circle-pt)))
        (dy (- (cadr pt) (cadr circle-pt))))
    (list (+ (car circle-pt) (* dx (/ radius (sqrt (+ (* dx dx) (* dy dy))))))
          (+ (cadr circle-pt) (* dy (/ radius (sqrt (+ (* dx dx) (* dy dy)))))))
  )
)

(princ "\n超欠挖标注工具已加载。输入命令 'bz' 开始使用。")
(princ)
回复 支持 反对

使用道具 举报

发表于 2025-2-7 09:28:44 | 显示全部楼层
cjf160204 发表于 2025-2-6 20:18
(vl-load-com)

(defun c:bz (/ osm ss ss1 en v-en pc en1 po-li n pt pt@curve p11 dims)

(let ((dx (- (car pt) (car circle-pt)).......... let函数是?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-23 04:47 , Processed in 0.161590 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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