Показать сообщение отдельно
Старый 13.03.2018, 10:37   #115
Letos
Консультант
 
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,030 раз(а) в 366 сообщениях
Вес репутации: 344
Letos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от 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, написать следующее:
Код:
if(!obj)
  return;
А если надо, то в примере выше первый вариант - рекурсивная функция перебора всех объектов в блоке, который передается первым параметром (это может быть не обязательно модель).


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