Страница 1 из 1

Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 29 май 2016 16:02
void
Коллеги, добрый день!

В драфтинге создаю текст с выноской. Если его перемещать по Х относительно первой точки выноски, то выноска сама меняет ориентацию/направление.
А если к нему прикрепить снизу еще один текст с выноской и их обоих перемещать по Х, то верхняя выноска ориентацию меняет, а нижняя - нет.
Руками создаю два текста с выноской, получается тоже самое.

Верхний 1-2 руками создан, 9 - интерфейсами


Переместили налево, нижний текст с выноской в обеих случаях не поменялся



Есть ли возможность его сделать таким же гибким, как верхний???


Создаю оба текста примерно так:
Код: Выделить всё
               if (SUCCEEDED(piADrwFact->CreateDftText(endPoint,&piDftText)))
               {
                CATIDftElementWithLeader *spEltWithLeader = NULL;

                if(SUCCEEDED( piDftText->QueryInterface(IID_CATIDftElementWithLeader, (void**) & spEltWithLeader) ) )
                {

                  CATIDftLeader  *iLeader;
                  SymbolType  iSymbolType= NOTUSED;

                  if(SUCCEEDED(spEltWithLeader->AddLeader(0, startPoint, &iLeader, iSymbolType)))
                  {

                     if(SUCCEEDED(iLeader->AddPoint(2, endPoint)))
                     {

                     }


                     if(SUCCEEDED(iLeader->AddInterruption(startPoint, endPoint)))
                     {
                     }
                                                }
                                          }
                                 }


Прикрепляю так:
Код: Выделить всё
                           CATBaseUnknown* iDftText = NULL;

                           if(SUCCEEDED( piDftText->QueryInterface(IID_CATBaseUnknown, (void**) & iDftText) ) )
                           {

                              CATIDrwAnnotation *annot = NULL;

                              if(SUCCEEDED( piDftText1->QueryInterface(IID_CATIDrwAnnotation, (void**) & annot) ) )
                              {
                                 //if(SUCCEEDED( annot -> SetAssociativeOrientation(iDftText,
                                 //                     CATAssProjectingMode::Ass_Contour)))//Ass_ExtensionLine)))
                                 //{
                                 //}

                                 double iDelta =0.0;
                                 boolean  iComputeDelta =TRUE;


                                 if(SUCCEEDED( annot -> SetAssociativePosition(iDftText, iDelta, iComputeDelta,          CATAssPositioningBehavior::Ass_Absolute,
                                                      CATAssProjectingMode::Ass_Contour)))
                                 {

                                 }

                                 annot->Release(); annot=NULL;
                              }


                              if(SUCCEEDED(dLeader1 -> SetAssociativePosition(iDftText, CATAssPositioningBehavior::Ass_Absolute,
                                                   CATAssProjectingMode::Ass_ExtensionLine)))
                              {

                              }


                              iDftText->Release(); iDftText=NULL;
                           }



Там еще есть метод SetAssociativeOrientation, но походу это что-то не то...


Насколько понимаю, в зеленом кружочке - AnchorPoint. Надо бы к ней прикрепить нижнюю выноску.



AnchorPoint меняет свое положение при перемещении по Х. Неплохо бы, чтобы за ней следом нижняя выноска менялась




Заранее спасибо за любые намеки!!!

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 30 май 2016 09:28
Wireless_Fidelity
Невозможно со стандартными текстовыми элементами.

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 30 май 2016 11:49
void
1. Видимо, что-то не понимаю... А какие нестандартные текстовые элементы есть?

2. Может быть, заодно подскажете по этой же теме оформления выносок. Прикрепление одной к другой выполняется методом SetAssociativePosition. В интерфейсе это делается при выборе выноске и по правой кнопке "Ссылка положения -> Создать" (у меня русская локаль, не знаю, как по-английски). Когда ссылка создана, можно установить по правой кнопке "Ссылка положения -> Жесткая".
А есть ли для этой кнопки "жесткая" метод в интерфейсах??
Не могу найти, к сожалению.
Причем в 24 релизе эта кнопка есть, а в 16 ее еще нет..

Заранее спасибо!

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 30 май 2016 19:13
Wireless_Fidelity
1. Делать свою фичу
2. SetMoveMode

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 04 июн 2016 15:29
void
Спасибо большое!!!

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 10 июн 2016 04:03
void
Наконец-то удалось добраться...

