Belle-Ve Bricks

Tailored Creations,
Unforgettable Impressions.

LEGO Bricklink Studio
LEGO Bricklink Studio

LEGO Digital Designer (LDD) Replaced by Bricklink Studio

Trusted by Over 392 Distinctive Clients
Custom model
Bring Your Idea to Life

The LEGO® Group has announced today that Bricklink Studio will be replacing LEGO® Digital Designer (LDD) as the official LEGO® digital design software. All LDD users are being encouraged to take their LDD files and import them into Studio as soon as possible, the LEGO® Digital Designer website will be taken offline on 31st January and the LDD software will no longer be available to download.

If you have the LDD software installed it will continue to work but do not expect any further updates, bug fixes, or support after 31st January so to void the sooner you migrate to Studio the better really. Not sure how to do it? Don’t worry it’s really simple to do, just open studio, go to file –> import –> import model and select your design file to import, Studio will handle the rest for you.

Any of you that have been on Belle-Ve Bricks before might have seen that we are very focused on LEGO® MOCs and I have to say that I think the LEGO® Group have made the right choice, especially bearing in mind that they acquired Bricklink on the 26th November 2019.

It has to be said that Studio is the go-to software for the vast majority of LEGO® MOC digital designers, I haven’t many myself but from what I have done I can say that the software is amazing, how it integrates into the ever-growing LEGO® database that Bricklink and even small details like highlighting parts that are expensive to buy so if you wanted to physically make your LEGO® MOC you can avoid paying a fortune for the bricks which is great!

I think it’s clear that LEGO® has big plans for Bricklink, with this move and the Bricklink 2021 designer program it’s going to be interesting what they come up with next!

The LEGO® Digital Designer website will shut down at the end of January. BrickLink Studio welcomes LEGO® Digital Designer users.

Billund, Denmark – January 12th, 2022: Today, the LEGO® Group announces that BrickLink Studio will replace LEGO® Digital Designer as the official virtual LEGO® building software going forward. The LEGO® Digital Designer (LDD) website will close on January 31st, after which time LDD will no longer be available for download. While downloaded versions of the LDD application will continue to work, people are encouraged to download BrickLink Studio, import their LDD files, and use Studio for 3D LEGO® building files, and use Studio for 3D LEGO® building.

“Our initial vision for LEGO® Digital Designer back in 2002 was to make building on a computer accessible and fun for children – to play with and share their creations online,” said Ronny Scherer, producer of the first-generation LEGO® Digital Designer. “I am so impressed with how the community of creators has evolved. Builders—enthusiasts and professionals alike—have used LDD in wonderful and unexpected ways. They took ownership and created the most amazing virtual LEGO® models and have grown the virtual building ecosystem. I am so proud of the team behind LDD and the greater virtual building community. They have truly inspired a generation of digital LEGO® creators.”

Tormod Askildsen, head of AFOL Engagement for the LEGO® Group, has been intrigued by digital building since using LDD to bring alternate model instructions for the LEGO® Factory Hobby Train set to market in 2007. “When the LEGO® Group acquired BrickLink,” Askildsen said, “one of the things that impressed and inspired us was their purposeful development of the Studio software. For a digital building to be not only a nice feature for some but a meaningful part of many people’s LEGO® building experience, it must be an integrated and useful part of both the design, the building, and the sharing experience. The talented team behind Studio sees this clearly and continues relentlessly to further innovate and improve the Studio experience”.

In 2014, then-independent BrickLink created the BrickLink Studio software as a free virtual LEGO® building tool. Studio was built on the industry-standard Unity gaming engine and is designed to integrate with the BrickLink Marketplace. Its .io file format is based on the fan community-developed LDraw standard with part connectivity data added to give digital bricks clutch power. Users can import LEGO® models built in LDD, LDraw, and other popular tools. Studio includes useful features like model stability checking, built-in photo-realistic rendering, and an integrated instructions maker.

“Studio was created because, at BrickLink, there is a great belief in how digital LEGO® building could unlock the true potential of everyone’s creativity by lowering the entry barriers and motivating people to inspire each other,” says Casper Thingholm, Head of BrickLink. “Going forward, the Studio team will continue to focus on making a digital building as intuitive as a physical building, and encourage even more builders to share their creations to inspire and help each other.”

