SolidWorks專門論壇 SolidWorks forum

 找回密碼
 註冊
查看: 1836|回復: 11

API裝配問題(移動與旋轉零組件)

[複製鏈接]
發表於 2018/5/16 14:18:40 | 顯示全部樓層 |閱讀模式
各位版友們有用過組合件相關的API嗎?

我目前遇到一個有關再組合件環境裡移動零組件的問題
通常在零組件加入裝配環境後,我們會先平移或旋轉到適當位置,在開始進行裝配
CreateTransformRotateAxis Method (IMathUtility)
關於旋轉我目前有用範例測試成功了,但是好像只能繞著裝配環境的原點軸向旋轉,不知道有沒有辦法自訂旋轉軸?

還有關於移動的部分我還沒什麼頭緒,有人曉得要怎麼在裝配環境中移動零組件嗎?
發表於 2018/5/16 15:26:18 | 顯示全部樓層
沒用過,剛開始學習API,還卡在如何把一個應用工具加入SW

點評

一起努力學習!!! 等學會建立特徵和裝配,我也要來玩玩SDK  詳情 回復 發表於 2018/5/16 15:48
 樓主| 發表於 2018/5/16 15:47:14 | 顯示全部樓層
翻了Help很久之後終於有解了,把原本Help旋轉的程式加點料就可以平移了但目前還是不知道怎麼自訂旋轉軸來旋轉零件
  1. Const PI As Double = 3.14159
  2.         Const RadPerDeg As Double = PI / 180.0#

  3.         Dim swModel As ModelDoc2
  4.         Dim swModelDocExt As ModelDocExtension
  5.         Dim swAssy As AssemblyDoc
  6.         Dim swDragOp As DragOperator
  7.         Dim swSelMgr As SelectionMgr
  8.         Dim swComp As Component2
  9.         Dim swXform As MathTransform
  10.         Dim swMathUtil As MathUtility
  11.         Dim swOriginPt As MathPoint
  12.         Dim swX_Axis As MathVector
  13.         Dim fileName As String
  14.         Dim errors As Integer
  15.         Dim warnings As Integer
  16.         Dim status As Boolean
  17.         Dim nPts(2) As Double
  18.         Dim vData As Object
  19.         Dim nNow As Single
  20.         Dim i As Integer
  21.         Dim bRet As Boolean

  22.         fileName = "C:\Program Files\SolidWorks Corp\SolidWorks\samples\tutorial\api\assem2.sldasm"
  23.         swModel = SwApp.OpenDoc6(fileName, swDocumentTypes_e.swDocASSEMBLY, swOpenDocOptions_e.swOpenDocOptions_Silent, "", errors, warnings)
  24.         swModelDocExt = swModel.Extension
  25.         status = swModelDocExt.SelectByID2("Part3^Assem2-1@assem2", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
  26.         swAssy = swModel

  27.         swDragOp = swAssy.GetDragOperator
  28.         swSelMgr = swModel.SelectionManager
  29.         swComp = swSelMgr.GetSelectedObjectsComponent2(1)
  30.         swMathUtil = SwApp.GetMathUtility

  31.         nPts(0) = 0.0#
  32.         nPts(1) = 0.0#
  33.         nPts(2) = 0.0#
  34.         vData = nPts
  35.         swOriginPt = swMathUtil.CreatePoint(vData)

  36.         nPts(0) = 1.0#
  37.         nPts(1) = 0.0#
  38.         nPts(2) = 0.0#
  39.         vData = nPts
  40.         swX_Axis = swMathUtil.CreateVector(vData)

  41.         ' This is an incremental rotation,
  42.         ' so angle is always the same
  43.         swXform = swMathUtil.CreateTransformRotateAxis(swOriginPt, swX_Axis, 1.0# * RadPerDeg)

  44.         bRet = swDragOp.AddComponent(swComp, False)

  45.         swDragOp.CollisionDetectionEnabled = False
  46.         swDragOp.DynamicClearanceEnabled = False

  47.         ' Axial rotation
  48.         swDragOp.TransformType = 1

  49.         ' Solve by relaxation
  50.         swDragOp.DragMode = 2

  51.         bRet = swDragOp.BeginDrag

  52.         For i = 0 To 90
  53.             ' Returns false if drag fails
  54.             bRet = swDragOp.Drag(swXform)
  55.             ' Wait for 0.1 secs

  56.             '____________________________________零組件平移_______________________________
  57.             '定義移動距離(Unit:Meter)
  58.             Dim X_move, Y_move, Z_move As Double
  59.             '定義平移矩陣
  60.             Dim swXformMove As MathTransform = swMathUtil.CreateTransform({1, 0, 0, 0, 1, 0, 0, 0, 1, X_move, Y_move, Z_move, 1, 0, 0, 0})
  61.             '移動零組件
  62.             swComp.Transform2 = swXformMove
  63.             '重新計算文件
  64.             bRet = swModel.EditRebuild3
  65.             '_____________________________________________________________________________

  66.             nNow = DateAndTime.Timer
  67.             While DateAndTime.Timer < nNow + 0.1
  68.                 ' Process event loop
  69.                 DoEvents()
  70.             End While
  71.         Next i

  72.         bRet = swDragOp.EndDrag
複製代碼



點評

發現一個新問題 用CreateTransformRotateAxis Method把零組件旋轉之後 再用CreateTransform方法平移,可能會影響先前旋轉的結果 因為這個指令的前九個參數是在定義零組件的軸向(零件座標->UCS,裝配座標->WCS)的單位  詳情 回復 發表於 2018/5/16 16:45
 樓主| 發表於 2018/5/16 15:48:35 | 顯示全部樓層
ruter1224 發表於 2018/5/16 15:26
沒用過,剛開始學習API,還卡在如何把一個應用工具加入SW

一起努力學習!!!

等學會建立特徵和裝配,我也要來玩玩SDK
 樓主| 發表於 2018/5/16 16:45:44 | 顯示全部樓層
jbkndron 發表於 2018/5/16 15:47
翻了Help很久之後終於有解了,把原本Help旋轉的程式加點料就可以平移了但目前還是不知道怎麼自訂旋轉軸來旋 ...

發現一個新問題

用CreateTransformRotateAxis Method把零組件旋轉之後
再用CreateTransform方法平移,可能會影響先前旋轉的結果
因為這個指令的前九個參數是在定義零組件的軸向(零件座標->UCS,裝配座標->WCS)的單位向量
如果沒有預先規劃好的話可能會讓自己被搞亂

而且這個4X4的矩陣和一般正向運動學表示的平移與旋轉的方式不太一樣
所以要自己先算好所有平移旋轉的矩陣後再依CreateTransform的參數格式填入
發表於 2018/5/29 11:36:38 | 顯示全部樓層
还有一种方法可以指定轴的向量,不需要自己去计算。

點評

有實例或代碼可以參考嗎?  詳情 回復 發表於 2018/5/29 14:21
 樓主| 發表於 2018/5/29 14:21:15 | 顯示全部樓層
BobSun 發表於 2018/5/29 11:36
还有一种方法可以指定轴的向量,不需要自己去计算。

有實例或代碼可以參考嗎?

點評

drag and Rotate  詳情 回復 發表於 2018/5/29 21:42
發表於 2018/5/29 21:42:44 | 顯示全部樓層
jbkndron 發表於 2018/5/29 14:21
有實例或代碼可以參考嗎?

drag and Rotate
發表於 2018/5/30 15:01:14 | 顯示全部樓層
sorry,今天才仔細看到您的代碼,其實你是有一個彎沒有繞過來,你想下,你既然寫出了繞原點的代碼,那仔細想下,原點 在代碼中是怎麽表現的?實際上你上述貼出來的代碼并不是繞原點旋轉,而是繞原點的X軸方向進行旋轉。 繞某條軸進行旋轉 首先是要給定程序你的旋轉軸的向量,然後細節計算的問題程序接口函數會幫助你完成,你上述代碼基本是ok的,只需要對一個地方進行修改,就可以完成繞軸旋轉。

點評

我使用“CreateTransformRotateAxis Method (IMathUtility)”方法旋轉 他要我定義出旋轉中心,旋轉軸向量和旋轉角度 但是創建旋轉軸的指令看起來是建立一個以原點為起點的向量 如果不能自己控制起點和終點,那我不知  詳情 回復 發表於 2018/6/1 21:48
 樓主| 發表於 2018/6/1 21:48:07 | 顯示全部樓層
BobSun 發表於 2018/5/30 15:01
sorry,今天才仔細看到您的代碼,其實你是有一個彎沒有繞過來,你想下,你既然寫出了繞原點的代碼,那仔細 ...

我使用“CreateTransformRotateAxis Method (IMathUtility)”方法旋轉
他要我定義出旋轉中心,旋轉軸向量和旋轉角度
但是創建旋轉軸的指令看起來是建立一個以原點為起點的向量
如果不能自己控制起點和終點,那我不知道還有什麼招可以用自訂軸旋轉
所以卡關了...

點評

我在上文已經爲你指明的解決的方式,爲你提供的是個思路---- --------------------------------------------------------------------------- 上述代碼一共出現6個坐標點 前三個為第一個點 后三個為第二個點 兩點之  詳情 回復 發表於 2018/6/1 22:02
發表於 2018/6/1 22:02:39 | 顯示全部樓層
jbkndron 發表於 2018/6/1 21:48
我使用“CreateTransformRotateAxis Method (IMathUtility)”方法旋轉
他要我定義出旋轉中心,旋轉軸向量 ...

我在上文已經爲你指明的解決的方式,爲你提供的是個思路----
---------------------------------------------------------------------------
上述代碼一共出現6個坐標點 前三個為第一個點 后三個為第二個點 兩點之間確定的一條直綫  這條直綫就是你可以指定的旋轉軸
你只需要 正確的填寫這6個點就好了。
這6個點 就是直綫的向量
---------------------------------------------------------------------------
若還有不明白 ,i m sorry  

點評

我一直以爲旋轉中心和旋轉軸是兩回事 以我的了解你的意思應該是旋轉軸是以旋轉中心為起點 創建旋轉軸向量的點為終點,作為旋轉的參照 我再改寫程式碼來試試看,謝謝你的提點  詳情 回復 發表於 2018/6/2 11:47
 樓主| 發表於 2018/6/2 11:47:52 | 顯示全部樓層
BobSun 發表於 2018/6/1 22:02
我在上文已經爲你指明的解決的方式,爲你提供的是個思路----
----------------------------------------- ...

我一直以爲旋轉中心和旋轉軸是兩回事

以我的了解你的意思應該是旋轉軸是以旋轉中心為起點
創建旋轉軸向量的點為終點,作為旋轉的參照
我再改寫程式碼來試試看,謝謝你的提點
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

論壇統計|手機版上論壇|論壇來自幾何科技 論壇架構版次 20240312

GMT+8, 2024/3/29 01:47 , Processed in 0.120944 second(s), 16 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回復 返回頂部 返回列表