Please be aware there is a known issue with images on the Community. We are working to resolve this issue as quickly as possible. We apologize for the inconvenience. If you need urgent help in the meantime, please reach out to technical support or your Threekit representative.

Custom script: Reading a string and changing arrangement of objects

Comments

3 comments

  • andrewq
    andrewq

    Hi,

    Apologies for the code dump. I’m trying to align letter-shaped chain links into a circle. This script works great for alignment (it counts the letters in ‘BraceletString’) but it doesn’t respond to configuration changes made by the website. Do I have to do some sort of async function? I followed the example in the docs as a template but I think there might be something I’m missing.

    //Get api data
    const config = api.configurator.getConfiguration();
    
    const pi = 3.14159265359;
    //get string info
    const stringInput = config[’BraceletString’]
    const num = stringInput.length
    
    if(num > 20){
       num = 20;
    }
    
    //per-link rotational offset in degrees
    const rot = 360/num;
    //radius of the arranged circle
    const spc = ((num * 1) / pi) * .5
    
    function circleAlign(){
    
       //for each link (named letter1, letter2, ... letterN)
       for (let i = 1; i < 21; i++) {
          //move out to radius distance
          api.scene.set({
                from: api.instanceId,
                name: ’letter’ + i.toString(),
                plug: ’Transform’,
                property: ’translation’,
             }, { 
                x: 0, 
                y : 0,
                z: 1 * spc
             }
          );
    
          //set pivot point to (0,0,0)
          api.scene.set({
                from: api.instanceId,
                name: ’letter’ + i.toString(),
                plug: ’Transform’,
                property: ’localRotatePivot’,
             }, { 
                x: 0, 
                y : 0,
                z: -1 * spc
             }
          );
    
          //rotate by specified offset
          api.scene.set({
                from: api.instanceId,
                name: ’letter’ + i.toString(),
                plug: ’Transform’,
                property: ’rotation’,
             }, { 
                x: 0,
                y : rot * i, 
                z: 0
             }
          );
       }
    }
    
    function straightAlign(){
    
       //for each link (named letter1, letter2, ... letterN)
       for (let i = 1; i < num + 1; i++) {
    
       //set pivot point to (0,0,0)
          api.scene.set({
             from: api.instanceId,
             name: ’letter’ + i.toString(),
             plug: ’Transform’,
             property: ’localRotatePivot’,
          }, { 
             x: 0, 
             y: 0,
             z: 0
             }
          );
          //rotate by specified offset
          api.scene.set({
             from: api.instanceId,
             name: ’letter’ + i.toString(),
             plug: ’Transform’,
             property: ’rotation’,
          }, { 
             x: 0,
             y: 0, 
             z: 0
          }
          );
       
          //move out to radius distance
          api.scene.set({
                from: api.instanceId,
                name: ’letter’ + i.toString(),
                plug: ’Transform’,
                property: ’translation’,
             }, { 
                x: i - (num * 0.5),
                y: 0,
                z: 0
             }
          );
       }
    }
    
    //TODO: make these inivisible instead of moving them out of frame
    function hideUnused(){
    
       if(num >= 20){
          return;
       }
    
       for (let i = num + 1; i < 21; i++) {
          api.scene.set({
             from: api.instanceId,
             name: ’letter’ + i.toString(),
             plug: ’Transform’,
             property: ’translation’,
          }, { 
             x: 100,
             y: 100,
             z: 100
          }
       );
       }
    }
    
    function setCamera(camName){
       // id = api.scene.findNode({
       //    from:api.instanceId,
       //    name: camName,
       // });
    
       // api.setActiveCamera(id)
       config[’CurrentCam’] = camName
       api.configurator.setConfiguration(config)
    }
    
    if(num > 8){
       circleAlign()
       setCamera(’OrbitCam’)
    }else{
       straightAlign()
       setCamera(’FixedCam’)
    }
    
    hideUnused()
    

    For reference, this is the website test:

     

    The string asset should change to ‘isNotShowingUpInTheConfig’ but instead the string stays blank

    0
  • Ian  Drews
    Ian Drews

    Hi Andrew,

    I haven’t looked through your script extensively but I believe the issue your having is that in your embed ‘Attribute Name’ should be replaced with the name of the part reference attribute you’re using.

    hope this helps, Ian

    0
  • andrewq
    andrewq

    Well this is embarrassing! I expected it to be a structural problem and it was something pretty basic. It works now. Thanks for the help.

    initialConfiguration: {
             ’BraceletString’: ’andrewq’
              },
    
    0

Please sign in to leave a comment.

Powered by Zendesk