Перейти к публикации

Изучаем Toolkit


Sergey___1978

Рекомендованные сообщения

Чо-то не могу найти я этой опции в опциях чертежа.

Попробую через макрос реализовать, только надо как-то выделить созданную заметку, а потом запустить макрос который меняет шаг.

Ссылка на сообщение
Поделиться на других сайтах


Сделай макрос для задания опции.

Создай заметку.

Затем макрос обратно.

 

Toolkit

 

Drawing Setup
 
ProInputFileRead()
ProOutputFileWrite()
ProDrawingSetupOptionGet()
ProDrawingSetupOptionSet()
ProMdlDetailOptionGet()
ProMdlDetailOptionSet()
Ссылка на сообщение
Поделиться на других сайтах

Таких функций у меня вообще нет:

ProMdlDetailOptionGet()
ProMdlDetailOptionSet()

WF5.

 

Мне не понятно какой параметр в настройках чертежа отвечает за опцию "Шаг строк", не вижу я его там.

Ссылка на сообщение
Поделиться на других сайтах

Попробую через макрос реализовать, только надо как-то выделить созданную заметку, а потом запустить макрос который меняет шаг.

Думаю, что нужно добавить заметку в буфер выделения (Selection Buffer), а затем запускать макрос.

 

PS: У вас случайно нет парочки картинок, как сделано у Solvera? Хотелось бы посмотреть.

Ссылка на сообщение
Поделиться на других сайтах

Вот скриншот проги.


Там все просто, пользователь формирует тестовый блок из занесенных в базу шаблонов.

У них там сделана возможность вставлять заметку прямо в модель, а в чертеже показывать ее в виде например &TT в текстовой заметке. Можно напрямую в чертеж, как я хочу сейчас сделать.


Я сделал примерно вот такую функцию для вставки ТТ, остался один вопрос, как выделить созданную в чертеже заметку?

 

 

//Вставить ТТ
int Insert_tt()
{
  ProMdl mdl1;
  ProModelitem p_modelitem1;
  ProMdldata mdldata1;
  ProError status;
  //берем данные текущей открытой модели
  status=ProMdlCurrentGet(&mdl1); 
  if (status!=PRO_TK_NO_ERROR) {return (status);} //выход из функции, если нет модели
  //берем данные модели
  p_modelitem1.owner=mdl1;
  ProMdlDataGet(mdl1,&mdldata1);
  if (mdldata1.type[0]=='D')
  {

    //чтение файла c техническими требованиями
    FILE *TT_file;
    wchar_t TT_filename[255];
    ProLine TT_text[100];
    ProLine wstr1;
    char str1[255];
    int i1;
    wcscpy(TT_filename,L"D:\\temp\\tt.txt");
    TT_file=fopen(ProWstringToString(str1,TT_filename),"rt");
    i1=0;
    while(!feof(TT_file))
    {
      fgetws(wstr1,255,TT_file);
      wcscpy(TT_text[i1],wstr1);
      i1++;
    }
    fclose(TT_file);

    ProDrawing drawing;
    ProDtlnote note; 
    ProDtlnoteline *note_lines;
    ProDtlnotedata note_data;
    ProError err;
    ProDtlattach location, *leaders = NULL;
    int status = 0, i, sheet, n_leaders;

    ProMdlCurrentGet((ProMdl*)&drawing);
    err = ProDtlnotedataAlloc (drawing, &note_data);

    //Позиция, куда вставлять ТТ
    ProVector location1;
    ProMouseButton mouse_button;
    err = ProMousePickGet (PRO_LEFT_BUTTON, &mouse_button,location1);
    err = ProDtlattachAlloc (PRO_DTLATTACHTYPE_FREE, NULL, location1, NULL, &location);
    err = ProDtlnotedataAttachmentSet (note_data, location);
    err = ProDtlattachFree (location);

    //Перенос строк в специальную структуру
    ProDtlnoteline note_line;
    int j, line_count = 0, n_texts;
    double widht;
    ProDtlnotetext *texts, note_text;
    err = ProArrayAlloc (0, sizeof (ProDtlnoteline), 1, (ProArray*)&note_lines);
    for (j = 0; j < i1; j++)
    {
      err = ProDtlnotelineAlloc (&note_line);
      err = ProDtlnotetextAlloc (&note_text);
      err = ProDtlnotetextStringSet (note_text, TT_text[j]);
      err = ProDtlnotelineTextAdd (note_line, note_text);
      err = ProDtlnotetextFree (note_text);
      err = ProArrayObjectAdd ((ProArray*)&note_lines, PRO_VALUE_UNUSED, 1, &note_line);
      err = ProDtlnotelineTextsCollect (note_line, &texts);
      err = ProDtlnotelineTextsSet (note_lines[line_count], texts);
      err = ProArraySizeGet ((ProArray)texts, &n_texts);
      for (i = 0; i < n_texts; i++)
        err = ProDtlnotetextFree (texts);
     err = ProArrayFree ((ProArray*)&texts);
     line_count++;
    }
    err = ProDtlnoteldataLinesSet (note_data, note_lines); 
    err = ProArrayFree ((ProArray*)&note_lines);

    err = ProDtlnotedataLeadersSet (note_data, NULL);
    ProDtlnotedataElbowlengthSet(note_data,PRO_B_TRUE,2.0);
    err = ProDtlnoteCreate (drawing, NULL, note_data, &note);
    err = ProDtlnoteShow (&note);



int id1=0;
ProDtlnoteDataGet (&note, NULL, PRODISPMODE_NUMERIC, &note_data);
ProDtlnotedataIdGet(note_data, &id1);

 

 

//---------------------------------------------------------------------------------------------

//А дальше ступор с выделением заметки, чо-то не могу допереть что делать?

//Я так понимаю надо получить modelitem этой заметки, дальнейшие действия в смутном представлении.

//---------------------------------------------------------------------------------------------

 

err = ProDtlnotedataFree (note_data);


//запуск макроса, который меняет шаг строк
ProMacroLoad(L"~ Command `ProCmdEditProperties` ;~ Select `note_text_asynch` `tab_main`1 `lay_style`;~ Activate `note_text_asynch` `chk_usedeflinespc`0 ;~ Update `note_text_asynch` `inp_linespc` `1`;~ Activate `note_text_asynch` `psh_ok`;");
}
return(0);
}

