OpenSCAD linear_extrude из многопутевого импорта svg

В OpenSCAD я пытаюсь сделать linear_extrude на фигуре, импортированной из svg. Файл svg содержит несколько путей. Я хотел бы масштабировать каждый путь отдельно. Я попробовал следующий код, но весь импорт рассматривается как одна форма, приводящая к изображению ниже.

linear_extrude(height = 5, center = true, scale=1.2)
    import(file = "xxx.svg", center = true, dpi = 96);

result

Как я могу иметь каждую из букв, чтобы иметь "свою собственную пирамиду"?

Я знаю, что могу создать один SVG на букву. Но для простоты я хотел бы иметь только один SVG-файл, так как в будущем я хочу создавать гораздо более сложные мотивы. Моя конечная цель-создать штампы из рисунков SVG.

Правка: Альтернатива, попробованная после комментария Мика (тот же результат):

module pyramidChildren(height){
    for ( i= [0:1:$children-1])  
      linear_extrude(height = height, scale=1.5)
        children(i);
 }
 
 pyramidChildren(5)
    import(file = "xxx.svg", center = true, dpi = 96);

Я попытался использовать базовый svg (несколько путей), а также сгруппировать каждый путь (только с самим собой) без изменений в результате.

, 👍4

Обсуждение

Вы пробовали использовать children() на объекте? Это должно позволить вам манипулировать каждой буквой отдельно., @Mick

Спасибо @Mick Я не знал о children(). Я попробовал это после вашего комментария, но это не изменило результат..., @Oneira

дети не помогают. Импорт является одним дочерним узлом, а не последовательностью компонентов из SVG., @R.. GitHub STOP HELPING ICE


4 ответа


6

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

Для рендеринга требуются века, но этого может быть достаточно для простых шаблонов. Любое лучшее решение по-прежнему приветствуется...

module buildPyramidalExtrude(height,maxOffset,nSlices){
    heightIncrement = height/nSlices;
    offsetIncrement = maxOffset/(nSlices-1);
    for(i=[1:nSlices])
        linear_extrude(height=i*heightIncrement)
              offset(r = maxOffset-(i-1)*offsetIncrement)
                children();
}

buildPyramidalExtrude(4,2.5,20)
   import(file = "Farm/cow.svg", center = true);

result


,

2

То, что вы, кажется, хотите,-это не масштаб по пути, а смещение. Это открытый пиар в OpenSCAD и, надеюсь, скоро будет в восходящем потоке.

,

С нетерпением ждем возможности увидеть его в upstream!, @Oneira


1

Один из вариантов-использовать minkowski() для объединения svg с конусом. С положительной стороны, это дает довольно приятный результат, но есть и минусы:

  • это довольно медленно
  • он откармливает низ, а не сжимает верх, поэтому в зависимости от ваших потребностей вам, возможно, придется инвертировать изображение, запустить minkowski, а затем снова инвертировать.

Другой вариант - преобразовать в оттенки серого png и применить размытие с помощью внешнего инструмента, а затем импортировать с помощью surface() (серое размытие станет хорошим наклоном). Это одновременно откормит низ и сократит верх, но сохранение только верхней половины должно дать желаемый результат.

,

1

Поздно с вопросом, но я работаю над проектом, похожим на вопрос. Мое решение состоит в том, чтобы открыть файл SVG в Inkscape (версия < 1.x) и использовать расширение Path to OpenSCAD для создайте набор точек для каждого объекта.

Расширение создает пути на основе желаемой высоты экструзии и помещает каждый набор точек в отдельный модуль. При этом можно масштабировать каждый отдельный объект и манипулировать каждым по желанию.

Расширение Inkscape для использования OpenSCAD

Изображение со связанного сайта.

,