Форум профессиональных мебельщиков PROMEBELclub

Форум профессиональных мебельщиков PROMEBELclub (http://promebelclub.ru/forum/index.php)
-   Базис-мебельщик. Скрипты (http://promebelclub.ru/forum/forumdisplay.php?f=273)
-   -   Обсуждение скриптов в Системе Базис (http://promebelclub.ru/forum/showthread.php?t=13614)

Максим Геннадьевич 13.04.2018 14:37

Редактирование контура скриптом
 
Не могу понять как редактировать панель через скрипт.
Выделить и определить какую сторону сделал, а как редактировать не пойму. В справке пример брал, но у меня выдает ошибку по функции.
Спасибо
https://ibb.co/d9hMZ7

Letos 13.04.2018 15:57

Цитата:

Сообщение от Максим Геннадьевич (Сообщение 453472)
Не могу понять как редактировать панель через скрипт.
Выделить и определить какую сторону сделал, а как редактировать не пойму. В справке пример брал, но у меня выдает ошибку по функции.
Спасибо
https://ibb.co/d9hMZ7

День добрый. Осмелюсь предположить, что редактировать надо контур. Для этого используется свойство Contour у панели. Но все равно не понятно, как в вашем понятии надо редактировать (растянуть, добавить какие-то элементы, сделать вырез или еще что). И еще хотелось бы узнать, какую ошибку выдает.

Guamoko 13.04.2018 18:26

Добрый день. В форме имею
Window1.Material1 = Props.NewMaterial("1я ДВЕРЬ");
и числовое окно,значение которого предполагалось будет зависеть от
Window1.Material1.SetActive();
Window1.ThickMaterial1=Window1.AktiveMaterial.Thic kness;
if(Window1.ThickMaterial1.Value==10){
Window1.BNapl1.Value=Window1.LGProf.Value+15;
не получается.(не считает)

Добавлено через 12 минут
Другими словами, для выбора формулы мне нужно привязаться к толщине материала
Спасибо.

Letos 13.04.2018 18:47

Цитата:

Сообщение от Guamoko (Сообщение 453493)
Добрый день. В форме имею
Window1.Material1 = Props.NewMaterial("1я ДВЕРЬ");
и числовое окно,значение которого предполагалось будет зависеть от
Window1.Material1.SetActive();
Window1.ThickMaterial1=Window1.AktiveMaterial.Thic kness;
if(Window1.ThickMaterial1.Value==10){
Window1.BNapl1.Value=Window1.LGProf.Value+15;
не получается.(не считает)

Добавлено через 12 минут
Другими словами, для выбора формулы мне нужно привязаться к толщине материала
Спасибо.

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

Window1.BNapl1.Layout.Top = Window1.BNapl1.Layout.Top
По сути, строка является бредовой и не меняет ничего, но где-то внутри базиса запускается обновление поля и новое значение должно корректно отобразиться.

Guamoko 15.04.2018 08:03

Прошу прощения, еще раз прошу помощи.
Для выбора формулы мне нужно считать толщину активного материала из таблицы "используемый материал".При смене материала на материал с другой толщиной меняется формула.

Добавлено через 4 минуты
В моем коде
Window1.Material1.OnChange=function(){
Window1.Material1.SetActive();
Window1.ThickMaterial1=Window1.ActiveMaterial.Thic kness;
if(Window1.ThickMaterial1.Value==10){
Window1.BNapl1.Value=Window1.LGProf.Value+15;
Window1.BNapl1.Layout.Top=Window1.BNapl1.Layout.To p;
};
}
указывает на ошибку в 3й строке
Спасибо.

Добавлено через 2 минуты
Но, наверное,мой код вообще не то.

Letos 16.04.2018 10:54

Цитата:

Сообщение от Guamoko (Сообщение 453591)
Прошу прощения, еще раз прошу помощи.
Для выбора формулы мне нужно считать толщину активного материала из таблицы "используемый материал".При смене материала на материал с другой толщиной меняется формула.

Добавлено через 4 минуты
В моем коде
Window1.Material1.OnChange=function(){
Window1.Material1.SetActive();
Window1.ThickMaterial1=Window1.ActiveMaterial.Thic kness;
if(Window1.ThickMaterial1.Value==10){
Window1.BNapl1.Value=Window1.LGProf.Value+15;
Window1.BNapl1.Layout.Top=Window1.BNapl1.Layout.To p;
};
}
указывает на ошибку в 3й строке
Спасибо.

Добавлено через 2 минуты
Но, наверное,мой код вообще не то.

У объекта Window1 нет свойства ActiveMaterial (только если вы его не создавали). Если вы хотите получить доступ к текущему активному материалу, строка должна выглядеть так:
Window1.ThickMaterial1 = ActiveMaterial.Thickness;
И еще одна странная вещь в вашем коде. Это как раз то же самое присвоение. Судя по коду, Window1.ThickMaterial1 - это числовое поле. Но в "ошибочной" строке вы пытаетесь записать толщину материала в переменную этого поля, из-за чего скрипт будет работать неверно.

Подробное пояснение, почему


После выполнения присвоения в третьей строке, в переменной Window1.ThickMaterial1 будет находиться число (16, например). Следующим шагом идет проверка на равенство значений Window1.ThickMaterial1.Value (то есть 16.Value) и 10. У переменной Window1.ThickMaterial1 числовое значение, у которого, в свою очередь, свойство Value отсутствует. В итоге Window1.ThickMaterial1.Value вернет undefined и условие будет выглядеть так:
if (undefined == 10).
В итоге, это условие не будет никогда верным, но из-за особенностей JS, оно не является ошибочным, поэтому скрипт продолжит работу.
[свернуть]


Выход из этой ситуации следующий: третью строку необходимо исправить, чтобы она выглядела так:
Window1.ThickMaterial1.Value = ActiveMaterial.Thickness;

P.S На будущее: если скрипт выдает ошибку, связанную с вашим вопросом, неплохо было бы и текст ошибки тоже добавлять, ведь в ней сказано почти все, что нужно для поиска ошибки и причин ее возникновения.

Guamoko 17.04.2018 05:46

Цитата:

Сообщение от Letos (Сообщение 453679)
У объекта Window1 нет свойства ActiveMaterial (только если вы его не создавали). Если вы хотите получить доступ к текущему активному материалу, строка должна выглядеть так:
Window1.ThickMaterial1 = ActiveMaterial.Thickness;
И еще одна странная вещь в вашем коде. Это как раз то же самое присвоение. Судя по коду, Window1.ThickMaterial1 - это числовое поле. Но в "ошибочной" строке вы пытаетесь записать толщину материала в переменную этого поля, из-за чего скрипт будет работать неверно.

Подробное пояснение, почему


После выполнения присвоения в третьей строке, в переменной Window1.ThickMaterial1 будет находиться число (16, например). Следующим шагом идет проверка на равенство значений Window1.ThickMaterial1.Value (то есть 16.Value) и 10. У переменной Window1.ThickMaterial1 числовое значение, у которого, в свою очередь, свойство Value отсутствует. В итоге Window1.ThickMaterial1.Value вернет undefined и условие будет выглядеть так:
if (undefined == 10).
В итоге, это условие не будет никогда верным, но из-за особенностей JS, оно не является ошибочным, поэтому скрипт продолжит работу.
[свернуть]


Выход из этой ситуации следующий: третью строку необходимо исправить, чтобы она выглядела так:
Window1.ThickMaterial1.Value = ActiveMaterial.Thickness;

P.S На будущее: если скрипт выдает ошибку, связанную с вашим вопросом, неплохо было бы и текст ошибки тоже добавлять, ведь в ней сказано почти все, что нужно для поиска ошибки и причин ее возникновения.

Добавлено через 29 минут
Спасибо большое. С Вашими поправками
Цитата:

Сообщение от Guamoko (Сообщение 453748)
Window1.ThickMaterial1.Value = ActiveMaterial.Thickness;

заработало,но только после того,

Цитата:

Сообщение от Guamoko (Сообщение 453748)
И еще одна странная вещь в вашем коде. Это как раз то же самое присвоение. Судя по коду, Window1.ThickMaterial1 - это числовое поле.

как я создал поле и присвоил ему значение Window1.ThickMaterial1.Value= ActiveMaterial.Thickness;
Вообще-то, мне это поле не нужно и в своем варианте
Window1.ThickMaterial1.=ActiveMaterial.Thickness;
я предполагал, что ThickMaterial1-переменная, принимающая значение толщины активного материала.А уже от этой переменной зависило
if(Window1.ThickMaterial1.Value==10){
Window1.BNapl1.Value=Window1.LGProf.Value+15;
Window1.BNapl1.Layout.Top=Window1.BNapl1.Layout.To p;
Возможно ли обойтись без поля? Если нет,я его скрою, присвоив Visible-false
Еще раз позволю себе повторить задачу,которую хотелось бы решить.
1)Объявить переменную,принимающую значение толщины активного материала.
2)при изменении материала,если толщина активного материала=10,запустить формулу
Window1.BNapl1.Value=Window1.LGProf.Value+15;
Window1.BNapl1.Layout.Top=Window1.BNapl1.Layout.To p;
которая выводит результат вычисления в окно BNapl1.

Letos 17.04.2018 10:28

Цитата:

Сообщение от Guamoko (Сообщение 453748)
Возможно ли обойтись без поля?

Конечно можно. Но если вам переменная нужна только для этого случая, то лучше и назвать ее покороче и отделить от объекта Window1. Например так:
Код:

var thick = ActiveMaterial.Thickness;
if (thick == 10)
//и дальше по коду

И еще немного теории: если переменную создавать в объекте Window1, то она будет существовать в этом объекте, пока тот не будет уничтожен (предположительно, до завершения скрипта). А если объявить переменную как на примере выше, то она будет существовать в пределах блока, в котором объявлена (то есть, по завершении обработчика события, переменная будет уничтожена, а память освобождена). Применительно к скриптам, это, скорее, "правило хорошего тона". За все время пользования скриптами я еще ни разу не видел скрипта, который бы замедлял работу Базиса из-за использования большого количества переменных. Из ощутимых плюсов я могу назвать наверное только упрощение работы в отладчике - меньше лишних переменных отображается.

Guamoko 17.04.2018 10:45

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

Rudolf 18.04.2018 11:13

Добрый день.
Есть ли возможность имортировать через скрипт в Базис 8 данные из формата csv, например
артикул1;длина1;ширина1;колво1
артикул2;длина2;ширина2;колво2
...
После импорта будут созданы панели с этими параметрами.


Текущее время: 06:22. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
© 2007-2021 PROMEBEL