post-26163-0-00052500-1399365781_thumb.jpg

Ссылка на сообщение
Поделиться на других сайтах

Терпение и труд все перетрут:

 

 

ProModelitem modelitem2;
err = ProModelitemInit(drawing, id1, PRO_NOTE, &modelitem2);
ProSelection p_selection1;
ProSelectionAlloc(NULL,&modelitem2,&p_selection1);
ProSelbufferSelectionAdd (p_selection1);

 

Вопрос исчерпан.

Ссылка на сообщение
Поделиться на других сайтах

Терпение и труд все перетрут:

 

 

ProModelitem modelitem2;

err = ProModelitemInit(drawing, id1, PRO_NOTE, &modelitem2);

ProSelection p_selection1;

ProSelectionAlloc(NULL,&modelitem2,&p_selection1);

ProSelbufferSelectionAdd (p_selection1);

 

Вопрос исчерпан.

Мне кажется, можно в ProSelectionAlloc использовать переменную note (типа ProDtlnote) в качестве modelitem, так как по сути ProModelitem и ProDtlnote одна и та же структура

 

typedef struct pro_model_item

{

ProType type;

int id;

ProMdl owner;

} ProModelitem, ProGeomitem, ProExtobj, ProFeature, ProProcstep,

ProSimprep, ProExpldstate, ProLayer, ProDimension, ProDtlnote,

 

ps: Спасибо за картинку. У Солвера есть еще какие-нибудь интересные/полезные приложения?

Ссылка на сообщение
Поделиться на других сайтах

извини. если что лишнего наваял. просто Я не прогер. а всего лишь конструктор. спасибо за буфер подсказал.

почему бы и нет. я же не прогер. так на любительском уровне.

интерфейс примитивный у этой проги был. не дружественный. потому и пришлось свою делать.

Ссылка на сообщение
Поделиться на других сайтах

извини. если что лишнего наваял.

Ну что вы! Я же так для общего развития своими мыслями поделился. Ни в коем случае не хотел "носом тыкать". Разобраться в TOOLKIT на С достойно большого уважения, на мой взгляд.

Удачи!

Ссылка на сообщение
Поделиться на других сайтах
  • 1 месяц спустя...

