明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1392|回复: 9

[求助]请高手修改

[复制链接]
发表于 2012-3-22 13:20 | 显示全部楼层 |阅读模式
本帖最后由 CTC 于 2012-3-26 22:37 编辑
  1. ;;;问题:请高手帮忙修改下程序,判断2个开始点在一端
  2. ;;;by cable2004  
  3. (defun c:tt ( / 1-pt1 1-pt2 2-pt1 2-pt2 ang1 ang2 da db dc dd de earea earea1 ent1-1 ent1-2 ent1-2-l ent1-lst ent2-lst ent-ss h h1 m n  pab pac pba pca  pt0 pt1 pt2 pt3 ptab ptba s s1 ssent1 ssent2)
  4.   (vl-load-com)
  5.   (setq osmode_bak (getvar "osmode"))
  6.   (setvar "osmode" 0)
  7.   (setvar "cmdecho" 0)
  8.   (print "\n请选取线:")
  9.   (setq ent-ss (ssget))
  10.   (setq ssent1 (ssname ent-ss 0))
  11.   (setq ssent2 (ssname ent-ss 1))
  12.   (setq m (getint "\n请输入段数<32>:"))
  13.   (if (null m)
  14.     (setq m 32)
  15.   )
  16.   (setq pt0 (getpoint "\n请指定位置:"))
  17.   (setq ent1-lst (m-fd-lst ssent1 m))
  18.   (setq ent2-lst (m-fd-lst ssent2 m))
  19.   (setq ent1-1 (car ent1-lst))
  20.   (setq ent1-2 (car ent2-lst))
  21.   (setq ent1-2-l (distance ent1-1 ent1-2))
  22.   (setq pt1 (polar pt0 (* 0.5 pi) ent1-2-l))
  23.   (setq n 1)
  24.   (repeat m
  25.     (setq 1-pt1 (car ent1-lst))
  26.     (setq 1-pt2 (cadr ent1-lst))
  27.     (setq 2-pt1 (car ent2-lst))
  28.     (setq 2-pt2 (cadr ent2-lst))
  29.     (setq da (distance 1-pt1 2-pt1))   ; 边1
  30.     (setq db (distance 1-pt1 1-pt2))   ; 边2
  31.     (setq dc (distance 2-pt1 1-pt2))   ; 对角线
  32.     (setq dd (distance 2-pt1 2-pt2))   ; 边3
  33.     (setq de (distance 1-pt2 2-pt2))   ; 边3

  34.     (setq ang1 (angle pt0 pt1))
  35.     (setq s (/ (+ da db dc) 2))                           ; 求s=(da+db+dc)/2
  36.     (setq earea (sqrt (* s (- s da) (- s db) (- s dc)))) ; 求面积area=s*(s-d ; a)*(s-db)*(s-dc)^0.5
  37.     (setq h (/ (* 2 earea) da))                           ; 求三角形高 h=2*area/da
  38.     (setq pab (sqrt (- (* dc dc) (* h h))))              ; 求高将底边分成的两部分的长度
  39.     (setq pba (sqrt (- (* db db) (* h h))))
  40.     (cond
  41.       ((and
  42.    (< pab pba)
  43.    (> pba da)
  44.        )
  45.   (setq ptab (polar pt0 (* -1 ang1) pab))
  46.   (setq pt2 (polar ptab (- ang1 (* 0.5 pi)) h))
  47.       )
  48.       ((and
  49.    (> pab da)
  50.    (> pab pba)
  51.        )
  52.   (setq ptab (polar pt0 ang1 pab))
  53.   (setq pt2 (polar ptab (- ang1 (* 0.5 pi)) h))
  54.       )
  55.       ((and
  56.    (<= pab da)
  57.    (<= pba da)
  58.        )
  59.   (setq ptab (polar pt0 ang1 pab))
  60.   (setq pt2 (polar ptab (- ang1 (* 0.5 pi)) h))
  61.       )
  62.     )
  63.     (setq ang2 (angle pt0 pt2))

  64.     (setq s1 (/ (+ de dc dd) 2))
  65.     (setq earea1 (sqrt (* s1 (- s1 dc) (- s1 de) (- s1 dd))))
  66.     (setq h1 (/ (* 2 earea1) dc))
  67.     (setq pac (sqrt (- (* dd dd) (* h1 h1))))
  68.     (setq pca (sqrt (- (* de de) (* h1 h1))))

  69.     (cond
  70.       ((and
  71.    (< pac pca)
  72.    (> pca dc)
  73.        )
  74.   (setq ptba (polar pt0 (* -1 ang2) pac))
  75.   (setq pt3 (polar ptba (- ang2 (* 0.5 pi)) h1))
  76.       )
  77.       ((and
  78.    (> pac dc)
  79.    (> pac pca)
  80.        )
  81.   (setq ptba (polar pt0 ang2 pac))
  82.   (setq pt3 (polar ptba (- ang2 (* 0.5 pi)) h1))
  83.       )
  84.       ((and
  85.    (<= pac dc)
  86.    (<= pca dc)
  87.        )
  88.   (setq ptba (polar pt0 ang2 pac))
  89.   (setq pt3 (polar ptba (- ang2 (* 0.5 pi)) h1))
  90.       )
  91.     )
  92.     (m-3dface 1-pt1 1-pt2 2-pt1 2-pt1)
  93.     (m-3dface 2-pt1 1-pt2 2-pt2 2-pt2)
  94.     (m-3dface pt0 pt1 pt2 pt2)
  95.     (m-3dface pt0 pt2 pt3 pt3)
  96.     (setq ent1-lst (cdr ent1-lst))
  97.     (setq ent2-lst (cdr ent2-lst))
  98.     (setq pt1 pt2)
  99.     (setq pt0 pt3)
  100.     (setq n (+ 1 n))

  101.   )
  102.   (princ)
  103.   (setvar "osmode" osmode_bak)
  104.   (alert "检查正反片")

  105. )


  106. (defun m-fd-lst (ent1 nn / ent1-sta ent1-end ent1-l ent1-pt ent1-ptlst)
  107.   (setq i 0)
  108.   (setq ent1-sta  (vlax-curve-getStartParam (vlax-ename->vla-object ent1) ))
  109.   (setq ent1-end  (vlax-curve-getEndParam   (vlax-ename->vla-object ent1) ))
  110.   (setq ent1-l (/ (m-curvelength ent1) nn))
  111.   (repeat (+ nn 1)
  112.     (setq ent1-pt (vlax-curve-getpointatdist ent1 (* i ent1-l)))
  113.     (setq i (+ 1 i))
  114.     (setq ent1-ptlst (cons ent1-pt ent1-ptlst))
  115.   )
  116.   (setq ent1-ptlst (reverse ent1-ptlst))
  117. )
  118. (defun m-curvelength (ent / obj)
  119.   (setq obj (vlax-ename->vla-object ent))
  120.   (setq len (vlax-curve-getdistatparam obj (vlax-curve-getendparam obj)))
  121.   len
  122. )

  123. (defun m-3dface (p1 p2 p3 p4)
  124.   (entmakex (list (cons 0 "3DFACE") (cons 10 p1) (cons 11 p2) (cons 12 p3)
  125.       (cons 13 p4)
  126.       )
  127.   )
  128. )



