找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 13005|回复: 41

[已解决] 求助论坛高手帮忙编制一个批量标注CAD断面图超欠挖插件

[复制链接]
发表于 2014-12-29 12:28:13 | 显示全部楼层 |阅读模式
悬赏20D豆已解决
各位高手,我是搞隧道施工的,做隧道断面图时监理要求我们在图上把超欠挖尺寸标出来,便于查看。我们以前都是一个个标。效率太低了。想请教一下论坛的高手能否帮忙编写一个小工具什么都可以,CAD能加载就行。要求达到的功能就是把实测断面线(多断线)的顶点,到设计开挖线(可能是圆或圆和多断线)间的尺寸,大于设计线加正号,小于设计线加负号。(标注点号最好能设置间隔几点)我发了一个参考图,就是想达到的效果,希望高手不吝时间,帮忙解决一下。谢谢!

示列.rar

98.7 KB, 下载次数: 102, 下载积分: D豆 -1 , 活跃度 1

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2014-12-29 12:28:14 | 显示全部楼层
  1. ;文件名:ddd.lsp
  2. ;;功能说明:标注实际开挖线各点与设计开挖线之间的距离
  3. ;;;修改时间:2015-01-07

  4. (vl-load-com)
  5. (defun c:ddd(/ ss en v-en pc ss1 en1 po-li n p11 pt pt@curve osm)  
  6.   (setq osm (getvar "osmode"))  
  7.   (setvar "cmdecho" 0)
  8.   (setvar "osmode" 0)  

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

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

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

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

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

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

  29.   (foreach pt po-li   
  30.     (setq pt@curve(vlax-curve-getClosestPointTo v-en pt))
  31.    
  32.     (if(> (distance pt pc) (distance pt@curve pc));如果超挖
  33.       (progn
  34.       (setq p11(polar pt@curve (angle pt@curve pt) (* 2 (distance pt pt@curve))))
  35.       (make-dimension pt pt@curve p11 "隧道超挖+")
  36.       );end progn
  37.       );end if

  38.     (if(< (distance pt pc) (distance pt@curve pc));如果欠挖
  39.       (progn
  40.       (setq p11(polar pt(angle pt pt@curve ) (* 3 (distance pt pt@curve))))
  41.       (make-dimension pt@curve pt p11 "隧道欠挖-")
  42.       );end progn
  43.       );end if
  44.       
  45.     );end foreach
  46.   
  47.   (setvar "osmode" osm)
  48.   (princ)  
  49.   );end defun

  50. ;;;sub-routine1
  51. (defun find-centerpoint(en / po-li n y pc)
  52.   (setq entda(entget en)
  53.         ename(cdr(assoc 0 entda)))
  54.   (if(= ename "CIRCLE")
  55.     (setq pc(cdr(assoc 10 entda)))
  56.     (progn
  57.       (setq po-li (vl-remove-if 'not (mapcar '(lambda (x) (if (= (car x) 10) (cdr x))) entda)))
  58.       (setq n(length po-li))  
  59.       (setq y(apply 'mapcar (cons '+ po-li)))
  60.       (setq pc(mapcar '/ y (list n n n)))
  61.       );progn
  62.     );end if
  63.   );end defun

  64. ;;;sub-routine2
  65. (defun make-dimension (p13 p14 p11 dimsty)
  66.   (entmake (list '(0 . "DIMENSION")
  67.                  '(100 . "AcDbEntity")
  68.                  '(100 . "AcDbDimension")                 
  69.                   (cons 10 p14)
  70.                   (cons 11 p11)
  71.                  '(70 . 33)
  72.                  '(1 . "")
  73.                   (cons 3 dimsty)
  74.                  '(100 . "AcDbAlignedDimension")
  75.                  (cons 13 p13)
  76.                  (cons 14 p14)
  77.                  )
  78.            );endmake  
  79.   );end defun

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

  84.   (while(nth i li)
  85.     (setq s-li(cons (nth i li) s-li))
  86.     (setq i(+ i k))
  87.     );end while
  88.   
  89.   (reverse s-li)
  90.   );end defun

点评

下载试用了一下,2004CAD上不能运行。  详情 回复 发表于 2015-10-25 18:05
老师您的程序试用了,很好很方便。如果你有空的话还可以有个小改动,就是我标完一个图后,下一个图标的时候,选间隔几点不用重输入。程序已经很满意了,谢谢老师。  详情 回复 发表于 2015-1-7 10:04
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-12-29 13:31:37 来自手机 | 显示全部楼层
实测的点是什么形式?你都在图上画好了?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 191个

财富等级: 日进斗金

发表于 2014-12-29 19:09:14 | 显示全部楼层
这个mark下,还要加班,回家了写一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2015-1-6 09:10:05 | 显示全部楼层
节过完了,不知兄台弄成了没有,小兄盼望之急。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2015-1-6 09:11:59 | 显示全部楼层
实测点我都画好了,就是用X,Y数据文件定完基点后用多段线画出,多段线顶点就是各各实测坐标了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2015-1-6 09:12:54 | 显示全部楼层
现在就是要标注一下,如果能编出连绘图一起搞的插件那就非常完美了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 9789个

