home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2002 March / PCWMAR02.iso / software / turbocad / V4 / tcw.z / padwiz.bas < prev    next >
BASIC Source File  |  1997-10-28  |  10KB  |  403 lines

  1. ' This sample program is to illustrate how to create Wizard-like dialogs for TurboCAD
  2. '
  3. ' In this example I explore the possibilities of parametric drawing using scripts in the
  4. ' PCB disciplne.
  5. '
  6. ' Author    : Mike Cartwright, Tamara Cartwright (updated for 4.0)
  7. ' Date        : 10/21/95, 02/06/97
  8. '
  9.  
  10.  
  11.  
  12. ' DBAPI Constants
  13. ' Global Const BrushSolid = 1
  14.  
  15. ' Result is a global variable returned by each page to tell the
  16. ' state machine which button was pressed :
  17. Global Const NextID   = 1
  18. Global Const CancelID = 2
  19. Global Const BackID   = 3
  20. Global Const CreateID = 4
  21.  
  22.  
  23. Dim Result As Long
  24.  
  25.  
  26. Dim Orientation As Long
  27. Dim PadGap      As Double
  28. Dim RowGap         As Double
  29. Dim PadSize        As Double
  30. Dim measure        As Double
  31. Dim es        As Double
  32. Dim es1        As Long
  33. Dim Offset         As Long
  34. Dim TotalPads    As Long
  35. Dim PadShape    As Long
  36.  
  37. Sub Main ()
  38.     Dim dActive As Long
  39.      dActive        = TCWDrawingActive ()
  40. measure = Abs(TCWViewExtentsGetY2() - TCWViewExtentsGetY1())/8.6    
  41.     ' Check for valid drawing
  42.     If dActive = 0 Then
  43.         MsgBox "Program requires active drawing. Open any drawing and try again."
  44.         ' Terminate the program
  45.         Stop
  46.     End If
  47.     
  48.     
  49.     Orientation = 1      ' Default is Horizontal
  50.     Offset = 0          ' Default is not to offset the one row
  51.     TotalPads = 16        ' Total in each row
  52. es1=25*measure
  53. es=es1/100
  54.  
  55.     PadGap = es        ' Gap between pads in the row
  56.     RowGap = es*2        ' Gap between rows
  57.     PadSize    = es*0.5        ' Diameter of pads
  58.     PadShape = 0        ' Circle is 0, Square is 1
  59.     
  60.     ' State is actually an index to tell which page we are currently on
  61.     Dim State As Long
  62.     Dim LastState As Long
  63.     LastState = 3
  64.  
  65.     ' Start on the first page
  66.     State = 0
  67.  
  68.     Do
  69.  
  70.         ' Page "0" - Which way up Vertical or Horizontal?
  71.         If State = 0 Then
  72.             OrientationDlg
  73.         End If
  74.  
  75.         ' Page "1" - Total number of Pads per Row and whether offset or not
  76.         If State = 1 Then
  77.             TotalDlg
  78.         End If
  79.  
  80.         ' Page "2" - Inter-row gap and inter-pad gaps
  81.         If State = 2 Then
  82.             GapDlg
  83.         End If
  84.  
  85.         ' Page "LastState" - What shape, circle or square? What Size?
  86.         If State = LastState Then
  87.             ShapeDlg
  88.         End If
  89.         
  90.         If Result = CreateID Then
  91.             CreatePads
  92.             Exit Do
  93.         End If
  94.  
  95.         If Result = CancelID Then
  96.             MsgBox "The Pad Wizard was cancelled."
  97.             Exit Do
  98.         End If
  99.     
  100.         If Result = NextID And State < LastState Then
  101.             State = State + 1
  102.         End If            
  103.                 
  104.         If Result = BackID And State > 0 Then
  105.             State = State - 1
  106.         End If
  107.  
  108.     Loop
  109. TCWDeselectAll    
  110.         
  111. ' MsgBox "Finished"
  112. End Sub
  113.  
  114.  
  115. Sub OrientationDlg ()
  116.  
  117.     Begin Dialog OrientationDialog 31, 32, 185, 96, "Pad Wizard"
  118.         PushButton 95, 79, 35, 14, "&Next>"             ' Button 1
  119.         PushButton 15,  79, 35, 14, "Cancel"             ' Button 2
  120.         '                            "<&Back"    
  121.         PushButton 135, 79, 35, 14, "&Finish"            ' Button 4
  122. '        GroupBox 1, 75, 183, 1, ""
  123.  
  124.         GroupBox 100, 12, 72, 48, "Orientation"
  125.         OptionGroup .grp1
  126.             OptionButton 108, 24, 55, 9, "&Vertical"   ' Option 0
  127.             OptionButton 108, 40, 55, 9, "&Horizontal"      ' Option 1
  128.  
  129.         GroupBox 10, 12, 82, 48, ""
  130.         Text      14, 18, 74, 40, "If the pads run across the page then choose Horizontal. If not, then choose vertical."
  131.     End Dialog    
  132.  
  133.     Dim Dlg1 As OrientationDialog
  134.     Dlg1.grp1 = Orientation
  135.     Result = Dialog(Dlg1)
  136.     if Result = 3 then
  137.         Result = 4
  138.     End If    
  139.     Orientation = Dlg1.grp1
  140.  
  141. End Sub
  142.  
  143. Sub ShapeDlg ()
  144.     
  145.     Begin Dialog ShapeDialog 31, 32, 185, 96, "Pad Wizard"
  146.         '                            "&Next>"
  147.         PushButton 15,  79, 35, 14, "Cancel"             ' Button 2
  148.         PushButton 55,  79, 35, 14, "<&Back"             ' Button 3
  149.         PushButton 135, 79, 35, 14, "&Finish"            ' Button 4
  150.     '    GroupBox 1, 75, 183, 1, ""
  151.  
  152.         GroupBox 100, 12, 72, 48, "Pad Shape"
  153.         OptionGroup .grp1
  154.             OptionButton 108, 24, 55, 9, "&Circle"   ' Option 0
  155.             OptionButton 108, 40, 55, 9, "&Square"      ' Option 1
  156.         
  157.         GroupBox 10, 12, 82, 48, "Pad Size"
  158.         Text      14, 21, 74, 30, "This is the diameter or width of each pad:"
  159.         TextBox  14, 42, 50, 12, .size
  160.     End Dialog    
  161.  
  162.     Dim Dlg2 As ShapeDialog
  163.     Dlg2.grp1 = PadShape
  164.     Do
  165.         Dlg2.size = PadSize
  166.         Result = Dialog(Dlg2)
  167.         Result = Result + 1
  168.         PadSize = Dlg2.size
  169.  
  170.         If Result = CancelID Then
  171.             Exit Do
  172.         End If
  173.  
  174.         If PadSize >es1/250  And  PadSize < es1/25  Then
  175.             Exit Do
  176.         End If
  177.  
  178.         MsgBox "Pad Size of " & PadSize &" is not in the range ["+Str(es1/250)+".."+Str(es1/25)+"]"
  179.     Loop
  180.  
  181.     PadShape = Dlg2.grp1
  182.  
  183.  
  184. End Sub
  185.  
  186.  
  187. Sub TotalDlg ()
  188.     
  189.     Begin Dialog TotalDialog 31, 32, 185, 96, "Pad Wizard"
  190.         PushButton 95, 79, 35, 14, "&Next>"             ' Button 1
  191.         PushButton 15,  79, 35, 14, "Cancel"             ' Button 2
  192.         PushButton 55,  79, 35, 14, "<&Back"             ' Button 3
  193.         PushButton 135, 79, 35, 14, "&Finish"            ' Button 4
  194. '        GroupBox 1, 75, 183, 1, ""
  195.  
  196.         GroupBox 100, 12, 72, 48, "Offset Pads"
  197.         OptionGroup .grp1
  198.             OptionButton 108, 24, 55, 9, "DI&P - in line"   ' Option 0
  199.             OptionButton 108, 40, 55, 9, "DI&N - offset"    ' Option 1
  200.         
  201.         GroupBox 10, 12, 82, 48, "Number of Pads"
  202.         Text      14, 21, 74, 30, "The number of pads in the longest row:"
  203.         TextBox  14, 42, 50, 12, .total
  204.     End Dialog    
  205.  
  206.     Dim Dlg3 As TotalDialog
  207.     Dlg3.grp1 = Offset
  208.     Do
  209.         Dlg3.total = TotalPads
  210.         Result = Dialog(Dlg3)
  211.         TotalPads = Dlg3.total
  212.  
  213.         If Result = CancelID Then
  214.             Exit Do
  215.         End If
  216.  
  217.         If TotalPads > 1 And TotalPads < 100 Then
  218.             Exit Do
  219.         End If
  220.  
  221.         If TotalPads > 100 Then
  222.             MsgBox TotalPads &" is too many pads"
  223.         End If
  224.         If TotalPads < 2 Then
  225.             MsgBox TotalPads &" is too few pads"
  226.         End If
  227.     Loop
  228.  
  229.     Offset = Dlg3.grp1
  230.     
  231.     
  232.  
  233. End Sub
  234.  
  235.  
  236. Sub GapDlg ()
  237.     
  238.     Begin Dialog GapDialog 31, 32, 185, 96, "Pad Wizard"
  239.         PushButton 95, 79, 35, 14, "&Next>"             ' Button 1        
  240.         PushButton 15,  79, 35, 14, "Cancel"             ' Button 2
  241.         PushButton 55,  79, 35, 14, "<&Back"             ' Button 3
  242.         PushButton 135, 79, 35, 14, "&Finish"            ' Button 4
  243. '        GroupBox 1, 75, 183, 1, ""
  244.         GroupBox 100, 12, 76, 48, "Pad Gap"
  245.         Text      104, 21, 69, 30, "This is the space between pad centers:"
  246.         TextBox  104, 42, 50, 12, .padg
  247.  
  248.         GroupBox 10, 12, 82, 48, "Row Gap"
  249.         Text      14, 21, 74, 30, "This is the space between row centers:"
  250.         TextBox  14, 42, 50, 12, .rowg
  251.     End Dialog    
  252.  
  253.     Dim Dlg4 As GapDialog
  254.     
  255.     Do
  256.         Dlg4.rowg = RowGap
  257.         Dlg4.padg = PadGap
  258.         Result = Dialog(Dlg4)
  259.         
  260.         PadGap = Dlg4.padg
  261.         RowGap = Dlg4.rowg
  262.  
  263.         If Result = CancelID Then
  264.             Exit Do
  265.         End If
  266.  
  267.         If PadGap > PadSize And RowGap > PadSize Then
  268.             Exit Do
  269.         End If
  270.         If PadGap <= PadSize Then
  271.             MsgBox "Pad Gap of " & PadGap & " should be greater than " & PadSize
  272.         End If
  273.         If RowGap <= PadSize Then
  274.             MsgBox "Row Gap of " & RowGap & " should be greater than " & PadSize
  275.         End If
  276.     Loop
  277. End Sub
  278.  
  279.  
  280.  
  281. ' Called on "Create" to actually create the graphics and add them
  282. ' to the drawing. They are left selected to make it easier to move them.
  283.  
  284. Sub CreatePads ()
  285.     Dim dActive  As Long
  286.     
  287.     Dim xc As Double
  288.     Dim yc As Double
  289.     Dim dx1 As Double
  290.     Dim dx2 As Double
  291.     Dim dx3 As Double
  292.     Dim dy1 As Double
  293.     Dim dy2 As Double
  294.     Dim dy3 As Double
  295.     
  296.     Dim row As Long
  297.     Dim col As Long
  298.  
  299.     dActive        = TCWDrawingActive ()
  300.     TCWUndoRecordStart dActive, "Create Pads"
  301.     
  302.     xc = (TCWViewExtentsGetX1() + TCWViewExtentsGetX2())/2.0
  303.     yc = (TCWViewExtentsGetY1() + TCWViewExtentsGetY2())/2.0
  304.     
  305.  
  306.     If Orientation = 1 Then     ' Horizontal
  307.         dx1 = PadGap
  308.         dy1 = 0
  309.         dx2 = 0
  310.         dy2 = -RowGap
  311.     Else                        ' Vertical
  312.         dx1 = 0
  313.         dy1 = -PadGap
  314.         dx2 = RowGap
  315.         dy2 = 0
  316.     End If
  317.  
  318.     ' Move starting point
  319.  
  320.     xc = xc - dx1*TotalPads/2.0 - dx2/2.0
  321.     yc = yc - dy1*TotalPads/2.0    - dy2/2.0
  322.     
  323.  
  324.     For row = 0 to 1
  325.         For col = 0 to TotalPads-1
  326.  
  327.             ' Call our function which creates a pad 
  328.             MakeObject xc + col*dx1 + row*dx2, yc + col*dy1 + row*dy2
  329.  
  330.         Next col
  331.  
  332.         ' For the offset option an extra calculation is required when
  333.         ' switching rows to get the next row's start position
  334.         If Offset Then
  335.             TotalPads = TotalPads - 1
  336.             xc = xc + dx1/2.0
  337.             yc = yc + dy1/2.0
  338.         End If
  339.         
  340.     Next row
  341.  
  342.     TCWGroupCreate "Custom Pads"
  343.     TCWUndoRecordEnd dActive
  344.                       
  345. End Sub
  346.  
  347. Sub MakeObject (ByVal x As Double, ByVal y As Double)
  348.     
  349.     Dim gP As Long
  350.     Dim g1 As Long
  351.     Dim g2 As Long
  352.     Dim r As Double
  353.  
  354.     r = PadSize/2.0
  355.  
  356.     If PadShape = 0 Then
  357.  
  358.         g1 = TCWCircleCenterAndPoint(x, y, 0#, x-2*r, y, 0# )
  359.     Else
  360.         
  361.         ' Create the empty rectangle graphic
  362.         g1 = TCWLineRectangle(x-r, y-r, 0#, x+r, y+r, 0#)
  363.     End If                                
  364.  
  365.     ' Color is set as R, G, B - this is black
  366. result=0
  367.     result = TCWGraphicPropertySet(g1, "PenColor", &H00112233 )
  368.  
  369.     ' Fill Pattern is a style.
  370.     result = TCWGraphicPropertySet(g1, "BrushStyle", "Solid")
  371.  
  372.     ' Add the black background of the pad to the pad group
  373.  
  374.     ' Make the hole 1/3 of the size of the pad unless it is smaller
  375.     ' then a minimum, in which case it is set to that minimum
  376.     r = PadSize/6.0
  377.     If r > 0.0625*measure Then
  378.         r =    0.0625*es1/25
  379.     End If
  380.     
  381.  
  382.     If PadShape = 0 Then
  383.         
  384.         ' Create the empty arc graphic
  385.         g2 = TCWCircleCenterAndPoint(x, y, 0#, x-2*r, y, 0# )
  386.  
  387.     Else
  388.         
  389.         ' Create the empty rectangle graphic
  390.         g2 = TCWLineRectangle(x-r, y-r, 0#, x+r, y+r, 0#)
  391.     End If                                
  392.  
  393.      ' Color is set as R, G, B - this is white
  394.     result = TCWGraphicPropertySet(g2, "PenColor", &H00FFFFFF)
  395.  
  396.     ' Fill Pattern is a style. 
  397.     result = TCWGraphicPropertySet(g2, "BrushStyle", "Solid")
  398.     result = TCWGraphicPropertySet(g1, "Selected", 1 )
  399.     result = TCWGraphicPropertySet(g2, "Selected", 1 )
  400.     
  401. End Sub
  402.  
  403.