找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 694|回复: 12

[编程申请]:如何将三段圆弧及一段直线围成的封闭形定义成面域?

[复制链接]
发表于 2004-12-20 14:23:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
我做了一个三心圆(形成由三段圆弧和一段直线围成的区域)的隧道设计断面图,在上面套上了隧道实际的轮廓线,现在想要计算出超挖(位于设计线之外部分)面积和欠挖(位于设计线之内部分)面积,请问:怎么样在代码中实现上述问题的解决方法?谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-12-20 15:04:39 | 显示全部楼层
i 不用编程,CAD自带的,面域命令,boundary
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-12-20 16:01:37 | 显示全部楼层
我是用程序画的三段圆弧和一段直线围成的区域,用boundary 命令不行啊,提示未找到有效边界点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-20 20:42:57 | 显示全部楼层
发个图,叙述起来多简单!
先用boundary 命令,再用REGION命令,应该没问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-21 01:24:02 | 显示全部楼层
(command ".region" ss ""))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-12-21 09:36:11 | 显示全部楼层
我把我的问题画了一张图,高手有空帮我看一下,问题如下:我在编一个隧道净空检测程序,图中红蓝圆弧及底边为设计隧道断面线,由三段圆弧和一段直线围以程序控制绘制,白色为实际开挖轮廓线,现在要求出实际开挖断面面积、超挖(位于设计断面线之外部分)面积、欠挖(位于设计断面线之内部分)面积,并分别标注在图形内,对于超欠点还要标注其距设计断面线的距离。谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-21 10:43:36 | 显示全部楼层
又要求人又不把已有代码拿出来分析,让别人写好你拿现成的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-12-21 11:34:04 | 显示全部楼层
7楼的误会了,我想有高手能提供一些思路啊,我现在是想求取实际断面线和设计断面线的并集之面积减去设计面积得出超挖面积,进而可以求出欠挖面积。但是求并集要求先定义域啊,我的设计轮廓线是三段圆弧和一段直线围,不能定义域啊,这才是问题的关键,也是我最想求助的嘛,至于完整和具体的实现方法,我想见仁见智,自己也可以嘛。
(defun c:sanxinyuan ()
  (setq        r1 (getreal "请输入半径:")
        r2 (+ r1 1.25)
  )
  (setq        o1 (getpoint "请指定上圆心点:")
        x1 (car o1)
        y1 (cdr o1)
        y1 (car y1)                        ;指定上圆心点位置
  )
  (setq        x2 (- x1 1.083)
        y2 (- y1 0.625)
        o2 (list x2 y2)                        ;指定左下圆心点位置
  )
  (setq o3 (list (+ x1 1.083) (- y1 0.625))) ;指定右下圆心点位置
  (setq p1 (- (sqrt (- (* r2 r2) (* 1.025 1.025))) 1.083))
                                        ;计算左圆弧起点、右圆弧终点距衬砌中线的平距
  (setq        lq (list (- x1 p1) (- y1 1.65))        ;指定左圆弧起点坐标
        rq (list (+ x1 p1) (- y1 1.65))        ;指定右圆弧终点坐标
  )
  (setq        p2 (* r1 (sin (/ pi 3)))        ;计算上圆弧起终点距衬砌中线平距
        h1 (* r1 (cos (/ pi 3)))        ;计算上圆弧起终点距上圆心高差
  )
  (setq        ld (list (- x1 p2) (+ y1 h1))        ;指定上圆弧左端点坐标
        rd (list (+ x1 p2) (+ y1 h1))        ;指定上圆弧右端点坐标
  )
  (setq jd (list x1 (- y1 1.65)))        ;指定衬砌中线上设计高程处坐标
  (command "arc" ld "c" o3 lq)                ;绘制右圆弧
  (command "arc" rd "c" o1 ld)                ;绘制左圆弧
  (command "arc" rq "c" o2 rd)                ;绘制上圆弧
  (command "line" lq rq "")                ;绘制设计高程水平线
  (command "pline" o1 o2 o3 "c")        ;绘制圆心三角形
                                        ;以下用于计算设计开挖面积
  (setq        a1 (atan (/ 1.025 (+ p1 1.083)))
        a2 (+ a1 (/ pi 6.0))
  )
  (setq area1 (/ (* pi r1 r1) 3))
  (setq area2 (* (* pi r2 r2) (/ a2 (* 2 pi))))
  (setq        dibian(+ 0.625 (* 1.083 (/ (sin a1) (cos a1)))))
  (setq area3 (* 1.083 dibian))
  (setq h2 (- 1.65 dibian))
  (setq area4 (* p1 h2))
  (setq area5 (- (+ area1 (* 2 area2) area4 ) area3))
  (setq ptext (list  x1  (+ y1 0.6) ))
  (setq areas (rtos area5))
  (setq sarea ( strcat  "设计面积为 " areas   " 平方米" ))
  (command "text" "s" "china" "j"  "mc" ptext 0.15 0   sarea  "" "")
  )