Коллега, метод SetMoveMode не добавляет жесткости, к сожалению...
Что он делает, понять не удалось, тоже к сожалению.
Подозрение, что для "жесткого" нет метода, т.к. в предыдущих релизах этой кнопки нет. В 24м есть.
Может такое быть? Не знаю, где бы узнать наверняка...


Продолжаю мучиться с лидерами.
Не подскажете, как совместить точку на углу выноски (если на выноску 2 смотреть) и точку с зеленым кружочком anchorPoint?


Вообще этот лидер для меня крайне загадочный. Он получается таким, каким надо, если писать так:


Код: Выделить всё
                CATIDftElementWithLeader *spEltWithLeader = NULL;

                if(SUCCEEDED( piDftText->QueryInterface(IID_CATIDftElementWithLeader, (void**) & spEltWithLeader) ) )
                {

                  CATIDftLeader  *iLeader;
                  SymbolType  iSymbolType= NOTUSED;

                  if(SUCCEEDED(spEltWithLeader->AddLeader(0, startPoint, &iLeader, iSymbolType)))
                  {
 
                     if(SUCCEEDED(iLeader->AddPoint(2, endPoint)))
                     {

                     }

                     if(SUCCEEDED(iLeader->AddInterruption(startPoint, endPoint)))
                     {
                     }
                                                }
                                         }


В принципе, такое
if(SUCCEEDED(spEltWithLeader->AddLeader(1, startPoint, &iLeader, iSymbolType)))
тоже прокатывает.

Заданная последней endPoint получается в роли anchorPoint
А вот эта точка на углу выноски получается сама собой, потому пока не знаю, как ее задать и как к ней обратиться..

Заранее спасибо.

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 16 июн 2016 10:04
VladimirK
Здравствуйте!
void, Вы писали:
Не подскажите, как совместить точку на углу выноски (если на выноску 2 смотреть) и точку с зеленым кружочком anchorPoint?

Это можно сделать с помощью метода CATIDftElementWithLeader::SetAnchorDelta(const int iNoLeader, const double iDelta).
Он как раз устанавливает промежуток в миллиметрах (без учета масштаба вида) между AnchorPoint текста и выноской.
Так как у одного текста может быть много выносок, то первым параметром указывается индекс выноски, для которой хотим установить значение delta.
Т.е. чтобы совместить точку нужно установить delta = 0.0 мм:
Код: Выделить всё
spEltWithLeader->SetAnchorDelta(0, 0.0);

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 21 июн 2016 03:15
void
Коллега, спасибо большое! Совмещать таки не пришлось, но SetAnchorDelta считываю.

Может быть, подскажете, почему у выноски не рисуется вертикальная черта? На рисунке в красном прямоугольнике



Делаю выноски в столбик. Если они правее начальной точки первой выноски, то вертикальная черта рисуется не всегда. Закономеронсть проследить не могу. То рисует, то не рисует. Причем слева рисует всегда.

Разница между левым и правым в выравнивании

Код: Выделить всё
                   if (startPoint[0] > endPoint[0])
                     piDftTextProp->SetAnchorPoint(DftBottomRight);
                  
                   if (startPoint[0] < endPoint[0])
                     piDftTextProp->SetAnchorPoint(DftBottomLeft);


и в размещении конечной точки

Код: Выделить всё
                 if(SUCCEEDED( piDftText->GetTextWidth(&width)))
                 {
                 }

spEltWithLeader1->GetAnchorDelta(0, &delta);

                  if (startPoint[0] > endPoint[0])   
                     ePoint[0]  = endPoint[0]  + width + delta;

                  if (startPoint[0] < endPoint[0])
                     ePoint[0]  = endPoint[0]  - delta;

                  ePoint[1]  = endPoint[1];


И SetLeadersVisualization(int) не помогает, и piDftText1->SetWrappingMode(DftWrappingAuto); не помогает...

Не знаю, что еще исправить..

Заранее спасибо за любой ответ!

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 21 июн 2016 09:02
VladimirK
Здравствуйте!
Именно такую ситуацию, когда не видны только выноски текста, ещё не встречал.
Может быть нужно обновить текст с помощью метода CATIDrwTextProperties::Refresh, как написал Wireless_Fidelity в топике
viewtopic.php?f=140&t=4382#p25441.
Когда нужно обновить графическое представление объекта, то использую такую вспомогательную функцию, может быть она Вам поможет:
Код: Выделить всё
inline void UpdateVizualisation(CATBaseUnknown_var iObject)
{
   CATIModelEvents_var modelEvents(iObject);
   if (modelEvents != NULL_var)
   {
      CATModify info((CATBaseUnknown *) iObject);
      modelEvents->Dispatch(info);
   }
}

