• Login
sketchucation logo sketchucation
  • Login
⚠️ Libfredo 15.4b | Minor release with bugfixes and improvements Update

Check if component exists before making it

Scheduled Pinned Locked Moved Developers' Forum
6 Posts 2 Posters 340 Views 2 Watching
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    MCorgano
    last edited by 21 Oct 2013, 05:59

    I have a script that rasterizes a line into cubes. My problem is, I want to make sure it doesn't generate duplicate cubes. How do I do that?

    require 'sketchup.rb'
    require 'extensions.rb'
    
    cCube = Sketchup.active_model.definitions.add("Cube") ;
    
    newface = cCube.entities.add_face( [ [0.5, -0.5, 0.5], [0.5, -0.5, -0.5], [-0.5, -0.5, -0.5], [-0.5, -0.5, 0.5] ] ) ;
    newface.reverse! if newface.normal.z < 0 ;
    newface.pushpull(1) ; # extrude it up to make a cube
    
    Sketchup.active_model.selection.each { |entity|
    	x = entity.start.position.x
    	y = entity.start.position.y
    	z = entity.start.position.z
    	l = entity.length
    	dx = (x-entity.end.position.x)/l
    	dy = (y-entity.end.position.y)/l
    	dz = (z-entity.end.position.z)/l
    	for i in 0..l.to_int
    		cx = (x - (dx*i)).round
    		cy = (y - (dy*i)).round
    		cz = (z - (dz*i)).round
    		# a bit of code to make sure a cCube doesnt exist here already
    		Sketchup.active_model.active_entities.add_instance(cCube, Geom;;Transformation.new([cx,cy,cz]))
    	end
    }
    
    1 Reply Last reply Reply Quote 0
    • T Offline
      TIG Moderator
      last edited by 21 Oct 2013, 10:02

      name="Cube" name=Sketchup.active_model.definitions.unique_name(name)

      if 'Cube' is already taken it becomes 'Cube#1'

      if 'Cube#1' is already taken it becomes 'Cube#2' etc...

      Sketchup.active_model.definitions.add(name)

      TIG

      1 Reply Last reply Reply Quote 0
      • M Offline
        MCorgano
        last edited by 21 Oct 2013, 15:03

        @tig said:

        name="Cube" name=Sketchup.active_model.definitions.unique_name(name)

        if 'Cube' is already taken it becomes 'Cube#1'

        if 'Cube#1' is already taken it becomes 'Cube#2' etc...

        Sketchup.active_model.definitions.add(name)

        That solves a different question I had (lol) but not the one I'm asking here.
        Let's take point [1, 2, 3]. I want to add an instance of cCube at that point
        Sketchup.active_model.active_entities.add_instance(cCube, Geom::Transformation.new( [1, 2, 3] ))
        What I want to know, is how do I check that that instance of cCube does not already exist?
        How do I prevent creating duplicate instances of a component?
        If there is not a cCube at [1, 2, 3] then{ Sketchup.active_model.active_entities.add_instance(cCube, Geom::Transformation.new( [1, 2, 3] )) }

        1 Reply Last reply Reply Quote 0
        • T Offline
          TIG Moderator
          last edited by 21 Oct 2013, 16:31

          point=Geom;;Point3d.new(1,2,3
          )### or whatever 'point' you are testing for
          exists=false
          compo=Sketchup.active_model.definitions['Cube']
          compo.instances.each{|ins|
            if ins.transformation.origin==point
              exists=true
              break
            end
          }
          if exists
            puts 'That Cube exists already!'
          else
            ### do your stuff to add a new instance of compo at point
            Sketchup.active_model.active_entities.add_instance(cCube, Geom;;Transformation.new( [1, 2, 3] )
          end
          

          TIG

          1 Reply Last reply Reply Quote 0
          • M Offline
            MCorgano
            last edited by 21 Oct 2013, 16:57

            @tig said:

            point=Geom;;Point3d.new(1,2,3
            > )### or whatever 'point' you are testing for
            > exists=false
            > compo=Sketchup.active_model.definitions['Cube']
            > compo.instances.each{|ins|
            >   if ins.transformation.origin==point
            >     exists=true
            >     break
            >   end
            > }
            > if exists
            >   puts 'That Cube exists already!'
            > else
            >   ### do your stuff to add a new instance of compo at point
            >   Sketchup.active_model.active_entities.add_instance(cCube, Geom;;Transformation.new( [1, 2, 3] )
            > end
            

            How will this effect performance if I had hundreds of them? I figured something like this must be possible, but as the number of cubes grows, this would become less efficient. I'm talking on the scale of ~2000 cubes. Is this method efficient enough for the speed to be negligible?

            1 Reply Last reply Reply Quote 0
            • T Offline
              TIG Moderator
              last edited by 21 Oct 2013, 17:11

              At best it will find a match immediately 1/2000, at worst at go 2000/2000, on average at go 1000/2000.
              You can but test it and see...
              If you are adding all cube-instances in the same SketchUp session then why not make a @points array to push [ <<] all of the points you will use during the placements - these need to be as arrays so they are 'comparable' [use point.to_a] - points are comparable as == but include? is faster [most probably] with array comparisons ?
              Then... instead of finding all instances and comparing each 'instance.origin' to 'point' use:
              @points.include?(point.to_a)
              If the tested point is in the current list then it's taken and you skip the operation...
              Of course this doesn't work when instances have been erased or across SketchUp sessions 😕

              TIG

              1 Reply Last reply Reply Quote 0
              • 1 / 1
              1 / 1
              • First post
                1/6
                Last post
              Buy SketchPlus
              Buy SUbD
              Buy WrapR
              Buy eBook
              Buy Modelur
              Buy Vertex Tools
              Buy SketchCuisine
              Buy FormFonts

              Advertisement