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

Изучаем 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 пользователей

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




  • Сообщения

    • eljer0n
      Большое спасибо! Посмотрю. Но, судя по всему, даже если удастся заставить его сохранять чертеж с трехзначным исполнением, видимо, в той же спецификации правильного отображения не добиться. У Леона с товарищем был об этом разговор, что солид вроде как не воспринимает исполнения дальше двузначного. Хотя, может и я неправильно понял. Вернусь к этому вопросу чуть позже. Еще раз спасибо за совет.
    • mrVladimir
      @gudstartup @Viktor2004 спасибо Вам за такое участие.  Я вот тоже в maintenance manual заглянул (наконец-то ). А вот фраза "при замене FROM/SRAM необходимо ..." (под пунктом 3 во вложении) не подразумевает, что появление ps5523 произойдет только если мы решим на нашей чпу поменять именно FROM/SRAM. А при замене других печатных плат (в том числе и материнской ) необходимо только как написано в пункте 2 восстановить данные памяти SRAM и, при необходимости, файлы пользователя. Нет?
    • maxx2000
      @davidovka это же очевидно. Вдруг нужного размера не окажется  как в анекдоте  
    • davidovka
      А для чего и сотни исполнений в таблице и гибкость одновременно?
    • ak762
      в СВ есть встроенный калькулятор для расчета балок при различных сценариях нагружения если ваш профиль монорельса совпадает с предопределенными профилями то можно прикинуть поведение монорелься без анализа на картинке 2 расчета двутавровой балки в качестве теста    
    • Viktor2004
      @mrVladimir не спешите отчаиваться. Вопрос спорный Я завел новую тему в которой мы это выясним  
    • Viktor2004
      Уважаемые специалисты. У кого был опыт замены фануковских плат? Именно на ЧПУ. Пожалуйста напишите какое ЧПУ и какую плату меняли И результат. Подошла или не подошла  
    • gudstartup
      @mrVladimir к сожалению с вашей платой все не так просто вам придется приобрести ее клон то есть она должна быть подготовлена продавцом и в нее должен быть записан серийный номер вашей старой платы он на штрихкоде а так готовить умеют не все или готовьтесь к сертификации опций также есть еще один аппаратный вариант но не каждый будет на новую плату м\сх перепаивать с риском превратить ее в кирпич.   если бы у вас был отдельный модуль процессора то вы бы просто переставили его в новую плату и все а с этой платой из-за ее не модульности намучаешься
    • SAPRonOff
      в окне состава изделия снять замочки у колонки позиция, тогда генератор колонки состава изделия не будет им присваивать свои значения автоматически, а запомнит то - что вы поставили или стояло до изменений проекта: 
    • Kelny
      Смотреть надо процедуру main, почти в самом конце: Слева от этих строк на сером поле ставите красные точки (клик мышкой) и запускаете макрос, когда макрос дойдёт до обозначенных строк можно будет наводить мышку на перменные, например, sPathName и смотреть значения, что бы определить где сбой: Для продолжения выполнения макроса нажимаем зелёный треугольничек (как кнопка Play).      
×
×
  • Создать...