Рисование примитивов по нажатию кнопки

Автор Тема: Рисование примитивов по нажатию кнопки  (Прочитано 4737 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн RevitTormentorАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Из одного примера создал RibbonMenu
Из второго примера создал команду
Из третьего примера создал рисование полилинии

Соединил это всё и автокад 2017 не выдерживает, падает

 Рисование
Код - C# [Выбрать]
  1.         [CommandMethod("AddLightweightPolyline")]
  2.         public static void AddLightweightPolyline()
  3.         {
  4.             // Получение текущего документа и базы данных
  5.             Document acDoc = AcApp.DocumentManager.MdiActiveDocument;
  6.             Database acCurDb = acDoc.Database;
  7.  
  8.             // Старт транзакции
  9.             using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  10.             {
  11.                 // Открытие таблицы Блоков для чтения
  12.                 BlockTable acBlkTbl;
  13.                 acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  14.                                              OpenMode.ForRead) as BlockTable;
  15.  
  16.                 // Открытие записи таблицы Блоков пространства Модели для записи
  17.                 BlockTableRecord acBlkTblRec;
  18.                 acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  19.                                                 OpenMode.ForWrite) as BlockTableRecord;
  20.  
  21.  
  22.                 // Создание полилинии с двумя сегментами (3 точки)
  23.                 Polyline acPoly = new Polyline();
  24.                 acPoly.SetDatabaseDefaults();
  25.                 acPoly.AddVertexAt(0, new Point2d(2, 4), 0, 0, 0);
  26.                 acPoly.AddVertexAt(1, new Point2d(4, 2), 0, 0, 0);
  27.                 acPoly.AddVertexAt(2, new Point2d(6, 4), 0, 0, 0);
  28.  
  29.                 // Добавление нового объекта в запись таблицы блоков и в транзакцию
  30.                 acBlkTblRec.AppendEntity(acPoly);
  31.                 acTrans.AddNewlyCreatedDBObject(acPoly, true);
  32.  
  33.                 // Сохранение нового объекта в базе данных
  34.                 acTrans.Commit();
  35.             }
  36.         }
  37.  

Click по кнопке
Код - C# [Выбрать]
  1.         public class CommandHandler_Button1 : System.Windows.Input.ICommand
  2.         {
  3.             public event EventHandler CanExecuteChanged;
  4.  
  5.             public bool CanExecute(object param)
  6.             {
  7.                 return true;
  8.             }
  9.  
  10.             public void Execute(object parameter)
  11.             {
  12.                 Document doc = AcApp.DocumentManager.MdiActiveDocument;
  13.                 if (parameter is RibbonButton)
  14.                 {
  15.                     // Просто берем команду, записанную в CommandParameter кнопки
  16.                     // и выпоняем её используя функцию SendStringToExecute
  17.                     RibbonButton button = parameter as RibbonButton;
  18.                     AcApp.DocumentManager.MdiActiveDocument.SendStringToExecute(
  19.                         button.CommandParameter.ToString(), true, false, true);
  20.                 }  
  21.             }
  22.         }

Создание кнопки в Меню
Код - C# [Выбрать]
  1.           // создаем кнопки большого размера
  2.             Autodesk.Windows.RibbonButton button3 = new Autodesk.Windows.RibbonButton();
  3.             button3.Id = "_button3";
  4.             button3.IsToolTipEnabled = true;
  5.             button3.ToolTip = "Это большая кнопка";
  6.             button3.Size = Autodesk.Windows.RibbonItemSize.Large;
  7.             button3.LargeImage = bs;
  8.             button3.CommandParameter = "AddLightweightPolyline";
  9.             button3.CommandHandler = new CommandHandler_Button1();


Отдельно всё работает. создаётся кнопка по нажатию кнопки MessageBox вызывается
Отдельно по команде линии рисуются. Однако по нажатию кнопки рисоваться не хочет.
Пробовал не передавать CommandParameter а просто в Execute прописать рисование тоже ничего не рисуется.

Как правильно запустить?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
На первый взгляд, вроде всё правильно. А пробовали запустить этим способом какую-нибудь стандартную команду автокада?
Как падает-то, кстати? На какой строке? Какие сообщения и куда выдаёт?

Отмечено как Решение RevitTormentor 08-09-2017, 20:43:39

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вместо:
Код - C# [Выбрать]
  1. button3.CommandParameter = "AddLightweightPolyline";
должно быть:
Код - C# [Выбрать]
  1. button3.CommandParameter = "AddLightweightPolyline\n";
Для запуска команды при помощи SendStringToExecute требуется, чтобы строка команды заканчивалась или пробелом (" "), или переводом строки ("\n").
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение