Тема: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

'Выбор аналогичных линий
Dim gpC(0 To 4) As Integer
Dim gpV(0 To 4) As Variant
Set ssetObjL = ThisDrawing.SelectionSets.Add("LINESSS")
gpC(0) = 0
gpV(0) = "Lwpolyline"
gpC(1) = 6
gpV(1) = LIN_OBJ.Linetype
gpC(2) = 8
gpV(2) = LIN_OBJ.Layer
gpC(3) = 43
gpV(3) = LIN_OBJ.Lineweight
gpC(4) = 62
gpV(4) = LIN_OBJ.COLOR
ssetObjL.Select acSelectionSetAll, , , gpC, gpV
ssetObjL.Delete
пока работаем без LIN_OBJ.Lineweight и кода 43
все работает но мне бы хотелось выбирать ещё и с определенной толщиной,,,,
что неправильно?????

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

попутался,, код 43 это толщина (globalwidth) а мне нужен код [Lineweight], существует ли такой????

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

Не вес линии, а постоянная ширина полилинии. Это все же разные вещи.

43 : Constant width (optional; default = 0). Not used if variable width (codes 40 and/or 41) is set

А вес линии - в 370 группе

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

да но почему код всеравно неработает???
'Выбор аналогичных линий
Dim gpC(0 To 4) As Integer
Dim gpV(0 To 4) As Variant
Set ssetObjL = ThisDrawing.SelectionSets.Add("LINESSSSS")
gpC(0) = 0
gpV(0) = "Lwpolyline"
gpC(1) = 6
gpV(1) = LIN_OBJ.Linetype
gpC(2) = 8
gpV(2) = LIN_OBJ.Layer
gpC(3) = 62
gpV(3) = LIN_OBJ.color
gpC(4) = 370
gpV(4) = LIN_OBJ.Lineweight
ssetObjL.Select acSelectionSetAll, , , gpC, gpV
ssetObjL.Delete
И где можно найти информацию по всем этим [группам кодов] ???

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

В каде : Help -> Developer Help и там DXF Reference
А также книги Н.Н.Полещука.
Я не спец по VBA и ActiveX-селектам, но тем не менее. Что у тебя в LIN_Obj.LineWeight лежит на момент вызова?

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

на момент вызова там лежит число [20] в действительности это толщина [0.20]

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

Ну правильно. Оно там такое и должно лежать. А вот теперь вопрос - по _qselect (к примеру) вообще есть полилинии с таким весом или нет?

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

ну чтобы стало окончательно ясно то все происходит следующим образом (вкраце)
Dim ssetObj As AcadSelectionSet 'Все
Dim ssetObjL As AcadSelectionSet 'Линии
Set ssetObj = ThisDrawing.SelectionSets.Add("ALLselection")
ssetObj.Select acSelectionSetAll
'теперь предположим что у нас нарисованы одни полилинии
Dim LIN_OBJ As Object
set LIN_OBJ=ssetObj.Item(1)
ssetObj.Delete
'Выбор аналогичных линий
Dim gpC(0 To 4) As Integer
Dim gpV(0 To 4) As Variant
Set ssetObjL = ThisDrawing.SelectionSets.Add("LINESSSSS")
gpC(0) = 0
gpV(0) = "Lwpolyline"
gpC(1) = 6
gpV(1) = LIN_OBJ.Linetype
gpC(2) = 8
gpV(2) = LIN_OBJ.Layer
gpC(3) = 62
gpV(3) = LIN_OBJ.color
'============== и вот если это отсечь
'============== все начинает работать как надо
gpC(4) = 370
gpV(4) = LIN_OBJ.Lineweight
'===================================
ssetObjL.Select acSelectionSetAll, , , gpC, gpV
ssetObjL.Delete
'Также неясно работает и код [70]
Polyline flag (bit-coded); default is 0:
1 = This is a closed polyline (or a polygon mesh closed in the
M direction).
2 = Curve-fit vertices have been added.
4 = Spline-fit vertices have been added.
8 = This is a 3D polyline.
16 = This is a 3D polygon mesh.
32 = The polygon mesh is closed in the N direction.
64 = The polyline is a polyface mesh.
128 = The linetype pattern is generated continuously around the vertices of this polyline.
'====================================
при попытке выбрать только закрытые линии [1]
как только мы включаем Linetype generation = true
сразу перестает выбирать именно эти линии

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

