Цитата:
Сообщение от 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). И если отменять/возвращать эти операции, то все нормально. Но если сохранить и перечитать модель, то изменение видимости уже не присутствует в истории. Мой вывод: получается, что изменение видимости объекта не пишется в файл модели. Исключение составляют слои, да и у них все странно: Если через параметры слоев менять их видимость, то она пишется в историю, а если через свойства модели или скрипт - то не пишется.