В "CAAV5 Object Browser" видно, что DrwLeader реализует интерфейс CATIModelEvents.
Поэтому думаю, что можно просто вызвать функцию UpdateVizualisation, передав указатель на выноску.

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 22 июн 2016 05:10
void
Коллега, спасибо за отзывчивость!

Удивительно, но помогло иррациональное решение...

Код: Выделить всё
                 if(SUCCEEDED( piDftText->GetTextWidth(&width)))
                 {
                 }

spEltWithLeader1->GetAnchorDelta(0, &delta);

                  if (startPoint[0] > endPoint[0])//слева
                     ePoint[0]  = endPoint[0]  + width + delta;

                  if (startPoint[0] < endPoint[0])//справа
                     ePoint[0]  = endPoint[0]  - 0.001 - delta;

                  ePoint[1]  = endPoint[1];


double ePoint[2] - это координаты точки на уголочке верхней вноски. Вот было подозрение, что почему-то влияет ширина текста, и, т.к. то рисует, то не рисует, какая погрешность достигнута. Пришлось добавить условной иррациональности в виде 0.001
И стало рисоваться всегда.
Чудеса прямо.


Не подскажете, есть метод для кнопки "Жесткая"? там выше есть описание. Мне посоветовали SetMoveMode, но вроде бы это не то...

Заранее спасибо!

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 22 июн 2016 14:40
Wireless_Fidelity
void, как вызывается SetMoveMode? Аргумент передаётся?

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 23 июн 2016 01:05
void
Коллега!

Так вызываю

Код: Выделить всё

 CATIDftLeader  *iLeader1;
                                                                ....

                        CATIDrwLeader *dLeader1;

                        int sym=NOTUSED;

                        if(SUCCEEDED( iLeader1->QueryInterface(IID_CATIDrwLeader, (void**) & dLeader1) ) )
                        {
   
                           CATBaseUnknown* iDftText = NULL;

                           if(SUCCEEDED( piDftText->QueryInterface(IID_CATBaseUnknown, (void**) & iDftText) ) )
                           {

                              CATIDrwAnnotation *annot = NULL;

                              if(SUCCEEDED( piDftText1->QueryInterface(IID_CATIDrwAnnotation, (void**) & annot) ) )
                              {
                                 double iDelta =0.0;
                                 boolean  iComputeDelta =TRUE;


                                 if(SUCCEEDED( annot -> SetAssociativePosition(iDftText, iDelta, iComputeDelta, CATAssPositioningBehavior::Ass_Absolute,
                                                      CATAssProjectingMode::Ass_Contour)))
                                 {

                                 }

                                 annot->Release(); annot=NULL;
                              }


                              if(SUCCEEDED(dLeader1 -> SetAssociativePosition(iDftText, CATAssPositioningBehavior::Ass_Absolute,
                                                   CATAssProjectingMode::Ass_ExtensionLine)))
                              {
                                 
                              }


                              if(SUCCEEDED(dLeader1->SetMoveMode (TRUE)))
                              {

                              }


                              iDftText->Release(); iDftText=NULL;
                           }

                           dLeader1->Release(); dLeader1=NULL;
                        }

                        //iLeader1-> SetMoveMode(TRUE);


                     iLeader1->Release(); iLeader1=NULL;
                  }



Создается "ссылка положения" (AssociativePosition), второй текст перемещается вместе с первым, но вот это

dLeader1->SetMoveMode (TRUE);

с аргументом и TRUE ( и FALSE ) не влияют на "жесткость".
И если метод вызывать, у первого текста выноска пропадает, не видно ее становится.





Если такое написать просто для теста

Код: Выделить всё
 
CATIDftLeader  *iLeader1;
...
iLeader1-> SetMoveMode(TRUE);


то вообще все плохо, тексты друг к другу не привязаны.



Наверное, что-то не понимаю...

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 23 июн 2016 09:35
VladimirK
Здравствуйте.
Метод CATIDftLeader::SetMoveMode(CATBoolean iMoveMode) устанавливает жёсткость между выноской и текстом.
Если iMoveMode = TRUE, то выноска перемещается с аннотацией (текстом).
Т.е. он реализует то же самое, что и команда Rigid (на рис.1):

