明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5215|回复: 25

[求助]一個特殊的倒角程序

  [复制链接]
发表于 2004-5-2 15:02 | 显示全部楼层 |阅读模式
[求助]一個特殊的倒角程序


如圖有一個特殊的倒角程序,可以對兩條直角邊做1.5*1.5的反凹內直角倒角,


請高手指教!謝謝!

本帖子中包含更多资源

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

x
发表于 2004-6-23 08:53 | 显示全部楼层
试一下下面的LISP程序 (DEFUN C:CORNER (/ GETLINE VLINE1 VLINE2 DL1 DL2 PT1 PT2 PT3 PT4 PT5 PT6 PT7 ANG1 ANG2) (DEFUN GETLINE (MSG / A1)
(INITGET 1)
(SETQ A1 (CAR (ENTSEL MSG)))
(WHILE (/= (CDR (ASSOC 0 (ENTGET A1))) "LINE")
(PRINC "\n您选的不是线图元,请再选一次...")
(INITGET 1)
(SETQ A1 (CAR (ENTSEL MSG)))
)
A1
) (SETQ VLINE1 (GETLINE "\n请选取第一条线: "))
(WHILE (OR (= VLINE2 nil) (EQUAL VLINE1 VLINE2))
(IF (EQUAL VLINE1 VLINE2) (PRINC "\n线重复,请再选一次..."))
(SETQ VLINE2 (GETLINE "\n请选取第二条线: "))
)
(SETQ D (GETDIST "\n倒角距离 <1.5> : ")
D (IF (= D nil) 1.5 D))
(SETQ DL1 (ENTGET VLINE1) DL2 (ENTGET VLINE2)
PT1 (CDR (ASSOC 10 DL1)) PT2 (CDR (ASSOC 11 DL1))
PT3 (CDR (ASSOC 10 DL2)) PT4 (CDR (ASSOC 11 DL2))
PT5 (INTERS PT1 PT2 PT3 PT4 nil))
(IF (/= PT5 nil) (PROGN
(SETQ PT2 (IF (< (DISTANCE PT5 PT1) (DISTANCE PT5 PT2)) PT2 PT1)
PT4 (IF (< (DISTANCE PT5 PT3) (DISTANCE PT5 PT4)) PT4 PT3)
ANG1 (ANGLE PT5 PT2) ANG2 (ANGLE PT5 PT4)
PT1 (POLAR PT5 ANG1 D) PT3 (POLAR PT5 ANG2 D)
PT5 (POLAR PT3 ANG1 D))
(ENTDEL VLINE1) (ENTDEL VLINE2)
(COMMAND "LINE" PT2 PT1 PT5 PT3 PT4 "")
)
(T (PRINC "\n两直线无交点!"))
)
(PRINC)
)
(PRINC "\nType CORNER to start.")
(PRINC)
回复 支持 1 反对 0

使用道具 举报

发表于 2004-5-2 18:37 | 显示全部楼层
有这样的命令吗
发表于 2004-5-3 04:06 | 显示全部楼层
都是直角么?
发表于 2004-5-9 07:15 | 显示全部楼层
直角,还有园的四分之一,
发表于 2004-5-10 16:00 | 显示全部楼层
这个我也经常用到,最好两个1.5可以不相同,比如一个1,一个1.5等。
 楼主| 发表于 2004-5-10 21:49 | 显示全部楼层
我的意思是誰能編寫一個這樣的特殊的倒角lisp程序,只要選擇兩條邊


即可實現該倒角,默認倒角大小為1.5*1.5,但可以進行設定不同或


相同的倒角距離!因我工作中經常要做此類似的繪圖,覺得畫起來很麻煩,


所以要求助大家編制這樣一個lisp程序!謝謝!
发表于 2004-5-11 13:41 | 显示全部楼层
本帖最后由 作者 于 2004-5-12 8:07:04 编辑

