明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 墨色寒冰

[求助]如何求两交线之间的面积?多谢各位进来看看

  [复制链接]
 楼主| 发表于 2004-9-20 19:25:00 | 显示全部楼层
谢谢版主,我按你说的办法去试试
发表于 2004-9-20 20:42:00 | 显示全部楼层
lzh,alin两位高手,可以写一个程序出来参考参考么?
发表于 2004-9-20 22:25:00 | 显示全部楼层
本帖最后由 作者 于 2004-9-21 15:05:22 编辑
  1. (defun tls-getarea( / l1 l2 i pnts ss1 ss2 area)(defun tls-ssr(ss1 ss2 / i)
  2.    (setq i 0)
  3.    (repeat (sslength ss2)
  4.        (ssdel (ssname ss2 i) ss1)
  5.        (setq i (1+ i))
  6.    )
  7. )(defun tls-breakatpnts(ent pnts / i lst count pnt)
  8.    (setq i 0 lst nil count (/ (length pnts) 3))
  9.    (repeat count
  10.        (setq
  11.            pnt (list (nth i pnts) (nth (1+ i) pnts) (nth (+ i 2) pnts))
  12.            pnt (cons (vlax-curve-getdistatpoint ent pnt) (list pnt))
  13.            lst (cons pnt lst)
  14.            i (+ i 3)
  15.        )
  16.    )
  17.    (setq lst
  18.        (vl-sort lst
  19.            (function (lambda (e1 e2) (> (car e1) (car e2))))
  20.        )
  21.    )
  22.    (setq i -1)
  23.    (repeat count
  24.        (setq pnt (cadr (nth (setq i (+ i 1)) lst)))
  25.        (command "_.break" (list ent pnt) pnt)
  26.    )
  27. )   (setvar "cmdecho" 0)
  28.    (setq
  29.        l1 (car (entsel))
  30.        l2 (car (entsel))
  31.        pnts
  32.            (vlax-safearray->list (vlax-variant-value (vla-IntersectWith
  33.                (vlax-ename->vla-object l1)
  34.                (vlax-ename->vla-object l2)
  35.                acExtendNone)))
  36.        ss1 (ssget "X")
  37.    )
  38.    (if (> (length pnts) 4)
  39.        (progn
  40.            (ssdel l1 ss1)
  41.            (ssdel l2 ss1)
  42.            (command "_.undo" "be")
  43.            (setq i 0)
  44.            (tls-breakatpnts l1 pnts)
  45.            (tls-breakatpnts l2 pnts)
  46.            (setq ss2 (ssget "X"))
  47.            (tls-ssr ss2 ss1)
  48.            (command "region" ss2 "")
  49.            (setq ss2 (ssget "X" '((0 . "REGION"))))
  50.            (tls-ssr ss2 ss1)
  51.            (setq i 0 area 0)
  52.            (repeat (sslength ss2)
  53.                (setq area (+ area (vla-get-area (vlax-ename->vla-object (ssname ss2 i)))))
  54.                (setq i (1+ i))
  55.            )
  56.            (command "_.undo" "e")
  57.            (command "_.undo" "1")
  58.            (setvar "cmdecho" 1)
  59.        )
  60.    )
  61. area
  62. )
 楼主| 发表于 2004-9-21 00:08:00 | 显示全部楼层
看到各位这么热心,我真是感动呀,我有什么好的东西一定首先放到这里来,谢谢大家!!!
发表于 2004-9-21 13:01:00 | 显示全部楼层
本帖最后由 作者 于 2004-9-21 14:10:34 编辑
  1. ;;;This routine calculate the total area between two plines or splines
  2. ;;; Please Zoom in as close as possible and check the number oF regions counted...Good luck!
  3. ;;;Author: Alin 21/9/04
  4. (defun c:InterArea   (/                         ent_1                 ent_2                 idx
  5.                                          oldEcho             oldOSmode         elast                 ent_1
  6.                                          ent_2                 interpts           inter_dists_1 inter_dists_2
  7.                                          pt                       rad                     ent_cir             pt1
  8.                                          innerpts           pt2                     innerpt             interpts_with_circle_1
  9.                                          interpts_with_circle_2           enext                 enextHold
  10.                                          cnt)
  11.    (setq oldEcho     (getvar "CMDECHO")
  12.                oldOSmode (getvar "OSMODE")
  13.                elast         (entlast)
  14.                area           0.0
  15.                innerpts   nil
  16.                interpts nil)
  17.    (setvar "CMDECHO" 0)
  18.    (setvar "OSMODE" 0)
  19.    (setq ent_1 (car (entsel "\nSelect the first spline:"))
  20.                ent_2 (car (entsel "\nSelect the second spline:"))
  21.                )
  22.    (if (and (setq interpts (GetInterPoints ent_1 ent_2))
  23.                      (> (length interpts) 1))
  24.        (progn
  25.            (setq interpts (vl-sort interpts
  26.                                                            '(lambda (e1 e2)
  27.                                                                  (< (vlax-curve-getdistatpoint ent_1 e1)
  28.                                                                        (vlax-curve-getdistatpoint ent_1 e2)))))
  29. ;;;           (command "pline")
  30. ;;;           (foreach ipt   interpts
  31. ;;;               (command ipt))
  32. ;;;           (command "")
  33.            (setq inter_dists_1 (mapcar '(lambda (e) (vlax-curve-getdistatpoint ent_1 e))
  34.                                                                    interpts)
  35.                        inter_dists_2 (mapcar '(lambda (e) (vlax-curve-getdistatpoint ent_2 e))
  36.                                                                    interpts)
  37.                        )
  38.            (setq idx 0)
  39.            (repeat (1- (length interpts))
  40.                (setq pt (nth idx interpts))
  41.                (setq rad
  42.                              (/ (min (abs
  43.                                                  (- (nth idx inter_dists_1) (nth (1+ idx) inter_dists_1)))
  44.                                              (abs
  45.                                                  (- (nth idx inter_dists_2) (nth (1+ idx) inter_dists_2))))
  46.                                    50.0))
  47.                (command "circle" pt rad)
  48.                (setq ent_cir (entlast))
  49.                (setq interpts_with_circle_1 (GetInterPoints ent_1 ent_cir)
  50.                            interpts_with_circle_2 (GetInterPoints ent_2 ent_cir))
  51.                (if (= (length interpts_with_circle_1) 1)
  52.                    (setq pt1 (car interpts_with_circle_1))
  53.                    (if (or (< (nth idx inter_dists_1)
  54.                                          (vlax-curve-getdistatpoint
  55.                                              ent_1
  56.                                              (car interpts_with_circle_1))
  57.                                          (nth (1+ idx) inter_dists_1))
  58.                                    (> (nth idx inter_dists_1)
  59.                                          (vlax-curve-getdistatpoint
  60.                                              ent_1
  61.                                              (car interpts_with_circle_1))
  62.                                          (nth (1+ idx) inter_dists_1))
  63.                                    )
  64.                        (setq pt1 (car interpts_with_circle_1))
  65.                        (setq pt1 (cadr interpts_with_circle_1))
  66.                        )
  67.                    )
  68.                (if (= (length interpts_with_circle_2) 1)
  69.                    (setq pt2 (car interpts_with_circle_2))
  70.                    (if (or (< (nth idx inter_dists_2)
  71.                                          (vlax-curve-getdistatpoint
  72.                                              ent_2
  73.                                              (car interpts_with_circle_2))
  74.                                          (nth (1+ idx) inter_dists_2))
  75.                                    (> (nth idx inter_dists_2)
  76.                                          (vlax-curve-getdistatpoint
  77.                                              ent_2
  78.                                              (car interpts_with_circle_2))
  79.                                          (nth (1+ idx) inter_dists_2))
  80.                                    )
  81.                        (setq pt2 (car interpts_with_circle_2))
  82.                        (setq pt2 (cadr interpts_with_circle_2))
  83.                        )
  84.                    )
  85.                (setq innerpt (midpoint pt1 pt2))
  86.                (setq innerpts (cons innerpt innerpts))
  87.                (entdel ent_cir)
  88.                (setq idx (1+ idx))
  89.                )
  90.            (command "bpoly" "a" "o" "r" "")
  91.            (foreach innerpt   innerpts
  92.                (command innerpt))
  93.            (command "")
  94. ;;;               (command "pline")
  95. ;;;                           (foreach innerpt innerpts
  96. ;;;                   (command innerpt))
  97. ;;;               (command "")           
  98.            (if (setq enext (entnext elast))
  99.                (progn
  100.                    (setq cnt 0)
  101.                    (while enext
  102.                        (setq area (+ area (vla-get-area (vlax-ename->vla-object enext))))
  103.                        (setq enextHold enext
  104.                                    cnt (1+ cnt))
  105.                        (setq enext (entnext enext))
  106.                        (entdel enextHold)
  107.                        )
  108.                    (alert (strcat "Area = "
  109.                                                  (rtos area 2 2)
  110.                                                  "\n"
  111.                                                  (itoa cnt)
  112.                                                  " Regions counted."))
  113.                    ) ;progn
  114.                (princ
  115.                    "\nNo regions created. Please Zoom in a little bit and try again...")
  116.                )
  117.            ) ;progn
  118.        (alert "Number of intersection points < 2!")
  119.        )
  120.    (setvar "CMDECHO" oldEcho)
  121.    (setvar "OSMODE" oldOSmode)
  122.    (princ)
  123.    )
  124. (defun GetInterPoints   (ent_1 ent_2 / ax_ent_1 ax_ent_2 intpoints i Ptlist)
  125.    (setq ax_ent_1 (vlax-ename->vla-object ent_1)
  126.                ax_ent_2 (vlax-ename->vla-object ent_2)
  127.                )
  128.    (setq intpoints (vlax-variant-value
  129.                                        (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone)))
  130.    (if (< (vlax-safearray-get-u-bound intpoints 1) 0)
  131.        nil
  132.        (progn
  133.            (setq intpoints (VLAX-safearray->list intpoints))
  134.            (setq i 0)
  135.            (repeat (/ (length intpoints) 3)
  136.                (setq Ptlist (cons (list (nth i intpoints)
  137.                                                                  (nth (1+ i) intpoints)
  138.                                                                  (nth (+ 2 i) intpoints))
  139.                                                      Ptlist))
  140.                (setq i (+ i 3))
  141.                )
  142.            (reverse Ptlist)
  143.            )
  144.        )
  145.    )
  146. ;;;
  147. ;;;-----------------------------------------------
  148. (defun midpoint   (pt1 pt2)
  149.    (list (* (+ (car pt1) (car pt2)) 0.5)
  150.                (* (+ (cadr pt1) (cadr pt2)) 0.5)
  151.                (* (+ (caddr pt1) (caddr pt2)) 0.5)
  152.                )
  153.    )
发表于 2004-9-23 00:40:00 | 显示全部楼层
lzh741206发表于2004-9-20 22:25:00(defun tls-getarea( / l1 l2 i pnts ss1 ss2 area) (defun tls-ssr(ss1 ss2 / i)   (setq i 0)   (repeat (sslength ss2)  ...
  1. 程序不错,你后来把排序部分补充完成了吧:)我也写了一个,写完再看你的程序,步骤差不多:)
复制代码
  1. 另,你的那句(setq ss2 (ssget "X" '((0 . "REGION"))))恐怕要缩小一下范围。我是在程序开始设标志,选集选标志后的实体,这样在图大的时候快一些。
发表于 2004-9-23 00:42:00 | 显示全部楼层
无痕发表于2004-9-20 17:22:00关于 交点-》做成面域 这一步,lzh有什么好方法么? 要知道一个交点打断后断点周围有4条线条,该怎么选来形成面域?
打断实体,试着用Region命令选择所有能够组合封闭区域的线条,看看什么结果
发表于 2004-9-23 00:44:00 | 显示全部楼层
ea,我昨天已经试了,前面的几个帖子lzh也隐含了这个提示。呵呵,用了这么久的cad,这个技巧我以前都不知道呢。


谢谢大家
发表于 2004-9-23 08:51:00 | 显示全部楼层
无痕发表于2004-9-23 0:40:00(defun tls-getarea( / l1 l2 i pnts ss1 s...
要是在VBA里我就是这么干的,Lisp还是不怎么熟悉,:)
发表于 2004-9-23 10:49:00 | 显示全部楼层

看来无痕是真没有用到Autocad的3d功能,region是拉伸3D实体的基本功

记得以前我写过一个生成[立体文字]的程序就用到以上技术---打断建面域。

当年打断还用xdapi来做

;;;注意:字型直线多的如"细明体系列"容易出错

(最后用上了打断建面域解决了字型问题)
Sorry!以下连接没有用xdapi所以没有解决"细明体系列"容易出错的问题

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=115&replyID=368

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-9-30 14:20 , Processed in 0.162728 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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