该贴已经同步到 CTC的微博

本帖子中包含更多资源

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

x
 楼主| 发表于 2012-3-22 13:25 | 显示全部楼层
本帖最后由 CTC 于 2012-3-22 13:26 编辑

图都上传不 了,不知为什么,都没有超出2M。。
发表于 2012-3-24 23:55 | 显示全部楼层
本帖最后由 langjs 于 2012-3-25 09:49 编辑

试试
(defun c:tt (/ 1-pt1 1-pt2 2-pt1 2-pt2 ang1 ang2 da db dc dd de earea earea1 ent1-1 ent1-2 ent1-2-l ent1-l ent1-lst ent1-pt ent2-lst
        ent-ss h h1 i l m n osmode_bak pab pac pba pca pt0 pt1 pt2 pt3 ptab ptba s s1 ssent1 ssent2
     )
  (vl-load-com)
  (setq osmode_bak (getvar "osmode"))
  (setvar "osmode" 0)
  (setvar "cmdecho" 0)
  (princ "\n请选取线:")
  (setq ent-ss (ssget))
  (setq ssent1 (ssname ent-ss 0))
  (setq ssent2 (ssname ent-ss 1))
  (setq m (getint "\n请输入段数<32>:"))
  (if (null m)
    (setq m 32)
  )
  (setq pt0 (getpoint "\n请指定位置:"))
  (setq ent1-lst (m-fd-lst ssent1 m))
  (setq ent2-lst (m-fd-lst ssent2 m))
  (setq pt1 (vlax-curve-getpointatdist ssent1 0))
  (setq pt2 (vlax-curve-getpointatdist ssent2 0))
  (setq pt3 (vlax-curve-getpointatdist ssent2 (m-curvelength ssent2)))
  (if (> (distance pt1 pt2) (distance pt1 pt3))
    (progn
      (setq i 0
     ent2-lst '()
      )
      (setq l (m-curvelength ssent2))
      (setq ent1-l (/ l m))
      (repeat (+ m 1)
(setq ent1-pt (vlax-curve-getpointatdist ssent2 (- l (* i ent1-l))))
(setq i (+ 1 i))
(setq ent2-lst (cons ent1-pt ent2-lst))
      )
      (setq ent2-lst (reverse ent2-lst))
    )
  )
  (setq ent1-1 (car ent1-lst))
  (setq ent1-2 (car ent2-lst))
  (setq ent1-2-l (distance ent1-1 ent1-2))
  (setq pt1 (polar pt0 (* 0.5 pi) ent1-2-l))
  (setq n 1)
  (repeat m
    (setq 1-pt1 (car ent1-lst))
    (setq 1-pt2 (cadr ent1-lst))
    (setq 2-pt1 (car ent2-lst))
    (setq 2-pt2 (cadr ent2-lst))
    (setq da (distance 1-pt1 2-pt1))   ; 边1
    (setq db (distance 1-pt1 1-pt2))   ; 边2
    (setq dc (distance 2-pt1 1-pt2))   ; 对角线
    (setq dd (distance 2-pt1 2-pt2))   ; 边3
    (setq de (distance 1-pt2 2-pt2))   ; 边3
    (setq ang1 (angle pt0 pt1))
    (setq s (/ (+ da db dc) 2))        ; 求s=(da+db+dc)/2
    (setq earea (sqrt (* s (- s da) (- s db) (- s dc)))) ; 求面积area=s*(s-d ; a)*(s-db)*(s-dc)^0.5
    (setq h (/ (* 2 earea) da))        ; 求三角形高 h=2*area/da
    (setq pab (sqrt (- (* dc dc) (* h h)))) ; 求高将底边分成的两部分的长度
    (if (equal (* db db) (* h h) 0.00001)
      (setq pba 0)
      (setq pba (sqrt (- (* db db) (* h h))))
    )
    (cond
      ((and
  (< pab pba)
  (> pba da)
       )
(setq ptab (polar pt0 (* -1 ang1) pab))
(setq pt2 (polar ptab (- ang1 (* 0.5 pi)) h))
      )
      ((and
  (> pab da)
  (> pab pba)
       )
(setq ptab (polar pt0 ang1 pab))
(setq pt2 (polar ptab (- ang1 (* 0.5 pi)) h))
      )
      ((and
  (<= pab da)
  (<= pba da)
       )
(setq ptab (polar pt0 ang1 pab))
(setq pt2 (polar ptab (- ang1 (* 0.5 pi)) h))
      )
    )
    (setq ang2 (angle pt0 pt2))
    (setq s1 (/ (+ de dc dd) 2))
    (setq earea1 (sqrt (* s1 (- s1 dc) (- s1 de) (- s1 dd))))
    (setq h1 (/ (* 2 earea1) dc))
    (setq pac (sqrt (- (* dd dd) (* h1 h1))))
    (setq pca (sqrt (- (* de de) (* h1 h1))))
    (cond
      ((and
  (< pac pca)
  (> pca dc)
       )
(setq ptba (polar pt0 (* -1 ang2) pac))
(setq pt3 (polar ptba (- ang2 (* 0.5 pi)) h1))
      )
      ((and
  (> pac dc)
  (> pac pca)
       )
(setq ptba (polar pt0 ang2 pac))
(setq pt3 (polar ptba (- ang2 (* 0.5 pi)) h1))
      )
      ((and
  (<= pac dc)
  (<= pca dc)
       )
(setq ptba (polar pt0 ang2 pac))
(setq pt3 (polar ptba (- ang2 (* 0.5 pi)) h1))
      )
    )
    (m-3dface 1-pt1 1-pt2 2-pt1 2-pt1)
    (m-3dface 2-pt1 1-pt2 2-pt2 2-pt2)
    (m-3dface pt0 pt1 pt2 pt2)
    (m-3dface pt0 pt2 pt3 pt3)
    (setq ent1-lst (cdr ent1-lst))
    (setq ent2-lst (cdr ent2-lst))
    (setq pt1 pt2)
    (setq pt0 pt3)
    (setq n (+ 1 n))
  )
  (setvar "osmode" osmode_bak)
  (alert "检查正反片")
  (princ)
)
(defun m-fd-lst (ent1 nn / ent1-end ent1-l ent1-pt ent1-ptlst ent1-sta)
  (setq i 0)
  (setq ent1-sta (vlax-curve-getstartparam (vlax-ename->vla-object ent1)))
  (setq ent1-end (vlax-curve-getendparam (vlax-ename->vla-object ent1)))
  (setq ent1-l (/ (m-curvelength ent1) nn))
  (repeat (+ nn 1)
    (setq ent1-pt (vlax-curve-getpointatdist ent1 (* i ent1-l)))
    (setq i (+ 1 i))
    (setq ent1-ptlst (cons ent1-pt ent1-ptlst))
  )
  (setq ent1-ptlst (reverse ent1-ptlst))
)
(defun m-curvelength (ent / obj)
  (setq obj (vlax-ename->vla-object ent))
  (setq len (vlax-curve-getdistatparam obj (vlax-curve-getendparam obj)))
  len
)
(defun m-3dface (p1 p2 p3 p4)
  (entmakex (list (cons 0 "3DFACE") (cons 10 p1) (cons 11 p2) (cons 12 p3) (cons 13 p4)))
)
 楼主| 发表于 2012-3-25 00:22 | 显示全部楼层
