38

Улучшенный скрипт подсчета линий в 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

Проект большого дома в SketchUp

Еще пример проекта умного дома.

Весь материал считается с первого раза со всеми запасами и уместился в одну закупку. Всего 1.09 км кабеля

96 отдельный групп. 75 линий приходит на щит.

Лига электриков

5.7K постов25.8K подписчиков

Правила сообщества

Запрещён оффтоп, нарушение основных правил пикабу