Волшебная кнопка для подсчета линий в Sketchup
Без прелюдий сразу к делу.
Чтобы было комфортно пользоваться понадобится версия Sketchup 2020 или старше.
В этой версии немного прокачали вкладку "Иерархия" добавив возможность скрывать через нее группы и компоненты. Это нужно для того чтобы не страдать ерундой добавляя десятки ненужных слоев, чтобы скрывать/показывать группу объектов.
Мне удобен вариант при котором видимость/невидимость всех всех групп управляется через иерархию. А все что нельзя скрыть через иерархию управляется через слои.
Например можно скрыть запасы кабеля для распределительной коробки или розетки и обозначить их пунктиром.
Линиями нарисованными пунктиром можно можно управлять через слои.
Выше вы видите созданную группу с именем E-W, в ней находятся группы с отдельными линиями.
Каждая группа с именем типа 5Р1 это отдельная линия на щит. (5 номер помещения, Р-розетки,1 номер розеточной группы в комнате)
Группа 5Р1
С одной стороны очень удобно сразу дать имена каждому кабелю. Особенно при подготовке к печати в LayOut, кликая по кабелю инструментом Подпись, имя кабеля подставляется автоматически, ошибиться невозможно.
С другой стороны появляется проблема с измерением длины кабеля в каждой группе. Обычно это происходит довольно нудно.
Нужно зайти в интересующую группу выделить всю линию и только потом увидим результат в данном случае ~ 27957 mm
Далее записываем результат в excel/блокнот/листочек и повторяем процедуру со всеми группами, что является довольно неудобным если учесть что бывают объекты на которых может быть и сто линий (монтаж СКС).
Есть способ вывести результат по всем линиям сразу и этот способ использовать скрипты на языке Ruby. Окно > Консоль языка "Ruby"
Вставляем скрипт:
model = Sketchup.active_model
group_name_pattern = /^[1-9][0-9]?([А-Яа-яA-Za-z]+)[1-9][0-9]?$/
group_lengths = Hash.new(0.0)
matching_groups = Hash.new { |hash, key| hash[key] = [] }
scale = 0.0254
def process_group(group, group_name_pattern, group_lengths, matching_groups, scale)
group_name = group.name
match = group_name.match(group_name_pattern)
if match
letter = match[1]
edges = group.entities.grep(Sketchup::Edge)
total_length_mm = edges.reduce(0.0) { |sum, edge| sum + edge.length * scale }
group_lengths[letter] += total_length_mm
matching_groups[letter] << group
end
group.entities.each do |entity|
if entity.is_a?(Sketchup::Group)
process_group(entity, group_name_pattern, group_lengths, matching_groups, scale)
end
end
end
root_groups = model.entities.grep(Sketchup::Group)
root_groups.each do |group|
process_group(group, group_name_pattern, group_lengths, matching_groups, scale)
end
group_lengths.each do |letter, total_length_mm|
if total_length_mm > 0.0
total_length_meters = total_length_mm
puts "Группы с буквой #{letter}, Общая длина линий: #{total_length_meters.to_i} м"
matching_groups[letter].each do |group|
group_name = group.name
edges = group.entities.grep(Sketchup::Edge)
total_length_mm = edges.reduce(0.0) { |sum, edge| sum + edge.length * scale }
total_length_meters = total_length_mm
puts " Гр: #{group_name}, Длина кабеля: #{total_length_meters.to_i} м"
end
end
end
И через секунду получаем готовый результат, ну или через пять секунд если у вас под сотню линий
Итого: Группы с буквой С, Общая длина линий: 169 м (освещение 3х1,5) Группы с буквой Р, Общая длина линий: 186 м (розетки 3х2,5) Группы с буквой ВП, Общая длина линий: 15 м (варочная поверхность)
Чтобы скрипт сработал линии необходимо поместить в группу с именем вида 1Р1, 21Р1, 1Р22, 1РС22 и тому подобное. То есть (одна-две цифры)(одна-две буквы)(одна две цифры). Буквы подходят как латиница так и кириллица.
Если предпочитаете другое называние можете изменить переменную group_name_pattern
Не знаю насколько правильно написан код, но он работает, не это ли самое главное)
Если это читают программисты знакомые с Ruby, подскажите что исправить или улучшить.
Наверное можно сделать экспорт в excel файл.
Пользуйтесь на здоровье
Материал и работа без цен
Лига электриков
4.7K поста24.8K подписчика
Правила сообщества
Запрещён оффтоп, нарушение основных правил пикабу