Хочу вычленить все аннотации в  корне дерева модели в отдельный массив аннотаций, получилось следующее.

Не пойму как отсеять все внутренние и оставить только те которые в корне, не нашел нужного примера или может плохо искал.

Может подскажет кто?

 

//Действие функции, вызываемое при посещении фичеров
ProError UsrNoteAction(ProNote *note,ProError filter_status,ProAppData data)
{

    //сюда вот надо вставить какой-то фильтр

   
    ProArrayObjectAdd((ProArray*)data, -1, 1, note);
    return(PRO_TK_NO_ERROR);
}

//Функция для сканирования дерева и формирования массива аннотаций 

int UsrNotesCollect(ProMdl mdl1,ProNote **notes)
{
    //Выделяем память
    ProArrayAlloc(0, sizeof(ProNote), 1, (ProArray*)notes);
    //Все аннотации в дереве
   if (ProMdlNoteVisit(mdl1,UsrNoteAction,NULL,notes)!=PRO_TK_NO_ERROR)
   {
      ProArrayFree((ProArray*)notes);
      return(0);
   }
   return(1);
}

//Все аннотации в модели (в корне дерева)

int all_note()
{
    ProMdl mdl1;
    ProError status;
    ProNote *notes;
    UsrNotesCollect(mdl1,&notes);
    int n_notes;
    ProArraySizeGet(notes,&n_notes);
    MessageInt(n_notes);

 

    return(0);

}

Ссылка на сообщение
Поделиться на других сайтах

Пытаюсь через тулкит просканировать все заметки в чертеже и найти ту в которой есть запись {0:&tt}.

 

wchar_t wstr1[255;

ProDtlnotetextStringGet(dtltexts[0],wstr1);

 

Почему он записывает в строковую переменную wstr1 не {0:&tt}, а реальное значение первой строки в ТТ.

Как уйти от этого, чо-то не могу допереть?

Ссылка на сообщение
Поделиться на других сайтах

Полный текст подпрограммы:

 

//сканруем все заметки в чертеже и определяем наличие заметки {0:&tt}
ProDtlnote *dtlnotes;
ProArrayAlloc(0,sizeof(ProDtlnote),1,(ProArray*)&dtlnotes);
ProDrawingDtlnoteVisit(drawing1,NULL,1,UsrDtlnoteAction,NULL,&dtlnotes);
int n_dtlnotes,nomer_dtlnote=255;
int flag_dtlnote=0;
ProDtlnotedata dtlnote_data;
ProDtlnoteline *dtllines;
ProDtlnotetext *dtltexts;
wchar_t wstr1[255];
status=ProDtlnotedataAlloc(drawing1,&dtlnote_data);
ProArraySizeGet(dtlnotes,&n_dtlnotes);
for (int i=0;i<n_dtlnotes;i++)
{
ProDtlnoteDataGet(&dtlnotes,NULL,PRODISPMODE_NUMERIC,&dtlnote_data);
ProDtlnotedataLinesCollect(dtlnote_data,&dtllines);
ProDtlnotelineTextsCollect(dtllines[0],&dtltexts);
ProDtlnotetextStringGet(dtltexts[0],wstr1);
if (wstr1[0]=='{') {MessageWstr(wstr1);}
}



ProArrayFree((ProArray*)&notes);
ProArrayFree((ProArray*)&dtlnotes);
ProDtlnotedataFree(dtlnote_data);
ProArrayFree((ProArray*)&dtllines);
ProArrayFree((ProArray*)&dtltexts);
ProDwgSheetRegenerate(drawing1,1);
}

Ссылка на сообщение
Поделиться на других сайтах
  • 1 месяц спустя...

Пытаюсь написать макрос на тулките, который изменяет имена выносных видов и сечений по ЕСКД.

Добустим было:

&xsec_name

{1:&view_scale}

 

Надо: &xsec_name (&view_scale)

 

Написал следующее:

//Имя вида по ЕСКД

int View_name1()