我只会vba,用vba写了一个以下是主程序的代码,
  1. Sub GBChamfer()
  2.        On Error Resume Next
  3.        Dim dist1 As Double, dist2 As Double
  4.        dist1 = 0.5: dist2 = 0.8
  5.       
  6.        Dim lineObj1 As AcadLine, lineObj2 As AcadLine
  7.        Dim pt1, pt2
  8.       
  9.        gwGetEntity lineObj1, pt1, "请选择第一条直线:", "AcDbLine"
  10.        If lineObj1 Is Nothing Then Exit Sub
  11.       
  12.        gwGetEntity lineObj2, pt2, "请选择第二条直线:", "AcDbLine"
  13.        If lineObj2 Is Nothing Then Exit Sub       Dim jointPnt, startPnt1, startPnt2, endPnt1, endPnt2, startPnt3
  14.        jointPnt = lineObj1.IntersectWith(lineObj2, acExtendBoth)
  15.        If UBound(jointPnt) = -1 Then Exit Sub
  16.       
  17.        If (Abs(GetAngleFromX(jointPnt, pt1) - GetAngleFromX(jointPnt, lineObj1.StartPoint)) < 0.1 Or _
  18.                Abs(Abs(GetAngleFromX(jointPnt, pt1) - GetAngleFromX(jointPnt, lineObj1.StartPoint)) - 2 * PI) < 0.1) And _
  19.              GetDistance(jointPnt, pt1) < GetDistance(jointPnt, lineObj1.StartPoint) Then
  20.                startPnt1 = lineObj1.StartPoint
  21.        Else
  22.                startPnt1 = lineObj1.EndPoint
  23.        End If
  24.       
  25.        If (Abs(GetAngleFromX(jointPnt, pt2) - GetAngleFromX(jointPnt, lineObj2.StartPoint)) < 0.1 Or _
  26.                Abs(Abs(GetAngleFromX(jointPnt, pt2) - GetAngleFromX(jointPnt, lineObj2.StartPoint)) - 2 * PI) < 0.1) And _
  27.              GetDistance(jointPnt, pt2) < GetDistance(jointPnt, lineObj2.StartPoint) Then
  28.                startPnt2 = lineObj2.StartPoint
  29.        Else
  30.                startPnt2 = lineObj2.EndPoint
  31.        End If
  32.       
  33.        'If GetDistance(jointPnt, startPnt1) < dist1 Or GetDistance(jointPnt, startPnt2) < dist2 Then
  34.        '       ThisDrawing.Utility.Prompt "倒角的间距过大,退出命令。"
  35.        '       Exit Sub
  36.        'End If
  37.       
  38.        endPnt1 = GetPointAR(jointPnt, GetAngleFromX(jointPnt, startPnt1), dist1)
  39.        endPnt2 = GetPointAR(jointPnt, GetAngleFromX(jointPnt, startPnt2), dist2)
  40.        startPnt3 = GetPointAR(endPnt2, GetAngleFromX(jointPnt, startPnt1), dist1)
  41.       
  42.        Dim newObj1 As AcadLine, newObj2 As AcadLine, newObj3 As AcadLine, newObj4 As AcadLine
  43.        Set newObj1 = ThisDrawing.ModelSpace.AddLine(startPnt1, endPnt1)
  44.        Set newObj2 = ThisDrawing.ModelSpace.AddLine(startPnt2, endPnt2)
  45.        Set newObj3 = ThisDrawing.ModelSpace.AddLine(startPnt3, endPnt1)
  46.        Set newObj4 = ThisDrawing.ModelSpace.AddLine(startPnt3, endPnt2)
  47.       
  48.        newObj1.Layer = lineObj1.Layer: newObj1.Linetype = lineObj1.Linetype
  49.        newObj2.Layer = lineObj2.Layer: newObj2.Linetype = lineObj2.Linetype
  50.        newObj3.Layer = lineObj1.Layer: newObj3.Linetype = lineObj1.Linetype
  51.        newObj4.Layer = lineObj1.Layer: newObj4.Linetype = lineObj1.Linetype
  52.       
  53.        lineObj1.Delete: lineObj2.Delete
  54.       
  55. End Sub
发表于 2004-5-11 21:31 | 显示全部楼层
vba我一点都不懂,麻烦告诉我怎么用好么?
发表于 2004-5-12 08:10 | 显示全部楼层
本帖最后由 作者 于 2004-5-12 8:36:51 编辑




把上面的dvb文件下载后,注意看文件名是否为GBChamfer.dvb,如果不是,改成这个名字。


在cad的命令行输入 vbaload ,跳出对话框后选择加载GBChamfer.dvb文件。


输入GB启动命令。


注意:本代码是在autocad2005中文版下调试的,对于别的版本没有调试过。估计在autocad2004,2005里应该没有问题。

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-5-13 12:30 | 显示全部楼层
谢谢,先试试看!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 16:33 , Processed in 0.314051 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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