iCAx开思网

标题: 方圆孔圆周分布-宏 [打印本页]

作者: ryouss    时间: 2018-5-29 14:14
标题: 方圆孔圆周分布-宏
本帖最后由 ryouss 于 2018-5-30 09:37 编辑

https://www.icax.org/thread-1258414-1-1.html

這是如上的升級版,圆孔圆周分布沒問題后想再試試正方孔,結果還是出現一些無法理解的問題.
有興趣者試試了,看是否能修改程式改善問題.
附SWP檔  [attach]1257981[/attach]

  1. ' *************************************************************
  2. ' macro recorded on 05/20/28 by scliang
  3. ' 功能:圓周分佈方圓孔,本範例因是用除料拉伸,所以鉆孔是平底.
  4. ' 操作: 1.在零件先選取要打孔之平面.
  5. '       2.執行 "main" .
  6. '       3.TextBox 鍵入相關參數值.
  7. '       4.首圈半徑近似於相鄰兩孔之中心(弧長)距離.
  8. '       5.方孔邊長=圓孔直徑.
  9. '
  10. ' *************************************************************

  11. Dim A1X As Double 'TextBox1
  12. Dim A1Y As Double 'TextBox2
  13. Dim A2X As Double
  14. Dim A3X As Double
  15. Dim A3Y As Double
  16. Dim B1X As Double
  17. Dim B1Y As Double
  18. Dim B2X As Double
  19. Dim B2Y As Double
  20. Dim B3X As Double
  21. Dim B3Y As Double
  22. Dim D As Double 'TextBox3
  23. Dim R1 As Double 'TextBox4
  24. Dim Drill_depth As Double 'TextBox5
  25. Dim Circle_number As Integer 'TextBox6
  26. Dim i As Integer
  27. Dim Class_ As Integer
  28. Dim pi As Double
  29. Dim RN As Double
  30. Dim ArcRadius As Double
  31. Dim ArcAngle As Double

  32. Sub main()
  33. UserForm1.Show 0
  34. End Sub

  35. Sub Draw()
  36. With UserForm1
  37. Class_ = .ComboBox1.ListIndex  '孔類代碼 0-->圓孔,1-->方孔
  38. '判定資料是否沒打入
  39. If .TextBox1.value = "" Or .TextBox2.value = "" Or .TextBox3.value = "" Or .TextBox4.value = "" Or .TextBox5.value = "" Or .TextBox6.value = "" Then
  40.       MsgBox ("Enter empty")
  41.       Exit Sub
  42. End If
  43. '判定資料是否是輸入錯誤(起始圓半徑限制不能小於等於鉆孔直徑,也不能小於方孔邊長的1.5倍)
  44. D = .TextBox3.value / 1000 '孔直徑=方孔邊長
  45. R1 = .TextBox4.value / 1000 '首圈中心半徑
  46. If (Class_ = 0 And D >= R1) Or (Class_ = 1 And R1 / D < 1.4999) Then
  47.       MsgBox ("Data error")
  48.       Exit Sub
  49. End If

  50. Set swApp = Application.SldWorks
  51. Set Part = swApp.ActiveDoc
  52. Set swSketchMgr = Part.SketchManager
  53. Part.SketchManager.InsertSketch True '依據選取面插入草圖
  54. Part.SketchManager.AddToDB True  '草圖實体直接添加到數据庫(否則 x<=0 會有問題)
  55. '中心圓之座標及作圖
  56. A1X = .TextBox1.value / 1000 '圓周複製中心 X 座標
  57. A1Y = .TextBox2.value / 1000 '圓周複製中心 Y 座標
  58. A2X = A1X + D / 2 '中心圓之半徑 X 座標
  59. pi = Atn(1) * 4
  60. Circle_number = .TextBox6.value '複製圈數
  61. Drill_depth = .TextBox5.value / 1000 '鉆孔深
  62. '判定孔類之圓周分佈打孔
  63. Select Case Class_
  64. Case 0  '打圓孔
  65. Set swSketchSegment = swSketchMgr.CreateCircle(A1X, A1Y, 0#, A2X, A1Y, 0#) '作中心圓
  66. For i = 1 To Circle_number
  67.       RN = i * R1 '分佈圓周之半徑
  68.       Copy_Number = Int(2 * RN * pi / R1 + 0.5) '分佈圓周之鉆孔數
  69.       Totle_drill_hole = Totle_drill_hole + Copy_Number '累加各圈孔數
  70. '分佈圓之基圓作圖
  71.       B1X = A1X + RN
  72.       B2X = B1X + D / 2
  73.       Set swSketchSegment = swSketchMgr.CreateCircle(B1X, A1Y, 0#, B2X, A1Y, 0#) '各圈基孔
  74. '分佈圓之複製孔數,圓周複製參數:圓弧半徑、圓弧角、複製數、孔間距(間隔弧度)、圖案旋轉、刪除實例
  75.       boolstatus = swSketchMgr.CreateCircularSketchStepAndRepeat(RN, pi, Copy_Number, 2 * pi, True, "", True, True, True)
  76. Next

  77. Case 1 '打方孔
  78. A3X = A1X - D / 2
  79. A3Y = A1Y + D / 2
  80. vSkLines = swSketchMgr.CreateCenterRectangle(A1X, A1Y, 0#, A3X, A3Y, 0#) '中心方孔
  81. 'Stop
  82. For i = 1 To Circle_number
  83. '中心圓之座標及作圖
  84.       RN = i * R1 '分佈圓周之半徑
  85.       B1X = A1X + RN
  86.       B1Y = A1Y
  87.       B3X = B1X - D / 2
  88.       B3Y = A3Y
  89.       vSkLines = swSketchMgr.CreateCenterRectangle(B1X, B1Y, 0, B3X, B3Y, 0) '各圈基準方孔
  90.       ArcAngle = pi - Atn(D / 2 / (RN - D / 2)) '圓周複製弧角
  91.       ArcRadius = Sqr((D / 2) ^ 2 + (RN - D / 2) ^ 2) '圓周複製半徑
  92.       Copy_Number = Int(2 * RN * pi / R1 + 0.5) '複製數
  93.       Totle_drill_hole = Totle_drill_hole + Copy_Number
  94.       boolstatus = swSketchMgr.CreateCircularSketchStepAndRepeat(ArcRadius, ArcAngle, Copy_Number, 2 * pi, False, "", False, False, False)
  95. Next
  96. End Select

  97. .Label8.Caption = 1 + Totle_drill_hole '總鉆孔數
  98. End With
  99. Part.SketchManager.AddToDB False
  100. '除料拉伸
  101. Dim myFeature As Object
  102. Set myFeature = Part.FeatureManager.FeatureCut3(True, False, False, 0, 0, Drill_depth, 0, False, False, False, False, 1.74532925199433E-02, _
  103. 1.74532925199433E-02, False, False, False, False, False, True, True, True, True, False, 0, 0, False)
  104. End Sub
复制代码
在2012版測試正常(2017版測試失敗)
[attach]1257980[/attach]

失敗(測試時圖形過小也容易失敗)
[attach]1257979[/attach]


作者: pyczt    时间: 2018-5-30 13:58
查了外国网站,有个类似的问题,有人建议用重合关系调整中心点,我修改下,应该可行.

作者: ryouss    时间: 2018-5-30 15:53
pyczt 发表于 2018-5-30 13:58
查了外国网站,有个类似的问题,有人建议用重合关系调整中心点,我修改下,应该可行.

謝謝pyczt大大的指導及測試,
在2012版測試如圖所示還是不穩定.

[attach]1258033[/attach]








作者: ryouss    时间: 2018-5-30 15:54
pyczt 发表于 2018-5-30 13:58
查了外国网站,有个类似的问题,有人建议用重合关系调整中心点,我修改下,应该可行.

謝謝pyczt大大的指導及測試,
在2012版測試如圖所示還是不穩定.

[attach]1258033[/attach]








作者: pyczt    时间: 2018-5-30 17:21
我也用SW2012版,再给两个点固定,看是不是稳定了

作者: ryouss    时间: 2018-5-30 18:58
pyczt 发表于 2018-5-30 17:21
我也用SW2012版,再给两个点固定,看是不是稳定了

一個點和圓周中心約束共點應該可以了,4#的測試是沿用已有的零件試的,會導致  NumPoint = 5  的初值就不一定是 5 了,
所以了解道理后,新作零件測試就 ok 啦!

感謝 pyczt大大 這麼用心的指導,有關兩點之方法,會繼續測試看看的.





作者: ryouss    时间: 2018-5-30 19:19
本帖最后由 ryouss 于 2018-5-30 20:14 编辑
pyczt 发表于 2018-5-30 17:21
我也用SW2012版,再给两个点固定,看是不是稳定了

一個點剛試了 X,Y =0  結果出亂了如圖
試了當  X,Y =0 時,設 NumPoint = 6  倒是可以解決.


[attach]1258041[/attach]


作者: pyczt    时间: 2018-5-31 10:57
我上传的第二个文件是中心点和角落点加固定,阵列中心点与第一方块中心点重合的情况,应该会稳定吧。我这里测试是中途会出现求解过定义,但最后是正常的


作者: ryouss    时间: 2018-5-31 20:52
本帖最后由 ryouss 于 2018-5-31 20:55 编辑
pyczt 发表于 2018-5-31 10:57
我上传的第二个文件是中心点和角落点加固定,阵列中心点与第一方块中心点重合的情况,应该会稳定吧。我这里测 ...

2017版試了固定點 x,y=0 時會出亂
[attach]1258071[/attach]

如圖不打勾就正常

[attach]1258072[/attach]

作者: guo_li    时间: 2024-3-7 11:54
顶,好东西一定要顶。




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3