28/1/2026
Как вычислить периметр векторной фигуры в Corel Draw? Как узнать длину кривой? Такая задача возникает время от времени у любого, работающего с векторной графикой. Те же, кому периметр необходим ежедневно, например, для расчета длины реза плоттера, или гравера, или лазера, используют некие готовые решения с большим функционалом. В посте же рассмотрим простой расчет длины кривых в редакторе Corel Draw.
Задача: Выделить объекты, рассчитать длину кривой каждого объекта, вывести результат в виде суммы.
В кореле есть 27 типов шейпов (фигур). Периметр мы будем получать у следующих типов:
cdrCurveShape — кривая
cdrRectangleShape — прямоугольник
cdrEllipseShape — эллипс
cdrPolygonShape — полигон (звезда, спираль в этом же разделе).
Можно получить и у других объектов, как пример, конвертировать текст в кривые, потом вернуть его назад в текст после подсчета периметра, но мы рассматриваем простой вариант подсчета длины всех кривых в выделении. Но в выделение могут попасть фигуры не относящиеся к четырем выше перечисленным типам, поэтому будем выводить количество всего фигур в выделении, исключая группы. (Фигуры из групп включаем, а сами группы исключаем).
Главная процедура для запуска.
Sub calculatePerimeter() Dim sh As Shape, shr As ShapeRange Dim sumPerim As Double, perimeter As Double Dim figuresPerim As Long, figuresAll As Long ' figuresAll - всего фигур в выделении figuresPerim = 0: figuresAll = 0 ' figuresPerim - количество фигур, участвующих в расчете общего периметра sumPerim = 0 ActiveDocument.unit = cdrMillimeter 'обязательно укажите в каких единицах нужно получать длину периметра ' Проверяем есть ли выделение If ActiveSelection.Shapes.Count = 0 Then MsgBox "Ничего не выделено!", vbExclamation Exit Sub End If Set shr = ActiveSelectionRange Set shr = shr.Shapes.FindShapes.All For Each sh In shr If sh.Type <> cdrGroupShape Then perimeter = getPerimeter(sh) sumPerim = sumPerim + perimeter figuresAll = figuresAll + 1 If perimeter > 0 Then figuresPerim = figuresPerim + 1 End If Next ' Выводим выделение MsgBox "Периметр фигур (" & figuresPerim & " шт): " & Round(sumPerim, 2) & " мм" & Chr(10) & Chr(13) & "Всего фигур в выделении: " & figuresAll, vbInformation End Sub
В процедуре используется функция получения периметра фигуры getPerimeter.
Function getPerimeter(sh As Shape) getPerimeter = 0 ' присваиваем сразу возврат 0, если фигура не соответствующего типа ' а потом проверяем If sh.Type = cdrCurveShape Then getPerimeter = sh.Curve.Length If sh.Type = cdrRectangleShape Then getPerimeter = sh.DisplayCurve.Length If sh.Type = cdrEllipseShape Then getPerimeter = sh.DisplayCurve.Length If sh.Type = cdrPolygonShape Then getPerimeter = sh.DisplayCurve.Length End Function
Длина кривой хранится в самой фигуре и в зависимости от типа находится в свойствах: либо в DisplayCurve, либо в Curve.
Используя этот небольшой код, вы можете быстро получить периметр фигур. На этом всё 😜.
Комментарии: