Счастье есть. Сейчас все на горячие клавиши и жизнь удалась!
const filename = 'C:\\Bazis 10\\Фрагменты\\35\\11.fr3d';
pozY = NewNumberInput('высота полки');
SetCamera(p3dFront);
var Bok1 = GetPanel("Укажите 1-ую вертикальную панель");
var Bok2 = GetPanel("Укажите 2-ую вертикальную панель");
SetCamera(p3dTop);
var Back = GetEdge('Укажите заднюю границу', AxisX).First.z;
var Front = GetEdge('Укажите переднюю границу', AxisX).First.z;
SetCamera(p3dFront);
var x1 = Bok1.GabMax.x + 0;
var x2 = Bok2.GabMin.x - 0;
// Максимальная координата по высоте из двух минимальных координат панелей
var y1 = Math.max(Bok1.GabMin.y, Bok2.GabMin.y);
// Минимальная координата по высоте из двух максимальных координат панелей
var y2 = Math.min(Bok1.GabMax.y, Bok2.GabMax.y);
var z1 = Back;
var z2 = Front;
var frag = OpenFurniture(filename);
if (frag) {
var obj = frag.Make(0, 0);
if (obj) {
// размер по оси = максимум - минимум
obj.ElasticResize({
x: x2 - x1,
y: y2 - y1,
z: z2 - z1
});
obj.Owner = Model.Temp;
}
// минимальная координата идёт в координату позиции
}
Action.Continue();
Action.Hint = 'Укажите положение объекта';
Action.OnMove = function () {
obj.Position = Action.Pos3;
}
Action.OnClick = function (){
obj.Position = Action.Pos3; // на всякий случай
Action.OnMove = undefined;
Action.Finish();
SetCamera(p3dIsometric );
}
Как работать со значениями каждого отдельного созданного поля, а не только последнего?
У меня всегда только последнего созданного берёт значение.
Не через eval. (eval'ом умею.)
NewNumberы в какой-то массив записывать? Пробовал. Тож самое.
Как работать со значениями каждого отдельного созданного поля, а не только последнего?
У меня всегда только последнего созданного берёт значение.
Не через eval. (eval'ом умею.)
NewNumberы в какой-то массив записывать? Пробовал. Тож самое.
Первый вариант (всего лишь добавил "var")
Код:
Prop = Action.Properties;
Add = Prop.NewButton('Добавить');
Add.OnClick = function () {
var n = Prop.NewNumber('Название', 300)
n.OnChange = function () { system.log(n.Value) }
};
Action.Continue();
Почему оно работает, в отличие от исходного:
В исходном варианте переменная "n" находится в глобальном пространстве имён и каждый клик переписывает её значение, соответственно в лог будет писаться значение из последнего свойства, записанного в переменную "n"
В моём варианте переменная "n" создаётся в локальном пространстве имён и существует только во время выполнения обработчика OnClick, после чего доступа к этой переменной нет. В результате при каждом нажатии на кнопку создаётся новая переменная "n" на время обработки клика. Почему во время вызова лога берётся правильное значение "n" - сходу не вспомню, поэтому надёжность данного метода под вопросом (а может и всё в порядке и оно будет нормально работать долгие года). Второй вариант понятнее и прозрачнее.
[свернуть]
Второй вариант
При вызове обработчика первым аргументом идёт свойство, которое вызывает обработчик - этот вариант понадёжнее будет.
Код с минимумом вмешательств, но здесь каждому свойству в обработчике будет соответствовать отдельная функция:
Код:
Prop = Action.Properties;
Add = Prop.NewButton('Добавить');
Add.OnClick = function () {
var n = Prop.NewNumber('Название', 300)
n.OnChange = function (prop) {
system.log(prop.Value)
}
};
Action.Continue();
Код с вынесением обработчика в отдельную функцию - в отличие от кода выше, все обработчики свойств будут ссылаться лишь на одну, ранее созданную функцию:
Код:
Prop = Action.Properties;
Add = Prop.NewButton('Добавить');
function LogValue(prop){
system.log(prop.Value);
}
Add.OnClick = function () {
var n = Prop.NewNumber('Название', 300)
n.OnChange = LogValue;
};
Action.Continue();
Посмотрел. Оказывается профиль создаётся с нулевыми габаритами, наверное поэтому и не растягивается нормально. А при завершении скрипта профиль добавляется (как я понял) базового размера.
Написал замудрённое решение, а пока писал этот комментарий меня осенило и, оказывается, надо было просто после создания объекта сделать ему Build() . Новый код прилагаю.
Код
Код:
const filename = 'C:\\Bazis 10\\Фрагменты\\35\\11.fr3d'
pozY = NewNumberInput('высота полки');
SetCamera(p3dFront);
var Bok1 = GetPanel("Укажите 1-ую вертикальную панель");
var Bok2 = GetPanel("Укажите 2-ую вертикальную панель");
SetCamera(p3dTop);
var Back = GetEdge('Укажите заднюю границу', AxisX).First.z;
var Front = GetEdge('Укажите переднюю границу', AxisX).First.z;
SetCamera(p3dFront);
var x1 = Bok1.GabMax.x + 0;
var x2 = Bok2.GabMin.x - 0;
// Максимальная координата по высоте из двух минимальных координат панелей
var y1 = Math.max(Bok1.GabMin.y, Bok2.GabMin.y);
// Минимальная координата по высоте из двух максимальных координат панелей
var y2 = Math.min(Bok1.GabMax.y, Bok2.GabMax.y);
var z1 = Back;
var z2 = Front;
var frag = OpenFurniture(filename);
if (frag) {
var obj = frag.Make(0, 0);
obj.Build();
if (obj) {
// размер по оси = максимум - минимум
obj.ElasticResize({
x: x2 - x1,
y: y2 - y1,
z: z2 - z1
});
obj.Owner = Model.Temp;
}
// минимальная координата идёт в координату позиции
}
Action.Continue();
Action.Hint = 'Укажите положение объекта';
Action.OnMove = function () {
obj.Position = Action.Pos3;
}
Action.OnClick = function () {
obj.Position = Action.Pos3; // на всякий случай
Action.OnMove = undefined;
Action.Finish();
SetCamera(p3dIsometric);
}
Всем доброго времени.
прошу совета помощи.
Задача состоит в определении где находится присадка под петли верх/низ/лево/право у панели. Скриптом.
Определить верх/низ решаемо, Y ось всегда вверх и получив координаты контура и приведя их к мировым - можно определить где верх, а где низ, и исходя из этого определить вверху или внизу присадка, вытащив координаты отверстий.
Ситуация еще осложнена тем что панель не одна(так бы можно было привязаться к какой то координате), а целая кухня панелей любой конфигурации.
Однако ситуация когда отверстия могут быть с двух сторон - исключена.
А вот с лево/право не понятно как быть. Т.е. вопрос есть ли какой то способ , прогрммно определить лево/право панели ?
( лицом при этом будет задняя сторона панели , где отверстия).
Скрипт для установки вертикального эластичного блока. Рабочий, но почему-то долго упирался....
Вопрос - есть ли команда РАЗРУШИТЬ БЛОК? Создать вроде нашел, а разрушить нет....
const filename = 'C:\\Bazis 10\\Фрагменты\\35\\верт, закл\\перегородка под антресоль.fr3d'
SetCamera(p3dLeft);
var B1 = GetPoint("Укажите 1-ую точку");
var B2 = GetPoint("Укажите 2-ую точку");
SetCamera(p3dFront);
//SetCamera(p3dFront);
var x1 = B1.z + 0;
var x2 = B2.z - 0;
// Максимальная координата по высоте из двух минимальных координат панелей
var y1 = B1.y
// Минимальная координата по высоте из двух максимальных координат панелей
var y2 = B2.y
var z1 = B1.z;
var z2 = B2.z;
var frag = OpenFurniture(filename);
if (frag) {
var obj = frag.Make(0, 0);
obj.Build();
if (obj) {
// размер по оси = максимум - минимум
obj.ElasticResize({
x: x2 - x1,
y: y2 - y1,
z: z2 - z1
});
obj.Owner = Model.Temp;
}
// минимальная координата идёт в координату позиции
}
Action.Continue();
Action.Hint = 'Укажите положение объекта';
Action.OnMove = function () {
obj.Position = Action.Pos3;
}
Action.OnClick = function () {
obj.Position = Action.Pos3; // на всякий случай
Action.OnMove = undefined;
Action.Finish();
SetCamera(p3dIsometric);
Последний раз редактировалось Ozimko; 10.02.2019 в 11:07.