|
|
|
|
|
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..
|
Просмотров: 436246
|
21.05.2018, 15:11
|
#151
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от wizardpnz
как получить список материалов используемых на сцене?
Нашёл вот это. А проще можно, это долго?
IndexOf))) в массиве
|
Вот решение быстрее:
Код:
function forEachInList(list, func){
if (!func)
return;
for (var i = 0; i < list.Count; i++){
var obj = list.Objects[i];
func(obj);
if (obj.List){
forEachInList(obj.AsList(), func);
}
}
}
var matList = [];
forEachInList(Model, (obj)=>{
var matName;
if (obj.Material){
matName = obj.Material.MaterialName;
if (matList.indexOf(matName) < 0){
system.log(matName);
}
}
var panel = obj.AsPanel;
if (panel){
for (var i = 0; i < panel.Plastics.Count; i ++){
var p = panel.Plastics.Plastics[i];
matName = p.Material;
if (matList.indexOf(matName) < 0){
system.log(matName);
}
}
for (var i = 0; i < panel.Butts.Count; i ++){
var b = panel.Butts.Butts[i];
matName = b.Material;
if (matList.indexOf(matName) < 0){
system.log(matName);
}
}
}
})
Есть одно но: проверял и Ваш и свой скрипт на большой модели - Ваш скрипт выдаёт больше имён материалов, хотя часть этих имен не показываются в окне замены материала. Не знаю, с чем это связано.
|
|
|
Пользователь сказал cпасибо:
|
|
21.05.2018, 16:00
|
#152
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
сделал по старинке в переборе всех элементов сцены собираю массив названий материалов
Код:
mat = [];
if (mat.indexOf(MaterialName) == -1) {mat.push(MaterialName)}
|
|
|
Пользователь сказал cпасибо:
|
|
22.05.2018, 14:28
|
#153
|
Пользователь
Регистрация: 16.12.2014
Сообщений: 32
Сказал(а) спасибо: 25
Поблагодарили 5 раз(а) в 5 сообщениях
Вес репутации: 0
|
Есть у меня скриптик. Он расставляет поровну полки по высоте. Но если полки присажены, то крепёж остаётся на месте, а полки расставляются. Нужно сделать , чтобы с крепежём перемещалось.
Скрытый текст
MinY = 1e10; // низ нижней полки
MaxY = -1e10; // верх верхней полки
SumThickness = 0; // суммарна толщина панелей
Count = 0; // количество панелей
for (k = 0; k < Model.SelectionCount; k++) {
obj = Model.Selections[k];
if (obj.Thickness > 1) {
if (obj.GabMin.y < MinY)
MinY = obj.GabMin.y;
if (obj.GabMax.y > MaxY)
MaxY = obj.GabMax.y;
SumThickness += obj.Thickness;
Count = Count + 1;
}
}
// нужное расстояние между полками
SpaceBetween = Math.floor((MaxY - MinY - SumThickness) / (Count - 1));
CurY = MinY;
for (k = 0; k < Model.SelectionCount; k++) {
obj = Model.Selections[k];
if (obj.Thickness > 1) {
Undo.Changing(obj);
obj.Translate(0, CurY - obj.GabMin.y, 0);
CurY = CurY + SpaceBetween + obj.Thickness;
}
} [свернуть]
|
|
|
22.05.2018, 16:25
|
#154
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от Kartuz
Есть у меня скриптик. Он расставляет поровну полки по высоте. Но если полки присажены, то крепёж остаётся на месте, а полки расставляются. Нужно сделать , чтобы с крепежём перемещалось.
|
Добавил перемещение крепежа с комментариями. Кстати, функция поиска крепежа, соединённого с панелью, может не найти крепеж, поставленный неправильно.
Код
Код:
MinY = 1e10; // низ нижней полки
MaxY = -1e10; // верх верхней полки
SumThickness = 0; // суммарна толщина панелей
Count = 0; // количество панелей
/**
* Поиск объекта крепежа (блок схемы крепежа, например), в который вложен
* текущий крепёж
* @param {Object3} obj текущий крепеж
*/
function FindFastenerOwner(obj){
var result = obj;
var owner = obj.Owner;
while (owner){
//проверка по типу монтирования - если он существуети не равен типу "секция"
if ((owner.DatumMode > DatumMode.None) && (owner.DatumMode != DatumMode.Box)){
result = owner;
}
owner = owner.Owner;
}
return result;
}
for (k = 0; k < Model.SelectionCount; k++) {
obj = Model.Selections[k];
if (obj.Thickness > 1) {
if (obj.GabMin.y < MinY)
MinY = obj.GabMin.y;
if (obj.GabMax.y > MaxY)
MaxY = obj.GabMax.y;
SumThickness += obj.Thickness;
Count = Count + 1;
}
}
// нужное расстояние между полками
var SpaceBetween = Math.floor((MaxY - MinY - SumThickness) / (Count - 1));
var CurY = MinY;
for (var k = 0; k < Model.SelectionCount; k++) {
var obj = Model.Selections[k];
if (obj.Thickness > 1) {
Undo.Changing(obj);
var yShift = CurY - obj.GabMin.y;
// Весь крепёж, соединенный с панелью
// достаём до сдвига панели
var fasts = obj.FindConnectedFasteners();
obj.Translate(0, yShift, 0);
// список уже сдвинутого крепежа
var translatedFasts = [];
for (var i = 0; i < fasts.length; i++) {
// ищем "самый корневой" крепёж
var curFast = FindFastenerOwner(fasts[i]);
// Если текущего крепежа нет в списке сдвинутых
if (translatedFasts.indexOf(curFast) < 0){
Undo.Changing(curFast);
// сдвигаем крепёж
curFast.Translate(0, yShift, 0);
// и записываем в список сдвинутых
translatedFasts.push(curFast);
}
}
CurY = CurY + SpaceBetween + obj.Thickness;
}
}
[свернуть]
|
|
|
Пользователь сказал cпасибо:
|
|
24.05.2018, 11:58
|
#155
|
Пользователь
Регистрация: 16.12.2014
Сообщений: 32
Сказал(а) спасибо: 25
Поблагодарили 5 раз(а) в 5 сообщениях
Вес репутации: 0
|
Letos, Скрипт работает, спасибо. Но только если полки поставить из фрагмента, то не двигается ничего, даже пустая полка
|
|
|
24.05.2018, 12:20
|
#156
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от Kartuz
Letos, Скрипт работает, спасибо. Но только если полки поставить из фрагмента, то не двигается ничего, даже пустая полка
|
Предполагаю, что это из-за этого куска кода:
Код:
for (k = 0; k < Model.SelectionCount; k++) {
obj = Model.Selections[k];
if (obj.Thickness > 1) {
//И далее по коду
Здесь перебираются все выделенные объекты и если толщина объекта больше единицы, то выполняются действия по расчету, сдвигу и т.д.
А в вашем случае, предполагаю, вы выделяете блок, в котором находится панель, скрипт проверяет его (блока) толщину, и ничего не делает дальше. Попробуйте выделить именно панели и запустить скрипт - изменится ли что-нибудь? А я пока подумаю над наиболее грамотным решением)
|
|
|
24.05.2018, 14:16
|
#157
|
Пользователь
Регистрация: 16.12.2014
Сообщений: 32
Сказал(а) спасибо: 25
Поблагодарили 5 раз(а) в 5 сообщениях
Вес репутации: 0
|
Letos, работает скрипт только при простом построениии. Если использовать фрагмент, в котором полка с крепежём, то не работает. Фрагмент делается с использованием эластичности.
|
|
|
24.05.2018, 17:07
|
#158
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от Kartuz
Но только если полки поставить из фрагмента, то не двигается ничего, даже пустая полка
|
Подправил скрипт (во вложении). Должен сработать. Если все равно не получится - пришлите простенькую модель, на которой скрипт некорректно отрабатывает, для проверки.
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
24.05.2018, 23:34
|
#159
|
Пользователь
Регистрация: 16.12.2014
Сообщений: 32
Сказал(а) спасибо: 25
Поблагодарили 5 раз(а) в 5 сообщениях
Вес репутации: 0
|
Letos, Всё отлично работает !! Спасибо, выручаете в очередной раз. В моей работе этот скрипт экономит кучу времени !!!!
|
|
|
25.05.2018, 08:36
|
#160
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
Как узнать заказ, наименование, артикул из параметров изделия
Код:
Action.Control.Article.Code
Action.Control.Article.Name
Action.Control.Article.OrderName
Последний раз редактировалось wizardpnz; 25.05.2018 в 09:13.
|
|
|
Пользователь сказал cпасибо:
|
|
|
|
|
Нижняя навигация
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 09:45. Часовой пояс GMT +3.
|