|
|
|
|
|
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..
|
Просмотров: 436757
|
12.03.2018, 16:57
|
#111
|
Новичок
Регистрация: 21.09.2017
Сообщений: 19
Сказал(а) спасибо: 15
Поблагодарили 4 раз(а) в 2 сообщениях
Вес репутации: 0
|
Всем привет!
Скриптом добавляю в блок детали через Owner, затем меняю его видимость на false. Руками сохраняюсь, закрываю.
При открытии файла у всех деталей и блоков видимость на истине, не зависимо что сохранялось.
Как бы так блок скрыть чтобы насовсем?
|
|
|
12.03.2018, 18:00
|
#112
|
Местный
Регистрация: 30.11.2013
Адрес: Кишинев
Сообщений: 734
Сказал(а) спасибо: 1,529
Поблагодарили 884 раз(а) в 376 сообщениях
Вес репутации: 403
|
Цитата:
Сообщение от Sergenald
Как бы так блок скрыть чтобы насовсем?
|
Перенести блок в другой слой и скрыть его, если это возможно с помощью скрипта.
|
|
|
Пользователь сказал cпасибо:
|
|
12.03.2018, 18:07
|
#113
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от Sergenald
Всем привет!
Скриптом добавляю в блок детали через Owner, затем меняю его видимость на false. Руками сохраняюсь, закрываю.
При открытии файла у всех деталей и блоков видимость на истине, не зависимо что сохранялось.
Как бы так блок скрыть чтобы насовсем?
|
Если Вы записываете детали в блок, существовавший до запуска скрипта, то перед изменением видимости попробуйте сохранить его старое состояние в истории:
Код:
Undo.Changing(block)
Если же блок создается скриптом, то:
1. Либо Вы повторяетесь, ибо на подобный вопрос уже был дан ответ ранее
2. Либо способ, описанный мной ранее, не работает. Тогда уже придется думать над решением задачи.
|
|
|
Пользователь сказал cпасибо:
|
|
13.03.2018, 08:12
|
#114
|
Новичок
Регистрация: 21.09.2017
Сообщений: 19
Сказал(а) спасибо: 15
Поблагодарили 4 раз(а) в 2 сообщениях
Вес репутации: 0
|
Цитата:
Сообщение от Ovsyanicov
Перенести блок в другой слой и скрыть его, если это возможно с помощью скрипта.
|
Вот про работу со слоями вообще ни какой информации найти не получилось.
Цитата:
Сообщение от Letos
Либо Вы повторяетесь, ибо на подобный вопрос уже был дан ответ ранее
|
Вопрос да, почти про тоже. Там хоть как-то скрыть надо было. А теперь скрытое должно оставаться скрытым.
И, к сожалению, перебор имён отваливается на телах вращения. Пытался сделать что-то вроде if(Obj.Name){} в надежде что undefine значение будет как false распознано, но всё равно отваливается, скрипт прекращается, блок не скрывается
|
|
|
13.03.2018, 10:37
|
#115
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от Sergenald
Вот про работу со слоями вообще ни какой информации найти не получилось.
|
Из полезного могу сказать, что слой - это TLayer3D. И проверка, что объект - это слой, производится так:
Код:
obj instanceof TLayer3D
Цитата:
Сообщение от Sergenald
И, к сожалению, перебор имён отваливается на телах вращения. Пытался сделать что-то вроде if(Obj.Name){} в надежде что undefine значение будет как false распознано, но всё равно отваливается, скрипт прекращается, блок не скрывается
|
Поковырялся и, оказывается, еще один косяк скриптов - тело вращения (а возможно, еще какие-то типы 3д-объектов) криво передаются в функции "Model.forEach", но нормально обрабатываются в написанном ручном переборе:
Скрытый текст
Код:
// Variant 1
/**
* @param {List3D} list
* @param {(obj: Object3)=>{}} func
*/
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);
}
}
}
forEachInList(Model, (obj)=>{
console.log(obj.constructor.name);
})
// Variant 2
Model.forEach((obj)=>{
console.log(obj.constructor.name);
})
[свернуть]
В первом варианте нормально пишет в лог "TRotationBody" для тела вращения, а во втором случае бросает ошибку "cannot read property 'constructor' of undefined", то есть, не может достать свойство 'constructor' у несуществующего объекта. Если Вам не надо работать с этими объектами, которые приводят к ошибке, то можно просто в начало функции, которая внутри forEach, написать следующее:
А если надо, то в примере выше первый вариант - рекурсивная функция перебора всех объектов в блоке, который передается первым параметром (это может быть не обязательно модель).
Цитата:
Сообщение от Sergenald
Вопрос да, почти про тоже. Там хоть как-то скрыть надо было. А теперь скрытое должно оставаться скрытым.
|
С сохранением скрытых объектов тоже поковырялся - как-то непонятно работает сохранение видимости. Как писал товарищ Ovsyanicov, можно записать все в слой и скрыть слой, но через скрипты почему-то не получилось. А изменение видимости отдельных объектов (панелей, блоков и т.д.) почему-то не сохраняется в модель. Вот небольшой пример на основе написанного выше и ранее:
Скрытый текст
Код:
/**
* @param {List3D} list
* @param {(obj: Object3)=>{}} func
*/
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);
}
}
}
/**Имя блока. Желательно уникальное */
const blockName = 'My_script_block_#_1';
var b = BeginBlock(blockName);
AddVertPanel(0,0,1000,1000,0);
EndBlock();
//Сохраняем блок в модель
Action.Commit();
//Идем по всем объектам модели и ищем наш блок
forEachInList(Model, (obj)=>{
// Если имена совпадают, то это наш объект.
// При наличии нескольких объектов с этим именем
// в переменную b запишется последний найденный
if (obj.Name === blockName){
b = obj;
}
})
Undo.Changing(b);
// Делаем объект невидимым
b.Visible = false;
//Если заданное уникальное имя не нравится, меняем на то,
// которое должно быть.
b.Name = 'Block_1'
[свернуть]
После выполнения скрипта в истории сохраняются две операции: создание блока с панелью(1) и изменение его имени и видимости(2). И если отменять/возвращать эти операции, то все нормально. Но если сохранить и перечитать модель, то изменение видимости уже не присутствует в истории. Мой вывод: получается, что изменение видимости объекта не пишется в файл модели. Исключение составляют слои, да и у них все странно: Если через параметры слоев менять их видимость, то она пишется в историю, а если через свойства модели или скрипт - то не пишется.
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
14.03.2018, 21:58
|
#116
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
делаю стеклостворку для углового шкафчика
Block = BeginBlock("Створка");
ставлю створку
делаю в ней вырез
ставлю стекло
ставлю кляймеры для стекла
EndBlock();
поворачиваю Block.Rotate(AxisY,45);
блок поворачивается но без фурнитуры
как включить фурнитуру в состав блока
|
|
|
14.03.2018, 22:17
|
#117
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от wizardpnz
делаю стеклостворку для углового шкафчика
Block = BeginBlock("Створка");
ставлю створку
делаю в ней вырез
ставлю стекло
ставлю кляймеры для стекла
EndBlock();
поворачиваю Block.Rotate(AxisY,45);
блок поворачивается но без фурнитуры
как включить фурнитуру в состав блока
|
Всё оказалось просто - фурнитура ставится не в блок, а потому не поворачивается (по крайней мере у меня так). Самый простой способ исправить - это назначать блок Owner'ом поставленной фурнитуре вручную
|
|
|
14.03.2018, 22:26
|
#118
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
Block = BeginBlock("Створка");
между этими командами ставлю панели и фурнитуру
EndBlock();
створка и стекло поворачивается а кляймеры нет
Добавлено через 3 минуты
Цитата:
Сообщение от Letos
Всё оказалось просто - фурнитура ставится не в блок, а потому не поворачивается (по крайней мере у меня так). Самый простой способ исправить - это назначать блок Owner'ом поставленной фурнитуре вручную
|
это как??
|
|
|
14.03.2018, 22:48
|
#119
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от wizardpnz
это как??
|
Точно не знаю как у Вас, но примерно так:
Код:
Block = BeginBlock("Створка");
//какие-то манипуляции внутри блока
//Получаем объект крепежа например так
var furn = prop.Value.Mount(panel1, panel2, x, y, z);
//И та строчка, которая должна помочь:
//Она запихивает объект крепежа внутрь блока
//Это должно быть для каждого объекта крепежа.
furn.Owner = Block;
EndBlock();
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
05.04.2018, 14:45
|
#120
|
Новичок
Регистрация: 14.09.2017
Сообщений: 6
Сказал(а) спасибо: 3
Поблагодарили 0 раз(а) в 0 сообщениях
Вес репутации: 0
|
Добавляю паз скриптом
Код
var Panel = GetPanel();
var NewCuts = Panel.Cuts.Add();
NewCuts.Name = 'Дно LBX';
NewCuts.Sign = 'ДноLBX';
NewCuts.Contour.AddRectangle(0,0,38,8);
NewCuts.Trajectory.AddLine(38,0,38,720);
Panel.Build();
Action.Finish(); [свернуть]
Не могу понять, почему в истории нет записей об изменениях.
|
|
|
|
|
|
Нижняя навигация
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 00:08. Часовой пояс GMT +3.
|