Rotation and transformation matrix

Hi,

I'm struggling with placing a cell along an arc in VBA.

I have a Complex Chain where I will place a cell along the whol chain with a fixed distance.

I have solved the rotation on the "Line" part of the chainm but having trouble with the arc.

The rotation is almost correct, but almost doesn't count :-)

Any one have a suggestion?

The code snippet for placing the cell:

Sub showLineElm(LinElm As ComplexStringElement)
  Dim elm As ElementEnumerator
  Dim aelm As ArcElement
  Dim lelm As LineElement
  Dim oPH As PropertyHandler
  Dim lastsegment As String
  Dim streng As String, streng1 As String
  Dim start As Point3d
  Dim skala As Point3d
  Dim oCell As CellElement
  Dim z As Integer
  Dim ant_cell As Double, distance As Double
  Dim vinkel As Double
  Dim mtrxRotation As Matrix3d
 
  skala.X = 1
  skala.Y = 1
  skala.z = 1
  If LinElm.Type = msdElementTypeComplexString Then
    If LinElm.IsTraversableElement Then
      Set elm = LinElm.GetSubElements
      Do While elm.MoveNext

        Select Case elm.Current.Type
          Case msdElementTypeLine
            Set lelm = elm.Current.AsLineElement
            lastsegment = "Segments[" & (lelm.VerticesCount - 2) & "]."
            Set oPH = CreatePropertyHandler(lelm)
            oPH.SelectByAccessString (lastsegment & "Start")
            start = oPH.GetValueAsPoint3d
            oPH.SelectByAccessString (lastsegment & "Direction")
            streng = oPH.GetValue
            vinkel = Degrees(CDbl(streng))
            mtrxRotation = Matrix3dFromAxisAndRotationAngle(2, CDbl(streng))
            Set oCell = CreateCellElement2("cellname", start, skala, True, mtrxRotation)
            ActiveModelReference.AddElement oCell
            ant_cell = lelm.Length / 0.854
            ant_cell = ant_cell \ 1
            distance = 0
            For z = 1 To ant_cell
              distance = distance + 0.854
              If distance > lelm.Length Then
                Exit For
              End If
              start = lelm.PointAtDistance(distance)
              Set oCell = CreateCellElement2("cellname", start, skala, True, mtrxRotation)
              ActiveModelReference.AddElement oCell
            Next z

          Case msdElementTypeArc
            Set aelm = elm.Current.AsArcElement
            Set oPH = CreatePropertyHandler(aelm)
            oPH.SelectByAccessString ("SweepAngle")
            vinkel = oPH.GetValue
            mtrxRotation = Matrix3dFromAxisAndRotationAngle(2, vinkel)
            start = aelm.StartPoint
            Set oCell = CreateCellElement2("cellname", start, skala, True, mtrxRotation)
            distance = 0
            oCell.Transform Transform3dFromMatrix3dAndFixedPoint3d(mtrxRotation, start)
            ActiveModelReference.AddElement oCell
            ant_cell = aelm.Length / 0.854
            ant_cell = ant_cell \ 1
            For z = 1 To ant_cell
              distance = distance + 0.854
              If distance > aelm.Length Then
                Exit For
              End If
              start = aelm.PointAtDistance(distance)
              Set oCell = CreateCellElement2("cellname", start, skala, True, mtrxRotation)
              oCell.Transform Transform3dFromMatrix3dAndFixedPoint3d(mtrxRotation, start)
              ActiveModelReference.AddElement oCell
            Next z
        End Select
      Loop
    End If
  End If
errExit:
End Sub    'showLineElm

Parents Reply Children
No Data