|
|
|
|
|
06.06.2017, 08:56
|
|
БАЗИС 10 - Скрипты
systland
VIP
Регистрация: 30.10.2007
Адрес: Москва
Сообщений: 565
Сказал(а) спасибо: 303
Поблагодарили 451 раз(а) в 189 сообщениях
06.06.2017, 08:56
Рейтинг:
()
Обмениваемся , задаем вопросы, отвечаем... Все, что касается скриптов в БМ 10 в этой теме.
Последний раз редактировалось systland; 26.12.2017 в 11:52..
|
Просмотров: 437178
|
11.07.2018, 18:04
|
#191
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
я делаю импорт из базиса в 3CAD
углы поворотов я вычислил , но не пойму как сдвигать в зависимости от начальной точки построения
тут где то было импорт в three.js там возможно такая же проблема
поигрался со свойствами GMin и GMax
как я понял за основу берётся фронтальная панель и через матрицу трансформации разворачивает её до вертикальной , горизонтальной
значения из GMin и GMax показывают координаты изначальной фронтальной панели
Последний раз редактировалось wizardpnz; 11.07.2018 в 23:36.
|
|
|
12.07.2018, 11:28
|
#192
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от wizardpnz
поигрался со свойствами GMin и GMax
как я понял за основу берётся фронтальная панель и через матрицу трансформации разворачивает её до вертикальной , горизонтальной
значения из GMin и GMax показывают координаты изначальной фронтальной панели
|
Значения GMin и GMax показывают минимальную и максимальную точки габаритного параллелепипеда панели в её ЛСК. Как ни крутить панель, её габариты в ЛСК меняться не будут. Однако изменение контура панели может повлиять на эти значения.
Цитата:
Сообщение от wizardpnz
я делаю импорт из базиса в 3CAD
углы поворотов я вычислил , но не пойму как сдвигать в зависимости от начальной точки построения
|
А точно надо сдвигать (я думаю, и так всё должно быть)? Можете сказать, что не так отрабатывает при импорте? И еще, может поможет - при вложенности поворот учитывается относительно блока, в который вложен объект. То есть, при иерархии "Панель в блоке Б2, который в блоке Б1" конечный поворот панели будет состоять из поворота Б1, поворота Б2 и, собственно, поворота Панели.
|
|
|
Пользователь сказал cпасибо:
|
|
12.07.2018, 11:48
|
#193
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
попалась модель широкий шкаф, в нём два цоколя (никаких блоков нет)
1 цоколь 16, 0, 92
2 цоколь 16, 0, 504
это как должно быть
в свойствах детали в базисе
1 цоколь 16, 2250, 108
2 цоколь -0.5, 0, 504
если построить всё скриптами то конечно будет всё нормально, но
руками получается всякие варианты начальных точек
потом матрица трансформации разворачивает углы и всё встает на место
там есть все углы в объекте obj.GlobalMatrix()
пытаюсь разгадать алгоритм как привести этк кашу , чтобы координаты начинались от левого нижнего заднего угла габаритного кубика
придётся написать много этажный if else if .... else ((( наверное нет встроенного инструмента для нормализации координат объекта
|
|
|
Пользователь сказал cпасибо:
|
|
12.07.2018, 12:30
|
#194
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от wizardpnz
попалась модель широкий шкаф, в нём два цоколя (никаких блоков нет)
1 цоколь 16, 0, 92
2 цоколь 16, 0, 504
это как должно быть
в свойствах детали в базисе
1 цоколь 16, 2250, 108
2 цоколь -0.5, 0, 504
если построить всё скриптами то конечно будет всё нормально, но
руками получается всякие варианты начальных точек
потом матрица трансформации разворачивает углы и всё встает на место
там есть все углы в объекте obj.GlobalMatrix()
пытаюсь разгадать алгоритм как привести этк кашу , чтобы координаты начинались от левого нижнего заднего угла габаритного кубика
придётся написать много этажный if else if .... else ((( наверное нет встроенного инструмента для нормализации координат объекта
|
ТО есть, вам нужно, чтобы позицией каждого объекта была точка с наименьшими координатами x, y и z?
|
|
|
12.07.2018, 12:56
|
#195
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
да,чтобы координаты считались как если бы мы их мерили руками на экране о начала координат и без разворотов
я понимаю что базис где то сам применяет свою матрицу но в других прогах такого нет
там просто координаты начала объекта XYZ и ШВГ
и строим в направлении X+ Y+ Z+
тут надо копать
http://grazit.ru/geometricheskie-pre...j-grafike.html
Последний раз редактировалось wizardpnz; 12.07.2018 в 16:50.
|
|
|
12.07.2018, 17:19
|
#196
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от wizardpnz
да,чтобы координаты считались как если бы мы их мерили руками на экране о начала координат и без разворотов
я понимаю что базис где то сам применяет свою матрицу но в других прогах такого нет
там просто координаты начала объекта XYZ и ШВГ
и строим в направлении X+ Y+ Z+
тут надо копать
http://grazit.ru/geometricheskie-pre...j-grafike.html
|
Сделал скрипт для настройки положения панели в точку по минимальным координатам. Использовать его просто: запускаете, указываете панель, и радуетесь (?) результату. Тестировал я его долго (после каждого исправления скрипта, приходилось проверять все варианты поворотов снова), заманался, поэтому довел до состояния "кажется, должно работать" и отдаю его вам. Если обнаружите ошибку, пришлите пример с панелью, которая неправильно преобразовывается, и я поправлю код.
Пока не забыл: В некоторых случаях для приведения позиции объекта к минимальным координатам используется сдвиг контура панели, что может плохо отразиться на элементах панели (например, на пазах).
Код скрипта
Код:
function NegateVector(v) {
return {
x: -v.x,
y: -v.y,
z: -v.z
}
}
/**
*
* @param {Object3} obj
*/
function CorrectObject(obj) {
StartEditing(obj);
var minG = obj.ToObject(obj.GabMin);
var curPos = obj.ToObject(obj.Owner.ToGlobal(obj.Position));
var rot = obj.RotMatrix;
var negate = {
x: false,
y: false,
z: false
}
var x = {
x: rot[0],
y: rot[1],
z: rot[2],
}
var y = {
x: rot[4],
y: rot[5],
z: rot[6],
}
var z = {
x: rot[8],
y: rot[9],
z: rot[10],
}
const eps = 0.001;
if (minG.x > curPos.x + eps) {
negate.x = true;
}
if (minG.y > curPos.y + eps) {
negate.y = true;
}
if (minG.z > curPos.z + eps) {
negate.z = true;
}
if (negate.x) {
if (negate.y) {
if (negate.z) {
z = NegateVector(z);
y = NegateVector(y);
var shift = obj.NToGlobal({
x: obj.GSize.x,
y: obj.GSize.y,
z: obj.GSize.z
});
obj.Contour.Move(-obj.GSize.x, 0);
obj.TranslateGCS(shift);
} else {
y = NegateVector(y);
var shift = obj.NToGlobal({
x: obj.GSize.x,
y: obj.GSize.y,
z: 0
});
obj.TranslateGCS(shift);
}
} else if (negate.z) {
z = NegateVector(z);
var shift = obj.NToGlobal({
x: obj.GSize.x,
y: 0,
z: obj.GSize.z
});
obj.TranslateGCS(shift);
} else {
obj.Contour.Move(-obj.GSize.x, 0);
var shift = obj.NToGlobal({
x: obj.GSize.x,
y: 0,
z: 0
});
obj.TranslateGCS(shift);
}
}
else if (negate.y) {
if (negate.z) {
z = NegateVector(z);
y = NegateVector(y);
var shift = obj.NToGlobal({
x: 0,
y: -obj.GSize.y,
z: obj.GSize.z
});
obj.TranslateGCS(shift);
}
else {
obj.Contour.Move(0, -obj.GSize.y);
var shift = obj.NToGlobal({
x: 0,
y: obj.GSize.y,
z: 0
});
obj.TranslateGCS(shift);
}
} else if (negate.z) {
z = NegateVector(z);
var shift = obj.NToGlobal({
x: 0,
y: 0,
z: obj.GSize.z
});
obj.Contour.Move(-obj.GSize.x, 0);
obj.TranslateGCS(shift);
}
// Теперь ориентируем объект по осям Y и Z
obj.Orient(z, y);
}
var obj = GetPanel('panel 1');
if (obj) {
CorrectObject(obj);
}
[свернуть]
З.Ы. И, как всегда с опозданием, приходит еще одна умная мысль, которая может загубить на корню весь труд выше:
wizardpnz, а не проще ли взять минимальную точку объекта за позицию и вычислить размер панели, например так:
Код:
var pos = obj.GabMin;
var size = {
x: obj.GabMax.x - obj.GabMin.x,
y: obj.GabMax.y - obj.GabMin.y,
z: obj.GabMax.z - obj.GabMin.z,
}
//или
size = obj.NToGlobal(obj.GSize);
З.З.Ы. Обдумал: этот вариант подходит только для ортогональных панелей.
|
|
|
Пользователь сказал cпасибо:
|
|
12.07.2018, 18:07
|
#197
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
не получается, у нас тут такие базисо строители что я когда смотрю координаты панелей то плакать хочется
не для всех случаев работает
|
|
|
13.07.2018, 10:25
|
#198
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от wizardpnz
не получается, у нас тут такие базисо строители что я когда смотрю координаты панелей то плакать хочется
не для всех случаев работает
|
Хороший пример. Пришлось добавить нормализацию контура. Вот новая версия скрипта.
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
13.07.2018, 11:07
|
#199
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
то что нужно, я с этими матрицами упарился
почти всё работает
|
|
|
13.07.2018, 11:38
|
#200
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от wizardpnz
почти всё работает
|
Поправил, прикладываю новый скрипт.
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
|
|
|
Нижняя навигация
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 14:07. Часовой пояс GMT +3.
|