2 момента. Для LWPLYLINE 70 группа немного не такая по справке:

Polyline flag (bit-coded); default is 0:
1 = Closed; 128 = Plinegen

Ты же справку показал для POLYLINE! А это уже другая песня...
И попробуй такой код (я особо его не проверял):

Sub GetSelSet(Optional EntType As String = "LWPOLYLINE", _
                  Optional Linetype As String = "ByLayer", _
                  Optional sLayer As String, _
                  Optional iColor As Integer = -5, _
                  Optional iLineWeight As Integer = -1, _
                  Optional bIsClosedLWPline As Boolean = True)
Dim SelSet As AcadSelectionSet, sSetName As String
Dim lCounter As Long
Dim filDXF() As Integer, filData() As Variant
  ' Работаем с SelectionSet, удаляя старый с таким же именем
  sSetName = "SelectForLWPlines"
  For Each SelSet In ThisDrawing.SelectionSets
    If SelSet.Name = sSetName Then
      SelSet.Clear
      SelSet.Delete
      Exit For
    End If
  Next SelSet
  Set SelSet = ThisDrawing.SelectionSets.Add(sSetName)
  ReDim filDXF(1): ReDim filData(1)
  ' Определяем фильтры данных
  filDXF(0) = 0: filData(0) = EntType
  filDXF(1) = 6: filData(1) = Linetype
  If sLayer <> "" Then
    ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))
    filDXF(UBound(filDXF)) = 8: filData(UBound(filData)) = sLayer
  End If
  If iColor <> -5 Then
    ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))
    filDXF(UBound(filDXF)) = 62: filData(UBound(filData)) = iColor
  End If
  If iLineWeight <> -1 Then
    ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))
    filDXF(UBound(filDXF)) = 370: filData(UBound(filData)) = iLineWeight
  End If
  If LCase(EntType) = "lwpolyline" And bIsClosedLWPline Then
    ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))
    filDXF(UBound(filDXF)) = 70: filData(UBound(filData)) = 1
  End If
  SelSet.Select acSelectionSetAll, , , filDXF, filData
  SelSet.Highlight True
'  GetSelSet = SelSet
End Sub
Sub testgetselset()
  GetSelSet , , , , , True
End Sub

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

Черт, форматирование гавкнулось :( На всякий случай код можно скачать еще и отсюда: http://rapidshare.de/files/31402971/GetSelSet.txt

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

Я смотрю написано вроде все правильно но у меня в 2006 Автокаде неработает
как бы я не попробывал....=)
и если неопределять толщину (вес) линии тогда все определяется.
Но опять же closed polyline определяется только если linetype generation = disabled
вот такая вот петрушка.....

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

> Артём
А ты попробуй задавать 70 группу 129 при включенном linetype generation. Тогда и мой код надо будеть подправлять на это дело. ЯТД, скорее всего, для пропущенного iLineWeight надо будет добавлять не 1 элемент в массив, а 3 - с группами -4.

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

да значит код 70 - 1 это:
Closed = Yes
linetype generation = disabled
а код 70 - 128 это:
Closed = Yes
linetype generation = enabled
в этоге получается такая фишка
(если мы хотим выбрать линии только закрытые и наплевать на их генерацию)
    ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))
    filDXF(UBound(filDXF)) = -4: filData(UBound(filData)) = "<OR"
    ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))
    filDXF(UBound(filDXF)) = 70: filData(UBound(filData)) = 129
    ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))
    filDXF(UBound(filDXF)) = 70: filData(UBound(filData)) = 1
    ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))
    filDXF(UBound(filDXF)) = -4: filData(UBound(filData)) = "OR>"
но с весом всеравно непонятно...

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

Попробуй добавить
filDXF(UBound(filDXF)) = 70: filData(UBound(filData)) = 128
ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

