alan_cmh 发表于 2004-5-2 15:02:00

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

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


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


請高手指教!謝謝!

ZZXXQQ 发表于 2004-6-23 08:53:00

试一下下面的LISP程序


(DEFUN C:CORNER (/ GETLINE VLINE1 VLINE2 DL1 DL2 PT1 PT2 PT3 PT4 PT5 PT6 PT7 ANG1 ANG2)


(DEFUN GETLINE (MSG / A1)<BR>        (INITGET 1)<BR>        (SETQ A1 (CAR (ENTSEL MSG)))<BR>        (WHILE (/= (CDR (ASSOC 0 (ENTGET A1))) "LINE")<BR>       (PRINC "\n您选的不是线图元,请再选一次...")<BR>       (INITGET 1)<BR>       (SETQ A1 (CAR (ENTSEL MSG)))<BR>        )<BR>        A1<BR>)


        (SETQ VLINE1 (GETLINE "\n请选取第一条线: "))<BR>        (WHILE (OR (= VLINE2 nil) (EQUAL VLINE1 VLINE2))<BR>       (IF (EQUAL VLINE1 VLINE2) (PRINC "\n线重复,请再选一次..."))<BR>       (SETQ VLINE2 (GETLINE "\n请选取第二条线: "))<BR>        )<BR>        (SETQ D (GETDIST "\n倒角距离 &lt;1.5&gt; : ")<BR>                                               D (IF (= D nil) 1.5 D))<BR>        (SETQ DL1 (ENTGET VLINE1)                                       DL2 (ENTGET VLINE2)<BR>                                               PT1 (CDR (ASSOC 10 DL1)) PT2 (CDR (ASSOC 11 DL1))<BR>                                               PT3 (CDR (ASSOC 10 DL2)) PT4 (CDR (ASSOC 11 DL2))<BR>                                               PT5 (INTERS PT1 PT2 PT3 PT4 nil))<BR>        (IF (/= PT5 nil) (PROGN<BR>       (SETQ PT2 (IF (&lt; (DISTANCE PT5 PT1) (DISTANCE PT5 PT2)) PT2 PT1)<BR>                                                       PT4 (IF (&lt; (DISTANCE PT5 PT3) (DISTANCE PT5 PT4)) PT4 PT3)<BR>                                                       ANG1 (ANGLE PT5 PT2)                       ANG2 (ANGLE PT5 PT4)<BR>                                                       PT1 (POLAR PT5 ANG1 D)       PT3 (POLAR PT5 ANG2 D)<BR>                                                       PT5 (POLAR PT3 ANG1 D))<BR>       (ENTDEL VLINE1) (ENTDEL VLINE2)<BR>       (COMMAND "LINE" PT2 PT1 PT5 PT3 PT4 "")<BR>        )<BR>       (T (PRINC "\n两直线无交点!"))<BR>        )<BR>        (PRINC)<BR>)<BR>(PRINC "\nType CORNER to start.")<BR>(PRINC)

haoboy-lgh 发表于 2004-5-2 18:37:00

有这样的命令吗

无痕 发表于 2004-5-3 04:06:00

都是直角么?

ljcgq 发表于 2004-5-9 07:15:00

直角,还有园的四分之一,

subtlation 发表于 2004-5-10 16:00:00

这个我也经常用到,最好两个1.5可以不相同,比如一个1,一个1.5等。

alan_cmh 发表于 2004-5-10 21:49:00

我的意思是誰能編寫一個這樣的特殊的倒角lisp程序,只要選擇兩條邊


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


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


所以要求助大家編制這樣一個lisp程序!謝謝!

subtlation 发表于 2004-5-11 13:41:00

本帖最后由 作者 于 2004-5-12 8:07:04 编辑

