home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 January / Chip_1997-01_cd.bin / ms95 / disk22 / dir04 / f010540.re_ / f010540.re
Text File  |  1996-04-02  |  8KB  |  217 lines

  1. ' Cell Replacement Example
  2.  
  3.     Private gGravelCell                 As MbeElement
  4.  
  5. '-------------------------------------------------------------
  6. '
  7. '   Shows a rotation matrix.  Useful for debugging.
  8. '
  9. '-------------------------------------------------------------
  10. Sub ShowRotation (indent as Integer, inElem as MbeElement)
  11.     dim iRow as Integer
  12.     dim iCol as Integer
  13.     dim rotMatrix(1 To 3,1 To 3) as Double
  14.     dim myAngle as double
  15.  
  16.     If inElem.getRotation (rotMatrix) = MBE_Success Then
  17.         print Spc(indent);"Rotation :";
  18.         For iRow = 1 To 3
  19.             For iCol = 1 To 3
  20.                 print "  ";rotMatrix(iRow,iCol);   
  21.             Next iCol
  22.             print
  23.             If IRow < 3 Then print Spc(indent);"         :";
  24.         Next iRow
  25.     End If
  26.  
  27. End Sub
  28.  
  29. '------------------------------------------------------------------
  30. '
  31. '   Inverts a rotation matrix
  32. '
  33. '------------------------------------------------------------------
  34. Sub invertRMatrix (outRMatrix() As Double, inRMatrix() As Double)
  35.  
  36.     Dim i                           As Integer
  37.     Dim j                           As Integer
  38.     Dim tRMatrix(1 To 3,1 To 3)     As Double
  39.  
  40.     ' Make copy since inRMatrix and outRMatrix can be the same Matrix
  41.     For i = 1 To 3
  42.         For j = 1 To 3
  43.             tRMatrix(i, j) = inRMatrix(i, j)
  44.         Next j
  45.     Next i
  46.  
  47.     ' Invert the matrix
  48.     For i = 1 To 3
  49.         For j = 1 To 3
  50.             outRMatrix(j, i) = tRMatrix(i, j)
  51.         Next j
  52.     Next i
  53.  
  54. End Sub
  55.  
  56. '------------------------------------------------------------------
  57. '
  58. '   Takes the cell passed in, copies it, and rotates the components
  59. '   of the cell into cell coordinate space.  This step saves us from
  60. '   having to do this rotation each time we use the cell to substitute
  61. '   for another cell.
  62. '
  63. '------------------------------------------------------------------
  64. Function prepareReplacementCell (cellElem As MbeElement) As MbeElement
  65.  
  66.     Dim origin                          As MbePoint
  67.     Dim rMatrix(1 To 3,1 To 3)          As Double
  68.     Dim statI                           As Integer
  69.     Dim statL                           As Long
  70.     Dim newCell                         As New MbeElement
  71.  
  72. '   Make a copy of the cell passed in.
  73.     statL = newCell.fromElement (cellElem)
  74.  
  75.     statI = newCell.getOrigin(origin)
  76.  
  77. '   Unrotate the cell back to it's coordinate space now.  This way, we
  78. '   won't have to do this each time we use the cell to replace another cell.
  79.  
  80.     If newCell.getRotation (rMatrix) = MBE_Success Then
  81.         invertRMatrix rMatrix, rMatrix
  82.         statI = newCell.rotate(rMatrix, origin)
  83.     End If
  84.  
  85.     Set prepareReplacementCell = newCell
  86.  
  87. End Function
  88.  
  89. '------------------------------------------------------------------
  90. '
  91. '   In the plot, the cell "oldCell" is replaced with "repCell".
  92. '   Disproportionate scaling is used so that "repCell" fills the
  93. '   same area on the plot as the original cell.
  94. '
  95. '------------------------------------------------------------------
  96. Sub replaceAndFitCell (oldCell As MbeElement, repCell As MbeElement)
  97.  
  98.     Dim statI                           As Integer
  99.     Dim statL                           As Long
  100.     Dim newCell                         As MbeElement
  101.     Dim oldRange                        As MbeRange
  102.     Dim newRange                        As MbeRange
  103.     Dim oldOrigin                       As MbePoint
  104.     Dim newOrigin                       As MbePoint
  105.     Dim xScale                          As Double
  106.     Dim yScale                          As Double
  107.     Dim zScale                          As Double
  108.     Dim moveDistance                    As MbePoint
  109.     Dim oldRMatrix(1 To 3,1 To 3)       As Double
  110.     Dim invOldRMatrix(1 To 3,1 To 3)    As Double
  111.     Dim boxPoints()                     As MbePoint
  112.  
  113. '   Make a copy of the cell that we're going to use to replace 'inElem'
  114.     Set newCell = New MbeElement
  115.     statL = newCell.fromElement (repCell)
  116.  
  117.     statI = oldCell.getOrigin(oldOrigin)
  118.     statI = newCell.getOrigin(newOrigin)
  119.  
  120. '   Unrotate the cell back to it's coordinate space.  Note that this was already
  121. '   done in prepareReplacementCell() for newCell.
  122.     If oldCell.getRotation (oldRMatrix) = MBE_Success Then
  123.         invertRMatrix invOldRMatrix, oldRMatrix
  124.         statI = oldCell.rotate(invOldRMatrix, oldOrigin)
  125.     End If
  126.  
  127. '   Calculate X, Y and Z scale factors
  128.     statI = oldCell.getCellBox(boxPoints)
  129.     oldRange.xLow = boxPoints(1).x
  130.     oldRange.yLow = boxPoints(1).y
  131.     oldRange.zLow = boxPoints(1).z
  132.     oldRange.xHigh = boxPoints(3).x
  133.     oldRange.yHigh = boxPoints(3).y
  134.     oldRange.zHigh = boxPoints(3).z
  135.  
  136.     statI = newCell.getCellBox(boxPoints)
  137.     newRange.xLow = boxPoints(1).x
  138.     newRange.yLow = boxPoints(1).y
  139.     newRange.zLow = boxPoints(1).z
  140.     newRange.xHigh = boxPoints(3).x
  141.     newRange.yHigh = boxPoints(3).y
  142.     newRange.zHigh = boxPoints(3).z
  143.  
  144.     xScale    = (oldRange.xHigh - oldRange.xLow) / (newRange.xHigh - newRange.xLow)
  145.     yScale    = (oldRange.yHigh - oldRange.yLow) / (newRange.yHigh - newRange.yLow)
  146.     zScale    = (oldRange.zHigh - oldRange.zLow) / (newRange.zHigh - newRange.zLow)
  147.  
  148. '   Apply disproportionate scaling
  149.     statI = newCell.scale (xScale, yScale, zScale, newOrigin)
  150.  
  151. '   Move the origin of the replacement to the origin of the cell to be replaced.
  152.     moveDistance.x = oldOrigin.x - newOrigin.x
  153.     moveDistance.y = oldOrigin.y - newOrigin.y
  154.     moveDistance.z = oldOrigin.z - newOrigin.z
  155.     statI = newCell.move (moveDistance)
  156.     statI = newCell.getOrigin(newOrigin)
  157.  
  158. '   Rotate the replacement cell the same way the cell to be replaced is rotated.
  159.     statI = newCell.rotate(oldRMatrix, newOrigin)
  160.  
  161. '   Replace the cell
  162.     statL = oldCell.fromElement (newCell)
  163.  
  164. End Sub
  165.  
  166. '-------------------------------------------------------------
  167. '
  168. '   This function is called from the section named 'cellsub_gravel'
  169. '   in the pen table named 'cellsub.tbl'.  The pen table
  170. '   selection criteria ensures that only cells and sharedcells
  171. '   are passed to this function.
  172. '
  173. '-------------------------------------------------------------
  174. Function cellsub_gravel (inElem as MbeElement) As Long
  175.  
  176.     Dim cellName$       As String
  177.  
  178.     cellsub_gravel = MBE_ElemNormal
  179.  
  180.     cellName$ = inElem.cellName
  181.     If cellName$ = "A" Or cellName$ = ".Z" Or cellName$ = "SPGRID" Or cellName$ = "INOUT4" Or cellName$ = "CONSHK" Then
  182.         If gGravelCell is not Nothing Then
  183.             replaceAndFitCell inElem, gGravelCell
  184.         End If
  185.     End If
  186.  
  187. End Function
  188.  
  189. '-------------------------------------------------------------
  190. '
  191. '   Find the cell named GRAVEL in the master file.  Later,
  192. '   we will replace certain other cells with this cell in
  193. '   our plots.
  194. '
  195. '-------------------------------------------------------------
  196. Sub main
  197.     dim elem as New MbeElement
  198.     dim filePos as long
  199.  
  200.     MbeCurrentTransform.MasterUnits
  201.  
  202.     filePos = 768*2
  203.     Do 
  204.         filePos = elem.fromFile (filePos)
  205.         If filePos > 0 Then
  206.             filePos = filePos + elem.fileSize
  207.             If elem.type = MBE_SharedCell Or elem.type = MBE_CellHeader Then
  208.                 If gGravelCell is Nothing And elem.cellName = "GRAVEL" Then
  209.                     Set gGravelCell = prepareReplacementCell (elem)
  210.                     Exit Do
  211.                 End If
  212.             End If
  213.         End If
  214.     Loop While filePos > 0
  215.  
  216. End Sub