Cobblestones have been used for paving since ancient times. Roman-era cobbled streets date back to the 3rd and 4th centuries, and earlier examples have been found in what was ancient Greece and Mesopotamia. Originally smooth rounded stones gathered from river beds or glacial deposits were used as cobblestones. As safer, smoother streets were desired, quarried stones with much flatter surface profiles and more regular shapes were substituted. Now, this reclaimed stone—reclaimed cobblestone—is sought after, to be used mainly as pavers.
Local stone is generally preferred for paving applications so we see cobblestones made of granite, porphyry, basalt, sandstone, and limestone depending on regional availability. The most durable of these stone types are igneous—the basalts, granites, and porphyry, but hard limestones and sandstones are also common.
Properly maintained cobblestone roadways can last centuries. When these old roads are upgraded to modern construction standards, their cobblestones can be reclaimed for use in modern applications. These weathered and worn cobbles have great aesthetic characteristics highlighted by worn surfaces, weathered patinas, and unique colors and shapes. Some also come with great pedigrees, having been harvested from well-known ancient roadways.
Reclaimed cobblestones are now used extensively as paving stone for driveways, driveway aprons, walkways, decorative borders, edging, and accent stones. Where environmental factors are a consideration permeable installations can also be achieved using reclaimed cobblestones compounding the benefits of this sustainable product. Cobblestones are also strong enough to be used as building stone or veneer although these are less common applications.
Finding the right natural stone for your project has never been this easy.
START YOUR STONE SEARCH
GRANITE COBBLESTONES
Granite is used as a paving stone almost everywhere. Cobblestones are the most common form in Europe and North America. Although mostly gray, granite cobblestone colors vary widely by region as does the grain of each of the stones. The grain of reclaimed cobblestones are often less visible through weathered patinas but the colors are hard to disguise. Unlike modern or newly quarried cobblestones, colors vary in every lot of reclaimed cobbles and the effect of this variation is beautiful when artfully installed.
In New England, most of our cobblestones are granite in shades of gray. But in the Chicago area you can find purples to grays, and in stone from Europe, for example, our Swedish granite cobblestones, display reds, yellows, and peach tones. The Swedish cobbles are also available with the tops sawn flat, making them perfect for modern style installations.
Domestic granite cobblestones also come in many different sizes and shapes. We sort the sizes by super jumbo, jumbo, road pavers, and medium. The shapes vary slightly by region with the oldest New England cobbles the least consistent.
PORPHYRY COBBLESTONES
Porphyry is another very popular paving stone. In Europe, it’s used as cobblestone and is prized for its durability and color variations. Porphyry cobblestones often have square surfaces. Very small cobblestone cubes are also common and used in creative patterns. The fan pattern, for example, is very popular and widely seen. Porphyry colors vary, as shown below.
BASALT COBBLESTONES
Basalt is another igneous stone (like granite and porphyry) used for paving. It’s generally gray to black in color, although there are some gray-green examples. Some basalt also contains voids, or holes, that formed during the lava’s cooling process. The basalts used for cobblestones are generally those without voids, although there are exceptions.
Black basalt cobbles are used extensively as the local cobblestone in the Azores, where they are combined with white limestone cobbles to create unique designs and borders. Basalt makes beautiful cobblestones that are very durable and desirable where dark stone is specified.
Limestone Cobblestones
Limestone, a sedimentary stone, is available all over the world and is often used as a paving stone. A common European cobblestone is Belgian bluestone which is actually a limestone. Reclaimed Belgian bluestone cobblestones are plentiful in Europe, where they are reclaimed from modern roadway reconstruction.
Belgian bluestone is a very hard limestone and is freeze/thaw resistant. This freeze/thaw resistance is very important when limestone exterior cobblestones are specified. Softer limestones can absorb moisture which fractures the surface when frozen but these can be used in exterior applications in warmer climates or indoors. Limestone comes in a wide range of colors and often contains small fossils of the shells that formed it when they were added to the sediment.
SANDSTONE Cobblestones
Sandstone cobblestones are prized for their rich earth tone colors. One example is our reclaimed European sandstone cobblestones, which are shades of beige, okra, and plum. The striking mix of colors in sandstone cobblestones makes for unique installations used either alone or as accents with other stone. Sandstone is also naturally skid-resistant.
Creative Cobblestone Applications
Product Highlights
MATERIAL HIGHLIGHTS
Try Our Cobblestone Visualizer
ALL BLOG POSTS
LEARN MORE ABOUT RECLAIMED STONE
talk to an expert
'; } }, { "sTitle": "SDT###", "mData": "sdm_id", "sWidth": "15%", "bSortable": true, }, { "sTitle": "Date/time", "mData": "filetime", "sWidth": "25%", "bSortable": true, }, { "sTitle": "", "mData": null, "sWidth": "10%", "bSortable": false, "mRender": function(data, type, full) { return '
'; } } ], 'autoWidth': false, "bDestroy": true } ) } }); $("#tblJsonFiles").on('click', 'tbody .delete-json-file', function(e) { document.getElementById('originFileName').value = $(this).attr('id'); document.getElementById('rowIndex').value = $(this).closest('tr').index(); elementorProFrontend.modules.popup.showPopup({id: parseInt(58808)}); /* Close this popup */ elementorProFrontend.modules.popup.closePopup({}, e); }); $("#tblJsonFiles").on('click', 'tbody .json-file', function(e) { const fileName = e.target.innerHTML; console.log("click SDT json file aaaa", e.target.innerHTML, $(this).attr('id'), e.target); const pathJsonFile = $(this).attr('id'); console.log("pathJsonFile", pathJsonFile); $.get(pathJsonFile).success(function(data){ let ugly = JSON.stringify(data[0].data); let obj = JSON.parse(ugly); let pretty = JSON.stringify(obj, undefined, 4); document.getElementById('paramData').value = pretty; document.getElementById('originFileName').value = e.target.innerHTML; let artx = document.getElementById("artx").contentWindow; artx.postMessage({type:"loadParams", data: JSON.parse(pretty)},"*"); artx.postMessage("getTextureData","*"); $('#download-json').prop('disabled', false); $('#download-texture').prop('disabled', false); $('#download-json-texture').prop('disabled', false); $('#get-json').prop('disabled', false); $('#draw-json').prop('disabled', false); elementorProFrontend.modules.popup.closePopup({}, e); }); }) }); })(jQuery)
VISUALIZER PROTOTYPE
'; scenes += '
'; if (index % 3 === 2) { scenes += '
'; } if ((index % 3 === 0 || index % 3 === 1) && sdSceneResult.length - 1 === index) { scenes += '
'; } } } scenes += "
"; $("#scenes").append(scenes); }, error: function(jqXHR, textStatus, errorThrown) { console.log(jqXHR.status); } }) // show Scene popup elementorProFrontend.modules.popup.showPopup({id: parseInt(59789)}); }) //material $('#change-building-material').on('click', function(event) { console.log("change-building-material"); const sdam_id_value = document.getElementById("sdam_id").value !== "" ? document.getElementById("sdam_id").value : 729; $.ajax({ type:"GET", url: URL_API_SD_MATERIAL_IMAGES_BY_COLLECTION_ID, contentType: 'application/json', success: function(sdMaterialResult) { // console.log("sdMaterialResult", sdMaterialResult); // Append Material data appendHtmlMaterialData(sdMaterialResult); // Add reorder image dropdown selection const reOrderImageEl = $("#reorder-image"); if (reOrderImageEl.length > 0) { reOrderImageEl.empty().append( `
Sort:
` ); } }, error: function(jqXHR, textStatus, errorThrown) { console.log(jqXHR.status); } }) // show material popup elementorProFrontend.modules.popup.showPopup({id: parseInt(61125)}); }) //pattern $('#change-building-design-pattern').on('click', function(event) { const sdam_id_value = document.getElementById("sdam_id").value !== "" ? document.getElementById("sdam_id").value : 729; const pattern_id_value = document.getElementById("pattern_id").value !== "" ? document.getElementById("pattern_id").value : ''; const tile_width_value = document.getElementById("tile_width").value !== "" ? document.getElementById("tile_width").value : ''; const visualizer_type = document.getElementById("sc_visualizer_type").value console.log("change-building-pattern-texture", URL_API_GET_MATERIAL_BY_TEXTURE_MATERIAL_ID + "?materialId=" + sdam_id_value + "&visualizer_type=" + visualizer_type); $.ajax({ type:"GET", url: URL_API_GET_MATERIAL_BY_TEXTURE_MATERIAL_ID + "?materialId=" + sdam_id_value + "&visualizer_type=" + visualizer_type, contentType: 'application/json', success: function(sdMaterialTextureResult) { // console.log("sdMaterialTextureResult", sdMaterialTextureResult); let pattern = '
'; if (sdMaterialTextureResult.length > 0) { console.log("sdMaterialTextureResult.length", sdMaterialTextureResult.length); for (let index = 0; index < sdMaterialTextureResult.length; index++) { const element = sdMaterialTextureResult[index]; let borderTyle = ""; let imageStyle = "position: absolute;height: 35px;right: 27px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px; bottom: 7px;"; if (parseInt(sdam_id_value) === parseInt(element.sdam_id) && parseInt(pattern_id_value) === parseInt(element.patternId) && parseInt(tile_width_value) === parseInt(element.tile_width)) { borderTyle = "outline: solid #000 6px"; imageStyle = "position: absolute;height: 35px;right: 22px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px; bottom: 4px;"; } if (index % 3 === 0) { pattern += '
'; } pattern += '
'; const image_filename = element.image_location_300 || element.image_location_full; pattern += '
'; pattern += '
' +element.sd_design_pattern_id + '
'; pattern += '
'; pattern += '
'; if (index % 3 === 2) { pattern += '
'; } if ((index % 3 === 0 || index % 3 === 1) && sdMaterialTextureResult.length - 1 === index) { pattern += '
'; } } } pattern += "
"; $("#material_pattern_textures").append(pattern); }, error: function(jqXHR, textStatus, errorThrown) { console.log(jqXHR.status); } }) // show material popup elementorProFrontend.modules.popup.showPopup({id: parseInt(61501)}); }) //joint Style $('#change-joint-material').on('click', function(event) { const sdajm_id_value = document.getElementById("jointID").value; $.ajax({ type:"GET", url: URL_API_GET_SD_JOINT_MATERIALS + "?id=" + sdajm_id_value, contentType: 'application/json', success: function(sdJointMaterialsResult) { let jointMaterial = '
'; if (sdJointMaterialsResult.length > 0) { for (let index = 0; index < sdJointMaterialsResult.length; index++) { // console.log("index 11111111111", index, index % 3); const element = sdJointMaterialsResult[index]; const icon_filename = element.icon_filename_300 || element.icon_filename; const borderTyle = parseInt(sdajm_id_value) === parseInt(element.sdajm_id) ? "outline: solid #000 6px" : ""; if (index % 3 === 0) { jointMaterial += '
'; } jointMaterial += '
'; jointMaterial += '
'; jointMaterial += '
' + element.name + '
'; jointMaterial += '
'; if (index % 3 === 2) { jointMaterial += '
'; } if ((index % 3 === 0 || index % 3 === 1) && sdJointMaterialsResult.length - 1 === index) { jointMaterial += '
'; } } } jointMaterial += "
"; $("#joint-materials").append(jointMaterial); }, error: function(jqXHR, textStatus, errorThrown) { console.log(jqXHR.status); } }) // show Joint Materials popup elementorProFrontend.modules.popup.showPopup({id: parseInt(67077)}); }) // Download Image $('#download-texture').on('click', function(event) { if (document.getElementById("isLoaded").value === "true") { const userInfo = getLocalStorage("user_info"); console.log("download-texture clicked", getCookie("email")); if (userInfo) { let artx = document.getElementById("artx").contentWindow; artx.postMessage("getTextureData","*"); artx.postMessage({ type: "getTexture", data: { size: 2000, quality: 0.6, format: "jpg" } },"*"); } else { // login autoDownloadConfirmation(true); elementorProFrontend.modules.popup.showPopup({id: parseInt(22870)}); } } }) // share-texture $('#share-texture').on('click', function(event) { if (document.getElementById("isLoaded").value === "true") { const userInfo = getLocalStorage("user_info"); console.log("share-texture clicked", getCookie("email")); if (userInfo) { // share elementorProFrontend.modules.popup.showPopup({id: parseInt(67228)}); } else { // login autoDownloadConfirmation(true, true, 2); elementorProFrontend.modules.popup.showPopup({id: parseInt(22870)}); } } }) // Sorting function $(document).on('change', '#sortingDropdown', function(e) { // Warm: image_warm | Cool: image_cool | Dark/Light: gs_average if (sdMaterialResultObj && sdMaterialResultObj.length > 0) { const selectedSorting = $(this).val() ? +$(this).val() : 0; let sortingObj = sdMaterialResultObj.sort((a, b) => { switch (selectedSorting) { // Default: Light -> Dark => gs_average value ASCENDING | 1 case 1: return b.gs_average - a.gs_average; // Dark -> Light => gs_average value DESCENDING | 2 case 2: return a.gs_average - b.gs_average; // Warm -> Cool => Warm value DESCENDING | 3 case 3: return b.image_warm - a.image_warm; // Cool -> Warm => Cool value DESCENDING | 4 case 4: return b.image_cool - a.image_cool; default: return 0; } }); appendHtmlMaterialData(sortingObj); } }) function appendHtmlMaterialData(sdMaterialResult) { let materials = '
'; if (sdMaterialResult && sdMaterialResult.length > 0) { sdMaterialResultObj = sdMaterialResult; // Add global object for Material Result data const sdam_id_value = document.getElementById("sdam_id") && document.getElementById("sdam_id").value !== "" ? document.getElementById("sdam_id").value : 729; // console.log("sdMaterialResult.length", sdMaterialResult.length); for (let index = 0; index < sdMaterialResult.length; index++) { const element = sdMaterialResult[index]; let borderTyle = ""; let imageStyle = "position: absolute;height: 35px;right: 28px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px;bottom: 7px;"; if (parseInt(sdam_id_value) === parseInt(element.sdam_id)) { borderTyle = "outline: solid #000 6px"; imageStyle = "position: absolute;height: 35px;right: 22px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px;bottom: 4px;"; } if (index % 3 === 0) { materials += '
'; } materials += '
'; const image_filename = element.image_location_300 || element.image_location_full; materials += '
'; materials += '
' +element.sd_pm_type + element.sd_pm_number + '
'; materials += '
'; materials += '
' + element.sd_public_texture_name + '
'; materials += '
'; if (index % 3 === 2) { materials += '
'; } if ((index % 3 === 0 || index % 3 === 1) && sdMaterialResult.length - 1 === index) { materials += '
'; } } } materials += "
"; const materialsEL = $("#materials"); if (materialsEL && materialsEL.length > 0) { materialsEL.empty().append(materials); } } }); function getLocalStorage(cname) { return JSON.parse(localStorage.getItem(cname)); } function getCookie(name) { let nameEQ = name + "="; let ca = document.cookie.split(';'); for(let i=0;i < ca.length;i++) { let c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; } })(jQuery)
VISUALIZER PROTOTYPE
` ); } }, error: function(jqXHR, textStatus, errorThrown) { console.log(jqXHR.status); } }) // show material popup elementorProFrontend.modules.popup.showPopup({id: parseInt(61125)}); }) //pattern $('#change-building-design-pattern').on('click', function(event) { document.getElementById("popupOpen").value = 3; document.getElementById("displayCols").value = detectColsByDevice(); const sdam_id_value = document.getElementById("sdam_id").value !== "" ? document.getElementById("sdam_id").value : 729; const visualizer_type = document.getElementById("sc_visualizer_type").value // const pattern_id_value = document.getElementById("pattern_id").value !== "" ? document.getElementById("pattern_id").value : ''; // const tile_width_value = document.getElementById("tile_width").value !== "" ? document.getElementById("tile_width").value : ''; console.log("change-building-pattern-texture", URL_API_GET_MATERIAL_BY_TEXTURE_MATERIAL_ID + "?materialId=" + sdam_id_value + "&visualizer_type=" + visualizer_type); $.ajax({ type:"GET", url: URL_API_GET_MATERIAL_BY_TEXTURE_MATERIAL_ID + "?materialId=" + sdam_id_value + "&visualizer_type=" + visualizer_type, contentType: 'application/json', success: function(sdMaterialTextureResult) { console.log("sdMaterialTextureResult aaaaaaaaaaaaa", sdMaterialTextureResult); sdMaterialTextureResultObj = sdMaterialTextureResult; drawDesignPattern(sdMaterialTextureResult); // console.log("sdMaterialTextureResult", sdMaterialTextureResult); // let pattern = '
'; // if (sdMaterialTextureResult.length > 0) { // // console.log("sdMaterialTextureResult.length", sdMaterialTextureResult.length); // for (let index = 0; index < sdMaterialTextureResult.length; index++) { // const element = sdMaterialTextureResult[index]; // let borderTyle = ""; // let imageStyle = "position: absolute;height: 35px;right: 27px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px; bottom: 7px;"; // if (parseInt(sdam_id_value) === parseInt(element.sdam_id) && parseInt(pattern_id_value) === parseInt(element.patternId) && parseInt(tile_width_value) === parseInt(element.tile_width)) { // borderTyle = "outline: solid #000 6px"; // imageStyle = "position: absolute;height: 35px;right: 22px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px; bottom: 4px;"; // } // if (index % 3 === 0) { // pattern += '
'; // } // pattern += '
'; // const image_filename = element.image_location_300 || element.image_location_full; // pattern += '
'; // pattern += '
' +element.sd_design_pattern_id + '
'; // pattern += '
'; // pattern += '
'; // if (index % 3 === 2) { // pattern += '
'; // } // if ((index % 3 === 0 || index % 3 === 1) && sdMaterialTextureResult.length - 1 === index) { // pattern += '
'; // } // } // } // pattern += "
"; // $("#material_pattern_textures").append(pattern); }, error: function(jqXHR, textStatus, errorThrown) { console.log(jqXHR.status); } }) // show material popup elementorProFrontend.modules.popup.showPopup({id: parseInt(61501)}); }) //joint Style $('#change-joint-material').on('click', function(event) { document.getElementById("popupOpen").value = 4; document.getElementById("displayCols").value = detectColsByDevice(); const sdajm_id_value = document.getElementById("jointID").value; $.ajax({ type:"GET", url: URL_API_GET_SD_JOINT_MATERIALS + "?id=" + sdajm_id_value, contentType: 'application/json', success: function(sdJointMaterialsResult) { sdJointMaterialsResultObj = sdJointMaterialsResult; drawJointMaterials(sdJointMaterialsResult); // let jointMaterial = '
'; // if (sdJointMaterialsResult.length > 0) { // for (let index = 0; index < sdJointMaterialsResult.length; index++) { // // console.log("index 11111111111", index, index % 3); // const element = sdJointMaterialsResult[index]; // const icon_filename = element.icon_filename_300 || element.icon_filename; // const borderTyle = parseInt(sdajm_id_value) === parseInt(element.sdajm_id) ? "outline: solid #000 6px" : ""; // if (index % 3 === 0) { // jointMaterial += '
'; // } // jointMaterial += '
'; // jointMaterial += '
'; // jointMaterial += '
' + element.name + '
'; // jointMaterial += '
'; // if (index % 3 === 2) { // jointMaterial += '
'; // } // if ((index % 3 === 0 || index % 3 === 1) && sdJointMaterialsResult.length - 1 === index) { // jointMaterial += '
'; // } // } // } // jointMaterial += "
"; // $("#joint-materials").append(jointMaterial); }, error: function(jqXHR, textStatus, errorThrown) { console.log(jqXHR.status); } }) // show Joint Materials popup elementorProFrontend.modules.popup.showPopup({id: parseInt(67077)}); }) // Download Image $('#download-texture').on('click', function(event) { if (document.getElementById("isLoaded").value === "true") { const userInfo = getLocalStorage("user_info"); console.log("download-texture clicked", getCookie("email")); if (userInfo) { let artx = document.getElementById("artx").contentWindow; artx.postMessage("getTextureData","*"); artx.postMessage({ type: "getTexture", data: { size: 2000, quality: 0.6, format: "jpg" } },"*"); } else { // login autoDownloadConfirmation(true, true, '1'); elementorProFrontend.modules.popup.showPopup({id: parseInt(22870)}); } } }) // share-texture $('#share-texture').on('click', function(event) { // if (document.getElementById("isLoaded").value === "true") { // const userInfo = getLocalStorage("user_info"); // console.log("share-texture clicked", getCookie("email")); // if (userInfo) { // // share // elementorProFrontend.modules.popup.showPopup({id: parseInt(67228)}); // } else { // // login // autoDownloadConfirmation(true, true, '2'); // elementorProFrontend.modules.popup.showPopup({id: parseInt(22870)}); // } // } console.log("share-texture clicked"); elementorProFrontend.modules.popup.showPopup({id: parseInt(67228)}); }) // Sorting function $(document).on('change', '#sortingDropdown', function(e) { // Warm: image_warm | Cool: image_cool | Dark/Light: gs_average if (sdMaterialResultObj && sdMaterialResultObj.length > 0) { const selectedSorting = $(this).val() ? +$(this).val() : 0; let sortingObj = sdMaterialResultObj.sort((a, b) => { switch (selectedSorting) { // Default: Light -> Dark => gs_average value ASCENDING | 1 case 1: return b.gs_average - a.gs_average; // Dark -> Light => gs_average value DESCENDING | 2 case 2: return a.gs_average - b.gs_average; // Warm -> Cool => Warm value DESCENDING | 3 case 3: return b.image_warm - a.image_warm; // Cool -> Warm => Cool value DESCENDING | 4 case 4: return b.image_cool - a.image_cool; default: return 0; } }); appendHtmlMaterialData(sortingObj); } }) function drawScenes(sdSceneResult) { displayCols = document.getElementById("displayCols") ? document.getElementById("displayCols").value : 3; const scene_id_value = document.getElementById("scene_id") && document.getElementById("scene_id").value !== "" ? document.getElementById("scene_id").value : 8; let scenes = '
'; if (sdSceneResult && sdSceneResult.length > 0) { for (let index = 0; index < sdSceneResult.length; index++) { const element = sdSceneResult[index]; const borderTyle = parseInt(scene_id_value) === parseInt(element.sdas_id) ? "outline: solid #000 6px" : ""; if (index % displayCols === 0) { scenes += '
'; } scenes += '
'; const icon_filename = element.icon_filename_300 || element.icon_filename; scenes += '
'; scenes += '
'; if (index % displayCols === (displayCols-1)) { scenes += '
'; } if ((index % displayCols === 0 || index % displayCols === 1) && sdSceneResult.length - 1 === index) { scenes += '
'; } } } scenes += "
"; // $("#scenes").append(scenes); const scenesEL = $("#scenes"); if (scenesEL && scenesEL.length > 0) { scenesEL.empty().append(scenes); } } function appendHtmlMaterialData(sdMaterialResult) { displayCols = document.getElementById("displayCols") ? document.getElementById("displayCols").value : 3; let materials = '
'; if (sdMaterialResult && sdMaterialResult.length > 0) { sdMaterialResultObj = sdMaterialResult; // Add global object for Material Result data const sdam_id_value = document.getElementById("sdam_id") && document.getElementById("sdam_id").value !== "" ? document.getElementById("sdam_id").value : 729; // console.log("sdMaterialResult.length", sdMaterialResult.length); for (let index = 0; index < sdMaterialResult.length; index++) { const element = sdMaterialResult[index]; let borderTyle = ""; let imageStyle = "position: absolute;height: 35px;right: 28px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px;bottom: 7px;"; if (parseInt(sdam_id_value) === parseInt(element.sdam_id)) { borderTyle = "outline: solid #000 6px"; imageStyle = "position: absolute;height: 35px;right: 22px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px;bottom: 4px;"; } if (index % displayCols === 0) { materials += '
'; } materials += '
'; const image_filename = element.image_location_300 || element.image_location_full; materials += '
'; materials += '
' +element.sd_pm_type + element.sd_pm_number + '
'; materials += '
'; materials += '
' + element.sd_public_texture_name + '
'; materials += '
'; if (index % displayCols === (displayCols-1)) { materials += '
'; } if ((index % displayCols === 0 || index % displayCols === 1) && sdMaterialResult.length - 1 === index) { materials += '
'; } } } materials += "
"; const materialsEL = $("#materials"); if (materialsEL && materialsEL.length > 0) { materialsEL.empty().append(materials); } } function drawDesignPattern(sdMaterialTextureResult) { displayCols = document.getElementById("displayCols") ? document.getElementById("displayCols").value : 3; const sdam_id_value = document.getElementById("sdam_id").value !== "" ? document.getElementById("sdam_id").value : 729; const pattern_id_value = document.getElementById("pattern_id").value !== "" ? document.getElementById("pattern_id").value : ''; const tile_width_value = document.getElementById("tile_width").value !== "" ? document.getElementById("tile_width").value : ''; let pattern = '
'; if (sdMaterialTextureResult && sdMaterialTextureResult.length > 0) { console.log("sdMaterialTextureResult.length", sdMaterialTextureResult, sdMaterialTextureResult.length); for (let index = 0; index < sdMaterialTextureResult.length; index++) { const element = sdMaterialTextureResult[index]; let borderTyle = ""; let imageStyle = "position: absolute;height: 35px;right: 27px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px; bottom: 7px;"; if (parseInt(sdam_id_value) === parseInt(element.sdam_id) && parseInt(pattern_id_value) === parseInt(element.patternId) && parseInt(tile_width_value) === parseInt(element.tile_width)) { borderTyle = "outline: solid #000 6px"; imageStyle = "position: absolute;height: 35px;right: 22px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px; bottom: 4px;"; } if (index % displayCols === 0) { pattern += '
'; } pattern += '
'; const image_filename = element.image_location_300 || element.image_location_full; pattern += '
'; pattern += '
' +element.sd_design_pattern_id + '
'; pattern += '
'; pattern += '
'; if (index % displayCols === (displayCols-1)) { pattern += '
'; } if ((index % displayCols === 0 || index % displayCols === 1) && sdMaterialTextureResult.length - 1 === index) { pattern += '
'; } } } pattern += "
"; // $("#material_pattern_textures").append(pattern); const designPatternEL = $("#material_pattern_textures"); if (designPatternEL && designPatternEL.length > 0) { designPatternEL.empty().append(pattern); } } function drawJointMaterials(sdJointMaterialsResult) { displayCols = document.getElementById("displayCols") ? document.getElementById("displayCols").value : 3; const sdajm_id_value = document.getElementById("jointID").value; let jointMaterial = '
'; if (sdJointMaterialsResult && sdJointMaterialsResult.length > 0) { for (let index = 0; index < sdJointMaterialsResult.length; index++) { // console.log("index 11111111111", index, index % 3); const element = sdJointMaterialsResult[index]; const icon_filename = element.icon_filename_300 || element.icon_filename; const borderTyle = parseInt(sdajm_id_value) === parseInt(element.sdajm_id) ? "outline: solid #000 6px" : ""; if (index % displayCols === 0) { jointMaterial += '
'; } jointMaterial += '
'; jointMaterial += '
'; jointMaterial += '
' + element.name + '
'; jointMaterial += '
'; if (index % displayCols === (displayCols-1)) { jointMaterial += '
'; } if ((index % displayCols === 0 || index % displayCols === 1) && sdJointMaterialsResult.length - 1 === index) { jointMaterial += '
'; } } } jointMaterial += "
"; // $("#joint-materials").append(jointMaterial); const jointMaterialEL = $("#joint-materials"); if (jointMaterialEL && jointMaterialEL.length > 0) { jointMaterialEL.empty().append(jointMaterial); } } function detectColsByDevice() { let displayCols = 3; const device = getDevice(); console.log("popup detectColsByDevice=", device, document.getElementById("popupOpen").value); if (device === "tablet") { if (document.getElementById("popupOpen") && document.getElementById("popupOpen").value === '4'){ console.log("popup tablet doc 4"); displayCols = 4; } else { if (Math.abs(window.orientation) === 0) { console.log("popup tablet doc 2"); displayCols = 2; } else { console.log("popup tablet ngang 3"); displayCols = 3; } } } else if (device === "mobile") { if (document.getElementById("popupOpen") && document.getElementById("popupOpen").value === '4'){ console.log("popup mobile doc 2"); displayCols = 2; } else { if (Math.abs(window.orientation) === 0) { console.log("popup mobile doc"); displayCols = 1; } else { console.log("popup mobile ngang"); displayCols = 2; } } } console.log("popup", displayCols); return displayCols; } /* get Device */ function getDevice() { let width = Math.max(window.screen.width, window.innerWidth); let ua = window.navigator.userAgent.toLowerCase(); console.log("getDevice ua", width, ua); // let isTablet = // ua.indexOf("sm-t") > -1 // || ua.indexOf("ipad") > -1 // || (ua.indexOf("macintosh") > -1 && width >= 768 && width <= 1366) // || (ua.indexOf("android") > -1 && "ontouchend" in document); // let isPhone = // ua.indexOf("iphone") > -1 // || ua.indexOf("sm-g") > -1 // || (ua.indexOf("sm-n") > -1 && "ontouchend" in document); let isTablet = ua.indexOf("sm-t") > -1 || ua.indexOf("ipad") > -1 || (ua.indexOf("macintosh") > -1 && width >= 768 && width <= 1366) || (ua.indexOf("android") > -1 && width >= 519 && "ontouchend" in document); let isPhone = ua.indexOf("iphone") > -1 || ua.indexOf("sm-g") > -1 || (ua.indexOf("sm-n") > -1 && "ontouchend" in document) || ua.indexOf("android") > -1 && width < 519; if (isTablet && !isPhone) { // console.log("device is tablet"); return "tablet"; } else if (isPhone){ // console.log("device is mobile"); return "mobile"; } else { // console.log("device is desktop"); return "desktop"; } } function getLocalStorage(cname) { return JSON.parse(localStorage.getItem(cname)); } function getCookie(name) { let nameEQ = name + "="; let ca = document.cookie.split(';'); for(let i=0;i < ca.length;i++) { let c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; } }); })(jQuery)
VISUALIZER PROTOTYPE
'; scenes += '
'; if (index % 3 === 2) { scenes += '
'; } if ((index % 3 === 0 || index % 3 === 1) && sdSceneResult.length - 1 === index) { scenes += '
'; } } } scenes += "
"; $("#scenes").append(scenes); }, error: function(jqXHR, textStatus, errorThrown) { console.log(jqXHR.status); } }) // show Scene popup elementorProFrontend.modules.popup.showPopup({id: parseInt(59789)}); }) //material $('#change-building-material').on('click', function(event) { console.log("change-building-material"); const sdam_id_value = document.getElementById("sdam_id").value !== "" ? document.getElementById("sdam_id").value : 729; $.ajax({ type:"GET", url: URL_API_SD_MATERIAL_IMAGES_BY_COLLECTION_ID, contentType: 'application/json', success: function(sdMaterialResult) { // console.log("sdMaterialResult", sdMaterialResult); // Append Material data appendHtmlMaterialData(sdMaterialResult); // Add reorder image dropdown selection const reOrderImageEl = $("#reorder-image"); if (reOrderImageEl.length > 0) { reOrderImageEl.empty().append( `
Sort:
` ); } }, error: function(jqXHR, textStatus, errorThrown) { console.log(jqXHR.status); } }) // show material popup elementorProFrontend.modules.popup.showPopup({id: parseInt(61125)}); }) //pattern $('#change-building-design-pattern').on('click', function(event) { const sdam_id_value = document.getElementById("sdam_id").value !== "" ? document.getElementById("sdam_id").value : 729; const pattern_id_value = document.getElementById("pattern_id").value !== "" ? document.getElementById("pattern_id").value : ''; const tile_width_value = document.getElementById("tile_width").value !== "" ? document.getElementById("tile_width").value : ''; const visualizer_type = document.getElementById("sc_visualizer_type").value console.log("change-building-pattern-texture", URL_API_GET_MATERIAL_BY_TEXTURE_MATERIAL_ID + "?materialId=" + sdam_id_value + "&visualizer_type=" + visualizer_type); $.ajax({ type:"GET", url: URL_API_GET_MATERIAL_BY_TEXTURE_MATERIAL_ID + "?materialId=" + sdam_id_value + "&visualizer_type=" + visualizer_type, contentType: 'application/json', success: function(sdMaterialTextureResult) { // console.log("sdMaterialTextureResult", sdMaterialTextureResult); let pattern = '
'; if (sdMaterialTextureResult.length > 0) { // console.log("sdMaterialTextureResult.length", sdMaterialTextureResult.length); for (let index = 0; index < sdMaterialTextureResult.length; index++) { const element = sdMaterialTextureResult[index]; let borderTyle = ""; let imageStyle = "position: absolute;height: 35px;right: 27px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px; bottom: 7px;"; if (parseInt(sdam_id_value) === parseInt(element.sdam_id) && parseInt(pattern_id_value) === parseInt(element.patternId) && parseInt(tile_width_value) === parseInt(element.tile_width)) { borderTyle = "outline: solid #000 6px"; imageStyle = "position: absolute;height: 35px;right: 22px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px; bottom: 4px;"; } if (index % 3 === 0) { pattern += '
'; } pattern += '
'; const image_filename = element.image_location_300 || element.image_location_full; pattern += '
'; pattern += '
' +element.sd_design_pattern_id + '
'; pattern += '
'; pattern += '
'; if (index % 3 === 2) { pattern += '
'; } if ((index % 3 === 0 || index % 3 === 1) && sdMaterialTextureResult.length - 1 === index) { pattern += '
'; } } } pattern += "
"; $("#material_pattern_textures").append(pattern); }, error: function(jqXHR, textStatus, errorThrown) { console.log(jqXHR.status); } }) // show material popup elementorProFrontend.modules.popup.showPopup({id: parseInt(61501)}); }) // Download Image $('#download-texture').on('click', function(event) { if (document.getElementById("isLoaded").value === "true") { console.log("download-texture clicked"); let artx = document.getElementById("artx").contentWindow; artx.postMessage("getTextureData","*"); artx.postMessage({ type: "getTexture", data: { size: 2000, quality: 0.6, format: "jpg" } },"*"); } }) // Sorting function $(document).on('change', '#sortingDropdown', function(e) { // Warm: image_warm | Cool: image_cool | Dark/Light: gs_average if (sdMaterialResultObj && sdMaterialResultObj.length > 0) { const selectedSorting = $(this).val() ? +$(this).val() : 0; let sortingObj = sdMaterialResultObj.sort((a, b) => { switch (selectedSorting) { // Default: Light -> Dark => gs_average value ASCENDING | 1 case 1: return b.gs_average - a.gs_average; // Dark -> Light => gs_average value DESCENDING | 2 case 2: return a.gs_average - b.gs_average; // Warm -> Cool => Warm value DESCENDING | 3 case 3: return b.image_warm - a.image_warm; // Cool -> Warm => Cool value DESCENDING | 4 case 4: return b.image_cool - a.image_cool; default: return 0; } }); appendHtmlMaterialData(sortingObj); } }) function appendHtmlMaterialData(sdMaterialResult) { let materials = '
'; if (sdMaterialResult && sdMaterialResult.length > 0) { sdMaterialResultObj = sdMaterialResult; // Add global object for Material Result data const sdam_id_value = document.getElementById("sdam_id").value !== "" ? document.getElementById("sdam_id").value : 729; // console.log("sdMaterialResult.length", sdMaterialResult.length); for (let index = 0; index < sdMaterialResult.length; index++) { const element = sdMaterialResult[index]; let borderTyle = ""; let imageStyle = "position: absolute;height: 35px;right: 28px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px;bottom: 7px;"; if (parseInt(sdam_id_value) === parseInt(element.sdam_id)) { borderTyle = "outline: solid #000 6px"; imageStyle = "position: absolute;height: 35px;right: 22px;display: inline-block;width: 90px;background-color: #000;color: #fff;text-align: center;line-height: 35px;bottom: 4px;"; } if (index % 3 === 0) { materials += '
'; } materials += '
'; const image_filename = element.image_location_300 || element.image_location_full; materials += '
'; materials += '
' +element.sd_pm_type + element.sd_pm_number + '
'; materials += '
'; materials += '
' + element.sd_public_texture_name + '
'; materials += '
'; if (index % 3 === 2) { materials += '
'; } if ((index % 3 === 0 || index % 3 === 1) && sdMaterialResult.length - 1 === index) { materials += '
'; } } } materials += "
"; const materialsEL = $("#materials"); if (materialsEL && materialsEL.length > 0) { materialsEL.empty().append(materials); } } }); })(jQuery)
'; } }, { "sTitle": "SDM###", "mData": "sdm_id", "sWidth": "15%", "bSortable": true, }, { "sTitle": "Date/time", "mData": "filetime", "sWidth": "25%", "bSortable": true, }, { "sTitle": "", "mData": null, "sWidth": "10%", "bSortable": false, "mRender": function(data, type, full) { return '
'; } } ], 'autoWidth': false, "bDestroy": true } ) } }); $("#tblJsonFiles").on('click', 'tbody .delete-json-file', function(e) { document.getElementById('originFileName').value = $(this).attr('id'); document.getElementById('rowIndex').value = $(this).closest('tr').index(); elementorProFrontend.modules.popup.showPopup({id: parseInt(58808)}); /* Close this popup */ elementorProFrontend.modules.popup.closePopup({}, e); }); $("#tblJsonFiles").on('click', 'tbody .json-file', function(e) { const fileName = e.target.innerHTML; // console.log("click aaaa", e.target.innerHTML, $(this).attr('id'), e.target); const pathJsonFile = $(this).attr('id'); $.get(pathJsonFile).success(function(data){ let ugly = JSON.stringify(data[0].data); let obj = JSON.parse(ugly); let pretty = JSON.stringify(obj, undefined, 4); document.getElementById('paramData').value = pretty; document.getElementById('originFileName').value = e.target.innerHTML; let artx = document.getElementById("artx").contentWindow; artx.postMessage({type:"loadParams", data: JSON.parse(pretty)},"*"); artx.postMessage("getTextureData","*"); $('#download-json').prop('disabled', false); $('#download-texture').prop('disabled', false); $('#download-json-texture').prop('disabled', false); $('#get-json').prop('disabled', false); $('#draw-json').prop('disabled', false); elementorProFrontend.modules.popup.closePopup({}, e); }); }) }); })(jQuery)