Как определить ширину текста в OpenSCAD?

В OpenSCAD я хочу иметь возможность создавать module который принимает string затем создайте трехмерный объект с этой строкой, встроенной в поверхность как text, Я хочу, чтобы объект был немного больше, чем textтак что мне нужно знать, насколько широко text для того, чтобы создать объект правильного размера.

Я не уверен, как запросить ширину text (высота задается входной переменной), или, если это возможно.

Если это невозможно, есть ли функция, которая будет принимать строку и шрифт и предсказывать ширину отображаемого текста?

3 ответа

Если вы используете один из шрифтов Liberation, поставляемых в комплекте с OpenSCAD, или шрифты из пакета Microsoft Core Fonts, вы можете использовать мою библиотеку OpenSCAD для измерения шрифтов. Например:

use <fontmetrics.scad>;
length = measureText("This is a Test", font="Arial:style=Italic", size=20.);

Библиотека здесь. Я использовал некоторые скрипты Python для извлечения метрик (включая пары кернинга) из файла ttf, и вы можете использовать скрипты для добавления информации о дополнительных шрифтах.

В настоящее время нет способа запросить фактический размер сгенерированной текстовой геометрии. Однако, в зависимости от модели, которая должна быть создана, может быть достаточно рассчитать приблизительную оценку и использовать scale() вписать текст в известный размер.

// Fit text into a randomly generated area

r = rands(10, 20, 2);
length = 3 * r[0];
w = r[1];

difference() {
    cube([length, w, 1]);
    color("white")
        translate([0, w / 2, 0.6])
            linear_extrude(1, convexity = 4)
                resize([length, 0], auto = true)
                    text("This is a Test", valign = "center");
}

Я нашел способ определить ширину текстовых символов в OpenSCAD. Я сделал JavaScript, который позволяет вам вводить имя и стиль шрифта, и он выводит массив пропорций ширины для символов ascii и расширенных символов ascii (коды 0-255). Затем для любого данного символа вы умножаете эту пропорцию на размер шрифта, чтобы получить ширину отдельного символа. Отсюда легко получить ширину строки или угловую ширину символов, обернутых вокруг цилиндра.

Инструмент для создания массива ширины OpenSCAD находится здесь: https://codepen.io/amatulic/pen/eYeBLva

... и ниже воспроизведен код, который вы можете запустить из этого ответа или вставить в свой собственный файл HTML и загрузить в свой браузер локально.

Просто введите свойства шрифта, нажмите кнопку и прокрутите вниз, чтобы увидеть инструкции по использованию.

Секретный соус заключается в том, что поддержка холста в JavaScript имеет метод measureText(), который измеряет длину любого текста в пикселях для данного шрифта, который используется следующим образом:

      canvasContext.measureText(string).width

Итак, что делает этот код, так это использует фиктивный холст на странице, чтобы получить контекст, которому назначается шрифт произвольного размера 20 пикселей. Затем он генерирует массив значений ширины для каждого символа от 0 до 255, деля каждое значение на 20, чтобы получить безразмерную пропорцию ширины по сравнению с размером шрифта. Затем он выводит строку кода OpenSCAD, которую вы можете вставить в свой сценарий OpenSCAD. Затем вы используете OpenSCAD функция для преобразования любого символа в числовой код, который затем служит индексом массива ширины. Затем вы умножаете эту ширину на размер шрифта, чтобы получить ширину символа.

Другие вопросы по тегам