Logic Machine Forum
Tag mass edit - Printable Version

+- Logic Machine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: General (https://forum.logicmachine.net/forumdisplay.php?fid=2)
+--- Thread: Tag mass edit (/showthread.php?tid=4885)



Tag mass edit - Novodk - 23.07.2023

Hi
I'm trying to organize my Objects a bit with giving them tags I can use in scripting or just to filter what I need to see.
All my objects in building "small" is called "Small - Living Room - Light 1 On/Off" I want to give that Object 4 tags (Small, Living Room, Light 1, On/Off).

If I use the Object filter and type "Small" and then Mass edit > Object properties > Field list >  Tags and type in "Small" it works.
But if I then use the Object filter again and type in "Living Room" and click Mass edit >  Object properties > Field list >  Tags, then there is no text and if I write "Living Room" and click "Save" then it deletes everything but the new tag "Living Room".


RE: Tag mass edit - Daniel - 24.07.2023

Some years ago I made this script, now would do it differently but still  will work.
Code:
seperators = '.,_ =+'

-- Start address of objects (min: 0/0/1 = main/sub/address)
start_main = 0
start_sub = 0
start_address = 1

-- End address of objects (max: 31/7/255 = main/sub/address)
end_main = 15
end_sub = 7
end_address = 255

------------------------------------------ End Parameters ------------------------------------------
------------------------------ DON'T CHANGE ANYTHING UNDER THIS LINE -------------------------------

function split(source, delimiters)
        local elements = {}
        local pattern = '([^'..delimiters..']+)'
        string.gsub(source, pattern, function(value) elements[#elements + 1] =     value;  end);
        return elements
end

-- Calculate start address to DB format
start_objectaddress = ((start_main * 2048) + (start_sub * 256) + start_address)

-- Calculate end address to DB format
end_objectaddress = ((end_main * 2048) + (end_sub * 256) + end_address)

-- Get all objects from DB
all_objects = db:getall('SELECT address, name, tagcache FROM objects')
for _, object in ipairs(all_objects) do
  -- Check if object is inside given range
  if object.address >= start_objectaddress and object.address <= end_objectaddress then
     currentrowaddress = object.address
    myobject = grp.find(currentrowaddress)
    nameTable = split(myobject.name, seperators)  --spliting  object string in to table
   
  --  log(nameTable)
    for _, tag in ipairs(nameTable) do
      tagvalue = tag
   
       -- Check if object tag already exists inside DB
     current_object_tag = db:getall('SELECT object, tag FROM objecttags WHERE object = ' .. currentrowaddress .. ' AND tag = "' .. tagvalue .. '"')
     object_tagcache = db:getone('SELECT tagcache FROM objects WHERE address = ' .. currentrowaddress .. '')
     if #current_object_tag == 0 then
        -- Add object to table objecttags
        db:insert('objecttags', {object = currentrowaddress, tag = tagvalue, })
          -- Check if object already has other tag values inside DB and add new values to tagcache
        if object_tagcache == nil or object_tagcache == "" then
          db:update('objects', { tagcache = tagvalue }, { address = currentrowaddress })
            else
          tag_string = "" .. object_tagcache .. ", " .. tagvalue .. ""
               log(tag_string)
          db:update('objects', { tagcache = tag_string }, { address = currentrowaddress })
          end
     end
   
    end
  end
end

script.disable(_SCRIPTNAME)



RE: Tag mass edit - Novodk - 27.07.2023

Thanks alot, do I just add it to the common functions?


RE: Tag mass edit - Daniel - 28.07.2023

No, you run this script once as a script, can be resident. Based on used separators it will auto generate tags from the object name.


RE: Tag mass edit - Novodk - 28.07.2023

Thanks, it works