''Исключаем закрытые линии
''выбераем только открытые с любой генерацией
ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))
filDXF(UBound(filDXF)) = -4: filData(UBound(filData)) = "<OR"
ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))
filDXF(UBound(filDXF)) = 70: filData(UBound(filData)) = 128
ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))
filDXF(UBound(filDXF)) = 70: filData(UBound(filData)) = 0
ReDim Preserve filDXF(1 + UBound(filDXF)): ReDim Preserve filData(1 + UBound(filData))
filDXF(UBound(filDXF)) = -4: filData(UBound(filData)) = "OR>"
но мне всеже интересно как выбрать с определенной толщиной????

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

Я даже сделал трассировку кода с -1000 до 1000. Было 2 остановки на 100 и 330 но они ничего недали. Неужели невозможно выбрать по весу любые из объектов????
с трудом верится....

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

Как выбрать по Lineweight с использованием DXF кодов????
неужели никто даже не пробывал сделать настолько элементарную операцию????!!!

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

> Артём
В lisp'е такая фильтрация работает: (setq ss (ssget "_X" '((370 . 5)))) - фильтруются все примитивы с весом линии 0.05мм

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

> Александр Ривилис
P.S.: Разумеется если вес линии назначен "послою" и слою присвоен вес линии 0.05мм - примитивы выбраны не будут.

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

Я незнаю почему но в VB это не работает!

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

> Артём
1) В VB или в VBA?
2) Версия AutoCAD?
3) В lisp-е это у тебя работает?

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

Я имею в виду выбор по весу линии (Lineweight) через VBA SelectionSet используя DXF коды в 2000-2006 автокадах.
Возможно можно попробывать использовать лисповский выбор и ActiveSelectionSet......(пока непробывал)

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

Здравствуйте, господа. Аналогичная проблема, просто ужос, помогите, плиз!! Нужно просто выбрать те полилинии, у которых цвет «ByLayer» и вес «0,05mm»
Код:

Dim sset As AcadSelectionSet
Set sset=ThisDrawing.SelectionSets.Add ("sset")
Dim fT(1) As Integer
Dim fD(1) As Variant
fT(0) = 370:  fD(0) = 5
fT(1) = 62:  fD(1) = 256
sset.SelectOnScreen fT, fD

Не работает. Во время выборки  полилиний  просто «Filtered out»… и ничего не выбрано... Причем по цвету выбирает нормально :(

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

> Student
Попробуй выбирать сначала по цвету
а потом удалить из набора по весу

Option Explicit
Sub SelSetByLWT()
Dim ss As AcadSelectionSet
Dim ftype(0 To 3) As Integer
Dim fdata(0 To 3) As Variant
Dim dxfCode, dxfValue
Dim ent As AcadEntity
Dim i As Long
          With ThisDrawing.SelectionSets
               While .Count > 0
                    .Item(0).Delete
               Wend
          End With
     With ThisDrawing.SelectionSets
          Set ss = .Add("$Plines$")
     End With
     ftype(0) = -4: fdata(0) = "<and"
     ftype(1) = 0: fdata(1) = "*POLYLINE"
     ftype(2) = 62: fdata(2) = 256
     ftype(3) = -4: fdata(3) = "and>"
    dxfCode = ftype: dxfValue = fdata
     ss.SelectOnScreen dxfCode, dxfValue
     MsgBox "Selected:" & vbCr & _
            ss.Count
            For i = ss.Count - 1 To 0 Step -1
            Set ent = ss.Item(i)
            If ent.Lineweight <> acLnWt050 Then '<--lineweight=0.5mm
            Dim remObj(0) As AcadEntity
            Set remObj(0) = ent
            ss.RemoveItems remObj
            ss.Update
            End If
            Next
            MsgBox "Still in selection set:" & vbCr & _
                                             ss.Count
      ' test only
      For Each ent In ss
      ent.color = acYellow
      Next
End Sub

~'J'~

Re: Как выбрать полилинию по весу, ширине (Weght,Width) и другим параметрам?

Да, видимо, так и придется обходить проблему. Но все-таки получается, что пару строчек заменяет целый цикл... Неужели по-другому никак?