明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1479|回复: 7

[求助]鬼魔及路过的高手们,进来看一下

[复制链接]
发表于 2007-8-14 15:34:00 | 显示全部楼层 |阅读模式
这个lsp是鬼魔大侠编的,在2007下运行已没问题,请问能移植在R14下运行吗
是解决已知两点和弧长,画弧的东东
(defun c:aaa (/ p1 p2 s a l x xx fx flx r c c1 c2 mspace myobj)
(defun N ()
(setq c (- (+ a (* 0.5 pi)) (* x 0.5)))
(setq cen (polar p1 c r))
(setq c1 (+ c pi))
(setq c2 (+ c1 x))
(setq myobj (vla-addarc mspace (vlax-3d-point cen) r c1 c2))
(princ)
)
(setq p1 (getpoint "\n请输入圆弧第一点:"))
(setq p2 (getpoint p1 "\n请输入圆弧第二点:"))
(setq s (getdist p1 "\n请输入弧长:"))
(setq a (angle p1 p2))
(setq l (distance p1 p2))
(vl-load-com)
(setq mspace (vla-get-modelspace
(vla-get-activedocument (vlax-get-acad-object))
)
)
(if (<= s l)
(progn
(prompt "您所要画的圆弧并不存在!")
(princ)
)
(progn
(setq x 2)
(setq fx (- (/ (sin (/ x 2)) x) (/ (* 0.5 l) s)))
(setq
flx (/ (- (* 0.5 x (cos (* 0.5 x))) (sin (* 0.5 x))) (* x x))
)
(setq xx (- x (/ fx flx)))
(while (> (abs (- x xx)) 0.0000000001)
(setq x xx)
(setq fx (- (/ (sin (/ x 2)) x) (/ (* 0.5 l) s)))
(setq flx
(/ (- (* 0.5 x (cos (* 0.5 x))) (sin (* 0.5 x))) (* x x))
)
(setq xx (- x (/ fx flx)))
)
(setq r (/ s xx))

(initget "N S")
(setq aa (getkword "\n 请输入圆弧方向[逆时针(N)/顺时针(S)]:"))
(if (= aa nil)
(setq aa "N")
)
(if (= aa "N")
(N)
(if (= aa "S")
(progn
(setq c (- (+ a (/ x 2)) (* 0.5 pi)))
(setq cen (polar p1 c r))
(setq c1 (- (+ c pi) x))
(setq c2 (+ c pi))
(setq myobj (vla-addarc mspace (vlax-3d-point cen) r c1 c2))
(princ)
)
)
)
)
)
)

发表于 2007-8-14 16:11:00 | 显示全部楼层
这个代码中使用到了 vla 类的函数, 但 R14 英文版是不代内嵌的 vba 的, 中文版的好像有, 但解密不一定完全, 使用中可能会有意外. 如果不想再麻烦那个老兄将 vla 语句修改为普通的 lsp 语句的话, 就去找个 vba for R14 安装下
发表于 2007-8-14 16:14:00 | 显示全部楼层

此Lisp寫得很好,只可惜名稱為aaa不容易看出它的用途。我試過2004運行無礙。