{

ProMdl mdl1;

ProModelitem p_modelitem1;

ProMdldata mdldata1;

ProError status;

//берем данные текущей открытой модели

status=ProMdlCurrentGet(&mdl1);

if (status!=PRO_TK_NO_ERROR) {return (status);} //выход из функции, если нет модели

//берем данные модели

p_modelitem1.owner=mdl1;

ProMdlDataGet(mdl1,&mdldata1);

if (mdldata1.type[0]=='D') {

ProDrawing drawing1;

ProMdlCurrentGet((ProMdl*)&drawing1);

p_modelitem1.type=PRO_DRAWING;

//сканруем все заметки в чертеже и определяем наличие заметок с именами видов, котрые надо привести к виду по ЕСКД

ProDtlnote *dtlnotes;

ProArrayAlloc(0,sizeof(ProDtlnote),1,(ProArray*)&dtlnotes);

ProDrawingDtlnoteVisit(drawing1,NULL,1,UsrDtlnoteAction,NULL,&dtlnotes);

int n_dtlnotes,n_dtllines,nomer_dtlnote;

ProDtlnotedata dtlnote_data;

ProDtlnoteline *dtllines; ProDtlnotetext *dtltexts;

wchar_t wstr1[255];

char str1[255];

status=ProDtlnotedataAlloc(drawing1,&dtlnote_data);

ProArraySizeGet(dtlnotes,&n_dtlnotes);

for (int i=0;i<n_dtlnotes;i++)

{

ProDtlnoteDataGet(&dtlnotes,NULL,PRODISPMODE_SYMBOLIC,&dtlnote_data);

ProDtlnotedataLinesCollect(dtlnote_data,&dtllines);

ProArraySizeGet(dtllines,&n_dtllines);

ProDtlnotelineTextsCollect(dtllines[0],&dtltexts);

ProDtlnotetextStringGet(dtltexts[0],wstr1);

if ((wcsstr(wstr1,L"xsec_name")!=NULL)&&(n_dtllines>1))

{

int n_texts;

ProDtlnotetext *texts,dtlnote_text2;

ProDtlnoteline *dtllines2;

ProDtlnoteline note_line;

ProArrayAlloc(0,sizeof(ProDtlnoteline),1,(ProArray*)&dtllines2);

ProDtlnotelineAlloc(&note_line);

ProDtlnotetextAlloc(&dtlnote_text2);

ProDtlnotetextStringSet(dtlnote_text2,L"&xsec_name (&view_scale)");

ProDtlnotelineTextAdd(note_line,dtlnote_text2);

ProDtlnotetextFree(dtlnote_text2);

ProArrayObjectAdd((ProArray*)&dtllines2,PRO_VALUE_UNUSED,1,&note_line);

ProDtlnotelineTextsCollect(note_line,&texts);

ProDtlnotelineTextsSet(dtllines2[0],texts);

ProArraySizeGet((ProArray)texts,&n_texts);

for (int j=0;j<n_texts;j++) ProDtlnotetextFree(texts[j]);

ProArrayFree((ProArray*)&texts);

ProDtlnoteldataLinesSet(dtlnote_data,dtllines2);

ProDtlnoteErase(&dtlnotes);

ProDtlnoteModify(&dtlnotes,NULL,dtlnote_data);

ProDtlnoteShow(&dtlnotes);

}

}

}

return(0);

}

 

 

Чо-то ничего не изменяется. Когда делаешь с обычными заметками похожие махинации все нормально прокатывает, а с заметкой с именем вида никак чо-то не получается.

Может кто что посоветует?

Ссылка на сообщение
Поделиться на других сайтах

Я так понимаю, что данным кодом Вы меняете текст в заметки на &xsec_name (&view_scale)?

Мне кажется, что этого не достаточно.

Насколько я помню, у заметок с именем вида нужно отключить опцию  Перенос текста и изменить ее размер, чтобы текст влазил в одну строку. Думаю, что это и надо пытаться делать в программе/макросе.

Ссылка на сообщение
Поделиться на других сайтах

Для начала, я бы попробовал добавить обратные слэши:

ProDtlnotetextStringSet(dtlnote_text2,L"\&xsec_name \(\&view_scale\)");

Ссылка на сообщение
Поделиться на других сайтах

Для начала, я бы попробовал добавить обратные слэши:

ProDtlnotetextStringSet(dtlnote_text2,L"\&xsec_name \(\&view_scale\)");

Что-то это не проканало.

Ссылка на сообщение
Поделиться на других сайтах

Вот что написано про эти параметры:

 

