интерактивно сдвинуть атрибут в блоке

Автор Тема: интерактивно сдвинуть атрибут в блоке  (Прочитано 11912 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Добрый день,
Такой вопрос как проше всего подвинуть атрибут в блоке?

Ситуация : Блоки вставлиаютсиа под средством EntityJig в цикле, т.е. обрис есть,потом добавляются атрибуты.
Тепер возникло требование дать возможность пользователю подвинуть конкретный атрибут не заканчивая команду.
Сейчас прошу указать точку вставки. Все работает, но хотелось бы чтобы этот атрибут "висел" на курсоре.

Знаю про DrawJig и Transient , но может можно как-то попроше? даже на использование какой нибудь команды согласен :)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Раздел форума не перепутал? ObjectARX или AutoCAD .NET API?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Нет, всё верно, ObjectARX (C++).

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Нет, всё верно, ObjectARX (C++).
Тогда причем здесь EntityJig и DrawJig??? В ObjectARX есть только AcEdJig. По твоему же вопросу кроме AcEdJig могу предложить попробовать функцию acedDragGen, но я бы рекомендовал всё-таки AcEdJig.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Да,деиствительно AcEdJig.
А под DrawJig имел введу создание временного блока по аналогии с .НЕТ
Понятно буду AcEdJig делать.
Спасибо

