Тема: Как выделить среди объектов полилинию?

я делаю так
Dim objEnt1 As AcadEntity
Dim objType As String
objType=objEnt1.EntityName
Select case objType
....
Case "AcDbPolyline"
Dim opolyline as AcadPolyline
Set opolyline=objEnt1
....
End Select
почему- то
Set opolyline=objEnt1
выдает сообщение об ошибке "Type Mismatch"
для остальных типов всё работает правильно.

Re: Как выделить среди объектов полилинию?

Если имеется в виду выделение из чертежа полилиний (и последующее издевательство над ними), то по моему разумнее всего поступить так:

Public Sub Get_Text()
    Dim ss As AutoCAD.AcadSelectionSet
    Dim gpcode(0) As Integer
    Dim dataValue(0) As Variant
    gpcode(0) = 0
    dataValue(0) = "PLINE"
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpcode
    dataCode = dataValue
    Set ss = ThisDrawing.SelectionSets.Add("ss")
    ss.Select acSelectionSetAll, , , groupCode, dataCode ' выбираем все pline-ы с чертежа
' Если нужен просто набор полилиний, то на этом можно закончить.
' А это нужно, если нам надо что-то с этими полилиниями сотворить
    Dim pl As AutoCAD.AcadPolyline
    Dim i As Integer
    i = 0
    For Each pl In ss
        Set pl = ss.Item(i)
        'Здесь делаем с этой полилинией все, что нам нужно
    Next
    ss.Delete
End Sub

Re: Как выделить среди объектов полилинию?

тогда так.
я просматриваю все объекты чертежа, и хочу выделить каждый тип объекта
почему для все остальных типов объектов всё нормально, а к полилинии нужен особый подход?

Dim objSelSet As AcadSelectionSet
Dim objSelCol As AcadSelectionSets
Set objSelCol = ThisDrawing.SelectionSets
For Each objSelSet In objSelCol
   If objSelSet.name = "processall" Then
       objSelSet.Delete
       Exit For
    End If
Next
Set objSelSet = ThisDrawing.SelectionSets.Add("processall")
objSelSet.Select acSelectionSetAll
Dim objEnt As AcadEntity
Dim objType As String
For Each objEnt In objSelSet
    objType = objEnt.EntityName
    select case objType
    ....
       Case "AcDbPolyline"
        Dim opolyline as AcadPolyline
        Set opolyline=objEnt ' возникает Type Mismatch
                ....
   End Select
Next objEnt    

Re: Как выделить среди объектов полилинию?

Я точно не знаю почему возникает "Type Mismatch", но выборку лучше делать не с помошью

Case "AcDbPolyline"

, а таким образом:

'==============================================================
    Dim gpcode(0) As Integer
    Dim dataValue(0) As Variant
    gpcode(0) = 0
    dataValue(0) = "LWPOLYLINE"
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpcode
    dataCode = dataValue
    objSelSet.Select acSelectionSetAll, , , groupCode, dataCode
    '==============================================================

Так мы уже в начале будем иметь в нашем наборе только полилинии.
Далее преобразовываем:

Dim pl As AutoCAD.AcadLWPolyline
    Set pl = objSelSet.Item(i)

И все что хотим с ней делаем.

Re: Как выделить среди объектов полилинию?

ну мне нужны ВСЕ типы объектов!
(и полилиния в частности)
тогда я должен знать dataValue(0)  для каждого типа.
где это можно взять?
что- то очень странно.
и всё- таки непонятно,
ведь для остальных типов всё работает

Re: Как выделить среди объектов полилинию?

kb-nn пишет:

ну мне нужны ВСЕ типы объектов!

Ну надо тогда объяснять конкретнее. У тебя-же прямо в Subj-е написано:

как выделить среди объектов полилинию?

Я тебе и предлогаю самый удобный для этого вариант.
Просто если делать как ты предлогаешь, то выборка из всей коллекции объектов чертежа полилиний может занять достаточно долгое время.
Чтобы не возникало "Type Mismatch" поставь вместо

Dim objEnt As AcadEntity
Dim objEnt As Variant

а вместо

Dim opolyline as AcadPolyline
Dim opolyline as Variant

Таким образом VBA сам подберет нужный формат, т.к. в твоем случае возникает ошибка несоответствия типа.
По крайней мере у меня после такой замены все работает.

Re: Как выделить среди объектов полилинию?

в том месте нормально.
но так не работает дальше.
если я обращаюсь к свойству Coordinates  у полилинии,
то у объекта типа Variant такого свойства разумеется нету.
ладно. всё равно спасибо.

Re: Как выделить среди объектов полилинию?

а вместо
Dim opolyline as AcadPolyline
Dim opolyline as Variant

Это не делай.
Тогда можно будет обращаться к координатам и т.д.

Re: Как выделить среди объектов полилинию?

А попробуй так:

[b]Dim objEnt As Object[/b]
Dim objType As String
Dim opolyline As AcadLWPolyline
Dim coord As Double
For Each objEnt In objSelSet
    objType = objEnt.EntityName
    Select Case objType
         Case "AcDbPolyline"
               Set opolyline = objEnt ' âîçíèêàåò Type Mismatch
               coord = opolyline.Coordinates(0)
        End Select
Next objEnt

Re: Как выделить среди объектов полилинию?

Все правильно, так и должно быть. Как Вы наверное знаете (по крайней мере должны) полилинии могут быть двух типов: обычная - AcDb2dPolyline и "компактная" - AcDbPolyline. За то, какая полилиния рисуется отвечает системная переменная PLINETYPE.
Соответственно

............................
Case "AcDbPolyline"                        ' выбрана "компактная" полилиния
       Dim opolyline as AcadPolyline   ' объявляем переменную как обычную полилинию
       Set opolyline=objEnt1              ' возникнет совершенно законная ошибка

Надо

Dim objPLine As AcadPolyline
Dim objLWPLine As AcadLWPolyline
Select Case entObj.ObjectName
    Case "AcDbPolyline"
        Set objLWPLine = entObj
    Case "AcDb2dPolyline"
        Set objPLine = entObj
End Select

Re: Как выделить среди объектов полилинию?

спасибо большое!
работает!
а я уж и не надеялся :(