home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 January / Chip_1997-01_cd.bin / ms95 / disk21 / dir03 / f000850.re_ / f000850.re
Text File  |  1996-04-02  |  17KB  |  523 lines

  1. ' Example produces a table in a design file from comma-delimited file
  2. '
  3. '--------------------------------------------------------------------
  4. '
  5. '  Copyright (1995) Bentley Systems, Inc., All rights reserved.
  6. '
  7. '   $Workfile:   table.bas  $
  8. '   $Revision:   6.4  $
  9. '       $Date:   10 Aug 1995 14:34:06  $
  10. '
  11. '  "MicroStation" is a registered trademark of Bentley Systems, Inc. 
  12. '
  13. '  Limited permission is hereby granted to reproduce and modify this
  14. '  copyrighted material provided that the resulting code is used only
  15. '  in conjunction with Bentley Systems products under the terms of the
  16. '  license agreement provided therein, and that this notice is retained
  17. '  in its entirety in any such reproduction or modification.
  18. '
  19. '--------------------------------------------------------------------
  20. ' This example displays the standard file open dialog box to allow
  21. ' the user to select a comma-delimited file to incorporate into his
  22. ' design file as a table. It reads the file, treating each line in
  23. ' the file as a row and the comma delimiters as column separators.
  24. ' If the file is successfully read, it presents a custom dialog box
  25. ' to the user allowing him to set table parameters like line symbology
  26. ' for the individual table components, text size and spacing. 
  27. ' It then draws the table into the design file.
  28. '--------------------------------------------------------------------
  29. Type TableSymbology
  30.     color  as Integer
  31.     weight as Integer
  32.     style  as Integer
  33. End Type
  34.  
  35. Type TableParams
  36.     columnWidth as Double
  37.     rowHeight   as Double
  38.     textHeight  as Double
  39.     textWidth   as Double
  40.     wantHdgSep  as Integer
  41.     wantColSep  as Integer
  42.     wantRowSep  as Integer
  43.     lineSymb(1 To 5) as TableSymbology
  44. End Type
  45.  
  46. Const OUTLINE   = 1
  47. Const HDGSEP    = 2
  48. Const ROWSEP    = 3
  49. Const COLSEP     = 4
  50. Const TABLETEXT = 5
  51.  
  52. Const CANCELLED = 1
  53.  
  54. '---------------------------------------------------------------
  55. '
  56. ' table_openFile - gets file name from user, opens it.
  57. '                  Returns MBE_Success if successful,
  58. '                  Fills in fileNum and fileName for later use
  59. '
  60. '---------------------------------------------------------------
  61. Function table_openFile (fileName as String, fileNum as Integer)
  62.     Dim status as Integer
  63.  
  64.     fileNum = FreeFile
  65.     status = MbeFileOpen (fileName, "*.txt", _
  66.                    "*.txt,Text Files [*.txt],*.csv,CSV Files [*.csv]", _
  67.                                   "", "Table Input File")
  68.  
  69.     If status = MBE_Success Then
  70.         On Error Goto CantOpen
  71.         Open fileName For Input Access Read as fileNum
  72.     End if
  73.         table_openFile = status
  74.     Exit Function
  75.  
  76. CantOpen:
  77.     status = -1
  78.     Resume Next
  79.  
  80. End Function
  81.  
  82. '---------------------------------------------------------------
  83. '
  84. ' table_parseInputString - parse the comma-delimited input string
  85. '
  86. '---------------------------------------------------------------
  87. Function table_parseInputString (outStrings() as String, inString as String)
  88.     Dim stringNum   as Integer
  89.     Dim commaPos    as Integer
  90.     Dim tmpString   as String
  91.     Dim blankOK     as Integer
  92.  
  93.     stringNum = 0
  94.     Redim outStrings (1 to 1)
  95.  
  96.     Do
  97.         commaPos = Instr (inString, ",", 0)
  98.  
  99.         tmpString = NULL
  100.  
  101.         If commaPos <> 0 Then
  102.             tmpString = Left$ (inString, commaPos - 1)
  103.             inString  = Mid$  (inString, commaPos + 1)
  104.             ' allow empty strings (e.g. first col,,third col)
  105.             blankOK = 1
  106.         Else
  107.             tmpString = inString
  108.         End If
  109.  
  110.         If (Len (tmpString) <> 0) Or blankOK Then
  111.             stringNum = stringNum + 1
  112.             Redim Preserve outStrings (1 to stringNum)
  113.             outStrings (stringNum) = tmpString
  114.         End If
  115.  
  116.     Loop While commaPos <> 0
  117.  
  118.     If stringNum > 0 Then
  119.         table_parseInputString = MBE_Success
  120.     Else
  121.         ' blank line
  122.         table_parseInputString = -1
  123.     End If
  124.  
  125. End Function
  126.  
  127. '---------------------------------------------------------------
  128. '
  129. ' table_readEntries - reads the entries into the array
  130. '
  131. '---------------------------------------------------------------
  132. Function table_readEntries (tableStrings() as String, numRows as Integer, _
  133.                              fileNum as Integer, allowBlank as Integer)
  134.  
  135.     Dim inputString  as String
  136.     Dim rowNum       as Integer
  137.     Dim maxColumns   as Integer
  138.     Dim inputColumns as Integer
  139.     Dim columnNum    as Integer
  140.     Dim iColumn      as Integer
  141.     Dim newTableRows as Integer
  142.     Dim rowStrings() as String
  143.  
  144.     rowNum = 1
  145.     maxColumns = 4
  146.  
  147.     On Error Goto noMoreInput
  148.  
  149.     While not Eof (fileNum)
  150.         Line Input fileNum, inputString
  151.  
  152.         ' parse the input line
  153.         status = table_parseInputString (rowStrings, inputString)
  154.  
  155.         If (status = MBE_Success) Or AllowBlank Then
  156.             inputColumns = UBound(rowStrings) - LBound (rowStrings) + 1
  157.  
  158.             If inputColumns > maxColumns Then
  159.                 maxColumns = inputColumns
  160.                 Redim Preserve tableStrings (1 to UBound(tableStrings, 1),_
  161.                                              1 to maxColumns)
  162.             End If
  163.  
  164.             For iColumn = 1 to inputColumns
  165.                 tableStrings (rowNum, iColumn) = rowStrings (iColumn)
  166.             Next iColumn
  167.  
  168.             rowNum = rowNum + 1
  169.  
  170.             If (rowNum Mod 10) = 0 Then
  171.                 newTableRows = 10 * ((rowNum \ 10) + 1)
  172.                 If (newTableRows > UBound (tableStrings, 1)) Then
  173.                     Redim Preserve tableStrings (1 to newTableRows,_
  174.                                                  1 to UBound (tableStrings, 2))
  175.                 End If
  176.             End If
  177.         End If
  178.     Wend
  179.  
  180.  
  181. noMoreInput:
  182.     numRows = rowNum - 1
  183.  
  184.     If numRows > 0 Then
  185.         text_readEntries = MBE_Success
  186.     Else
  187.         text_readEntries = -1
  188.     End If
  189.  
  190.     Resume doneReading
  191.  
  192. doneReading:
  193.     Close fileNum
  194.  
  195.     Exit Function
  196. End Function
  197.  
  198. '---------------------------------------------------------------
  199. '
  200. ' table_getTableParams - gets table parameters
  201. '
  202. '---------------------------------------------------------------
  203. Function table_getTableParams (table as TableParams)
  204.  
  205.     Dim status       as Integer
  206.     Dim buttonVal    as Long
  207.  
  208.     table.wantHdgSep  = 1
  209.     table.wantColSep  = 1
  210.     table.wantRowSep  = 1
  211.  
  212.     table.columnWidth = 3.0
  213.     table.rowHeight   = 0.3
  214.     table.textHeight  = 0.2
  215.     table.textWidth   = 0.15
  216.  
  217.     table.lineSymb(OUTLINE).color = 0
  218.     table.lineSymb(HDGSEP).color  = 4
  219.     table.lineSymb(COLSEP).color  = 2
  220.     table.lineSymb(ROWSEP).color  = 5
  221.  
  222.     table.lineSymb(OUTLINE).weight = 2
  223.     table.lineSymb(HDGSEP).weight  = 1
  224.     table.lineSymb(COLSEP).weight  = 0
  225.     table.lineSymb(ROWSEP).weight  = 0  
  226.  
  227.     table.lineSymb(OUTLINE).style  = 0
  228.     table.lineSymb(HDGSEP).style   = 0
  229.     table.lineSymb(COLSEP).style   = 0
  230.     table.lineSymb(ROWSEP).style   = 1
  231.  
  232.     buttonVal = MbeOpenModalDialog (1)
  233.  
  234.     If (buttonVal < 0) Or (buttonVal = MBE_BUTTON_OK) Then
  235.         table_getTableParams = MBE_Success
  236.     Else
  237.         table_getTableParams = CANCELLED
  238.     End If
  239.  
  240. End Function
  241.  
  242. '---------------------------------------------------------------
  243. '
  244. ' table_drawOutline - draws outline into design file
  245. '
  246. '---------------------------------------------------------------
  247. Sub table_drawOutline (origin as MbePoint, view as Integer, _
  248.                totalWidth as Double, totalHeight as Double)
  249.     Dim point as MbePoint
  250.  
  251.     point = origin
  252.     Call MbeSendCommand ("PLACE SHAPE")
  253.     Call MbeSendDataPoint (origin, view)
  254.     point.x = origin.x + totalWidth
  255.     Call MbeSendDataPoint (point, view)
  256.     point.y = origin.y - totalHeight
  257.     Call MbeSendDataPoint (point, view)
  258.     point.x = origin.x
  259.     Call MbeSendDataPoint (point, view)
  260.     point.y = origin.y
  261.     Call MbeSendDataPoint (point, view)
  262. End Sub
  263.  
  264. '---------------------------------------------------------------
  265. '
  266. ' table_drawTable - draws table into design file
  267. '
  268. '---------------------------------------------------------------
  269. Sub table_drawTable (table as TableParams, tableStrings() as String, numRows as Integer)
  270.  
  271.     Dim columns     as Integer
  272.     Dim totalWidth  as Double
  273.     Dim totalHeight as Double
  274.     Dim saveColor   as Integer
  275.     Dim saveStyle   as Integer
  276.     Dim saveWeight  as Integer
  277.     Dim saveTxJust  as Integer
  278.     Dim saveAngle   as Double
  279.     Dim saveTxHght  as Double
  280.     Dim saveTxWdth  as Double
  281.     Dim point       as MbePoint
  282.     Dim iCol        as Integer
  283.     Dim iRow        as Integer
  284.     Dim offset      as Double
  285.     Dim eofPos      as Long
  286.     Dim view        as Integer
  287.     Dim origin         as MbePoint
  288.     Dim saveLocTol  as Integer
  289.     Dim saveParse   as Integer
  290.  
  291.     saveColor    = MbeSettings.color
  292.     saveStyle    = MbeSettings.lineStyle
  293.     saveWeight   = MbeSettings.weight
  294.     saveAngle    = MbeSettings.angle
  295.  
  296.     saveTxJust   = MbeSettings.textJustification
  297.     saveTxHght   = MbeSettings.textHeight
  298.     saveTxWdth   = MbeSettings.textWidth
  299.  
  300.     ' We set the locate tolerance to make sure that our PLACE SHAPE 
  301.     '  works OK at all zoom levels
  302.     saveLocTol   = MbeState.locateTolerance
  303.     MbeState.locateTolerance = 0
  304.  
  305.     ' Set parseAll off so MicroStation doesn't try to parse the text
  306.     saveParse    = MbeState.parseAll
  307.     MbeState.parseAll = 0
  308.  
  309.     On Error Goto cleanup
  310.  
  311.     ' turn off messages
  312.     MbeState.messages = 0
  313.  
  314.     ' put everything into a graphic group
  315.     MbeSettings.currentGraphicGroup = MbeDgnInfo.nextGraphicGroup
  316.     MbeSettings.angle = 0.0
  317.  
  318.     ' set up an undo mark
  319.     Call MbeSendCommand ("Mark")
  320.  
  321.     columns = UBound(tableStrings,2) - LBound(tableStrings,2) + 1
  322.  
  323.     totalWidth  = columns * table.columnWidth
  324.     totalHeight = numRows * table.rowHeight
  325.  
  326.     ' Draw the outline shape at position 0,0 in the design file
  327.     MbeSettings.color     = table.lineSymb(OUTLINE).color
  328.     MbeSettings.lineStyle = table.lineSymb(OUTLINE).style
  329.     MbeSettings.weight    = table.lineSymb(OUTLINE).weight
  330.  
  331.     origin.x = 0
  332.     origin.y = 0
  333.     origin.z = 0
  334.     view = 1
  335.  
  336.     ' save file position so we can locate outline shape after placing
  337.     eofPos = MbeDgnInfo.endOfFile
  338.  
  339.     MbeCurrentTransform.fromView view
  340.     MbeState.noElementDisplay = TRUE
  341.  
  342.     Call table_drawOutline (origin, view, totalWidth, totalHeight)
  343.  
  344.     ' Start the Move command to get dynamics
  345.     Call MbeSendCommand ("MOVE")
  346.  
  347.     ' Locate the shape we just placed
  348.     Call MbeLocateElement (eofPos)
  349.  
  350.     ' now get the table position
  351.     Call MbeWritePrompt ("Position table or Reset to exit")
  352.  
  353.     ' wait for data or reset
  354.     Call MbeGetInput (MBE_DataPointInput, MBE_ResetInput)
  355.  
  356.     ' clear the prompt, give "in progress" message
  357.     Call MbeWritePrompt ("")
  358.  
  359.     ' reset aborts, data point gives upper left corner
  360.     If MbeState.inputType = MBE_ResetInput Then
  361.         ' delete the shape we placed
  362.         Call MbeSendCommand ("DELETE")
  363.         Call MbeLocateElement (eofPos)
  364.         Call MbeSendDataPoint (point, view)
  365.  
  366.         Goto cleanupNoMsg
  367.     ElseIf MbeState.inputType = MBE_DataPointInput Then
  368.         ' get the datapoint as the origin
  369.         stat = MbeState.getInputDataPoint (origin, view)
  370.  
  371.     ' delete the shape (can't use it because it's at wrong depth in 3D)
  372.         Call MbeSendCommand ("DELETE")
  373.         Call MbeLocateElement (eofPos)
  374.         Call MbeSendDataPoint (point, view)
  375.     Call MbeWriteStatus ("Generating Table")
  376.     End If
  377.  
  378.     MbeState.noElementDisplay = FALSE
  379.  
  380.     ' set transform back to master units
  381.     MbeCurrentTransform.masterUnits
  382.     ' set the transform from the selected view
  383.     MbeCurrentTransform.fromView view
  384.  
  385.     ' place the outline (again, but with right transform and depth)
  386.     Call table_drawOutline (origin, view, totalWidth, totalHeight)
  387.     point = origin
  388.  
  389.     ' Draw the heading separator
  390.     If table.wantHdgSep <> 0 Then
  391.         MbeSettings.color     = table.lineSymb(HDGSEP).color
  392.         MbeSettings.lineStyle = table.lineSymb(HDGSEP).style
  393.         MbeSettings.weight    = table.lineSymb(HDGSEP).weight
  394.         Call MbeSendCommand ("PLACE LINE")
  395.         point.x = origin.x
  396.         point.y = origin.y - table.rowHeight
  397.         Call MbeSendDataPoint (point, view)
  398.         point.x = origin.x + totalWidth
  399.         Call MbeSendDataPoint (point, view)
  400.         MbeSendReset
  401.     End If
  402.  
  403.     ' Draw the column separators
  404.     If table.wantColSep <> 0 Then
  405.         MbeSettings.color     = table.lineSymb(COLSEP).color
  406.         MbeSettings.lineStyle = table.lineSymb(COLSEP).style
  407.         MbeSettings.weight    = table.lineSymb(COLSEP).weight
  408.         For iCol = 1 To columns - 1
  409.             point.x = origin.x + iCol * table.columnWidth
  410.             point.y = origin.y
  411.             Call MbeSendDataPoint (point, view)
  412.             point.y = origin.y - totalHeight
  413.             Call MbeSendDataPoint (point, view)
  414.             MbeSendReset
  415.         Next iCol
  416.     End If
  417.  
  418.     ' Draw the row separators
  419.     If table.wantRowSep <> 0 Then
  420.         MbeSettings.color     = table.lineSymb(ROWSEP).color
  421.         MbeSettings.lineStyle = table.lineSymb(ROWSEP).style
  422.         MbeSettings.weight    = table.lineSymb(ROWSEP).weight
  423.         For iRow = 1 To numRows - 1
  424.             point.x = origin.x
  425.             point.y = origin.y - table.rowHeight * (iRow + 1)
  426.             Call MbeSendDataPoint (point, view)
  427.             point.x = origin.x + totalWidth
  428.             Call MbeSendDataPoint (point, view)
  429.             MbeSendReset
  430.         Next iRow
  431.     End If
  432.  
  433.     ' Draw the actual text
  434.     MbeSettings.color     = table.lineSymb(TABLETEXT).color
  435.     MbeSettings.lineStyle = table.lineSymb(TABLETEXT).style
  436.     MbeSettings.weight    = table.lineSymb(TABLETEXT).weight
  437.     MbeSettings.textJustification = MBE_LeftTop
  438.  
  439.     MbeSettings.textHeight = table.textHeight
  440.     MbeSettings.textWidth  = table.textWidth
  441.     offset = (table.rowHeight - table.textHeight) / 2
  442.     Call MbeSendCommand ("PLACE TEXT")
  443.     For iRow = 1 To numRows
  444.         For iCol = 1 to columns
  445.             If Len (tableStrings (iRow, iCol)) <> 0 Then
  446.                 point.x = origin.x + table.textWidth + table.columnWidth * (iCol - 1)
  447.                 point.y = origin.y - offset - table.rowHeight * (iRow - 1)
  448.                 Call MbeSendKeyin (tableStrings (iRow, iCol))
  449.                 Call MbeSendDataPoint (point, view)
  450.             End If
  451.         Next iCol
  452.     Next iRow
  453.     Call MbeSendCommand ("NULL")
  454.     
  455. cleanup:
  456.     Call MbeWriteStatus ("Table completed")
  457.  
  458. cleanupNoMsg:
  459.     ' set transform back to master units
  460.     MbeCurrentTransform.masterUnits
  461.  
  462.     MbeSettings.color       = saveColor
  463.     MbeSettings.lineStyle   = saveStyle
  464.     MbeSettings.weight      = saveWeight
  465.     MbeSettings.angle        = saveAngle
  466.  
  467.     MbeSettings.textJustification = saveTxJust
  468.     MbeSettings.textHeight = saveTxHght
  469.     MbeSettings.textWidth  = saveTxWdth
  470.  
  471.     MbeSettings.currentGraphicGroup = 0
  472.     MbeState.messages         = 1
  473.     MbeState.noElementDisplay = FALSE
  474.     MbeState.locateTolerance  = saveLocTol
  475.     MbeState.parseAll          = saveParse
  476.  
  477. End Sub
  478.  
  479. '---------------------------------------------------------------
  480. '
  481. ' Main Entry point
  482. '
  483. '---------------------------------------------------------------
  484. Sub Main
  485.     Dim tableStrings() as String
  486.     Dim fileName$ as String
  487.     Dim fileNum   as Integer
  488.     Dim status    as Integer
  489.     Dim numRows   as Integer
  490.     Dim tableInfo as TableParams
  491.  
  492.  
  493.     ' start tableString size as something reasonable
  494.     Redim tableStrings (1 to 10, 1 to 4)
  495.  
  496.     ' Start MicroStation off at a known state
  497.     Call MbeSendCommand ("NULL")
  498.  
  499.     status = table_openFile (fileName$, fileNum)
  500.  
  501.     If status <> MBE_Success Then
  502.         If status <> CANCELLED Then
  503.             MbeMessageBox ("Can't open file")
  504.         End If
  505.         Exit Sub
  506.     End If
  507.  
  508.     ' read the file once to get the entry count
  509.     If table_readEntries (tableStrings, numRows, fileNum, TRUE) <> MBE_Success Then
  510.         MbeMessageBox ("File is wrong format")
  511.         Exit Sub
  512.     End If
  513.  
  514.     If table_getTableParams(tableInfo) <> MBE_Success Then
  515.         Exit Sub
  516.     End If
  517.  
  518.     Call table_drawTable (tableInfo, tableStrings, numRows)
  519.  
  520. End Sub
  521.  
  522.  
  523.