VBA Tip: Pick the Right Element

Published on September 22, 2014

Written by Rod Wing

Anyone who has done any MicroStation VBA programming, or recorded a MicroStation VBA macro, knows about the CADInputQueue class. Many beginning VBA programmers will run into problems using the CADInputQueue.SendDataPoint method. They want to select a particular MicroStation element, but their data point intersects with another element and the macro picks the wrong one.

The CADInputQueue.SendDataPointForLocate method lets you get around this problem. Besides the Point3D data point argument it also takes a MicroStation graphical element type:  CADInputQueue.SendDataPointForLocate (ElementToLocate, DataPoint). This method will select the specified element at the data point provided. 

Below is an example of the CadInputQueue.SendDataPointForLocate method in action. This function extrudes a circle along a line element to create a 3D surface to represent a pipe. Since pipe networks are likely to have line elements with common start/end points it is important we identify the correct line when extruding the surface. The CadInputQueue.SendDataPointForLocate method allows this to happen.

Public Function ExtrudeSurfaceAlongPath(elPath As LineElement, dRadius As Double, KeepPath As Boolean) _
    As Boolean
ExtrudeSurfaceAlongPath = False

 On Error GoTo EXIT_SUB

 ' Start Surface By Extrusion Along tool
 CadInputQueue.SendCommand "CONSTRUCT SURFACE ALONG"

 ' Set tool settings
 ' set Alignment to Normal
 SetCExpressionValue "tcb->ms3DToolSettings.smartSolid.tube.surfaceAlign", 0, "3DMODIFY"

 ' toggle off unneeded checkboxes
 SetCExpressionValue "tcb->ms3DToolSettings.smartSolid.tube.surfaceScale", 0, "3DMODIFY"
 SetCExpressionValue "tcb->ms3DToolSettings.smartSolid.tube.surfaceSpin", 0, "3DMODIFY"
 SetCExpressionValue "tcb->ms3DToolSettings.smartSolid.tube.surfaceLockDir", 0, "3DMODIFY"
 SetCExpressionValue "tcb->ms3DToolSettings.smartSolid.tube.surfaceRepair", 0, "3DMODIFY"
' toggle on Circular and Radius checkboxes
 SetCExpressionValue "tcb->ms3DToolSettings.smartSolid.tube.surfaceMode", 1, "3DMODIFY"
 SetCExpressionValue "tcb->ms3DToolSettings.smartSolid.tube.surfaceRadiusLocked", 1, "3DMODIFY"

 ' set radius value
 SetCExpressionValue "tcb->ms3DToolSettings.tubeSurfRad", _
                        (ActiveModelReference.UORsPerMasterUnit * dRadius), "3DMODIFY"
' set Keep Path toggle
 If KeepPath Then
 SetCExpressionValue "tcb->ms3DToolSettings.smartSolid.tube.surfaceKeepPath", 1, "3DMODIFY"
 SetCExpressionValue "tcb->ms3DToolSettings.smartSolid.tube.surfaceKeepPath", 0, "3DMODIFY"
 End If
 ' Select element and accept
 CadInputQueue.SendDataPointForLocate elPath, elPath.StartPoint
 CadInputQueue.SendDataPoint elPath.StartPoint

 ' Reset to complete

 ' All done so start default command and exit
 ExtrudeSurfaceAlongPath = True
End Function



Last month’s tips:

cache manager      inroads end condition priority   Migrating Data Shortcuts    With Statement

MicroStation: Raster                    InRoads: Modify                 AutoCAD Civil 3D:                            VBA: Using the
    Manager Cache Manager                End Condition …             Migrating Data Shortcuts                  With Statement
Don’t want to miss out on other great information? Subscribe to this blog or our monthly eNewsletter now!
Learn More ◊ Contact us today ◊ Newsletter ◊
EnvisionCAD Group EnvisionCAD YouTube Channel   

Like this article? Share it!

Leave a Comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Privacy Policy