<div class="badge-base LI-profile-badge" data-locale="en_US" data-size="large" data-theme="dark" data-type="HORIZONTAL" data-vanity="ferdi-vol" data-version="v1"><a class="badge-base__link LI-simple-link" href="https://www.linkedin.com/in/%E2%9C%85-ferdi-vol-corporate-gifts/?trk=profile-badge"></a></div>
/* Auto generated, hash = 5dceu9kevqjdyuy2uw1atqrsu */
//TODO: Break this file down so that we can actually unit test it.
(function(window) {
  /**
  * Renders all unrendred LinkedIn Badges on the page
  */
  window.LIRenderAll = function () {
    var CALLBACK_NAME     = 'LIBadgeCallback', //Must match callback on helpers.js
        BADGE_NAMES       = '.LI-profile-badge, .LI-entity-badge',
        // TODO -- tracking param for other badge types
        TRACKING_PARAM    = 'profile-badge',
        responsesReceived = 0, //Keeps track of number of responses recieved for proper cleanup when finished
        expectedResponses = 0, //Keeps track of number of responses to expect
        scripts           = [ ], //Keeps track of scripts added for proper cleanup when finished
        childScripts      = {}, //Keeps track of child scripts to render
        badges            = Array.prototype.slice.call(document.querySelectorAll(BADGE_NAMES));

    var i, len, badge, rendered;
    for (i = 0, len = badges.length;  i < len; i++) {
      badge    = badges[i];
      rendered =  badge.getAttribute('data-rendered');
      if (!rendered) {
        expectedResponses++;
        badge.setAttribute('data-rendered', true);
        renderBadge(badge);
      }
    }

    function isCNDomain() {
      if (typeof window !== "undefined") {
        var hostName = window.location && window.location.hostname ||  '';
        return (/linkedin(-ei)?.cn$/).test(hostName);
      }

      return false;
    }

    function generateUrl(isEI) {
      var domainPrefix = isEI ? 'https://badges.linkedin-ei' : 'https://badges.linkedin';
      if (isCNDomain()) {
        return domainPrefix + ".cn/";
      }

      return domainPrefix + ".com/";
    }

    function getBadgeKeyQueryParams(badge) {
      return Array.prototype.slice.call(badge.attributes).filter(function (attr) {
        return attr.name.lastIndexOf('data-key-', 0) !== -1;
      }).map(function (attr) {
        // Most browsers automatically lowercase the attribute name when its being read
        // We are calling lowercase on it again to ensure consistency for any browsers that are lagging behind.
        return encodeURIComponent(attr.name.replace('data-', '').toLowerCase()) + '=' + encodeURIComponent(attr.value);
      });
    }

    /*
    * Renders a single badge on the page
    * @param badge: div element of badge to render
    */
    function renderBadge(badge) {
      var size       = badge.getAttribute('data-size'),
          locale     = badge.getAttribute('data-locale'),
          type       = badge.getAttribute('data-type'),
          theme      = badge.getAttribute('data-theme'),
          vanity     = badge.getAttribute('data-vanity'),
          version    = badge.getAttribute('data-version'),
          isEI       = badge.hasAttribute('data-ei'),
          entity     = badge.getAttribute('data-entity'),
          isCreatePage = badge.hasAttribute('data-iscreate'),
          uid        = Math.round(1000000 * Math.random()),
          baseUrl = generateUrl(isEI),
          queryParams = [
            'locale=' + encodeURIComponent(locale),
            'badgetype=' + encodeURIComponent(type),
            'badgetheme=' + encodeURIComponent(theme),
            'uid=' + encodeURIComponent(uid),
            'version=' + encodeURIComponent(version)
          ],
          url;

      if (version === 'v2') {
        baseUrl += 'view';
        queryParams.push('badgesize=' + encodeURIComponent(size));
        queryParams.push('entity=' + encodeURIComponent(entity));
        queryParams = queryParams.concat(getBadgeKeyQueryParams(badge));
      } else {
        baseUrl += 'profile';
        queryParams.push('maxsize=' + encodeURIComponent(size));
        queryParams.push('trk=' + encodeURIComponent(TRACKING_PARAM));
        queryParams.push('vanityname=' + encodeURIComponent(vanity));
      }

      if (isCreatePage) {
        queryParams.push('fromCreate=true');
      }

      url = baseUrl + '?' + queryParams.join('&');
      badge.setAttribute('data-uid' , uid);
      jsonp(url); //Calls responseHandler when done
    }

    /**
    * Handles a response from the server. Finds badge matching badgeUid and inserts badgeHtml there
    * @param badgeHtml: String representing contents of the badge
    * @param badgeUid: UID of the badge to target
    **/
    function responseHandler(badgeHtml, badgeUid) {
      responsesReceived ++;

      var i, badge, uid, isCreate;
      var defaultWidth = 330 // max possible width
      var defaultHeight = 300 // max possible height

      for (i = 0, len = badges.length; i < len; i++) {
        badge = badges[i];
        // isCreate needed to prevent reloading artdeco script tag
        isCreate = badge.getAttribute('data-iscreate');
        uid   = parseInt(badge.getAttribute('data-uid'), 10);
        if (uid === badgeUid) {
          var badgeMarkup = `<body>${badgeHtml}</body>`
          var iframe = document.createElement('iframe');
          iframe.onload = function() {
            var iframeBody = iframe.contentWindow.document.body;
            // 5 px buffer to avoid the badge border being cut off.
            iframe.setAttribute('height', (iframeBody.scrollHeight || defaultHeight) + 5);
            iframe.setAttribute('width', (iframeBody.scrollWidth || defaultWidth) + 5);
          };
          iframe.setAttribute('frameBorder', '0');
          iframe.style.display = 'block';
          badge.appendChild(iframe);
          iframe.contentWindow.document.open();
          iframe.contentWindow.document.write(badgeMarkup);
          iframe.contentWindow.document.close();
          replaceScriptTags(badge, isCreate);
        }
      }
      tryClean();
    }

  // These functions are needed because badge markup is added via innerHtml property which does not run script tags
  function replaceScriptTags(node, isCreate) {
    if (shouldReplaceNode(node, isCreate)) {
      node.parentNode.replaceChild(cloneScriptNode(node), node);
      childScripts[node.src] = true;
    } else {
      var i = 0,
          children = node.childNodes;
      while (i < children.length) {
        replaceScriptTags(children[i++], isCreate);
      }
    }
    return node;
  }

  function shouldReplaceNode(node, isCreate) {
    return isScriptNode(node) && !childScripts[node.src] && (!isCreate || (isCreate && !node.getAttribute('data-isartdeco')));
  }

  function isScriptNode(node) {
    return node.tagName === 'SCRIPT';
  }

  function cloneScriptNode(node){
    var script  = document.createElement("script");
    for( var i = node.attributes.length-1; i >= 0; i-- ) {
      script.setAttribute( node.attributes[i].name, node.attributes[i].value );
    }
    return script;
  }

    // Gets all incoming responses
    window[CALLBACK_NAME] = responseHandler;

    /**
    * Tries to clean added tags
    **/
    function tryClean() {
      //Clean up after all requests are done..
      //Accounts for people including script more than once
      var done = (responsesReceived >= expectedResponses && expectedResponses > 0) || responsesReceived >= badges.length;
      if (done) {
        delete window[CALLBACK_NAME];

        // remove all script tags
        scripts.map(function(script){
          document.body.removeChild(script);
        });

      }
    }

    /*
    * Makes Jsonp request, responses handles by CALLBACK_NAME
    * @param url String: url of server to make request to
    */
    function jsonp(url) {
      var script = document.createElement('script');
      script.src = url;
      scripts.push(script);
      document.body.appendChild(script);
    }
  };

  if (document.readyState === 'complete') {
    window.LIRenderAll();
  } else {
    window.addEventListener('load', window.LIRenderAll, false);
  }

})(window);
Popular Posts