В этой статье поговорим немного о формах и элементах управления (контролах).
Диалоги большинства параметрических объектов в СПДС оформлены как UniDialog.
UniDialog : функция вызова диалога редактирования объекта.
Как правило, стандартный диалог состоит из двух вкладок:
Однако с точки зрения конструктора-проектировщика это не совсем удобно: во первых, после выбора табличного параметра необходимо переключаться на вкладку свойств и там выбирать дополнительные параметры, виды, либо вводить значения в ручную, во вторых построение унифицированного интерфейса предполагает «примитивность» параметрического объекта как, следствие большое количество этих объектов в базе и необходимость их поиска. Пользовательская форма так же загружается методом:
Создание пользовательской формы несколько дольше, чем универсальной , но за счет более интерактивного взаимодействия с пользователем это оправдано. На разработку параметрического объекта времени затрачивается, немного больше один раз, но потом оно многократно экономится, при вставке этого объекта на чертеж.
Вставка и настройка контролов достаточно подробно описаны в справке.
Здесь я хочу рассказать о том, чего в справке нет:
Контролу в свойствах можно сопоставить переменную и потом работать с ней:
Но можно из скрипта напрямую обращаться к контролу:
Если имя форме в свойствах не задано.
Если имя форме задано то вместо Form подставляем имя формы на которой вставлен контрол, в данном примере имя формы MyForm:
Очевидно, что если форма всего одна, то имя ей в свойствах можно не присваивать и обращаться к контролам, как в примере выше, если форм несколько, то при совпадении имен контролов на разных формах (на одной форме одинаково назвать не позволит редактор) необходимо обращаться как ниже: с именем формы.
Из скрипта можно не только менять свойство Value контрола, но и управлять его видимостью свойство Visible ( значения:FALSE, TRUE или 0, 1).
Контролам полезно давать похожие имена отличающиеся лишь числовым индексом. Допустим на форме у нас имеется семь рисунков друг под другом, и по условию необходимо показать один из них, назовем их image1…. image7
Диалоги большинства параметрических объектов в СПДС оформлены как UniDialog.
UniDialog : функция вызова диалога редактирования объекта.
UniDialog ( [DBFLD, D, Dn, ... ,] [DBINF, Number,Seria,...,] [VFLD, rA, "A", rB, "B", ... ,] [BFLD, bKey1, "Ключ1", bKey2, "Ключ2",... ,] [RADIO, rKey1, "Вариант1", "Вариант2", ... ,] [VIDS, strDesignName, "Design1","Design2", ... ,] [TVIDS, lVidType, {"F", "T", "R", "L", "All"},] [VIEW, {"Vids", "Hdr", "None"}])В справке по СПДС и MechWizard достаточно подробно описаны ключевые слова и способы вызова стандартного диалога.
Как правило, стандартный диалог состоит из двух вкладок:
«Табличные параметры»,
«Свойства»
Преимуществом такого интерфейса является, только, то, что он может быть полностью описан в методе OnDialog, например так:function OnDialog { LoadInCache( Py, Dy, R, dr, n ); UniDialog( DBFLD, Py, Dy, R, VFLD, a,@MCS_STRING38, VIDS,strDesignName,"All", TVIDS,lViewType,"All", VIEW,"Vids" ) }Форма создается автоматически время на написание скрипта экономится значительно. Такой подход оправдан при разработке большого количества однотипных параметрических объектов с минимумом выбираемых параметров.
Однако с точки зрения конструктора-проектировщика это не совсем удобно: во первых, после выбора табличного параметра необходимо переключаться на вкладку свойств и там выбирать дополнительные параметры, виды, либо вводить значения в ручную, во вторых построение унифицированного интерфейса предполагает «примитивность» параметрического объекта как, следствие большое количество этих объектов в базе и необходимость их поиска. Пользовательская форма так же загружается методом:
function OnDialog { LoadInCache( Obl_prim_sokr, PN, DN, Oboz_tipa_R, DNf, La, D2, n, h4); // загрузка табличных данных из кэша ShowForm("Form1"); // вызов пользовательской формы }В редакторе объектов это выглядит вот так:
Создание пользовательской формы несколько дольше, чем универсальной , но за счет более интерактивного взаимодействия с пользователем это оправдано. На разработку параметрического объекта времени затрачивается, немного больше один раз, но потом оно многократно экономится, при вставке этого объекта на чертеж.
Вставка и настройка контролов достаточно подробно описаны в справке.
Здесь я хочу рассказать о том, чего в справке нет:
Контролу в свойствах можно сопоставить переменную и потом работать с ней:
Но можно из скрипта напрямую обращаться к контролу:
Если имя форме в свойствах не задано.
StartSection=Form.editbox; //переменной StartSection присваиваем значение editbox StartSection=Form.editbox.Value; // Справедливо и такНе путать имя формы в ее свойствах и имя формы в редакторе объектов, это разные имена. По имени формы в редакторе объектов вызывается форма
ShowForm("Form1");Через имя формы в свойствах идет обращение к контролам этой формы:
Если имя форме задано то вместо Form подставляем имя формы на которой вставлен контрол, в данном примере имя формы MyForm:
Очевидно, что если форма всего одна, то имя ей в свойствах можно не присваивать и обращаться к контролам, как в примере выше, если форм несколько, то при совпадении имен контролов на разных формах (на одной форме одинаково назвать не позволит редактор) необходимо обращаться как ниже: с именем формы.
StartSection= MyForm.editbox; // переменной StartSection присваиваем значение editbox StartSection= MyForm.editbox.Value; //Наоборот MyForm.editbox= StartSection; // Контролам можно присваивать значения из переменных: MyForm.editbox= MyForm.editbox1; //и из других контролов напрямую, минуя переменнуюПрисвоение значений объектам формы имеет смысл лишь в методе:
function OnDialogChanged { //метод вызывается при каждом изменении формы Form.editbox.Value="Текст в форме"; }т.к. иначе мы просто не увидим изменений.
Из скрипта можно не только менять свойство Value контрола, но и управлять его видимостью свойство Visible ( значения:FALSE, TRUE или 0, 1).
Контролам полезно давать похожие имена отличающиеся лишь числовым индексом. Допустим на форме у нас имеется семь рисунков друг под другом, и по условию необходимо показать один из них, назовем их image1…. image7
function OnDialogChanged { // гасим все картинки ii=1 ; While (ii<=7){ Form.image[ii].Visible=FALSE; ii=ii+1; } //включаем картинки фланцев в зависимоти от индекса исполнения SelectInCache(1,"kFirst", "FlanecKoment", "~", strFlanecKoment); //выбор из базы индекса N_Isp от 1 до 7 Form.image[N_Isp].Visible=TRUE; //включаем нужную картинку }Порой для того, что бы исключить ввод данных, но оставить возможность пользователю видеть значение контрола необходимо запретить/разрешить возможность редактирования, свойство Enabled (FALSE, TRUE).
function OnDialogChanged { //По любому изменению в форме мы присваиваем табличные параметры полям ввода: //(если включен флажок "Брать атрибуты из базы данных" ii=1 ; While (ii<=12){ Form.editbox[ii].Enabled=TRUE; // разрешаем редактирование ii=ii+1; } if (uiStandardParam)==1{ // Если флажок включен ii=1 ; While (ii<=12){ Form.editbox[ii].Enabled=FALSE; // запрещаем редактирование ii=ii+1; } sName=sdbName; // заполняем контролы табличными данными sType=sdbType; sCode=sdbCode; sProducer=sdbProducer; sUnits=sdbUnits; sMass1=sdbMass1; sComment=sdbComment; sCategory=sdbCategory; sName2=sdbName2; sLength=sdbLength; sWidth=sdbWidth; sHeight=sdbHeight; } }В данной статье освещены далеко не все возможности управления контролами, в дальнейшем я надеюсь продолжить эту тему.
Андрей, привет!
ОтветитьУдалитьА не подскажешь, можно сделать ручку для отзеркаливания детали?
Если по быстрому:
УдалитьВ мастере объектов, заходишь в описание этого объекта и в свойстве
"Класс" ставишь число, либо 680 это двери (SPDSDOOR), или 670 это окна (SPDSWINDOW)
В объекте появятся ручки зеркалирования по Х и У, но мне не нравится этот способ:
объект перестанет перекрывать другие объекты независимо от rZOrder;
не сможет конектиться к другим объектам....
и возможно пропадут дугие функции.
Более правильный способ по моему мнению: немного поправить методы SetGripPoint, OnMoveGripPoint и OnChangeParameters, тогда будет зеркалировать.