Тема: Как создать полилинию из дуг средствами VBA?

Помогите создать полилинию из дуг и прямых средствами VBA! Обычные методы "addPolyline" где задаётся список вершин полилинии не может создать полилинию с дугами так как между точками по умолчанию проводятся прямые. А как задать команду чтобы постоилась полилиния из дуг?

Re: Как создать полилинию из дуг средствами VBA?

Может немного коряво, это писалось в спешке...

' т.к. нам надо вместе с объектом хранить направление
Public Type ObrObj
  Obj As AcadObject
  StEn As Boolean   ' true = start point -> end point
End Type


'====================
'
' Создание полилинии на основе массива упорядоченых объектов
'
' результат - удалось ли
'

Public Function CreatePLine(EntArr() As ObrObj, PLin As AcadPolyline) As Boolean

On Error GoTo labError
Dim Cnt As Long
Dim TmpVar As Variant
Dim VertArr() As Double

' заполняем массив координат вершин полилинии
ReDim VertArr(3 * (UBound(EntArr) + 1) - 1)
For Cnt = 0 To UBound(EntArr) - 1
If EntArr(Cnt).StEn Then
   TmpVar = EntArr(Cnt).Obj.StartPoint
  Else
   TmpVar = EntArr(Cnt).Obj.EndPoint
  End If
   VertArr(3 * Cnt) = TmpVar(0)
   VertArr(3 * Cnt + 1) = TmpVar(1)
   VertArr(3 * Cnt + 2) = 0
Next Cnt
' конечная точка последнего объекта
If EntArr(UBound(EntArr) - 1).StEn Then
   TmpVar = EntArr(UBound(EntArr) - 1).Obj.EndPoint
Else
   TmpVar = EntArr(UBound(EntArr) - 1).Obj.StartPoint
End If
VertArr(3 * UBound(EntArr)) = TmpVar(0)
VertArr(3 * UBound(EntArr) + 1) = TmpVar(1)
VertArr(3 * UBound(EntArr) + 2) = 0

' создание полилинии
Set PLin = ThisDrawing.ModelSpace.AddPolyline(VertArr)

' определение свойства выпуклости для дуг
For Cnt = 0 To UBound(EntArr) - 1
  If EntArr(Cnt).Obj.ObjectName = "AcDbArc" Then
    If EntArr(Cnt).StEn Then
      PLin.SetBulge Cnt, Tan(EntArr(Cnt).Obj.TotalAngle / 4)
     Else
      PLin.SetBulge Cnt, -Tan(EntArr(Cnt).Obj.TotalAngle / 4)
     End If
   End If
Next Cnt

CreatePLine = True
Exit Function

labError:
CreatePLine = False
MsgBox "Во время работы функции CreatePLine произошли ошибки!"
End Function

Re: Как создать полилинию из дуг средствами VBA?

Это очень круто! Но я не понимаю: что надо задавать параметры линиям полилинии после создания полилиниии этого я ещё не видел и не могу поверить что такое возможно в AutoCAD. Если даже свойства линий (линии или арки) полилинии невозможно определить из базы данных рисунка на языке Lisp, то неужели это возможно на языке VBA?

Re: Как создать полилинию из дуг средствами VBA?

А Вы попробуйте. В VBA вообще есть много чего интересного.

Re: Как создать полилинию из дуг средствами VBA?

По моему опыту на VBA быстрее создать объект и трансформировать его как надо (поворот, перемещение и т.п.) чем производить сложные расчёты координат.

Re: Как создать полилинию из дуг средствами VBA?

Свойства сегментов полилинии исчерпывающе заданы в данных вершин полилинии и доступ к ним из LISP открыт вполне.

Re: Как создать полилинию из дуг средствами VBA?

Давайте разберёмся сначала со свойствами данными в окне свойств вызываемом в AutoCAD.
В списке Vertex(X/Y) даются только координаты вершин полилинии, а данные о том что располагается между этими вершинами в окне свойств найти нельзя. Те же самые свойства объекта AcDbPolyline мы можем получить в VBA: свойство Coordinates даёт общее количество вершин, а свойство Coordinate даёт список координат вершин полилинии. Из какого свойства можно получить параметры сегмента-дуги и самое главное попытаться изменить эти свойства или задать их заново, чтобы програмным способом создать на чертеже полилинию состоящую из дуг?!
Если кто знает как это сделать на языке Lisp то напишите мне пожалуюста ответ, буду очень рад, хотя язык Lisp я не люблю и уважаю больше Visual Basik for Application и все программы пишу имено на этом языке.

Re: Как создать полилинию из дуг средствами VBA?

То, что отображается в Окне Свойств - это всего лишь "образ"  сведений, которые на самом деле хранятся в чертеже.
Рассмотрим, как извлекать эти сведения:
(entget (car (entsel "\nSelect polyline: "))) возвращает асоциативный список данных про объект в виде
((-1 . <Entity name: 4005fd50>)
  (0 . "LWPOLYLINE") - тип объекта
  (330 . <Entity name: 4005fcf8>)
  (5 . "2A") - метка
  (100 . "AcDbEntity")
  (67 . 0) - пространство
  (410 . "Model") - закладка
  (8 . "0") - слой
  (100 . "AcDbPolyline")
  (90 . 4) - число вершин
  (70 . 0) - флаг параметров полилинии
  (43 . 0.0) - ширина по умолчанию
  (38 . 0.0) - уровень над плоскостью XY
  (39 . 0.0) - высота выдавливания
а вот и сведения о вершинах и, соответственно, сегментах
  (10 99.4054 79.7096) - координаты вершины
  (40 . 0.0) - начальная ширина сегмента
  (41 . 0.0) - конечная ширина сегмента
  (42 . 0.0) - кривизна (отношение наибольшей высоты дуги над хордой к длине хорды - отрицательная означает поворот по часовой стрелке)
  (10 169.629 164.567) (40 . 0.0) (41 . 0.0) (42 . -0.337189)
  (10 276.681 189.525) (40 . 0.0) (41 . 0.0) (42 . 0.0)
  (10 307.579 112.779) (40 . 0.0) (41 . 0.0) (42 . 0.0)
  (210 0.0 0.0 1.0) - направление выдавливания
)
Координат соседних вершин и значения кривизны вполне достаточно, чтобы определить и радиус, и положение точки центра дуги (или наоборот, по точке центра и радиусу вычислить кривизну и применить к созданию полилинии из дуговых сегментов).
Языку LISP в принципе все равно, любите Вы его или нет ( настолько он отличается по своей идее от всех Бейсиков вместе взятых). Однако если Вы уважаете BasiC, то его имя пишется именно так.

Re: Как создать полилинию из дуг средствами VBA?

Спасибо за комментарий!
[...] (Одна тема -- один вопрос.) /Администратор./
/Администратор./

Поздравляю Вас с праздником 9 мая! Днём Победы!