发表于 2007-8-14 18:06:00 | 显示全部楼层
首先申明这个程序源于ahlzl--几何算法的版主。
我在这里做了些改动,以便能适应R14及以下版本。
  1. (prompt "\n请输入命令AAA!")
  2. (defun c:aaa (/ P1 P2 S A L x xx Fx Dx key cen rad an1 an2 mid)
  3.   ;;圆心角与弧长和弦长的函数关系
  4.   (defun func (x S)
  5.     (- (* 2 (sin (/ x 2)) S) (* L x))
  6.   )
  7.   ;;上面函数的求导
  8.   (defun diff (x S)
  9.     (- (* S (cos (/ x 2))) L)
  10.   )
  11.   ;;输入数据
  12.   (initget 1)
  13.   (if (and (setq P1 (getpoint "\n请输入圆弧起点:"))
  14.     (setq P2 (getpoint P1 "\n请输入圆弧端点:"))
  15.     (setq S  (getdist "\n请输入弧长:"))
  16.     (setq L  (distance P1 P2))
  17.     (> S L)
  18.       )
  19.     (progn
  20.       (setq A  (angle P1 P2))
  21.       (setq x  (* 2 Pi))
  22.       (setq Fx (func x S))
  23.       (setq Dx (diff x S))
  24.       (setq xx (- x (/ Fx Dx)))
  25.       ;;迭代运算
  26.       (while (> (abs (- x xx)) 1e-12)
  27. (setq x xx)
  28. (setq Fx (func x S))
  29. (setq Dx (diff x S))
  30. (setq xx (- x (/ Fx Dx)))
  31.       )
  32.       ;;确定圆弧方向
  33.       (initget 0 "N S")
  34.       (setq key (getkword "\n请输入圆弧方向[逆时针(N)/顺时针(S)]<N>:"))
  35.       (if (null key)
  36. (setq key "N")
  37.       )
  38.       (setq rad (abs (/ s xx)))
  39.       (setq mid (polar p1 A (/ l 2)))
  40.       ;;准备工作
  41.       (if (= key "N")
  42. (setq cen (polar mid (+ A (/ pi 2)) (* rad (cos (/ xx 2)))))
  43. (setq cen (polar mid (- A (/ pi 2)) (* rad (cos (/ xx 2))))
  44.        xx  p1
  45.        p1  p2
  46.        p2  xx
  47. )
  48.       )
  49.       (setq an1 (angle cen p1))
  50.       (setq an2 (angle cen p2))
  51.       ;;画圆弧
  52.       (entmake
  53. (list
  54.    '(0 . "ARC")
  55.    (cons 10 cen)
  56.    (cons 40 rad)
  57.    (cons 50 an1)
  58.    (cons 51 an2)
  59. )
  60.       )
  61.     )
  62.     (alert "输入无效或要画的圆弧不存在!")
  63.   )
  64.   (princ)
  65. )

本帖子中包含更多资源

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

x

评分

参与人数 1威望 +3 明经币 +1 收起 理由
Joseflin + 3 + 1 【好评】 高手!佩服!

查看全部评分

发表于 2007-8-14 22:54:00 | 显示全部楼层

非常抱歉,现在才看到

这程序确实不是我编的

下次我会写出处

highflybird版主确实很热心,感谢

 楼主| 发表于 2007-8-16 17:35:00 | 显示全部楼层
非常感谢highflybir!
发表于 2007-8-16 23:06:00 | 显示全部楼层

ahlzl與highflybir君的 DIFF函數真漂亮,大大減少迴圈數,感謝!

在此對程式提供一點小小看法,一般畫弧採7個參數方式時,預設為逆時針方向,

所以應可以將提示方向步驟省略,由指定兩點之順序自動畫出該弧(逆時針),

若是指定兩點之後覺得方向不對,可以在輸入弧長時,輸入負值的方式修正。

发表于 2007-8-19 10:39:00 | 显示全部楼层
利用颱風假,針對以上稍微改寫一下,提供參考:
  1. (defun c:aaa (/ pt1 pt2 ll dd ang ang2 Fx Dx)
  2.   (setvar "cmdecho" 0)
  3.   (setq pt1 (getpoint "\n指定弧的起點: ")
  4.         pt2 (getpoint pt1 "\n指定弧的終點: ")
  5.         dd  (distance pt1 pt2)
  6.   )
  7.   (setq chk 0)
  8.   (while (= chk 0)
  9.     (setq ll  (getdist "\n指定弧長: "))
  10.     (if (or (null ll)(>= dd (abs ll)))
  11.       (alert "\n輸入無效或要畫的圓弧不存在,請重新設定!")
  12.       (if (> ll 0) (setq chk 1) (setq chk -1))
  13.     )
  14.   )
  15.   (setq ll (abs ll)
  16.         ang (* 2 pi)
  17.         Fx (func ang ll)
  18.         Dx (diff ang ll)
  19.         ang2 (- ang (/ Fx Dx))
  20.   )
  21.   ;逼近法求角度
  22.   (while (> (abs (- ang ang2)) 1e-12)
  23.     (setq ang ang2
  24.           Fx (func ang ll)
  25.           Dx (diff ang ll)
  26.           ang2 (- ang (/ Fx Dx))
  27.     )
  28.   )
  29.   ;以SEA方式畫弧,採系統預設的逆時針方向作圖
  30.   (setq ang (/ (* ang 180.0 chk) pi))
  31.   (command "arc" pt1 "e" pt2 "a" ang)
  32.   (setvar "cmdecho" 1)
  33.   (princ)
  34. )
  35. (prompt "\n請輸入指令 ---> AAA")
  36. ;自訂函數區
  37. (defun func (ang ll)
  38.   (- (* 2 ll (sin (/ ang 2))) (* dd ang))
  39. )
  40. (defun diff (ang ll)
  41.   (- (* ll (cos (/ ang 2))) dd)
  42. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 22:36 , Processed in 0.192291 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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