本帖最后由 CTC 于 2012-3-29 16:01 编辑
langjs 发表于 2012-3-24 23:55
试试
(defun c:tt (/ 1-pt1 1-pt2 2-pt1 2-pt2 ang1 ang2 da db dc dd de earea earea1 ent1-1 ent1-2 ent ...



这个情况又不行了。。,
请输入段数<32>:
请指定位置:Error: 没有为参数定义函数: -1.49214e-013
发表于 2012-3-25 00:47 | 显示全部楼层
CTC 发表于 2012-3-25 00:22
这个情况又不行了。。,
请输入段数:
请指定位置:Error: 没有为参数定义函数: -1.49214e-013

运行你提供的源程序这种情况就有错误

评分

参与人数 2明经币 +2 收起 理由
yoyoho + 1 很给力!
CTC + 1 很给力! 可能是未考虑到起始点重合的情况.

查看全部评分

发表于 2012-3-25 09:50 | 显示全部楼层
langjs 发表于 2012-3-25 00:47
运行你提供的源程序这种情况就有错误

重新试试,修改了一下
 楼主| 发表于 2012-3-25 10:12 | 显示全部楼层
langjs 发表于 2012-3-25 09:50
重新试试,修改了一下

好厉害,可以了,改天再给你加分。。。。。谢谢啦。推荐langjs你做 版主。。。

点评

拉到吧,就我那三脚猫拿不出手  发表于 2012-3-25 10:21
发表于 2012-3-25 10:42 | 显示全部楼层
如果出项找z方向,上下交错的呢?
发表于 2012-3-25 12:48 | 显示全部楼层
不错!学习了!
发表于 2012-3-25 13:17 | 显示全部楼层
好复杂的东西
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-18 05:17 , Processed in 0.237869 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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