Отмечено как Решение Александр Ривилис 23-12-2014, 12:03:13

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Нашел у себя в загашнике:
Код - C++ [Выбрать]
  1. #include "AttMove.h"
  2. // - IngTex.ATTMOVE command (do not rename)
  3.   static void IngTexATTMOVE(void)
  4.   {
  5.     // Add your code for command IngTex.ATTMOVE here
  6.     ads_name en;
  7.     struct resbuf *rb = NULL;
  8.     ads_matrix xformres;
  9.     ads_point pt1;
  10.     setvar(L"errno",0);
  11.     while (acedNEntSelP(L"\nВыберите атрибут для переноса: ",en,pt1,FALSE,xformres,&rb) == RTNORM || getvar(L"errno") == OL_ENTSELPICK) {
  12.       acutRelRb(rb);
  13.       AcDbObjectId eid; acdbGetObjectId(eid,en);
  14.       AcDbObjectPointer<AcDbAttribute> pAtt(eid,AcDb::kForRead);
  15.       Acad::ErrorStatus es = pAtt.openStatus();
  16.       if (pAtt.openStatus() == Acad::eOk) {
  17.         AttMove jig;
  18.         if (jig.startJig(pAtt.object()) == AcEdJig::kNormal) {
  19.           if (pAtt->upgradeOpen() == Acad::eOk) {
  20.             AcGePoint3d pt = jig.mInputPoints[1];
  21.             if (pAtt->position().isEqualTo(pAtt->alignmentPoint())) pt[Z] = pAtt->alignmentPoint()[Z];
  22.                                         else                        pt[Z] = pAtt->position()[Z];
  23.             pAtt->setPosition(pt);
  24.             pAtt->setAlignmentPoint(pt);
  25.             pAtt->adjustAlignment(acdbCurDwg());
  26.           }
  27.         }
  28.       } else if (pAtt.openStatus() == Acad::eNotThatKindOfClass) {
  29.         acutPrintf(L"\nЭто не атрибут блока! Повторите");
  30.       }
  31.     }
  32.   }
Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //- AttMove.h
  3. //-----------------------------------------------------------------------------
  4. #pragma once
  5. class AttMove : public AcEdJig {
  6.  
  7. private:
  8.         //- Member variables
  9.         //- current input level, increment for each input
  10.         int mCurrentInputLevel ;
  11.         //- Dynamic dimension info
  12.  
  13. public:
  14.         //- Array of input points, each level corresponds to the mCurrentInputLevel
  15.         AcGePoint3dArray mInputPoints ;
  16.         //- Entity being jigged
  17.         AcDbAttribute *mpEntity ;
  18.  
  19. public:
  20.         AttMove () ;
  21.         ~AttMove () ;
  22.  
  23.         //- Command invoke the jig, call passing a new'd instance of the object to jig
  24.         AcEdJig::DragStatus startJig (AcDbAttribute *pEntityToJig) ;
  25.  
  26. protected:
  27.         //- AcEdJig overrides
  28.         //- input sampler
  29.         virtual DragStatus sampler () ;
  30.         //- jigged entity update
  31.         virtual Adesk::Boolean update () ;
  32.         //- jigged entity pointer return
  33.         virtual AcDbEntity *entity () const ;
  34.         //- dynamic dimension data setup
  35.         //- Std input to get a point with rubber band from point
  36.         AcEdJig::DragStatus GetNextPoint () ;
  37. } ;

Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //- AttMove.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "utils.h"
  6. #include "AttMove.h"
  7.  
  8. //-----------------------------------------------------------------------------
  9. AttMove::AttMove () : AcEdJig (),       mCurrentInputLevel(0), mpEntity(NULL)
  10. {
  11. }
  12.  
  13. AttMove::~AttMove () {
  14. }
  15.  
  16. //-----------------------------------------------------------------------------
  17. AcEdJig::DragStatus AttMove::startJig (AcDbAttribute *pEntity) {
  18.         //- Store the new entity pointer
  19.   mpEntity = AcDbAttribute::cast(pEntity->clone());
  20.         //- Setup each input prompt
  21.         AcString inputPrompts = L"\nУкажите новое положение атрибута (ENTER - оставить на месте): ";
  22.  
  23.         //- Setup kwords for each input
  24.         AcString kwords = L"";
  25.  
  26.   bool appendOk = true ;
  27.   AcEdJig::DragStatus status = AcEdJig::kNull ;
  28.   //- Loop the number of inputs
  29.  
  30.   //- Add a new input point to the list of input points
  31.   mpEntity->adjustAlignment(acdbCurDwg());
  32.   if (mpEntity->position() != mpEntity->alignmentPoint()) {
  33.     if (mpEntity->setAlignmentPoint(mpEntity->position()) == Acad::eOk) {
  34.       mInputPoints.append (mpEntity->alignmentPoint()) ;
  35.       mInputPoints.append (mpEntity->alignmentPoint()) ;
  36.     } else {
  37.       mInputPoints.append (mpEntity->position()) ;
  38.       mInputPoints.append (mpEntity->position()) ;
  39.     }
  40.   } else {
  41.     mInputPoints.append (mpEntity->alignmentPoint()) ;
  42.     mInputPoints.append (mpEntity->alignmentPoint()) ;
  43.   }
  44.   //- Set the input prompt
  45.   setDispPrompt (inputPrompts) ;
  46.   //- Setup the keywords required
  47.   setKeywordList (kwords) ;
  48.  
  49.   bool quit =false ;
  50.   //- Lets now do the input
  51.   status = drag () ;
  52.   if ( status != kNormal ) {
  53.     //- If it's a keyword
  54.     switch ( status ) {
  55.         case kCancel:
  56.         case kNull:
  57.           quit =true ;
  58.           break ;
  59.  
  60.         case kKW1:
  61.         case kKW2:
  62.         case kKW3:
  63.         case kKW4:
  64.         case kKW5:
  65.         case kKW6:
  66.         case kKW7:
  67.         case kKW8:
  68.         case kKW9:
  69.           //- Do something
  70.  
  71.           break ;
  72.     }
  73.   } else {
  74.     appendOk =true ;
  75.   }
  76.        
  77.   delete mpEntity;
  78.  
  79.         return (status) ;
  80. }
  81.  
  82. //-----------------------------------------------------------------------------
  83. //- Input sampler
  84. AcEdJig::DragStatus AttMove::sampler () {
  85.         //- Setup the user input controls for each input
  86.         AcEdJig::UserInputControls userInputControls =  AcEdJig::UserInputControls(AcEdJig::kAccept3dCoordinates | AcEdJig::kNullResponseAccepted);
  87.         //- Setup the cursor type for each input
  88.         AcEdJig::CursorType cursorType = AcEdJig::kRubberBand;
  89.  
  90.         //- Setup the user input controls for each sample
  91.         setUserInputControls (userInputControls) ;
  92.         setSpecialCursorType (cursorType) ;
  93.  
  94.         AcEdJig::DragStatus status = GetNextPoint();
  95.         //- Check the current input number to see which input to do
  96.         return (status) ;
  97. }
  98.  
  99. //-----------------------------------------------------------------------------
  100. //- Jigged entity update
  101. Adesk::Boolean AttMove::update () {
  102.         mpEntity->setPosition(mInputPoints[1]) ;
  103.         mpEntity->setAlignmentPoint(mInputPoints[1]) ;
  104.   mpEntity->adjustAlignment(acdbCurDwg());
  105.         return true;
  106. }
  107.  
  108. //-----------------------------------------------------------------------------
  109. //- Jigged entity pointer return
  110. AcDbEntity *AttMove::entity () const {
  111.         return (mpEntity) ;
  112. }
  113.  
  114. //-----------------------------------------------------------------------------
  115. //- Std input to get a point with rubber band from point
  116. AcEdJig::DragStatus AttMove::GetNextPoint () {
  117.         AcGePoint3d oldPnt = mInputPoints [0];
  118.         AcGePoint3d newPnt = mInputPoints [1];
  119.         //- Get the point
  120.         AcEdJig::DragStatus status = acquirePoint (newPnt, oldPnt) ;
  121.         //- If valid input
  122.         if ( status == AcEdJig::kNormal ) {
  123.                 //- If there is no difference
  124.                 if ( newPnt.distanceTo (mInputPoints [1]) < 1e-3)
  125.                         return (AcEdJig::kNoChange) ;
  126.                 //- Otherwise update the point
  127.                 mInputPoints [1] = newPnt ;
  128.         }
  129.         return (status) ;
  130. }

Код рабочий, но только в МСК (WCS)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Прямо то что нужно!!!
Спасибо оргомное! :)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Прямо то что нужно!!!
Спасибо оргомное! :)
Ну тогда не забывай про плюсики и кнопку "Решение". :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Виноват,  исправляюсь.
не умею форумом пользоваться, но научусь :)