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

Изучаем 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
      да у вас очень древний чемоданчик думаю из 90-х ну его ломать не жалко но если все уже заменили с рабочего то тут даже не знаю что и посоветовать....
    • stanislavz
      Спасибо за ответ. Так этот и был заказан на запас. В машине живой рабочий. Носителя нету, все в памяти hm628128-10 + ээпром.
    • gudstartup
      @stanislavz вы уж сразу еще один контроллер закажите а потом этот доламывайте. а со старым комбинировать не пробовали? у вас там диск или ssd в качестве носителя? может hdd загибается а вы сразу в мат.плату полезли. дисковые операции тоже ввод вывод тормозят...
    • maxx2000
      Подушную малость. Чё там. Уже в упор научились резьбу резать без выходной канавки?
    • ispite
      Здравствуйте, не могу построить стандартную сетку, что не позволяет дальше провести расчёт. Получается сделать сетку "на основе кривизны", но солид отказывается считать, после нажатия кнопки "запустить исследование" происходит сбой. https://disk.yandex.ru/d/D8wvRbYMW1lWjQ
    • ddm
      изготовить по чертежу с последующим покрытием,цинкование ,по 1000 шт каждой позиции ,предложение отправить на почту qwer463@yandex.ru
    • sklide008
      И еще можно ли задать горчие клавиши на кнопки открыть, скрыть и тд?
    • sklide008
      Подскажите, пожалуйста, в инвенторе есть такой пункт упорядочи по алфавиту дерево. Здесь найти такого не могу, пытался treesorter ставить но он добавляет просто в папку а не сортирует в дереве. Есть ли такой макрос чтобы все детали в дереве по порядку и алфавиту шли?
    • stanislavz
      Есть станок с данным контроллером. Все работает. Недавно была проблема с передачей данных - установил запасной контроллер. А запасной контроллер сказал нет работе. Проблема была в программе компьютера для передачи данных. Грустно, досадно, контроллер был куплен как рабочий. Как бы и не горит, но необходимо поправить. Плата управления с процессором mc68020, память hm628128-10. Память буферным питанием от 3 батареек + 0,5 Фарада на плате как буфер для замены батареек на 1 сутки. Лежало долго, без батареек. Симптомы: После первого включения, в памяти были и программы и параметры (0 странность). Честно, удивило. Но - система жутко тормозит, отклик на нажатие кнопки 3-5 секунд. В таком режиме сумел закачать машинные параметры под свой станок. Но это заняло час.. 4 строки и ждет секунд 10 итд. Есть видео. Перекинул с рабочего контроллера, БП, плату плц, ээпром плц - все то же. Проверил осциллографом кварцы живые , частота есть, амплитуда хорошая. 1 странность - после манипуляций по замене батарейки, старые записи из памяти исчезли. Ничего не коротнул. Возможно 0,5 Ф был не заряжен. Там тоже необходимы сутки для зарядки. Но как оно было запечатоно до этого - мистика. 2 странность. Если плата лежит ночь без питания, только с буфером - потом 2-3 минуты работает хорошо. 3 аналогично работает 2-3 минуты если питание отключить и очистить питание памяти (выпаял 0,5 Ф буфер с платы) Проверка памяти на старте есть. Проходит хорошо. На зависает, на холодную пайку не похоже. Шевелил / двигал все. Да и не виснет, именно тормозит. При том если оставить на час - тоже все стабильно плохо. Если набрать быстро 5 символей- экран сразу пуст, но после задержки символы будут на экране. Заказал второй процессор и память. 10 штук. Подавал прямо 5 вольт на память - все так же. Токи потребления между плохой и хорошей платой смогу проверит.    
    • brigval
×
×
  • Создать...