Тема: Передача переменной объекта на переменную поли-линии неудачна!!!

Читайте комментарии в коде:

Public Sub SelSet_TEST()
    Dim Obj As AcadEntity
    Dim SelSet As AcadSelectionSet
    Dim Ln As AcadLine
    Dim Pl As AcadPolyline
    Dim Ci As AcadArc
On Error GoTo Control
    'Создаем новый набор выбора, например с именем "Set"
    Set SelSet = ThisDrawing.SelectionSets.Add("Set")
On Error GoTo 0
    'Запрос на выбор примитивов
    SelSet.SelectOnScreen
    'Если не чего не выбрано, переходим к "Control"
    If SelSet.Count = 0 Then GoTo Control
    For Each Obj In SelSet
            If Obj.ObjectName = "AcDbLine" Then
                Set Ln = Obj
                Set Ln = Nothing
            ElseIf Obj.ObjectName = "AcDbPolyline" Then
                'Здесь будет ошибка!!!! Несоответствие типов данных!!! Почему???
                Set Pl = Obj
                Set Pl = Nothing
            ElseIf Obj.ObjectName = "AcDbArc" Then
                Set Ci = Obj
                Set Ci = Nothing
            Else
                MsgBox "Объект с именем " & Obj.ObjectName & " не включен в расчет", vbCritical
            End If
    Next Obj
Control:
    SelSet.Delete 'Удаляем набор выбора
End Sub

Как правильно передать переменной Pl объект типа "полилиния"?

Re: Передача переменной объекта на переменную поли-линии неудачна!!!

А если так:

Public Sub SS_Test()
  Dim SelSet As AcadSelectionSet, objCounter As AcadObject
  Dim sSelSetName As String, sMsgText As String, sMsgTitle As String
  Dim lCounter As Long, lLineCount As Long, lPlineCount As Long, lArcCount As Long
  Dim lOtherCount As Long
  sMsgTitle = "Проверка"
  sSelSetName = "SelSet_Temp"
  If ThisDrawing.SelectionSets.Count > 0 Then
    For lCounter = 0 To ThisDrawing.SelectionSets.Count
      If ThisDrawing.SelectionSets.Item(lCounter).Name = sSelSetName Then
        ThisDrawing.SelectionSets.Item(lCounter).Clear
        ThisDrawing.SelectionSets.Item(lCounter).Delete
        Exit For
      End If
    Next 'lCounter
  End If
  Set SelSet = ThisDrawing.SelectionSets.Add(sSelSetName)
  SelSet.SelectOnScreen
  For Each objCounter In SelSet
    Select Case UCase(objCounter.ObjectName)
      Case "ACDBLINE"
        lLineCount = lLineCount + 1
      Case "ACDBPOLYLINE"
        lPlineCount = lPlineCount + 1
      Case "ACDBARC"
        lArcCount = lArcCount + 1
      Case Else
        lOtherCount = lOtherCount + 1
    End Select
  Next 'objCounter
  MsgBox "В наборе : " & vbCr & lLineCount & " отрезков;" & vbCr & _
          lPlineCount & " полилиний;" & vbCr & _
          lArcCount & " дуг;" & vbCr & _
          lOtherCount & " прочих объектов", vbOKOnly + vbInformation + vbApplicationModal, sMsgTitle
  SelSet.Clear
  SelSet.Delete
End Sub

Re: Передача переменной объекта на переменную поли-линии неудачна!!!

Нет, посчетать их количество у меня тоже получается. Проблема возникает, когда предпринимается попытка преобразовать (передать) значение от переменной типа "AcadEntity" до переменной типа "AcadPolyline", если свойство "ObjectName" переменной типа "AcadEntity" = "AcDbPolyline".
В моём примере ошибка вознивает при прохождении через строку:

Set Pl = Obj

Re: Передача переменной объекта на переменную поли-линии неудачна!!!

А, понял. А если попробовать использовать вместо строки

Dim Pl As AcadPolyline

нечто вида

Dim Pl As AcadLWPolyline

Просто дело в том, что в каде есть 2 типа полилиний: нормальная и "облегченная". Вторая вызывается командой _pline и имеет тип acadlwpolyline.
---
ИМХО

Re: Передача переменной объекта на переменную поли-линии неудачна!!!

ДА! Огромное спасибо, kpblc!
Всё получилось.

Re: Передача переменной объекта на переменную поли-линии неудачна!!!

И слава богу ;)
Сам на эти грабли наступал ;)

Re: Передача переменной объекта на переменную поли-линии неудачна!!!

Этим делом управляет переменная:
Command: plinetype
Enter new value for PLINETYPE <2>:
Если =2 то всеновые полилинии - LWPoly...

Re: Передача переменной объекта на переменную поли-линии неудачна!!!

Позволю себе не согласиться с > JS (2005-08-15 21:34:49):
https://www.caduser.ru/oldlink/acad/?var_name=PLINETYPE

0 Полилинии в старых рисунках не преобразуются при открытии; команда ПЛИНИЯ создает полилинии в старом формате
1 Полилинии в старых рисунках не преобразуются при открытии; команда ПЛИНИЯ создает оптимизированные полилинии
2 Полилинии в старых рисунках преобразуются при открытии; команда ПЛИНИЯ создает оптимизированные полилинии

Справка ACAD 2005 Eng :

Type: Integer
Saved in: Registry
Initial value: 2
Specifies whether optimized 2D polylines are used. PLINETYPE controls both the creation of new polylines with the PLINE command and the conversion of existing polylines in drawings from previous releases.
0 Polylines in older drawings are not converted when opened; PLINE creates old-format polylines
1 Polylines in older drawings are not converted when opened; PLINE creates optimized polylines
2 Polylines in R14 or older drawings are converted when opened; PLINE creates optimized polylines
For more information on the two formats, see the CONVERT command.
PLINETYPE also controls the polyline type created with the following commands: BOUNDARY (when object type is set to Polyline), DONUT, PEDIT (when selecting a line or arc), POLYGON, and SKETCH (when SKPOLY is set to 1).

Т.е. фактически на рисование новых полилиний эта переменная никакого влияния не оказывает. И потом, есть же 2 разные команды: _.Pline (формируется LWPOLYLINE) и _.3dpoly (3Д-полилиния - POLYLINE). Первая может лежать только в текущей USC, плоскость x0y, координата Z = 0 в представлении вершин, вторая - полностью 3-мерный объект. Достаточно нарисовать 2 объекта (один командой _.pline, другой - _.3dpoly) и дать команду (entget(car(entsel))), и проанализировать результаты функций.
---
ИМХО

Re: Передача переменной объекта на переменную поли-линии неудачна!!!

Конечно _.3dpoly тут совершенно ни при чём. Речь идет только о двумерных полилиниях.