Custom Modules now have default placement
This commit is contained in:
@ -283,7 +283,7 @@ if scale < 1:
|
|||||||
|
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label for="module-count">Number of Modules</label>
|
<label for="module-count">Number of Modules</label>
|
||||||
<input type="number" id="module-count" min="2" max="12" value="4" step="1">
|
<input type="number" id="module-count" min="2" max="64" value="4" step="1">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button id="generate-inputs-btn" type="button">Generate Position Inputs</button>
|
<button id="generate-inputs-btn" type="button">Generate Position Inputs</button>
|
||||||
|
|||||||
66
script.js
66
script.js
@ -516,8 +516,8 @@ preset16OctBtn.addEventListener('click', () => {
|
|||||||
generateInputsBtn.addEventListener('click', () => {
|
generateInputsBtn.addEventListener('click', () => {
|
||||||
const count = parseInt(moduleCountInput.value);
|
const count = parseInt(moduleCountInput.value);
|
||||||
|
|
||||||
if (isNaN(count) || count < 2) {
|
if (isNaN(count) || count < 2 || count > 64) {
|
||||||
alert('Please enter a valid number of modules above or equal to 2.');
|
alert('Please enter a valid number of modules between 2 and 64.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
generateModuleInputs(count);
|
generateModuleInputs(count);
|
||||||
@ -557,11 +557,67 @@ applyCustomBtn.addEventListener('click', () => {
|
|||||||
* BEGIN DYNAMIC DOM FUNCTIONS
|
* BEGIN DYNAMIC DOM FUNCTIONS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Function to calculate evenly spaced module positions in circular layers
|
||||||
|
function calculateModulePositions(count) {
|
||||||
|
if (count <= 0) return [];
|
||||||
|
|
||||||
|
const baseRadius = 50; // Base radius for the first layer
|
||||||
|
const positions = [];
|
||||||
|
let remainingModules = count;
|
||||||
|
let numberOfLayers = Math.ceil(count / 6);
|
||||||
|
let modulesPerLayer = Math.ceil(count / numberOfLayers);
|
||||||
|
let angleOffset = 0;
|
||||||
|
let currentLayer = 0;
|
||||||
|
let moduleIndex = 0;
|
||||||
|
|
||||||
|
while (remainingModules > 0) {
|
||||||
|
// Determine modules for this layer
|
||||||
|
let modulesInThisLayer;
|
||||||
|
|
||||||
|
if (remainingModules <= modulesPerLayer) {
|
||||||
|
// Last layer gets all remaining modules
|
||||||
|
modulesInThisLayer = remainingModules;
|
||||||
|
} else {
|
||||||
|
// All other layers: try to distribute evenly with max modulesPerLayer
|
||||||
|
const remainingLayers = Math.ceil(remainingModules / modulesPerLayer);
|
||||||
|
modulesInThisLayer = Math.min(modulesPerLayer, Math.ceil(remainingModules / remainingLayers));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate radius for this layer
|
||||||
|
const radius = currentLayer === 0 ? baseRadius : baseRadius * (1 + currentLayer * 0.75);
|
||||||
|
|
||||||
|
// Calculate positions for modules in this layer
|
||||||
|
for (let i = 0; i < modulesInThisLayer; i++) {
|
||||||
|
const angle = (angleOffset + 2 * Math.PI * i) / modulesInThisLayer;
|
||||||
|
const x = Math.round(radius * Math.cos(angle));
|
||||||
|
const y = Math.round(radius * Math.sin(angle));
|
||||||
|
|
||||||
|
positions.push({
|
||||||
|
x: x,
|
||||||
|
y: y,
|
||||||
|
name: `Layer ${currentLayer + 1} Module ${(moduleIndex % modulesPerLayer) + 1}`
|
||||||
|
});
|
||||||
|
|
||||||
|
moduleIndex++;
|
||||||
|
}
|
||||||
|
angleOffset += Math.PI;
|
||||||
|
|
||||||
|
remainingModules -= modulesInThisLayer;
|
||||||
|
currentLayer++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return positions;
|
||||||
|
}
|
||||||
|
|
||||||
function generateModuleInputs(count) {
|
function generateModuleInputs(count) {
|
||||||
const container = document.getElementById('module-position-inputs');
|
const container = document.getElementById('module-position-inputs');
|
||||||
container.innerHTML = ''; // Clear existing inputs
|
container.innerHTML = ''; // Clear existing inputs
|
||||||
|
|
||||||
|
// Calculate evenly spaced positions
|
||||||
|
const positions = calculateModulePositions(count);
|
||||||
|
|
||||||
for (let i = 0; i < count; i++) {
|
for (let i = 0; i < count; i++) {
|
||||||
|
const position = positions[i];
|
||||||
const moduleFieldset = document.createElement('fieldset');
|
const moduleFieldset = document.createElement('fieldset');
|
||||||
moduleFieldset.className = 'module-input-group';
|
moduleFieldset.className = 'module-input-group';
|
||||||
moduleFieldset.innerHTML = `
|
moduleFieldset.innerHTML = `
|
||||||
@ -569,15 +625,15 @@ function generateModuleInputs(count) {
|
|||||||
|
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label for="module-${i}-name">Module Name</label>
|
<label for="module-${i}-name">Module Name</label>
|
||||||
<input type="text" id="module-${i}-name" value="Module ${i + 1}" required>
|
<input type="text" id="module-${i}-name" value="${position.name}" required>
|
||||||
</div>
|
</div>
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label for="module-${i}-x">X Position (pixels)</label>
|
<label for="module-${i}-x">X Position (pixels)</label>
|
||||||
<input type="number" id="module-${i}-x" step="1" value="0" required>
|
<input type="number" id="module-${i}-x" step="1" value="${position.x}" required>
|
||||||
</div>
|
</div>
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label for="module-${i}-y">Y Position (pixels)</label>
|
<label for="module-${i}-y">Y Position (pixels)</label>
|
||||||
<input type="number" id="module-${i}-y" step="0.1" value="0" required>
|
<input type="number" id="module-${i}-y" step="0.1" value="${position.y}" required>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
container.appendChild(moduleFieldset);
|
container.appendChild(moduleFieldset);
|
||||||
|
|||||||
Reference in New Issue
Block a user