Результат обновления строки неожиданно переключается между двумя значениями

Решено - это произошло при присвоении имени (см. Новый код ниже)

причина - попытка переименовать в одно и то же имя, чтобы оно автоматически менялось

решение - используйте оператор IF, чтобы увидеть, совпадают ли имена

Спасибо Джиму Фольцу за решение

НОВЫЙ КОД

if from != newname
name = Sketchup.active_model.selection[0].definition.name=newname
end

Плагин для деревообработки - предполагается, что каждый компонент является отдельной платой. Выберите один компонент - запустите плагин. Добавляет поле "Определение" КОМПОНЕНТА в окне "Информация об объекте" с толщиной, шириной и длиной детали (в дюймах)

ПРИМЕР:

Имя компонента перед запуском = [Центральная панель]

Имя компонента после запуска = [Центральная панель: 3/4 "x 11 7/8" x 75 1/4 "]

*********** ЭТА ПРОБЛЕМА ***********

Имя компонента после последующего запуска = [Центральная панель: 3/4 "x 11 7/8" x 75 1/4 "#1]
(добавляет № 1 к строке)

В первый раз работает нормально. Если я снова запускаю плагин на том же компоненте, он добавляет имя компонента с "#1". Каждый последующий запуск переключает "#1" в строку и из строки

Плагин также обновит связанный текстовый ярлык, если он существует и имеет то же имя, что и компонент. Строка с текстовой меткой не имеет этой проблемы.

первая половина кода является оригинальной, вторая половина - новым кодом (как закомментированная строка 62)

require 'sketchup.rb'
module JF
module GetDimensions
    module_function
    def get_dimensions
        model = Sketchup.active_model
        selection = model.selection

        ### show VCB and status info...
        Sketchup::set_status_text(("DIMENSIONS..." ), SB_PROMPT)
        Sketchup::set_status_text(" ", SB_VCB_LABEL)
        Sketchup::set_status_text(" ", SB_VCB_VALUE)

        ### Get Selected Entities.
        return unless selection.length == 1
        e = selection[0]
        return unless e.respond_to?(:transformation)

        scale_x = ((Geom::Vector3d.new 1,0,0).transform! e.transformation).length
        scale_y = ((Geom::Vector3d.new 0,1,0).transform! e.transformation).length
        scale_z = ((Geom::Vector3d.new 0,0,1).transform! e.transformation).length

        bb = nil
        if e.is_a? Sketchup::Group
            bb = Geom::BoundingBox.new
            e.entities.each {|en| bb.add(en.bounds) }
        elsif e.is_a? Sketchup::ComponentInstance
            bb = e.definition.bounds
        end

        if bb
            dims = [
                width  = bb.width  * scale_x,
                height = bb.height * scale_y,
                depth  = bb.depth  * scale_z
            ]
            # Original messagebox - commented out by kp
            # UI.messagebox("Largeur:\t#{dims[0].to_l}\nHauteur:\t#{dims[1].to_l}\nProfondeur:\t#{dims[2].to_l}")
        end
        #   Newly added code follows            
        # UI.messagebox("Thickness:\t#{dims.sort[0].to_l}\nWidth:\t#{dims.sort[1].to_l}\nHeight:\t#{dims.sort[2].to_l}")
        # Added by kp - translated and sorted dims smallest to largest
        #               Retrieved Component Name for processing
        #               Checked to see if This component has already been modified
        #               If already modified then strip off previous modification to prepare for current modification
        #               Modify component name
        # New code - added by kp
        name = Sketchup.active_model.selection[0].definition.name
        from = name
        vpos = name.index(":")
        # The following "IF" code could be improved but
        # it worked around an 'array vs string' error
        # I was getting when I tried a different method
        if vpos.nil?
            vpos = 0
        elsif vpos>0
            tempname = name.partition(':').first
            name = tempname
        end
        newname = name + ": #{dims.sort[0].to_l} x #{dims.sort[1].to_l} x #{dims.sort[2].to_l}"
        name = Sketchup.active_model.selection[0].definition.name=newname
        to = newname
        # Update the TEXT LABEL
        model.entities.grep(Sketchup::Text) { |text|
        self.replace(text, from, to)
        }
        # End of new code - by kp
    end

    def self.replace(text_entity, from, to)
        text_entity.text = text_entity.text.gsub(from, to)
    end
end
end
### do menu
if( not file_loaded?("kp_ get_dimensions.rb") )
add_separator_to_menu("Plugins")
#   menu_name = "[jf] Get Dimensions"
menu_name = "[kp] Get Dimensions"
UI.menu("Plugins").add_item(menu_name) { JF::GetDimensions.get_dimensions }
end#if
file_loaded("kp_ get_dimensions.rb")

1 ответ

Приношу свои извинения за то, что не опубликовал решение по стандартам форума. Всплывающее предложение смутило меня (легко сделать).

На случай, если неясно - я отредактировал оригинальный пост, чтобы указать решение проблемы. Для ясности я покажу это здесь ниже.

Когда новое имя для компонента совпадало со старым именем, система (я полагаю, Ruby API) отличала бы меня от этого, добавляя суффикс #1.

Это была оригинальная проблема строки кода

name = Sketchup.active_model.selection[0].definition.name=newname

Это было решение - проверить имена не совпадают.

if from != newname
name = Sketchup.active_model.selection[0].definition.name=newname
end

Я не могу проголосовать за решение, так как оно было отправлено мне по электронной почте.

Другие вопросы по тегам