home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 January / Chip_1997-01_cd.bin / ms95 / disk21 / dir04 / f000990.re_ / f000990.re
Text File  |  1996-04-02  |  12KB  |  329 lines

  1. Attribute VB_Name = "locate"
  2. ' Example of element location techniques
  3. '--------------------------------------------------------------------
  4. '--------------------------------------------------------------------
  5. '
  6. '  Copyright (1995) Bentley Systems, Inc., All rights reserved.
  7. '
  8. '   $Workfile:   locate.bas  $
  9. '   $Revision:   6.0  $
  10. '       $Date:   13 Sep 1995 11:50:48  $
  11. '
  12. '  "MicroStation" is a registered trademark of Bentley Systems, Inc.
  13. '
  14. '  Limited permission is hereby granted to reproduce and modify this
  15. '  copyrighted material provided that the resulting code is used only
  16. '  in conjunction with Bentley Systems products under the terms of the
  17. '  license agreement provided therein, and that this notice is retained
  18. '  in its entirety in any such reproduction or modification.
  19. '
  20. '--------------------------------------------------------------------
  21. '
  22. ' This example uses a number of the MicroStation Basic Extension
  23. ' element location techniques. The actual manipulation that it
  24. ' performs on selected elements is very simple in this example, but
  25. ' the same technique could be used to implement a more sophisticated
  26. ' manipulation. Similarly, the filtering that it does during the
  27. ' element selection logic is simple, but the technique could be
  28. ' readily extended.
  29. '
  30. ' This example looks fairly complicated because it emulates all of
  31. ' the behavior that MicroStation exhibits when it locates elements:
  32. '
  33. '  1. When you reject an element that is hilited, it keeps looking
  34. '     around the data point for more elements that have not been
  35. '     processed.
  36. '  2. When you select an element and accept it with a point that
  37. '     is close to the selection point, it looks for more
  38. '     elements around the same point, skipping elements already
  39. '     processed.
  40. '  3. When you select an element and accept it with a point that
  41. '     is not close to the selection point, it uses the accept
  42. '     point to begin looking for more elements to process.
  43. '
  44. ' In addition, it provides a step that filters elements so that only
  45. ' elements that are acceptable to the program are presented to the
  46. ' user for acceptance or rejection.
  47. '
  48. '--------------------------------------------------------------------
  49.  
  50. '---------------------------------------------------------------
  51. '
  52. '   locate_pointsCloseEnough - returns TRUE if points roughly
  53. '       within the locate tolerance, FALSE otherwise
  54. '
  55. '---------------------------------------------------------------
  56. Function locate_pointsCloseEnough(point1 As Object, point2 As Object) As Integer
  57.  
  58.     Dim MbeState As Object
  59.  
  60.     Set MbeState = msApp.MbeState
  61.  
  62.     If Abs(point1.x - point2.x) + Abs(point1.y - point2.y) _
  63.             < MbeState.LocateTolerance Then
  64.     locate_pointsCloseEnough = True
  65.     End If
  66. End Function
  67.  
  68.  
  69. '---------------------------------------------------------------
  70. '
  71. '   locate_manipulateElement - performs the actual manipulation
  72. '               on the selected element. This manipulation
  73. '           sequences commands and uses the MbeRelocate
  74. '       subroutine to make the command work on the
  75. '       previously selected element
  76. '
  77. '---------------------------------------------------------------
  78. Sub locate_manipulateElement(point As Object, view As Integer)
  79.  
  80.     Dim elem     As Object
  81.     Dim filePos  As Long
  82.     Dim MbeState As Object
  83.  
  84.     Set elem = msApp.MbeElement
  85.     Set MbeState = msApp.MbeState
  86.  
  87.     ' turn off graphics while changing element
  88.     MbeState.noElementDisplay = 1
  89.  
  90.     ' start change color and relocate element
  91.     msApp.MbeSendCommand "CHANGE COLOR"
  92.     msApp.MbeRelocate point, view
  93.     msApp.MbeSendDataPoint point, view
  94.  
  95.     ' start change weight and relocate element
  96.     msApp.MbeSendCommand "CHANGE WEIGHT"
  97.     msApp.MbeRelocate point, view
  98.     msApp.MbeSendDataPoint point, view
  99.  
  100.     ' relocate the manipulated element to reset the "locate context",
  101.     ' so if we continue the locate, we'll continue with the next element
  102.     ' before we do so, we set the command to something harmless, so
  103.     ' the data point sent by MbeRelocate doesn't have the effect of
  104.     ' changing the weight of an element that may have been selected
  105.     ' by sending the accept data point to the CHANGE WEIGHT command.
  106.     ' (NOTE: this section could have been shortened by substituting
  107.     '        MbeRelocate for the above MbeSendDataPoint, but this
  108.     '        looks a bit confusing).
  109.     msApp.MbeSendCommand "LOCELE"
  110.     msApp.MbeRelocate point, view
  111.  
  112.     MbeState.noElementDisplay = 0
  113.  
  114.     ' get the element to redraw it with its new symbology
  115.     filePos = elem.fromLocate()
  116.     elem.display msApp.MBE_NormalDraw
  117.  
  118.     ' set MicroStation to a neutral state.
  119.     msApp.MbeSendCommand "NULL"
  120.  
  121. End Sub
  122.  
  123.  
  124. '---------------------------------------------------------------
  125. '
  126. '   locate_isElementAcceptable - returns TRUE if element passes
  127. '               filter criteria and FALSE otherwise.
  128. '
  129. '---------------------------------------------------------------
  130. Function locate_isElementAcceptable(elem As Object) As Integer
  131.     If elem.type = msApp.MBE_Line Then
  132.         locate_isElementAcceptable = True
  133.     End If
  134. End Function
  135.  
  136. '---------------------------------------------------------------
  137. '
  138. '   locate_elementUnacceptable - reports an error saying that
  139. '               no acceptable element was located.
  140. '
  141. '---------------------------------------------------------------
  142. Sub locate_elementUnacceptable()
  143.     msApp.MbeWriteStatus "Only lines allowed"
  144. End Sub
  145.  
  146. '---------------------------------------------------------------
  147. '
  148. '   locate_displayPrompts - tell the user what to identify
  149. '
  150. '---------------------------------------------------------------
  151. Sub locate_displayPrompts()
  152.     msApp.MbeWriteCommand "Locate Test "
  153.     msApp.MbeWritePrompt "Identify line"
  154. End Sub
  155.  
  156. '---------------------------------------------------------------
  157. '
  158. '   locate_selectElementsToModify - solicits user for elements to
  159. '           modify and manipulates them.
  160. '
  161. '---------------------------------------------------------------
  162. Sub locate_selectElementsToModify()
  163.     Dim elem            As Object
  164.     Dim filePos         As Long
  165.     Dim point           As Object
  166.     Dim acceptPoint As Object
  167.     Dim acceptScreenPt  As Object
  168.     Dim firstScreenPt   As Object
  169.     Dim MbeState    As Object
  170.     Dim stat            As Integer
  171.     Dim view            As Integer
  172.     Dim acceptView  As Integer
  173.     Dim continueLocate  As Integer
  174.     Dim haveAcceptPoint As Integer
  175.  
  176.     continueLocate = False
  177.     haveAcceptPoint = False
  178.  
  179.     Set point = msApp.MbePoint
  180.     Set acceptPoint = msApp.MbePoint
  181.     Set acceptScreenPt = msApp.MbePoint
  182.     Set firstScreenPt = msApp.MbePoint
  183.     Set elem = msApp.MbeElement
  184.     Set MbeState = msApp.MbeState
  185.  
  186.     Do
  187.     ' Display messages
  188.     Call locate_displayPrompts
  189.  
  190.     ' Start locating an element, don't put out msgs,
  191.     ' don't hilite when found, don't allow components,
  192.     ' continue locate from previous element if appropriate.
  193.     msApp.MbeStartLocate 0, 0, 0, continueLocate
  194.  
  195.     ' If accepted element or continuing from a reset
  196.     ' send the previously entered point.
  197.     If haveAcceptPoint Or continueLocate Then
  198.         Call msApp.MbeSendDataPoint(acceptPoint, acceptView)
  199.         continueLocate = False
  200.  
  201.         ' If previous element accepted, future comparisons are to accept point
  202.         If haveAcceptPoint Then
  203.             haveAcceptPoint = False
  204.         point.x = acceptPoint.x: point.y = acceptPoint.y: point.z = acceptPoint.z
  205.         view = acceptView
  206.         firstScreenPt.x = acceptScreenPt.x
  207.         firstScreenPt.y = acceptScreenPt.y
  208.         firstScreenPt.z = acceptScreenPt.z
  209.         End If
  210.     Else
  211.         ' Wait for a data point or a reset
  212.         msApp.MbeGetInput msApp.MBE_DataPointInput, msApp.MBE_ResetInput
  213.  
  214.         ' If user resets, exit the loop.
  215.         If MbeState.inputType = msApp.MBE_ResetInput Then
  216.         Exit Do
  217.  
  218.         ' On a data point, retrieve the point for future use, then
  219.         '   send it through to be processed.
  220.         ElseIf MbeState.inputType = msApp.MBE_DataPointInput Then
  221.             stat = MbeState.getInputDataPoint(point, view, firstScreenPt)
  222.         msApp.MbeSendLastInput
  223.         End If
  224.     End If
  225.  
  226.     ' If we found an element, check for acceptability
  227.     If MbeState.cmdResult = msApp.MBE_AcceptQuery Then
  228.         ' if we did not find a line, keep resetting until
  229.         '    either we find one or we run out of candidates
  230.         Do
  231.         filePos = elem.fromLocate()
  232.         If locate_isElementAcceptable(elem) Then
  233.  
  234.             ' located an acceptable element - hilite it
  235.             elem.display msApp.MBE_Hilite
  236.  
  237.             ' prompt the user to accept or reject it
  238.             msApp.MbeWritePrompt "Accept / Reject"
  239.  
  240.             ' get data to accept, reset to reject
  241.             msApp.MbeGetInput msApp.MBE_DataPointInput, msApp.MBE_ResetInput
  242.  
  243.             If MbeState.inputType = msApp.MBE_DataPointInput Then
  244.                 ' on Data point, accept element and modify it
  245.             stat = MbeState.getInputDataPoint(acceptPoint, _
  246.                             acceptView, acceptScreenPt)
  247.             Call locate_manipulateElement(point, view)
  248.  
  249.             ' continue locating if accept point near first point
  250.             continueLocate = locate_pointsCloseEnough(acceptScreenPt, _
  251.                                    firstScreenPt)
  252.             haveAcceptPoint = True
  253.             Else
  254.             ' user rejected it - continue looking around the same point
  255.             ' by continuing the locate operation in the loop.
  256.             elem.display msApp.MBE_NormalDraw
  257.             acceptPoint = point
  258.             acceptView = view
  259.             continueLocate = True
  260.             End If
  261.             Exit Do
  262.         Else
  263.             ' found an element but it is not acceptable to our filter.
  264.             ' Send resets to the locate logic to cause it to retrieve
  265.             ' the next closest element in range
  266.             msApp.MbeSendReset
  267.             If MbeState.cmdResult = msApp.MBE_ElementNotFound Then
  268.             Call locate_elementUnacceptable
  269.             Exit Do
  270.             End If
  271.         End If
  272.         Loop While elem.type <> msApp.MBE_Line
  273.     ElseIf MbeState.cmdResult = msApp.MBE_ElementNotFound Then
  274.         msApp.MbeWriteError "Element Not Found"
  275.     Else
  276.         Debug.Print "unexpected MbeState.cmdResult of "; MbeState.cmdResult
  277.     End If
  278.     Loop
  279.  
  280. End Sub
  281.  
  282. '---------------------------------------------------------------
  283. '
  284. '   LocateEntry - entry point for locate test program
  285. '
  286. '---------------------------------------------------------------
  287. Sub LocateTest()
  288.     Dim saveColor       As Integer
  289.     Dim saveWeight  As Integer
  290.     Dim saveMsgs        As Integer
  291.     Dim elemSet     As Object
  292.     Dim MbeSettings As Object
  293.     Dim MbeState    As Object
  294.  
  295.     Set elemSet = msApp.MbeElementSet
  296.     Set MbeSettings = msApp.MbeSettings
  297.     Set MbeState = msApp.MbeState
  298.     
  299.     ' set up for manipulation by saving the old settings and setting new ones
  300.     saveColor = MbeSettings.color
  301.     saveWeight = MbeSettings.weight
  302.     saveMsgs = MbeState.messages
  303.  
  304.     ' set MicroStation to a neutral state
  305.     msApp.MbeSendCommand "NULL"
  306.  
  307.     ' get rid of any selection set
  308.     If elemSet.fromSelectionSet(1) = msApp.MBE_Success Then
  309.         elemSet.Clear
  310.     End If
  311.     
  312.     MbeSettings.color = 3
  313.     MbeSettings.weight = 3
  314.     MbeState.messages = 0
  315.  
  316.     locate_selectElementsToModify
  317.  
  318.     msApp.MbeWriteStatus "Leaving locate function"
  319.  
  320.     ' Clear the messages
  321.     MbeSettings.color = saveColor
  322.     MbeSettings.weight = saveColor
  323.     MbeState.messages = saveMsgs
  324.  
  325.     msApp.MbeWritePrompt
  326.     msApp.MbeWriteCommand
  327. End Sub
  328.  
  329.