这是我画设计断面线的代码,请指正,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-21 13:53:18 | 显示全部楼层
以上程序画出的断面根本就不闭合,小心漏水或塌方!呵呵……
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-12-21 15:34:44 | 显示全部楼层
通过努力,完善了以下代码,可以求取设计断面的面积了,也可以闭合了,不会漏水了。。。只是最后一行的文字样式要先设置好,能在代码中设计吗?谢谢。。。
(defun c:sanxinyuan()
  (setq        r1 (getreal "请输入半径:")
        r2 (+ r1 1.25)
  )
  (setq        o1 (getpoint "请指定上圆心点:")
        x1 (car o1)
        y1 (cdr o1)
        y1 (car y1)                        ;指定上圆心点位置
  )
  (setq        x2 (- x1 1.083)
        y2 (- y1 0.625)
        o2 (list x2 y2)                        ;指定左下圆心点位置
  )
  (setq o3 (list (+ x1 1.083) (- y1 0.625))) ;指定右下圆心点位置
  (setq p1 (- (sqrt (- (* r2 r2) (* 1.025 1.025))) 1.083))
                                        ;计算左圆弧起点、右圆弧终点距衬砌中线的平距
  (setq        lq (list (- x1 p1) (- y1 1.65))        ;指定左圆弧起点坐标
        rq (list (+ x1 p1) (- y1 1.65))        ;指定右圆弧终点坐标
  )
  (setq        p2 (* r1 (sin (/ pi 3)))        ;计算上圆弧起终点距衬砌中线平距
        h1 (* r1 (cos (/ pi 3)))        ;计算上圆弧起终点距上圆心高差
  )
  (setq        ld (list (- x1 p2) (+ y1 h1))        ;指定上圆弧左端点坐标
        rd (list (+ x1 p2) (+ y1 h1))        ;指定上圆弧右端点坐标
  )
  (setq jd (list x1 (- y1 1.65)))        ;指定衬砌中线上设计高程处坐标

  (command "arc" ld "c" o3 lq)                ;绘制右圆弧
  (setq rightarc (entlast))

  (command "arc" rd "c" o1 ld)                ;绘制上圆弧
  (setq uparc (entlast))

  (command "arc" rq "c" o2 rd)                ;绘制左圆弧
  (setq leftarc (entlast))


  (command "line" lq rq "")                ;绘制设计高程水平线
  (setq downline (entlast))

  (command "pline" o1 o2 o3 "c")        ;绘制圆心三角形

                                        ;以下用于计算设计开挖面积
  (command "pedit" "" "m" leftarc uparc        rightarc downline "" "y" "j" ""
           "c" "");合并三段圆弧及设计高处底边为一条闭合的多段线
  (setq shejidmx (entlast))
  (command "region" shejidmx "");设置面域
  (setq shejidmx (entlast))
  (command "area" "o" shejidmx)
  (setq area5 (getvar "area"));计算并求取设计断面的面积

  (setq ptext (list x1 (+ y1 0.6)))
  (setq areas (rtos area5))
  (setq sarea (strcat "设计面积为 " areas " 平方米"))
  (command "text" "s" "china" "j" "mc" ptext 0.15  sarea "" "");在指定位置标注设计断面的面积
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-21 15:54:31 | 显示全部楼层
你编得太复杂了。给你点启示。
(command "-boundary" "A" "O" "P" "I" "Y" "B" "E" "" p1 "")
   (setq b (entlast))其中p1为图内你要求面积的任一点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-21 18:00:55 | 显示全部楼层

  1. ;; 测试环境 AutoCAD 2005 + SP1 & AutoCAD R14
  2. ;;基本编程,用 command 命令完成,实际就是将手动的步骤用程序完成
  3. ;;关于赋值用下面的思路更好些,初学时养成好习惯对后面的提高有好处
  4. ;;还有程序结构也要多看一些好的程序
  5. ;;以下程序没有添加出错处理和Undo处理
  6. (defun c:syx (/            area  area1        e     e0    e1          e2        h1    jd
  7.               ld    lq          o1        o2    o3    oldosnap        p1    p2
  8.               ptext r1          r2        rd    rq    sarea
  9.              )
  10.              ;|(setq        r1 (getreal "请输入半径:")
  11.         r2 (+ r1 1.25)
  12.   )
  13.   (setq        o1 (getpoint "请指定上圆心点:")
  14.         x1 (car o1)
  15.         y1 (cdr o1)
  16.         y1 (car y1)                        ;指定上圆心点位置
  17.   )|;
  18.   (setvar "cmdecho" 0)
  19.   (if (and (setq o1 (getpoint "\n请指定圆心点<Exit>: "))
  20.            (setq r1 (getdist "\n直径<Exit>: "))
  21.       )
  22.     (progn
  23.       (setq r2 (+ r1 1.25))
  24.       (setq o2 (mapcar '+ o1 '(-1.083 -0.625 0.)))
  25.       ;|
  26.       (setq        x2 (- x1 1.083)
  27.                      y2 (- y1 0.625)
  28.                 o2 (list x2 y2)                        ;指定左下圆心点位置
  29.       )
  30.       |;
  31.       (setq o3 (mapcar '+ o1 '(1.083 -0.625 0.)))
  32.       ;;(setq o3 (list (+ x1 1.083) (- y1 0.625))) ;指定右下圆心点位置
  33.       ;;计算左圆弧起点、右圆弧终点距衬砌中线的平距
  34.       (setq p1 (- (sqrt (- (* r2 r2) (* 1.025 1.025))) 1.083))
  35.       ;|                                       
  36.       (setq lq (list (- x1 p1) (- y1 1.65)) ;指定左圆弧起点坐标
  37.             rq (list (+ x1 p1) (- y1 1.65)) ;指定右圆弧终点坐标
  38.       )
  39.       |;
  40.       (setq lq (mapcar '+ o1 (list (- p1) -1.65 0.))
  41.             rq (mapcar '+ o1 (list p1 -1.65 0.))
  42.       )
  43.       (setq p2 (* r1 (sin (/ pi 3))) ;_计算上圆弧起终点距衬砌中线平距
  44.             h1 (* r1 (cos (/ pi 3))) ;_计算上圆弧起终点距上圆心高差
  45.       )
  46.       ;|
  47.       (setq ld (list (- x1 p2) (+ y1 h1)) ;指定上圆弧左端点坐标
  48.             rd (list (+ x1 p2) (+ y1 h1)) ;指定上圆弧右端点坐标
  49.       )
  50.       |;
  51.       (setq ld (mapcar '+ o1 (list (- p2) h1 0.))
  52.             rd (mapcar '+ o1 (list p2 h1 0.))
  53.       )
  54.       ;;(setq jd (list x1 (- y1 1.65)))        ;_指定衬砌中线上设计高程处坐标
  55.       (setq jd (mapcar '+ o1 '(0. -1.65 0.)))
  56.       ;|
  57.       (command "arc" ld "c" o3 lq)        ;绘制右圆弧
  58.       (command "arc" rq "c" o2 rd)        ;绘制上圆弧
  59.       (command "arc" rd "c" o1 ld)        ;绘制左圆弧
  60.       (command "line" lq rq "")                ;绘制设计高程水平线
  61.       |;
  62.       (setq oldosnap (getvar "osmode"))
  63.       (setvar "osmode" 0)
  64.       (command ".pline"        rq "a" "ce" o2 rd "ce" o1 ld "ce" o3 lq        "l" "c")
  65.       (setq e (entlast)) ;_ Calc Area
  66.       (command ".area" "e" "l")
  67.       (command ".copy" "l" "" rd rd)
  68.       (command ".region" "l" "") ;_ 用于后面的面与运算
  69.       (setq e0 (entlast))
  70.       (command "pline" o1 o2 o3 "c")        ;绘制圆心三角形
  71.                                         ;以下用于计算设计开挖面积
  72.       ;|
  73.       (setq a1 (atan (/ 1.025 (+ p1 1.083)))
  74.             a2 (+ a1 (/ pi 6.0))
  75.       )
  76.       (setvar "osmode" oldosnap)
  77.       (setq area1 (/ (* pi r1 r1) 3))
  78.       (setq area2 (* (* pi r2 r2) (/ a2 (* 2 pi))))
  79.       (setq dibian (+ 0.625 (* 1.083 (/ (sin a1) (cos a1)))))
  80.       (setq area3 (* 1.083 dibian))
  81.       (setq h2 (- 1.65 dibian))
  82.       (setq area4 (* p1 h2))
  83.       (setq area5 (- (+ area1 (* 2 area2) area4) area3))
  84.       (setq ptext (list x1 (+ y1 0.6)))
  85.       (setq areas (rtos area5))
  86.       (setq sarea (strcat "设计面积为 " areas " 平方米"))
  87.       (command "text" "s" "china" "j" "mc" ptext 0.15 0        sarea "" "")
  88.       |;
  89.       (setq area (getvar "Area"))
  90.       (setq sarea (strcat "Area = " (rtos area)))
  91.       (setq ptext (mapcar '+ o1 '(0. 0.6 0.)))
  92.       (command ".text" "j" "mc" ptext 0.15 0 sarea)
  93.       (if (setq e1 (entsel "\n拾取封闭线: ")) ;_ 外围线
  94.         (progn
  95.           (command ".copy" e1 "" rd rd) ;_用副本运算
  96.           (command ".region" "l" "")
  97.           (command ".intersect" "l" e0 "") ;_ 求交集
  98.           (setq e2 (entlast))
  99.           (command ".area" "e" "l") ;_交集面积
  100.           (entdel (entlast))
  101.           (setq area1 (getvar "area"))
  102.           (princ "\n面积差 = ")
  103.           (princ (- area area1))
  104.         )
  105.       )
  106.     )
  107.   )
  108.   (princ)
  109. )
  110. ;;进阶程序, 使用 vla 方法可以不出现面域生成的提示, 增加出错处理
  111. ;;以下程序仅适用 AutoCAD 2000+ 以上
  112. (defun c:fsyx (/     area  area1 e     e0    e1           e2         h1    jd
  113.                ld    lq           o1         o2    o3    oldosnap         p1    p2
  114.                ptext r1           r2         rd    rq    sarea error olderror
  115.                doc   ms
  116.               )
  117.   (vl-load-com)
  118.   (defun error (msg)
  119.     (if        (/= msg "CANCEL")
  120.       (princ "\n*Cancel*")
  121.     )
  122.     (setvar "osmode" oldosmode)
  123.     (vla-endundomark Doc)
  124.     (princ)
  125.   )
  126.   (setq        oldosmode (getvar "osmode")
  127.         olderror  *error*
  128.         *error*          error
  129.         doc          (vlax-get-property (vlax-get-acad-object) 'activedocument)
  130.         ms          (vlax-get-property doc 'modelspace)
  131.   )
  132.   (vla-startundomark doc)
  133.   (setvar "cmdecho" 0)
  134.   (if (and (setq o1 (getpoint "\n请指定上圆心点<Exit>: "))
  135.            (setq r1 (getdist "\n直径<Exit>: "))          
  136.       )
  137.     (progn
  138.       (setq r2 (+ r1 1.25))
  139.       (setq o2 (mapcar '+ o1 '(-1.083 -0.625 0.))
  140.             o3 (mapcar '+ o1 '(1.083 -0.625 0.)) ;_指定右下圆心点位置
  141.       )
  142.       ;;计算左圆弧起点、右圆弧终点距衬砌中线的平距
  143.       (setq p1 (- (sqrt (- (* r2 r2) (* 1.025 1.025))) 1.083)
  144.             lq (mapcar '+ o1 (list (- p1) -1.65 0.))
  145.             rq (mapcar '+ o1 (list p1 -1.65 0.))
  146.             p2 (* r1 (sin (/ pi 3))) ;_计算上圆弧起终点距衬砌中线平距
  147.             h1 (* r1 (cos (/ pi 3))) ;_计算上圆弧起终点距上圆心高差
  148.             ld (mapcar '+ o1 (list (- p2) h1 0.))
  149.             rd (mapcar '+ o1 (list p2 h1 0.))
  150.             jd (mapcar '+ o1 '(0. -1.65 0.)) ;_指定衬砌中线上设计高程处坐标
  151.       )
  152.       (setvar "osmode" 0)
  153.       ;;这个线用 command 是最简单的
  154.       (command ".pline"        rq "a" "ce" o2 rd "ce" o1 ld "ce" o3 lq        "l" "c")
  155.       (setq area (vlax-curve-getarea (entlast)))
  156.       (command ".copy" "l" "" rd rd)
  157.       ;;也可以 (vla-copy (vlax-ename->vla-object (entlast)))
  158.       ;;代替 region 命令,不出现提示
  159.       (vla-addregion
  160.         ms
  161.         (vlax-make-variant
  162.           (vlax-safearray-fill
  163.             (vlax-make-safearray vlax-vbobject '(0 . 0))
  164.             (list (vlax-ename->vla-object (entlast)))
  165.           )
  166.         )
  167.       )
  168.       (setq reg1 (vlax-ename->vla-object (entlast)))
  169.       (command "pline" o1 o2 o3 "c")        ;绘制圆心三角形
  170.       (setq sarea (strcat "Area = " (rtos area)))
  171.       (setq ptext (mapcar '+ o1 '(0. 0.6 0.)))
  172.       (command ".text" "j" "mc" ptext 0.15 0 sarea) ;_ 此 text 在 14 和以上版本时使用方法好像略有不同
  173.       (if (and (setq e1 (entsel "\n拾取封闭线<退出>: ")) ;_ 外围线
  174.                (= (cdr (assoc 70 (entget (car e1)))) 1) ;_ 此处可以使用 ssget 选择形成闭合区域的线
  175.                                         ; 后面使用 vla 方法将选择集生成面域
  176.           )
  177.         (progn
  178.           ;;选择集的话用 copy 命令,单个实体也可以用 vla 方法
  179.           (command ".copy" e1 "" rd rd) ;_用副本运算
  180.           ;;addregion 返回的 safearray 记录了生成的所有面域
  181.           ;;如果用选择集还要判断是非生成面域
  182.           (vla-addregion
  183.             ms
  184.             (vlax-make-variant
  185.               (vlax-safearray-fill
  186.                 (vlax-make-safearray vlax-vbobject '(0 . 0))
  187.                 (list (vlax-ename->vla-object (entlast)))
  188.               )
  189.             )
  190.           )
  191.           ;;布尔运算,vla 操作不当会很危险
  192.           ;;前面使用选择集的情况下要判断 addregion 是否生成才进行下面的运算
  193.           (vla-boolean
  194.             reg1
  195.             acIntersection
  196.             (vlax-ename->vla-object (entlast))
  197.           )
  198.           (setq area1 (vlax-get-property reg 'area))
  199.           (princ "\n面积差 = ")
  200.           (princ (- area area1)) ;_ 生成的弧线减去原线的交叉部分
  201.         )
  202.       )
  203.     )
  204.   )
  205.   (setvar "osmode" oldosmode)
  206.   (setq *error* olderror)
  207.   (vla-endundomark doc)
  208.   (princ)
  209. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-12-21 20:18:31 | 显示全部楼层
通过老师的指点,我发现自己的差距真是太大了,也给我的思路打开了好多,我想经过完善,一定会取得我预期的效果的,真是谢谢了,我改好了还会让大家看看的,我在这找到好老师了,谢谢你们!!12.21

12.22

通过几天的努力,我的预期目标快达到了。现在就还差添加图层、颜色了,我把我的全部东西发上来,还望老师们有时间帮我指正。代码:(2004-12-24更新),欢迎指正。
(defun c:sxy(/ r1 r2 o1 o2 o3 x1 y1 p1 p2 h1 lq rq ld rd jd shejidmx  shejidmx1
             areq1 area2 area3 chaoarea qianarea ss ss1 fn_sxy fn  ds dss licheng
             num zbiao xi yi  p3 widh toal ptext1 ptext2 ptext3 ptext4 ptext5 )

  (COMMAND "_LAYER" "n" "设计断面" "c" "7" "设计断面" "l" "continuous" "设计断面" "lw" 0.5 "设计断面" "")
  (COMMAND "_LAYER" "n" "实测断面" "c" "1" "实测断面" "l" "continuous" "实测断面" "lw" 0.2 "实测断面" "")
  (command "-style"  "隧道断面"  "仿宋_GB2312"  0.2  0.75  0.  "n"  "n"  "n" "")

  (setq sblip (getvar "blipmode"))
  (setq scmde (getvar "cmdecho"))
  (setq la (getvar"clayer"))
  (SETQ OSM (GETVAR "OSMODE"))
  (setvar "blipmode" 0)
  (setvar "cmdecho" 0)
  (SETVAR "OSMODE" 0)
  
     
  (setq        r1 (getreal "请输入半径:")
        r2 (+ r1 1.25)
  )
  (setq        o1 (getpoint "请指定上圆心点:")
        x1 (car o1)
        y1 (cadr o1)
       
                                ;指定上圆心点位置
  )
  (setq o2 (mapcar '+ o1 '(-1.083 -0.625 0. )))                        ;指定左下圆心点位置
  
  (setq o3 (mapcar '+ o1 '(1.083 -0.625 0. ))) ;指定右下圆心点位置
  (setq p1 (- (sqrt (- (* r2 r2) (* 1.025 1.025))) 1.083))
                                        ;计算左圆弧起点、右圆弧终点距衬砌中线的平距
  (setq lq (mapcar '+ o1 (list (- p1) -1.65 0. ))
            rq (mapcar '+ o1 (list p1 -1.65 0. ))
      )        ;指定左圆弧起点坐标、指定右圆弧终点坐标
  
  (setq        p2 (* r1 (sin (/ pi 3)))        ;计算上圆弧起终点距衬砌中线平距
        h1 (* r1 (cos (/ pi 3)))        ;计算上圆弧起终点距上圆心高差
  )
  (setq ld (mapcar '+ o1 (list (- p2) h1  0.))
        rd (mapcar '+ o1 (list p2 h1  0.))
      )        ;指定上圆弧左端点坐标、指定上圆弧右端点坐标
  
  (setq jd (mapcar '+ o1 '(0. -1.65  0.)));指定衬砌中线上设计高程处坐标

 (command "pline" o1 o2 o3 "c")        ;绘制圆心三角形
  (setq yx(entlast))
  (command ".chprop" yx "" "la" "设计断面" "")

  
  ;绘制三段圆弧及设计高处底边为一条闭合的多段线
  (command "pline" rq "a" "ce" o2 rd "ce" o1 ld "ce" o3 lq "l" "c" "")
 (setq shejidmx (entlast))
  (command "region" shejidmx "");生成面域
  (setq shejidmx (entlast))
  (command "area"  "o" shejidmx "" )
  (setq area1 (getvar "area"));获取设计断面的面积               
  (command ".chprop" shejidmx "" "la" "设计断面" "")


  


  ;以下绘制实际开挖断面线
(if (not fn_sxy)
  (setq fn_sxy "E:\jkjc\\");此处为断面线数据文件所在路径
)
(SETQ fn_sxy
       (GETFILED
         "选择 .sxy 隧道实际开挖断面线数据文件  Copyright(C)2004.12  Ver2004.12.21"
         fn_sxy
         "sxy"
         4
       )
)
(if fn_sxy
  (progn
    (setq fn (open fn_sxy "r"))
    (while (setq DSS (read-line fn))
      (SETQ DS (READ (STRCAT "(" DSS ")")))
      (setq licheng (car ds)  num (cadr ds)  zbiao  (list(list (- x1 p1) (-  y1 1.65)  0. )))
      
      (repeat num
        (setq DSS (read-line fn))
        (SETQ DS (READ (STRCAT "(" DSS ")")))
        (setq xi (+ x1 (nth 8 ds )) yi (+ (- y1 1.65) ( nth 6 ds )) )
       
        (setq zbiao (cons (list xi yi 0.) zbiao))
      )                                        ;end repeat
        (setq zbiao (cons rq zbiao))
      
        ;绘制实际开挖断面线
        (SETQ P3 (CAR ZBIAO) ZBIAO (CDR ZBIAO) WIDH 0.0)
         (COMMAND "PLINE" P3 "W" WIDH "")
         (repeat (+ num 1)
                 (command (car zbiao))
                (setq zbiao (cdr zbiao))
         );end of repeat
         (command)
         (SETQ ss (ENTLAST))
         (command "pedit" ss "c" "")
         (command "region" ss "");生成面域
         (SETQ ss (ENTLAST))
         (command "area" "o" ss "")
         (setq area2 (getvar "area"));获取实际断面的面积
         (command ".chprop" ss "" "la" "实测断面" "")

      )

         
    )                                        ;end while
    (close fn)
  
)                                        ;end if

  ;以下用于计算超、欠挖面积
   (command ".copy" ss "" rd rd) 
    (setq ss1(entlast))
    (command ".copy" shejidmx "" rd rd)
    (setq shejidmx1(entlast))
    (command "union" ss1 shejidmx1 "")
    (setq toal(entlast))
    (command "area" "o" toal "")
    (setq area3 (getvar "area"));实际断面线与设计断面线并集的面积
    (setq chaoarea (- area3 area1));超挖面积
    (setq qianarea (- area1 (- area2 chaoarea)));欠挖面积
    (command "erase" toal "")

 
;以下标注各项面积
  (setq ptext1 (mapcar '+ o1 '(0. 0.6  0.)))
  (setq area1 (rtos area1))
  (setq sarea1 (strcat "设计面积为 " area1 " 平方米"))
  (command "text"   "j" "mc" ptext1 0.15  sarea1 "" "");在指定位置标注设计断面的面积
  (setq pt1(entlast))
  (command ".chprop" pt1 "" "la" "设计断面" "")

  
 (setq ptext2 (mapcar '+ o1 '(0. 1.0  0.)))
  (setq area2 (rtos area2))
  (setq area2 (strcat "实际开挖面积为 " area2 " 平方米"))
  (command "text"   "j" "mc" ptext2 0.15  area2 "" "");在指定位置标注实际断面的面积
  (setq pt2(entlast))
  (command ".chprop" pt2 "" "la" "实测断面" "")


  (setq ptext3 (mapcar '+ o1 '(0. 1.4  0.)))
  (setq chaoarea (rtos chaoarea))
  (setq chaoarea (strcat "超挖面积为 " chaoarea " 平方米"))
  (command "text"   "j" "mc" ptext3 0.15  chaoarea "" "");在指定位置标注超挖的面积
  (setq pt3(entlast))
  (command ".chprop" pt3 "" "la" "实测断面" "")



  (setq ptext4 (mapcar '+ o1 '(0. 1.8  0.)))
  (setq qianarea (rtos qianarea))
  (setq qianarea (strcat "欠挖面积为 " qianarea " 平方米"))
  (command "text"   "j" "mc" ptext4 0.15  qianarea "" "");在指定位置标注欠挖的面积
  (setq pt4(entlast))
  (command ".chprop" pt4 "" "la" "实测断面" "")
  


  (setq ptext5 (mapcar '+ o1 '(0. 2.2  0.)))
  (setq licheng (rtos licheng))
  (setq licheng (strcat "本断面里程为: " licheng ))
  (command "text"  "j" "mc" ptext5 0.15  licheng "" "");在指定位置标注本段面的里程
  (setq pt5(entlast))
  (command ".chprop" pt5 "" "la" "设计断面" "")
  
  (setvar "blipmode" sblip)
  (setvar "cmdecho" scmde)
  (SETVAR "CLAYER" LA)
  (SETVAR "OSMODE" OSM)
  )


以下为实际开挖轮廓线数据的样本:
里程  测点数
数据处理前观测序号  测点里程  断面设计高  测点距设计高程的的高差 测点位于中线的左\右边  测点距中线平距   实测半径
        79248  9
9        79247.478        364.122        1.497        Z        -5.794        6.893
8        79247.633        364.124        2.981        Z        -5.581        6.945
7        79247.716        364.125        5.321        Z        -4.424        5.748
6        79248.010        364.130        6.970        Z        -2.561        5.904
5        79247.809        364.127        7.394        Z        -0.065        5.744
1        79248.151        364.132        7.093        Y        1.774        5.724
2        79249.123        364.146        5.711        Y        4.106        5.775
3        79248.599        364.138        2.604        Y        5.849        7.109
4        79248.260        364.133        0.789        Y        6.064        7.152

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-21 21:54 , Processed in 0.212247 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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