Судя по описанию, Вы хотите вызвать другую команду Rigid (на рис.2) - ту, которая устанавливает жесткость в cсылке положения между текстом и опорным элементом:

В CAA RADE API не нашёл метода для такой настройки.
Но в StatusBar'е (в CATIA V5 R19) вместо текста из *.CATNls виден заголовок команды - CATDrwCheckAssocPosRigidHdr.
По этому заголовку можно программно запустить команду с помощью метода CATIA.StartCommand (VBA), CATCommandHeader::StartCommand (C++).
Код: Выделить всё
CATVBA:
CATIA.StartCommand "CATDrwCheckAssocPosRigidHdr"

C++:
#include "CATCommandHeader.h"
CATCommandHeader *pCmdHeader = NULL;
pCmdHeader = CATCommandHeader::GetHeaderFromList("CATDrwCheckAssocPosRigidHdr");
if ((pCmdHeader != NULL) && (pCmdHeader->IsAvailable()))
{
   // pCmdHeader->SetArgument(CATString("SomeArg"));  // можно передавать аргументы в виде строки
   // pCmdHeader->SetArgument((void*) pSomeArg);      // или указателя на что-то.
   pCmdHeader->StartCommand();
}

К сожалению, эти методы из CATCommandHeader.h не документированы.
И ещё нужно как-то передать в команду аргумент (текст, для которого создана ссылка положения).
В каком виде команда CATDrwCheckAssocPosRigidHdr принимает этот аргумент тоже не ясно...
Может перед вызовом StartCommand выделить текст, для которого вызывается команда (через Selection.Add в VBA, CATCSO::AddElement в C++).
Но главное, что метод StartCommand прервёт выполнение вашей команды, если вызывать его оттуда.
Поэтому не знаю поможет ли Вам такой способ.

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 23 июн 2016 16:21
Wireless_Fidelity
Владимир, спасибо за пояснения.

К сожалению, вынужден подтвердить, что в CAA нет нужного API.
Судя по недокументированным функциям, управление ассоциативностью осущестуляется с помощью целого рядк интерфейсов CATIDrwAssociativity*, заголовочные файлы которых не поставляются.

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 24 июн 2016 05:45
void
Коллеги, большое спасибо за прояснение!
А в скриптах вообще эта злосчастная команда работает?
Пишу

Код: Выделить всё
Set text = curDrwTexts.Item(1)

oSelection.Clear
oSelection.Add(text)
CATIA.StartCommand "CATDrwCheckAssocPosRigidHdr"
oSelection.Clear


но ссылка жесткой не становится. Не подскажете, как правильно писать в скрипте?

Заранее спасибо!

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 24 июн 2016 12:29
VladimirK
Здравствуйте, пожалуйста!
Выделение текста перед вызовом StartCommand было моим предположением, чтобы как-то передать текст в CATDrwCheckAssocPosRigidHdr.
Проблема и заключается в том, что у метода CATIA.StartCommand нет параметров для передачи команде, а в нашу команду надо передать текст.
Поэтому возник вариант с Selection. Для некоторых команд добавляем в Selection объекты перед вызовом StartCommand и команды отрабатывают как надо (https://v5vb.wordpress.com/2010/01/20/startcommand/).
Проверил для CATDrwCheckAssocPosRigidHdr - почему-то объект из Selection она не принимает, просто сбрасывает с него выделение и всё...
Если же просто вызвать
Код: Выделить всё
Sub CATMain()
    CATIA.StartCommand "CATDrwCheckAssocPosRigidHdr"
End Sub

без Selection, то видно что команда всё-таки запускается - в StatusBar появляется строка InitialState состояния команды CATDrwCheckAssocPosRigidHdr:
InitialState.jpg
InitialState.jpg (6.3 КБ) Просмотров: 18743

Как будто она ожидает пользовательского "ввода" - получения объекта.
Но вот как правильно передать объект этой команде, к сожалению, не ясно...

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 24 июн 2016 12:34
void
Спасибо большое за помощь!

Однако, забавно, что чуть довелось коснуться CAA и сразу встретилась неопределенность...

Тут уже вопрос перешел в теоретическую плоскость.
Значит обойдемся без жесткости. Какая-то недоработанная команда, что ли... не знаю прям

Re: Прикрепленный текст с выноской и его ориентация

СообщениеДобавлено: 24 июн 2016 13:44
Wireless_Fidelity
void, команда контекстная и имеет полное право вызываться только из меню.
Обычно помогает добавление в Selection уже после вызова команды.