财富等级: 富甲天下

发表于 2015-1-6 10:48:59 | 显示全部楼层
怎样标?给个图样或图片。

点评

兄台样式在我发的CAD附件里面了,麻烦查看了  详情 回复 发表于 2015-1-6 19:41
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2015-1-6 17:14:14 | 显示全部楼层
  1. ;文件名:dbz.lsp
  2. ;;功能说明:标注所选点与设计开挖线之间的距离
  3. ;;;时间:2015-01-06

  4. (vl-load-com)
  5. (defun c:dbz(/ ss en v-en pc pt pt@curve osm)  
  6.   (setq osm (getvar "osmode"))
  7.   
  8.   (setvar "cmdecho" 0)
  9.   (setvar "osmode" 0)  

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

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

  19.   (setvar "osmode" 59)

  20.   (setq pt t)

  21.   (while pt
  22.     (setq pt(getpoint "\n请在实际开挖线上点选开挖点:"))
  23.    
  24.     (if pt (progn
  25.              
  26.     (setq pt@curve(vlax-curve-getClosestPointTo v-en pt))
  27.     (if(> (distance pt pc) (distance pt@curve pc));如果超挖
  28.       (command "-dimstyle" "r" "隧道超挖+"));end if

  29.     (if(< (distance pt pc) (distance pt@curve pc));如果欠挖
  30.       (command "-dimstyle" "r" "隧道欠挖-"));end if
  31.    
  32.     (make-dimension pt pt@curve)
  33.     );end progn
  34.     );end if   
  35.     );end while  
  36.   (setvar "osmode" osm)
  37.   (princ)  
  38.   );end defun

  39. ;;;sub-routine1
  40. (defun find-centerpoint(en / po-li n y pc)
  41.   (setq entda(entget en)
  42.         ename(cdr(assoc 0 entda)))
  43.   (if(= ename "CIRCLE")
  44.     (setq pc(cdr(assoc 10 entda)))
  45.     (progn
  46.       (setq po-li (vl-remove-if 'not (mapcar '(lambda (x) (if (= (car x) 10) (cdr x))) entda)))
  47.       (setq n(length po-li))  
  48.       (setq y(apply 'mapcar (cons '+ po-li)))
  49.       (setq pc(mapcar '/ y (list n n n)))
  50.       );progn
  51.     );end if
  52.   );end defun

  53. ;;;sub-routine2
  54. (defun make-dimension (p13 p14)
  55.   (entmake (list '(0 . "DIMENSION")
  56.                  '(100 . "AcDbEntity")
  57.                  '(100 . "AcDbDimension")                 
  58.                   (cons 10 p14)
  59.                   (cons 11 (polar p14 (angle p14 p13) (* (distance p14 p13) 2) ))
  60.                  '(70 . 33)
  61.                  '(1 . "")
  62.                  '(100 . "AcDbAlignedDimension")
  63.                  (cons 13 p13)
  64.                  (cons 14 p14)
  65.                  )
  66.            );endmake  
  67.   );end defun

评分

参与人数 1D豆 +5 收起 理由
newer + 5 热心帮忙奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2015-1-6 17:15:03 | 显示全部楼层
各位大大,我写了一个比较粗糙的程序,算是抛砖引玉吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2015-1-6 17:25:13 | 显示全部楼层
大师刚才试了一下您的代码,有两个问题,一是标注欠挖显示在图形内侧了,有点不美观,要都在外面就好了。二个问题是比我们以前一个个两点量快点了,要是能自动批量就好了。在程序中先选择设计线,再选择实际线,然后选择隔几点标注,然后就自动标好了,那就美了。个人建议,还是很感谢大师百忙之中来解决我的问题,希望大师能完美一下。谢谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2015-1-6 17:27:57 | 显示全部楼层
所有的标注线都是开挖线到设计线的垂线。开挖线为多断线,实测点为多断线顶点。

点评

嗯,刚才你说的这两点,改起来不算难。  详情 回复 发表于 2015-1-6 17:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2015-1-6 17:29:02 | 显示全部楼层
设计线和开挖线均为闭合的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2015-1-6 17:30:14 | 显示全部楼层
各位大师我想要达到的样式在我发的附件示列里了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2015-1-6 17:31:23 | 显示全部楼层
lizhgang.jin 发表于 2015-1-6 17:27
所有的标注线都是开挖线到设计线的垂线。开挖线为多断线,实测点为多断线顶点。

嗯,刚才你说的这两点,改起来不算难。

点评

大师今天没看到你的大作,试了一下另外两位老师的程序,运行不了,还是您的最符合心意,期盼您的改进版。  详情 回复 发表于 2015-1-7 09:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-20 01:55 , Processed in 0.341105 second(s), 64 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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