Custom Modules now have default placement

This commit is contained in:
2025-11-03 11:30:59 -05:00
parent 5662142274
commit 07204a476e
2 changed files with 62 additions and 6 deletions

View File

@ -516,8 +516,8 @@ preset16OctBtn.addEventListener('click', () => {
generateInputsBtn.addEventListener('click', () => {
const count = parseInt(moduleCountInput.value);
if (isNaN(count) || count < 2) {
alert('Please enter a valid number of modules above or equal to 2.');
if (isNaN(count) || count < 2 || count > 64) {
alert('Please enter a valid number of modules between 2 and 64.');
return;
}
generateModuleInputs(count);
@ -557,11 +557,67 @@ applyCustomBtn.addEventListener('click', () => {
* 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) {
const container = document.getElementById('module-position-inputs');
container.innerHTML = ''; // Clear existing inputs
// Calculate evenly spaced positions
const positions = calculateModulePositions(count);
for (let i = 0; i < count; i++) {
const position = positions[i];
const moduleFieldset = document.createElement('fieldset');
moduleFieldset.className = 'module-input-group';
moduleFieldset.innerHTML = `
@ -569,15 +625,15 @@ function generateModuleInputs(count) {
<div class="control-group">
<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 class="control-group">
<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 class="control-group">
<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>
`;
container.appendChild(moduleFieldset);