我只会vba,用vba写了一个以下是主程序的代码,Sub GBChamfer()
       On Error Resume Next
       Dim dist1 As Double, dist2 As Double
       dist1 = 0.5: dist2 = 0.8
      
       Dim lineObj1 As AcadLine, lineObj2 As AcadLine
       Dim pt1, pt2
      
       gwGetEntity lineObj1, pt1, "请选择第一条直线:", "AcDbLine"
       If lineObj1 Is Nothing Then Exit Sub
      
       gwGetEntity lineObj2, pt2, "请选择第二条直线:", "AcDbLine"
       If lineObj2 Is Nothing Then Exit Sub       Dim jointPnt, startPnt1, startPnt2, endPnt1, endPnt2, startPnt3
       jointPnt = lineObj1.IntersectWith(lineObj2, acExtendBoth)
       If UBound(jointPnt) = -1 Then Exit Sub
      
       If (Abs(GetAngleFromX(jointPnt, pt1) - GetAngleFromX(jointPnt, lineObj1.StartPoint)) < 0.1 Or _
               Abs(Abs(GetAngleFromX(jointPnt, pt1) - GetAngleFromX(jointPnt, lineObj1.StartPoint)) - 2 * PI) < 0.1) And _
             GetDistance(jointPnt, pt1) < GetDistance(jointPnt, lineObj1.StartPoint) Then
               startPnt1 = lineObj1.StartPoint
       Else
               startPnt1 = lineObj1.EndPoint
       End If
      
       If (Abs(GetAngleFromX(jointPnt, pt2) - GetAngleFromX(jointPnt, lineObj2.StartPoint)) < 0.1 Or _
               Abs(Abs(GetAngleFromX(jointPnt, pt2) - GetAngleFromX(jointPnt, lineObj2.StartPoint)) - 2 * PI) < 0.1) And _
             GetDistance(jointPnt, pt2) < GetDistance(jointPnt, lineObj2.StartPoint) Then
               startPnt2 = lineObj2.StartPoint
       Else
               startPnt2 = lineObj2.EndPoint
       End If
      
       'If GetDistance(jointPnt, startPnt1) < dist1 Or GetDistance(jointPnt, startPnt2) < dist2 Then
       '       ThisDrawing.Utility.Prompt "倒角的间距过大,退出命令。"
       '       Exit Sub
       'End If
      
       endPnt1 = GetPointAR(jointPnt, GetAngleFromX(jointPnt, startPnt1), dist1)
       endPnt2 = GetPointAR(jointPnt, GetAngleFromX(jointPnt, startPnt2), dist2)
       startPnt3 = GetPointAR(endPnt2, GetAngleFromX(jointPnt, startPnt1), dist1)
      
       Dim newObj1 As AcadLine, newObj2 As AcadLine, newObj3 As AcadLine, newObj4 As AcadLine
       Set newObj1 = ThisDrawing.ModelSpace.AddLine(startPnt1, endPnt1)
       Set newObj2 = ThisDrawing.ModelSpace.AddLine(startPnt2, endPnt2)
       Set newObj3 = ThisDrawing.ModelSpace.AddLine(startPnt3, endPnt1)
       Set newObj4 = ThisDrawing.ModelSpace.AddLine(startPnt3, endPnt2)
      
       newObj1.Layer = lineObj1.Layer: newObj1.Linetype = lineObj1.Linetype
       newObj2.Layer = lineObj2.Layer: newObj2.Linetype = lineObj2.Linetype
       newObj3.Layer = lineObj1.Layer: newObj3.Linetype = lineObj1.Linetype
       newObj4.Layer = lineObj1.Layer: newObj4.Linetype = lineObj1.Linetype
      
       lineObj1.Delete: lineObj2.Delete
      
End Sub

ljcgq 发表于 2004-5-11 21:31:00

vba我一点都不懂,麻烦告诉我怎么用好么?

subtlation 发表于 2004-5-12 08:10:00

本帖最后由 作者 于 2004-5-12 8:36:51 编辑




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


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


输入GB启动命令。


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

alan_cmh 发表于 2004-5-13 12:30:00

谢谢,先试试看!
页: [1] 2 3
查看完整版本: [求助]一個特殊的倒角程序