home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 November / pcwk_11_98a.iso / Wtestowe / SOFTSRC / vtrial15.exe / DATA.1 / Vangular.cpp < prev    next >
C/C++ Source or Header  |  1997-02-10  |  4KB  |  158 lines

  1. /*
  2. Sample Vdraft C++ code - Vangular.cpp
  3.     (C) Copyright 1997 by SoftSource.  All rights reserved.
  4. Scott Sherman 2-97
  5.  
  6.     This code demonstrates how to...
  7.         1) add an item to Vdraft's pulldown menu and respond when it's chosen
  8.         2) have the user select objects and respond when they're done
  9.         3) work with the selection set
  10.         4) start the user drawing something and pick several points for them
  11.     It prompts the user to select 2 lines,
  12.         then starts a 4 point angular dimension using the endpoints of the lines.
  13. */
  14.  
  15. #include "stdafx.h"
  16. #include "Vdraft.h"
  17.  
  18. static IVdraft vdraft;
  19.  
  20. CString status1("Select first line for angular dimension"),
  21.     status2("Select second line for angular dimension");
  22.  
  23. class cSelectLine : public cSelectEvent
  24. {
  25. public:
  26.     cSelectLine(IVdraft& vdraft, vtAddOnID id, CString& status)
  27.         : cSelectEvent(vdraft,id), m_doc(vdraft.GetActiveDocument())
  28.     {
  29.         // prompt them to select a line & ask to be notified when they're done
  30.         CString name("Select Line");
  31.         ISelectionEvents select(m_doc.GetSelectionEvents());
  32.         select.SetName(name);
  33.         select.SetStatusbar(status);
  34.         select.RequestSingleSelect(id,cVariant(this));
  35.     }
  36. protected:
  37.     // check to see if the user picked a line
  38.     BOOL didUserPickLine()
  39.     {
  40.         ISelection selection(m_doc.GetSelection());
  41.         if (selection.GetCount() < this->pickNumber())
  42.             return FALSE;    // nothing picked - try again
  43.  
  44.         // check if the selected entity is a line
  45.         IEntity entity(selection.GetItem(cVariant(this->pickNumber())));
  46.         if (entity.GetType() != veET_Line)
  47.             return FALSE;    // they didn't pick a line - try again
  48.         return TRUE;
  49.     }
  50.     // if they picked something other than a line, we want to undo their pick
  51.     void undoSelect()
  52.     {
  53.         ICommands commands(m_doc.GetCommands());
  54.         commands.Undo(cVariant());
  55.     }
  56.  
  57.     virtual int pickNumber() = 0;
  58.     IDocument m_doc;
  59. };
  60.  
  61. class cSelect2 : public cSelectLine
  62. {
  63. public:
  64.     cSelect2(IVdraft& vdraft, vtAddOnID id) : cSelectLine(vdraft,id,status2)
  65.     {
  66.     }
  67.  
  68.     virtual void Done()
  69.     {
  70.         if (didUserPickLine())
  71.         {
  72.             // get the lines they just picked
  73.             ISelection selection(m_doc.GetSelection());
  74.             ILine line1(selection.GetItem(cVariant(1))),
  75.                 line2(selection.GetItem(cVariant(2)));
  76.             selection.RemoveAll();    // deselect the lines
  77.  
  78.             // get endpoints of lines
  79.             IVector start1(line1.GetWhere1()),
  80.                 end1(line1.GetWhere2()),
  81.                 start2(line2.GetWhere1()),
  82.                 end2(line2.GetWhere2());
  83.  
  84.             // start them drawing a 4 point angular dimension
  85.             IEntities entities(m_doc.GetEntities());
  86.             entities.Draw4PointAngularDim(cVariant());
  87.             // feed in the line endpoints as point picks
  88.             IPickEvents pick(m_doc.GetPickEvents());
  89.             pick.TriggerPick(start1);
  90.             pick.TriggerPick(end1);
  91.             pick.TriggerPick(start2);
  92.             pick.TriggerPick(end2);
  93.         }
  94.         else
  95.         {    // they didn't pick a line - try again
  96.             undoSelect();
  97.             new cSelect2(getVdraft(),getAddOnID());    // got 1st line - get 2nd line
  98.         }
  99.     }
  100.  
  101. protected:
  102.     virtual int pickNumber()    { return 2; }
  103. };
  104.  
  105. class cSelect1 : public cSelectLine
  106. {
  107. public:
  108.     cSelect1(IVdraft& vdraft, vtAddOnID id) : cSelectLine(vdraft,id,status1)
  109.     {
  110.     }
  111.  
  112.     virtual void Done()
  113.     {
  114.         if (didUserPickLine())
  115.             // got 1st line - get 2nd line
  116.             new cSelect2(getVdraft(),getAddOnID());
  117.         else
  118.         {    // they didn't pick a line - try again
  119.             undoSelect();
  120.             new cSelect1(getVdraft(),getAddOnID());
  121.         }
  122.     }
  123.  
  124. protected:
  125.     virtual int pickNumber()    { return 1; }
  126. };
  127.  
  128. veReturn vfCommand(vtAddOnID id, long eventid)
  129. {
  130.     if (eventid != 1)
  131.         return veR_OK;
  132.     IDocument doc(vdraft.GetActiveDocument());
  133.  
  134.     // deselect everything - we want the 2 entities they're about to select
  135.     ISelection set(doc.GetSelection());
  136.     set.RemoveAll();
  137.  
  138.     // prompt them for the 1st line
  139.     new cSelect1(vdraft,id);
  140.  
  141.     return veR_OK;
  142. }
  143.  
  144. // add a menu item to Vdraft
  145. veReturn vfLoad(vtAddOnID id)
  146. {
  147.     if (!vdraft.CreateDispatch("Vdraft.Application", NULL))
  148.         return veR_Unload;
  149.     CString item("&Dimension 2 Lines"),
  150.         status("Draw an angular dimension using two lines");
  151.     IApplicationEvents events(vdraft.GetEvents());
  152.     events.AddToolsCommand(id,1,item,status);
  153.  
  154.     CString keys("n");
  155.     events.AddKeyboardCommand(id,1,keys);
  156.     return veR_OK;
  157. }
  158.