Тема: Выбирать многоугольником

Выбирать многоугольником - кто как реализовывал это на VBA???
Возможно, стоит подключить какие-то команды Lisp'a?

Re: Выбирать многоугольником

> Artem
Из моих предыдущих экспериментов
Выбирает все тексты внутри контура, находящиеся
на слое "ANNO-TEXT"
Попробуй измени по своим критериям

Option Explicit
Public Sub Ch_SelectByPolygon()
Dim setObj As AcadSelectionSet
Dim setColl As AcadSelectionSets
Dim objEnt As AcadEntity
Dim plineObj As AcadLWPolyline
Dim pickPnt As Variant
Dim setName As String
Dim selMod As Long
Dim vertPts As Variant
Dim dblElv As Double
Dim gpCode(1) As Integer
Dim dataValue(1) As Variant
Dim dxfcode, dxfdata
Dim selPts As Variant
On Error GoTo SayMeAbout
gpCode(0) = 0: gpCode(1) = 8
dataValue(0) = "TEXT": dataValue(1) = "ANNO-TEXT"
dxfcode = gpCode: dxfdata = dataValue
setName = "PolygonSelect"
  With ThisDrawing
    Set setColl = .SelectionSets
    For Each setObj In setColl
      If setObj.Name = setName Then
        .SelectionSets.Item(setName).Delete
        Exit For
      End If
    Next
    Set setObj = .SelectionSets.Add(setName)
  End With
ThisDrawing.Utility.GetEntity objEnt, pickPnt, vbCr & "Select polyline :"
If Not TypeOf objEnt Is AcadLWPolyline Then
MsgBox "It is not a lightweight polyline", vbExclamation, "Programm stopped"
Exit Sub
Else
Set plineObj = objEnt
dblElv = plineObj.Elevation
vertPts = plineObj.Coordinates
selPts = ConvTo3dPoints(vertPts, dblElv)
'\\' An array of 3D WCS coordinates specifying the selection fence
Debug.Print UBound(selPts)
selMod = acSelectionSetWindowPolygon 'acSelectionSetCrossingPolygon  '
'\\' change mode by suit
setObj.SelectByPolygon selMod, selPts ', dxfcode, dxfdata
setObj.Highlight True
MsgBox "Selected: " & CStr(setObj.Count)
' >> do your stuffs here
End If
SayMeAbout:
MsgBox Err.Description
End Sub
Public Function ConvTo3dPoints(objCoors As Variant, dblElv As Double) As Variant
Dim i As Long, j As Long
Dim convPts() As Double
j = 0
For i = LBound(objCoors) To UBound(objCoors) Step 2
ReDim Preserve convPts(0 To j)
convPts(j) = objCoors(i)
ReDim Preserve convPts(0 To j + 1)
convPts(j + 1) = objCoors(i + 1)
ReDim Preserve convPts(0 To j + 2)
convPts(j + 2) = dblElv
j = j + 3
Next
ConvTo3dPoints = convPts
End Function

~'J'~

Re: Выбирать многоугольником

> Fatty
А может проще как-то так:

ReDim convPts(UBound(objCoors) * 3) As Double
    j = 0
    For i = LBound(objCoors) To UBound(objCoors) Step 2
        convPts(j) = objCoors(i)
        convPts(j + 1) = objCoors(i + 1)
        convPts(j + 2) = dblElv
        j = j + 3
    Next i

Re: Выбирать многоугольником

Я имею ввиду как бы динамический выбор типа как по команде “_.pselect _cp”
Только как это можно реализовать с помощью VBA?
Можно сделать что то типа
frmStart.Hide
ThisDrawing.SendCommand "_.PSELECT _CP" & vbCr
ThisDrawing.SendCommand vbCr
If ThisDrawing.PickfirstSelectionSet.Count <> 0 Then
End if
frmStart.show
Но в таком случае как только я начинаю двигать экран выскакивает моя форма (frmStart) а мне бы хотелось сначала выбрать а потом уже выскочила форма

Re: Выбирать многоугольником

> Artem
Вот пример как выбирать указывая точки
ограничивающие многоугольник выбора
Переделай по вкусу

Option Explicit
Sub CP()
Dim PointsList() As Double
Dim p1, p2
Dim i As Integer, j As Integer
   p1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "Specify first point: ")
ReDim Preserve PointsList(i + 2) As Double
   PointsList(i) = p1(0)
   PointsList(i + 1) = p1(1)
   PointsList(i + 2) = p1(2)
   i = i + 3
Do
On Error Resume Next
   p2 = ThisDrawing.Utility.GetPoint(p1, vbCrLf & "Specify next point or hit ENTER to exit: ")
If Err Then
   Err.Clear
Exit Do
End If
On Error GoTo 0
ReDim Preserve PointsList(i + 2) As Double
   PointsList(i) = p2(0)
   PointsList(i + 1) = p2(1)
   PointsList(i + 2) = p2(2)
i = i + 3
For j = 0 To 2
   p1(j) = p2(j)
Next
Loop
On Error GoTo 0
Dim oSset As AcadSelectionSet
          With ThisDrawing.SelectionSets
               While .Count > 0
                    .Item(0).Delete
               Wend
          End With
     With ThisDrawing.SelectionSets
          Set oSset = .Add("$PolySet$")
     End With
Dim mode As Integer
mode = acSelectionSetWindowPolygon
''
''acSelectionSetCrossingPolygon
''
oSset.SelectByPolygon mode, PointsList
MsgBox "Number of entities selected: " & vbCr & _
vbTab & oSset.Count
End Sub

~'J'~

Re: Выбирать многоугольником

Спасибо!
Да такой вариант возможен (с некоторой доработкой) но это несколько не красиво получается, не как в самом AutoCAD и не так наглядно…. Хочется выбирать так же как позволяет это сделать AutoCAD при выборе объектов обычным методом VBA (acSelectionSetAll) если в командной строке прописать (_cp) и нажать enter!
Может в Lisp есть подобная команда (хотя это не совсем тот раздел но все равно)?

Re: Выбирать многоугольником

> Artem
Тогда только через SendCommand
(Я как-то не шибко его люблю):

Sub test()
Dim ss As AcadSelectionSet
Set ss = ThisDrawing.ActiveSelectionSet
ss.Delete
ThisDrawing.SendCommand "(command)" & vbCr
ThisDrawing.SendCommand "select _cp pause "
ThisDrawing.SendCommand vbCr
Set ss = ThisDrawing.ActiveSelectionSet
MsgBox "You just selected: " & ss.Count & " items"
End Sub

~'J'~

Re: Выбирать многоугольником

Fatty - спасибо большущее!
Я тоже SendCommand не люблю, но что делать?

Re: Выбирать многоугольником

Artem пишет:

, но что делать?

Постепенно переходить на другой уровень(C++/ARX или C#/VB.NET)
IMHO
~'J'~