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

Программирование для CATIA.

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

Сообщение void » 29 май 2016 16:02

Коллеги, добрый день!

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

Верхний 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 меняет свое положение при перемещении по Х. Неплохо бы, чтобы за ней следом нижняя выноска менялась




Заранее спасибо за любые намеки!!!
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

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

Сообщение Wireless_Fidelity » 30 май 2016 09:28

Невозможно со стандартными текстовыми элементами.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

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

Сообщение void » 30 май 2016 11:49

1. Видимо, что-то не понимаю... А какие нестандартные текстовые элементы есть?

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

Заранее спасибо!
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

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

Сообщение Wireless_Fidelity » 30 май 2016 19:13

1. Делать свою фичу
2. SetMoveMode
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

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

Сообщение void » 04 июн 2016 15:29

Спасибо большое!!!
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

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

Сообщение void » 10 июн 2016 04:03

Наконец-то удалось добраться...

Коллега, метод 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
А вот эта точка на углу выноски получается сама собой, потому пока не знаю, как ее задать и как к ней обратиться..

Заранее спасибо.
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

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

Сообщение VladimirK » 16 июн 2016 10:04

Здравствуйте!
void, Вы писали:
Не подскажите, как совместить точку на углу выноски (если на выноску 2 смотреть) и точку с зеленым кружочком anchorPoint?

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

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

Сообщение void » 21 июн 2016 03:15

Коллега, спасибо большое! Совмещать таки не пришлось, но 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); не помогает...

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

Заранее спасибо за любой ответ!
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

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

Сообщение VladimirK » 21 июн 2016 09:02

Здравствуйте!
Именно такую ситуацию, когда не видны только выноски текста, ещё не встречал.
Может быть нужно обновить текст с помощью метода 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, передав указатель на выноску.
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44

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

Сообщение void » 22 июн 2016 05:10

Коллега, спасибо за отзывчивость!

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

Код: Выделить всё
                 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, но вроде бы это не то...

Заранее спасибо!
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

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

Сообщение Wireless_Fidelity » 22 июн 2016 14:40

void, как вызывается SetMoveMode? Аргумент передаётся?
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

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

Сообщение void » 23 июн 2016 01:05

Коллега!

Так вызываю

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

 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);


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



Наверное, что-то не понимаю...
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

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

Сообщение VladimirK » 23 июн 2016 09:35

Здравствуйте.
Метод 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 прервёт выполнение вашей команды, если вызывать его оттуда.
Поэтому не знаю поможет ли Вам такой способ.
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44

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

Сообщение Wireless_Fidelity » 23 июн 2016 16:21

Владимир, спасибо за пояснения.

К сожалению, вынужден подтвердить, что в CAA нет нужного API.
Судя по недокументированным функциям, управление ассоциативностью осущестуляется с помощью целого рядк интерфейсов CATIDrwAssociativity*, заголовочные файлы которых не поставляются.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

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

Сообщение void » 24 июн 2016 05:45

Коллеги, большое спасибо за прояснение!
А в скриптах вообще эта злосчастная команда работает?
Пишу

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

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


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

Заранее спасибо!
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

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

Сообщение VladimirK » 24 июн 2016 12:29

Здравствуйте, пожалуйста!
Выделение текста перед вызовом 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 КБ) Просмотров: 18513

Как будто она ожидает пользовательского "ввода" - получения объекта.
Но вот как правильно передать объект этой команде, к сожалению, не ясно...
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44

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

Сообщение void » 24 июн 2016 12:34

Спасибо большое за помощь!

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

Тут уже вопрос перешел в теоретическую плоскость.
Значит обойдемся без жесткости. Какая-то недоработанная команда, что ли... не знаю прям
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

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

Сообщение Wireless_Fidelity » 24 июн 2016 13:44

void, команда контекстная и имеет полное право вызываться только из меню.
Обычно помогает добавление в Selection уже после вызова команды.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11


Вернуться в CAA-RADE

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4