Улучшенный скрипт подсчета линий в Sketchup
Как работал старый скрипт
Чтобы он сработал линии необходимо поместить в группу с именем вида 1РОЗ4, 4ОСВ2, 1КОН1 и тому подобное. То есть (цифры)(любые буквы)(цифры).
Пример:
Есть у нас две линии 1РОЗ1 и 1РОЗ2 каждая по 25 метров
При подсчете скрипт выдавал общую длину кабелей с словом РОЗ к примеру 50 метров.
И это означало что для всех групп РОЗ (розетки) необходимо купить кабель 3х2.5 в количестве 50 м
Но иногда возникала необходимость посчитать для одного и того же индекса разные марки кабелей.
Например КОН (кондиционер) может быть подключен к линии 3х1.5 или 3х2.5 или 5х2.5, а скрипт все равно считал его как один кабель
Как работает новый скрипт
Новый скрипт работаем с именами типа 5РОЗ1 -- 3х2.5
То есть также как и раньше:
5 — номер помещения,
РОЗ — розетки,
1 — номер розеточной группы в комнате)
И после двойного тире указываем марку кабеля или любое другое свое определение.
Еще из отличий это увеличение точности, старый скрипт считал с точностью до метра, Теперь считаем с точностью до сантиметра.
Ruby Script SketchUp
model = Sketchup.active_model
group_name_pattern = /^[1-9][0-9]?([А-Яа-яA-Za-z]+)[1-9][0-9]?(\s.*)?$/
group_lengths = Hash.new(0.0)
matching_groups = Hash.new { |hash, key| hash[key] = [] }
second_part_lengths = Hash.new(0.0)
scale = 0.0254
def process_group(group, group_name_pattern, group_lengths, matching_groups, second_part_lengths, 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
second_part = match[2].to_s.strip
if !second_part.empty?
second_part_lengths[second_part] += total_length_mm
end
end
group.entities.each do |entity|
if entity.is_a?(Sketchup::Group)
process_group(entity, group_name_pattern, group_lengths, matching_groups, second_part_lengths, 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, second_part_lengths, 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.round(2)} м"
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.round(2)} м"
end
end
end
second_part_lengths.each do |second_part, total_length_mm|
total_length_meters = total_length_mm
cleaned_second_part = second_part.sub(/^--\s*/, '') # Удаляем два тире в начале второй части имени
puts "Общая длина линий для '#{cleaned_second_part}': #{total_length_meters.round(2)} м"
end
Теперь считать большие объемы стало еще легче и точнее.
Проект большого дома в SketchUp
Еще пример проекта умного дома.
Весь материал считается с первого раза со всеми запасами и уместился в одну закупку. Всего 1.09 км кабеля
96 отдельный групп. 75 линий приходит на щит.