&view_name
Displays a drawing label indicating the name of the view. You
cannot use this parameter in a drawing note. Pro/ENGINEER
creates it with a view and places it in notes automatically. You can
modify its value, but you cannot call it out in another note.

 

Говорят что изменить можно, но нельзя использовать в других заметках.

Но я же получается хочу изменить в той же заметке.

Поиск в гуголе тоже чо-то пока ничего не дал.

 

Попробую покопать в этом направлении пока:

Насколько я помню, у заметок с именем вида нужно отключить опцию Перенос текста и изменить ее размер, чтобы текст влазил в одну строку. Думаю, что это и надо пытаться делать в программе/макросе.

Но что-то мне подсказывает, что это тоже тупиковый вариант. Так и придется похоже делать стандартными макросами через ProMacroLoad, но таким макаром не удасться заменить все заметки по всему черетжу одновременно и без предварительного выделения их. Команда ProMacroLoad почему то срабатывает в самом конце тулкитовской функции, в цикле не получилось ее использовать.

 

Ссылка на сообщение
Поделиться на других сайтах
Насколько я помню, у заметок с именем вида нужно отключить опцию Перенос текста

 

 

Что это за опция такая, где искать?

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




  • Сообщения

    • gudstartup
      @karlf 530 считывает ключ по специальному протоколу при помощи plc и получает его серийный номер а из него определяет возможные режимы доступа. там нет драйвера а есть plc модуль или несколько эти модули написаны на питоне  надпись smartkey исчезает с экрана при запуске чпу??
    • ДОБРЯК
      Для того, чтобы получить правильные высшие) формы при виртуальном эксперименте, нужно сделать грамотную КЭ модель. От разговора на эту тему вы постоянно уклоняетесь.  То нет компьютера под рукой, сделать простейший тест, то теряете интерес. :=) Сходимости энергии деформации при расчетах статики, недостаточно для точного определения высших собственных форм и частот.  Для того, чтобы грамотно использовать метод конечных элементов, нужно сделать много-много тестов в статике, динамике и ... Одной кнопки и двух конечных элементов в 3Д программе недостаточно для определения высших собственных форм...  У вас в качестве инструмента всего два конечных элемента, шести узловая несовместная оболочка Тимошенко и десяти узловой тетраэдр. И еще контакты при решении задачи на собственные числа. Вам ли говорить про правильность определения высших собственных форм для сложных изделий... :=)    
    • vad0000
      Покажите схему с разрешением на движение
    • vad0000
      Вход, а не выход Вытащить Аналоговый вход и все, как будто туда ничего не подключено И если мы подключим сигнал к энкодеру оси Х, то он стнтет одинаковый с аналоговым входом, который не подключен?
    • Snake 60
      @waze4534  Посмотрите вверх и прочитайте текст на красной полоске...
    • kkk
      Я так понимаю, что предупреждение про "касательные" не просто так выскакивает. Если скруглить прямую стыковку отрезков эскиза (минимальным радиусом) то все работает даже без объединенной кривой, достаточно эскиза.
    • karlf
      Подскажите пожалуйста, может кто сталкивался. Станок DMU-50 на стойке TNC 530, перестал определяться ключ доступа. Сам ключ вроде работает, если переключать на нём режимы, то в шкафу на соответствующих блоках лампочки тоже переключаются. Но изначально был уровень доступа 4, а теперь уровни доступа не активны. Ключ только один, запасных нет. Есть какой-то старый бэкап, пробовал его накатить, но какой-то он непонятный - станок грузится, но почти в конце загрузки выдаёт какую-то ошибку по параметрам. Может кто знает в каком из разделов и в какой папке искать установленные драйверы ключа?
    • YuriySt54
      В данной конструкции можно сразу одним телом делать и обрезать. Но меня интересовало, можно ли сразу при построении массива ограничить лишнее.
    • Ветерок
      Сделать основание одним телом, массив другим телом. Тело массива обрезать как надо, потом объединить тела.
    • YuriySt54
      Можно ли при построении массива лишнее отсечь, как к примеру отсечено по длинной стороне. Делал начальный элемент бобышкой по траектории с выбранной функцией "выровнять с торцевыми поверхностями". Можно ли так сделать при построении массива? Или отдельно потом обрезать лишнее только?
×
×
  • Создать...