ADN Open CIS
Сообщество программистов Autodesk в СНГ

02/09/2013

Использование реакторов в AutoCAD Javascript API

Вам необходимо прочитать статью о введении в Javascript API для AutoCAD. Это небольшой пример, демонстрирующий  использование реакторов. В этом примере мы будем включать/выключать реактор ObjectModified для выбранного примитива.

Чтобы попробовать скопируйте код  и сохраните его в файл с расширением .js (javascript). Запустите AutoCAD 2014 и выполните команду "WEBLOAD" указав ей наш .js файл. Выполните команду "STARTMONITOR" и выберите примитив. Мы подписались на событие "ObjectModified" и изменения примитива будут приводить к вызову функции обратного вызова с именем "onObjectModified". Чтобы отписаться от события, запустите команду "ENDMONITOR" и выберите тот же самый примитив.

Вот js код :

Код - JavaScript: [Выделить]
  1. var observedEntities = new Acad.OSet();
  2.  
  3. function onObjectModified(eventname, args)
  4. {
  5.     var entity = new Acad.DBEntity(args.id);
  6.     write("Объект модифицирован: " + args.id);
  7. }
  8.  
  9. function onCompleteCallback1(jsonPromptResult)
  10.  {
  11.     var resultObj = JSON.parse(jsonPromptResult);
  12.  
  13.     if (resultObj)
  14.     {
  15.         if (resultObj.status == 5100)
  16.         {
  17.             observedEntities.add(resultObj.objectId);
  18.  
  19.             Acad.Application.activedocument.startObserving(
  20.                 observedEntities,
  21.                 Acad.Application.activedocument.eventname.modified,
  22.                 onObjectModified);
  23.         }
  24.     }
  25. }
  26.  
  27. function onErrorCallback1(jsonPromptResult)
  28. {
  29.     var resultObj = JSON.parse(jsonPromptResult);
  30.     if (resultObj)
  31.     {
  32.         write("Ошибка!");
  33.     }
  34. }
  35.  
  36. function StartMonitorFunction()
  37. {
  38.     try
  39.     {
  40.         var peo = new Acad.PromptEntityOptions();
  41.         peo.setMessageAndKeywords("\nВыберите примитив: ", "");
  42.         peo.rejectMessage = "\nНеправильный выбор...";
  43.  
  44.         peo.singlePickInSpace = true;
  45.         peo.allowObjectOnLockedLayer = true;
  46.  
  47.         Acad.Editor.getEntity(peo).then(onCompleteCallback1,
  48.                                         onErrorCallback1);
  49.     }
  50.     catch (e)
  51.     {
  52.         write(e.message);
  53.     }
  54. }
  55.  
  56. function onCompleteCallback2(jsonPromptResult)
  57. {
  58.     var resultObj = JSON.parse(jsonPromptResult);
  59.  
  60.     if (resultObj)
  61.     {
  62.         if (resultObj.status == 5100)
  63.         {
  64.             observedEntities.remove(resultObj.objectId);
  65.  
  66.             var observedEntities1 = new Acad.OSet();
  67.             observedEntities1.add(resultObj.objectId);
  68.  
  69.             Acad.Application.activedocument.stopObserving(
  70.                 observedEntities1,
  71.                 Acad.Application.activedocument.eventname.modified,
  72.                 onObjectModified);
  73.         }
  74.     }
  75. }
  76.  
  77. function onErrorCallback2(jsonPromptResult)
  78. {
  79.     var resultObj = JSON.parse(jsonPromptResult);
  80.     if (resultObj) {
  81.         write("Ошибка");
  82.     }
  83. }
  84.  
  85. function EndMonitorFunction()
  86. {
  87.     try
  88.     {
  89.         var peo = new Acad.PromptEntityOptions();
  90.         peo.setMessageAndKeywords("\nВыберите примитив: ", "");
  91.         peo.rejectMessage = "\nНеправильный выбор...";
  92.  
  93.         peo.singlePickInSpace = true;
  94.         peo.allowObjectOnLockedLayer = true;
  95.  
  96.         Acad.Editor.getEntity(peo).then(onCompleteCallback2,
  97.                                         onErrorCallback2);
  98.     }
  99.     catch (e)
  100.     {
  101.         write(e.message);
  102.     }
  103. }
  104.  
  105. Acad.Editor.addCommand("REACTOR_CMDS",
  106.                         "STARTMONITOR",
  107.                         "STARTMONITOR",
  108.                         Acad.CommandFlag.TRANSPARENT,
  109.                         StartMonitorFunction);
  110.  
  111. Acad.Editor.addCommand("REACTOR_CMDS",
  112.                         "ENDMONITOR",
  113.                         "ENDMONITOR",
  114.                         Acad.CommandFlag.TRANSPARENT,
  115.                         EndMonitorFunction);
  116.  
  117. write("\nЗарегистрированы команды StartMonitor и EndMonitor.\n");

 

Источник: http://adndevblog.typepad.com/autocad/2013/03/reactors-using-autocad-javascript-api.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=196

Опубликовано 02.09.2013
Отредактировано 03.09.2013 в 22:12:27