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

ADN Club => Fusion 360 API => Тема начата: Валериян от 26-02-2016, 16:22:01

Название: Fusion360 API C++
Отправлено: Валериян от 26-02-2016, 16:22:01
Fusion 360 C++.
Сейчас уперся в следующую проблему.
Перевожу программу JScript на С++.
Фрагмент на JScript
Код - Javascript [Выбрать]
  1. for (var x = 0; x < selectionInput.selectionCount; ++x) {
  2.             var selection = selectionInput.selection(x);
  3.             var selectedObj = selection.entity;
  4.            
  5.                    
  6.                      
  7.                         if (selectedObj instanceof adsk.fusion.SketchPoint){
  8.                            
  9.                              Points[nPoints] = selectedObj;
  10.                              nPoints++;
  11.                         }
  12. ...
  13.  

Код на С++
Код - C++ [Выбрать]
  1. Ptr<SelectionCommandInput> selectionInput = inputs->itemById(commandId + "_selection");
  2. size_t k = 0;
  3. if(selectionInput) k = selectionInput->selectionCount();
  4. for( int ir = 0; ir < k; ir++){
  5.     Ptr<Selection> selection = selectionInput->selection(ir);
  6.  ??? ?
  7.  ??? ?
  8.  
  9.  
  10.  
  11. }
Как закодировать на С++ место на JScript



Код - Javascript [Выбрать]
  1.  var selectedObj = selection.entity;                                                                          
  2.  if (selectedObj instanceof adsk.fusion.SketchPoint){                                                        
  3.     Points = selectedObj;                            
  4.     nPoints++;                      
  5.  }
  6. ...

??
В Help Fusion отсутствуют примеры С++ с выбором объектов и анализом.
Название: Re: Fusion360 API C++
Отправлено: Александр Ривилис от 26-02-2016, 17:21:47
Из указанного кода я ничего не понял. В очередной раз прошу нормально форматировать код.
Название: Re: Fusion360 API C++
Отправлено: Александр Ривилис от 26-02-2016, 17:40:09
В Help Fusion отсутствуют примеры С++ с выбором объектов и анализом.
Плохо искал. Там есть отдельная статья: http://fusion360.autodesk.com/learning/learning.html?guid=GUID-ECC0A398-4D89-4776-A054-F7B432F7FCF6 (http://fusion360.autodesk.com/learning/learning.html?guid=GUID-ECC0A398-4D89-4776-A054-F7B432F7FCF6)
В ней раздел Object Types and Casting, в котором совершенно четко написано:
Код - C++ [Выбрать]
  1. Ptr<Selection> selection = ui->activeSelections()->item(0);
  2. Ptr<Base> selectedEnt = selection->entity();
  3.  
  4. if (selectedEnt->objectType() == adsk::fusion::SketchLine::classType())
  5.     ui->messageBox("Selected entity is a sketch line.");
  6. else
  7.     ui->messageBox("Selected entity is NOT a sketch line.");
  8.  

Ну и так далее по тексту...

И конечно перевод: Особенности, характерные для C++ - Часть 2 (http://adn-cis.org/osobennosti-xarakternyie-dlya-cpp-chast-2.html)
Название: Re: Fusion360 API C++
Отправлено: Валериян от 27-02-2016, 11:13:41
Однако, проблема осталась.
За основу взял работающий пример формы ввода данных из Help Fusion
Samples Programs > Command Input

Добавил в Header

Код - C++ [Выбрать]
  1. // Added
  2. #include <Core/UserInterface/Selections.h>

В форме ввода данных поставил фильтры для точек

Код - C++ [Выбрать]
  1. // Create selection input
  2. Ptr<SelectionCommandInput> selectionInput = tab1ChildInputs->addSelectionInput(commandId + "_selection", "Select", "Basic select command input");
  3. if (!selectionInput)
  4.         return;
  5. selectionInput->setSelectionLimits(0);
  6. selectionInput->addSelectionFilter("SketchPoint");
  7. selectionInput->addSelectionFilter("BRepVertex");
  8.  

В  CommandExecuted event handler
добавил


Код - C++ [Выбрать]
  1. Ptr<SelectionCommandInput> selectionInput = inputs->itemById(commandId + "_selection");
  2. size_t k = 0;
  3. if(selectionInput) k = selectionInput->selectionCount();
  4.  
  5. for( int ir = 0; ir < k; ir++){
  6.  
  7.         Ptr<Selection> selection = selectionInput->selection(ir);
  8.        
  9.     // Get
  10.     Ptr<Base> enty = selection->entity();
  11.  
  12. }
Транслятор ругается на selection в  Ptr<Base> enty = selection->entity();
Говорит
adsk::core::Ptr<adsk::core::Selection, adsk::core::IcompleteType> selection
Error: использование указателя на тип неполного класса не допускается.

Без этой строки Программа работает. При выборе точек в отладке дает значение k > 0
Название: Re: Fusion360 API C++
Отправлено: Александр Ривилис от 27-02-2016, 12:07:22
Боюсь, что это проблема с твоей версией VS. Для проверки перекомпилируй все примеры из Fusion 360 и убедись, что они все нормально компилируются. Если нет - требуется более свежая версия VS.
Название: Re: Fusion360 API C++
Отправлено: Александр Ривилис от 27-02-2016, 12:23:47
Не хватает еще такой строки:

Код - C++ [Выбрать]
  1. #include <Core/UserInterface/Selection.h>
Название: Re: Fusion360 API C++
Отправлено: Валериян от 27-02-2016, 13:01:28
Спасибо. Все OK. Это решение.