Corel Draw: как получить периметр фигур в кореле

Corel Draw: как получить периметр фигур в кореле

Corel Draw: как получить периметр фигур в кореле
Corel Draw: как получить периметр фигур в кореле
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.
Используя этот небольшой код, вы можете быстро получить периметр фигур. На этом всё 😜.
Комментарии: