lizhgang.jin 发表于 2014-12-29 12:28:13

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

各位高手,我是搞隧道施工的,做隧道断面图时监理要求我们在图上把超欠挖尺寸标出来,便于查看。我们以前都是一个个标。效率太低了。想请教一下论坛的高手能否帮忙编写一个小工具什么都可以,CAD能加载就行。要求达到的功能就是把实测断面线(多断线)的顶点,到设计开挖线(可能是圆或圆和多断线)间的尺寸,大于设计线加正号,小于设计线加负号。(标注点号最好能设置间隔几点)我发了一个参考图,就是想达到的效果,希望高手不吝时间,帮忙解决一下。谢谢!

dwp@hamco 发表于 2014-12-29 12:28:14

;文件名:ddd.lsp
;;功能说明:标注实际开挖线各点与设计开挖线之间的距离
;;;修改时间:2015-01-07

(vl-load-com)
(defun c:ddd(/ ss en v-en pc ss1 en1 po-li n p11 pt pt@curve osm)
(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 "隧道超挖+")
      );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 "隧道欠挖-")
      );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

csharp 发表于 2014-12-29 13:31:37

实测的点是什么形式?你都在图上画好了?

口味虾 发表于 2014-12-29 19:09:14

这个mark下,还要加班,回家了写一下。

lizhgang.jin 发表于 2015-1-6 09:10:05

节过完了,不知兄台弄成了没有,小兄盼望之急。

lizhgang.jin 发表于 2015-1-6 09:11:59

实测点我都画好了,就是用X,Y数据文件定完基点后用多段线画出,多段线顶点就是各各实测坐标了。

lizhgang.jin 发表于 2015-1-6 09:12:54

现在就是要标注一下,如果能编出连绘图一起搞的插件那就非常完美了。

zxq0220 发表于 2015-1-6 10:48:59

怎样标?给个图样或图片。

dwp@hamco 发表于 2015-1-6 17:14:14

;文件名:dbz.lsp
;;功能说明:标注所选点与设计开挖线之间的距离
;;;时间:2015-01-06

(vl-load-com)
(defun c:dbz(/ ss en v-en pc pt pt@curve osm)
(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)) ;找设计开挖线的型心

(setvar "osmode" 59)

(setq pt t)

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

    (if(< (distance pt pc) (distance pt@curve pc));如果欠挖
      (command "-dimstyle" "r" "隧道欠挖-"));end if
   
    (make-dimension pt pt@curve)
    );end progn
    );end if   
    );end while
(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)
(entmake (list '(0 . "DIMENSION")
               '(100 . "AcDbEntity")
               '(100 . "AcDbDimension")               
                  (cons 10 p14)
                  (cons 11 (polar p14 (angle p14 p13) (* (distance p14 p13) 2) ))
               '(70 . 33)
               '(1 . "")
               '(100 . "AcDbAlignedDimension")
               (cons 13 p13)
               (cons 14 p14)
               )
           );endmake
);end defun

dwp@hamco 发表于 2015-1-6 17:15:03

各位大大,我写了一个比较粗糙的程序,算是抛砖引玉吧

lizhgang.jin 发表于 2015-1-6 17:25:13

大师刚才试了一下您的代码,有两个问题,一是标注欠挖显示在图形内侧了,有点不美观,要都在外面就好了。二个问题是比我们以前一个个两点量快点了,要是能自动批量就好了。在程序中先选择设计线,再选择实际线,然后选择隔几点标注,然后就自动标好了,那就美了。个人建议,还是很感谢大师百忙之中来解决我的问题,希望大师能完美一下。谢谢。

lizhgang.jin 发表于 2015-1-6 17:27:57

所有的标注线都是开挖线到设计线的垂线。开挖线为多断线,实测点为多断线顶点。

lizhgang.jin 发表于 2015-1-6 17:29:02

设计线和开挖线均为闭合的

lizhgang.jin 发表于 2015-1-6 17:30:14

各位大师我想要达到的样式在我发的附件示列里了

dwp@hamco 发表于 2015-1-6 17:31:23

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

嗯,刚才你说的这两点,改起来不算难。
页: [1] 2 3
查看完整版本: 求助论坛高手帮忙编制一个批量标注CAD断面图超欠挖插件