Custom Modules now have default placement
This commit is contained in:
@ -283,7 +283,7 @@ if scale < 1:
|
||||
|
||||
<div class="control-group">
|
||||
<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>
|
||||
|
||||
<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', () => {
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user